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

📄 mech_rsa.c

📁 IBM的Linux上的PKCS#11实现
💻 C
📖 第 1 页 / 共 4 页
字号:
   if (length_only == TRUE) {      *out_data_len = modulus_bytes;      return CKR_OK;   }   if (*out_data_len < modulus_bytes) {      *out_data_len = modulus_bytes;      st_err_log(111, __FILE__, __LINE__);      return CKR_BUFFER_TOO_SMALL;   }   rc = rsa_format_block( in_data, in_data_len, clear, modulus_bytes, PKCS_BT_2 );   if (rc != CKR_OK){      st_err_log(131, __FILE__, __LINE__);      return rc;   }   rc = ckm_rsa_encrypt( clear, modulus_bytes, cipher, key_obj );   if (rc == CKR_OK) {      memcpy( out_data, cipher, modulus_bytes );      *out_data_len = modulus_bytes;   }   else      st_err_log(132, __FILE__, __LINE__);   return rc;}////CK_RVrsa_pkcs_decrypt( SESSION           *sess,                  CK_BBOOL           length_only,                  ENCR_DECR_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_ATTRIBUTE    *attr     = NULL;   CK_BYTE          out[256];  // 2048 bits   CK_ULONG         i, modulus_bytes;   CK_BBOOL         flag;   CK_RV            rc;   rc = object_mgr_find_in_map1( ctx->key, &key_obj );   if (rc != CKR_OK){      st_err_log(110, __FILE__, __LINE__);      return rc;   }   modulus_bytes = rsa_get_key_len(key_obj);   // check input data length restrictions   //   if (in_data_len != modulus_bytes){      st_err_log(112, __FILE__, __LINE__);      return CKR_ENCRYPTED_DATA_LEN_RANGE;   }   if (length_only == TRUE) {      // this is not exact but it's the upper bound; otherwise we'll need      // to do the RSA operation just to get the required length      //      *out_data_len = modulus_bytes - 11;      return CKR_OK;   }   rc = ckm_rsa_decrypt( in_data, modulus_bytes, out, key_obj );   if (rc == CKR_OK) {      CK_ULONG len;      // strip off the PKCS block formatting data      //      // 00 | BT | PADDING | 00 | DATA      //      for (i=2; i < in_data_len; i++) {         if (out[i] == 0x0) {            i++;  // point i at the first data byte            break;         }      }      if (i == in_data_len){         st_err_log(14, __FILE__, __LINE__);         return CKR_ENCRYPTED_DATA_INVALID;      }      len = in_data_len - i;      if (len > *out_data_len) {         *out_data_len = len;         st_err_log(111, __FILE__, __LINE__);         return CKR_BUFFER_TOO_SMALL;      }      memcpy( out_data, &out[i], len );      *out_data_len = len;   }   else       st_err_log(133, __FILE__, __LINE__);   if (rc == CKR_DATA_LEN_RANGE){      st_err_log(109, __FILE__, __LINE__);      return CKR_ENCRYPTED_DATA_LEN_RANGE;   }   return rc;}////CK_RVrsa_pkcs_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 ){   OBJECT          *key_obj   = NULL;   CK_ATTRIBUTE    *attr      = NULL;   CK_BYTE          data[256], sig[256];  // max size: 256 bytes == 2048 bits   CK_ULONG         modulus_bytes;   CK_BBOOL         flag;   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_obj );   if (rc != CKR_OK){      st_err_log(110, __FILE__, __LINE__);      return rc;   }   modulus_bytes = rsa_get_key_len(key_obj);   // check input data length restrictions   //   if (in_data_len > (modulus_bytes - 11)){      st_err_log(109, __FILE__, __LINE__);      return CKR_DATA_LEN_RANGE;   }   if (length_only == TRUE) {      *out_data_len = modulus_bytes;      return CKR_OK;   }   if (*out_data_len < modulus_bytes) {      *out_data_len = modulus_bytes;      st_err_log(111, __FILE__, __LINE__);      return CKR_BUFFER_TOO_SMALL;   }   rc = rsa_format_block( in_data, in_data_len, data, modulus_bytes, PKCS_BT_1 );   if (rc != CKR_OK){      st_err_log(131, __FILE__, __LINE__);      return rc;   }   // signing is a private key operation --> decrypt   //   rc = ckm_rsa_decrypt( data, modulus_bytes, sig, key_obj );   if (rc == CKR_OK) {      memcpy( out_data, sig, modulus_bytes );      *out_data_len = modulus_bytes;   }   else      st_err_log(133, __FILE__, __LINE__);   return rc;}////CK_RVrsa_pkcs_verify( SESSION             * sess,                 SIGN_VERIFY_CONTEXT * ctx,                 CK_BYTE             * in_data,                 CK_ULONG              in_data_len,                 CK_BYTE             * signature,                 CK_ULONG              sig_len ){   OBJECT          *key_obj  = NULL;   CK_ATTRIBUTE    *attr     = NULL;   CK_BYTE          out[256];  // 2048 bits   CK_ULONG         i, modulus_bytes;   CK_BBOOL         flag;   CK_RV            rc;   rc = object_mgr_find_in_map1( ctx->key, &key_obj );   if (rc != CKR_OK){      st_err_log(110, __FILE__, __LINE__);      return rc;   }   flag = template_attribute_find( key_obj->template, CKA_MODULUS, &attr );   if (flag == FALSE){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   else      modulus_bytes = attr->ulValueLen;   // check input data length restrictions   //   if (sig_len != modulus_bytes){      st_err_log(46, __FILE__, __LINE__);      return CKR_SIGNATURE_LEN_RANGE;   }   // verifying is a public key operation --> encrypt   //   rc = ckm_rsa_encrypt( signature, modulus_bytes, out, key_obj );   if (rc == CKR_OK) {      CK_ULONG len;      // skip past the PKCS block formatting data      //      // 00 | BT | PADDING | 00 | DATA      //      for (i=2; i < modulus_bytes; i++) {         if (out[i] == 0x0) {            i++;  // point i at the first data byte            break;         }      }      len = modulus_bytes - i;      if (len != in_data_len){         st_err_log(47, __FILE__, __LINE__);         return CKR_SIGNATURE_INVALID;      }      if (memcmp(in_data, &out[i], len) != 0){         st_err_log(47, __FILE__, __LINE__);         return CKR_SIGNATURE_INVALID;      }      return CKR_OK;   }   else      st_err_log(132, __FILE__, __LINE__);   return rc;}////CK_RVrsa_pkcs_verify_recover( SESSION             * sess,                         CK_BBOOL              length_only,                         SIGN_VERIFY_CONTEXT * ctx,                         CK_BYTE             * signature,                         CK_ULONG              sig_len,                         CK_BYTE             * out_data,                         CK_ULONG            * out_data_len ){   OBJECT          *key_obj  = NULL;   CK_ATTRIBUTE    *attr     = NULL;   CK_BYTE          out[256];  // 2048 bits   CK_ULONG         i, modulus_bytes;   CK_BBOOL         flag;   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_obj );   if (rc != CKR_OK){      st_err_log(110, __FILE__, __LINE__);      return rc;   }   flag = template_attribute_find( key_obj->template, CKA_MODULUS, &attr );   if (flag == FALSE){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   else      modulus_bytes = attr->ulValueLen;   // check input data length restrictions   //   if (sig_len != modulus_bytes){      st_err_log(46, __FILE__, __LINE__);      return CKR_SIGNATURE_LEN_RANGE;   }   if (length_only == TRUE) {      *out_data_len = modulus_bytes - 11;      return CKR_OK;   }   // verify is a public key operation --> encrypt   //   rc = ckm_rsa_encrypt( signature, modulus_bytes, out, key_obj );   if (rc == CKR_OK) {      CK_ULONG len;      // skip past the PKCS block formatting data      //      // 00 | BT | PADDING | 00 | DATA      //      for (i=2; i < modulus_bytes; i++) {         if (out[i] == 0x0) {            i++;  // point i at the first data byte            break;         }      }      len = modulus_bytes - i;      if (*out_data_len < len) {         *out_data_len = len;         st_err_log(111, __FILE__, __LINE__);         return CKR_BUFFER_TOO_SMALL;      }      memcpy( out_data, &out[i], len );      *out_data_len = len;      return CKR_OK;   }   else      st_err_log(132, __FILE__, __LINE__);   return rc;}////CK_RVrsa_x509_encrypt( SESSION           *sess,                  CK_BBOOL           length_only,                  ENCR_DECR_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_ATTRIBUTE    *attr     = NULL;   CK_BYTE          clear[256], cipher[256];  // max size: 256 bytes == 2048 bits   CK_ULONG         modulus_bytes;   CK_BBOOL         flag;   CK_RV            rc;   rc = object_mgr_find_in_map1( ctx->key, &key_obj );   if (rc != CKR_OK){      st_err_log(110, __FILE__, __LINE__);      return rc;   }   flag = template_attribute_find( key_obj->template, CKA_MODULUS, &attr );   if (flag == FALSE){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   else      modulus_bytes = attr->ulValueLen;   // CKM_RSA_X_509 requires input data length to be no bigger than the modulus   //   if (in_data_len > modulus_bytes){      st_err_log(109, __FILE__, __LINE__);      return CKR_DATA_LEN_RANGE;   }   if (length_only == TRUE) {      *out_data_len = modulus_bytes;      return CKR_OK;   }   if (*out_data_len < modulus_bytes) {      *out_data_len = modulus_bytes;      st_err_log(111, __FILE__, __LINE__);      return CKR_BUFFER_TOO_SMALL;   }   // prepad with zeros   //   memset( clear, 0x0, modulus_bytes - in_data_len);   memcpy( &clear[modulus_bytes - in_data_len], in_data, in_data_len );   rc = ckm_rsa_encrypt( clear, modulus_bytes, cipher, key_obj );   if (rc == CKR_OK) {      memcpy( out_data, cipher, modulus_bytes );      *out_data_len = modulus_bytes;   }   else      st_err_log(132, __FILE__, __LINE__);   return rc;}////CK_RVrsa_x509_decrypt( SESSION           *sess,                  CK_BBOOL           length_only,                  ENCR_DECR_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_ATTRIBUTE    *attr     = NULL;   CK_BYTE          out[256];  // 2048 bits   CK_ULONG         modulus_bytes;   CK_BBOOL         flag;   CK_RV            rc;   rc = object_mgr_find_in_map1( ctx->key, &key_obj );   if (rc != CKR_OK){      st_err_log(110, __FILE__, __LINE__);      return rc;   }#if 0   flag = template_attribute_find( key_obj->template, CKA_MODULUS, &attr );   if (flag == FALSE)      return CKR_FUNCTION_FAILED;   else      modulus_bytes = attr->ulValueLen;#else   modulus_bytes = rsa_get_key_len(key_obj);#endif   // check input data length restrictions   //   if (in_data_len != modulus_bytes){      st_err_log(112, __FILE__, __LINE__);      return CKR_ENCRYPTED_DATA_LEN_RANGE;   }   if (length_only == TRUE) {      *out_data_len = modulus_bytes;      return CKR_OK;   }

⌨️ 快捷键说明

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