Added ECDSA SHA2 support to EP11 and CCA tokens

Signed-off-by: Ingo Franzki <ifran...@de.ibm.com>

diff --git a/misc/mech_types.h b/misc/mech_types.h
index 122288e..ff75562 100644
--- a/misc/mech_types.h
+++ b/misc/mech_types.h
@@ -507,6 +507,10 @@ typedef CK_ULONG          CK_MECHANISM_TYPE;
 #define CKM_EC_KEY_PAIR_GEN            0x00001040
 #define CKM_ECDSA                      0x00001041
 #define CKM_ECDSA_SHA1                 0x00001042
+/* The following are new for v2.3 */
+#define CKM_ECDSA_SHA256               0x00001044
+#define CKM_ECDSA_SHA384               0x00001045
+#define CKM_ECDSA_SHA512               0x00001046
 /* The following are new for v2.11 */
 #define CKM_ECDH1_DERIVE               0x00001050
 #define CKM_ECDH1_COFACTOR_DERIVE      0x00001051
diff --git a/testcases/crypto/ec_func.c b/testcases/crypto/ec_func.c
index 1f61e1b..06c1501 100644
--- a/testcases/crypto/ec_func.c
+++ b/testcases/crypto/ec_func.c
@@ -134,18 +134,27 @@ _ec_struct der_ec_notsupported[NUMECINVAL] = {
 typedef struct signVerifyParam {
        CK_MECHANISM_TYPE       mechtype;
        CK_ULONG                inputlen;
+       CK_ULONG                parts; /* 0 means process in 1 chunk via 
C_Sign, >0 means process in n chunks via C_SignUpdate/C_SignFinal */
 }_signVerifyParam;
 
 
 _signVerifyParam signVerifyInput[] = {
-       { CKM_ECDSA, 20 },
-       { CKM_ECDSA, 32 },
-       { CKM_ECDSA, 48 },
-       { CKM_ECDSA, 64 }
+       { CKM_ECDSA, 20, 0},
+       { CKM_ECDSA, 32, 0},
+       { CKM_ECDSA, 48, 0 },
+       { CKM_ECDSA, 64, 0 },
+       { CKM_ECDSA_SHA1, 100, 0 },
+       { CKM_ECDSA_SHA1, 100, 4 },
+       { CKM_ECDSA_SHA256, 100, 0 },
+       { CKM_ECDSA_SHA256, 100, 4 },
+       { CKM_ECDSA_SHA384, 100, 0 },
+       { CKM_ECDSA_SHA384, 100, 4 },
+       { CKM_ECDSA_SHA512, 100, 0 },
+       { CKM_ECDSA_SHA512, 100, 4 }
 };
 
 CK_RV
-run_GenerateSignVerifyECC(CK_SESSION_HANDLE session, CK_MECHANISM_TYPE 
mechType, CK_ULONG inputlen, CK_OBJECT_HANDLE priv_key, CK_OBJECT_HANDLE 
publ_key)
+run_GenerateSignVerifyECC(CK_SESSION_HANDLE session, CK_MECHANISM_TYPE 
mechType, CK_ULONG inputlen, CK_ULONG parts, CK_OBJECT_HANDLE priv_key, 
CK_OBJECT_HANDLE publ_key)
 {
        CK_MECHANISM            mech2;
        CK_BYTE_PTR             data = NULL, signature = NULL;
@@ -153,7 +162,7 @@ run_GenerateSignVerifyECC(CK_SESSION_HANDLE session, 
CK_MECHANISM_TYPE mechType,
        CK_MECHANISM_INFO       mech_info;
        CK_RV rc;
 
-       testcase_begin("Starting with mechtype='%s', inputlen=%lu", 
p11_get_ckm(mechType), inputlen);
+       testcase_begin("Starting with mechtype='%s', inputlen=%lu parts=%lu", 
p11_get_ckm(mechType), inputlen, parts);
 
        mech2.mechanism = mechType;
        mech2.ulParameterLen = 0;
@@ -192,11 +201,28 @@ run_GenerateSignVerifyECC(CK_SESSION_HANDLE session, 
CK_MECHANISM_TYPE mechType,
                goto testcase_cleanup;
        }
 
-       /* get signature length */
-       rc = funcs->C_Sign(session, data, inputlen, NULL, &signaturelen);
-       if (rc != CKR_OK) {
-               testcase_error("C_Sign rc=%s", p11_get_ckr(rc));
-               goto testcase_cleanup;
+       if (parts > 0) {
+               for (i = 0; i < parts; i++) {
+                       rc = funcs->C_SignUpdate(session, data, inputlen);
+                       if (rc != CKR_OK) {
+                               testcase_error("C_SignUpdate rc=%s", 
p11_get_ckr(rc));
+                               goto testcase_cleanup;
+                       }
+               }
+
+               /* get signature length */
+               rc = funcs->C_SignFinal(session, signature, &signaturelen);
+               if (rc != CKR_OK) {
+                       testcase_error("C_SignFinal rc=%s", p11_get_ckr(rc));
+                       goto testcase_cleanup;
+               }
+       }
+       else {
+               rc = funcs->C_Sign(session, data, inputlen, NULL, 
&signaturelen);
+               if (rc != CKR_OK) {
+                       testcase_error("C_Sign rc=%s", p11_get_ckr(rc));
+                       goto testcase_cleanup;
+               }
        }
 
        signature = calloc(sizeof(CK_BYTE), signaturelen);
@@ -207,10 +233,19 @@ run_GenerateSignVerifyECC(CK_SESSION_HANDLE session, 
CK_MECHANISM_TYPE mechType,
                goto testcase_cleanup;
        }
 
-       rc = funcs->C_Sign(session, data, inputlen, signature, &signaturelen);
-       if (rc != CKR_OK) {
-               testcase_error("C_Sign rc=%s", p11_get_ckr(rc));
-               goto testcase_cleanup;
+       if (parts > 0) {
+               rc = funcs->C_SignFinal(session,signature, &signaturelen);
+               if (rc != CKR_OK) {
+                       testcase_error("C_SignFinal rc=%s", p11_get_ckr(rc));
+                       goto testcase_cleanup;
+               }
+       }
+       else {
+               rc = funcs->C_Sign(session, data, inputlen, signature, 
&signaturelen);
+               if (rc != CKR_OK) {
+                       testcase_error("C_Sign rc=%s", p11_get_ckr(rc));
+                       goto testcase_cleanup;
+               }
        }
 
        /****** Verify *******/
@@ -220,10 +255,27 @@ run_GenerateSignVerifyECC(CK_SESSION_HANDLE session, 
CK_MECHANISM_TYPE mechType,
                goto testcase_cleanup;
        }
 
-       rc = funcs->C_Verify(session, data, inputlen, signature, signaturelen);
-       if (rc != CKR_OK) {
-               testcase_error("C_Verify rc=%s", p11_get_ckr(rc));
-               goto testcase_cleanup;
+       if (parts > 0) {
+               for (i = 0; i < parts; i++) {
+                       rc = funcs->C_VerifyUpdate(session, data, inputlen);
+                       if (rc != CKR_OK) {
+                               testcase_error("C_VerifyUpdate rc=%s", 
p11_get_ckr(rc));
+                               goto testcase_cleanup;
+                       }
+               }
+
+               rc = funcs->C_VerifyFinal(session, signature, signaturelen);
+               if (rc != CKR_OK) {
+                       testcase_error("C_VerifyFinal rc=%s", p11_get_ckr(rc));
+                       goto testcase_cleanup;
+               }
+       }
+       else {
+               rc = funcs->C_Verify(session, data, inputlen, signature, 
signaturelen);
+               if (rc != CKR_OK) {
+                       testcase_error("C_Verify rc=%s", p11_get_ckr(rc));
+                       goto testcase_cleanup;
+               }
        }
 
        // corrupt the signature and re-verify
@@ -235,11 +287,29 @@ run_GenerateSignVerifyECC(CK_SESSION_HANDLE session, 
CK_MECHANISM_TYPE mechType,
                goto testcase_cleanup;
        }
 
-       rc = funcs->C_Verify(session, data, inputlen, signature, signaturelen);
-       if (rc != CKR_SIGNATURE_INVALID) {
-               testcase_error("C_Verify rc=%s", p11_get_ckr(rc));
-               PRINT_ERR("             Expected CKR_SIGNATURE_INVALID\n");
-               goto testcase_cleanup;
+       if (parts > 0) {
+               for (i = 0; i < parts; i++) {
+                       rc = funcs->C_VerifyUpdate(session, data, inputlen);
+                       if (rc != CKR_OK) {
+                               testcase_error("C_VerifyUpdate rc=%s", 
p11_get_ckr(rc));
+                               goto testcase_cleanup;
+                       }
+               }
+
+               rc = funcs->C_VerifyFinal(session, signature, signaturelen);
+               if (rc != CKR_SIGNATURE_INVALID) {
+                       testcase_error("C_VerifyFinal rc=%s", p11_get_ckr(rc));
+                       PRINT_ERR("             Expected 
CKR_SIGNATURE_INVALID\n");
+                       goto testcase_cleanup;
+               }
+       }
+       else {
+               rc = funcs->C_Verify(session, data, inputlen, signature, 
signaturelen);
+               if (rc != CKR_SIGNATURE_INVALID) {
+                       testcase_error("C_Verify rc=%s", p11_get_ckr(rc));
+                       PRINT_ERR("             Expected 
CKR_SIGNATURE_INVALID\n");
+                       goto testcase_cleanup;
+               }
        }
 
        rc = CKR_OK;
@@ -318,6 +388,7 @@ run_GenerateECCKeyPairSignVerify()
                                        session,
                                        signVerifyInput[j].mechtype,
                                        signVerifyInput[j].inputlen,
+                                       signVerifyInput[j].parts,
                                        priv_key,
                                        publ_key);
                        if (rc != 0) {
diff --git a/testcases/include/mech_to_str.h b/testcases/include/mech_to_str.h
index 79a1848..9f0eff1 100644
--- a/testcases/include/mech_to_str.h
+++ b/testcases/include/mech_to_str.h
@@ -372,6 +372,12 @@ mech_to_str(CK_ULONG mech)
                                 return "CKM_ECDSA";
                 if (mech == CKM_ECDSA_SHA1)
                                 return "CKM_ECDSA_SHA1";
+                if (mech == CKM_ECDSA_SHA256)
+                                return "CKM_ECDSA_SHA256";
+                if (mech == CKM_ECDSA_SHA384)
+                                return "CKM_ECDSA_SHA384";
+                if (mech == CKM_ECDSA_SHA512)
+                                return "CKM_ECDSA_SHA512";
                 if (mech == CKM_ECDH1_DERIVE)
                                 return "CKM_ECDH1_DERIVE";
                 if (mech == CKM_ECDH1_COFACTOR_DERIVE)
diff --git a/usr/include/pkcs11/pkcs11types.h b/usr/include/pkcs11/pkcs11types.h
index 885f29a..a555c24 100755
--- a/usr/include/pkcs11/pkcs11types.h
+++ b/usr/include/pkcs11/pkcs11types.h
@@ -1064,6 +1064,10 @@ typedef CK_ULONG          CK_MECHANISM_TYPE;
 #define CKM_EC_KEY_PAIR_GEN            0x00001040
 #define CKM_ECDSA                      0x00001041
 #define CKM_ECDSA_SHA1                 0x00001042
+/* The following are new for v2.3 */
+#define CKM_ECDSA_SHA256               0x00001044
+#define CKM_ECDSA_SHA384               0x00001045
+#define CKM_ECDSA_SHA512               0x00001046
 /* The following are new for v2.11 */
 #define CKM_ECDH1_DERIVE               0x00001050
 #define CKM_ECDH1_COFACTOR_DERIVE      0x00001051
diff --git a/usr/lib/pkcs11/cca_stdll/cca_specific.c 
b/usr/lib/pkcs11/cca_stdll/cca_specific.c
index 671ab16..71a8bc9 100644
--- a/usr/lib/pkcs11/cca_stdll/cca_specific.c
+++ b/usr/lib/pkcs11/cca_stdll/cca_specific.c
@@ -177,10 +177,19 @@ MECH_LIST_ELEMENT mech_list[] = {
        {CKM_EC_KEY_PAIR_GEN, {160, 521, CKF_HW|CKF_GENERATE_KEY_PAIR|
                                        CKF_EC_NAMEDCURVE|CKF_EC_F_P}},
        {CKM_ECDSA, {160, 521, CKF_HW|CKF_SIGN|CKF_VERIFY|CKF_EC_NAMEDCURVE|
-                             CKF_EC_F_P}},
+                                       CKF_EC_F_P}},
        {CKM_ECDSA_SHA1, {160, 521, CKF_HW|CKF_SIGN|CKF_VERIFY|
-                                  CKF_EC_NAMEDCURVE|CKF_EC_F_P}},
-        {CKM_GENERIC_SECRET_KEY_GEN, {80, 2048, CKF_HW|CKF_GENERATE}}
+                                       CKF_EC_NAMEDCURVE|CKF_EC_F_P}},
+               {CKM_GENERIC_SECRET_KEY_GEN, {80, 2048, CKF_HW|CKF_GENERATE}},
+       {CKM_ECDSA_SHA256, {160, 521, CKF_HW|CKF_SIGN|CKF_VERIFY|
+                                       CKF_EC_NAMEDCURVE|CKF_EC_F_P}},
+               {CKM_GENERIC_SECRET_KEY_GEN, {80, 2048, CKF_HW|CKF_GENERATE}},
+       {CKM_ECDSA_SHA384, {160, 521, CKF_HW|CKF_SIGN|CKF_VERIFY|
+                                       CKF_EC_NAMEDCURVE|CKF_EC_F_P}},
+               {CKM_GENERIC_SECRET_KEY_GEN, {80, 2048, CKF_HW|CKF_GENERATE}},
+       {CKM_ECDSA_SHA512, {160, 521, CKF_HW|CKF_SIGN|CKF_VERIFY|
+                                       CKF_EC_NAMEDCURVE|CKF_EC_F_P}},
+               {CKM_GENERIC_SECRET_KEY_GEN, {80, 2048, CKF_HW|CKF_GENERATE}}
 };
 
 CK_ULONG mech_list_len = (sizeof(mech_list) / sizeof(MECH_LIST_ELEMENT));
diff --git a/usr/lib/pkcs11/common/mech_ec.c b/usr/lib/pkcs11/common/mech_ec.c
index 175c637..223f515 100644
--- a/usr/lib/pkcs11/common/mech_ec.c
+++ b/usr/lib/pkcs11/common/mech_ec.c
@@ -272,7 +272,7 @@ ec_hash_sign( SESSION              * sess,
                CK_BYTE              * signature,
                CK_ULONG             * sig_len )
 {
-   CK_BYTE              hash[SHA1_HASH_SIZE];
+   CK_BYTE              hash[MAX_SHA_HASH_SIZE];
    DIGEST_CONTEXT       digest_ctx;
    SIGN_VERIFY_CONTEXT  sign_ctx;
    CK_MECHANISM         digest_mech;
@@ -287,16 +287,38 @@ ec_hash_sign( SESSION              * sess,
    memset( &digest_ctx, 0x0, sizeof(digest_ctx) );
    memset( &sign_ctx,   0x0, sizeof(sign_ctx)   );
 
-   digest_mech.mechanism      = CKM_SHA_1;
+   switch(ctx->mech.mechanism){
+   case CKM_ECDSA_SHA1:
+       digest_mech.mechanism = CKM_SHA_1;
+       break;
+   case CKM_ECDSA_SHA256:
+       digest_mech.mechanism = CKM_SHA256;
+       break; 
+   case CKM_ECDSA_SHA384:
+       digest_mech.mechanism = CKM_SHA384;
+       break; 
+   case CKM_ECDSA_SHA512:
+       digest_mech.mechanism = CKM_SHA512;
+       break; 
+   default:
+       return CKR_MECHANISM_INVALID;
+   }
+
    digest_mech.ulParameterLen = 0;
    digest_mech.pParameter     = NULL;
 
+   rc = get_sha_size(digest_mech.mechanism, &hash_len);
+   if (rc != CKR_OK){
+      TRACE_DEVEL("Get SHA Size failed.\n");
+      return rc;
+   }
+
    rc = digest_mgr_init( sess, &digest_ctx, &digest_mech );
    if (rc != CKR_OK){
       TRACE_DEVEL("Digest Mgr Init failed.\n");
       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){
       TRACE_DEVEL("Digest Mgr Digest failed.\n");
@@ -339,7 +361,23 @@ ec_hash_sign_update( SESSION              * sess,
    context = (RSA_DIGEST_CONTEXT *)ctx->context;
 
    if (context->flag == FALSE) {
-      digest_mech.mechanism = CKM_SHA_1;
+      switch(ctx->mech.mechanism){
+      case CKM_ECDSA_SHA1:
+          digest_mech.mechanism = CKM_SHA_1;
+          break;
+      case CKM_ECDSA_SHA256:
+          digest_mech.mechanism = CKM_SHA256;
+          break; 
+      case CKM_ECDSA_SHA384:
+          digest_mech.mechanism = CKM_SHA384;
+          break; 
+      case CKM_ECDSA_SHA512:
+          digest_mech.mechanism = CKM_SHA512;
+          break; 
+      default:
+          return CKR_MECHANISM_INVALID;
+      }
+
       digest_mech.ulParameterLen = 0;
       digest_mech.pParameter     = NULL;
 
@@ -366,7 +404,7 @@ ec_hash_sign_final( SESSION              * sess,
                     CK_BYTE              * signature,
                     CK_ULONG             * sig_len )
 {
-   CK_BYTE               hash[SHA1_HASH_SIZE];
+   CK_BYTE               hash[MAX_SHA_HASH_SIZE];
    RSA_DIGEST_CONTEXT  * context = NULL;
    CK_ULONG              hash_len;
    CK_MECHANISM          sign_mech;
@@ -382,7 +420,12 @@ ec_hash_sign_final( SESSION              * sess,
 
    context = (RSA_DIGEST_CONTEXT *)ctx->context;
 
-   hash_len = sizeof(hash);
+   rc = get_sha_size(context->hash_context.mech.mechanism, &hash_len);
+   if (rc != CKR_OK){
+      TRACE_DEVEL("Get SHA Size failed.\n");
+      return rc;
+   }
+
    rc = digest_mgr_digest_final( sess, length_only, &context->hash_context, 
hash, &hash_len );
    if (rc != CKR_OK){
       TRACE_DEVEL("Digest Mgr Final failed.\n");
@@ -422,7 +465,7 @@ ec_hash_verify( SESSION              * sess,
                 CK_BYTE              * signature,
                 CK_ULONG               sig_len )
 {
-   CK_BYTE              hash[SHA1_HASH_SIZE];
+   CK_BYTE              hash[MAX_SHA_HASH_SIZE];
    DIGEST_CONTEXT       digest_ctx;
    SIGN_VERIFY_CONTEXT  verify_ctx;
    CK_MECHANISM         digest_mech;
@@ -437,16 +480,38 @@ ec_hash_verify( SESSION              * sess,
    memset( &digest_ctx, 0x0, sizeof(digest_ctx) );
    memset( &verify_ctx, 0x0, sizeof(verify_ctx) );
 
-   digest_mech.mechanism      = CKM_SHA_1;
+   switch(ctx->mech.mechanism){
+   case CKM_ECDSA_SHA1:
+       digest_mech.mechanism = CKM_SHA_1;
+       break;
+   case CKM_ECDSA_SHA256:
+       digest_mech.mechanism = CKM_SHA256;
+       break; 
+   case CKM_ECDSA_SHA384:
+       digest_mech.mechanism = CKM_SHA384;
+       break; 
+   case CKM_ECDSA_SHA512:
+       digest_mech.mechanism = CKM_SHA512;
+       break; 
+   default:
+       return CKR_MECHANISM_INVALID;
+   }
+
    digest_mech.ulParameterLen = 0;
    digest_mech.pParameter     = NULL;
 
+   rc = get_sha_size(digest_mech.mechanism, &hash_len);
+   if (rc != CKR_OK){
+      TRACE_DEVEL("Get SHA Size failed.\n");
+      return rc;
+   }
+
    rc = digest_mgr_init( sess, &digest_ctx, &digest_mech );
    if (rc != CKR_OK){
       TRACE_DEVEL("Digest Mgr Init failed.\n");
       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){
       TRACE_DEVEL("Digest Mgr Digest failed.\n");
@@ -492,7 +557,23 @@ ec_hash_verify_update( SESSION              * sess,
    context = (RSA_DIGEST_CONTEXT *)ctx->context;
 
    if (context->flag == FALSE) {
-      digest_mech.mechanism = CKM_SHA_1;
+      switch(ctx->mech.mechanism){
+      case CKM_ECDSA_SHA1:
+          digest_mech.mechanism = CKM_SHA_1;
+          break;
+      case CKM_ECDSA_SHA256:
+          digest_mech.mechanism = CKM_SHA256;
+          break; 
+      case CKM_ECDSA_SHA384:
+          digest_mech.mechanism = CKM_SHA384;
+          break; 
+      case CKM_ECDSA_SHA512:
+          digest_mech.mechanism = CKM_SHA512;
+          break; 
+      default:
+          return CKR_MECHANISM_INVALID;
+      }   
+
       digest_mech.ulParameterLen = 0;
       digest_mech.pParameter     = NULL;
 
@@ -518,7 +599,7 @@ ec_hash_verify_final( SESSION              * sess,
                       CK_BYTE              * signature,
                       CK_ULONG               sig_len )
 {
-   CK_BYTE               hash[SHA1_HASH_SIZE];
+   CK_BYTE               hash[MAX_SHA_HASH_SIZE];
    RSA_DIGEST_CONTEXT  * context = NULL;
    CK_ULONG              hash_len;
    CK_MECHANISM          verify_mech;
@@ -533,7 +614,12 @@ ec_hash_verify_final( SESSION              * sess,
 
    context = (RSA_DIGEST_CONTEXT *)ctx->context;
 
-   hash_len = sizeof(hash);
+   rc = get_sha_size(context->hash_context.mech.mechanism, &hash_len);
+   if (rc != CKR_OK){
+      TRACE_DEVEL("Get SHA Size failed.\n");
+      return rc;
+   }
+
    rc = digest_mgr_digest_final( sess, FALSE, &context->hash_context, hash, 
&hash_len );
    if (rc != CKR_OK){
       TRACE_DEVEL("Digest Mgr Final failed.\n");
diff --git a/usr/lib/pkcs11/common/p11util.c b/usr/lib/pkcs11/common/p11util.c
index b359b80..27d9365 100755
--- a/usr/lib/pkcs11/common/p11util.c
+++ b/usr/lib/pkcs11/common/p11util.c
@@ -637,6 +637,9 @@ p11_get_ckm(CK_ULONG mechanism)
        _sym2str(CKM_EC_KEY_PAIR_GEN);
        _sym2str(CKM_ECDSA);
        _sym2str(CKM_ECDSA_SHA1);
+       _sym2str(CKM_ECDSA_SHA256);
+       _sym2str(CKM_ECDSA_SHA384);
+       _sym2str(CKM_ECDSA_SHA512);
        _sym2str(CKM_ECDH1_DERIVE);
        _sym2str(CKM_ECDH1_COFACTOR_DERIVE);
        _sym2str(CKM_ECMQV_DERIVE);
diff --git a/usr/lib/pkcs11/common/sign_mgr.c b/usr/lib/pkcs11/common/sign_mgr.c
index 01fd424..4bc3659 100755
--- a/usr/lib/pkcs11/common/sign_mgr.c
+++ b/usr/lib/pkcs11/common/sign_mgr.c
@@ -428,6 +428,9 @@ sign_mgr_init( SESSION                * sess,
 
       case CKM_ECDSA:
       case CKM_ECDSA_SHA1:
+      case CKM_ECDSA_SHA256:
+      case CKM_ECDSA_SHA384:
+      case CKM_ECDSA_SHA512:
          {
             if (mech->ulParameterLen != 0){
                TRACE_ERROR("%s\n", ock_err(ERR_MECHANISM_PARAM_INVALID));
@@ -1083,6 +1086,9 @@ sign_mgr_sign( SESSION              * sess,
                                in_data,  in_data_len,
                               out_data, out_data_len );
       case CKM_ECDSA_SHA1:
+      case CKM_ECDSA_SHA256:
+      case CKM_ECDSA_SHA384:
+      case CKM_ECDSA_SHA512:
          return ec_hash_sign( sess, length_only, ctx,
                                in_data,  in_data_len,
                                out_data, out_data_len );
@@ -1163,6 +1169,9 @@ sign_mgr_sign_update( SESSION             * sess,
           return aes_mac_sign_update( sess, ctx, in_data, in_data_len );
 
       case CKM_ECDSA_SHA1:
+      case CKM_ECDSA_SHA256:
+      case CKM_ECDSA_SHA384:
+      case CKM_ECDSA_SHA512:
         return ec_hash_sign_update( sess, ctx, in_data, in_data_len );
 
       case CKM_SHA_1_HMAC:
@@ -1236,6 +1245,9 @@ sign_mgr_sign_final( SESSION             * sess,
          return aes_mac_sign_final( sess, length_only, ctx, signature, sig_len 
);
 
       case CKM_ECDSA_SHA1:
+      case CKM_ECDSA_SHA256:
+      case CKM_ECDSA_SHA384:
+      case CKM_ECDSA_SHA512:
         return ec_hash_sign_final (sess, length_only, ctx, signature, sig_len 
);
       case CKM_SHA_1_HMAC:
       case CKM_SHA256_HMAC:
diff --git a/usr/lib/pkcs11/common/verify_mgr.c 
b/usr/lib/pkcs11/common/verify_mgr.c
index 605bd0d..1aad58d 100755
--- a/usr/lib/pkcs11/common/verify_mgr.c
+++ b/usr/lib/pkcs11/common/verify_mgr.c
@@ -425,6 +425,9 @@ verify_mgr_init( SESSION             * sess,
 
       case CKM_ECDSA:
       case CKM_ECDSA_SHA1:
+      case CKM_ECDSA_SHA256:
+      case CKM_ECDSA_SHA384:
+      case CKM_ECDSA_SHA512:
          {
             if (mech->ulParameterLen != 0){
                TRACE_ERROR("%s\n", ock_err(ERR_MECHANISM_PARAM_INVALID));
@@ -1081,6 +1084,9 @@ verify_mgr_verify( SESSION             * sess,
                          in_data, in_data_len, signature, sig_len);
 
       case CKM_ECDSA_SHA1:
+      case CKM_ECDSA_SHA256:
+      case CKM_ECDSA_SHA384:
+      case CKM_ECDSA_SHA512:
          return ec_hash_verify( sess,  ctx,
                                  in_data,   in_data_len,
                                  signature, sig_len );
@@ -1149,6 +1155,9 @@ verify_mgr_verify_update( SESSION             * sess,
           return aes_mac_verify_update( sess, ctx, in_data, in_data_len );
 
       case CKM_ECDSA_SHA1:
+      case CKM_ECDSA_SHA256:
+      case CKM_ECDSA_SHA384:
+      case CKM_ECDSA_SHA512:
         return ec_hash_verify_update( sess, ctx, in_data, in_data_len );
 
       case CKM_SHA_1_HMAC:
@@ -1218,6 +1227,9 @@ verify_mgr_verify_final( SESSION             * sess,
          return aes_mac_verify_final( sess, ctx, signature, sig_len );
 
       case CKM_ECDSA_SHA1:
+      case CKM_ECDSA_SHA256:
+      case CKM_ECDSA_SHA384:
+      case CKM_ECDSA_SHA512:
         return ec_hash_verify_final( sess, ctx, signature, sig_len );
 
       case CKM_SHA_1_HMAC:
diff --git a/usr/lib/pkcs11/ep11_stdll/ep11_specific.c 
b/usr/lib/pkcs11/ep11_stdll/ep11_specific.c
index 7e484b0..8a346dc 100644
--- a/usr/lib/pkcs11/ep11_stdll/ep11_specific.c
+++ b/usr/lib/pkcs11/ep11_stdll/ep11_specific.c
@@ -478,6 +478,34 @@ static CK_ULONG ep11_pin_blob_len = 0;
 #define CKM_SHA224_HMAC           0x00000256
 #define CKM_SHA384_KEY_DERIVATION 0x00000394
 #define CKM_SHA512_KEY_DERIVATION 0x00000395
+#define CKM_SHA512_224            0x000002B0
+#define CKM_SHA512_224_HMAC       0x000002B1
+#define CKM_SHA512_224_HMAC_GENERAL 0x000002B2
+#define CKM_SHA512_256            0x000002C0
+#define CKM_SHA512_256_HMAC       0x000002C1
+#define CKM_SHA512_256_HMAC_GENERAL 0x000002C2
+#define CKM_ECDSA_SHA224          0x00001043
+
+/* Vendor specific mechanisms unknown by ock, but known by EP11 */
+#define CKA_IBM_MACKEY                     CKM_VENDOR_DEFINED + 0x00010007
+#define CKM_IBM_ECDSA_SHA224               CKM_VENDOR_DEFINED + 0x00010008
+#define CKM_IBM_ECDSA_SHA256               CKM_VENDOR_DEFINED + 0x00010009
+#define CKM_IBM_ECDSA_SHA384               CKM_VENDOR_DEFINED + 0x0001000A
+#define CKM_IBM_ECDSA_SHA512               CKM_VENDOR_DEFINED + 0x0001000B
+#define CKM_IBM_EC_MULTIPLY                CKM_VENDOR_DEFINED + 0x0001000C
+#define CKM_IBM_EAC                        CKM_VENDOR_DEFINED + 0x0001000D
+#define CKM_IBM_SHA512_256                 CKM_VENDOR_DEFINED + 0x00010012
+#define CKM_IBM_SHA512_224                 CKM_VENDOR_DEFINED + 0x00010013
+#define CKM_IBM_SHA512_256_HMAC            CKM_VENDOR_DEFINED + 0x00010014
+#define CKM_IBM_SHA512_224_HMAC            CKM_VENDOR_DEFINED + 0x00010015
+#define CKM_IBM_SHA512_256_KEY_DERIVATION  CKM_VENDOR_DEFINED + 0x00010016
+#define CKM_IBM_SHA512_224_KEY_DERIVATION  CKM_VENDOR_DEFINED + 0x00010017
+#define CKM_IBM_ATTRIBUTEBOUND_WRAP        CKM_VENDOR_DEFINED + 0x00020004
+#define CKM_IBM_TRANSPORTKEY               CKM_VENDOR_DEFINED + 0x00020005
+#define CKM_IBM_DH_PKCS_DERIVE_RAW         CKM_VENDOR_DEFINED + 0x00020006
+#define CKM_IBM_ECDH1_DERIVE_RAW           CKM_VENDOR_DEFINED + 0x00020007
+#define CKM_IBM_RETAINKEY                  CKM_VENDOR_DEFINED + 0x00040001
+
 
 static CK_BBOOL ep11_initialized = FALSE;
 
@@ -986,6 +1014,10 @@ static const char* ep11_get_ckm(CK_ULONG mechanism)
        case CKM_EC_KEY_PAIR_GEN: return "CKM_EC_KEY_PAIR_GEN";
        case CKM_ECDSA: return "CKM_ECDSA";
        case CKM_ECDSA_SHA1: return "CKM_ECDSA_SHA1";
+       case CKM_ECDSA_SHA224: return "CKM_ECDSA_SHA224";
+       case CKM_ECDSA_SHA256: return "CKM_ECDSA_SHA256";
+       case CKM_ECDSA_SHA384: return "CKM_ECDSA_SHA384";
+       case CKM_ECDSA_SHA512: return "CKM_ECDSA_SHA512";
        case CKM_ECDH1_DERIVE: return "CKM_ECDH1_DERIVE";
        case CKM_ECDH1_COFACTOR_DERIVE: return "CKM_ECDH1_COFACTOR_DERIVE";
        case CKM_ECMQV_DERIVE: return "CKM_ECMQV_DERIVE";
@@ -1017,24 +1049,30 @@ static const char* ep11_get_ckm(CK_ULONG mechanism)
        case CKM_SHA224_HMAC: return "CKM_SHA224_HMAC";
        case CKM_SHA384_KEY_DERIVATION: return "CKM_SHA384_KEY_DERIVATION";
        case CKM_SHA512_KEY_DERIVATION: return "CKM_SHA512_KEY_DERIVATION";
-       case CKM_VENDOR_DEFINED + 0x10007: return "CKA_IBM_MACKEY";
-       case CKM_VENDOR_DEFINED + 0x10008: return "CKM_IBM_ECDSA_SHA224";
-       case CKM_VENDOR_DEFINED + 0x10009: return "CKM_IBM_ECDSA_SHA256";
-       case CKM_VENDOR_DEFINED + 0x1000a: return "CKM_IBM_ECDSA_SHA384";
-       case CKM_VENDOR_DEFINED + 0x1000b: return "CKM_IBM_ECDSA_SHA512";
-       case CKR_VENDOR_DEFINED + 0x1000c: return "CKM_IBM_EC_MULTIPLY";
-       case CKM_VENDOR_DEFINED + 0x1000d: return "CKM_IBM_EAC";
-       case CKM_VENDOR_DEFINED + 0x10012: return "CKM_IBM_SHA512_256";
-       case CKM_VENDOR_DEFINED + 0x10013: return "CKM_IBM_SHA512_224";
-       case CKM_VENDOR_DEFINED + 0x10014: return "CKM_IBM_SHA512_256_HMAC";
-       case CKM_VENDOR_DEFINED + 0x10015: return "CKM_IBM_SHA512_224_HMAC";
-       case CKM_VENDOR_DEFINED + 0x10016: return 
"CKM_IBM_SHA512_256_KEY_DERIVATION";
-       case CKM_VENDOR_DEFINED + 0x10017: return 
"CKM_IBM_SHA512_224_KEY_DERIVATION";
-       case CKM_VENDOR_DEFINED + 0x20004: return "CKM_IBM_ATTRIBUTEBOUND_WRAP";
-       case CKM_VENDOR_DEFINED + 0x20005: return "CKM_IBM_TRANSPORTKEY";
-       case CKM_VENDOR_DEFINED + 0x20006: return "CKM_IBM_DH_PKCS_DERIVE_RAW";
-       case CKM_VENDOR_DEFINED + 0x20007: return "CKM_IBM_ECDH1_DERIVE_RAW";
-       case CKM_VENDOR_DEFINED + 0x40001: return "CKM_IBM_RETAINKEY";
+       case CKM_SHA512_224: return "CKM_SHA512_224";
+       case CKM_SHA512_224_HMAC: return "CKM_SHA512_224_HMAC";
+       case CKM_SHA512_224_HMAC_GENERAL: return "CKM_SHA512_224_HMAC_GENERAL";
+       case CKM_SHA512_256: return "CKM_SHA512_256";
+       case CKM_SHA512_256_HMAC: return "CKM_SHA512_256_HMAC";
+       case CKM_SHA512_256_HMAC_GENERAL: return "CKM_SHA512_256_HMAC_GENERAL";
+       case CKA_IBM_MACKEY: return "CKA_IBM_MACKEY";
+       case CKM_IBM_ECDSA_SHA224: return "CKM_IBM_ECDSA_SHA224";
+       case CKM_IBM_ECDSA_SHA256: return "CKM_IBM_ECDSA_SHA256";
+       case CKM_IBM_ECDSA_SHA384: return "CKM_IBM_ECDSA_SHA384";
+       case CKM_IBM_ECDSA_SHA512: return "CKM_IBM_ECDSA_SHA512";
+       case CKM_IBM_EC_MULTIPLY: return "CKM_IBM_EC_MULTIPLY";
+       case CKM_IBM_EAC: return "CKM_IBM_EAC";
+       case CKM_IBM_SHA512_256: return "CKM_IBM_SHA512_256";
+       case CKM_IBM_SHA512_224: return "CKM_IBM_SHA512_224";
+       case CKM_IBM_SHA512_256_HMAC: return "CKM_IBM_SHA512_256_HMAC";
+       case CKM_IBM_SHA512_224_HMAC: return "CKM_IBM_SHA512_224_HMAC";
+       case CKM_IBM_SHA512_256_KEY_DERIVATION: return 
"CKM_IBM_SHA512_256_KEY_DERIVATION";
+       case CKM_IBM_SHA512_224_KEY_DERIVATION: return 
"CKM_IBM_SHA512_224_KEY_DERIVATION";
+       case CKM_IBM_ATTRIBUTEBOUND_WRAP: return "CKM_IBM_ATTRIBUTEBOUND_WRAP";
+       case CKM_IBM_TRANSPORTKEY: return "CKM_IBM_TRANSPORTKEY";
+       case CKM_IBM_DH_PKCS_DERIVE_RAW: return "CKM_IBM_DH_PKCS_DERIVE_RAW";
+       case CKM_IBM_ECDH1_DERIVE_RAW: return "CKM_IBM_ECDH1_DERIVE_RAW";
+       case CKM_IBM_RETAINKEY: return "CKM_IBM_RETAINKEY";
        default:
                TRACE_WARNING("%s unknown mechanism %lx\n", __func__, 
mechanism);
                return "UNKNOWN";
@@ -3666,14 +3704,30 @@ CK_MECHANISM_TYPE ep11_banned_mech_list[] =
        CKM_SHA224_KEY_DERIVATION,
        CKM_SHA384_KEY_DERIVATION,
        CKM_SHA512_KEY_DERIVATION,
+       CKM_ECDSA_SHA224,
+       CKM_SHA512_224,
+       CKM_SHA512_224_HMAC,
+       CKM_SHA512_224_HMAC_GENERAL,
+       CKM_SHA512_256,
+       CKM_SHA512_256_HMAC,
+       CKM_SHA512_256_HMAC_GENERAL,
+       
        /* Vendor specific */
-       0x80020006,
-       0x80020007,
-       0x8001000C,
-       0x80020004,
-       0x8001000D,
-       0x80040001,
-       0x80010007,
+       CKM_IBM_DH_PKCS_DERIVE_RAW,
+       CKM_IBM_ECDH1_DERIVE_RAW,
+       CKM_IBM_EC_MULTIPLY,
+       CKM_IBM_ATTRIBUTEBOUND_WRAP,
+       CKM_IBM_EAC,
+       CKM_IBM_RETAINKEY,
+       CKA_IBM_MACKEY,
+       CKM_IBM_ECDSA_SHA224,
+       CKM_IBM_ECDSA_SHA256,
+       CKM_IBM_ECDSA_SHA384,
+       CKM_IBM_ECDSA_SHA512,
+       CKM_IBM_SHA512_256,
+       CKM_IBM_SHA512_224,
+       CKM_IBM_SHA512_256_HMAC,
+       CKM_IBM_SHA512_224_HMAC,
 
 #endif
 };
diff --git a/usr/sbin/pkcsconf/pkcsconf_msg.h b/usr/sbin/pkcsconf/pkcsconf_msg.h
index 56972a7..b95c226 100755
--- a/usr/sbin/pkcsconf/pkcsconf_msg.h
+++ b/usr/sbin/pkcsconf/pkcsconf_msg.h
@@ -511,6 +511,9 @@ struct _pkcs11_mech_list {
        { "CKM_EC_KEY_PAIR_GEN", CKM_EC_KEY_PAIR_GEN },
        { "CKM_ECDSA", CKM_ECDSA },
        { "CKM_ECDSA_SHA1", CKM_ECDSA_SHA1 },
+       { "CKM_ECDSA_SHA256", CKM_ECDSA_SHA256 },
+       { "CKM_ECDSA_SHA384", CKM_ECDSA_SHA384 },
+       { "CKM_ECDSA_SHA512", CKM_ECDSA_SHA512 },
        { "CKM_ECDH1_DERIVE", CKM_ECDH1_DERIVE },
        { "CKM_ECDH1_COFACTOR_DERIVE", CKM_ECDH1_COFACTOR_DERIVE },
        { "CKM_ECMQV_DERIVE", CKM_ECMQV_DERIVE },
diff --git a/usr/sbin/pkcsslotd/err.c b/usr/sbin/pkcsslotd/err.c
index 6ec7c41..db56714 100755
--- a/usr/sbin/pkcsslotd/err.c
+++ b/usr/sbin/pkcsslotd/err.c
@@ -761,6 +761,9 @@
        CONSTINFO(CKM_ECDSA_KEY_PAIR_GEN), 
        CONSTINFO(CKM_ECDSA), 
        CONSTINFO(CKM_ECDSA_SHA1), 
+       CONSTINFO(CKM_ECDSA_SHA256), 
+       CONSTINFO(CKM_ECDSA_SHA384), 
+       CONSTINFO(CKM_ECDSA_SHA512), 
        CONSTINFO(CKM_JUNIPER_KEY_GEN), 
        CONSTINFO(CKM_JUNIPER_ECB128), 
        CONSTINFO(CKM_JUNIPER_CBC128), 

-- 
Ingo Franzki
eMail: ifran...@linux.vnet.ibm.com  
Tel: ++49 (0)7031-16-4648
Fax: ++49 (0)7031-16-3456
Linux on z Systems Development, IBM z Systems, Schoenaicher Str. 220, 71032 
Boeblingen, Germany

IBM Deutschland Research & Development GmbH / Vorsitzender des Aufsichtsrats: 
Martina Koederitz 
Geschäftsführung: Dirk Wittkopp 
Sitz der Gesellschaft: Böblingen / Registergericht: Amtsgericht Stuttgart, HRB 
243294


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Opencryptoki-tech mailing list
Opencryptoki-tech@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opencryptoki-tech

Reply via email to