From: Ingo Franzki <ifran...@de.ibm.com> Slightly adapted version of Ingo's patch: Patch hunks needed relocation because of previous commits in some files. Removed some trailing whitespaces. Tested, works.
Signed-off-by: Ingo Franzki <ifran...@de.ibm.com> Signed-off-by: Harald Freudenberger <fre...@linux.vnet.ibm.com> --- misc/mech_types.h | 4 + testcases/crypto/ec_func.c | 119 +++++++++++++++++----- testcases/include/mech_to_str.h | 6 ++ usr/include/pkcs11/pkcs11types.h | 4 + usr/lib/pkcs11/cca_stdll/cca_specific.c | 15 ++- usr/lib/pkcs11/common/mech_ec.c | 162 +++++++++++++++++++++++------- usr/lib/pkcs11/common/p11util.c | 3 + usr/lib/pkcs11/common/sign_mgr.c | 12 +++ usr/lib/pkcs11/common/verify_mgr.c | 12 +++ usr/lib/pkcs11/ep11_stdll/ep11_specific.c | 104 ++++++++++++++----- usr/sbin/pkcsconf/pkcsconf_msg.h | 3 + usr/sbin/pkcsslotd/err.c | 7 +- 12 files changed, 359 insertions(+), 92 deletions(-) diff --git a/misc/mech_types.h b/misc/mech_types.h index ffeacfd..1740574 100644 --- a/misc/mech_types.h +++ b/misc/mech_types.h @@ -234,6 +234,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 9c4759a..c65d82d 100644 --- a/testcases/crypto/ec_func.c +++ b/testcases/crypto/ec_func.c @@ -141,18 +141,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; @@ -160,7 +169,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; @@ -199,11 +208,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); @@ -214,10 +240,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 *******/ @@ -227,10 +262,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 @@ -242,11 +294,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; @@ -325,6 +395,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 75d94db..7734553 100644 --- a/testcases/include/mech_to_str.h +++ b/testcases/include/mech_to_str.h @@ -382,6 +382,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 1d09404..2bc3688 100755 --- a/usr/include/pkcs11/pkcs11types.h +++ b/usr/include/pkcs11/pkcs11types.h @@ -779,6 +779,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 e145333..6b0462e 100644 --- a/usr/lib/pkcs11/cca_stdll/cca_specific.c +++ b/usr/lib/pkcs11/cca_stdll/cca_specific.c @@ -183,10 +183,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 6d11d08..eef32f6 100644 --- a/usr/lib/pkcs11/common/mech_ec.c +++ b/usr/lib/pkcs11/common/mech_ec.c @@ -145,12 +145,12 @@ ckm_ec_sign( CK_BYTE *in_data, CK_RV ec_sign( SESSION *sess, - CK_BBOOL length_only, - SIGN_VERIFY_CONTEXT *ctx, - CK_BYTE *in_data, - CK_ULONG in_data_len, - CK_BYTE *out_data, - CK_ULONG *out_data_len ) + CK_BBOOL length_only, + SIGN_VERIFY_CONTEXT *ctx, + CK_BYTE *in_data, + CK_ULONG in_data_len, + CK_BYTE *out_data, + CK_ULONG *out_data_len ) { OBJECT *key_obj = NULL; CK_ULONG plen; @@ -274,7 +274,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; @@ -289,16 +289,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"); @@ -326,9 +348,9 @@ error: CK_RV ec_hash_sign_update( SESSION * sess, - SIGN_VERIFY_CONTEXT * ctx, - CK_BYTE * in_data, - CK_ULONG in_data_len ) + SIGN_VERIFY_CONTEXT * ctx, + CK_BYTE * in_data, + CK_ULONG in_data_len ) { RSA_DIGEST_CONTEXT * context = NULL; CK_MECHANISM digest_mech; @@ -341,14 +363,30 @@ 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; rc = digest_mgr_init( sess, &context->hash_context, &digest_mech ); if (rc != CKR_OK){ TRACE_DEVEL("Digest Mgr Init failed.\n"); - return rc; + return rc; } context->flag = TRUE; } @@ -363,12 +401,12 @@ ec_hash_sign_update( SESSION * sess, CK_RV ec_hash_sign_final( SESSION * sess, - CK_BBOOL length_only, - SIGN_VERIFY_CONTEXT * ctx, - CK_BYTE * signature, - CK_ULONG * sig_len ) + CK_BBOOL length_only, + SIGN_VERIFY_CONTEXT * ctx, + 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; @@ -384,7 +422,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"); @@ -418,13 +461,13 @@ done: CK_RV ec_hash_verify( SESSION * sess, - SIGN_VERIFY_CONTEXT * ctx, - CK_BYTE * in_data, - CK_ULONG in_data_len, - CK_BYTE * signature, - CK_ULONG sig_len ) + SIGN_VERIFY_CONTEXT * ctx, + CK_BYTE * in_data, + CK_ULONG in_data_len, + 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; @@ -439,16 +482,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"); @@ -479,9 +544,9 @@ done: CK_RV ec_hash_verify_update( SESSION * sess, - SIGN_VERIFY_CONTEXT * ctx, - CK_BYTE * in_data, - CK_ULONG in_data_len ) + SIGN_VERIFY_CONTEXT * ctx, + CK_BYTE * in_data, + CK_ULONG in_data_len ) { RSA_DIGEST_CONTEXT * context = NULL; CK_MECHANISM digest_mech; @@ -494,14 +559,30 @@ 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; rc = digest_mgr_init( sess, &context->hash_context, &digest_mech ); if (rc != CKR_OK){ TRACE_DEVEL("Digest Mgr Init failed.\n"); - return rc; + return rc; } context->flag = TRUE; } @@ -516,11 +597,11 @@ ec_hash_verify_update( SESSION * sess, CK_RV ec_hash_verify_final( SESSION * sess, - SIGN_VERIFY_CONTEXT * ctx, - CK_BYTE * signature, - CK_ULONG sig_len ) + SIGN_VERIFY_CONTEXT * ctx, + 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; @@ -535,7 +616,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 fae088f..f9012f2 100755 --- a/usr/lib/pkcs11/common/p11util.c +++ b/usr/lib/pkcs11/common/p11util.c @@ -356,6 +356,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 7514b37..490092f 100755 --- a/usr/lib/pkcs11/common/sign_mgr.c +++ b/usr/lib/pkcs11/common/sign_mgr.c @@ -147,6 +147,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)); @@ -802,6 +805,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 ); @@ -882,6 +888,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: @@ -955,6 +964,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 2c6fdef..96db2e5 100755 --- a/usr/lib/pkcs11/common/verify_mgr.c +++ b/usr/lib/pkcs11/common/verify_mgr.c @@ -144,6 +144,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)); @@ -800,6 +803,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 ); @@ -868,6 +874,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: @@ -937,6 +946,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 df7822e..04838f5 100644 --- a/usr/lib/pkcs11/ep11_stdll/ep11_specific.c +++ b/usr/lib/pkcs11/ep11_stdll/ep11_specific.c @@ -200,6 +200,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; @@ -708,6 +736,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"; @@ -739,24 +771,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"; @@ -3388,14 +3426,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 9050532..3424d05 100755 --- a/usr/sbin/pkcsconf/pkcsconf_msg.h +++ b/usr/sbin/pkcsconf/pkcsconf_msg.h @@ -225,6 +225,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 a62b904..e587c07 100755 --- a/usr/sbin/pkcsslotd/err.c +++ b/usr/sbin/pkcsslotd/err.c @@ -199,13 +199,13 @@ #ifdef SIGPOLL CONSTINFO(SIGPOLL), #endif - #if 0 + #if 0 CONSTINFO(SIG_DFL), CONSTINFO(SIG_IGN), CONSTINFO(SIG_HOLD), CONSTINFO(SIG_CATCH), CONSTINFO(SIG_ERR), - #endif /* 0 */ + #endif /* 0 */ }; @@ -481,6 +481,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), -- 2.7.4 ------------------------------------------------------------------------------ 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