diff options
Diffstat (limited to 'lib/ncrypto_local.c')
-rw-r--r-- | lib/ncrypto_local.c | 33 |
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) |