summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMiloslav Trmač <mitr@redhat.com>2010-10-27 18:12:02 +0200
committerMiloslav Trmač <mitr@redhat.com>2010-10-29 19:52:25 +0200
commit79adc0a7a1c8a1817b8aea1545fd9559314f4450 (patch)
treee1bad362f63b194ebad5a8844f6395fb027f2893 /lib
parent8f1254b8085ba2b189457e8f04abf19b5027f6a5 (diff)
Add digest session cloning
Diffstat (limited to 'lib')
-rw-r--r--lib/ncrypto_local.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/ncrypto_local.c b/lib/ncrypto_local.c
index 16bd781..15ae38c 100644
--- a/lib/ncrypto_local.c
+++ b/lib/ncrypto_local.c
@@ -269,6 +269,35 @@ ncr_digest_free (struct ncr_digest_session *sess)
}
CK_RV
+ncr_digest_clone (struct ncr_digest_session **clone,
+ struct ncr_digest_session *sess)
+{
+ struct ncr_digest_session *c;
+
+ g_return_val_if_fail (clone != NULL, CKR_ARGUMENTS_BAD);
+ g_return_val_if_fail (sess != NULL, CKR_SESSION_HANDLE_INVALID);
+ g_return_val_if_fail (sess->state == NDS_INITIALIZED
+ || sess->state == NDS_UPDATED,
+ CKR_OPERATION_NOT_INITIALIZED);
+
+ c = malloc (sizeof (*c));
+ if (c == NULL)
+ return CKR_HOST_MEMORY;
+
+ EVP_MD_CTX_init (&c->ctx);
+ if (EVP_MD_CTX_copy_ex (&c->ctx, &sess->ctx) == 0)
+ {
+ free (c);
+ return ckr_openssl ();
+ }
+ c->state = sess->state;
+ c->md = sess->md;
+ c->md_size = sess->md_size;
+ *clone = c;
+ return CKR_OK;
+}
+
+CK_RV
ncr_digest_init (struct ncr_digest_session *sess)
{
g_return_val_if_fail (sess != NULL, CKR_SESSION_HANDLE_INVALID);