summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMiloslav Trmač <mitr@redhat.com>2010-10-29 19:52:59 +0200
committerMiloslav Trmač <mitr@redhat.com>2010-10-29 19:52:59 +0200
commit843862b7ce325e70a0ff715006fb29fffd81e0a6 (patch)
tree5722b987a4058c65ae69c78e951b20f64f600c61 /lib
parent79adc0a7a1c8a1817b8aea1545fd9559314f4450 (diff)
downloadncrypto-843862b7ce325e70a0ff715006fb29fffd81e0a6.tar.gz
ncrypto-843862b7ce325e70a0ff715006fb29fffd81e0a6.tar.xz
ncrypto-843862b7ce325e70a0ff715006fb29fffd81e0a6.zip
Add symmetric signature session cloning
Diffstat (limited to 'lib')
-rw-r--r--lib/ncrypto_local.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/lib/ncrypto_local.c b/lib/ncrypto_local.c
index 15ae38c..5e0077d 100644
--- a/lib/ncrypto_local.c
+++ b/lib/ncrypto_local.c
@@ -788,6 +788,39 @@ ncr_symm_signature_free (struct ncr_symm_signature_session *sess)
return CKR_OK;
}
+CK_RV
+ncr_symm_signature_clone (struct ncr_symm_signature_session **clone,
+ struct ncr_symm_signature_session *sess)
+{
+ struct ncr_symm_signature_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 == NSSS_INITIALIZED
+ || sess->state == NSSS_UPDATED,
+ CKR_OPERATION_NOT_INITIALIZED);
+
+ c = malloc (sizeof (*c));
+ if (c == NULL)
+ return CKR_HOST_MEMORY;
+
+ /* HMAC_CTX_copy is undocumented, and seems not to need MD_CTX_init, but
+ openssl internally calls HMAC_CTX_init before HMAC_CTX_copy, so we do as
+ well. */
+ HMAC_CTX_init (&c->ctx);
+ if (HMAC_CTX_copy (&c->ctx, &sess->ctx) == 0)
+ {
+ free (c);
+ return ckr_openssl ();
+ }
+ c->state = sess->state;
+ c->md = sess->md;
+ c->md_size = sess->md_size;
+ c->signing = sess->signing;
+ *clone = c;
+ return CKR_OK;
+}
+
static CK_RV
symm_signature_init (struct ncr_symm_signature_session *sess, bool sign,
struct ncr_symm_key *key)