Signed-off-by: Harald Freudenberger <fre...@linux.vnet.ibm.com> --- usr/lib/pkcs11/cca_stdll/cca_specific.c | 139 ++++++++++++++++++++++++++++--- 1 file changed, 126 insertions(+), 13 deletions(-)
diff --git a/usr/lib/pkcs11/cca_stdll/cca_specific.c b/usr/lib/pkcs11/cca_stdll/cca_specific.c index ca409cd..3ce1b3a 100644 --- a/usr/lib/pkcs11/cca_stdll/cca_specific.c +++ b/usr/lib/pkcs11/cca_stdll/cca_specific.c @@ -65,20 +65,20 @@ MECH_LIST_ELEMENT mech_list[] = { {CKM_AES_CBC_PAD, {16, 32, CKF_HW|CKF_ENCRYPT|CKF_DECRYPT|CKF_WRAP| CKF_UNWRAP}}, {CKM_SHA512, {0, 0, CKF_HW|CKF_DIGEST}}, - {CKM_SHA512_HMAC, {0, 0, CKF_SIGN|CKF_VERIFY}}, - {CKM_SHA512_HMAC_GENERAL, {0, 0, CKF_SIGN|CKF_VERIFY}}, + {CKM_SHA512_HMAC, {80, 2048, CKF_SIGN|CKF_VERIFY}}, + {CKM_SHA512_HMAC_GENERAL, {80, 2048, CKF_SIGN|CKF_VERIFY}}, {CKM_SHA384, {0, 0, CKF_HW|CKF_DIGEST}}, - {CKM_SHA384_HMAC, {0, 0, CKF_SIGN|CKF_VERIFY}}, - {CKM_SHA384_HMAC_GENERAL, {0, 0, CKF_SIGN|CKF_VERIFY}}, + {CKM_SHA384_HMAC, {80, 2048, CKF_SIGN|CKF_VERIFY}}, + {CKM_SHA384_HMAC_GENERAL, {80, 2048, CKF_SIGN|CKF_VERIFY}}, {CKM_SHA256, {0, 0, CKF_HW|CKF_DIGEST}}, - {CKM_SHA256_HMAC, {0, 0, CKF_SIGN|CKF_VERIFY}}, - {CKM_SHA256_HMAC_GENERAL, {0, 0, CKF_SIGN|CKF_VERIFY}}, + {CKM_SHA256_HMAC, {80, 2048, CKF_SIGN|CKF_VERIFY}}, + {CKM_SHA256_HMAC_GENERAL, 80, 2048, CKF_SIGN|CKF_VERIFY}}, {CKM_SHA_1, {0, 0, CKF_DIGEST}}, - {CKM_SHA_1_HMAC, {0, 0, CKF_SIGN|CKF_VERIFY}}, - {CKM_SHA_1_HMAC_GENERAL, {0, 0, CKF_SIGN|CKF_VERIFY}}, + {CKM_SHA_1_HMAC, {80, 2048, CKF_SIGN|CKF_VERIFY}}, + {CKM_SHA_1_HMAC_GENERAL, {80, 2048, CKF_SIGN|CKF_VERIFY}}, {CKM_MD5, {0, 0, CKF_DIGEST}}, - {CKM_MD5_HMAC, {0, 0, CKF_SIGN|CKF_VERIFY}}, - {CKM_MD5_HMAC_GENERAL, {0, 0, CKF_SIGN|CKF_VERIFY}}, + {CKM_MD5_HMAC, {80, 2048, CKF_SIGN|CKF_VERIFY}}, + {CKM_MD5_HMAC_GENERAL, {80, 2048, CKF_SIGN|CKF_VERIFY}}, {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| @@ -1028,7 +1028,7 @@ token_specific_aes_ecb(CK_BYTE *in_data, return CKR_FUNCTION_FAILED; } - key_len = 64; + key_len = attr->ulValueLen; rule_array_count = 4; memcpy(rule_array, "AES ECB KEYIDENTINITIAL ", rule_array_count*(size_t)CCA_KEYWORD_SIZE); @@ -1145,7 +1145,7 @@ token_specific_aes_cbc(CK_BYTE *in_data, } length = in_data_len; - key_len = 64; + key_len = attr->ulValueLen; if (encrypt) { CSNBSAE(&return_code, &reason_code, @@ -2446,9 +2446,100 @@ static CK_RV import_des_key(unsigned char *key, CK_ULONG keylen, return CKR_OK; } -CK_RV token_specific_object_add(OBJECT *object) +static CK_RV import_generic_secret_key(unsigned char *key, CK_ULONG keylen, + TEMPLATE *obj_tmpl) { + CK_RV rc; + long return_code, reason_code, rule_array_count; + unsigned char key_type[CCA_KEYWORD_SIZE]; + unsigned char key_token[CCA_KEY_TOKEN_SIZE] = { 0 }; + unsigned char rule_array[CCA_RULE_ARRAY_SIZE] = { 0 }; + long key_name_len = 0, clr_key_len = 0; + long user_data_len = 0, key_part_len = 0; + long token_data_len = 0, verb_data_len = 0; + long key_token_len = sizeof(key_token); + CK_ATTRIBUTE *opaque_key = NULL; + + /* key len needs to be 80-2048 bits */ + if (8*keylen < 80 || 8*keylen > 2048) { + TRACE_ERROR("HMAC key size of %lu bits not within" + " CCA required range of 80-2048 bits\n", + 8*keylen); + return CKR_KEY_SIZE_RANGE; + } + + memcpy(rule_array, + "INTERNALNO-KEY HMAC MAC GENERATE", + 5 * CCA_KEYWORD_SIZE); + rule_array_count = 5; + + CSNBKTB2( &return_code, &reason_code, + NULL, NULL, + &rule_array_count, rule_array, + &clr_key_len, NULL, + &key_name_len, NULL, + &user_data_len, NULL, + &token_data_len, NULL, + &verb_data_len, NULL, + &key_token_len, key_token ); + if (return_code != CCA_SUCCESS) { + TRACE_ERROR("CSNBKTB2 (HMAC KEY TOKEN BUILD) failed." + " return:%ld, reason:%ld\n", + return_code, reason_code); + return CKR_FUNCTION_FAILED; + } + + memcpy(rule_array, "HMAC FIRST MIN1PART", 3 * CCA_KEYWORD_SIZE); + rule_array_count = 3; + key_part_len = keylen * 8; + key_token_len = sizeof(key_token); + + CSNBKPI2( &return_code, &reason_code, + NULL, NULL, + &rule_array_count, rule_array, + &key_part_len, key, + &key_token_len, key_token ); + if (return_code != CCA_SUCCESS) { + TRACE_ERROR("CSNBKPI2 (HMAC KEY IMPORT FIRST) failed." + " return:%ld, reason:%ld\n", + return_code, reason_code); + return CKR_FUNCTION_FAILED; + } + + memcpy(rule_array, "HMAC COMPLETE", 2 * CCA_KEYWORD_SIZE); + rule_array_count = 2; + key_part_len = 0; + key_token_len = sizeof(key_token); + + CSNBKPI2( &return_code, &reason_code, + NULL, NULL, + &rule_array_count, rule_array, + &key_part_len, NULL, + &key_token_len, key_token ); + if (return_code != CCA_SUCCESS) { + TRACE_ERROR("CSNBKPI2 (HMAC KEY IMPORT COMPLETE) failed." + " return:%ld, reason:%ld\n", + return_code, reason_code); + return CKR_FUNCTION_FAILED; + } + + /* Add the key object to the template */ + if ((rc = build_attribute(CKA_IBM_OPAQUE, key_token, + key_token_len, &opaque_key))) { + TRACE_DEVEL("build_attribute(CKA_IBM_OPAQUE) failed\n"); + return rc; + } + rc = template_update_attribute(obj_tmpl, opaque_key); + if (rc != CKR_OK) { + TRACE_DEVEL("template_update_attribute(CKA_IBM_OPAQUE) failed\n"); + return rc; + } + + return CKR_OK; +} +CK_RV token_specific_object_add(OBJECT *object) +{ CK_RV rc; CK_ATTRIBUTE *attr; CK_KEY_TYPE keytype; @@ -2528,6 +2619,28 @@ CK_RV token_specific_object_add(OBJECT *object) } TRACE_INFO("AES key with len=%ld successful imported\n", attr->ulValueLen); + } else if (keytype == CKK_GENERIC_SECRET) { + + rc = template_attribute_find(object->template, CKA_VALUE, &attr); + if (rc == FALSE) { + TRACE_ERROR("Incomplete Generic Secret (HMAC) key template\n"); + return CKR_TEMPLATE_INCOMPLETE; + } + rc = import_generic_secret_key(attr->pValue, attr->ulValueLen, + object->template); + if (rc != CKR_OK) { + TRACE_DEVEL("Generic Secret (HMAC) key import failed with rc=0x%lx\n", rc); + return CKR_FUNCTION_FAILED; + } + TRACE_INFO("Generic Secret (HMAC) key with len=%ld successful imported\n", + attr->ulValueLen); + + } else { + + /* unknown/unsupported key type */ + TRACE_ERROR("Unknown/unsupported key type 0x%lx\n", keytype); + return CKR_KEY_FUNCTION_NOT_PERMITTED; + } return CKR_OK; -- 1.7.9.5 ------------------------------------------------------------------------------ Don't Limit Your Business. Reach for the Cloud. GigeNET's Cloud Solutions provide you with the tools and support that you need to offload your IT needs and focus on growing your business. Configured For All Businesses. Start Your Cloud Today. https://www.gigenetcloud.com/ _______________________________________________ Opencryptoki-tech mailing list Opencryptoki-tech@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opencryptoki-tech