diff options
Diffstat (limited to 'ckcapi.c')
-rw-r--r-- | ckcapi.c | 81 |
1 files changed, 49 insertions, 32 deletions
@@ -27,7 +27,6 @@ * GLOBALS / DEFINES */ -static CK_ULONG slot_id = 33; /* arbitrary */ static int cryptoki_initialized = 0; static HANDLE global_mutex = NULL; @@ -35,7 +34,6 @@ static HANDLE global_mutex = NULL; #define LIBRARY_DESCRIPTION "Cryptoki CAPI Provider " #define LIBRARY_VERSION_MAJOR 1 #define LIBRARY_VERSION_MINOR 1 -#define SLOT_DESCRIPTION "Windows Certificates and Keys " #define HARDWARE_VERSION_MAJOR 0 #define HARDWARE_VERSION_MINOR 0 #define FIRMWARE_VERSION_MAJOR 0 @@ -202,8 +200,8 @@ CC_C_Finalize(CK_VOID_PTR pReserved) cryptoki_initialized = 0; - ckcapi_session_close_all(); - ckcapi_object_clear_all(); + ckcapi_session_cleanup_all(); + ckcapi_token_cleanup_all(); RETURN(CKR_OK); } @@ -239,46 +237,51 @@ CC_C_GetFunctionList(CK_FUNCTION_LIST_PTR_PTR list) static CK_RV CC_C_GetSlotList(CK_BBOOL tokenPresent, CK_SLOT_ID_PTR slot_list, CK_ULONG_PTR count) { + unsigned int n_tokens, i; + ENTER(C_GetSlotList); PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED); PREREQ(count, CKR_ARGUMENTS_BAD); - /* Token is always present */ + /* All tokens are always present */ + + n_tokens = ckcapi_token_get_count(); /* Application only wants to know the number of slots. */ if(slot_list == NULL) { - *count = 1; + *count = n_tokens; RETURN(CKR_OK); } - if((*count < 1) && (slot_list != NULL)) + if(*count < n_tokens) { - *count = 1; + *count = n_tokens; RETURN(CKR_BUFFER_TOO_SMALL); } - *count = 1; - slot_list[0] = slot_id; + *count = n_tokens; + for(i = 0; i < n_tokens; ++i) + slot_list[i] = i; RETURN(CKR_OK); } static CK_RV CC_C_GetSlotInfo(CK_SLOT_ID id, CK_SLOT_INFO_PTR info) { + const char* name; + ENTER(C_GetSlotInfo); PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED); PREREQ(info, CKR_ARGUMENTS_BAD); /* Make sure the slot ID is valid */ - if(id != slot_id) + if(!ckcapi_token_is_valid(id)) RETURN(CKR_SLOT_ID_INVALID); - ASSERT(strlen(SLOT_DESCRIPTION) == 64); ASSERT(strlen(MANUFACTURER_ID) == 32); /* Provide information about the slot in the provided buffer */ - strncpy((char*)info->slotDescription, SLOT_DESCRIPTION, 64); strncpy((char*)info->manufacturerID, MANUFACTURER_ID, 32); info->hardwareVersion.major = HARDWARE_VERSION_MAJOR; info->hardwareVersion.minor = HARDWARE_VERSION_MINOR; @@ -288,27 +291,34 @@ CC_C_GetSlotInfo(CK_SLOT_ID id, CK_SLOT_INFO_PTR info) /* Token is always present */ info->flags = CKF_TOKEN_PRESENT; + /* Slot name is blank padded, odd */ + name = ckcapi_token_get_display_name(id); + memset((char*)info->slotDescription, ' ', + sizeof(info->slotDescription)); + memcpy((char*)info->slotDescription, name, + min(strlen(name), sizeof(info->slotDescription))); + RETURN(CKR_OK); } static CK_RV CC_C_GetTokenInfo(CK_SLOT_ID id, CK_TOKEN_INFO_PTR info) { + const char* name; + ENTER(C_GetTokenInfo); PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED); PREREQ(info, CKR_ARGUMENTS_BAD); /* Make sure the slot ID is valid */ - if(id != slot_id) + if(!ckcapi_token_is_valid(id)) RETURN(CKR_SLOT_ID_INVALID); - - ASSERT(strlen(SLOT_DESCRIPTION) == 64); + ASSERT(strlen(MANUFACTURER_ID) == 32); ASSERT(strlen(SLOT_TOKEN_MODEL) == 16); ASSERT(strlen(SLOT_TOKEN_SERIAL) == 16); /* Provide information about a token in the provided buffer */ - strncpy((char*)info->label, SLOT_DESCRIPTION, 32); strncpy((char*)info->manufacturerID, MANUFACTURER_ID, 32); strncpy((char*)info->model, SLOT_TOKEN_MODEL, 16); strncpy((char*)info->serialNumber, SLOT_TOKEN_SERIAL, 16); @@ -331,6 +341,12 @@ CC_C_GetTokenInfo(CK_SLOT_ID id, CK_TOKEN_INFO_PTR info) info->firmwareVersion.minor = FIRMWARE_VERSION_MINOR; memset(info->utcTime, ' ', 16); + /* Slot name is blank padded, odd */ + name = ckcapi_token_get_display_name(id); + memset((char*)info->label, ' ', sizeof(info->label)); + memcpy((char*)info->label, name, + min(strlen(name), sizeof(info->label))); + RETURN(CKR_OK); } @@ -342,9 +358,12 @@ CC_C_GetMechanismList(CK_SLOT_ID id, CK_MECHANISM_TYPE_PTR mechanism_list, PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED); PREREQ(count, CKR_ARGUMENTS_BAD); - if(id != slot_id) + if(!ckcapi_token_is_valid(id)) RETURN(CKR_SLOT_ID_INVALID); + /* TODO: Eventually we'll return stuff here */ + /* mechanism_list[0] = CKM_RSA_PKCS; */ + if(mechanism_list == NULL) { *count = 0; @@ -357,7 +376,6 @@ CC_C_GetMechanismList(CK_SLOT_ID id, CK_MECHANISM_TYPE_PTR mechanism_list, RETURN(CKR_BUFFER_TOO_SMALL); } - /* mechanism_list[0] = CKM_RSA_PKCS; */ *count = 0; RETURN(CKR_OK); } @@ -370,17 +388,16 @@ CC_C_GetMechanismInfo(CK_SLOT_ID id, CK_MECHANISM_TYPE type, PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED); PREREQ(info, CKR_ARGUMENTS_BAD); - if(id != slot_id) + if(!ckcapi_token_is_valid(id)) RETURN(CKR_SLOT_ID_INVALID); - /* unsupported mechanism */ - if(type != CKM_RSA_PKCS) - RETURN(CKR_MECHANISM_INVALID); + /* TODO: Eventually we'll return stuff here */ + RETURN(CKR_MECHANISM_INVALID); - info->ulMinKeySize = 384; + /* info->ulMinKeySize = 384; info->ulMaxKeySize = 16384; - info->flags = 0; /* TODO: Choose which we'll implement */ - RETURN(CKR_OK); + info->flags = 0; + RETURN(CKR_OK);*/ } static CK_RV @@ -421,12 +438,12 @@ CC_C_OpenSession(CK_SLOT_ID id, CK_FLAGS flags, CK_VOID_PTR application, ENTER(C_OpenSession); PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED); - if(id != slot_id) + if(!ckcapi_token_is_valid(id)) RETURN(CKR_SLOT_ID_INVALID); - sess = ckcapi_session_create(); - if(sess == NULL) - RETURN(CKR_HOST_MEMORY); + ret = ckcapi_session_create(id, &sess); + if(ret != CKR_OK) + RETURN(ret); sess->notify_callback = notify; sess->user_data = application; @@ -472,10 +489,10 @@ CC_C_CloseAllSessions(CK_SLOT_ID id) ENTER(C_CloseAllSession); PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED); - if(id != slot_id) + if(!ckcapi_token_is_valid(id)) RETURN(CKR_SLOT_ID_INVALID); - ckcapi_session_close_all(); + ckcapi_session_close_all(id); RETURN(CKR_OK); } |