diff options
| author | Miloslav Trmač <mitr@redhat.com> | 2010-10-27 18:12:02 +0200 |
|---|---|---|
| committer | Miloslav Trmač <mitr@redhat.com> | 2010-10-29 19:52:25 +0200 |
| commit | 79adc0a7a1c8a1817b8aea1545fd9559314f4450 (patch) | |
| tree | e1bad362f63b194ebad5a8844f6395fb027f2893 /lib | |
| parent | 8f1254b8085ba2b189457e8f04abf19b5027f6a5 (diff) | |
Add digest session cloning
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/ncrypto_local.c | 29 |
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); |
