Same function as previous patch, but the TPM-specific part.

Signed-off-by: Klaus Heinrich Kiwi <[email protected]>
---
 usr/lib/pkcs11/tpm_stdll/dig_mgr.c  |   92 ++++++++++++++++++++++++-----------
 usr/lib/pkcs11/tpm_stdll/mech_rsa.c |   36 +++++---------
 usr/lib/pkcs11/tpm_stdll/mech_sha.c |   14 -----
 usr/lib/pkcs11/tpm_stdll/new_host.c |   12 -----
 4 files changed, 76 insertions(+), 78 deletions(-)

diff --git a/usr/lib/pkcs11/tpm_stdll/dig_mgr.c 
b/usr/lib/pkcs11/tpm_stdll/dig_mgr.c
index fa20f91..d0f1ea1 100644
--- a/usr/lib/pkcs11/tpm_stdll/dig_mgr.c
+++ b/usr/lib/pkcs11/tpm_stdll/dig_mgr.c
@@ -321,7 +321,7 @@ digest_mgr_init( SESSION           *sess,
       return CKR_FUNCTION_FAILED;
    }
    if (ctx->active != FALSE){
-      st_err_log(31, __FILE__, __LINE__);     
+      st_err_log(31, __FILE__, __LINE__);
       return CKR_OPERATION_ACTIVE;
    }
 
@@ -331,15 +331,16 @@ digest_mgr_init( SESSION           *sess,
       case CKM_SHA_1:
          {
             if (mech->ulParameterLen != 0){
-               st_err_log(29, __FILE__, __LINE__);     
+               st_err_log(29, __FILE__, __LINE__);
                return CKR_MECHANISM_PARAM_INVALID;
             }
-           
+
             ctx->context = NULL;
             ckm_sha1_init( ctx );
-           
+
             if (!ctx->context) {
-               st_err_log(1, __FILE__, __LINE__);     
+               digest_mgr_cleanup(ctx);  // to de-initialize context above
+               st_err_log(1, __FILE__, __LINE__);
                return CKR_HOST_MEMORY;
             }
          }
@@ -348,13 +349,14 @@ digest_mgr_init( SESSION           *sess,
       case CKM_MD2:
          {
             if (mech->ulParameterLen != 0){
-               st_err_log(29, __FILE__, __LINE__);     
+               st_err_log(29, __FILE__, __LINE__);
                return CKR_MECHANISM_PARAM_INVALID;
             }
             ctx->context_len = sizeof(MD2_CONTEXT);
             ctx->context     = (CK_BYTE *)malloc(sizeof(MD2_CONTEXT));
             if (!ctx->context){
-               st_err_log(1, __FILE__, __LINE__);     
+               digest_mgr_cleanup(ctx);  // to de-initialize context above
+               st_err_log(1, __FILE__, __LINE__);
                return CKR_HOST_MEMORY;
             }
             memset( ctx->context, 0x0, sizeof(MD2_CONTEXT) );
@@ -364,13 +366,14 @@ digest_mgr_init( SESSION           *sess,
       case CKM_MD5:
          {
             if (mech->ulParameterLen != 0){
-               st_err_log(29, __FILE__, __LINE__);     
+               st_err_log(29, __FILE__, __LINE__);
                return CKR_MECHANISM_PARAM_INVALID;
             }
             ctx->context_len = sizeof(MD5_CONTEXT);
             ctx->context     = (CK_BYTE *)malloc(sizeof(MD5_CONTEXT));
             if (!ctx->context){
-               st_err_log(1, __FILE__, __LINE__);     
+               digest_mgr_cleanup(ctx);  // to de-initialize context above
+               st_err_log(1, __FILE__, __LINE__);
                return CKR_HOST_MEMORY;
             }
             ckm_md5_init( (MD5_CONTEXT *)ctx->context );
@@ -386,6 +389,7 @@ digest_mgr_init( SESSION           *sess,
    if (mech->ulParameterLen > 0) {
       ptr = (CK_BYTE *)malloc(mech->ulParameterLen);
       if (!ptr){
+         digest_mgr_cleanup(ctx);  // to de-initialize context above
          st_err_log(1, __FILE__, __LINE__);     
          return CKR_HOST_MEMORY;
       }
@@ -443,6 +447,7 @@ digest_mgr_digest( SESSION         *sess,
                    CK_BYTE         *out_data,
                    CK_ULONG        *out_data_len )
 {
+   CK_RV        rc;
 
    if (!sess || !ctx){
       st_err_log(4, __FILE__, __LINE__, __FUNCTION__);
@@ -458,38 +463,50 @@ digest_mgr_digest( SESSION         *sess,
    //
    if ((length_only == FALSE) && (!in_data || !out_data)){
       st_err_log(4, __FILE__, __LINE__, __FUNCTION__);
-      return CKR_FUNCTION_FAILED;
+      rc = CKR_FUNCTION_FAILED;
+      goto out;
    }
 
    if (ctx->multi == TRUE){
       st_err_log(31, __FILE__, __LINE__);
-      return CKR_OPERATION_ACTIVE;
+      rc = CKR_FUNCTION_FAILED;
+      goto out;
    }
    switch (ctx->mech.mechanism) {
       case CKM_SHA_1:
-         return sha1_hash( sess,      length_only, ctx,
+         rc = sha1_hash( sess,      length_only, ctx,
                            in_data,   in_data_len,
                            out_data,  out_data_len );
+         break;
 
 #if !(NOMD2 )
       case CKM_MD2:
-         return md2_hash( sess,     length_only, ctx,
+         rc = md2_hash( sess,     length_only, ctx,
                           in_data,  in_data_len,
                           out_data, out_data_len );
+         break;
 #endif
 
       case CKM_MD5:
-         return md5_hash( sess,     length_only, ctx,
+         rc = md5_hash( sess,     length_only, ctx,
                           in_data,  in_data_len,
                           out_data, out_data_len );
+         break;
 
       default:
          st_err_log(4, __FILE__, __LINE__, __FUNCTION__);
-         return CKR_FUNCTION_FAILED;  // shouldn't happen
+         rc = CKR_FUNCTION_FAILED;  // shouldn't happen
+   }
+out:
+   if ( !((rc == CKR_BUFFER_TOO_SMALL) ||
+          (rc == CKR_OK && length_only == TRUE)) ) {
+      // "A call to C_Digest always terminates the active digest operation 
unless it
+      // returns CKR_BUFFER_TOO_SMALL or is a successful call (i.e., one which 
returns CKR_OK)
+      // to determine the length of the buffer needed to hold the message 
digest."
+      digest_mgr_cleanup(ctx);
    }
 
-   st_err_log(4, __FILE__, __LINE__, __FUNCTION__);
-   return CKR_FUNCTION_FAILED;
+   return rc;
 }
 
 
@@ -501,6 +518,8 @@ digest_mgr_digest_update( SESSION         *sess,
                           CK_BYTE         *data,
                           CK_ULONG         data_len )
 {
+   CK_RV        rc;
+
    if (!sess || !ctx){
       st_err_log(4, __FILE__, __LINE__, __FUNCTION__);
       return CKR_FUNCTION_FAILED;
@@ -514,23 +533,31 @@ digest_mgr_digest_update( SESSION         *sess,
 
    switch (ctx->mech.mechanism) {
       case CKM_SHA_1:
-         return sha1_hash_update( sess, ctx, data, data_len );
+         rc = sha1_hash_update( sess, ctx, data, data_len );
+         break;
 
 #if !(NOMD2)
       case CKM_MD2:
-         return md2_hash_update( sess, ctx, data, data_len );
+         rc = md2_hash_update( sess, ctx, data, data_len );
+         break;
 #endif
 
       case CKM_MD5:
-         return md5_hash_update( sess, ctx, data, data_len );
+         rc = md5_hash_update( sess, ctx, data, data_len );
+         break;
 
       default:
          st_err_log(28, __FILE__, __LINE__);
-         return CKR_MECHANISM_INVALID;
+         rc = CKR_MECHANISM_INVALID;
    }
 
-   st_err_log(28, __FILE__, __LINE__);
-   return CKR_MECHANISM_INVALID;  // shouldn't happen!
+   if (rc != CKR_OK) {
+      digest_mgr_cleanup(ctx);  // "A call to C_DigestUpdate which results in 
an error
+                                // terminates the current digest operation."
+   }
+
+   return rc;
+
 }
 
 
@@ -555,21 +582,24 @@ digest_mgr_digest_key( SESSION          * sess,
    rc = object_mgr_find_in_map1( key_handle, &key_obj );
    if (rc != CKR_OK){
       st_err_log(18, __FILE__, __LINE__);
-      return CKR_KEY_HANDLE_INVALID;
+      rc = CKR_KEY_HANDLE_INVALID;
+      goto out;
    }
    // only allow digesting of CKO_SECRET keys
    //
    rc = template_attribute_find( key_obj->template, CKA_CLASS, &attr );
    if (rc == FALSE) {
       st_err_log(24, __FILE__, __LINE__);
-      return CKR_KEY_INDIGESTIBLE;
+      rc = CKR_KEY_INDIGESTIBLE;
+      goto out;
    }
    else
       class = *(CK_OBJECT_CLASS *)attr->pValue;
 
    if (class != CKO_SECRET_KEY){
       st_err_log(24, __FILE__, __LINE__);
-      return CKR_KEY_INDIGESTIBLE;
+      rc =  CKR_KEY_INDIGESTIBLE;
+      goto out;
    }
 
    // every secret key has a CKA_VALUE attribute
@@ -577,7 +607,8 @@ digest_mgr_digest_key( SESSION          * sess,
    rc = template_attribute_find( key_obj->template, CKA_VALUE, &attr );
    if (!rc){
       st_err_log(24, __FILE__, __LINE__);
-      return CKR_KEY_INDIGESTIBLE;
+      rc = CKR_KEY_INDIGESTIBLE;
+      goto out;
    }
    rc = digest_mgr_digest_update( sess,
                                   ctx,
@@ -585,7 +616,12 @@ digest_mgr_digest_key( SESSION          * sess,
                                   attr->ulValueLen );
    if (rc != CKR_OK){
       st_err_log(24, __FILE__, __LINE__);
-   } 
+   }
+
+out:
+   if (rc != CKR_OK) {
+      digest_mgr_cleanup(ctx);
+   }
    return rc;
 }
 
diff --git a/usr/lib/pkcs11/tpm_stdll/mech_rsa.c 
b/usr/lib/pkcs11/tpm_stdll/mech_rsa.c
index c89bf4d..5c479c3 100644
--- a/usr/lib/pkcs11/tpm_stdll/mech_rsa.c
+++ b/usr/lib/pkcs11/tpm_stdll/mech_rsa.c
@@ -557,13 +557,13 @@ rsa_hash_pkcs_sign( SESSION              * sess,
    rc = digest_mgr_init( sess, &digest_ctx, &digest_mech );
    if (rc != CKR_OK){
       st_err_log(123, __FILE__, __LINE__);
-      goto error;
+      return rc;
    }
    hash_len = sizeof(hash);
    rc = digest_mgr_digest( sess, length_only, &digest_ctx, in_data, 
in_data_len, hash, &hash_len );
    if (rc != CKR_OK){
       st_err_log(124, __FILE__, __LINE__);
-      goto error;
+      return rc;
    }
       // build the BER-encodings
      
@@ -601,7 +601,6 @@ rsa_hash_pkcs_sign( SESSION              * sess,
 error:
    if (octet_str) free( octet_str );
    if (ber_data)  free( ber_data );
-   digest_mgr_cleanup( &digest_ctx );
    sign_mgr_cleanup( &sign_ctx );
    return rc;
 }
@@ -639,7 +638,7 @@ rsa_hash_pkcs_sign_update( SESSION              * sess,
       rc = digest_mgr_init( sess, &context->hash_context, &digest_mech );
       if (rc != CKR_OK){
          st_err_log(123, __FILE__, __LINE__);
-         goto error;
+         return rc;
       }
       context->flag = TRUE;
    }
@@ -647,13 +646,10 @@ rsa_hash_pkcs_sign_update( SESSION              * sess,
    rc = digest_mgr_digest_update( sess, &context->hash_context, in_data, 
in_data_len );
    if (rc != CKR_OK){
       st_err_log(123, __FILE__, __LINE__);
-      goto error;
+      return rc;
    }
-   return CKR_OK;
 
-error:
-   digest_mgr_cleanup( &context->hash_context );
-   return rc;
+   return CKR_OK;
 }
 
 
@@ -711,13 +707,13 @@ rsa_hash_pkcs_verify( SESSION              * sess,
    rc = digest_mgr_init( sess, &digest_ctx, &digest_mech );
    if (rc != CKR_OK){
       st_err_log(123, __FILE__, __LINE__);
-      goto done;
+      return rc;
    }
    hash_len = sizeof(hash);
    rc = digest_mgr_digest( sess, FALSE, &digest_ctx, in_data, in_data_len, 
hash, &hash_len );
    if (rc != CKR_OK){
       st_err_log(124, __FILE__, __LINE__);
-      goto done;
+      return rc;
    }
 
    // Build the BER encoding
@@ -754,8 +750,6 @@ rsa_hash_pkcs_verify( SESSION              * sess,
 done:
    if (octet_str) free( octet_str );
    if (ber_data)  free( ber_data );
-   
-   digest_mgr_cleanup( &digest_ctx );
    sign_mgr_cleanup( &verify_ctx );
    return rc;
 }
@@ -792,7 +786,7 @@ rsa_hash_pkcs_verify_update( SESSION              * sess,
       rc = digest_mgr_init( sess, &context->hash_context, &digest_mech );
       if (rc != CKR_OK){
          st_err_log(123, __FILE__, __LINE__);
-         goto error;
+         return rc;
       }
       context->flag = TRUE;
    }
@@ -800,13 +794,10 @@ rsa_hash_pkcs_verify_update( SESSION              * sess,
    rc = digest_mgr_digest_update( sess, &context->hash_context, in_data, 
in_data_len );
    if (rc != CKR_OK){
       st_err_log(123, __FILE__, __LINE__);
-      goto error;
+      return rc;
    }
-   return CKR_OK;
 
-error:
-   digest_mgr_cleanup( &context->hash_context );
-   return rc;
+   return CKR_OK;
 }
 
 
@@ -859,7 +850,7 @@ rsa_hash_pkcs_sign_final( SESSION              * sess,
    rc = digest_mgr_digest_final( sess, length_only, &context->hash_context, 
hash, &hash_len );
    if (rc != CKR_OK){
       st_err_log(126, __FILE__, __LINE__);
-      goto done;
+      return rc;
    }
    // Build the BER Encoded Data block
    //
@@ -902,8 +893,6 @@ rsa_hash_pkcs_sign_final( SESSION              * sess,
 done:
    if (octet_str) free( octet_str );
    if (ber_data)  free( ber_data );
-
-   digest_mgr_cleanup( &context->hash_context );
    sign_mgr_cleanup( &sign_ctx );
    return rc;
 }
@@ -955,7 +944,7 @@ rsa_hash_pkcs_verify_final( SESSION              * sess,
    rc = digest_mgr_digest_final( sess, FALSE, &context->hash_context, hash, 
&hash_len );
    if (rc != CKR_OK){
       st_err_log(126, __FILE__, __LINE__);
-      goto done;
+      return rc;
    }
    // Build the BER encoding
    //
@@ -992,7 +981,6 @@ rsa_hash_pkcs_verify_final( SESSION              * sess,
 done:
    if (octet_str) free( octet_str );
    if (ber_data)  free( ber_data );
-   digest_mgr_cleanup( &context->hash_context );
    verify_mgr_cleanup( &verify_ctx );
    return rc;
 }
diff --git a/usr/lib/pkcs11/tpm_stdll/mech_sha.c 
b/usr/lib/pkcs11/tpm_stdll/mech_sha.c
index 176cb73..533fd89 100644
--- a/usr/lib/pkcs11/tpm_stdll/mech_sha.c
+++ b/usr/lib/pkcs11/tpm_stdll/mech_sha.c
@@ -268,7 +268,6 @@ sha1_hmac_sign( SESSION              * sess,
 
       rc = digest_mgr_init( sess, &digest_ctx, &digest_mech );
       if (rc != CKR_OK) {
-         digest_mgr_cleanup( &digest_ctx );
          st_err_log(123, __FILE__, __LINE__);
          return rc;
       }
@@ -279,12 +278,10 @@ sha1_hmac_sign( SESSION              * sess,
                               attr->ulValueLen,
                               hash,  &hash_len );
       if (rc != CKR_OK) {
-         digest_mgr_cleanup( &digest_ctx );
          st_err_log(124, __FILE__, __LINE__);
          return rc;
       }
 
-      digest_mgr_cleanup( &digest_ctx );
       memset( &digest_ctx, 0x0, sizeof(DIGEST_CONTEXT) );
 
       for (i=0; i < hash_len; i++) {
@@ -315,21 +312,18 @@ sha1_hmac_sign( SESSION              * sess,
    //
    rc = digest_mgr_init( sess, &digest_ctx, &digest_mech );
    if (rc != CKR_OK) {
-      digest_mgr_cleanup( &digest_ctx );
       st_err_log(123, __FILE__, __LINE__);
       return rc;
    }
 
    rc = digest_mgr_digest_update( sess, &digest_ctx, k_ipad, SHA1_BLOCK_SIZE );
    if (rc != CKR_OK) {
-      digest_mgr_cleanup( &digest_ctx );
       st_err_log(123, __FILE__, __LINE__);
       return rc;
    }
 
    rc = digest_mgr_digest_update( sess, &digest_ctx, in_data, in_data_len );
    if (rc != CKR_OK) {
-      digest_mgr_cleanup( &digest_ctx );
       st_err_log(123, __FILE__, __LINE__);
       return rc;
    }
@@ -337,12 +331,10 @@ sha1_hmac_sign( SESSION              * sess,
    hash_len = sizeof(hash);
    rc = digest_mgr_digest_final( sess, FALSE, &digest_ctx, hash, &hash_len );
    if (rc != CKR_OK) {
-      digest_mgr_cleanup( &digest_ctx );
       st_err_log(126, __FILE__, __LINE__);
       return rc;
    }
 
-   digest_mgr_cleanup( &digest_ctx );
    memset( &digest_ctx, 0x0, sizeof(DIGEST_CONTEXT) );
 
 
@@ -350,21 +342,18 @@ sha1_hmac_sign( SESSION              * sess,
    //
    rc = digest_mgr_init( sess, &digest_ctx, &digest_mech );
    if (rc != CKR_OK) {
-      digest_mgr_cleanup( &digest_ctx );
       st_err_log(123, __FILE__, __LINE__);
       return rc;
    }
 
    rc = digest_mgr_digest_update( sess, &digest_ctx, k_opad, SHA1_BLOCK_SIZE );
    if (rc != CKR_OK) {
-      digest_mgr_cleanup( &digest_ctx );
       st_err_log(123, __FILE__, __LINE__);
       return rc;
    }
 
    rc = digest_mgr_digest_update( sess, &digest_ctx, hash, hash_len );
    if (rc != CKR_OK) {
-      digest_mgr_cleanup( &digest_ctx );
       st_err_log(123, __FILE__, __LINE__);
       return rc;
    }
@@ -372,7 +361,6 @@ sha1_hmac_sign( SESSION              * sess,
    hash_len = sizeof(hash);
    rc = digest_mgr_digest_final( sess, FALSE, &digest_ctx, hash, &hash_len );
    if (rc != CKR_OK) {
-      digest_mgr_cleanup( &digest_ctx );
       st_err_log(126, __FILE__, __LINE__);
       return rc;
    }
@@ -380,8 +368,6 @@ sha1_hmac_sign( SESSION              * sess,
    memcpy( out_data, hash, hmac_len );
    *out_data_len = hmac_len;
 
-   digest_mgr_cleanup( &digest_ctx );
-
    return CKR_OK;
 }
 
diff --git a/usr/lib/pkcs11/tpm_stdll/new_host.c 
b/usr/lib/pkcs11/tpm_stdll/new_host.c
index 770de3c..96ebf54 100644
--- a/usr/lib/pkcs11/tpm_stdll/new_host.c
+++ b/usr/lib/pkcs11/tpm_stdll/new_host.c
@@ -2821,9 +2821,6 @@ CK_RV SC_Digest( ST_SESSION_HANDLE  sSession,
    }
 
 done:
-   if (rc != CKR_BUFFER_TOO_SMALL && (rc != CKR_OK || length_only != TRUE))
-      digest_mgr_cleanup( &sess->digest_ctx );
-
    LLOCK;
    if (debugfile) {
       stlogit2(debugfile, "%-25s:  rc = %08x, sess = %d, datalen = %d\n", 
"C_Digest", rc, (sess == NULL)?-1:(CK_LONG)sess->handle, ulDataLen );
@@ -2879,9 +2876,6 @@ CK_RV SC_DigestUpdate( ST_SESSION_HANDLE  sSession,
       }
    }
 done:
-   if (rc != CKR_OK)
-      digest_mgr_cleanup( &sess->digest_ctx );
-
    LLOCK;
    if (debugfile) {
       stlogit2(debugfile, "%-25s:  rc = %08x, sess = %d, datalen = %d\n", 
"C_DigestUpdate", rc, (sess == NULL)?-1:(CK_LONG)sess->handle, ulPartLen );
@@ -2926,9 +2920,6 @@ CK_RV SC_DigestKey( ST_SESSION_HANDLE  sSession,
    }
 
 done:
-   if (rc != CKR_OK)
-      digest_mgr_cleanup( &sess->digest_ctx );
-
    LLOCK;
    if (debugfile) {
       stlogit2(debugfile, "%-25s:  rc = %08x, sess = %d, key = %d\n", 
"C_DigestKey", rc, (sess == NULL)?-1:(CK_LONG)sess->handle, hKey );
@@ -2987,9 +2978,6 @@ CK_RV SC_DigestFinal( ST_SESSION_HANDLE  sSession,
    }
 
 done:
-   if (rc != CKR_BUFFER_TOO_SMALL && (rc != CKR_OK || length_only != TRUE))
-      digest_mgr_cleanup( &sess->digest_ctx );
-
    LLOCK;
    if (debugfile) {
       stlogit2(debugfile, "%-25s:  rc = %08x, sess = %d\n", "C_DigestFinal", 
rc, (sess == NULL)?-1:(CK_LONG)sess->handle );
-- 
1.7.2.3


------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
Opencryptoki-tech mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opencryptoki-tech

Reply via email to