📄 rsa_func.c
字号:
// File: rsa_func.c//#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <memory.h>#include "pkcs11types.h"#include "regress.h"void hex_dump_to_file(char *str, unsigned char *data, int bytes){ FILE *fp; fp = fopen("rsadump.h", "a"); fprintf(fp, "\nunsigned char %s[] =\n {", str); while (bytes--) { fprintf(fp, " 0x%x", *data++); if (bytes) { fprintf(fp, ","); if (!(bytes % 8)) fprintf(fp, "\n "); } } fprintf(fp, " };\n"); fclose(fp);}////int do_GenerateRSAKeyPair( 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; printf("do_GenerateRSAKey...\n"); slot_id = SLOT_ID; memcpy( user_pin, "12345678", 8 ); user_pin_len = 8; mech.mechanism = CKM_RSA_PKCS_KEY_PAIR_GEN; mech.ulParameterLen = 0; mech.pParameter = NULL; { CK_ULONG bits = 1024; CK_BYTE pub_exp[] = { 0x3 }; CK_ATTRIBUTE pub_tmpl[] = { {CKA_MODULUS_BITS, &bits, sizeof(bits) }, {CKA_PUBLIC_EXPONENT, &pub_exp, sizeof(pub_exp) } }; 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; } rc = funcs->C_GenerateKeyPair( session, &mech, pub_tmpl, 2, NULL, 0, &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_EncryptRSA_PKCS( void ){ CK_BYTE data1[100]; CK_BYTE data2[256]; CK_BYTE cipher[256]; 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_ULONG i; CK_ULONG len1, len2, cipherlen; CK_RV rc; CK_ULONG bits = 1024; CK_BYTE pub_exp[] = { 0x3 }; CK_ATTRIBUTE pub_tmpl[] = { {CKA_MODULUS_BITS, &bits, sizeof(bits) }, {CKA_PUBLIC_EXPONENT, &pub_exp, sizeof(pub_exp) } }; printf("do_EncryptRSA_PKCS...\n"); slot_id = SLOT_ID; 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 #1", rc ); return FALSE; } memcpy( user_pin, "12345678", 8 ); user_pin_len = 8; rc = funcs->C_Login( session, CKU_USER, user_pin, user_pin_len ); if (rc != CKR_OK) { show_error(" C_Login #1", rc ); return FALSE; } mech.mechanism = CKM_RSA_PKCS_KEY_PAIR_GEN; mech.ulParameterLen = 0; mech.pParameter = NULL; rc = funcs->C_GenerateKeyPair( session, &mech, pub_tmpl, 2, NULL, 0, &publ_key, &priv_key ); if (rc != CKR_OK) { show_error(" C_GenerateKeyPair #1", rc ); return FALSE; } // now, encrypt some data // len1 = sizeof(data1); len2 = sizeof(data2); cipherlen = sizeof(cipher); for (i=0; i < len1; i++) data1[i] = i % 255; mech.mechanism = CKM_RSA_PKCS; mech.ulParameterLen = 0; mech.pParameter = NULL; rc = funcs->C_EncryptInit( session, &mech, publ_key ); if (rc != CKR_OK) { show_error(" C_EncryptInit #1", rc ); return FALSE; } rc = funcs->C_Encrypt( session, data1, len1, cipher, &cipherlen ); if (rc != CKR_OK) { show_error(" C_Encrypt #1", rc ); return FALSE; } printf("Cipyer len %d \n",cipherlen); // now, decrypt the data // rc = funcs->C_DecryptInit( session, &mech, priv_key ); if (rc != CKR_OK) { show_error(" C_DecryptInit #1", rc ); return FALSE; } rc = funcs->C_Decrypt( session, cipher, cipherlen, data2, &len2 ); if (rc != CKR_OK) { show_error(" C_Decrypt #1", rc ); return FALSE; } printf("Len from encrypt %d from decrypt %d \n",len1, len2); //if (len1 != len2) { // printf(" ERROR: lengths don't match\n"); // return FALSE; // } for (i=0; i <len1; i++) { if (data1[i] != data2[i]) { printf(" ERROR: mismatch at byte %d\n", i ); return FALSE; } } rc = funcs->C_CloseAllSessions( slot_id ); if (rc != CKR_OK) { show_error(" C_CloseAllSessions #1", rc ); return FALSE; } printf("Looks okay...\n"); return TRUE;}////int do_EncryptRSA_PKCS_Speed( void ){ CK_BYTE data1[100]; CK_BYTE data2[256]; CK_BYTE cipher[256]; 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_ULONG i; CK_ULONG len1, len2, cipherlen; CK_RV rc; SYSTEMTIME t1, t2; CK_ULONG bits = 1024; CK_BYTE pub_exp[] = { 0x3 }; CK_ATTRIBUTE pub_tmpl[] = { {CKA_MODULUS_BITS, &bits, sizeof(bits) }, {CKA_PUBLIC_EXPONENT, &pub_exp, sizeof(pub_exp) } }; printf("do_EncryptRSA_PKCS_Speed...\n"); slot_id = SLOT_ID; 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 #1", rc ); return FALSE; } memcpy( user_pin, "12345678", 8 ); user_pin_len = 8; rc = funcs->C_Login( session, CKU_USER, user_pin, user_pin_len ); if (rc != CKR_OK) { show_error(" C_Login #1", rc ); return FALSE; } mech.mechanism = CKM_RSA_PKCS_KEY_PAIR_GEN; mech.ulParameterLen = 0; mech.pParameter = NULL; rc = funcs->C_GenerateKeyPair( session, &mech, pub_tmpl, 2, NULL, 0, &publ_key, &priv_key ); if (rc != CKR_OK) { show_error(" C_GenerateKeyPair #1", rc ); return FALSE; } // now, encrypt some data // len1 = sizeof(data1); len2 = sizeof(data2); cipherlen = sizeof(cipher); for (i=0; i < len1; i++) data1[i] = i % 255; mech.mechanism = CKM_RSA_PKCS; mech.ulParameterLen = 0; mech.pParameter = NULL; printf("Doing 300 encryptions...\n"); GetSystemTime(&t1);#define NUM 300 for (i=0; i < NUM; i++) { cipherlen = sizeof(cipher); rc = funcs->C_EncryptInit( session, &mech, publ_key ); if (rc != CKR_OK) { show_error(" C_EncryptInit #1", rc ); return FALSE; } rc = funcs->C_Encrypt( session, data1, len1, cipher, &cipherlen ); if (rc != CKR_OK) { show_error(" C_Encrypt #1", rc ); return FALSE; } } GetSystemTime(&t2); process_time( t1, t2 ); printf("Doing 300 decryptions...\n"); GetSystemTime(&t1); for (i=0; i < NUM; i++) { len2 = 256; rc = funcs->C_DecryptInit( session, &mech, priv_key ); if (rc != CKR_OK) { show_error(" C_DecryptInit #1", rc ); return FALSE; } rc = funcs->C_Decrypt( session, cipher, cipherlen, data2, &len2 ); if (rc != CKR_OK) { show_error(" C_Decrypt #1", rc ); return FALSE; } } GetSystemTime(&t2); process_time( t1, t2 ); printf("\n"); if (len1 != len2) { printf(" ERROR: lengths don't match %d %d \n",len1,len2); return FALSE; } for (i=0; i <len1; i++) { if (data1[i] != data2[i]) { printf(" ERROR: mismatch at byte %d\n", i ); return FALSE; } } rc = funcs->C_CloseAllSessions( slot_id ); if (rc != CKR_OK) { show_error(" C_CloseAllSessions #1", rc ); return FALSE; } printf("Looks okay...\n"); return TRUE;}////int do_SignRSA_PKCS( void ){ CK_BYTE data1[100]; CK_BYTE data2[256]; CK_BYTE signature[256]; 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_ULONG i; CK_ULONG len1, len2, sig_len; CK_RV rc; CK_ULONG bits = 1024; CK_BYTE pub_exp[] = { 0x3 }; CK_ATTRIBUTE pub_tmpl[] = { {CKA_MODULUS_BITS, &bits, sizeof(bits) }, {CKA_PUBLIC_EXPONENT, &pub_exp, sizeof(pub_exp) } }; printf("do_SignRSA_PKCS...\n"); slot_id = SLOT_ID; 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 #1", rc ); return FALSE; } memcpy( user_pin, "12345678", 8 ); user_pin_len = 8; rc = funcs->C_Login( session, CKU_USER, user_pin, user_pin_len ); if (rc != CKR_OK) { show_error(" C_Login #1", rc ); return FALSE; } mech.mechanism = CKM_RSA_PKCS_KEY_PAIR_GEN; mech.ulParameterLen = 0; mech.pParameter = NULL; rc = funcs->C_GenerateKeyPair( session, &mech, pub_tmpl, 2, NULL, 0, &publ_key, &priv_key ); if (rc != CKR_OK) { show_error(" C_GenerateKeyPair #1", rc ); return FALSE; } // now, encrypt some data // len1 = sizeof(data1); len2 = sizeof(data2); sig_len = sizeof(signature); for (i=0; i < len1; i++) data1[i] = i % 255; mech.mechanism = CKM_RSA_PKCS; mech.ulParameterLen = 0; mech.pParameter = NULL; rc = funcs->C_SignInit( session, &mech, priv_key ); if (rc != CKR_OK) { show_error(" C_SignInit #1", rc ); return FALSE; } rc = funcs->C_Sign( session, data1, len1, signature, &sig_len ); if (rc != CKR_OK) { show_error(" C_Sign #1", rc ); return FALSE; } // now, verify the signature // rc = funcs->C_VerifyInit( session, &mech, publ_key ); if (rc != CKR_OK) { show_error(" C_VerifyInit #1", rc ); return FALSE; } rc = funcs->C_Verify( session, data1, len1, signature, sig_len ); if (rc != CKR_OK) { show_error(" C_Verify #1", rc ); return FALSE; } // now, corrupt the signature and try to re-verify. // signature[50] = signature[50] + 1; rc = funcs->C_VerifyInit( session, &mech, publ_key ); if (rc != CKR_OK) { show_error(" C_VerifyInit #2", rc ); return FALSE; } rc = funcs->C_Verify( session, data1, len1, signature, sig_len ); if (rc != CKR_SIGNATURE_INVALID) { show_error(" C_Verify #2", rc ); printf(" Expected CKR_SIGNATURE_INVALID\n"); return FALSE; } // now, try a SignRecover/VerifyRecover operation // rc = funcs->C_SignRecoverInit( session, &mech, priv_key ); if (rc != CKR_OK) { show_error(" C_SignRecoverInit #1", rc ); return FALSE; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -