summaryrefslogtreecommitdiffstats
path: root/lib/ncrypto_local.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ncrypto_local.c')
-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)