⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mech_des.c

📁 IBM的Linux上的PKCS#11实现
💻 C
📖 第 1 页 / 共 4 页
字号:
   if (context->len != 0){      st_err_log(109, __FILE__, __LINE__);      return CKR_DATA_LEN_RANGE;   }   *out_data_len = 0;    return CKR_OK;}////CK_RVdes_cbc_pad_encrypt_final( SESSION           *sess,                           CK_BBOOL           length_only,                           ENCR_DECR_CONTEXT *ctx,                           CK_BYTE           *out_data,                           CK_ULONG          *out_data_len ){   DES_CONTEXT    *context   = NULL;   OBJECT         *key       = NULL;   CK_ATTRIBUTE   *attr      = NULL;   CK_BYTE         clear[2 * DES_BLOCK_SIZE];   CK_ULONG        out_len;   CK_RV           rc;   if (!sess || !ctx || !out_data_len){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   rc = object_mgr_find_in_map1( ctx->key, &key );   if (rc != CKR_OK){      st_err_log(110, __FILE__, __LINE__);      return rc;   }   rc = template_attribute_find( key->template, CKA_VALUE, &attr );   if (rc == FALSE){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   context = (DES_CONTEXT *)ctx->context;   // there will never be more than one block in the context buffer   // so the amount of output is as follows:   //    if less than 1 block stored, we generate one block of output   //    if a full block is stored, we generate two blocks of output (one pad block)   //   if (context->len == DES_BLOCK_SIZE)      out_len = 2 * DES_BLOCK_SIZE;   else      out_len = DES_BLOCK_SIZE;   if (length_only == TRUE) {      *out_data_len = out_len;      return CKR_OK;   }   else {      memcpy( clear, context->data, context->len );      add_pkcs_padding( clear + context->len,                        DES_BLOCK_SIZE,                        context->len,                        out_len );      rc = ckm_des_cbc_encrypt( clear,    out_len,                                out_data, out_data_len,                                ctx->mech.pParameter,                                attr->pValue );      if (rc != CKR_OK)          st_err_log(113, __FILE__, __LINE__);      return rc;   }}////CK_RVdes_cbc_pad_decrypt_final( SESSION           *sess,                           CK_BBOOL           length_only,                           ENCR_DECR_CONTEXT *ctx,                           CK_BYTE           *out_data,                           CK_ULONG          *out_data_len ){   DES_CONTEXT  *context   = NULL;   OBJECT       *key       = NULL;   CK_ATTRIBUTE *attr      = NULL;   CK_BYTE       clear[DES_BLOCK_SIZE];   CK_BYTE       cipher[DES_BLOCK_SIZE];   CK_ULONG      out_len;   CK_RV         rc;   if (!sess || !ctx || !out_data_len){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   rc = object_mgr_find_in_map1( ctx->key, &key );   if (rc != CKR_OK){      st_err_log(110, __FILE__, __LINE__);      return rc;   }   rc = template_attribute_find( key->template, CKA_VALUE, &attr );   if (rc == FALSE){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   context = (DES_CONTEXT *)ctx->context;   // there had better be a full block in the context buffer   //   if (context->len != DES_BLOCK_SIZE){      st_err_log(112, __FILE__, __LINE__);      return CKR_ENCRYPTED_DATA_LEN_RANGE;   }   // we don't know a priori how much data we'll be returning.  we won't   // know until after we decrypt it and strip the padding.  it's possible   // that we'll return nothing (the final block might be a padding block).   //   out_len = DES_BLOCK_SIZE;  // upper bound on what we'll return   if (length_only == TRUE) {      *out_data_len = out_len;      return CKR_OK;   }   else {      memcpy( cipher, context->data, DES_BLOCK_SIZE );      rc = ckm_des_cbc_decrypt( cipher, DES_BLOCK_SIZE,                                clear,  &out_len,                                ctx->mech.pParameter,                                attr->pValue );      if (rc == CKR_OK) {         strip_pkcs_padding( clear, DES_BLOCK_SIZE, &out_len );         if (out_len != 0)            memcpy( out_data, clear, out_len );         *out_data_len = out_len;      }      else         st_err_log(114, __FILE__, __LINE__);      return rc;   }}//// mechanisms//////CK_RVckm_des_key_gen( TEMPLATE *tmpl ){   CK_ATTRIBUTE     * value_attr    = NULL;   CK_ATTRIBUTE     * key_type_attr = NULL;   CK_ATTRIBUTE     * class_attr    = NULL;   CK_ATTRIBUTE     * local_attr    = NULL;   CK_BYTE            des_key[DES_KEY_SIZE];   CK_ULONG           req_len, repl_len, expected_repl_len;   CK_ULONG           rc;   // Checking for a weak key is redundant in that the token   // specific keygen may already do this   // If the key generated is NOT a clear key, then this    // needs to be re-worked.   // probably by deciding if the key is being created as a private or   // public token object.  Only token objects are encrypted   // The size is passed in to allow the same token specific code to   // do both DES and TDES   do {      rc = token_specific.t_des_key_gen(des_key,DES_KEY_SIZE);   } while (des_check_weak_key(des_key) != FALSE  && rc != CKR_OK);   if (rc != CKR_OK)      goto done;   value_attr    = (CK_ATTRIBUTE *)malloc(sizeof(CK_ATTRIBUTE) + DES_KEY_SIZE );   key_type_attr = (CK_ATTRIBUTE *)malloc(sizeof(CK_ATTRIBUTE) + sizeof(CK_KEY_TYPE) );   class_attr    = (CK_ATTRIBUTE *)malloc(sizeof(CK_ATTRIBUTE) + sizeof(CK_OBJECT_CLASS) );   local_attr    = (CK_ATTRIBUTE *)malloc(sizeof(CK_ATTRIBUTE) + sizeof(CK_BBOOL) );   if (!value_attr || !key_type_attr || !class_attr || !local_attr) {      if (value_attr)    free( value_attr );      if (key_type_attr) free( key_type_attr );      if (class_attr)    free( class_attr );      if (local_attr)    free( local_attr );      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   value_attr->type         = CKA_VALUE;   value_attr->ulValueLen   = DES_KEY_SIZE;   value_attr->pValue       = (CK_BYTE *)value_attr + sizeof(CK_ATTRIBUTE);   memcpy( value_attr->pValue, des_key, DES_KEY_SIZE );   key_type_attr->type         = CKA_KEY_TYPE;   key_type_attr->ulValueLen   = sizeof(CK_KEY_TYPE);   key_type_attr->pValue       = (CK_BYTE *)key_type_attr + sizeof(CK_ATTRIBUTE);   *(CK_KEY_TYPE *)key_type_attr->pValue = CKK_DES;   class_attr->type         = CKA_CLASS;   class_attr->ulValueLen   = sizeof(CK_OBJECT_CLASS);   class_attr->pValue       = (CK_BYTE *)class_attr + sizeof(CK_ATTRIBUTE);   *(CK_OBJECT_CLASS *)class_attr->pValue = CKO_SECRET_KEY;   local_attr->type         = CKA_LOCAL;   local_attr->ulValueLen   = sizeof(CK_BBOOL);   local_attr->pValue       = (CK_BYTE *)local_attr + sizeof(CK_ATTRIBUTE);   *(CK_BBOOL *)local_attr->pValue = TRUE;   template_update_attribute( tmpl, value_attr );   template_update_attribute( tmpl, key_type_attr );   template_update_attribute( tmpl, class_attr );   template_update_attribute( tmpl, local_attr );//   return CKR_OK;done:   return rc;}#if !(NOCDMF)////CK_RVckm_cdmf_key_gen( TEMPLATE *tmpl ){   CK_ATTRIBUTE     * value_attr    = NULL;   CK_ATTRIBUTE     * key_type_attr = NULL;   CK_ATTRIBUTE     * class_attr    = NULL;   CK_ATTRIBUTE     * local_attr    = NULL;   CK_BYTE            cdmf_key[DES_KEY_SIZE];   CK_ULONG           repl_len, expected_repl_len;   CK_ULONG           rc;   repl_len = expected_repl_len = DES_KEY_SIZE;   rc = communicate( PK_CDMF_KEYGEN,                     NULL,       0,                     cdmf_key,  &repl_len,                     NULL,       0,                     NULL,       0 );   if (rc == CKR_OK) {      if (repl_len != expected_repl_len)         return CKR_GENERAL_ERROR;   }   value_attr    = (CK_ATTRIBUTE *)malloc(sizeof(CK_ATTRIBUTE) + DES_KEY_SIZE );   key_type_attr = (CK_ATTRIBUTE *)malloc(sizeof(CK_ATTRIBUTE) + sizeof(CK_KEY_TYPE) );   class_attr    = (CK_ATTRIBUTE *)malloc(sizeof(CK_ATTRIBUTE) + sizeof(CK_OBJECT_CLASS) );   local_attr    = (CK_ATTRIBUTE *)malloc(sizeof(CK_ATTRIBUTE) + sizeof(CK_BBOOL) );   if (!value_attr || !key_type_attr || !class_attr || !local_attr) {      if (value_attr)    free( value_attr );      if (key_type_attr) free( key_type_attr );      if (class_attr)    free( class_attr );      if (local_attr)    free( local_attr );      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   value_attr->type         = CKA_VALUE;   value_attr->ulValueLen   = DES_KEY_SIZE;   value_attr->pValue       = (CK_BYTE *)value_attr + sizeof(CK_ATTRIBUTE);   memcpy( value_attr->pValue, cdmf_key, DES_KEY_SIZE );   key_type_attr->type         = CKA_KEY_TYPE;   key_type_attr->ulValueLen   = sizeof(CK_KEY_TYPE);   key_type_attr->pValue       = (CK_BYTE *)key_type_attr + sizeof(CK_ATTRIBUTE);   *(CK_KEY_TYPE *)key_type_attr->pValue = CKK_CDMF;   class_attr->type         = CKA_CLASS;   class_attr->ulValueLen   = sizeof(CK_OBJECT_CLASS);   class_attr->pValue       = (CK_BYTE *)class_attr + sizeof(CK_ATTRIBUTE);   *(CK_OBJECT_CLASS *)class_attr->pValue = CKO_SECRET_KEY;   local_attr->type         = CKA_LOCAL;   local_attr->ulValueLen   = sizeof(CK_BBOOL);   local_attr->pValue       = (CK_BYTE *)local_attr + sizeof(CK_ATTRIBUTE);   *(CK_BBOOL *)local_attr->pValue = TRUE;   template_update_attribute( tmpl, value_attr );   template_update_attribute( tmpl, key_type_attr );   template_update_attribute( tmpl, class_attr );   template_update_attribute( tmpl, local_attr );   return CKR_OK;}#endif////CK_RVckm_des_ecb_encrypt( CK_BYTE   * in_data,                     CK_ULONG    in_data_len,                     CK_BYTE   * out_data,                     CK_ULONG  * out_data_len,                     CK_BYTE   * key_value ){   CK_ULONG       req_len, repl_len, expected_repl_len;   CK_ULONG       rc;   if (!in_data || !out_data || !key_value){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   if (*out_data_len < in_data_len){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   rc = token_specific.t_des_ecb(in_data,in_data_len,out_data,out_data_len,key_value,1);//  token specifics return CKR_ errors ...    if (rc != CKR_OK)      st_err_log(117, __FILE__, __LINE__);   return rc;}////CK_RVckm_des_ecb_decrypt( CK_BYTE   * in_data,                     CK_ULONG    in_data_len,                     CK_BYTE   * out_data,                     CK_ULONG  * out_data_len,                     CK_BYTE   * key_value ){   CK_ULONG         req_len, repl_len, expected_repl_len;   CK_ULONG         rc;   if (!in_data || !out_data || !key_value){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   if (*out_data_len < in_data_len){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   rc = token_specific.t_des_ecb(in_data,in_data_len,out_data,         out_data_len,key_value,0);  // last parm is the encrypt flag   if (rc != CKR_OK)      st_err_log(117, __FILE__, __LINE__);   return rc;}////CK_RVckm_des_cbc_encrypt( CK_BYTE   * in_data,                     CK_ULONG    in_data_len,                     CK_BYTE   * out_data,                     CK_ULONG  * out_data_len,                     CK_BYTE   * init_v,                     CK_BYTE   * key_value ){   CK_ULONG         req_len, repl_len, expected_repl_len;   CK_ULONG         rc;   if (!in_data || !out_data || !init_v || !key_value){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   if (*out_data_len < in_data_len){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   rc = token_specific.t_des_cbc(in_data,in_data_len,out_data,         out_data_len,key_value,init_v,1);  // last parm is the encrypt flag   if (rc != CKR_OK)      st_err_log(118, __FILE__, __LINE__);   return rc;}////CK_RVckm_des_cbc_decrypt( CK_BYTE   * in_data,                     CK_ULONG    in_data_len,                     CK_BYTE   * out_data,                     CK_ULONG  * out_data_len,                     CK_BYTE   * init_v,                     CK_BYTE   * key_value ){   CK_ULONG         req_len, repl_len, expected_repl_len;   CK_ULONG         rc;   if (!in_data || !out_data || !init_v || !key_value){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   if (*out_data_len < in_data_len){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   rc = token_specific.t_des_cbc(in_data,in_data_len,out_data,         out_data_len,key_value,init_v,0);  // last parm is the encrypt flag   if (rc != CKR_OK)      st_err_log(118, __FILE__, __LINE__);   return rc;}// we're preparing to wrap a key using DES.  need to make sure the// data length is a integral multiple of the DES block size.//// PKCS #11 specifies that the padding shall be in the form of NULL// bytes appended to the data//// this routine works with either DES and 3DES as the wrapping mechanism//CK_RVckm_des_wrap_format( CK_BBOOL    length_only,                     CK_BYTE  ** data,                     CK_ULONG  * data_len ){   CK_BYTE   * ptr = NULL;   CK_ULONG    len1, len2;   len1 = *data_len;   // if the input key data isn't a multiple of the blocksize,   // we pad with NULLs to the next blocksize multiple.   //   if (len1 % DES_BLOCK_SIZE != 0) {      len2 = DES_BLOCK_SIZE * ((len1 / DES_BLOCK_SIZE) + 1);      if (length_only == FALSE) {         ptr = (CK_BYTE *)realloc(*data, len2);         if (!ptr){            st_err_log(0, __FILE__, __LINE__);            return CKR_HOST_MEMORY;         }         else            memset( ptr + len1, 0x0, (len2 - len1) );         *data     = ptr;         *data_len = len2;      }   }   return CKR_OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -