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

📄 mech_md5.c

📁 IBM的Linux上的PKCS#11实现
💻 C
📖 第 1 页 / 共 4 页
字号:
             estoppel or otherwise. All rights in the Program not             expressly granted under this Agreement are reserved.             This Agreement is governed by the laws of the State of New             York and the intellectual property laws of the United             States of America. No party to this Agreement will bring a             legal action under this Agreement more than one year after             the cause of action arose. Each party waives its rights to             a jury trial in any resulting litigation. *//* (C) COPYRIGHT International Business Machines Corp. 2001,2002          *///#include <windows.h>#include <pthread.h>#include <string.h>            // for memcmp() et al#include <stdlib.h>#include "pkcs11types.h"#include "pkcs32.h"#include "defs.h"#include "host_defs.h"#include "h_extern.h"#include "tok_spec_struct.h"//#include "args.h"// forward declaration//void ckm_md5_transform ();static CK_BYTE PADDING[64] = {  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};////CK_RVmd5_hash( SESSION         * sess,          CK_BBOOL          length_only,          DIGEST_CONTEXT  * ctx,          CK_BYTE         * in_data,          CK_ULONG          in_data_len,          CK_BYTE         * out_data,          CK_ULONG        * out_data_len ){   CK_RV     rc;   if (!sess || !ctx || !out_data_len){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   if (length_only == TRUE) {      *out_data_len = MD5_HASH_SIZE;      return CKR_OK;   }   rc = md5_hash_update( sess, ctx, in_data, in_data_len );   if (rc != CKR_OK){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   return md5_hash_final( sess,      FALSE,                          ctx,                          out_data,  out_data_len );}////CK_RVmd5_hash_update( SESSION         * sess,                 DIGEST_CONTEXT  * ctx,                 CK_BYTE         * in_data,                 CK_ULONG          in_data_len ){   if (!sess || !ctx || !in_data){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   return ckm_md5_update( (MD5_CONTEXT *)ctx->context,                          in_data, in_data_len );}////CK_RVmd5_hash_final( SESSION         * sess,                CK_BYTE           length_only,                DIGEST_CONTEXT  * ctx,                CK_BYTE         * out_data,                CK_ULONG        * out_data_len ){   CK_RV      rc;   if (!sess || !ctx || !out_data_len){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   if (length_only == TRUE) {      *out_data_len = MD5_HASH_SIZE;      return CKR_OK;   }   rc = ckm_md5_final( (MD5_CONTEXT *)ctx->context,                       out_data, MD5_HASH_SIZE );   if (rc == CKR_OK) {      *out_data_len = MD5_HASH_SIZE;      return rc;   }   return rc;}// this routine gets called for two mechanisms actually://    CKM_MD5_HMAC//    CKM_MD5_HMAC_GENERAL//CK_RVmd5_hmac_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           hash[MD5_HASH_SIZE];   DIGEST_CONTEXT    digest_ctx;   CK_MECHANISM      digest_mech;   CK_BYTE           k_ipad[MD5_BLOCK_SIZE];   CK_BYTE           k_opad[MD5_BLOCK_SIZE];   CK_ULONG          key_bytes, hash_len, hmac_len;   CK_ULONG          i;   CK_RV             rc;   if (!sess || !ctx || !out_data_len){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   if (ctx->mech.mechanism == CKM_MD5_HMAC_GENERAL) {      hmac_len = *(CK_ULONG *)ctx->mech.pParameter;      if (hmac_len == 0) {         *out_data_len = 0;         return CKR_OK;      }   }   else      hmac_len = MD5_HASH_SIZE;   if (length_only == TRUE) {      *out_data_len = hmac_len;      return CKR_OK;   }   memset( &digest_ctx, 0x0, sizeof(DIGEST_CONTEXT) );   rc = object_mgr_find_in_map1( ctx->key, &key_obj );   if (rc != CKR_OK)      return rc;   rc = template_attribute_find( key_obj->template, CKA_VALUE, &attr );   if (rc == FALSE){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   else      key_bytes = attr->ulValueLen;   // build (K XOR ipad), (K XOR opad)   //   if (key_bytes > MD5_BLOCK_SIZE) {      digest_mech.mechanism      = CKM_MD5;      digest_mech.ulParameterLen = 0;      digest_mech.pParameter     = NULL;      rc = digest_mgr_init( sess, &digest_ctx, &digest_mech );      if (rc != CKR_OK)      {         digest_mgr_cleanup( &digest_ctx );         return rc;      }      hash_len = sizeof(hash);      rc = digest_mgr_digest( sess, FALSE, &digest_ctx,                              attr->pValue, attr->ulValueLen,                              hash,  &hash_len );      if (rc != CKR_OK) {         digest_mgr_cleanup( &digest_ctx );         return rc;      }      digest_mgr_cleanup( &digest_ctx );      memset( &digest_ctx, 0x0, sizeof(DIGEST_CONTEXT) );      for (i=0; i < hash_len; i++) {         k_ipad[i] = hash[i] ^ 0x36;         k_opad[i] = hash[i] ^ 0x5C;      }      memset( &k_ipad[i], 0x36, MD5_BLOCK_SIZE - i);      memset( &k_opad[i], 0x5C, MD5_BLOCK_SIZE - i);   }   else {      CK_BYTE *key = attr->pValue;      for (i=0; i < key_bytes; i++) {         k_ipad[i] = key[i] ^ 0x36;         k_opad[i] = key[i] ^ 0x5C;      }      memset( &k_ipad[i], 0x36, MD5_BLOCK_SIZE - key_bytes );      memset( &k_opad[i], 0x5C, MD5_BLOCK_SIZE - key_bytes );   }   digest_mech.mechanism      = CKM_MD5;   digest_mech.ulParameterLen = 0;   digest_mech.pParameter     = NULL;   // inner hash   //   rc = digest_mgr_init( sess, &digest_ctx, &digest_mech );   if (rc != CKR_OK)   {      st_err_log(123, __FILE__, __LINE__);      digest_mgr_cleanup( &digest_ctx );      return rc;   }   rc = digest_mgr_digest_update( sess, &digest_ctx, k_ipad, MD5_BLOCK_SIZE );   if (rc != CKR_OK)   {      st_err_log(123, __FILE__, __LINE__);      digest_mgr_cleanup( &digest_ctx );      return rc;   }   rc = digest_mgr_digest_update( sess, &digest_ctx, in_data, in_data_len );   if (rc != CKR_OK)   {      st_err_log(123, __FILE__, __LINE__);      digest_mgr_cleanup( &digest_ctx );      return rc;   }   hash_len = sizeof(hash);

⌨️ 快捷键说明

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