📄 misc_func.c
字号:
// File: driver.c// G//// Test driver. In-depth regression test for PKCS #11//#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <memory.h>#include "pkcs11types.h"#include "regress.h"// Purpose: to cause a variety of crashes to test that the Cryptoki.DLL// DLL Init-Term routine properly detaches from the coprocessor// in the event of a abnormal program termination.//CK_BYTEdo_crash(){ // dereferencing a NULL pointer detaches correctly CK_BYTE *ptr = NULL; CK_BYTE a; a = *ptr; return a;}////int do_DummySpeed( void ){ CK_SLOT_ID slot_id; CK_ULONG i; CK_RV rc; printf("do_DummySpeed. 1000 iterations to the card...\n");#if 0 slot_id = SLOT_ID; for (i=0; i < 1000; i++) { rc = DummyFunction( slot_id ); if (rc != CKR_OK) { show_error(" DummyFunction", rc ); return FALSE; } }#endif printf("Done...\n"); return TRUE;}////int do_GetInfo( void ){ CK_INFO info; CK_RV rc; printf("do_GetInfo...\n"); rc = funcs->C_GetInfo( &info ); if (rc != CKR_OK) { show_error(" C_GetInfo", rc ); return FALSE; } printf("Looks okay...\n"); return TRUE;}////int do_GetSlotList( void ){ CK_BBOOL tokenPresent; CK_SLOT_ID_PTR pSlotList; CK_ULONG ulCount; CK_RV rc; printf("do_GetSlotList...\n"); // first, get the count // tokenPresent = TRUE; // this is the only case with this implementation rc = funcs->C_GetSlotList( tokenPresent, NULL, &ulCount ); if (rc != CKR_OK) { show_error(" C_GetSlotList", rc ); return FALSE; } pSlotList = (CK_SLOT_ID *)malloc( ulCount * sizeof(CK_SLOT_ID) ); if (!pSlotList) { printf(" DRIVER ERROR: CANNOT ALLOCATE MEMORY FOR SLOT LIST\n"); return FALSE; } // now, get the slots // rc = funcs->C_GetSlotList( tokenPresent, pSlotList, &ulCount ); if (rc != CKR_OK) { show_error(" C_GetSlotList", rc ); return FALSE; } free( pSlotList ); printf("Looks okay...\n"); return TRUE;}////int do_GetSlotInfo( void ){ CK_SLOT_ID slot_id; CK_SLOT_INFO info; CK_RV rc; printf("do_GetSlotInfo...\n"); slot_id = SLOT_ID; rc = funcs->C_GetSlotInfo( slot_id, &info ); if (rc != CKR_OK) { show_error(" C_GetSlotInfo", rc ); return FALSE; } printf(" CK_SLOT_INFO for slot #1: \n"); printf(" slotDescription: %64.64s\n", info.slotDescription ); printf(" manufacturerID: %32.32s\n", info.manufacturerID ); printf(" flags: 0x%0x\n", info.flags ); printf(" hardwareVersion: %d.%d\n", info.hardwareVersion.major, info.hardwareVersion.minor ); printf(" firmwareVersion: %d.%d\n", info.firmwareVersion.major, info.firmwareVersion.minor ); printf("Looks Okay...\n"); return TRUE;}////int do_GetTokenInfo( void ){ CK_SLOT_ID slot_id; CK_TOKEN_INFO info; CK_RV rc; printf("do_GetTokenInfo...\n"); slot_id = SLOT_ID; rc = funcs->C_GetTokenInfo( slot_id, &info ); if (rc != CKR_OK) { show_error(" C_GetTokenInfo", rc ); return FALSE; } printf(" CK_TOKEN_INFO for slot #1: \n"); printf(" label: %32.32s\n", info.label ); printf(" manufacturerID: %32.32s\n", info.manufacturerID ); printf(" model: %16.16s\n", info.model ); printf(" serialNumber: %16.16s\n", info.serialNumber ); printf(" flags: %0x\n", info.flags ); printf(" ulMaxSessionCount: %d\n", info.ulMaxSessionCount ); printf(" ulSessionCount: %d\n", info.ulSessionCount ); printf(" ulMaxRwSessionCount: %d\n", info.ulMaxRwSessionCount ); printf(" ulRwSessionCount: %d\n", info.ulRwSessionCount ); printf(" ulMaxPinLen: %d\n", info.ulMaxPinLen ); printf(" ulMinPinLen: %d\n", info.ulMinPinLen ); printf(" ulTotalPublicMemory: %d\n", info.ulTotalPublicMemory ); printf(" ulFreePublicMemory: %d\n", info.ulFreePublicMemory ); printf(" ulTotalPrivateMemory: %d\n", info.ulTotalPrivateMemory ); printf(" ulFreePrivateMemory: %d\n", info.ulFreePrivateMemory ); printf(" hardwareVersion: %d.%d\n", info.hardwareVersion.major, info.hardwareVersion.minor ); printf(" firmwareVersion: %d.%d\n", info.firmwareVersion.major, info.firmwareVersion.minor ); printf(" time: %16.16s\n", info.utcTime ); printf("Looks okay...\n"); return TRUE;}////int do_GetMechanismList( void ){ CK_SLOT_ID slot_id; CK_ULONG count; CK_MECHANISM_TYPE *mech_list; CK_RV rc; printf("do_GetMechanismList...\n"); slot_id = SLOT_ID; rc = funcs->C_GetMechanismList( slot_id, NULL, &count ); if (rc != CKR_OK) { show_error(" C_GetMechanismList #1", rc ); return FALSE; } printf(" C_GetMechanismList #1 returned %d mechanisms\n", count ); mech_list = (CK_MECHANISM_TYPE *)malloc( count * sizeof(CK_MECHANISM_TYPE) ); if (!mech_list) return CKR_HOST_MEMORY; rc = funcs->C_GetMechanismList( slot_id, mech_list, &count ); if (rc != CKR_OK) { show_error(" C_GetMechanismList #2", rc ); return FALSE; } free( mech_list ); printf("Looks okay...\n"); return TRUE;}////int do_GetMechanismInfo( void ){ CK_ULONG count; CK_MECHANISM_TYPE *mech_list; CK_RV rc; CK_SLOT_ID slot_id; CK_MECHANISM_INFO info; CK_ULONG i; printf("do_GetMechanismInfo...\n"); slot_id = SLOT_ID; rc = funcs->C_GetMechanismList( slot_id, NULL, &count ); if (rc != CKR_OK) { show_error(" C_GetMechanismList #1", rc ); return FALSE; } mech_list = (CK_MECHANISM_TYPE *)malloc( count * sizeof(CK_MECHANISM_TYPE) ); if (!mech_list) return CKR_HOST_MEMORY; rc = funcs->C_GetMechanismList( slot_id, mech_list, &count ); if (rc != CKR_OK) { show_error(" C_GetMechanismList #2", rc ); return FALSE; } for (i=0; i < count; i++) { rc = funcs->C_GetMechanismInfo( slot_id, mech_list[i], &info ); if (rc != CKR_OK) { show_error(" C_GetMechanismInfo", rc ); printf(" Tried to get info on mechanism # %d\n", mech_list[i] ); return FALSE; } printf(" Mechanism #%d\n", mech_list[i] ); printf(" ulMinKeySize: %d\n", info.ulMinKeySize ); printf(" ulMaxKeySize: %d\n", info.ulMaxKeySize ); printf(" flags: %0x\n", info.flags ); } free( mech_list ); printf("Looks okay...\n"); return TRUE;}////int do_InitPIN( void ){ CK_SLOT_ID slot_id; CK_FLAGS flags; CK_SESSION_HANDLE session; CK_CHAR so_pin[8]; CK_CHAR user_pin[8]; CK_ULONG so_pin_len; CK_ULONG user_pin_len; CK_RV rc; printf("do_InitPIN...\n"); memcpy( user_pin, "12345678", 8 ); memcpy( so_pin, "87654321", 8 ); user_pin_len = 8; so_pin_len = 8; slot_id = SLOT_ID; flags = CKF_SERIAL_SESSION | CKF_RW_SESSION; // try to call C_InitPIN from a public session // rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &session ); if (rc != CKR_OK) { show_error(" C_OpenSession #1", rc ); return FALSE; } rc = funcs->C_InitPIN( session, user_pin, user_pin_len ); if (rc != CKR_USER_NOT_LOGGED_IN) { show_error(" C_InitPIN #1", rc ); printf(" Expected CKR_USER_NOT_LOGGED_IN\n" ); return FALSE; } // try to call C_InitPIN from an SO session // rc = funcs->C_Login( session, CKU_SO, so_pin, so_pin_len ); if (rc != CKR_OK) { show_error(" C_Login #2", rc ); return FALSE; } rc = funcs->C_InitPIN( session, user_pin, user_pin_len ); if (rc != CKR_OK) { show_error(" C_InitPIN #2", rc ); return FALSE; } rc = funcs->C_Logout( session ); if (rc != CKR_OK) { show_error(" C_Logout #1", rc ); return FALSE; } // try to call C_InitPIN from a normal user session // 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_InitPIN( session, user_pin, user_pin_len ); if (rc != CKR_USER_NOT_LOGGED_IN) { show_error(" C_InitPIN #2", rc ); printf(" Expected CKR_USER_NOT_LOGGED_IN\n" ); return FALSE; } rc = funcs->C_Logout( session ); if (rc != CKR_OK) { show_error(" C_Logout #2", rc ); 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_SetPIN( void ){ CK_SLOT_ID slot_id; CK_FLAGS flags; CK_SESSION_HANDLE session; CK_CHAR old_pin[8]; CK_CHAR new_pin[8]; CK_ULONG old_len; CK_ULONG new_len; CK_RV rc; printf("do_SetPIN...\n"); // first, try to set the user PIN // memcpy( old_pin, "12345678", 8 ); memcpy( new_pin, "ABCDEF", 6 ); old_len = 8; new_len = 6; slot_id = SLOT_ID; flags = CKF_SERIAL_SESSION | CKF_RW_SESSION; // try to call C_SetPIN from a public session // rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &session ); if (rc != CKR_OK) { show_error(" C_OpenSession #1", rc ); return FALSE; } rc = funcs->C_SetPIN( session, old_pin, old_len, new_pin, new_len ); if (rc != CKR_SESSION_READ_ONLY) { show_error(" C_SetPIN #1", rc ); printf(" Expected CKR_SESSION_READ_ONLY\n"); return FALSE; } // try to call C_SetPIN from a normal user session // rc = funcs->C_Login( session, CKU_USER, old_pin, old_len ); if (rc != CKR_OK) { show_error(" C_Login #1", rc ); return FALSE; } rc = funcs->C_SetPIN( session, old_pin, old_len, new_pin, new_len ); if (rc != CKR_OK) { show_error(" C_SetPIN #2", rc ); return FALSE; } rc = funcs->C_Logout( session ); if (rc != CKR_OK) { show_error(" C_Logout #1", rc ); return FALSE; } // now, try to log in with the old PIN // rc = funcs->C_Login( session, CKU_USER, old_pin, old_len ); if (rc != CKR_PIN_INCORRECT) { show_error(" C_Login #2", rc ); printf(" Expected CKR_PIN_INCORRECT\n"); return FALSE; } rc = funcs->C_Login( session, CKU_USER, new_pin, new_len ); if (rc != CKR_OK) { show_error(" C_Login #3", rc ); return FALSE; } // change the PIN back to the original so the rest of this program // doesn't break // rc = funcs->C_SetPIN( session, new_pin, new_len, old_pin, old_len ); if (rc != CKR_OK) { show_error(" C_SetPIN #3", rc ); return FALSE; } rc = funcs->C_Logout( session ); if (rc != CKR_OK) { show_error(" C_Logout #2", rc ); return FALSE; } // // done with user tests...now try with the SO // memcpy( old_pin, "87654321", 8 ); // try to call C_SetPIN from a normal user session // rc = funcs->C_Login( session, CKU_SO, old_pin, old_len ); if (rc != CKR_OK) { show_error(" C_Login #3", rc ); return FALSE; } rc = funcs->C_SetPIN( session, old_pin, old_len, new_pin, new_len ); if (rc != CKR_OK) { show_error(" C_SetPIN #4", rc ); return FALSE; } rc = funcs->C_Logout( session ); if (rc != CKR_OK) { show_error(" C_Logout #3", rc ); return FALSE; } // now, try to log in with the old PIN // rc = funcs->C_Login( session, CKU_SO, old_pin, old_len ); if (rc != CKR_PIN_INCORRECT) { show_error(" C_Login #4", rc ); printf(" Expected CKR_PIN_INCORRECT\n"); return FALSE; } rc = funcs->C_Login( session, CKU_SO, new_pin, new_len ); if (rc != CKR_OK) { show_error(" C_Login #5", rc ); return FALSE; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -