summaryrefslogtreecommitdiff
path: root/ckcapi.c
diff options
context:
space:
mode:
Diffstat (limited to 'ckcapi.c')
-rw-r--r--ckcapi.c81
1 files changed, 49 insertions, 32 deletions
diff --git a/ckcapi.c b/ckcapi.c
index 4635a3f..1a398b3 100644
--- a/ckcapi.c
+++ b/ckcapi.c
@@ -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);
}