summaryrefslogtreecommitdiff
path: root/ckcapi.c
diff options
context:
space:
mode:
authorStef Walter <stef@memberwebs.com>2008-12-09 20:09:51 +0000
committerStef Walter <stef@memberwebs.com>2008-12-09 20:09:51 +0000
commitd108e2008ec7205ef3907296fd3e5a810e45919b (patch)
treed4206f5c4187221523a0a47c255f5df00cf6596e /ckcapi.c
parent2ef411d0fb1923bf75c3c631992cdef787d0c619 (diff)
First shot at renaming the project.
Diffstat (limited to 'ckcapi.c')
-rw-r--r--ckcapi.c1515
1 files changed, 0 insertions, 1515 deletions
diff --git a/ckcapi.c b/ckcapi.c
deleted file mode 100644
index c0e6036..0000000
--- a/ckcapi.c
+++ /dev/null
@@ -1,1515 +0,0 @@
-/*
- * Copyright (C) 2007 Stef Walter
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <string.h>
-#include <stdarg.h>
-#include <stdio.h>
-
-#include "ckcapi.h"
-#include "ckcapi-object.h"
-#include "ckcapi-session.h"
-#include "ckcapi-rsa.h"
-#include "ckcapi-token.h"
-
-/* Warns about all the raw string usage in this file */
-#pragma warning (disable : 4996)
-
-/* -------------------------------------------------------------------
- * GLOBALS / DEFINES
- */
-
-static int cryptoki_initialized = 0;
-static HANDLE global_mutex = NULL;
-
-#define MANUFACTURER_ID "Cryptoki CAPI "
-#define LIBRARY_DESCRIPTION "Cryptoki CAPI Provider "
-#define LIBRARY_VERSION_MAJOR 1
-#define LIBRARY_VERSION_MINOR 1
-#define HARDWARE_VERSION_MAJOR 0
-#define HARDWARE_VERSION_MINOR 0
-#define FIRMWARE_VERSION_MAJOR 0
-#define FIRMWARE_VERSION_MINOR 0
-#define SLOT_TOKEN_SERIAL "1.0 "
-#define SLOT_TOKEN_MODEL "1.0 "
-#define MAX_PIN_LEN 256
-#define MIN_PIN_LEN 1
-
-static CK_MECHANISM_TYPE all_mechanisms[] = {
- CKM_RSA_PKCS
-};
-
-/* -------------------------------------------------------------------
- * MODULE GLOBAL FUNCTIONS
- */
-
-#define LINE 1024
-
-void
-ckcapi_debug(const char* msg, ...)
-{
- char buf[LINE];
- va_list va;
- size_t len;
-
- va_start(va, msg);
- _vsnprintf(buf, 1024, msg, va);
- va_end(va);
-
- buf[LINE - 1] = 0;
- len = strlen (buf);
-
- strncpy(buf + len, "\n", 1024 - len);
- buf[LINE - 1] = 0;
- // OutputDebugStringA(buf);
-}
-
-/* Bah humbug, MSVC doesn't have __func__ */
-#define ENTER(func) \
- char* _func = #func; \
- ckcapi_debug("%s: enter", _func)
-
-#define RETURN(ret) \
- return (ckcapi_debug("%s: %d", _func, ret), ret)
-
-#define PREREQ(cond, ret) \
- if (!(cond)) { ckcapi_debug("%s: %s failed: %d", _func, #cond, ret); return ret; }
-
-void
-ckcapi_lock_global(void)
-{
- DWORD r;
-
- ASSERT(global_mutex);
-
- r = WaitForSingleObject(global_mutex, INFINITE);
- ASSERT(r == WAIT_OBJECT_0);
-}
-
-void
-ckcapi_unlock_global(void)
-{
- BOOL r;
-
- ASSERT(global_mutex);
-
- r = ReleaseMutex(global_mutex);
- ASSERT(r);
-}
-
-CK_RV
-ckcapi_winerr_to_ckr(DWORD werr)
-{
- switch(werr)
- {
- case ERROR_NOT_ENOUGH_MEMORY:
- case ERROR_OUTOFMEMORY:
- return CKR_HOST_MEMORY;
- break;
- case NTE_NO_MEMORY:
- return CKR_DEVICE_MEMORY;
- break;
- case ERROR_MORE_DATA:
- return CKR_BUFFER_TOO_SMALL;
- case ERROR_INVALID_PARAMETER: /* these params were derived from the */
- case ERROR_INVALID_HANDLE: /* inputs, so if they are bad, the input */
- case NTE_BAD_ALGID: /* data is bad */
- case NTE_BAD_HASH:
- case NTE_BAD_TYPE:
- case NTE_BAD_PUBLIC_KEY:
- return CKR_DATA_INVALID;
- case ERROR_BUSY:
- case NTE_FAIL:
- case NTE_BAD_UID:
- return CKR_DEVICE_ERROR;
- default:
- return CKR_GENERAL_ERROR;
- };
-}
-
-CK_RV
-ckcapi_return_data_raw(CK_VOID_PTR output, CK_ULONG_PTR n_output,
- CK_VOID_PTR input, CK_ULONG n_input)
-{
- ASSERT(n_output);
- ASSERT(input);
-
- /* Just asking for the length */
- if(!output)
- {
- *n_output = n_input;
- return CKR_OK;
- }
-
- /* Buffer is too short */
- if(n_input > *n_output)
- {
- *n_output = n_input;
- return CKR_BUFFER_TOO_SMALL;
- }
-
- *n_output = n_input;
- memcpy(output, input, n_input);
- return CKR_OK;
-}
-
-CK_RV
-ckcapi_return_data(CK_ATTRIBUTE_PTR attr, CK_VOID_PTR input, DWORD n_input)
-{
- return ckcapi_return_data_raw(attr->pValue, &(attr->ulValueLen),
- input, n_input);
-}
-
-CK_RV
-ckcapi_return_string(CK_ATTRIBUTE_PTR attr, WCHAR* string)
-{
- CK_UTF8CHAR_PTR buffer;
- int result;
-
- SetLastError(0);
-
- /*
- * Sadly WideCharToMultiByte doesn't handle zero
- * length strings properly. So we have to special
- * case this part.
- */
- if(!string[0])
- return ckcapi_return_data(attr, "", 0);
-
- /* The length of the string, including null termination */
- result = WideCharToMultiByte(CP_UTF8, 0, string, -1,
- NULL, 0, NULL, NULL);
-
- if(result)
- {
- /* Did the caller just want the length? */
- if(!attr->pValue)
- {
- attr->ulValueLen = result - 1;
- return CKR_OK;
- }
-
- /* Is the callers buffer too short? */
- if((int)attr->ulValueLen < result - 1)
- {
- attr->ulValueLen = result - 1;
- return CKR_BUFFER_TOO_SMALL;
- }
-
- /*
- * Allocate a buffer for the conversion. We have to
- * do this because strings in PKCS#11 are not null
- * terminated and strings returned from
- * WideCharToMultiByte are always null terminated.
- */
- buffer = malloc(result);
- if(!buffer)
- return CKR_HOST_MEMORY;
-
- /* Do the actual conversion */
- result = WideCharToMultiByte(CP_UTF8, 0, string, -1,
- buffer, result, NULL, NULL);
-
- if(result)
- {
- attr->ulValueLen = result - 1;
- memcpy(attr->pValue, buffer, attr->ulValueLen);
-
- free(buffer);
- return CKR_OK;
- }
-
- free(buffer);
- }
-
- /*
- * We should never have too little buffer, or
- * get a zero length success code. It's a very
- * strange error that arrives here.
- */
- return CKR_GENERAL_ERROR;
-}
-
-CK_RV
-ckcapi_return_dword_as_bytes(CK_ATTRIBUTE_PTR attr, DWORD value)
-{
- int i;
- CK_ULONG count = 0;
- BOOL first = TRUE;
- BYTE* at = attr->pValue;
- CK_RV ret = CKR_OK;
-
- for(i = 0; i < sizeof(DWORD); i++)
- {
- BYTE digit = (BYTE)((value >> (((sizeof(DWORD)-1)*8))) & 0xFF);
- value = value << 8;
-
- /* No leading zero */
- if (first && digit == 0)
- continue;
-
- first = FALSE;
- if(at)
- {
- if(count > attr->ulValueLen)
- ret = CKR_BUFFER_TOO_SMALL;
- else
- *(at++) = digit;
- }
-
- count++;
- }
-
- attr->ulValueLen = count;
- return ret;
-}
-
-CK_RV
-ckcapi_return_reversed_data(CK_ATTRIBUTE_PTR attr, CK_VOID_PTR data, CK_ULONG length)
-{
- CK_RV ret = ckcapi_return_data(attr, data, length);
- if(ret != CKR_OK || !attr->pValue)
- return ret;
-
- ckcapi_reverse_memory(attr->pValue, attr->ulValueLen);
- return CKR_OK;
-}
-
-static void
-print_zero_decimal(CK_BYTE_PTR buffer, CK_ULONG length, WORD value)
-{
- int i;
- for(i = (int)length - 1; i >= 0; --i)
- {
- BYTE digit = value % 10;
- buffer[i] = '0' + digit;
- value /= 10;
- }
-}
-
-CK_RV
-ckcapi_return_filetime(CK_ATTRIBUTE_PTR attr, FILETIME *ftime)
-{
- SYSTEMTIME stime;
- CK_DATE* date;
-
- ASSERT(attr);
- ASSERT(ftime);
-
- if(!attr->pValue)
- {
- attr->ulValueLen = sizeof(CK_DATE);
- return CKR_OK;
- }
-
- if(attr->ulValueLen < sizeof(CK_DATE))
- {
- attr->ulValueLen = sizeof(CK_DATE);
- return CKR_BUFFER_TOO_SMALL;
- }
-
- if(!FileTimeToSystemTime(ftime, &stime))
- {
- DBG(("An invalid FILETIME was encountered"));
- return CKR_GENERAL_ERROR;
- }
-
- date = (CK_DATE*)attr->pValue;
- attr->ulValueLen = sizeof(CK_DATE);
- print_zero_decimal(date->year, sizeof(date->year), stime.wYear);
- print_zero_decimal(date->month, sizeof(date->month), stime.wMonth);
- print_zero_decimal(date->day, sizeof(date->day), stime.wDay);
-
- return CKR_OK;
-}
-
-/* ---------------------------------------------------------------- */
-
-static CK_RV
-CC_C_Initialize(CK_VOID_PTR init_args)
-{
- ENTER(C_Initialize);
- PREREQ(!cryptoki_initialized, CKR_CRYPTOKI_ALREADY_INITIALIZED);
-
- if (init_args != NULL) {
- CK_C_INITIALIZE_ARGS_PTR args;
- int supplied_ok;
-
- /* pReserved must be NULL */
- args = init_args;
- PREREQ(!args->pReserved, CKR_ARGUMENTS_BAD);
-
- /* ALL supplied function pointers need to have the value either NULL or non-NULL. */
- supplied_ok = (args->CreateMutex == NULL && args->DestroyMutex == NULL &&
- args->LockMutex == NULL && args->UnlockMutex == NULL) ||
- (args->CreateMutex != NULL && args->DestroyMutex != NULL &&
- args->LockMutex != NULL && args->UnlockMutex != NULL);
- PREREQ(supplied_ok, CKR_ARGUMENTS_BAD);
-
- /*
- * When the CKF_OS_LOCKING_OK flag isn't set and mutex function pointers are supplied
- * by an application, return an error. We must be able to use our own locks.
- */
- if(!(args->flags & CKF_OS_LOCKING_OK) && (args->CreateMutex != NULL))
- RETURN(CKR_CANT_LOCK);
- }
-
- if(!global_mutex)
- {
- global_mutex = CreateMutex(NULL, FALSE, NULL);
- if(!global_mutex)
- RETURN(CKR_CANT_LOCK);
- }
-
- cryptoki_initialized = 1;
-
- RETURN(CKR_OK);
-}
-
-static CK_RV
-CC_C_Finalize(CK_VOID_PTR pReserved)
-{
- ENTER(C_Finalize);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
- PREREQ(!pReserved, CKR_ARGUMENTS_BAD);
-
- cryptoki_initialized = 0;
-
- ckcapi_session_cleanup_all();
- ckcapi_token_cleanup_all();
-
- RETURN(CKR_OK);
-}
-
-static CK_RV
-CC_C_GetInfo(CK_INFO_PTR info)
-{
- ENTER(C_GetInfo);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
- PREREQ(info, CKR_ARGUMENTS_BAD);
-
- ASSERT(strlen(MANUFACTURER_ID) == 32);
- ASSERT(strlen(LIBRARY_DESCRIPTION) == 32);
-
- info->cryptokiVersion.major = CRYPTOKI_VERSION_MAJOR;
- info->cryptokiVersion.minor = CRYPTOKI_VERSION_MINOR;
- info->libraryVersion.major = LIBRARY_VERSION_MAJOR;
- info->libraryVersion.minor = LIBRARY_VERSION_MINOR;
- info->flags = 0;
- strncpy((char*)info->manufacturerID, MANUFACTURER_ID, 32);
- strncpy((char*)info->libraryDescription, LIBRARY_DESCRIPTION, 32);
-
- RETURN(CKR_OK);
-}
-
-static CK_RV
-CC_C_GetFunctionList(CK_FUNCTION_LIST_PTR_PTR list)
-{
- /* This would be a strange call to receive */
- return C_GetFunctionList(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);
-
- /* 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 = n_tokens;
- RETURN(CKR_OK);
- }
-
- if(*count < n_tokens)
- {
- *count = n_tokens;
- RETURN(CKR_BUFFER_TOO_SMALL);
- }
-
- *count = n_tokens;
- for(i = 0; i < n_tokens; ++i)
- slot_list[i] = ckcapi_token_get_slot_id (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(!ckcapi_token_is_valid(id))
- RETURN(CKR_SLOT_ID_INVALID);
-
- ASSERT(strlen(MANUFACTURER_ID) == 32);
-
- /* Provide information about the slot in the provided buffer */
- strncpy((char*)info->manufacturerID, MANUFACTURER_ID, 32);
- info->hardwareVersion.major = HARDWARE_VERSION_MAJOR;
- info->hardwareVersion.minor = HARDWARE_VERSION_MINOR;
- info->firmwareVersion.major = FIRMWARE_VERSION_MAJOR;
- info->firmwareVersion.minor = FIRMWARE_VERSION_MINOR;
-
- /* 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(!ckcapi_token_is_valid(id))
- RETURN(CKR_SLOT_ID_INVALID);
-
- 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->manufacturerID, MANUFACTURER_ID, 32);
- strncpy((char*)info->model, SLOT_TOKEN_MODEL, 16);
- strncpy((char*)info->serialNumber, SLOT_TOKEN_SERIAL, 16);
-
- /* Protected authentication path: Windows prompts for it's own PINs */
- info->flags = CKF_TOKEN_INITIALIZED | CKF_PROTECTED_AUTHENTICATION_PATH;
- info->ulMaxSessionCount = CK_EFFECTIVELY_INFINITE;
- info->ulSessionCount = CK_EFFECTIVELY_INFINITE;
- info->ulMaxRwSessionCount = CK_EFFECTIVELY_INFINITE;
- info->ulRwSessionCount = CK_EFFECTIVELY_INFINITE;
- info->ulMaxPinLen = MAX_PIN_LEN;
- info->ulMinPinLen = MIN_PIN_LEN;
- info->ulTotalPublicMemory = CK_UNAVAILABLE_INFORMATION;
- info->ulFreePublicMemory = CK_UNAVAILABLE_INFORMATION;
- info->ulTotalPrivateMemory = CK_UNAVAILABLE_INFORMATION;
- info->ulFreePrivateMemory = CK_UNAVAILABLE_INFORMATION;
- info->hardwareVersion.major = HARDWARE_VERSION_MAJOR;
- info->hardwareVersion.minor = HARDWARE_VERSION_MINOR;
- info->firmwareVersion.major = FIRMWARE_VERSION_MAJOR;
- 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);
-}
-
-static CK_RV
-CC_C_GetMechanismList(CK_SLOT_ID id, CK_MECHANISM_TYPE_PTR mechanism_list,
- CK_ULONG_PTR count)
-{
- CK_ULONG n_mechs;
-
- ENTER(C_GetMechanismList);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
- PREREQ(count, CKR_ARGUMENTS_BAD);
-
- if(!ckcapi_token_is_valid(id))
- RETURN(CKR_SLOT_ID_INVALID);
-
- n_mechs = sizeof(all_mechanisms) / sizeof(all_mechanisms[0]);
-
- if(mechanism_list == NULL)
- {
- *count = n_mechs;
- RETURN(CKR_OK);
- }
-
- if(*count < n_mechs)
- {
- *count = n_mechs;
- RETURN(CKR_BUFFER_TOO_SMALL);
- }
-
- memcpy(mechanism_list, all_mechanisms,
- n_mechs * sizeof(CK_MECHANISM_TYPE));
- *count = n_mechs;
- RETURN(CKR_OK);
-}
-
-static CK_RV
-CC_C_GetMechanismInfo(CK_SLOT_ID id, CK_MECHANISM_TYPE type,
- CK_MECHANISM_INFO_PTR info)
-{
- ENTER(C_GetMechanismInfo);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
- PREREQ(info, CKR_ARGUMENTS_BAD);
-
- if(!ckcapi_token_is_valid(id))
- RETURN(CKR_SLOT_ID_INVALID);
-
- if(type == CKM_RSA_PKCS)
- {
- ckcapi_rsa_pkcs_get_info(type, info);
- RETURN(CKR_OK);
- }
-
- RETURN(CKR_MECHANISM_INVALID);
-}
-
-static CK_RV
-CC_C_InitToken(CK_SLOT_ID slot_id, CK_UTF8CHAR_PTR pin, CK_ULONG pin_len,
- CK_UTF8CHAR_PTR label)
-{
- ENTER(C_InitToken);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_WaitForSlotEvent(CK_FLAGS flags, CK_SLOT_ID_PTR pSlot, CK_VOID_PTR pReserved)
-{
- ENTER(C_WaitForSlotEvent);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /*
- * PKCS#11 GRAY AREA: What happens when we know we'll *never*
- * have any slot events, and someone calls us without CKR_DONT_BLOCK?
- * In case there's a thread dedicated to calling this function in a
- * loop, we wait 1 seconds when called without CKR_DONT_BLOCK.
- */
-
- if(!(flags & CKF_DONT_BLOCK))
- Sleep(1000);
-
- RETURN(CKR_NO_EVENT);
-}
-
-static CK_RV
-CC_C_OpenSession(CK_SLOT_ID id, CK_FLAGS flags, CK_VOID_PTR application,
- CK_NOTIFY notify, CK_SESSION_HANDLE_PTR session)
-{
- CkCapiSession* sess;
- CK_RV ret;
-
- ENTER(C_OpenSession);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
- PREREQ(session, CKR_ARGUMENTS_BAD);
- PREREQ(flags & CKF_SERIAL_SESSION, CKR_SESSION_PARALLEL_NOT_SUPPORTED);
-
- if(!ckcapi_token_is_valid(id))
- RETURN(CKR_SLOT_ID_INVALID);
-
- ret = ckcapi_session_create(id, &sess);
- if(ret != CKR_OK)
- RETURN(ret);
-
- sess->notify_callback = notify;
- sess->user_data = application;
-
- if(flags & CKF_RW_SESSION)
- sess->read_write = TRUE;
-
- ret = ckcapi_session_register(sess);
- if(ret == CKR_OK)
- {
- /* ID should have been assigned when registering */
- ASSERT(sess->id > 0);
- *session = sess->id;
- }
- else
- {
- ckcapi_session_destroy(sess);
- }
-
- RETURN(ret);
-}
-
-static CK_RV
-CC_C_CloseSession(CK_SESSION_HANDLE session)
-{
- CkCapiSession* sess;
- CK_RV ret;
-
- ENTER(C_CloseSession);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- ret = ckcapi_session_remove_lock_ref(session, &sess);
- if(ret == CKR_OK)
- {
- /* This will unref and possibly destroy the session */
- ckcapi_session_unref_unlock(sess);
- }
-
- RETURN(ret);
-}
-
-static CK_RV
-CC_C_CloseAllSessions(CK_SLOT_ID id)
-{
- ENTER(C_CloseAllSession);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- if(!ckcapi_token_is_valid(id))
- RETURN(CKR_SLOT_ID_INVALID);
-
- ckcapi_session_close_all(id);
- RETURN(CKR_OK);
-}
-
-static CK_RV
-CC_C_GetFunctionStatus(CK_SESSION_HANDLE session)
-{
- ENTER(C_GetFunctionStatus);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
- RETURN(CKR_FUNCTION_NOT_PARALLEL);
-}
-
-static CK_RV
-CC_C_CancelFunction(CK_SESSION_HANDLE session)
-{
- ENTER(C_CancelFunction);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
- RETURN(CKR_FUNCTION_NOT_PARALLEL);
-}
-
-static CK_RV
-CC_C_GetSessionInfo(CK_SESSION_HANDLE session, CK_SESSION_INFO_PTR info)
-{
- CkCapiSession* sess;
- CK_RV ret;
-
- ENTER(C_GetSessionInfo);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
- PREREQ(info, CKR_ARGUMENTS_BAD);
-
- ret = ckcapi_session_get_lock_ref(session, FALSE, &sess);
- if(ret == CKR_OK)
- {
- ckcapi_session_get_info(sess, info);
- ckcapi_session_unref_unlock(sess);
- }
-
- RETURN(ret);
-}
-
-static CK_RV
-CC_C_InitPIN(CK_SESSION_HANDLE session, CK_UTF8CHAR_PTR pin,
- CK_ULONG pin_len)
-{
- ENTER(C_InitPIN);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* We don't support this stuff. We don't support 'SO' logins. */
- RETURN(CKR_USER_NOT_LOGGED_IN);
-}
-
-static CK_RV
-CC_C_SetPIN(CK_SESSION_HANDLE session, CK_UTF8CHAR_PTR old_pin,
- CK_ULONG old_len, CK_UTF8CHAR_PTR new_pin, CK_ULONG new_len)
-{
- ENTER(C_SetPIN);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* Not supported, Windows takes care of this */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_GetOperationState(CK_SESSION_HANDLE session, CK_BYTE_PTR operation_state,
- CK_ULONG_PTR operation_state_len)
-{
- ENTER(C_GetOperationState);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* Nasty, no sirrr */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_SetOperationState(CK_SESSION_HANDLE session, CK_BYTE_PTR operation_state,
- CK_ULONG operation_state_len, CK_OBJECT_HANDLE encryption_key,
- CK_OBJECT_HANDLE authentication_key)
-{
- ENTER(C_SetOperationState);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* Nasty, no sirrr */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_Login(CK_SESSION_HANDLE session, CK_USER_TYPE user_type,
- CK_UTF8CHAR_PTR pin, CK_ULONG pin_len)
-{
- CkCapiSession* sess;
- CK_RV ret;
-
- ENTER(C_Login);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- ret = ckcapi_session_get_lock_ref(session, FALSE, &sess);
- if(ret == CKR_OK)
- {
- switch(user_type)
- {
- case CKU_USER:
- ret = ckcapi_token_login(sess->slot);
- break;
- case CKU_SO:
- ret = CKR_USER_TYPE_INVALID;
- break;
- default:
- ret = CKR_USER_TYPE_INVALID;
- break;
- }
-
- ckcapi_session_unref_unlock(sess);
- }
-
- RETURN(ret);
-}
-
-static CK_RV
-CC_C_Logout(CK_SESSION_HANDLE session)
-{
- CkCapiSession* sess;
- CK_RV ret;
-
- ENTER(C_Logout);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- ret = ckcapi_session_get_lock_ref(session, FALSE, &sess);
- if(ret == CKR_OK)
- {
- ret = ckcapi_token_logout(sess->slot);
- ckcapi_session_unref_unlock(sess);
- }
-
- RETURN(ret);
-}
-
-static CK_RV
-CC_C_CreateObject(CK_SESSION_HANDLE session, CK_ATTRIBUTE_PTR templ,
- CK_ULONG count, CK_OBJECT_HANDLE_PTR object)
-{
- ENTER(C_CreateObject);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* TODO: See if we need to support this */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_CopyObject(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE object,
- CK_ATTRIBUTE_PTR templ, CK_ULONG count,
- CK_OBJECT_HANDLE_PTR new_object)
-{
- ENTER(C_CopyObject);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* TODO: See if we need to support this */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-
-static CK_RV
-CC_C_DestroyObject(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE object)
-{
- ENTER(C_DestroyObject);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* TODO: See if we need to support this */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_GetObjectSize(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE object,
- CK_ULONG_PTR size)
-{
- ENTER(C_GetObjectSize);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* TODO: Implement this */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_GetAttributeValue(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE object,
- CK_ATTRIBUTE_PTR templ, CK_ULONG count)
-{
- CkCapiSession* sess;
- CkCapiObjectData* objdata;
- CK_RV ret;
-
- ENTER(C_GetAttributeValue);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
- PREREQ(object, CKR_OBJECT_HANDLE_INVALID);
- PREREQ(!count || templ, CKR_ARGUMENTS_BAD);
-
- ret = ckcapi_session_get_lock_ref(session, FALSE, &sess);
- if(ret == CKR_OK)
- {
- ret = ckcapi_session_get_object_data_for(sess, object, &objdata);
- if(ret == CKR_OK)
- ret = ckcapi_object_data_get_attrs(objdata, templ, count);
-
- ckcapi_session_unref_unlock(sess);
- }
-
- RETURN(ret);
-}
-
-static CK_RV
-CC_C_SetAttributeValue(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE object,
- CK_ATTRIBUTE_PTR templ, CK_ULONG count)
-{
- ENTER(C_SetAttributeValue);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* TODO: See if we need to implement this */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_FindObjectsInit(CK_SESSION_HANDLE session, CK_ATTRIBUTE_PTR templ,
- CK_ULONG count)
-{
- CkCapiSession* sess;
- CK_RV ret;
-
- ENTER(C_FindObjectsInit);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
- PREREQ(!count || templ, CKR_ARGUMENTS_BAD);
-
- ret = ckcapi_session_get_lock_ref(session, FALSE, &sess);
- if(ret == CKR_OK)
- {
- ret = ckcapi_session_find_init(sess, templ, count);
- ckcapi_session_unref_unlock(sess);
- }
-
- RETURN(ret);
-}
-
-static CK_RV
-CC_C_FindObjects(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE_PTR objects,
- CK_ULONG max_object_count, CK_ULONG_PTR object_count)
-{
- CkCapiSession* sess;
- CK_RV ret;
-
- ENTER(C_FindObjects);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
- PREREQ(object_count, CKR_ARGUMENTS_BAD);
- PREREQ(!max_object_count || objects, CKR_ARGUMENTS_BAD);
-
- ret = ckcapi_session_get_lock_ref(session, FALSE, &sess);
- if(ret == CKR_OK)
- {
- ret = ckcapi_session_find(sess, objects, max_object_count, object_count);
- ckcapi_session_unref_unlock(sess);
- }
-
- RETURN(ret);
-}
-
-static CK_RV
-CC_C_FindObjectsFinal(CK_SESSION_HANDLE session)
-{
- CkCapiSession* sess;
- CK_RV ret;
-
- ENTER(C_FindObjectsFinal);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- ret = ckcapi_session_get_lock_ref(session, FALSE, &sess);
- if(ret == CKR_OK)
- {
- ret = ckcapi_session_find_final(sess);
- ckcapi_session_unref_unlock(sess);
- }
-
- RETURN(ret);
-}
-
-static CK_RV
-CC_C_EncryptInit(CK_SESSION_HANDLE session, CK_MECHANISM_PTR mechanism,
- CK_OBJECT_HANDLE key)
-{
- ENTER(C_EncryptInit);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* TODO: See if we need to implement this */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_Encrypt(CK_SESSION_HANDLE session, CK_BYTE_PTR data, CK_ULONG data_len,
- CK_BYTE_PTR encrypted_data, CK_ULONG_PTR encrypted_data_len)
-{
- ENTER(C_Encrypt);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* TODO: See if we need to implement this */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_EncryptUpdate(CK_SESSION_HANDLE session, CK_BYTE_PTR part,
- CK_ULONG part_len, CK_BYTE_PTR encrypted_part,
- CK_ULONG_PTR encrypted_part_len)
-{
- ENTER(C_EncryptUpdate);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* RSA/DSA mechs don't support incremental crypto operations. */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_EncryptFinal(CK_SESSION_HANDLE session, CK_BYTE_PTR last_encrypted_part,
- CK_ULONG_PTR last_encrypted_part_len)
-{
- ENTER(C_EncryptFinal);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* RSA/DSA mechs don't support incremental crypto operations. */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_DecryptInit(CK_SESSION_HANDLE session, CK_MECHANISM_PTR mechanism,
- CK_OBJECT_HANDLE key)
-{
- CkCapiObjectData* objdata;
- CkCapiSession* sess;
- CK_RV ret;
-
- ENTER(C_DecryptInit);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
- PREREQ(mechanism, CKR_ARGUMENTS_BAD);
- PREREQ(key, CKR_ARGUMENTS_BAD);
-
- ret = ckcapi_session_get_lock_ref(session, FALSE, &sess);
- if(ret == CKR_OK)
- {
- ret = ckcapi_session_get_object_data_for(sess, key, &objdata);
- if(ret == CKR_OK)
- ret = ckcapi_session_decrypt_init(sess, mechanism, objdata);
-
- ckcapi_session_unref_unlock(sess);
- }
-
- RETURN(ret);
-}
-
-static CK_RV
-CC_C_Decrypt(CK_SESSION_HANDLE session, CK_BYTE_PTR encrypted_data,
- CK_ULONG encrypted_data_len, CK_BYTE_PTR data, CK_ULONG_PTR data_len)
-{
- CkCapiSession* sess;
- CK_RV ret;
-
- ENTER(C_Decrypt);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
- PREREQ(encrypted_data, CKR_ARGUMENTS_BAD);
- PREREQ(encrypted_data_len, CKR_ARGUMENTS_BAD);
-
- ret = ckcapi_session_get_lock_ref(session, FALSE, &sess);
- if(ret == CKR_OK)
- {
- ret = ckcapi_session_decrypt(sess, encrypted_data, encrypted_data_len,
- data, data_len);
- ckcapi_session_unref_unlock(sess);
- }
-
- RETURN(ret);
-}
-
-static CK_RV
-CC_C_DecryptUpdate(CK_SESSION_HANDLE session, CK_BYTE_PTR encrypted_part,
- CK_ULONG encrypted_part_len, CK_BYTE_PTR part, CK_ULONG_PTR part_len)
-{
- ENTER(C_DecryptUpdate);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* RSA/DSA mechs don't support incremental crypto operations. */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_DecryptFinal(CK_SESSION_HANDLE session, CK_BYTE_PTR pLastPart,
- CK_ULONG_PTR last_part_len)
-{
- ENTER(C_DecryptFinal);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* RSA/DSA mechs don't support incremental crypto operations. */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_DigestInit(CK_SESSION_HANDLE session, CK_MECHANISM_PTR mechanism)
-{
- ENTER(C_DigestInit);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* RSA/DSA mechs don't support digest. */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_Digest(CK_SESSION_HANDLE session, CK_BYTE_PTR data, CK_ULONG data_len,
- CK_BYTE_PTR digest, CK_ULONG_PTR digest_len)
-{
- ENTER(C_Digest);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* RSA/DSA mechs don't support digest. */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_DigestUpdate(CK_SESSION_HANDLE session, CK_BYTE_PTR part, CK_ULONG part_len)
-{
- ENTER(C_DigestUpdate);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* RSA/DSA mechs don't support digest. */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_DigestKey(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE key)
-{
- ENTER(C_DigestKey);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* RSA/DSA mechs don't support digest. */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_DigestFinal(CK_SESSION_HANDLE session, CK_BYTE_PTR digest,
- CK_ULONG_PTR digest_len)
-{
- ENTER(C_DigestFinal);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* RSA/DSA mechs don't support digest. */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_SignInit(CK_SESSION_HANDLE session, CK_MECHANISM_PTR mechanism,
- CK_OBJECT_HANDLE key)
-{
- CkCapiObjectData* objdata;
- CkCapiSession* sess;
- CK_RV ret;
-
- ENTER(C_SignInit);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
- PREREQ(mechanism, CKR_ARGUMENTS_BAD);
- PREREQ(key, CKR_ARGUMENTS_BAD);
-
- ret = ckcapi_session_get_lock_ref(session, FALSE, &sess);
- if(ret == CKR_OK)
- {
- ret = ckcapi_session_get_object_data_for(sess, key, &objdata);
- if(ret == CKR_OK)
- ret = ckcapi_session_sign_init(sess, mechanism, objdata);
-
- ckcapi_session_unref_unlock(sess);
- }
-
- RETURN(ret);
-}
-
-static CK_RV
-CC_C_Sign(CK_SESSION_HANDLE session, CK_BYTE_PTR data, CK_ULONG data_len,
- CK_BYTE_PTR signature, CK_ULONG_PTR signature_len)
-{
- CkCapiSession* sess;
- CK_RV ret;
-
- ENTER(C_Sign);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
- PREREQ(data, CKR_ARGUMENTS_BAD);
- PREREQ(data_len, CKR_ARGUMENTS_BAD);
-
- ret = ckcapi_session_get_lock_ref(session, FALSE, &sess);
- if(ret == CKR_OK)
- {
- ret = ckcapi_session_sign(sess, data, data_len, signature, signature_len);
- ckcapi_session_unref_unlock(sess);
- }
-
- RETURN(ret);
-}
-
-static CK_RV
-CC_C_SignUpdate(CK_SESSION_HANDLE session, CK_BYTE_PTR part, CK_ULONG part_len)
-{
- ENTER(C_SignUpdate);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* RSA/DSA mechs don't support incremental crypto operations. */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_SignFinal(CK_SESSION_HANDLE session, CK_BYTE_PTR signature,
- CK_ULONG_PTR signature_len)
-{
- ENTER(C_SignFinal);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* RSA/DSA mechs don't support incremental crypto operations. */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_SignRecoverInit(CK_SESSION_HANDLE session, CK_MECHANISM_PTR mechanism,
- CK_OBJECT_HANDLE key)
-{
- ENTER(C_SignRecoverInit);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* TODO: Implement this */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_SignRecover(CK_SESSION_HANDLE session, CK_BYTE_PTR data, CK_ULONG data_len,
- CK_BYTE_PTR signature, CK_ULONG_PTR signature_len)
-{
- ENTER(C_SignRecover);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* TODO: Implement this */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_VerifyInit(CK_SESSION_HANDLE session, CK_MECHANISM_PTR mechanism,
- CK_OBJECT_HANDLE key)
-{
- ENTER(C_VerifyInit);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* TODO: See if we need to implement this */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_Verify(CK_SESSION_HANDLE session, CK_BYTE_PTR data, CK_ULONG data_len,
- CK_BYTE_PTR signature, CK_ULONG signature_len)
-{
- ENTER(C_Verify);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* TODO: See if we need to implement this */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_VerifyUpdate(CK_SESSION_HANDLE session, CK_BYTE_PTR part, CK_ULONG part_len)
-{
- ENTER(C_VerifyUpdate);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* RSA/DSA mechs don't support incremental crypto operations. */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_VerifyFinal(CK_SESSION_HANDLE session, CK_BYTE_PTR signature,
- CK_ULONG signature_len)
-{
- ENTER(C_VerifyFinal);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* RSA/DSA mechs don't support incremental crypto operations. */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_VerifyRecoverInit(CK_SESSION_HANDLE session, CK_MECHANISM_PTR mechanism,
- CK_OBJECT_HANDLE key)
-{
- ENTER(C_VerifyRecoverInit);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* TODO: See if we need to implement this */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_VerifyRecover(CK_SESSION_HANDLE session, CK_BYTE_PTR signature,
- CK_ULONG signature_len, CK_BYTE_PTR data, CK_ULONG_PTR data_len)
-{
- ENTER(C_VerifyRecover);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* TODO: See if we need to implement this */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_DigestEncryptUpdate(CK_SESSION_HANDLE session, CK_BYTE_PTR part,
- CK_ULONG part_len, CK_BYTE_PTR encrypted_part,
- CK_ULONG_PTR encrypted_part_len)
-{
- ENTER(C_DigestEncryptUpdate);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* RSA/DSA mechs don't support incremental crypto operations. */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_DecryptDigestUpdate(CK_SESSION_HANDLE session, CK_BYTE_PTR encrypted_part,
- CK_ULONG encrypted_part_len, CK_BYTE_PTR part,
- CK_ULONG_PTR part_len)
-{
- ENTER(C_DecryptDigestUpdate);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* RSA/DSA mechs don't support incremental crypto operations. */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_SignEncryptUpdate(CK_SESSION_HANDLE session, CK_BYTE_PTR part,
- CK_ULONG part_len, CK_BYTE_PTR encrypted_part,
- CK_ULONG_PTR encrypted_part_len)
-{
- ENTER(C_SignEncryptUpdate);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* RSA/DSA mechs don't support incremental crypto operations. */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_DecryptVerifyUpdate(CK_SESSION_HANDLE session, CK_BYTE_PTR encrypted_part,
- CK_ULONG encrypted_part_len, CK_BYTE_PTR part,
- CK_ULONG_PTR part_len)
-{
- ENTER(C_DecryptVerifyUpdate);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* RSA/DSA mechs don't support incremental crypto operations. */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_GenerateKey(CK_SESSION_HANDLE session, CK_MECHANISM_PTR mechanism,
- CK_ATTRIBUTE_PTR templ, CK_ULONG count,
- CK_OBJECT_HANDLE_PTR key)
-{
- ENTER(C_GenerateKey);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* Let key generation happen via Windows interfaces */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_GenerateKeyPair(CK_SESSION_HANDLE session, CK_MECHANISM_PTR mechanism,
- CK_ATTRIBUTE_PTR public_key_template, CK_ULONG public_key_attribute_count,
- CK_ATTRIBUTE_PTR private_key_template, CK_ULONG private_key_attribute_count,
- CK_OBJECT_HANDLE_PTR public_key, CK_OBJECT_HANDLE_PTR private_key)
-{
- ENTER(C_GenerateKeyPair);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* Let key generation happen via Windows interfaces */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_WrapKey(CK_SESSION_HANDLE session, CK_MECHANISM_PTR mechanism,
- CK_OBJECT_HANDLE wrapping_key, CK_OBJECT_HANDLE key,
- CK_BYTE_PTR wrapped_key, CK_ULONG_PTR wrapped_key_len)
-{
- ENTER(C_WrapKey);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* TODO: See if we need to implement this */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_UnwrapKey(CK_SESSION_HANDLE session, CK_MECHANISM_PTR mechanism,
- CK_OBJECT_HANDLE unwrapping_key, CK_BYTE_PTR wrapped_key,
- CK_ULONG wrapped_key_len, CK_ATTRIBUTE_PTR templ,
- CK_ULONG count, CK_OBJECT_HANDLE_PTR key)
-{
- ENTER(C_UnwrapKey);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* TODO: See if we need to implement this */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_DeriveKey(CK_SESSION_HANDLE session, CK_MECHANISM_PTR mechanism,
- CK_OBJECT_HANDLE base_key, CK_ATTRIBUTE_PTR templ,
- CK_ULONG count, CK_OBJECT_HANDLE_PTR key)
-{
- ENTER(C_DeriveKey);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* Can't do this with RSA */
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_SeedRandom(CK_SESSION_HANDLE session, CK_BYTE_PTR seed, CK_ULONG seed_len)
-{
- ENTER(C_SeedRandom);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /*
- * TODO: Perhaps at some point in the future we may want
- * to see if we can hook into the Windows RNG
- */
-
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_RV
-CC_C_GenerateRandom(CK_SESSION_HANDLE session, CK_BYTE_PTR random_data,
- CK_ULONG random_len)
-{
- ENTER(C_GenerateRandom);
- PREREQ(cryptoki_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /*
- * TODO: Perhaps at some point in the future we may want
- * to see if we can hook into the Windows RNG
- */
-
- RETURN(CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-static CK_FUNCTION_LIST functionList = {
- { 2, 11 }, /* version */
- CC_C_Initialize,
- CC_C_Finalize,
- CC_C_GetInfo,
- CC_C_GetFunctionList,
- CC_C_GetSlotList,
- CC_C_GetSlotInfo,
- CC_C_GetTokenInfo,
- CC_C_GetMechanismList,
- CC_C_GetMechanismInfo,
- CC_C_InitToken,
- CC_C_InitPIN,
- CC_C_SetPIN,
- CC_C_OpenSession,
- CC_C_CloseSession,
- CC_C_CloseAllSessions,
- CC_C_GetSessionInfo,
- CC_C_GetOperationState,
- CC_C_SetOperationState,
- CC_C_Login,
- CC_C_Logout,
- CC_C_CreateObject,
- CC_C_CopyObject,
- CC_C_DestroyObject,
- CC_C_GetObjectSize,
- CC_C_GetAttributeValue,
- CC_C_SetAttributeValue,
- CC_C_FindObjectsInit,
- CC_C_FindObjects,
- CC_C_FindObjectsFinal,
- CC_C_EncryptInit,
- CC_C_Encrypt,
- CC_C_EncryptUpdate,
- CC_C_EncryptFinal,
- CC_C_DecryptInit,
- CC_C_Decrypt,
- CC_C_DecryptUpdate,
- CC_C_DecryptFinal,
- CC_C_DigestInit,
- CC_C_Digest,
- CC_C_DigestUpdate,
- CC_C_DigestKey,
- CC_C_DigestFinal,
- CC_C_SignInit,
- CC_C_Sign,
- CC_C_SignUpdate,
- CC_C_SignFinal,
- CC_C_SignRecoverInit,
- CC_C_SignRecover,
- CC_C_VerifyInit,
- CC_C_Verify,
- CC_C_VerifyUpdate,
- CC_C_VerifyFinal,
- CC_C_VerifyRecoverInit,
- CC_C_VerifyRecover,
- CC_C_DigestEncryptUpdate,
- CC_C_DecryptDigestUpdate,
- CC_C_SignEncryptUpdate,
- CC_C_DecryptVerifyUpdate,
- CC_C_GenerateKey,
- CC_C_GenerateKeyPair,
- CC_C_WrapKey,
- CC_C_UnwrapKey,
- CC_C_DeriveKey,
- CC_C_SeedRandom,
- CC_C_GenerateRandom,
- CC_C_GetFunctionStatus,
- CC_C_CancelFunction,
- CC_C_WaitForSlotEvent
-};
-
-__declspec(dllexport) CK_RV
-C_GetFunctionList(CK_FUNCTION_LIST_PTR_PTR list)
-{
- if(!list)
- return CKR_ARGUMENTS_BAD;
-
- *list = &functionList;
- return CKR_OK;
-}