4
* Copyright (C) 2010 Stefan Walter
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU Lesser General Public License as
8
* published by the Free Software Foundation; either version 2.1 of
9
* the License, or (at your option) any later version.
11
* This program is distributed in the hope that it will be useful, but
12
* WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
35
* This is *NOT* how you'd want to implement a PKCS#11 module. This
36
* fake module simply provides enough for gck library to test against.
37
* It doesn't pass any tests, or behave as expected from a PKCS#11 module.
41
static gboolean initialized = FALSE;
42
static gchar *the_pin = NULL;
43
static gulong n_the_pin = 0;
45
static gboolean logged_in = FALSE;
46
static CK_USER_TYPE user_type = 0;
47
static CK_FUNCTION_LIST functionList;
49
typedef enum _Operation {
54
typedef struct _Session {
55
CK_SESSION_HANDLE handle;
61
/* For find operations */
64
/* For crypto operations */
65
CK_OBJECT_HANDLE crypto_key;
66
CK_ATTRIBUTE_TYPE crypto_method;
67
CK_MECHANISM_TYPE crypto_mechanism;
68
CK_BBOOL want_context_login;
70
/* For 'signing' with CKM_MOCK_PREFIX */
71
CK_BYTE sign_prefix[128];
72
CK_ULONG n_sign_prefix;
75
static guint unique_identifier = 100;
76
static GHashTable *the_sessions = NULL;
77
static GHashTable *the_objects = NULL;
80
PRIVATE_KEY_CAPITALIZE = 3,
81
PUBLIC_KEY_CAPITALIZE = 4,
82
PRIVATE_KEY_PREFIX = 5,
86
#define SIGNED_PREFIX "signed-prefix:"
89
free_session (gpointer data)
91
Session *sess = (Session*)data;
93
g_hash_table_destroy (sess->objects);
97
static GckAttributes *
98
lookup_object (Session *session,
99
CK_OBJECT_HANDLE hObject,
102
GckAttributes *attrs;
104
attrs = g_hash_table_lookup (the_objects, GUINT_TO_POINTER (hObject));
107
*table = the_objects;
111
attrs = g_hash_table_lookup (session->objects, GUINT_TO_POINTER (hObject));
114
*table = session->objects;
122
gck_mock_module_add_object (GckAttributes *attrs)
128
g_return_val_if_fail (the_objects, 0);
131
handle = ++unique_identifier;
132
if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token)) {
133
g_return_val_if_fail (token == TRUE, 0);
134
gck_attributes_ref_sink (attrs);
136
gck_builder_init (&builder);
137
gck_builder_add_except (&builder, attrs, CKA_TOKEN, GCK_INVALID);
138
gck_builder_add_boolean (&builder, CKA_TOKEN, TRUE);
139
gck_attributes_unref (attrs);
140
attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
142
g_hash_table_insert (the_objects, GUINT_TO_POINTER (handle), attrs);
148
gck_mock_module_enumerate_objects (CK_SESSION_HANDLE handle, GckMockEnumerator func,
156
g_assert (the_objects);
160
g_hash_table_iter_init (&iter, the_objects);
161
while (g_hash_table_iter_next (&iter, &key, &value)) {
162
if (!(func) (GPOINTER_TO_UINT (key), value, user_data))
166
/* session objects */
168
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (handle));
170
g_hash_table_iter_init (&iter, session->objects);
171
while (g_hash_table_iter_next (&iter, &key, &value)) {
172
if (!(func) (GPOINTER_TO_UINT (key), value, user_data))
179
typedef struct _FindObject {
180
CK_ATTRIBUTE_PTR attrs;
182
CK_OBJECT_HANDLE object;
186
enumerate_and_find_object (CK_OBJECT_HANDLE object, GckAttributes *attrs, gpointer user_data)
188
FindObject *ctx = user_data;
189
CK_ATTRIBUTE_PTR match;
190
const GckAttribute *attr;
193
for (i = 0; i < ctx->n_attrs; ++i) {
194
match = ctx->attrs + i;
195
attr = gck_attributes_find (attrs, match->type);
197
return TRUE; /* Continue */
199
if (attr->length != match->ulValueLen ||
200
memcmp (attr->value, match->pValue, attr->length) != 0)
201
return TRUE; /* Continue */
204
ctx->object = object;
205
return FALSE; /* Stop iteration */
209
gck_mock_module_find_object (CK_SESSION_HANDLE session, CK_ATTRIBUTE_PTR attrs, CK_ULONG n_attrs)
214
ctx.n_attrs = n_attrs;
217
gck_mock_module_enumerate_objects (session, enumerate_and_find_object, &ctx);
223
enumerate_and_count_objects (CK_OBJECT_HANDLE object, GckAttributes *attrs, gpointer user_data)
225
guint *n_objects = user_data;
227
return TRUE; /* Continue */
231
gck_mock_module_count_objects (CK_SESSION_HANDLE session)
234
gck_mock_module_enumerate_objects (session, enumerate_and_count_objects, &n_objects);
238
static GckAttributes *
239
replace_attributes (GckAttributes *atts,
240
CK_ATTRIBUTE_PTR attrs,
245
CK_ATTRIBUTE_PTR set;
249
return gck_attributes_ref_sink (atts);
251
gck_builder_init (&builder);
252
types = g_new0 (gulong, n_attrs);
253
for (i = 0; i < n_attrs; ++i) {
255
types[i] = set->type;
256
gck_builder_add_data (&builder, set->type, set->pValue, set->ulValueLen);
258
gck_builder_add_exceptv (&builder, atts, types, n_attrs);
260
return gck_attributes_ref_sink (gck_builder_end (&builder));
264
gck_mock_module_set_object (CK_OBJECT_HANDLE object, CK_ATTRIBUTE_PTR attrs,
268
GckAttributes *replaced;
270
g_return_if_fail (object != 0);
271
g_return_if_fail (the_objects);
273
atts = g_hash_table_lookup (the_objects, GUINT_TO_POINTER (object));
274
g_return_if_fail (atts);
279
replaced = replace_attributes (atts, attrs, n_attrs);
280
g_hash_table_replace (the_objects, GUINT_TO_POINTER (object), replaced);
284
gck_mock_module_set_pin (const gchar *password)
287
the_pin = g_strdup (password);
288
n_the_pin = strlen (password);
292
gck_mock_C_Initialize (CK_VOID_PTR pInitArgs)
296
CK_C_INITIALIZE_ARGS_PTR args;
298
g_return_val_if_fail (initialized == FALSE, CKR_CRYPTOKI_ALREADY_INITIALIZED);
300
args = (CK_C_INITIALIZE_ARGS_PTR)pInitArgs;
302
g_return_val_if_fail(
303
(args->CreateMutex == NULL && args->DestroyMutex == NULL &&
304
args->LockMutex == NULL && args->UnlockMutex == NULL) ||
305
(args->CreateMutex != NULL && args->DestroyMutex != NULL &&
306
args->LockMutex != NULL && args->UnlockMutex != NULL),
309
/* Flags should allow OS locking and os threads */
310
g_return_val_if_fail ((args->flags & CKF_OS_LOCKING_OK), CKR_CANT_LOCK);
311
g_return_val_if_fail ((args->flags & CKF_LIBRARY_CANT_CREATE_OS_THREADS) == 0, CKR_NEED_TO_CREATE_THREADS);
314
the_pin = g_strdup ("booo");
315
n_the_pin = strlen (the_pin);
316
the_sessions = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, free_session);
317
the_objects = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)gck_attributes_unref);
319
/* Our token object */
320
gck_builder_init (&builder);
321
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA);
322
gck_builder_add_string (&builder, CKA_LABEL, "TEST LABEL");
323
g_hash_table_insert (the_objects, GUINT_TO_POINTER (2),
324
gck_attributes_ref_sink (gck_builder_end (&builder)));
326
/* Private capitalize key */
327
value = CKM_MOCK_CAPITALIZE;
328
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY);
329
gck_builder_add_string (&builder, CKA_LABEL, "Private Capitalize Key");
330
gck_builder_add_data (&builder, CKA_ALLOWED_MECHANISMS, (const guchar *)&value, sizeof (value));
331
gck_builder_add_boolean (&builder, CKA_DECRYPT, CK_TRUE);
332
gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_TRUE);
333
gck_builder_add_boolean (&builder, CKA_WRAP, CK_TRUE);
334
gck_builder_add_boolean (&builder, CKA_UNWRAP, CK_TRUE);
335
gck_builder_add_boolean (&builder, CKA_DERIVE, CK_TRUE);
336
gck_builder_add_string (&builder, CKA_VALUE, "value");
337
gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique1");
338
g_hash_table_insert (the_objects, GUINT_TO_POINTER (PRIVATE_KEY_CAPITALIZE),
339
gck_attributes_ref_sink (gck_builder_end (&builder)));
341
/* Public capitalize key */
342
value = CKM_MOCK_CAPITALIZE;
343
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY);
344
gck_builder_add_string (&builder, CKA_LABEL, "Public Capitalize Key");
345
gck_builder_add_data (&builder, CKA_ALLOWED_MECHANISMS, (const guchar *)&value, sizeof (value));
346
gck_builder_add_boolean (&builder, CKA_ENCRYPT, CK_TRUE);
347
gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_FALSE);
348
gck_builder_add_string (&builder, CKA_VALUE, "value");
349
gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique2");
350
g_hash_table_insert (the_objects, GUINT_TO_POINTER (PUBLIC_KEY_CAPITALIZE), gck_builder_end (&builder));
352
/* Private prefix key */
353
value = CKM_MOCK_PREFIX;
354
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY);
355
gck_builder_add_string (&builder, CKA_LABEL, "Private prefix key");
356
gck_builder_add_data (&builder, CKA_ALLOWED_MECHANISMS, (const guchar *)&value, sizeof (value));
357
gck_builder_add_boolean (&builder, CKA_SIGN, CK_TRUE);
358
gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_TRUE);
359
gck_builder_add_boolean (&builder, CKA_ALWAYS_AUTHENTICATE, CK_TRUE);
360
gck_builder_add_string (&builder, CKA_VALUE, "value");
361
gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique3");
362
g_hash_table_insert (the_objects, GUINT_TO_POINTER (PRIVATE_KEY_PREFIX),
363
gck_attributes_ref_sink (gck_builder_end (&builder)));
365
/* Private prefix key */
366
value = CKM_MOCK_PREFIX;
367
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY);
368
gck_builder_add_string (&builder, CKA_LABEL, "Public prefix key");
369
gck_builder_add_data (&builder, CKA_ALLOWED_MECHANISMS, (const guchar *)&value, sizeof (value));
370
gck_builder_add_boolean (&builder, CKA_VERIFY, CK_TRUE);
371
gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_FALSE);
372
gck_builder_add_string (&builder, CKA_VALUE, "value");
373
gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique4");
374
g_hash_table_insert (the_objects, GUINT_TO_POINTER (PUBLIC_KEY_PREFIX),
375
gck_attributes_ref_sink (gck_builder_end (&builder)));
383
gck_mock_validate_and_C_Initialize (CK_VOID_PTR pInitArgs)
385
CK_C_INITIALIZE_ARGS_PTR args;
389
args = (CK_C_INITIALIZE_ARGS_PTR)pInitArgs;
391
g_assert ((args->CreateMutex) (NULL) == CKR_ARGUMENTS_BAD && "CreateMutex succeeded wrong");
392
g_assert ((args->DestroyMutex) (NULL) == CKR_MUTEX_BAD && "DestroyMutex succeeded wrong");
393
g_assert ((args->LockMutex) (NULL) == CKR_MUTEX_BAD && "LockMutex succeeded wrong");
394
g_assert ((args->UnlockMutex) (NULL) == CKR_MUTEX_BAD && "UnlockMutex succeeded wrong");
396
/* Try to create an actual mutex */
397
rv = (args->CreateMutex) (&mutex);
398
g_assert (rv == CKR_OK && "CreateMutex g_assert_not_reacheded");
399
g_assert (mutex != NULL && "CreateMutex created null mutex");
401
/* Try and lock the mutex */
402
rv = (args->LockMutex) (mutex);
403
g_assert (rv == CKR_OK && "LockMutex g_assert_not_reacheded");
405
/* Try and unlock the mutex */
406
rv = (args->UnlockMutex) (mutex);
407
g_assert (rv == CKR_OK && "UnlockMutex g_assert_not_reacheded");
409
/* Try and destroy the mutex */
410
rv = (args->DestroyMutex) (mutex);
411
g_assert (rv == CKR_OK && "DestroyMutex g_assert_not_reacheded");
414
return gck_mock_C_Initialize (pInitArgs);
418
gck_mock_C_Finalize (CK_VOID_PTR pReserved)
420
g_return_val_if_fail (pReserved == NULL, CKR_ARGUMENTS_BAD);
421
g_return_val_if_fail (initialized == TRUE, CKR_CRYPTOKI_NOT_INITIALIZED);
425
g_hash_table_destroy (the_objects);
428
g_hash_table_destroy (the_sessions);
435
static const CK_INFO TEST_INFO = {
436
{ CRYPTOKI_VERSION_MAJOR, CRYPTOKI_VERSION_MINOR },
437
"TEST MANUFACTURER ",
444
gck_mock_C_GetInfo (CK_INFO_PTR pInfo)
446
g_return_val_if_fail (pInfo, CKR_ARGUMENTS_BAD);
447
memcpy (pInfo, &TEST_INFO, sizeof (*pInfo));
452
gck_mock_C_GetFunctionList (CK_FUNCTION_LIST_PTR_PTR list)
454
g_return_val_if_fail (list, CKR_ARGUMENTS_BAD);
455
*list = &functionList;
462
* TWO: token not present
466
gck_mock_C_GetSlotList (CK_BBOOL tokenPresent, CK_SLOT_ID_PTR pSlotList, CK_ULONG_PTR pulCount)
470
g_return_val_if_fail (pulCount, CKR_ARGUMENTS_BAD);
472
count = tokenPresent ? 1 : 2;
474
/* Application only wants to know the number of slots. */
475
if (pSlotList == NULL) {
480
if (*pulCount < count)
481
g_return_val_if_reached (CKR_BUFFER_TOO_SMALL);
484
pSlotList[0] = GCK_MOCK_SLOT_ONE_ID;
486
pSlotList[1] = GCK_MOCK_SLOT_TWO_ID;
491
/* Update gck-mock.h URIs when updating this */
493
static const CK_SLOT_INFO TEST_INFO_ONE = {
495
"TEST MANUFACTURER ",
496
CKF_TOKEN_PRESENT | CKF_REMOVABLE_DEVICE,
501
/* Update gck-mock.h URIs when updating this */
503
static const CK_SLOT_INFO TEST_INFO_TWO = {
505
"TEST MANUFACTURER ",
506
CKF_REMOVABLE_DEVICE,
512
gck_mock_C_GetSlotInfo (CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo)
514
g_return_val_if_fail (pInfo, CKR_ARGUMENTS_BAD);
516
if (slotID == GCK_MOCK_SLOT_ONE_ID) {
517
memcpy (pInfo, &TEST_INFO_ONE, sizeof (*pInfo));
519
} else if (slotID == GCK_MOCK_SLOT_TWO_ID) {
520
memcpy (pInfo, &TEST_INFO_TWO, sizeof (*pInfo));
523
g_return_val_if_reached (CKR_SLOT_ID_INVALID);
527
/* Update gck-mock.h URIs when updating this */
529
static const CK_TOKEN_INFO TEST_TOKEN_ONE = {
531
"TEST MANUFACTURER ",
534
CKF_LOGIN_REQUIRED | CKF_USER_PIN_INITIALIZED | CKF_CLOCK_ON_TOKEN | CKF_TOKEN_INITIALIZED,
547
{ '1', '9', '9', '9', '0', '5', '2', '5', '0', '9', '1', '9', '5', '9', '0', '0' }
551
gck_mock_C_GetTokenInfo (CK_SLOT_ID slotID, CK_TOKEN_INFO_PTR pInfo)
553
g_return_val_if_fail (pInfo != NULL, CKR_ARGUMENTS_BAD);
555
if (slotID == GCK_MOCK_SLOT_ONE_ID) {
556
memcpy (pInfo, &TEST_TOKEN_ONE, sizeof (*pInfo));
558
} else if (slotID == GCK_MOCK_SLOT_TWO_ID) {
559
return CKR_TOKEN_NOT_PRESENT;
561
g_return_val_if_reached (CKR_SLOT_ID_INVALID);
566
gck_mock_fail_C_GetTokenInfo (CK_SLOT_ID slotID, CK_TOKEN_INFO_PTR pInfo)
568
return CKR_GENERAL_ERROR;
573
* CKM_MOCK_CAPITALIZE
578
gck_mock_C_GetMechanismList (CK_SLOT_ID slotID, CK_MECHANISM_TYPE_PTR pMechanismList,
579
CK_ULONG_PTR pulCount)
581
g_return_val_if_fail (slotID == GCK_MOCK_SLOT_ONE_ID, CKR_SLOT_ID_INVALID);
582
g_return_val_if_fail (pulCount, CKR_ARGUMENTS_BAD);
584
/* Application only wants to know the number of slots. */
585
if (pMechanismList == NULL) {
591
g_return_val_if_reached (CKR_BUFFER_TOO_SMALL);
593
pMechanismList[0] = CKM_MOCK_CAPITALIZE;
594
pMechanismList[1] = CKM_MOCK_PREFIX;
598
static const CK_MECHANISM_INFO TEST_MECH_CAPITALIZE = {
602
static const CK_MECHANISM_INFO TEST_MECH_PREFIX = {
607
gck_mock_C_GetMechanismInfo (CK_SLOT_ID slotID, CK_MECHANISM_TYPE type,
608
CK_MECHANISM_INFO_PTR pInfo)
610
g_return_val_if_fail (slotID == GCK_MOCK_SLOT_ONE_ID, CKR_SLOT_ID_INVALID);
611
g_return_val_if_fail (pInfo, CKR_ARGUMENTS_BAD);
613
if (type == CKM_MOCK_CAPITALIZE) {
614
memcpy (pInfo, &TEST_MECH_CAPITALIZE, sizeof (*pInfo));
616
} else if (type == CKM_MOCK_PREFIX) {
617
memcpy (pInfo, &TEST_MECH_PREFIX, sizeof (*pInfo));
620
g_return_val_if_reached (CKR_MECHANISM_INVALID);
625
gck_mock_specific_args_C_InitToken (CK_SLOT_ID slotID, CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen,
626
CK_UTF8CHAR_PTR pLabel)
628
g_return_val_if_fail (slotID == GCK_MOCK_SLOT_ONE_ID, CKR_SLOT_ID_INVALID);
630
g_return_val_if_fail (pPin, CKR_PIN_INVALID);
631
g_return_val_if_fail (strlen ("TEST PIN") == ulPinLen, CKR_PIN_INVALID);
632
g_return_val_if_fail (strncmp ((gchar*)pPin, "TEST PIN", ulPinLen) == 0, CKR_PIN_INVALID);
633
g_return_val_if_fail (pLabel != NULL, CKR_PIN_INVALID);
634
g_return_val_if_fail (strcmp ((gchar*)pPin, "TEST LABEL") == 0, CKR_PIN_INVALID);
637
the_pin = g_strndup ((gchar*)pPin, ulPinLen);
638
n_the_pin = ulPinLen;
643
gck_mock_unsupported_C_WaitForSlotEvent (CK_FLAGS flags, CK_SLOT_ID_PTR pSlot, CK_VOID_PTR pReserved)
645
return CKR_FUNCTION_NOT_SUPPORTED;
649
gck_mock_C_OpenSession (CK_SLOT_ID slotID, CK_FLAGS flags, CK_VOID_PTR pApplication,
650
CK_NOTIFY Notify, CK_SESSION_HANDLE_PTR phSession)
654
g_return_val_if_fail (slotID == GCK_MOCK_SLOT_ONE_ID || slotID == GCK_MOCK_SLOT_TWO_ID, CKR_SLOT_ID_INVALID);
655
g_return_val_if_fail (phSession != NULL, CKR_ARGUMENTS_BAD);
656
g_return_val_if_fail ((flags & CKF_SERIAL_SESSION) == CKF_SERIAL_SESSION, CKR_SESSION_PARALLEL_NOT_SUPPORTED);
658
sess = g_new0 (Session, 1);
659
sess->handle = ++unique_identifier;
660
sess->info.flags = flags;
661
sess->info.slotID = slotID;
662
sess->info.state = 0;
663
sess->info.ulDeviceError = 1414;
664
sess->objects = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)gck_attributes_unref);
665
*phSession = sess->handle;
667
g_hash_table_replace (the_sessions, GUINT_TO_POINTER (sess->handle), sess);
672
gck_mock_fail_C_OpenSession (CK_SLOT_ID slotID, CK_FLAGS flags, CK_VOID_PTR pApplication,
673
CK_NOTIFY Notify, CK_SESSION_HANDLE_PTR phSession)
675
return CKR_GENERAL_ERROR;
679
gck_mock_C_CloseSession (CK_SESSION_HANDLE hSession)
683
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
684
g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID);
686
g_hash_table_remove (the_sessions, GUINT_TO_POINTER (hSession));
691
gck_mock_C_CloseAllSessions (CK_SLOT_ID slotID)
693
g_return_val_if_fail (slotID == GCK_MOCK_SLOT_ONE_ID, CKR_SLOT_ID_INVALID);
695
g_hash_table_remove_all (the_sessions);
700
gck_mock_C_GetFunctionStatus (CK_SESSION_HANDLE hSession)
702
return CKR_FUNCTION_NOT_PARALLEL;
706
gck_mock_C_CancelFunction (CK_SESSION_HANDLE hSession)
708
return CKR_FUNCTION_NOT_PARALLEL;
712
gck_mock_C_GetSessionInfo (CK_SESSION_HANDLE hSession, CK_SESSION_INFO_PTR pInfo)
716
g_return_val_if_fail (pInfo != NULL, CKR_ARGUMENTS_BAD);
718
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
719
g_assert (session != NULL && "No such session found");
721
return CKR_SESSION_HANDLE_INVALID;
724
if (session->info.flags & CKF_RW_SESSION)
725
session->info.state = CKS_RW_USER_FUNCTIONS;
727
session->info.state = CKS_RO_USER_FUNCTIONS;
729
if (session->info.flags & CKF_RW_SESSION)
730
session->info.state = CKS_RW_PUBLIC_SESSION;
732
session->info.state = CKS_RO_PUBLIC_SESSION;
735
memcpy (pInfo, &session->info, sizeof (*pInfo));
740
gck_mock_fail_C_GetSessionInfo (CK_SESSION_HANDLE hSession, CK_SESSION_INFO_PTR pInfo)
742
return CKR_GENERAL_ERROR;
746
gck_mock_C_InitPIN (CK_SESSION_HANDLE hSession, CK_UTF8CHAR_PTR pPin,
751
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
752
g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID);
755
the_pin = g_strndup ((gchar*)pPin, ulPinLen);
756
n_the_pin = ulPinLen;
761
gck_mock_C_SetPIN (CK_SESSION_HANDLE hSession, CK_UTF8CHAR_PTR pOldPin,
762
CK_ULONG ulOldLen, CK_UTF8CHAR_PTR pNewPin, CK_ULONG ulNewLen)
768
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
769
g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID);
771
old = g_strndup ((gchar*)pOldPin, ulOldLen);
772
match = old && g_str_equal (old, the_pin);
776
return CKR_PIN_INCORRECT;
779
the_pin = g_strndup ((gchar*)pNewPin, ulNewLen);
780
n_the_pin = ulNewLen;
785
gck_mock_unsupported_C_GetOperationState (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pOperationState,
786
CK_ULONG_PTR pulOperationStateLen)
788
return CKR_FUNCTION_NOT_SUPPORTED;
792
gck_mock_unsupported_C_SetOperationState (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pOperationState,
793
CK_ULONG ulOperationStateLen, CK_OBJECT_HANDLE hEncryptionKey,
794
CK_OBJECT_HANDLE hAuthenticationKey)
796
return CKR_FUNCTION_NOT_SUPPORTED;
800
gck_mock_C_Login (CK_SESSION_HANDLE hSession, CK_USER_TYPE userType,
801
CK_UTF8CHAR_PTR pPin, CK_ULONG pPinLen)
805
g_return_val_if_fail (userType == CKU_SO ||
806
userType == CKU_USER ||
807
userType == CKU_CONTEXT_SPECIFIC,
808
CKR_USER_TYPE_INVALID);
810
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
811
g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
812
g_return_val_if_fail (logged_in == FALSE, CKR_USER_ALREADY_LOGGED_IN);
815
return CKR_PIN_INCORRECT;
817
if (pPinLen != strlen (the_pin))
818
return CKR_PIN_INCORRECT;
819
if (strncmp ((gchar*)pPin, the_pin, pPinLen) != 0)
820
return CKR_PIN_INCORRECT;
822
if (userType == CKU_CONTEXT_SPECIFIC) {
823
g_return_val_if_fail (session->want_context_login == TRUE, CKR_OPERATION_NOT_INITIALIZED);
824
session->want_context_login = CK_FALSE;
827
user_type = userType;
834
gck_mock_C_Logout (CK_SESSION_HANDLE hSession)
838
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
839
g_assert (session != NULL && "No such session found");
841
return CKR_SESSION_HANDLE_INVALID;
843
g_assert (logged_in && "Not logged in");
850
gck_mock_C_CreateObject (CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate,
851
CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phObject)
854
GckAttributes *attrs;
856
gboolean token, priv;
857
CK_OBJECT_CLASS klass;
858
CK_OBJECT_HANDLE object;
859
const GckAttribute *attr;
862
g_return_val_if_fail (phObject, CKR_ARGUMENTS_BAD);
864
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
865
g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID);
867
gck_builder_init (&builder);
868
for (i = 0; i < ulCount; ++i)
869
gck_builder_add_data (&builder, pTemplate[i].type, pTemplate[i].pValue, pTemplate[i].ulValueLen);
871
attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
872
if (gck_attributes_find_boolean (attrs, CKA_PRIVATE, &priv) && priv) {
874
gck_attributes_unref (attrs);
875
return CKR_USER_NOT_LOGGED_IN;
879
/* In order to create a credential we must check CK_VALUE */
880
if (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == CKO_G_CREDENTIAL) {
881
if (gck_attributes_find_ulong (attrs, CKA_G_OBJECT, &object)) {
882
attr = gck_attributes_find (attrs, CKA_VALUE);
883
if (!attr || attr->length != n_the_pin ||
884
memcmp (attr->value, the_pin, attr->length) != 0) {
885
gck_attributes_unref (attrs);
886
return CKR_PIN_INCORRECT;
891
*phObject = ++unique_identifier;
892
if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token)
893
g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phObject), attrs);
895
g_hash_table_insert (session->objects, GUINT_TO_POINTER (*phObject), attrs);
901
gck_mock_fail_C_CreateObject (CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate,
902
CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phObject)
905
return CKR_FUNCTION_FAILED;
909
gck_mock_unsupported_C_CopyObject (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject,
910
CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount,
911
CK_OBJECT_HANDLE_PTR phNewObject)
913
return CKR_FUNCTION_NOT_SUPPORTED;
917
gck_mock_C_DestroyObject (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject)
919
GckAttributes *attrs;
923
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
924
g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID);
926
attrs = lookup_object (session, hObject, NULL);
927
g_return_val_if_fail (attrs, CKR_OBJECT_HANDLE_INVALID);
929
if (gck_attributes_find_boolean (attrs, CKA_PRIVATE, &priv) && priv) {
931
return CKR_USER_NOT_LOGGED_IN;
934
g_hash_table_remove (the_objects, GUINT_TO_POINTER (hObject));
935
g_hash_table_remove (session->objects, GUINT_TO_POINTER (hObject));
941
gck_mock_unsupported_C_GetObjectSize (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject,
942
CK_ULONG_PTR pulSize)
944
return CKR_FUNCTION_NOT_SUPPORTED;
948
gck_mock_C_GetAttributeValue (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject,
949
CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount)
951
CK_ATTRIBUTE_PTR result;
953
GckAttributes *attrs;
954
const GckAttribute *attr;
958
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
960
return CKR_SESSION_HANDLE_INVALID;
962
attrs = lookup_object (session, hObject, NULL);
964
return CKR_OBJECT_HANDLE_INVALID;
966
for (i = 0; i < ulCount; ++i) {
967
result = pTemplate + i;
968
attr = gck_attributes_find (attrs, result->type);
970
result->ulValueLen = (CK_ULONG)-1;
971
ret = CKR_ATTRIBUTE_TYPE_INVALID;
975
if (!result->pValue) {
976
result->ulValueLen = attr->length;
980
if (result->ulValueLen >= attr->length) {
981
memcpy (result->pValue, attr->value, attr->length);
985
result->ulValueLen = (CK_ULONG)-1;
986
ret = CKR_BUFFER_TOO_SMALL;
993
gck_mock_fail_C_GetAttributeValue (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject,
994
CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount)
996
return CKR_FUNCTION_FAILED;
1000
gck_mock_C_SetAttributeValue (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject,
1001
CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount)
1004
GckAttributes *attrs;
1005
GckAttributes *replaced;
1008
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
1009
g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID);
1011
attrs = lookup_object (session, hObject, &table);
1012
g_return_val_if_fail (attrs, CKR_OBJECT_HANDLE_INVALID);
1014
replaced = replace_attributes (attrs, pTemplate, ulCount);
1015
g_hash_table_replace (table, GUINT_TO_POINTER (hObject), replaced);
1020
typedef struct _FindObjects {
1021
CK_ATTRIBUTE_PTR template;
1027
enumerate_and_find_objects (CK_OBJECT_HANDLE object, GckAttributes *attrs, gpointer user_data)
1029
FindObjects *ctx = user_data;
1030
CK_ATTRIBUTE_PTR match;
1031
const GckAttribute *attr;
1034
for (i = 0; i < ctx->count; ++i) {
1035
match = ctx->template + i;
1036
attr = gck_attributes_find (attrs, match->type);
1038
return TRUE; /* Continue */
1040
if (attr->length != match->ulValueLen ||
1041
memcmp (attr->value, match->pValue, attr->length) != 0)
1042
return TRUE; /* Continue */
1045
ctx->session->matches = g_list_prepend (ctx->session->matches, GUINT_TO_POINTER (object));
1046
return TRUE; /* Continue */
1050
gck_mock_C_FindObjectsInit (CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate,
1056
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
1057
g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
1059
/* Starting an operation, cancels any previous one */
1060
if (session->operation != 0)
1061
session->operation = 0;
1063
session->operation = OP_FIND;
1065
ctx.template = pTemplate;
1066
ctx.count = ulCount;
1067
ctx.session = session;
1069
gck_mock_module_enumerate_objects (hSession, enumerate_and_find_objects, &ctx);
1074
gck_mock_fail_C_FindObjects (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE_PTR phObject,
1075
CK_ULONG ulMaxObjectCount, CK_ULONG_PTR pulObjectCount)
1078
return CKR_FUNCTION_FAILED;
1082
gck_mock_C_FindObjects (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE_PTR phObject,
1083
CK_ULONG ulMaxObjectCount, CK_ULONG_PTR pulObjectCount)
1087
g_return_val_if_fail (phObject, CKR_ARGUMENTS_BAD);
1088
g_return_val_if_fail (pulObjectCount, CKR_ARGUMENTS_BAD);
1089
g_return_val_if_fail (ulMaxObjectCount != 0, CKR_ARGUMENTS_BAD);
1091
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
1092
g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
1093
g_return_val_if_fail (session->operation == OP_FIND, CKR_OPERATION_NOT_INITIALIZED);
1095
*pulObjectCount = 0;
1096
while (ulMaxObjectCount > 0 && session->matches) {
1097
*phObject = GPOINTER_TO_UINT (session->matches->data);
1100
++(*pulObjectCount);
1101
session->matches = g_list_remove (session->matches, session->matches->data);
1108
gck_mock_C_FindObjectsFinal (CK_SESSION_HANDLE hSession)
1113
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
1114
g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
1115
g_return_val_if_fail (session->operation == OP_FIND, CKR_OPERATION_NOT_INITIALIZED);
1117
session->operation = 0;
1118
g_list_free (session->matches);
1119
session->matches = NULL;
1125
gck_mock_C_EncryptInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
1126
CK_OBJECT_HANDLE hKey)
1130
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
1131
g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
1133
/* Starting an operation, cancels any previous one */
1134
if (session->operation != 0)
1135
session->operation = 0;
1137
g_assert (pMechanism);
1138
g_assert (pMechanism->mechanism == CKM_MOCK_CAPITALIZE);
1139
g_assert (hKey == PUBLIC_KEY_CAPITALIZE);
1141
session->operation = OP_CRYPTO;
1142
session->crypto_method = CKA_ENCRYPT;
1143
session->crypto_mechanism = CKM_MOCK_CAPITALIZE;
1144
session->crypto_key = hKey;
1149
gck_mock_C_Encrypt (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen,
1150
CK_BYTE_PTR pEncryptedData, CK_ULONG_PTR pulEncryptedDataLen)
1155
g_return_val_if_fail (pData, CKR_DATA_INVALID);
1156
g_return_val_if_fail (pulEncryptedDataLen, CKR_ARGUMENTS_BAD);
1158
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
1159
g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
1160
g_return_val_if_fail (session->operation == OP_CRYPTO, CKR_OPERATION_NOT_INITIALIZED);
1161
g_return_val_if_fail (session->crypto_method == CKA_ENCRYPT, CKR_OPERATION_NOT_INITIALIZED);
1163
g_assert (session->crypto_mechanism == CKM_MOCK_CAPITALIZE);
1164
g_assert (session->crypto_key == PUBLIC_KEY_CAPITALIZE);
1166
if (!pEncryptedData) {
1167
*pulEncryptedDataLen = ulDataLen;
1171
if (*pulEncryptedDataLen < ulDataLen) {
1172
*pulEncryptedDataLen = ulDataLen;
1173
return CKR_BUFFER_TOO_SMALL;
1176
for (i = 0; i < ulDataLen; ++i)
1177
pEncryptedData[i] = g_ascii_toupper (pData[i]);
1178
*pulEncryptedDataLen = ulDataLen;
1180
session->operation = 0;
1181
session->crypto_method = 0;
1182
session->crypto_mechanism = 0;
1183
session->crypto_key = 0;
1189
gck_mock_unsupported_C_EncryptUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart,
1190
CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart,
1191
CK_ULONG_PTR pulEncryptedPartLen)
1193
return CKR_FUNCTION_NOT_SUPPORTED;
1197
gck_mock_unsupported_C_EncryptFinal (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pLastEncryptedPart,
1198
CK_ULONG_PTR pulLastEncryptedPartLen)
1200
return CKR_FUNCTION_NOT_SUPPORTED;
1204
gck_mock_C_DecryptInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
1205
CK_OBJECT_HANDLE hKey)
1209
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
1210
g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
1212
/* Starting an operation, cancels any previous one */
1213
if (session->operation != 0)
1214
session->operation = 0;
1216
g_assert (pMechanism);
1217
g_assert (pMechanism->mechanism == CKM_MOCK_CAPITALIZE);
1218
g_assert (hKey == PRIVATE_KEY_CAPITALIZE);
1220
session->operation = OP_CRYPTO;
1221
session->crypto_method = CKA_DECRYPT;
1222
session->crypto_mechanism = CKM_MOCK_CAPITALIZE;
1223
session->crypto_key = hKey;
1228
gck_mock_C_Decrypt (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedData,
1229
CK_ULONG ulEncryptedDataLen, CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen)
1234
g_return_val_if_fail (pEncryptedData, CKR_ENCRYPTED_DATA_INVALID);
1235
g_return_val_if_fail (pulDataLen, CKR_ARGUMENTS_BAD);
1237
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
1238
g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
1239
g_return_val_if_fail (session->operation == OP_CRYPTO, CKR_OPERATION_NOT_INITIALIZED);
1240
g_return_val_if_fail (session->crypto_method == CKA_DECRYPT, CKR_OPERATION_NOT_INITIALIZED);
1242
g_assert (session->crypto_method == CKA_DECRYPT);
1243
g_assert (session->crypto_mechanism == CKM_MOCK_CAPITALIZE);
1244
g_assert (session->crypto_key == PRIVATE_KEY_CAPITALIZE);
1247
*pulDataLen = ulEncryptedDataLen;
1251
if (*pulDataLen < ulEncryptedDataLen) {
1252
*pulDataLen = ulEncryptedDataLen;
1253
return CKR_BUFFER_TOO_SMALL;
1256
for (i = 0; i < ulEncryptedDataLen; ++i)
1257
pData[i] = g_ascii_tolower (pEncryptedData[i]);
1258
*pulDataLen = ulEncryptedDataLen;
1260
session->operation = 0;
1261
session->crypto_method = 0;
1262
session->crypto_mechanism = 0;
1263
session->crypto_key = 0;
1269
gck_mock_unsupported_C_DecryptUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedPart,
1270
CK_ULONG ulEncryptedPartLen, CK_BYTE_PTR pPart, CK_ULONG_PTR pulPartLen)
1272
return CKR_FUNCTION_NOT_SUPPORTED;
1276
gck_mock_unsupported_C_DecryptFinal (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pLastPart,
1277
CK_ULONG_PTR pulLastPartLen)
1279
return CKR_FUNCTION_NOT_SUPPORTED;
1283
gck_mock_unsupported_C_DigestInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism)
1285
return CKR_FUNCTION_NOT_SUPPORTED;
1289
gck_mock_unsupported_C_Digest (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen,
1290
CK_BYTE_PTR pDigest, CK_ULONG_PTR pulDigestLen)
1292
return CKR_FUNCTION_NOT_SUPPORTED;
1296
gck_mock_unsupported_C_DigestUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen)
1298
return CKR_FUNCTION_NOT_SUPPORTED;
1302
gck_mock_unsupported_C_DigestKey (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hKey)
1304
return CKR_FUNCTION_NOT_SUPPORTED;
1308
gck_mock_unsupported_C_DigestFinal (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pDigest,
1309
CK_ULONG_PTR pulDigestLen)
1311
return CKR_FUNCTION_NOT_SUPPORTED;
1315
gck_mock_C_SignInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
1316
CK_OBJECT_HANDLE hKey)
1320
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
1321
g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
1323
/* Starting an operation, cancels any previous one */
1324
if (session->operation != 0)
1325
session->operation = 0;
1327
g_assert (pMechanism);
1328
g_assert (pMechanism->mechanism == CKM_MOCK_PREFIX);
1329
g_assert (hKey == PRIVATE_KEY_PREFIX);
1331
session->operation = OP_CRYPTO;
1332
session->crypto_method = CKA_SIGN;
1333
session->crypto_mechanism = CKM_MOCK_PREFIX;
1334
session->crypto_key = hKey;
1336
if (pMechanism->pParameter) {
1337
g_assert (pMechanism->ulParameterLen < sizeof (session->sign_prefix));
1338
memcpy (session->sign_prefix, pMechanism->pParameter, pMechanism->ulParameterLen);
1339
session->n_sign_prefix = pMechanism->ulParameterLen;
1341
g_assert (strlen (SIGNED_PREFIX) + 1 < sizeof (session->sign_prefix));
1342
strcpy ((gchar*)session->sign_prefix, SIGNED_PREFIX);
1343
session->n_sign_prefix = strlen (SIGNED_PREFIX);
1346
/* The private key has CKA_ALWAYS_AUTHENTICATE above */
1347
session->want_context_login = CK_TRUE;
1353
gck_mock_C_Sign (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen,
1354
CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen)
1359
g_return_val_if_fail (pData, CKR_DATA_INVALID);
1360
g_return_val_if_fail (pulSignatureLen, CKR_ARGUMENTS_BAD);
1362
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
1363
g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
1364
g_return_val_if_fail (session->operation == OP_CRYPTO, CKR_OPERATION_NOT_INITIALIZED);
1365
g_return_val_if_fail (session->crypto_method == CKA_SIGN, CKR_OPERATION_NOT_INITIALIZED);
1367
if (session->want_context_login)
1368
return CKR_USER_NOT_LOGGED_IN;
1370
g_assert (session->crypto_method == CKA_SIGN);
1371
g_assert (session->crypto_mechanism == CKM_MOCK_PREFIX);
1372
g_assert (session->crypto_key == PRIVATE_KEY_PREFIX);
1374
length = session->n_sign_prefix + ulDataLen;
1377
*pulSignatureLen = length;
1381
if (*pulSignatureLen < length) {
1382
*pulSignatureLen = length;
1383
return CKR_BUFFER_TOO_SMALL;
1386
memcpy (pSignature, session->sign_prefix, session->n_sign_prefix);
1387
memcpy (pSignature + session->n_sign_prefix, pData, ulDataLen);
1388
*pulSignatureLen = length;
1390
session->operation = 0;
1391
session->crypto_method = 0;
1392
session->crypto_mechanism = 0;
1393
session->crypto_key = 0;
1399
gck_mock_unsupported_C_SignUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen)
1401
return CKR_FUNCTION_NOT_SUPPORTED;
1405
gck_mock_unsupported_C_SignFinal (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature,
1406
CK_ULONG_PTR pulSignatureLen)
1408
return CKR_FUNCTION_NOT_SUPPORTED;
1412
gck_mock_unsupported_C_SignRecoverInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
1413
CK_OBJECT_HANDLE hKey)
1415
return CKR_FUNCTION_NOT_SUPPORTED;
1419
gck_mock_unsupported_C_SignRecover (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen,
1420
CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen)
1422
return CKR_FUNCTION_NOT_SUPPORTED;
1426
gck_mock_C_VerifyInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
1427
CK_OBJECT_HANDLE hKey)
1431
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
1432
g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
1434
/* Starting an operation, cancels any previous one */
1435
if (session->operation != 0)
1436
session->operation = 0;
1438
g_assert (pMechanism);
1439
g_assert (pMechanism->mechanism == CKM_MOCK_PREFIX);
1440
g_assert (hKey == PUBLIC_KEY_PREFIX);
1442
session->operation = OP_CRYPTO;
1443
session->crypto_method = CKA_VERIFY;
1444
session->crypto_mechanism = CKM_MOCK_PREFIX;
1445
session->crypto_key = hKey;
1447
if (pMechanism->pParameter) {
1448
g_assert (pMechanism->ulParameterLen < sizeof (session->sign_prefix));
1449
memcpy (session->sign_prefix, pMechanism->pParameter, pMechanism->ulParameterLen);
1450
session->n_sign_prefix = pMechanism->ulParameterLen;
1452
g_assert (strlen (SIGNED_PREFIX) + 1 < sizeof (session->sign_prefix));
1453
strcpy ((gchar*)session->sign_prefix, SIGNED_PREFIX);
1454
session->n_sign_prefix = strlen (SIGNED_PREFIX);
1461
gck_mock_C_Verify (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen,
1462
CK_BYTE_PTR pSignature, CK_ULONG ulSignatureLen)
1467
g_return_val_if_fail (pData, CKR_DATA_INVALID);
1468
g_return_val_if_fail (pSignature, CKR_ARGUMENTS_BAD);
1470
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
1471
g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
1472
g_return_val_if_fail (session->operation == OP_CRYPTO, CKR_OPERATION_NOT_INITIALIZED);
1473
g_return_val_if_fail (session->crypto_method == CKA_VERIFY, CKR_OPERATION_NOT_INITIALIZED);
1475
g_assert (session->crypto_method == CKA_VERIFY);
1476
g_assert (session->crypto_mechanism == CKM_MOCK_PREFIX);
1477
g_assert (session->crypto_key == PUBLIC_KEY_PREFIX);
1479
length = session->n_sign_prefix + ulDataLen;
1481
if (ulSignatureLen < length) {
1483
return CKR_SIGNATURE_LEN_RANGE;
1486
if (memcmp (pSignature, session->sign_prefix, session->n_sign_prefix) == 0 &&
1487
memcmp (pSignature + session->n_sign_prefix, pData, ulDataLen) == 0)
1490
return CKR_SIGNATURE_INVALID;
1494
gck_mock_unsupported_C_VerifyUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen)
1496
return CKR_FUNCTION_NOT_SUPPORTED;
1500
gck_mock_unsupported_C_VerifyFinal (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature,
1501
CK_ULONG pulSignatureLen)
1503
return CKR_FUNCTION_NOT_SUPPORTED;
1507
gck_mock_unsupported_C_VerifyRecoverInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
1508
CK_OBJECT_HANDLE hKey)
1510
return CKR_FUNCTION_NOT_SUPPORTED;
1514
gck_mock_unsupported_C_VerifyRecover (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature,
1515
CK_ULONG pulSignatureLen, CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen)
1517
return CKR_FUNCTION_NOT_SUPPORTED;
1521
gck_mock_unsupported_C_DigestEncryptUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart,
1522
CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart,
1523
CK_ULONG_PTR ulEncryptedPartLen)
1525
return CKR_FUNCTION_NOT_SUPPORTED;
1529
gck_mock_unsupported_C_DecryptDigestUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedPart,
1530
CK_ULONG ulEncryptedPartLen, CK_BYTE_PTR pPart,
1531
CK_ULONG_PTR pulPartLen)
1533
return CKR_FUNCTION_NOT_SUPPORTED;
1537
gck_mock_unsupported_C_SignEncryptUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart,
1538
CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart,
1539
CK_ULONG_PTR ulEncryptedPartLen)
1541
return CKR_FUNCTION_NOT_SUPPORTED;
1545
gck_mock_unsupported_C_DecryptVerifyUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedPart,
1546
CK_ULONG ulEncryptedPartLen, CK_BYTE_PTR pPart,
1547
CK_ULONG_PTR pulPartLen)
1549
return CKR_FUNCTION_NOT_SUPPORTED;
1553
gck_mock_unsupported_C_GenerateKey (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
1554
CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount,
1555
CK_OBJECT_HANDLE_PTR phKey)
1557
return CKR_FUNCTION_NOT_SUPPORTED;
1561
gck_mock_unsupported_C_GenerateKeyPair (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
1562
CK_ATTRIBUTE_PTR pPublicKeyTemplate, CK_ULONG ulPublicKeyAttributeCount,
1563
CK_ATTRIBUTE_PTR pPrivateKeyTemplate, CK_ULONG ulPrivateKeyAttributeCount,
1564
CK_OBJECT_HANDLE_PTR phPublicKey, CK_OBJECT_HANDLE_PTR phPrivateKey)
1567
GckAttributes *attrs;
1572
g_return_val_if_fail (pMechanism, CKR_MECHANISM_INVALID);
1573
g_return_val_if_fail (pPublicKeyTemplate, CKR_TEMPLATE_INCOMPLETE);
1574
g_return_val_if_fail (ulPublicKeyAttributeCount, CKR_TEMPLATE_INCOMPLETE);
1575
g_return_val_if_fail (pPrivateKeyTemplate, CKR_TEMPLATE_INCOMPLETE);
1576
g_return_val_if_fail (ulPrivateKeyAttributeCount, CKR_TEMPLATE_INCOMPLETE);
1577
g_return_val_if_fail (phPublicKey, CKR_ARGUMENTS_BAD);
1578
g_return_val_if_fail (phPrivateKey, CKR_ARGUMENTS_BAD);
1580
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
1581
g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
1583
if (pMechanism->mechanism != CKM_MOCK_GENERATE)
1584
return CKR_MECHANISM_INVALID;
1586
if (!pMechanism->pParameter || pMechanism->ulParameterLen != 9 ||
1587
memcmp (pMechanism->pParameter, "generate", 9) != 0)
1588
g_return_val_if_reached (CKR_MECHANISM_PARAM_INVALID);
1590
gck_builder_init (&builder);
1591
gck_builder_add_string (&builder, CKA_VALUE, "generated");
1592
for (i = 0; i < ulPublicKeyAttributeCount; ++i)
1593
gck_builder_add_data (&builder, pPublicKeyTemplate[i].type,
1594
pPublicKeyTemplate[i].pValue,
1595
pPublicKeyTemplate[i].ulValueLen);
1596
*phPublicKey = ++unique_identifier;
1597
attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
1598
if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token)
1599
g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phPublicKey), attrs);
1601
g_hash_table_insert (session->objects, GUINT_TO_POINTER (*phPublicKey), attrs);
1603
gck_builder_init (&builder);
1604
gck_builder_add_string (&builder, CKA_VALUE, "generated");
1605
for (i = 0; i < ulPrivateKeyAttributeCount; ++i)
1606
gck_builder_add_data (&builder, pPrivateKeyTemplate[i].type,
1607
pPrivateKeyTemplate[i].pValue,
1608
pPrivateKeyTemplate[i].ulValueLen);
1609
*phPrivateKey = ++unique_identifier;
1610
attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
1611
if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token)
1612
g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phPrivateKey), attrs);
1614
g_hash_table_insert (session->objects, GUINT_TO_POINTER (*phPrivateKey), attrs);
1619
gck_mock_unsupported_C_WrapKey (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
1620
CK_OBJECT_HANDLE hWrappingKey, CK_OBJECT_HANDLE hKey,
1621
CK_BYTE_PTR pWrappedKey, CK_ULONG_PTR pulWrappedKeyLen)
1623
GckAttributes *attrs;
1624
const GckAttribute *attr;
1627
g_return_val_if_fail (pMechanism, CKR_MECHANISM_INVALID);
1628
g_return_val_if_fail (hWrappingKey, CKR_OBJECT_HANDLE_INVALID);
1629
g_return_val_if_fail (hKey, CKR_OBJECT_HANDLE_INVALID);
1630
g_return_val_if_fail (pulWrappedKeyLen, CKR_WRAPPED_KEY_LEN_RANGE);
1632
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
1633
g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
1635
attrs = lookup_object (session, hWrappingKey, NULL);
1636
g_return_val_if_fail (attrs, CKR_WRAPPING_KEY_HANDLE_INVALID);
1638
attrs = lookup_object (session, hKey, NULL);
1639
g_return_val_if_fail (attrs, CKR_WRAPPED_KEY_INVALID);
1641
if (pMechanism->mechanism != CKM_MOCK_WRAP)
1642
return CKR_MECHANISM_INVALID;
1644
if (pMechanism->pParameter) {
1645
if (pMechanism->ulParameterLen != 4 ||
1646
memcmp (pMechanism->pParameter, "wrap", 4) != 0)
1647
g_return_val_if_reached (CKR_MECHANISM_PARAM_INVALID);
1650
attr = gck_attributes_find (attrs, CKA_VALUE);
1652
return CKR_WRAPPED_KEY_INVALID;
1655
*pulWrappedKeyLen = attr->length;
1659
if (*pulWrappedKeyLen < attr->length) {
1660
*pulWrappedKeyLen = attr->length;
1661
return CKR_BUFFER_TOO_SMALL;
1664
memcpy (pWrappedKey, attr->value, attr->length);
1665
*pulWrappedKeyLen = attr->length;
1671
gck_mock_unsupported_C_UnwrapKey (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
1672
CK_OBJECT_HANDLE hUnwrappingKey, CK_BYTE_PTR pWrappedKey,
1673
CK_ULONG ulWrappedKeyLen, CK_ATTRIBUTE_PTR pTemplate,
1674
CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phKey)
1677
GckAttributes *attrs;
1682
g_return_val_if_fail (pMechanism, CKR_MECHANISM_INVALID);
1683
g_return_val_if_fail (hUnwrappingKey, CKR_WRAPPING_KEY_HANDLE_INVALID);
1684
g_return_val_if_fail (pWrappedKey, CKR_WRAPPED_KEY_INVALID);
1685
g_return_val_if_fail (ulWrappedKeyLen, CKR_WRAPPED_KEY_LEN_RANGE);
1686
g_return_val_if_fail (phKey, CKR_ARGUMENTS_BAD);
1687
g_return_val_if_fail (pTemplate, CKR_TEMPLATE_INCOMPLETE);
1688
g_return_val_if_fail (ulCount, CKR_TEMPLATE_INCONSISTENT);
1690
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
1691
g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
1693
attrs = lookup_object (session, hUnwrappingKey, NULL);
1694
g_return_val_if_fail (attrs, CKR_WRAPPING_KEY_HANDLE_INVALID);
1696
if (pMechanism->mechanism != CKM_MOCK_WRAP)
1697
return CKR_MECHANISM_INVALID;
1699
if (pMechanism->pParameter) {
1700
if (pMechanism->ulParameterLen != 4 ||
1701
memcmp (pMechanism->pParameter, "wrap", 4) != 0)
1702
g_return_val_if_reached (CKR_MECHANISM_PARAM_INVALID);
1705
gck_builder_init (&builder);
1706
gck_builder_add_data (&builder, CKA_VALUE, pWrappedKey, ulWrappedKeyLen);
1707
for (i = 0; i < ulCount; ++i)
1708
gck_builder_add_data (&builder, pTemplate[i].type,
1709
pTemplate[i].pValue,
1710
pTemplate[i].ulValueLen);
1711
*phKey = ++unique_identifier;
1712
attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
1713
if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token)
1714
g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phKey), attrs);
1716
g_hash_table_insert (session->objects, GUINT_TO_POINTER (*phKey), attrs);
1722
gck_mock_unsupported_C_DeriveKey (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
1723
CK_OBJECT_HANDLE hBaseKey, CK_ATTRIBUTE_PTR pTemplate,
1724
CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phKey)
1727
GckAttributes *attrs, *copy;
1732
g_return_val_if_fail (pMechanism, CKR_MECHANISM_INVALID);
1733
g_return_val_if_fail (ulCount, CKR_TEMPLATE_INCOMPLETE);
1734
g_return_val_if_fail (pTemplate, CKR_TEMPLATE_INCOMPLETE);
1735
g_return_val_if_fail (phKey, CKR_ARGUMENTS_BAD);
1737
session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
1738
g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID);
1740
attrs = lookup_object (session, hBaseKey, NULL);
1741
g_return_val_if_fail (attrs, CKR_KEY_HANDLE_INVALID);
1743
if (pMechanism->mechanism != CKM_MOCK_DERIVE)
1744
return CKR_MECHANISM_INVALID;
1746
if (pMechanism->pParameter) {
1747
if (pMechanism->ulParameterLen != 6 ||
1748
memcmp (pMechanism->pParameter, "derive", 6) != 0)
1749
g_return_val_if_reached (CKR_MECHANISM_PARAM_INVALID);
1752
gck_builder_init (&builder);
1753
gck_builder_add_string (&builder, CKA_VALUE, "derived");
1754
for (i = 0; i < ulCount; ++i)
1755
gck_builder_add_data (&builder, pTemplate[i].type,
1756
pTemplate[i].pValue,
1757
pTemplate[i].ulValueLen);
1758
gck_builder_add_all (&builder, attrs);
1759
*phKey = ++unique_identifier;
1760
copy = gck_attributes_ref_sink (gck_builder_end (&builder));
1761
if (gck_attributes_find_boolean (copy, CKA_TOKEN, &token) && token)
1762
g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phKey), copy);
1764
g_hash_table_insert (session->objects, GUINT_TO_POINTER (*phKey), copy);
1770
gck_mock_unsupported_C_SeedRandom (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSeed, CK_ULONG ulSeedLen)
1772
return CKR_FUNCTION_NOT_SUPPORTED;
1776
gck_mock_unsupported_C_GenerateRandom (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pRandomData,
1777
CK_ULONG ulRandomLen)
1779
return CKR_FUNCTION_NOT_SUPPORTED;
1782
static CK_FUNCTION_LIST functionList = {
1783
{ 2, 11 }, /* version */
1784
gck_mock_validate_and_C_Initialize,
1785
gck_mock_C_Finalize,
1787
gck_mock_C_GetFunctionList,
1788
gck_mock_C_GetSlotList,
1789
gck_mock_C_GetSlotInfo,
1790
gck_mock_C_GetTokenInfo,
1791
gck_mock_C_GetMechanismList,
1792
gck_mock_C_GetMechanismInfo,
1793
gck_mock_specific_args_C_InitToken,
1796
gck_mock_C_OpenSession,
1797
gck_mock_C_CloseSession,
1798
gck_mock_C_CloseAllSessions,
1799
gck_mock_C_GetSessionInfo,
1800
gck_mock_unsupported_C_GetOperationState,
1801
gck_mock_unsupported_C_SetOperationState,
1804
gck_mock_C_CreateObject,
1805
gck_mock_unsupported_C_CopyObject,
1806
gck_mock_C_DestroyObject,
1807
gck_mock_unsupported_C_GetObjectSize,
1808
gck_mock_C_GetAttributeValue,
1809
gck_mock_C_SetAttributeValue,
1810
gck_mock_C_FindObjectsInit,
1811
gck_mock_C_FindObjects,
1812
gck_mock_C_FindObjectsFinal,
1813
gck_mock_C_EncryptInit,
1815
gck_mock_unsupported_C_EncryptUpdate,
1816
gck_mock_unsupported_C_EncryptFinal,
1817
gck_mock_C_DecryptInit,
1819
gck_mock_unsupported_C_DecryptUpdate,
1820
gck_mock_unsupported_C_DecryptFinal,
1821
gck_mock_unsupported_C_DigestInit,
1822
gck_mock_unsupported_C_Digest,
1823
gck_mock_unsupported_C_DigestUpdate,
1824
gck_mock_unsupported_C_DigestKey,
1825
gck_mock_unsupported_C_DigestFinal,
1826
gck_mock_C_SignInit,
1828
gck_mock_unsupported_C_SignUpdate,
1829
gck_mock_unsupported_C_SignFinal,
1830
gck_mock_unsupported_C_SignRecoverInit,
1831
gck_mock_unsupported_C_SignRecover,
1832
gck_mock_C_VerifyInit,
1834
gck_mock_unsupported_C_VerifyUpdate,
1835
gck_mock_unsupported_C_VerifyFinal,
1836
gck_mock_unsupported_C_VerifyRecoverInit,
1837
gck_mock_unsupported_C_VerifyRecover,
1838
gck_mock_unsupported_C_DigestEncryptUpdate,
1839
gck_mock_unsupported_C_DecryptDigestUpdate,
1840
gck_mock_unsupported_C_SignEncryptUpdate,
1841
gck_mock_unsupported_C_DecryptVerifyUpdate,
1842
gck_mock_unsupported_C_GenerateKey,
1843
gck_mock_unsupported_C_GenerateKeyPair,
1844
gck_mock_unsupported_C_WrapKey,
1845
gck_mock_unsupported_C_UnwrapKey,
1846
gck_mock_unsupported_C_DeriveKey,
1847
gck_mock_unsupported_C_SeedRandom,
1848
gck_mock_unsupported_C_GenerateRandom,
1849
gck_mock_C_GetFunctionStatus,
1850
gck_mock_C_CancelFunction,
1851
gck_mock_unsupported_C_WaitForSlotEvent