Merged. Thanks!

regards,
Joy

On Thu, 2015-07-02 at 15:00 +0200, Harald Freudenberger wrote:
> 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



------------------------------------------------------------------------------
Monitor Your Dynamic Infrastructure at Any Scale With Datadog!
Get real-time metrics from all of your servers, apps and tools
in one place.
SourceForge users - Click here to start your Free Trial of Datadog now!
http://pubads.g.doubleclick.net/gampad/clk?id=241902991&iu=/4140
_______________________________________________
Opencryptoki-tech mailing list
Opencryptoki-tech@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opencryptoki-tech

Reply via email to