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

📄 dh_func.c

📁 IBM的Linux上的PKCS#11实现
💻 C
📖 第 1 页 / 共 2 页
字号:
 *//*************************************************************************                                                                       **      Copyright:       Corrent Corporation (c) 2000-2003               **                                                                       **      Filename:        dh_func.c                                       **      Created By:      Kapil Sood                                      **      Created On:      April 28, 2003                                  **      Description:     This is the file for testing Diffie-Hellman     **                       key pair generation and shared key derivation   **                       operations.                                     **                                                                       *************************************************************************/// File: dh_func.c//#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <memory.h>#include "pkcs11types.h"#include "regress.h"// These values were obtained from IPsec second oakley group. These values are in big-endian// format.  These are required for generating DH keys and secrets. CK_BYTE DH_PUBL_PRIME[128] ={   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2,   0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67,   0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E,   0x34, 0x04, 0xDD, 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D,   0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, 0xE4, 0x85, 0xB5,   0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF,   0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE,   0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE6, 0x53, 0x81,   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} ; CK_BYTE DH_PUBL_BASE[128] ={   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, 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, 0x00, 0x02 };////int do_GenerateDHKeyPair( void ){   CK_SLOT_ID          slot_id;   CK_SESSION_HANDLE   session;   CK_MECHANISM        mech;   CK_OBJECT_HANDLE    publ_key, priv_key;   CK_FLAGS            flags;   CK_BYTE             user_pin[8];   CK_ULONG            user_pin_len;   CK_RV               rc;   CK_OBJECT_CLASS     pub_key_class  = CKO_PUBLIC_KEY ;   CK_KEY_TYPE         pub_key_type   = CKK_DH ;   CK_OBJECT_CLASS     priv_key_class = CKO_PRIVATE_KEY ;   CK_KEY_TYPE         priv_key_type   = CKK_DH ;   CK_BYTE             pub_value[128] ;   CK_BYTE             priv_value[128] ;   CK_BBOOL            true = TRUE ;   CK_ATTRIBUTE  publ_tmpl[] =   {      {CKA_CLASS,    &pub_key_class,   sizeof(pub_key_class)    },      {CKA_KEY_TYPE, &pub_key_type,    sizeof(pub_key_type)     },      {CKA_MODIFIABLE, &true,          sizeof(true)             },      {CKA_PRIME,    DH_PUBL_PRIME,    sizeof(DSA_PUBL_PRIME)   },      {CKA_BASE,     DH_PUBL_BASE,     sizeof(DSA_PUBL_BASE)    }   };   CK_ATTRIBUTE  priv_tmpl[] =   {      {CKA_CLASS,    &priv_key_class,   sizeof(priv_key_class)    },      {CKA_KEY_TYPE, &priv_key_type,    sizeof(priv_key_type)     },      {CKA_MODIFIABLE, &true,          sizeof(true)             }   };   slot_id = SLOT_ID;   memcpy( user_pin, "12345678", 8 );   user_pin_len = 8;   mech.mechanism      = CKM_DH_PKCS_KEY_PAIR_GEN;   mech.ulParameterLen = 0;   mech.pParameter     = NULL;   flags = CKF_SERIAL_SESSION;   rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &session );   if (rc != CKR_OK) {      show_error("   C_OpenSession #3", rc );      return FALSE;   }   rc = funcs->C_Login( session, CKU_USER, user_pin, user_pin_len );   if (rc != CKR_OK) {      show_error("   C_Login #1", rc );      return FALSE;   }   printf("do_GenerateDHKeyPair...\n");   rc = funcs->C_GenerateKeyPair( session,   &mech,                                  publ_tmpl,  5,                                  priv_tmpl,  3,                                  &publ_key, &priv_key );   if (rc != CKR_OK) {      show_error("   C_GenerateKeyPair #1", rc );      return FALSE;   }   rc = funcs->C_CloseSession( session );   if (rc != CKR_OK) {      show_error("   C_CloseSession #3", rc );      return FALSE;   }   printf("Looks okay...\n");   return TRUE;}int do_DeriveDHKey( void ){   CK_SLOT_ID          slot_id;   CK_SESSION_HANDLE   session;   CK_MECHANISM        mech;   CK_OBJECT_HANDLE    publ_key, priv_key, secret_key;   CK_FLAGS            flags;   CK_BYTE             user_pin[8];   CK_ULONG            user_pin_len;   CK_RV               rc;   CK_OBJECT_CLASS     pub_key_class  = CKO_PUBLIC_KEY ;   CK_KEY_TYPE         pub_key_type   = CKK_DH ;   CK_OBJECT_CLASS     priv_key_class = CKO_PRIVATE_KEY ;   CK_KEY_TYPE         priv_key_type   = CKK_DH ;   CK_BYTE             pub_value[128] ;   CK_BYTE             peer_pub_value[128];   CK_ULONG            count ;   CK_BYTE             priv_value[128] ;   CK_BBOOL            true = TRUE ;   CK_ULONG            cka_value_bits = 180 ;      CK_OBJECT_CLASS     secret_key_class  = CKO_SECRET_KEY ;   CK_KEY_TYPE         secret_key_type   = CKK_GENERIC_SECRET ;   CK_BYTE             secret_key_value[128] ;   CK_ULONG            secret_key_value_len = 128 ;   CK_ATTRIBUTE  publ_tmpl[] =   {      {CKA_CLASS,    &pub_key_class,   sizeof(pub_key_class)    },      {CKA_KEY_TYPE, &pub_key_type,    sizeof(pub_key_type)     },      {CKA_MODIFIABLE, &true,          sizeof(true)             },      {CKA_PRIME,    DH_PUBL_PRIME,    sizeof(DSA_PUBL_PRIME)   },      {CKA_BASE,     DH_PUBL_BASE,     sizeof(DSA_PUBL_BASE)    }   };   CK_ATTRIBUTE  priv_tmpl[] =   {      {CKA_CLASS,    &priv_key_class,   sizeof(priv_key_class)    },      {CKA_KEY_TYPE, &priv_key_type,    sizeof(priv_key_type)     },      {CKA_MODIFIABLE, &true,          sizeof(true)             },      {CKA_VALUE_BITS, &cka_value_bits, sizeof(cka_value_bits) }                                                      };   CK_ATTRIBUTE  secret_tmpl[] =   {      {CKA_CLASS,    &secret_key_class,   sizeof(secret_key_class) },      {CKA_KEY_TYPE, &secret_key_type,    sizeof(secret_key_type)  },      {CKA_VALUE_LEN, &secret_key_value_len, sizeof(secret_key_value_len) }   };   printf("do_DeriveDHKey...\n");   slot_id = SLOT_ID;   memcpy( user_pin, "12345678", 8 );   user_pin_len = 8;   flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;   rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &session );   if (rc != CKR_OK) {      show_error("   C_OpenSession #3", rc );      return FALSE;   }   rc = funcs->C_Login( session, CKU_USER, user_pin, user_pin_len );   if (rc != CKR_OK) {      show_error("   C_Login #1", rc );      return FALSE;   }   // First, generate the DH key Pair   mech.mechanism      = CKM_DH_PKCS_KEY_PAIR_GEN;   mech.ulParameterLen = 0;   mech.pParameter     = NULL;   rc = funcs->C_GenerateKeyPair( session,   &mech,                                  publ_tmpl,  5,                                  priv_tmpl,  4,                                  &publ_key, &priv_key );   if (rc != CKR_OK) {      show_error("   C_GenerateKeyPair #1", rc );      return FALSE;   }   // Now, Use the key pair derived above to derive the DH key   // Fill in dummy value for peer's public key   for (count=0; count<128; count++)       peer_pub_value[count] = 0x22 ;   mech.mechanism      = CKM_DH_PKCS_DERIVE;   mech.pParameter     = peer_pub_value ;   mech.ulParameterLen = sizeof(peer_pub_value);   rc = funcs->C_DeriveKey( session, &mech,                            priv_key, secret_tmpl,                            3, &secret_key ) ;   if (rc != CKR_OK) {printf("DeriveKey Failed\n") ;      show_error("   C_DeriveKey #1", rc );      return FALSE;   }   rc = funcs->C_CloseSession( session );   if (rc != CKR_OK) {      show_error("   C_CloseSession #3", rc );      return FALSE;   }   printf("Looks okay...\n");   return TRUE;} /* end do_DeriveDHKey() */int dh_functions(){   SYSTEMTIME t1, t2;   int        rc;   GetSystemTime(&t1);   rc = do_GenerateDHKeyPair();   if (!rc)      return FALSE;   GetSystemTime(&t2);   process_time( t1, t2 );   GetSystemTime(&t1);   rc = do_DeriveDHKey();   if (!rc)      return FALSE;   GetSystemTime(&t2);   process_time( t1, t2 );   return TRUE;}

⌨️ 快捷键说明

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