Signed-off-by: Harald Freudenberger <fre...@linux.vnet.ibm.com>
---
 usr/lib/pkcs11/cca_stdll/cca_specific.c |  138 ++++++++++++++++++++++++++++---
 usr/lib/pkcs11/cca_stdll/csulincl.h     |   35 ++++++++
 2 files changed, 160 insertions(+), 13 deletions(-)

diff --git a/usr/lib/pkcs11/cca_stdll/cca_specific.c 
b/usr/lib/pkcs11/cca_stdll/cca_specific.c
index 893b33c..9a649d0 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,
@@ -2445,9 +2445,99 @@ 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_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;
@@ -2527,6 +2617,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;
diff --git a/usr/lib/pkcs11/cca_stdll/csulincl.h 
b/usr/lib/pkcs11/cca_stdll/csulincl.h
index 6fbf686..b189c29 100644
--- a/usr/lib/pkcs11/cca_stdll/csulincl.h
+++ b/usr/lib/pkcs11/cca_stdll/csulincl.h
@@ -34,6 +34,7 @@
   #define CSNBKGN   CSNBKGN_32
   #define CSNBKIM   CSNBKIM_32
   #define CSNBKPI   CSNBKPI_32
+  #define CSNBKPI2  CSNBKPI2_32
   #define CSNBKRC   CSNBKRC_32
   #define CSNBAKRC  CSNBAKRC_32
   #define CSNBKRD   CSNBKRD_32
@@ -55,6 +56,7 @@
   #define CSNBMGN   CSNBMGN_32
   #define CSNBMVR   CSNBMVR_32
   #define CSNBKTB   CSNBKTB_32
+  #define CSNBKTB2  CSNBKTB2_32
   #define CSNDPKG   CSNDPKG_32
   #define CSNDPKB   CSNDPKB_32
   #define CSNBOWH   CSNBOWH_32
@@ -218,6 +220,19 @@ extern void SECURITYAPI
               unsigned char * key_part,
               unsigned char * key_identifier);
 
+/* Key Part Import2 */
+extern void SECURITYAPI
+   CSNBKPI2_32(long          * return_code,
+               long          * reason_code,
+               long          * exit_data_length,
+               unsigned char * exit_data,
+               long          * rule_array_count,
+               unsigned char * rule_array,
+               long          * clear_key_part_length,
+               unsigned char * clear_key_part,
+               long          * key_identifier_length,
+               unsigned char * key_identifier);
+
 /* Key Storage Initialization */
 extern void SECURITYAPI
    CSNBKSI_32(long          * return_code,
@@ -527,6 +542,26 @@ extern void SECURITYAPI
               unsigned char * reserved_field_6,
               unsigned char * master_key_verification_number );
 
+/* Key Token Build2 */
+extern void SECURITYAPI
+  CSNBKTB2_32(long          * return_code,
+              long          * reason_code,
+              long          * exit_data_length,
+              unsigned char * exit_data,
+              long          * rule_array_count,
+              unsigned char * rule_array,
+              long          * clear_key_bit_length,
+              unsigned char * clear_key_value,
+              long          * key_name_length,
+              unsigned char * key_name,
+              long          * user_associated_data_length,
+              unsigned char * user_associated_data,
+              long          * token_data_length,
+              unsigned char * token_data,
+              long          * reserved_length,
+              unsigned char * reserved,
+              long          * target_key_token_length,
+              unsigned char * target_key_token);
 
 /* PKA Key Generate */
 extern void SECURITYAPI
-- 
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

Reply via email to