Coverage Report

Created: 2023-03-26 06:26

/src/p11-kit/common/mock.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (c) 2011, Collabora Ltd.
3
 * Copyright (c) 2021-2023, Red Hat, Inc.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 *
9
 *     * Redistributions of source code must retain the above
10
 *       copyright notice, this list of conditions and the
11
 *       following disclaimer.
12
 *     * Redistributions in binary form must reproduce the
13
 *       above copyright notice, this list of conditions and
14
 *       the following disclaimer in the documentation and/or
15
 *       other materials provided with the distribution.
16
 *     * The names of contributors to this software may not be
17
 *       used to endorse or promote products derived from this
18
 *       software without specific prior written permission.
19
 *
20
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
30
 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
31
 * DAMAGE.
32
 *
33
 * Author: Stef Walter <stefw@collabora.co.uk>
34
 */
35
36
#include "config.h"
37
38
#include "debug.h"
39
#define CRYPTOKI_EXPORTS
40
#include "pkcs11.h"
41
#include "message.h"
42
43
#include "mock.h"
44
45
#include "attrs.h"
46
#define P11_DEBUG_FLAG P11_DEBUG_LIB
47
#include "debug.h"
48
#include "dict.h"
49
#include "array.h"
50
#include "library.h"
51
52
#include <assert.h>
53
#include <ctype.h>
54
#include <stdarg.h>
55
#include <stdio.h>
56
#include <stdlib.h>
57
#include <string.h>
58
#include <unistd.h>
59
60
/* -------------------------------------------------------------------
61
 * GLOBALS and SUPPORT STUFF
62
 */
63
64
/* Various mutexes */
65
static p11_mutex_t init_mutex;
66
67
/* Whether we've been initialized, and on what process id it happened */
68
static bool pkcs11_initialized = false;
69
static pid_t pkcs11_initialized_pid = 0;
70
71
static CK_UTF8CHAR *the_pin = NULL;
72
static CK_ULONG n_the_pin = 0;
73
74
static CK_UTF8CHAR *the_username = NULL;
75
static CK_ULONG n_the_username = 0;
76
77
static bool logged_in = false;
78
static CK_USER_TYPE the_user_type = 0;
79
80
typedef struct _Session {
81
  CK_SESSION_HANDLE handle;
82
  p11_dict *objects;
83
  CK_SESSION_INFO info;
84
85
  /* For find operations */
86
  bool finding;
87
  p11_array *matches;
88
89
  bool want_context_login;
90
91
  /* For encrypt, decrypt operations */
92
  CK_OBJECT_HANDLE crypto_key;
93
  CK_FLAGS crypto_method;
94
  CK_MECHANISM_TYPE crypto_mechanism;
95
  CK_BBOOL crypto_final;
96
  CK_MECHANISM_TYPE message_method;
97
  CK_MECHANISM message_mechanism;
98
  CK_OBJECT_HANDLE message_key;
99
  bool message_progress;
100
101
  /* For sign, verify, digest, CKM_MOCK_COUNT */
102
  CK_MECHANISM_TYPE hash_mechanism;
103
  CK_FLAGS hash_method;
104
  CK_OBJECT_HANDLE hash_key;
105
  CK_ULONG hash_count;
106
107
  /* For 'signing' with CKM_MOCK_PREFIX */
108
  CK_BYTE sign_prefix[128];
109
  CK_ULONG n_sign_prefix;
110
111
  /* The random seed */
112
  CK_BYTE random_seed[128];
113
  CK_ULONG random_seed_len;
114
} Session;
115
116
static unsigned int unique_identifier = 100;
117
static p11_dict *the_sessions = NULL;
118
static p11_dict *the_objects = NULL;
119
120
0
#define SIGNED_PREFIX "signed-prefix:"
121
122
#define handle_to_pointer(handle) \
123
320
  ((void *)(size_t)(handle))
124
125
#define pointer_to_handle(pointer) \
126
0
  ((CK_ULONG)(size_t)(pointer))
127
128
static void
129
free_session (void *data)
130
0
{
131
0
  Session *sess = (Session *)data;
132
0
  if (sess) {
133
0
    p11_dict_free (sess->objects);
134
0
    p11_array_free (sess->matches);
135
0
    free (sess->message_mechanism.pParameter);
136
0
  }
137
0
  free (sess);
138
0
}
139
140
static CK_RV
141
lookup_object (Session *sess,
142
               CK_OBJECT_HANDLE object,
143
               CK_ATTRIBUTE **attrs,
144
               p11_dict **table)
145
0
{
146
0
  CK_BBOOL priv;
147
148
0
  *attrs = p11_dict_get (the_objects, handle_to_pointer (object));
149
0
  if (*attrs) {
150
0
    if (table)
151
0
      *table = the_objects;
152
0
  } else {
153
0
    *attrs = p11_dict_get (sess->objects, handle_to_pointer (object));
154
0
    if (*attrs) {
155
0
      if (table)
156
0
        *table = sess->objects;
157
0
    }
158
0
  }
159
160
0
  if (!*attrs)
161
0
    return CKR_OBJECT_HANDLE_INVALID;
162
0
  else if (!logged_in && p11_attrs_find_bool (*attrs, CKA_PRIVATE, &priv) && priv)
163
0
    return CKR_USER_NOT_LOGGED_IN;
164
165
0
  return CKR_OK;
166
0
}
167
168
void
169
mock_module_add_object (CK_SLOT_ID slot_id,
170
                        const CK_ATTRIBUTE *attrs)
171
0
{
172
0
  CK_ATTRIBUTE *copy;
173
174
0
  return_if_fail (slot_id == MOCK_SLOT_ONE_ID);
175
0
  return_if_fail (attrs != NULL);
176
177
0
  copy = p11_attrs_dup (attrs);
178
0
  return_if_fail (copy != NULL);
179
180
0
  mock_module_take_object (slot_id, copy);
181
0
}
182
183
void
184
mock_module_take_object (CK_SLOT_ID slot_id,
185
                        CK_ATTRIBUTE *attrs)
186
0
{
187
0
  CK_OBJECT_HANDLE object;
188
189
0
  return_if_fail (slot_id == MOCK_SLOT_ONE_ID);
190
0
  return_if_fail (attrs != NULL);
191
192
0
  object = ++unique_identifier;
193
0
  if (!p11_dict_set (the_objects, handle_to_pointer (object), attrs))
194
0
    return_if_reached ();
195
0
}
196
197
static void
198
module_reset_objects (CK_SLOT_ID slot_id)
199
64
{
200
64
  return_if_fail (slot_id == MOCK_SLOT_ONE_ID);
201
202
64
  if (!the_objects) {
203
33
    the_objects = p11_dict_new (p11_dict_direct_hash,
204
33
                                p11_dict_direct_equal,
205
33
                                NULL, p11_attrs_free);
206
33
    return_if_fail (the_objects != NULL);
207
33
  }
208
209
64
  p11_dict_clear (the_objects);
210
211
  /* Our token object */
212
64
  {
213
64
    CK_OBJECT_CLASS klass = CKO_DATA;
214
64
    char *label = "TEST LABEL";
215
64
    CK_ATTRIBUTE attrs[] = {
216
64
      { CKA_CLASS, &klass, sizeof (klass) },
217
64
      { CKA_LABEL, label, strlen (label) },
218
64
      { CKA_INVALID, NULL, 0 },
219
64
    };
220
64
    p11_dict_set (the_objects, handle_to_pointer (MOCK_DATA_OBJECT), p11_attrs_dup (attrs));
221
64
  }
222
223
  /* Private capitalize key */
224
64
  {
225
64
    CK_OBJECT_CLASS klass = CKO_PRIVATE_KEY;
226
64
    char *label = "Private Capitalize Key";
227
64
    char *value = "value";
228
64
    CK_MECHANISM_TYPE type = CKM_MOCK_CAPITALIZE;
229
64
    CK_BBOOL btrue = CK_TRUE;
230
64
    CK_ATTRIBUTE attrs[] = {
231
64
      { CKA_CLASS, &klass, sizeof (klass) },
232
64
      { CKA_LABEL, label, strlen (label) },
233
64
      { CKA_ALLOWED_MECHANISMS, &type, sizeof (type) },
234
64
      { CKA_DECRYPT, &btrue, sizeof (btrue) },
235
64
      { CKA_PRIVATE, &btrue, sizeof (btrue) },
236
64
      { CKA_WRAP, &btrue, sizeof (btrue) },
237
64
      { CKA_UNWRAP, &btrue, sizeof (btrue) },
238
64
      { CKA_DERIVE, &btrue, sizeof (btrue) },
239
64
      { CKA_VALUE, value, strlen (value) },
240
64
      { CKA_INVALID, NULL, 0 },
241
64
    };
242
64
    p11_dict_set (the_objects, handle_to_pointer (MOCK_PRIVATE_KEY_CAPITALIZE), p11_attrs_dup (attrs));
243
244
64
  }
245
246
64
  {
247
64
    CK_OBJECT_CLASS klass = CKO_PUBLIC_KEY;
248
64
    char *label = "Public Capitalize Key";
249
64
    char *value = "value";
250
64
    CK_MECHANISM_TYPE type = CKM_MOCK_CAPITALIZE;
251
64
    CK_BBOOL btrue = CK_TRUE;
252
64
    CK_BBOOL bfalse = CK_FALSE;
253
64
    CK_ATTRIBUTE attrs[] = {
254
64
      { CKA_CLASS, &klass, sizeof (klass) },
255
64
      { CKA_LABEL, label, strlen (label) },
256
64
      { CKA_ALLOWED_MECHANISMS, &type, sizeof (type) },
257
64
      { CKA_ENCRYPT, &btrue, sizeof (btrue) },
258
64
      { CKA_PRIVATE, &bfalse, sizeof (bfalse) },
259
64
      { CKA_VALUE, value, strlen (value) },
260
64
      { CKA_INVALID, NULL, 0 },
261
64
    };
262
64
    p11_dict_set (the_objects, handle_to_pointer (MOCK_PUBLIC_KEY_CAPITALIZE), p11_attrs_dup (attrs));
263
264
64
  }
265
266
64
  {
267
64
    CK_OBJECT_CLASS klass = CKO_PRIVATE_KEY;
268
64
    char *label = "Private prefix key";
269
64
    char *value = "value";
270
64
    CK_MECHANISM_TYPE type = CKM_MOCK_PREFIX;
271
64
    CK_BBOOL btrue = CK_TRUE;
272
64
    CK_ATTRIBUTE attrs[] = {
273
64
      { CKA_CLASS, &klass, sizeof (klass) },
274
64
      { CKA_LABEL, label, strlen (label) },
275
64
      { CKA_ALLOWED_MECHANISMS, &type, sizeof (type) },
276
64
      { CKA_SIGN, &btrue, sizeof (btrue) },
277
64
      { CKA_PRIVATE, &btrue, sizeof (btrue) },
278
64
      { CKA_ALWAYS_AUTHENTICATE, &btrue, sizeof (btrue) },
279
64
      { CKA_VALUE, value, strlen (value) },
280
64
      { CKA_INVALID, NULL, 0 },
281
64
    };
282
64
    p11_dict_set (the_objects, handle_to_pointer (MOCK_PRIVATE_KEY_PREFIX), p11_attrs_dup (attrs));
283
284
64
  }
285
286
64
  {
287
64
    CK_OBJECT_CLASS klass = CKO_PUBLIC_KEY;
288
64
    char *label = "Public prefix key";
289
64
    char *value = "value";
290
64
    CK_MECHANISM_TYPE type = CKM_MOCK_PREFIX;
291
64
    CK_BBOOL btrue = CK_TRUE;
292
64
    CK_BBOOL bfalse = CK_FALSE;
293
64
    CK_ATTRIBUTE attrs[] = {
294
64
      { CKA_CLASS, &klass, sizeof (klass) },
295
64
      { CKA_LABEL, label, strlen (label) },
296
64
      { CKA_ALLOWED_MECHANISMS, &type, sizeof (type) },
297
64
      { CKA_VERIFY, &btrue, sizeof (btrue) },
298
64
      { CKA_PRIVATE, &bfalse, sizeof (bfalse) },
299
64
      { CKA_ALWAYS_AUTHENTICATE, &btrue, sizeof (btrue) },
300
64
      { CKA_VALUE, value, strlen (value) },
301
64
      { CKA_INVALID, NULL, 0 },
302
64
    };
303
64
    p11_dict_set (the_objects, handle_to_pointer (MOCK_PUBLIC_KEY_PREFIX), p11_attrs_dup (attrs));
304
305
64
  }
306
64
}
307
308
static void
309
module_finalize (void)
310
32
{
311
32
  p11_mutex_lock (&init_mutex);
312
313
    /* This should stop all other calls in */
314
32
    pkcs11_initialized = false;
315
32
    pkcs11_initialized_pid = 0;
316
317
32
    if (the_objects)
318
32
      p11_dict_free (the_objects);
319
32
    the_objects = NULL;
320
321
32
    if (the_sessions)
322
32
      p11_dict_free (the_sessions);
323
32
    the_sessions = NULL;
324
32
    logged_in = false;
325
32
    the_user_type = 0;
326
327
32
    free (the_pin);
328
32
    the_pin = NULL;
329
32
    n_the_pin = 0;
330
331
32
    free (the_username);
332
32
    the_username = NULL;
333
32
    n_the_username = 0;
334
335
32
  p11_mutex_unlock (&init_mutex);
336
32
}
337
338
bool
339
mock_module_initialized (void)
340
0
{
341
0
  return pkcs11_initialized;
342
0
}
343
void
344
mock_module_reset (void)
345
32
{
346
32
  module_finalize ();
347
32
  module_reset_objects (MOCK_SLOT_ONE_ID);
348
349
32
}
350
351
void
352
mock_module_enumerate_objects (CK_SESSION_HANDLE handle,
353
                               mock_enumerator func,
354
                               void *user_data)
355
0
{
356
0
  p11_dictiter iter;
357
0
  void *key;
358
0
  void *value;
359
0
  Session *sess;
360
361
0
  assert (the_objects != NULL);
362
0
  assert (func != NULL);
363
364
  /* Token objects */
365
0
  p11_dict_iterate (the_objects, &iter);
366
0
  while (p11_dict_next (&iter, &key, &value)) {
367
0
    if (!(func) (pointer_to_handle (key), value, user_data))
368
0
      return;
369
0
  }
370
371
  /* session objects */
372
0
  if (handle) {
373
0
    sess = p11_dict_get (the_sessions, handle_to_pointer (handle));
374
0
    if (sess) {
375
0
      p11_dict_iterate (sess->objects, &iter);
376
0
      while (p11_dict_next (&iter, &key, &value)) {
377
0
        if (!(func) (pointer_to_handle (key), value, user_data))
378
0
          return;
379
0
      }
380
0
    }
381
0
  }
382
0
}
383
384
/* -------------------------------------------------------------------
385
 * INITIALIZATION and 'GLOBAL' CALLS
386
 */
387
388
CK_RV
389
mock_C_Initialize (CK_VOID_PTR init_args)
390
32
{
391
32
  CK_C_INITIALIZE_ARGS_PTR args = NULL;
392
32
  CK_RV ret = CKR_OK;
393
32
  pid_t pid;
394
395
32
  p11_mutex_lock (&init_mutex);
396
397
32
    if (init_args != NULL) {
398
0
      int supplied_ok;
399
400
      /* pReserved must be NULL */
401
0
      args = init_args;
402
403
      /* ALL supplied function pointers need to have the value either NULL or non-NULL. */
404
0
      supplied_ok = (args->CreateMutex == NULL && args->DestroyMutex == NULL &&
405
0
                     args->LockMutex == NULL && args->UnlockMutex == NULL) ||
406
0
                    (args->CreateMutex != NULL && args->DestroyMutex != NULL &&
407
0
                     args->LockMutex != NULL && args->UnlockMutex != NULL);
408
0
      if (!supplied_ok) {
409
0
        p11_debug_precond ("invalid set of mutex calls supplied\n");
410
0
        ret = CKR_ARGUMENTS_BAD;
411
0
        goto done;
412
0
      }
413
414
      /*
415
       * When the CKF_OS_LOCKING_OK flag isn't set return an error.
416
       * We must be able to use our pthread functionality.
417
       */
418
0
      if (!(args->flags & CKF_OS_LOCKING_OK)) {
419
0
        p11_debug_precond ("can't do without os locking\n");
420
0
        ret = CKR_CANT_LOCK;
421
0
        goto done;
422
0
      }
423
0
    }
424
425
32
    pid = getpid ();
426
32
    if (pkcs11_initialized) {
427
428
      /* This process has called C_Initialize already */
429
0
      if (pid == pkcs11_initialized_pid) {
430
0
        p11_debug_precond ("p11-kit: C_Initialize called twice for same process\n");
431
0
        ret = CKR_CRYPTOKI_ALREADY_INITIALIZED;
432
0
        goto done;
433
0
      }
434
0
    }
435
436
    /* We store CK_ULONG as pointers here, so verify that they fit */
437
32
    assert (sizeof (CK_ULONG) <= sizeof (void *));
438
439
32
    free (the_pin);
440
32
    the_pin = (CK_UTF8CHAR_PTR)strdup ("booo");
441
32
    n_the_pin = 4;
442
443
32
    free (the_username);
444
32
    the_username = (CK_UTF8CHAR_PTR)strdup ("yeah");
445
32
    n_the_username = 4;
446
447
32
    if (the_sessions)
448
0
      p11_dict_free (the_sessions);
449
32
    the_sessions = p11_dict_new (p11_dict_direct_hash,
450
32
                                 p11_dict_direct_equal,
451
32
                                 NULL, free_session);
452
32
    if (!the_sessions) {
453
0
      ret = CKR_HOST_MEMORY;
454
0
      goto done;
455
0
    }
456
457
32
    module_reset_objects (MOCK_SLOT_ONE_ID);
458
459
32
done:
460
    /* Mark us as officially initialized */
461
32
    if (ret == CKR_OK) {
462
32
      pkcs11_initialized = true;
463
32
      pkcs11_initialized_pid = pid;
464
32
    } else if (ret != CKR_CRYPTOKI_ALREADY_INITIALIZED) {
465
0
      pkcs11_initialized = false;
466
0
      pkcs11_initialized_pid = 0;
467
0
    }
468
469
32
  p11_mutex_unlock (&init_mutex);
470
471
32
  return ret;
472
32
}
473
474
CK_RV
475
mock_X_Initialize (CK_X_FUNCTION_LIST *self,
476
                   CK_VOID_PTR init_args)
477
0
{
478
0
  return mock_C_Initialize (init_args);
479
0
}
480
481
CK_RV
482
mock_C_Initialize__fails (CK_VOID_PTR init_args)
483
0
{
484
0
  return CKR_FUNCTION_FAILED;
485
0
}
486
487
CK_RV
488
mock_X_Initialize__fails (CK_X_FUNCTION_LIST *self,
489
                          CK_VOID_PTR init_args)
490
0
{
491
0
  return mock_C_Initialize__fails (init_args);
492
0
}
493
494
CK_RV
495
mock_C_Finalize (CK_VOID_PTR reserved)
496
0
{
497
0
  return_val_if_fail (pkcs11_initialized, CKR_CRYPTOKI_NOT_INITIALIZED);
498
0
  return_val_if_fail (reserved == NULL, CKR_ARGUMENTS_BAD);
499
500
0
  module_finalize ();
501
0
  return CKR_OK;
502
0
}
503
504
CK_RV
505
mock_X_Finalize (CK_X_FUNCTION_LIST *self,
506
                 CK_VOID_PTR reserved)
507
0
{
508
0
  return mock_C_Finalize (reserved);
509
0
}
510
511
CK_RV
512
mock_C_GetInfo (CK_INFO_PTR info)
513
0
{
514
0
  return_val_if_fail (info, CKR_ARGUMENTS_BAD);
515
516
0
  memcpy (info, &MOCK_INFO, sizeof (*info));
517
0
  return CKR_OK;
518
0
}
519
520
CK_RV
521
mock_X_GetInfo (CK_X_FUNCTION_LIST *self,
522
                CK_INFO_PTR info)
523
0
{
524
0
  return mock_C_GetInfo (info);
525
0
}
526
527
CK_RV
528
mock_C_GetFunctionList_not_supported (CK_FUNCTION_LIST_PTR_PTR list)
529
0
{
530
  /* This would be a strange call to receive, should be overridden  */
531
0
  return_val_if_reached (CKR_FUNCTION_NOT_SUPPORTED);
532
0
}
533
534
CK_RV
535
mock_C_GetSlotList (CK_BBOOL token_present,
536
                    CK_SLOT_ID_PTR slot_list,
537
                    CK_ULONG_PTR count)
538
0
{
539
0
  CK_ULONG num;
540
541
0
  return_val_if_fail (count, CKR_ARGUMENTS_BAD);
542
543
0
  num = token_present ? 1 : 2;
544
545
  /* Application only wants to know the number of slots. */
546
0
  if (slot_list == NULL) {
547
0
    *count = num;
548
0
    return CKR_OK;
549
0
  }
550
551
0
  if (*count < num)
552
0
    return_val_if_reached (CKR_BUFFER_TOO_SMALL);
553
554
0
  *count = num;
555
0
  slot_list[0] = MOCK_SLOT_ONE_ID;
556
0
  if (!token_present)
557
0
    slot_list[1] = MOCK_SLOT_TWO_ID;
558
559
0
  return CKR_OK;
560
561
0
}
562
563
CK_RV
564
mock_C_GetSlotList__no_tokens (CK_BBOOL token_present,
565
                               CK_SLOT_ID_PTR slot_list,
566
                               CK_ULONG_PTR count)
567
0
{
568
0
  return_val_if_fail (count, CKR_ARGUMENTS_BAD);
569
570
  /* No tokens */
571
0
  *count = 0;
572
0
  return CKR_OK;
573
0
}
574
575
CK_RV
576
mock_X_GetSlotList__no_tokens (CK_X_FUNCTION_LIST *self,
577
                               CK_BBOOL token_present,
578
                               CK_SLOT_ID_PTR slot_list,
579
                               CK_ULONG_PTR count)
580
0
{
581
0
  return mock_C_GetSlotList__no_tokens (token_present,
582
0
                                        slot_list,
583
0
                                        count);
584
0
;
585
0
}
586
587
/* Update mock-module.h URIs when updating this */
588
589
static const CK_SLOT_INFO MOCK_INFO_ONE = {
590
  "TEST SLOT                                                       ",
591
  "TEST MANUFACTURER               ",
592
  CKF_TOKEN_PRESENT | CKF_REMOVABLE_DEVICE,
593
  { 55, 155 },
594
  { 65, 165 },
595
};
596
597
/* Update mock-module.h URIs when updating this */
598
599
static const CK_SLOT_INFO MOCK_INFO_TWO = {
600
  "TEST SLOT                                                       ",
601
  "TEST MANUFACTURER               ",
602
  CKF_REMOVABLE_DEVICE,
603
  { 55, 155 },
604
  { 65, 165 },
605
};
606
607
CK_RV
608
mock_C_GetSlotInfo (CK_SLOT_ID slot_id,
609
                    CK_SLOT_INFO_PTR info)
610
0
{
611
0
  return_val_if_fail (info, CKR_ARGUMENTS_BAD);
612
613
0
  if (slot_id == MOCK_SLOT_ONE_ID) {
614
0
    memcpy (info, &MOCK_INFO_ONE, sizeof (*info));
615
0
    return CKR_OK;
616
0
  } else if (slot_id == MOCK_SLOT_TWO_ID) {
617
0
    memcpy (info, &MOCK_INFO_TWO, sizeof (*info));
618
0
    return CKR_OK;
619
0
  } else {
620
0
    return CKR_SLOT_ID_INVALID;
621
0
  }
622
0
}
623
624
CK_RV
625
mock_C_GetSlotList__fail_first (CK_BBOOL token_present,
626
                                CK_SLOT_ID_PTR slot_list,
627
                                CK_ULONG_PTR count)
628
0
{
629
0
  return CKR_VENDOR_DEFINED;
630
0
}
631
632
CK_RV
633
mock_C_GetSlotList__fail_late (CK_BBOOL token_present,
634
                               CK_SLOT_ID_PTR slot_list,
635
                               CK_ULONG_PTR count)
636
0
{
637
0
  if (!slot_list)
638
0
    return mock_C_GetSlotList (token_present, slot_list, count);
639
0
  return CKR_VENDOR_DEFINED;
640
0
}
641
642
CK_RV
643
mock_C_GetSlotInfo__invalid_slotid (CK_SLOT_ID id,
644
                                    CK_SLOT_INFO_PTR info)
645
0
{
646
0
  return_val_if_fail (info, CKR_ARGUMENTS_BAD);
647
648
0
  return CKR_SLOT_ID_INVALID;
649
0
}
650
651
CK_RV
652
mock_X_GetSlotInfo__invalid_slotid (CK_X_FUNCTION_LIST *self,
653
                                    CK_SLOT_ID id,
654
                                    CK_SLOT_INFO_PTR info)
655
0
{
656
0
  return_val_if_fail (info, CKR_ARGUMENTS_BAD);
657
658
0
  return CKR_SLOT_ID_INVALID;
659
0
}
660
661
/* Update gck-mock.h URIs when updating this */
662
663
static const CK_TOKEN_INFO MOCK_TOKEN_ONE = {
664
  "TEST LABEL                      ",
665
  "TEST MANUFACTURER               ",
666
  "TEST MODEL      ",
667
  "TEST SERIAL     ",
668
  CKF_LOGIN_REQUIRED | CKF_USER_PIN_INITIALIZED | CKF_CLOCK_ON_TOKEN | CKF_TOKEN_INITIALIZED,
669
  1,
670
  2,
671
  3,
672
  4,
673
  5,
674
  6,
675
  7,
676
  8,
677
  9,
678
  10,
679
  { 75, 175 },
680
  { 85, 185 },
681
  { '1', '9', '9', '9', '0', '5', '2', '5', '0', '9', '1', '9', '5', '9', '0', '0' }
682
};
683
684
CK_RV
685
mock_C_GetTokenInfo (CK_SLOT_ID slot_id,
686
                     CK_TOKEN_INFO_PTR info)
687
0
{
688
0
  return_val_if_fail (info != NULL, CKR_ARGUMENTS_BAD);
689
690
0
  if (slot_id == MOCK_SLOT_ONE_ID) {
691
0
    memcpy (info, &MOCK_TOKEN_ONE, sizeof (*info));
692
0
    return CKR_OK;
693
0
  } else if (slot_id == MOCK_SLOT_TWO_ID) {
694
0
    return CKR_TOKEN_NOT_PRESENT;
695
0
  } else {
696
0
    return CKR_SLOT_ID_INVALID;
697
0
  }
698
0
}
699
700
CK_RV
701
mock_C_GetTokenInfo__invalid_slotid (CK_SLOT_ID slot_id,
702
                                     CK_TOKEN_INFO_PTR info)
703
0
{
704
0
  return_val_if_fail (info, CKR_ARGUMENTS_BAD);
705
706
0
  return CKR_SLOT_ID_INVALID;
707
0
}
708
709
CK_RV
710
mock_X_GetTokenInfo__invalid_slotid (CK_X_FUNCTION_LIST *self,
711
                                     CK_SLOT_ID slot_id,
712
                                     CK_TOKEN_INFO_PTR info)
713
0
{
714
0
  return_val_if_fail (info, CKR_ARGUMENTS_BAD);
715
716
0
  return CKR_SLOT_ID_INVALID;
717
0
}
718
719
/*
720
 * TWO mechanisms:
721
 *  CKM_MOCK_CAPITALIZE
722
 *  CKM_MOCK_PREFIX
723
 */
724
725
CK_RV
726
mock_C_GetMechanismList (CK_SLOT_ID slot_id,
727
                         CK_MECHANISM_TYPE_PTR mechanism_list,
728
                         CK_ULONG_PTR count)
729
0
{
730
0
  return_val_if_fail (count != NULL, CKR_ARGUMENTS_BAD);
731
732
0
  if (slot_id == MOCK_SLOT_TWO_ID)
733
0
    return CKR_TOKEN_NOT_PRESENT;
734
0
  else if (slot_id != MOCK_SLOT_ONE_ID)
735
0
    return CKR_SLOT_ID_INVALID;
736
737
  /* Application only wants to know the number of slots. */
738
0
  if (mechanism_list == NULL) {
739
0
    *count = 2;
740
0
    return CKR_OK;
741
0
  }
742
743
0
  if (*count < 2)
744
0
    return_val_if_reached (CKR_BUFFER_TOO_SMALL);
745
746
0
  mechanism_list[0] = CKM_MOCK_CAPITALIZE;
747
0
  mechanism_list[1] = CKM_MOCK_PREFIX;
748
0
  *count = 2;
749
0
  return CKR_OK;
750
0
}
751
752
CK_RV
753
mock_C_GetTokenInfo__not_initialized (CK_SLOT_ID slot_id,
754
                                      CK_TOKEN_INFO_PTR info)
755
0
{
756
0
  CK_RV rv;
757
758
0
  rv = mock_C_GetTokenInfo (slot_id, info);
759
0
  if (rv == CKR_OK)
760
0
    info->flags &= ~ CKF_TOKEN_INITIALIZED;
761
762
0
  return rv;
763
0
}
764
765
/*
766
 * TWO mechanisms:
767
 *  CKM_MOCK_CAPITALIZE
768
 *  CKM_MOCK_PREFIX
769
 */
770
771
CK_RV
772
mock_C_GetMechanismList__invalid_slotid (CK_SLOT_ID id,
773
                                         CK_MECHANISM_TYPE_PTR mechanism_list,
774
                                         CK_ULONG_PTR count)
775
0
{
776
0
  return_val_if_fail (count, CKR_ARGUMENTS_BAD);
777
778
0
  return CKR_SLOT_ID_INVALID;
779
0
}
780
781
CK_RV
782
mock_X_GetMechanismList__invalid_slotid (CK_X_FUNCTION_LIST *self,
783
                                         CK_SLOT_ID id,
784
                                         CK_MECHANISM_TYPE_PTR mechanism_list,
785
                                         CK_ULONG_PTR count)
786
0
{
787
0
  return_val_if_fail (count, CKR_ARGUMENTS_BAD);
788
789
0
  return CKR_SLOT_ID_INVALID;
790
0
}
791
792
static const CK_MECHANISM_INFO MOCK_MECH_CAPITALIZE = {
793
  512, 4096, CKF_ENCRYPT | CKF_DECRYPT
794
};
795
796
static const CK_MECHANISM_INFO MOCK_MECH_PREFIX = {
797
  2048, 2048, CKF_SIGN | CKF_VERIFY
798
};
799
800
CK_RV
801
mock_C_GetMechanismInfo (CK_SLOT_ID slot_id,
802
                         CK_MECHANISM_TYPE type,
803
                         CK_MECHANISM_INFO_PTR info)
804
0
{
805
0
  return_val_if_fail (info, CKR_ARGUMENTS_BAD);
806
807
0
  if (slot_id == MOCK_SLOT_TWO_ID)
808
0
    return CKR_TOKEN_NOT_PRESENT;
809
0
  else if (slot_id != MOCK_SLOT_ONE_ID)
810
0
    return CKR_SLOT_ID_INVALID;
811
812
0
  if (type == CKM_MOCK_CAPITALIZE) {
813
0
    memcpy (info, &MOCK_MECH_CAPITALIZE, sizeof (*info));
814
0
    return CKR_OK;
815
0
  } else if (type == CKM_MOCK_PREFIX) {
816
0
    memcpy (info, &MOCK_MECH_PREFIX, sizeof (*info));
817
0
    return CKR_OK;
818
0
  } else {
819
0
    return CKR_MECHANISM_INVALID;
820
0
  }
821
0
}
822
823
CK_RV
824
mock_C_GetMechanismInfo__invalid_slotid (CK_SLOT_ID slot_id,
825
                                         CK_MECHANISM_TYPE type,
826
                                         CK_MECHANISM_INFO_PTR info)
827
0
{
828
0
  return_val_if_fail (info, CKR_ARGUMENTS_BAD);
829
830
0
  return CKR_SLOT_ID_INVALID;
831
0
}
832
833
CK_RV
834
mock_X_GetMechanismInfo__invalid_slotid (CK_X_FUNCTION_LIST *self,
835
                                         CK_SLOT_ID slot_id,
836
                                         CK_MECHANISM_TYPE type,
837
                                         CK_MECHANISM_INFO_PTR info)
838
0
{
839
0
  return_val_if_fail (info, CKR_ARGUMENTS_BAD);
840
841
0
  return CKR_SLOT_ID_INVALID;
842
0
}
843
844
CK_RV
845
mock_C_InitToken__specific_args (CK_SLOT_ID slot_id,
846
                                 CK_UTF8CHAR_PTR pin,
847
                                 CK_ULONG pin_len,
848
                                 CK_UTF8CHAR_PTR label)
849
0
{
850
0
  return_val_if_fail (pin != NULL, CKR_ARGUMENTS_BAD);
851
0
  return_val_if_fail (label != NULL, CKR_ARGUMENTS_BAD);
852
853
0
  if (slot_id == MOCK_SLOT_TWO_ID)
854
0
    return CKR_TOKEN_NOT_PRESENT;
855
0
  else if (slot_id != MOCK_SLOT_ONE_ID)
856
0
    return CKR_SLOT_ID_INVALID;
857
858
0
  if (strlen ("TEST PIN") != pin_len ||
859
0
      strncmp ((char *)pin, "TEST PIN", pin_len) != 0)
860
0
    return CKR_PIN_INVALID;
861
0
  if (strcmp ((char *)label, "TEST LABEL") != 0)
862
0
    return CKR_ARGUMENTS_BAD;
863
864
0
  free (the_pin);
865
0
  the_pin = memdup (pin, pin_len);
866
0
  return_val_if_fail (the_pin != NULL, CKR_HOST_MEMORY);
867
0
  n_the_pin = pin_len;
868
0
  return CKR_OK;
869
0
}
870
871
/* TODO specific flags username */
872
873
CK_RV
874
mock_C_InitToken__invalid_slotid (CK_SLOT_ID slot_id,
875
                                  CK_UTF8CHAR_PTR pin,
876
                                  CK_ULONG pin_len,
877
                                  CK_UTF8CHAR_PTR label)
878
0
{
879
0
  return CKR_SLOT_ID_INVALID;
880
0
}
881
882
CK_RV
883
mock_X_InitToken__invalid_slotid (CK_X_FUNCTION_LIST *self,
884
                                  CK_SLOT_ID slot_id,
885
                                  CK_UTF8CHAR_PTR pin,
886
                                  CK_ULONG pin_len,
887
                                  CK_UTF8CHAR_PTR label)
888
0
{
889
0
  return CKR_SLOT_ID_INVALID;
890
0
}
891
892
CK_RV
893
mock_C_WaitForSlotEvent (CK_FLAGS flags,
894
                         CK_SLOT_ID_PTR slot,
895
                         CK_VOID_PTR reserved)
896
0
{
897
0
  return_val_if_fail (slot, CKR_ARGUMENTS_BAD);
898
899
0
  if (flags & CKF_DONT_BLOCK)
900
0
    return CKR_NO_EVENT;
901
902
0
  *slot = MOCK_SLOT_TWO_ID;
903
0
  return CKR_OK;
904
0
}
905
906
CK_RV
907
mock_C_WaitForSlotEvent__no_event (CK_FLAGS flags,
908
                                   CK_SLOT_ID_PTR slot,
909
                                   CK_VOID_PTR reserved)
910
0
{
911
0
  return_val_if_fail (slot, CKR_ARGUMENTS_BAD);
912
913
0
  return CKR_NO_EVENT;
914
0
}
915
916
CK_RV
917
mock_X_WaitForSlotEvent__no_event (CK_X_FUNCTION_LIST *self,
918
                                   CK_FLAGS flags,
919
                                   CK_SLOT_ID_PTR slot,
920
                                   CK_VOID_PTR reserved)
921
0
{
922
0
  return_val_if_fail (slot, CKR_ARGUMENTS_BAD);
923
924
0
  return CKR_NO_EVENT;
925
0
}
926
927
CK_RV
928
mock_C_OpenSession (CK_SLOT_ID slot_id,
929
                    CK_FLAGS flags,
930
                    CK_VOID_PTR user_data,
931
                    CK_NOTIFY callback,
932
                    CK_SESSION_HANDLE_PTR session)
933
0
{
934
0
  Session *sess;
935
936
0
  return_val_if_fail (session, CKR_ARGUMENTS_BAD);
937
938
0
  if (slot_id == MOCK_SLOT_TWO_ID)
939
0
    return CKR_TOKEN_NOT_PRESENT;
940
0
  else if (slot_id != MOCK_SLOT_ONE_ID)
941
0
    return CKR_SLOT_ID_INVALID;
942
0
  if ((flags & CKF_SERIAL_SESSION) != CKF_SERIAL_SESSION)
943
0
    return CKR_SESSION_PARALLEL_NOT_SUPPORTED;
944
945
0
  sess = calloc (1, sizeof (Session));
946
0
  return_val_if_fail (sess != NULL, CKR_HOST_MEMORY);
947
0
  sess->handle = ++unique_identifier;
948
0
  sess->info.flags = flags;
949
0
  sess->info.slotID = slot_id;
950
0
  sess->info.state = 0;
951
0
  sess->info.ulDeviceError = 1414;
952
0
  sess->objects = p11_dict_new (p11_dict_direct_hash, p11_dict_direct_equal,
953
0
                                NULL, p11_attrs_free);
954
0
  *session = sess->handle;
955
956
0
  memcpy (sess->random_seed, "random", 6);
957
0
  sess->random_seed_len = 6;
958
959
0
  p11_dict_set (the_sessions, handle_to_pointer (sess->handle), sess);
960
0
  return CKR_OK;
961
0
}
962
963
CK_RV
964
mock_C_OpenSession__invalid_slotid (CK_SLOT_ID slot_id,
965
                                    CK_FLAGS flags,
966
                                    CK_VOID_PTR user_data,
967
                                    CK_NOTIFY callback,
968
                                    CK_SESSION_HANDLE_PTR session)
969
0
{
970
0
  return_val_if_fail (session, CKR_ARGUMENTS_BAD);
971
972
0
  return CKR_SLOT_ID_INVALID;
973
0
}
974
975
CK_RV
976
mock_X_OpenSession__invalid_slotid (CK_X_FUNCTION_LIST *self,
977
                                    CK_SLOT_ID slot_id,
978
                                    CK_FLAGS flags,
979
                                    CK_VOID_PTR user_data,
980
                                    CK_NOTIFY callback,
981
                                    CK_SESSION_HANDLE_PTR session)
982
0
{
983
0
  return_val_if_fail (session, CKR_ARGUMENTS_BAD);
984
985
0
  return CKR_SLOT_ID_INVALID;
986
0
}
987
988
CK_RV
989
mock_C_OpenSession__fails (CK_SLOT_ID slot_id,
990
                           CK_FLAGS flags,
991
                           CK_VOID_PTR user_data,
992
                           CK_NOTIFY callback,
993
                           CK_SESSION_HANDLE_PTR session)
994
0
{
995
0
  return_val_if_fail (session, CKR_ARGUMENTS_BAD);
996
997
0
  return CKR_DEVICE_ERROR;
998
0
}
999
1000
CK_RV
1001
mock_C_CloseSession (CK_SESSION_HANDLE session)
1002
0
{
1003
0
  Session *sess;
1004
1005
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1006
0
  if (!sess)
1007
0
    return CKR_SESSION_HANDLE_INVALID;
1008
1009
0
  p11_dict_remove (the_sessions, handle_to_pointer (session));
1010
0
  return CKR_OK;
1011
0
}
1012
1013
CK_RV
1014
mock_C_CloseSession__invalid_handle (CK_SESSION_HANDLE session)
1015
0
{
1016
0
  return CKR_SESSION_HANDLE_INVALID;
1017
0
}
1018
1019
CK_RV
1020
mock_X_CloseSession__invalid_handle (CK_X_FUNCTION_LIST *self,
1021
                                     CK_SESSION_HANDLE session)
1022
0
{
1023
0
  return CKR_SESSION_HANDLE_INVALID;
1024
0
}
1025
1026
CK_RV
1027
mock_C_CloseAllSessions (CK_SLOT_ID slot_id)
1028
0
{
1029
0
  if (slot_id == MOCK_SLOT_TWO_ID)
1030
0
    return CKR_TOKEN_NOT_PRESENT;
1031
0
  else if (slot_id != MOCK_SLOT_ONE_ID)
1032
0
    return CKR_SLOT_ID_INVALID;
1033
1034
0
  p11_dict_clear (the_sessions);
1035
0
  return CKR_OK;
1036
0
}
1037
1038
CK_RV
1039
mock_C_CloseAllSessions__invalid_slotid (CK_SLOT_ID slot_id)
1040
0
{
1041
0
  return CKR_SLOT_ID_INVALID;
1042
0
}
1043
1044
CK_RV
1045
mock_X_CloseAllSessions__invalid_slotid (CK_X_FUNCTION_LIST *self,
1046
                                         CK_SLOT_ID slot_id)
1047
0
{
1048
0
  return CKR_SLOT_ID_INVALID;
1049
0
}
1050
1051
CK_RV
1052
mock_C_GetFunctionStatus (CK_SESSION_HANDLE session)
1053
0
{
1054
0
  if (!p11_dict_get (the_sessions, handle_to_pointer (session)))
1055
0
    return CKR_SESSION_HANDLE_INVALID;
1056
0
  return CKR_FUNCTION_NOT_PARALLEL;
1057
0
}
1058
1059
CK_RV
1060
mock_C_GetFunctionStatus__not_parallel (CK_SESSION_HANDLE session)
1061
0
{
1062
0
  return CKR_FUNCTION_NOT_PARALLEL;
1063
0
}
1064
1065
CK_RV
1066
mock_C_CancelFunction (CK_SESSION_HANDLE session)
1067
0
{
1068
0
  if (!p11_dict_get (the_sessions, handle_to_pointer (session)))
1069
0
    return CKR_SESSION_HANDLE_INVALID;
1070
0
  return CKR_FUNCTION_NOT_PARALLEL;
1071
0
}
1072
1073
CK_RV
1074
mock_C_CancelFunction__not_parallel (CK_SESSION_HANDLE session)
1075
0
{
1076
0
  return CKR_FUNCTION_NOT_PARALLEL;
1077
0
}
1078
1079
CK_RV
1080
mock_C_GetSessionInfo (CK_SESSION_HANDLE session,
1081
                       CK_SESSION_INFO_PTR info)
1082
0
{
1083
0
  Session *sess;
1084
1085
0
  return_val_if_fail (info != NULL, CKR_ARGUMENTS_BAD);
1086
1087
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1088
0
  if (!sess)
1089
0
    return CKR_SESSION_HANDLE_INVALID;
1090
1091
0
  if (logged_in) {
1092
0
    if (sess->info.flags & CKF_RW_SESSION)
1093
0
      sess->info.state = CKS_RW_USER_FUNCTIONS;
1094
0
    else
1095
0
      sess->info.state = CKS_RO_USER_FUNCTIONS;
1096
0
  } else {
1097
0
    if (sess->info.flags & CKF_RW_SESSION)
1098
0
      sess->info.state = CKS_RW_PUBLIC_SESSION;
1099
0
    else
1100
0
      sess->info.state = CKS_RO_PUBLIC_SESSION;
1101
0
  }
1102
1103
0
  memcpy (info, &sess->info, sizeof (*info));
1104
0
  return CKR_OK;
1105
0
}
1106
1107
CK_RV
1108
mock_C_GetSessionInfo__invalid_handle (CK_SESSION_HANDLE session,
1109
                                       CK_SESSION_INFO_PTR info)
1110
0
{
1111
0
  return_val_if_fail (info, CKR_ARGUMENTS_BAD);
1112
1113
0
  return CKR_SESSION_HANDLE_INVALID;
1114
0
}
1115
1116
CK_RV
1117
mock_X_GetSessionInfo__invalid_handle (CK_X_FUNCTION_LIST *self,
1118
                                       CK_SESSION_HANDLE session,
1119
                                       CK_SESSION_INFO_PTR info)
1120
0
{
1121
0
  return_val_if_fail (info, CKR_ARGUMENTS_BAD);
1122
1123
0
  return CKR_SESSION_HANDLE_INVALID;
1124
0
}
1125
1126
CK_RV
1127
mock_C_InitPIN__specific_args (CK_SESSION_HANDLE session,
1128
                               CK_UTF8CHAR_PTR pin,
1129
                               CK_ULONG pin_len)
1130
0
{
1131
0
  Session *sess;
1132
1133
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1134
0
  if (sess == NULL)
1135
0
    return CKR_SESSION_HANDLE_INVALID;
1136
1137
0
  if (strlen ("TEST PIN") != pin_len ||
1138
0
      strncmp ((char *)pin, "TEST PIN", pin_len) != 0)
1139
0
    return CKR_PIN_INVALID;
1140
1141
0
  free (the_pin);
1142
0
  the_pin = memdup (pin, pin_len);
1143
0
  return_val_if_fail (the_pin != NULL, CKR_HOST_MEMORY);
1144
0
  n_the_pin = pin_len;
1145
0
  return CKR_OK;
1146
0
}
1147
1148
CK_RV
1149
mock_C_InitPIN__invalid_handle (CK_SESSION_HANDLE session,
1150
                                CK_UTF8CHAR_PTR pin,
1151
                                CK_ULONG pin_len)
1152
0
{
1153
0
  return CKR_SESSION_HANDLE_INVALID;
1154
0
}
1155
1156
CK_RV
1157
mock_X_InitPIN__invalid_handle (CK_X_FUNCTION_LIST *self,
1158
                                CK_SESSION_HANDLE session,
1159
                                CK_UTF8CHAR_PTR pin,
1160
                                CK_ULONG pin_len)
1161
0
{
1162
0
  return CKR_SESSION_HANDLE_INVALID;
1163
0
}
1164
1165
CK_RV
1166
mock_C_SetPIN__specific_args (CK_SESSION_HANDLE session,
1167
                              CK_UTF8CHAR_PTR old_pin,
1168
                              CK_ULONG old_pin_len,
1169
                              CK_UTF8CHAR_PTR new_pin,
1170
                              CK_ULONG new_pin_len)
1171
0
{
1172
0
  Session *sess;
1173
1174
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1175
0
  if (sess == NULL)
1176
0
    return CKR_SESSION_HANDLE_INVALID;
1177
1178
0
  if (old_pin_len != n_the_pin)
1179
0
    return CKR_PIN_INCORRECT;
1180
0
  if (memcmp (old_pin, the_pin, n_the_pin) != 0)
1181
0
    return CKR_PIN_INCORRECT;
1182
1183
0
  if (strlen ("TEST PIN") != new_pin_len ||
1184
0
      strncmp ((char *)new_pin, "TEST PIN", new_pin_len) != 0)
1185
0
    return CKR_PIN_INVALID;
1186
1187
0
  free (the_pin);
1188
0
  the_pin = memdup (new_pin, new_pin_len);
1189
0
  return_val_if_fail (the_pin != NULL, CKR_HOST_MEMORY);
1190
0
  n_the_pin = new_pin_len;
1191
0
  return CKR_OK;
1192
0
}
1193
1194
CK_RV
1195
mock_C_SetPIN__invalid_handle (CK_SESSION_HANDLE session,
1196
                               CK_UTF8CHAR_PTR old_pin,
1197
                               CK_ULONG old_pin_len,
1198
                               CK_UTF8CHAR_PTR new_pin,
1199
                               CK_ULONG new_pin_len)
1200
0
{
1201
0
  return CKR_SESSION_HANDLE_INVALID;
1202
0
}
1203
1204
CK_RV
1205
mock_X_SetPIN__invalid_handle (CK_X_FUNCTION_LIST *self,
1206
                               CK_SESSION_HANDLE session,
1207
                               CK_UTF8CHAR_PTR old_pin,
1208
                               CK_ULONG old_pin_len,
1209
                               CK_UTF8CHAR_PTR new_pin,
1210
                               CK_ULONG new_pin_len)
1211
0
{
1212
0
  return CKR_SESSION_HANDLE_INVALID;
1213
0
}
1214
1215
CK_RV
1216
mock_C_GetOperationState (CK_SESSION_HANDLE session,
1217
                          CK_BYTE_PTR operation_state,
1218
                          CK_ULONG_PTR operation_state_len)
1219
0
{
1220
0
  Session *sess;
1221
1222
0
  return_val_if_fail (operation_state_len, CKR_ARGUMENTS_BAD);
1223
1224
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1225
0
  if (sess == NULL)
1226
0
    return CKR_SESSION_HANDLE_INVALID;
1227
1228
0
  if (!operation_state) {
1229
0
    *operation_state_len = sizeof (sess);
1230
0
    return CKR_OK;
1231
0
  }
1232
1233
0
  if (*operation_state_len < sizeof (sess))
1234
0
    return CKR_BUFFER_TOO_SMALL;
1235
1236
0
  memcpy (operation_state, &sess, sizeof (sess));
1237
0
  *operation_state_len = sizeof (sess);
1238
0
  return CKR_OK;
1239
0
}
1240
1241
CK_RV
1242
mock_C_GetOperationState__invalid_handle (CK_SESSION_HANDLE session,
1243
                                          CK_BYTE_PTR operation_state,
1244
                                          CK_ULONG_PTR operation_state_len)
1245
0
{
1246
0
  return CKR_FUNCTION_NOT_SUPPORTED;
1247
0
}
1248
1249
CK_RV
1250
mock_X_GetOperationState__invalid_handle (CK_X_FUNCTION_LIST *self,
1251
                                          CK_SESSION_HANDLE session,
1252
                                          CK_BYTE_PTR operation_state,
1253
                                          CK_ULONG_PTR operation_state_len)
1254
0
{
1255
0
  return CKR_FUNCTION_NOT_SUPPORTED;
1256
0
}
1257
1258
CK_RV
1259
mock_C_SetOperationState (CK_SESSION_HANDLE session,
1260
                          CK_BYTE_PTR operation_state,
1261
                          CK_ULONG operation_state_len,
1262
                          CK_OBJECT_HANDLE encryption_key,
1263
                          CK_OBJECT_HANDLE authentication_key)
1264
0
{
1265
0
  Session *sess;
1266
1267
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1268
0
  if (sess == NULL)
1269
0
    return CKR_SESSION_HANDLE_INVALID;
1270
1271
0
  if (!operation_state || operation_state_len != sizeof (sess))
1272
0
    return CKR_ARGUMENTS_BAD;
1273
1274
  /* Yes, just arbitrary numbers, to make sure they got through */
1275
0
  if (encryption_key != 355 || authentication_key != 455)
1276
0
    return CKR_KEY_HANDLE_INVALID;
1277
0
  if (memcmp (operation_state, &sess, sizeof (sess)) != 0)
1278
0
    return CKR_SAVED_STATE_INVALID;
1279
0
  return CKR_OK;
1280
0
}
1281
1282
CK_RV
1283
mock_C_SetOperationState__invalid_handle (CK_SESSION_HANDLE session,
1284
                                          CK_BYTE_PTR operation_state,
1285
                                          CK_ULONG operation_state_len,
1286
                                          CK_OBJECT_HANDLE encryption_key,
1287
                                          CK_OBJECT_HANDLE authentication_key)
1288
0
{
1289
0
  return CKR_SESSION_HANDLE_INVALID;
1290
0
}
1291
1292
CK_RV
1293
mock_X_SetOperationState__invalid_handle (CK_X_FUNCTION_LIST *self,
1294
                                          CK_SESSION_HANDLE session,
1295
                                          CK_BYTE_PTR operation_state,
1296
                                          CK_ULONG operation_state_len,
1297
                                          CK_OBJECT_HANDLE encryption_key,
1298
                                          CK_OBJECT_HANDLE authentication_key)
1299
0
{
1300
0
  return CKR_SESSION_HANDLE_INVALID;
1301
0
}
1302
1303
CK_RV
1304
mock_C_Login (CK_SESSION_HANDLE session,
1305
              CK_USER_TYPE user_type,
1306
              CK_UTF8CHAR_PTR pin,
1307
              CK_ULONG pin_len)
1308
0
{
1309
0
  Session *sess;
1310
1311
0
  return_val_if_fail (user_type == CKU_SO ||
1312
0
                      user_type == CKU_USER ||
1313
0
                      user_type == CKU_CONTEXT_SPECIFIC,
1314
0
                      CKR_USER_TYPE_INVALID);
1315
1316
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1317
0
  if (sess == NULL)
1318
0
    return CKR_SESSION_HANDLE_INVALID;
1319
1320
0
  if (logged_in && user_type != CKU_CONTEXT_SPECIFIC)
1321
0
    return CKR_USER_ALREADY_LOGGED_IN;
1322
1323
0
  if (!pin)
1324
0
    return CKR_PIN_INCORRECT;
1325
1326
0
  if (pin_len != n_the_pin)
1327
0
    return CKR_PIN_INCORRECT;
1328
0
  if (strncmp ((char *)pin, (char *)the_pin, pin_len) != 0)
1329
0
    return CKR_PIN_INCORRECT;
1330
1331
0
  if (user_type == CKU_CONTEXT_SPECIFIC) {
1332
0
    return_val_if_fail (sess->want_context_login, CKR_OPERATION_NOT_INITIALIZED);
1333
0
    sess->want_context_login = false;
1334
0
  } else {
1335
0
    logged_in = true;
1336
0
    the_user_type = user_type;
1337
0
  }
1338
1339
0
  return CKR_OK;
1340
0
}
1341
1342
CK_RV
1343
mock_C_Login__invalid_handle (CK_SESSION_HANDLE session,
1344
                              CK_USER_TYPE user_type,
1345
                              CK_UTF8CHAR_PTR pin,
1346
                              CK_ULONG pin_len)
1347
0
{
1348
0
  return CKR_SESSION_HANDLE_INVALID;
1349
0
}
1350
1351
CK_RV
1352
mock_X_Login__invalid_handle (CK_X_FUNCTION_LIST *self,
1353
                              CK_SESSION_HANDLE session,
1354
                              CK_USER_TYPE user_type,
1355
                              CK_UTF8CHAR_PTR pin,
1356
                              CK_ULONG pin_len)
1357
0
{
1358
0
  return CKR_SESSION_HANDLE_INVALID;
1359
0
}
1360
1361
CK_RV
1362
mock_C_Logout (CK_SESSION_HANDLE session)
1363
0
{
1364
0
  Session *sess;
1365
1366
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1367
0
  if (!sess)
1368
0
    return CKR_SESSION_HANDLE_INVALID;
1369
1370
0
  if (!logged_in)
1371
0
    return CKR_USER_NOT_LOGGED_IN;
1372
1373
0
  logged_in = false;
1374
0
  the_user_type = 0;
1375
0
  return CKR_OK;
1376
0
}
1377
1378
CK_RV
1379
mock_C_Logout__invalid_handle (CK_SESSION_HANDLE session)
1380
0
{
1381
0
  return CKR_SESSION_HANDLE_INVALID;
1382
0
}
1383
1384
CK_RV
1385
mock_X_Logout__invalid_handle (CK_X_FUNCTION_LIST *self,
1386
                               CK_SESSION_HANDLE session)
1387
0
{
1388
0
  return CKR_SESSION_HANDLE_INVALID;
1389
0
}
1390
1391
CK_RV
1392
mock_C_CreateObject (CK_SESSION_HANDLE session,
1393
                     CK_ATTRIBUTE_PTR template,
1394
                     CK_ULONG count,
1395
                     CK_OBJECT_HANDLE_PTR object)
1396
0
{
1397
0
  CK_ATTRIBUTE *attrs;
1398
0
  Session *sess;
1399
0
  CK_BBOOL token, priv;
1400
1401
0
  return_val_if_fail (object, CKR_ARGUMENTS_BAD);
1402
1403
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1404
0
  if (!sess)
1405
0
    return CKR_SESSION_HANDLE_INVALID;
1406
1407
0
  attrs = p11_attrs_buildn (NULL, template, count);
1408
1409
0
  if (p11_attrs_find_bool (attrs, CKA_PRIVATE, &priv) && priv) {
1410
0
    if (!logged_in) {
1411
0
      p11_attrs_free (attrs);
1412
0
      return CKR_USER_NOT_LOGGED_IN;
1413
0
    }
1414
0
  }
1415
1416
0
  *object = ++unique_identifier;
1417
0
  if (p11_attrs_find_bool (attrs, CKA_TOKEN, &token) && token)
1418
0
    p11_dict_set (the_objects, handle_to_pointer (*object), attrs);
1419
0
  else
1420
0
    p11_dict_set (sess->objects, handle_to_pointer (*object), attrs);
1421
1422
0
  return CKR_OK;
1423
0
}
1424
1425
CK_RV
1426
mock_C_CreateObject__invalid_handle (CK_SESSION_HANDLE session,
1427
                                     CK_ATTRIBUTE_PTR template,
1428
                                     CK_ULONG count,
1429
                                     CK_OBJECT_HANDLE_PTR new_object)
1430
1
{
1431
1
  return_val_if_fail (new_object, CKR_ARGUMENTS_BAD);
1432
1433
1
  return CKR_SESSION_HANDLE_INVALID;
1434
1
}
1435
1436
CK_RV
1437
mock_X_CreateObject__invalid_handle (CK_X_FUNCTION_LIST *self,
1438
                                     CK_SESSION_HANDLE session,
1439
                                     CK_ATTRIBUTE_PTR template,
1440
                                     CK_ULONG count,
1441
                                     CK_OBJECT_HANDLE_PTR new_object)
1442
0
{
1443
0
  return_val_if_fail (new_object, CKR_ARGUMENTS_BAD);
1444
1445
0
  return CKR_SESSION_HANDLE_INVALID;
1446
0
}
1447
1448
CK_RV
1449
mock_C_CopyObject (CK_SESSION_HANDLE session,
1450
                   CK_OBJECT_HANDLE object,
1451
                   CK_ATTRIBUTE_PTR template,
1452
                   CK_ULONG count,
1453
                   CK_OBJECT_HANDLE_PTR new_object)
1454
0
{
1455
0
  CK_ATTRIBUTE *attrs;
1456
0
  Session *sess;
1457
0
  CK_BBOOL token, priv;
1458
0
  CK_RV rv;
1459
1460
0
  return_val_if_fail (object, CKR_ARGUMENTS_BAD);
1461
1462
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1463
0
  if (!sess)
1464
0
    return CKR_SESSION_HANDLE_INVALID;
1465
1466
0
  rv = lookup_object (sess, object, &attrs, NULL);
1467
0
  if (rv != CKR_OK)
1468
0
    return rv;
1469
1470
0
  if (p11_attrs_find_bool (attrs, CKA_PRIVATE, &priv) && priv) {
1471
0
    if (!logged_in)
1472
0
      return CKR_USER_NOT_LOGGED_IN;
1473
0
  }
1474
1475
0
  attrs = p11_attrs_buildn (p11_attrs_dup (attrs), template, count);
1476
1477
0
  *new_object = ++unique_identifier;
1478
0
  if (p11_attrs_find_bool (attrs, CKA_TOKEN, &token) && token)
1479
0
    p11_dict_set (the_objects, handle_to_pointer (*new_object), attrs);
1480
0
  else
1481
0
    p11_dict_set (sess->objects, handle_to_pointer (*new_object), attrs);
1482
1483
0
  return CKR_OK;
1484
0
}
1485
1486
CK_RV
1487
mock_C_CopyObject__invalid_handle (CK_SESSION_HANDLE session,
1488
                                   CK_OBJECT_HANDLE object,
1489
                                   CK_ATTRIBUTE_PTR template,
1490
                                   CK_ULONG count,
1491
                                   CK_OBJECT_HANDLE_PTR new_object)
1492
0
{
1493
0
  return_val_if_fail (new_object, CKR_ARGUMENTS_BAD);
1494
1495
0
  return CKR_SESSION_HANDLE_INVALID;
1496
0
}
1497
1498
1499
CK_RV
1500
mock_X_CopyObject__invalid_handle (CK_X_FUNCTION_LIST *self,
1501
                                   CK_SESSION_HANDLE session,
1502
                                   CK_OBJECT_HANDLE object,
1503
                                   CK_ATTRIBUTE_PTR template,
1504
                                   CK_ULONG count,
1505
                                   CK_OBJECT_HANDLE_PTR new_object)
1506
0
{
1507
0
  return_val_if_fail (new_object, CKR_ARGUMENTS_BAD);
1508
1509
0
  return CKR_SESSION_HANDLE_INVALID;
1510
0
}
1511
1512
CK_RV
1513
mock_C_DestroyObject (CK_SESSION_HANDLE session,
1514
                      CK_OBJECT_HANDLE object)
1515
0
{
1516
0
  CK_ATTRIBUTE *attrs;
1517
0
  Session *sess;
1518
0
  p11_dict *table;
1519
0
  CK_RV rv;
1520
1521
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1522
0
  if (!sess)
1523
0
    return CKR_SESSION_HANDLE_INVALID;
1524
1525
0
  rv = lookup_object (sess, object, &attrs, &table);
1526
0
  if (rv != CKR_OK)
1527
0
    return rv;
1528
1529
0
  p11_dict_remove (table, handle_to_pointer (object));
1530
0
  return CKR_OK;
1531
0
}
1532
1533
CK_RV
1534
mock_C_DestroyObject__invalid_handle (CK_SESSION_HANDLE session,
1535
                                      CK_OBJECT_HANDLE object)
1536
0
{
1537
0
  return CKR_SESSION_HANDLE_INVALID;
1538
0
}
1539
1540
CK_RV
1541
mock_X_DestroyObject__invalid_handle (CK_X_FUNCTION_LIST *self,
1542
                                      CK_SESSION_HANDLE session,
1543
                                      CK_OBJECT_HANDLE object)
1544
0
{
1545
0
  return CKR_SESSION_HANDLE_INVALID;
1546
0
}
1547
1548
CK_RV
1549
mock_C_GetObjectSize (CK_SESSION_HANDLE session,
1550
                      CK_OBJECT_HANDLE object,
1551
                      CK_ULONG_PTR size)
1552
0
{
1553
0
  CK_ATTRIBUTE *attrs;
1554
0
  Session *sess;
1555
0
  CK_RV rv;
1556
0
  CK_ULONG i;
1557
1558
0
  return_val_if_fail (size != NULL, CKR_ARGUMENTS_BAD);
1559
1560
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1561
0
  if (!sess)
1562
0
    return CKR_SESSION_HANDLE_INVALID;
1563
1564
0
  rv = lookup_object (sess, object, &attrs, NULL);
1565
0
  if (rv != CKR_OK)
1566
0
    return rv;
1567
1568
0
  *size = 0;
1569
0
  for (i = 0; !p11_attrs_terminator (attrs + i); i++) {
1570
0
    if (attrs[i].ulValueLen != (CK_ULONG)-1)
1571
0
      *size += attrs[i].ulValueLen;
1572
0
  }
1573
1574
0
  return CKR_OK;
1575
0
}
1576
1577
CK_RV
1578
mock_C_GetObjectSize__invalid_handle (CK_SESSION_HANDLE session,
1579
                                      CK_OBJECT_HANDLE object,
1580
                                      CK_ULONG_PTR size)
1581
0
{
1582
0
  return_val_if_fail (size, CKR_ARGUMENTS_BAD);
1583
1584
0
  return CKR_SESSION_HANDLE_INVALID;
1585
0
}
1586
1587
CK_RV
1588
mock_X_GetObjectSize__invalid_handle (CK_X_FUNCTION_LIST *self,
1589
                                      CK_SESSION_HANDLE session,
1590
                                      CK_OBJECT_HANDLE object,
1591
                                      CK_ULONG_PTR size)
1592
0
{
1593
0
  return_val_if_fail (size, CKR_ARGUMENTS_BAD);
1594
1595
0
  return CKR_SESSION_HANDLE_INVALID;
1596
0
}
1597
1598
CK_RV
1599
mock_C_GetAttributeValue (CK_SESSION_HANDLE session,
1600
                          CK_OBJECT_HANDLE object,
1601
                          CK_ATTRIBUTE_PTR template,
1602
                          CK_ULONG count)
1603
0
{
1604
0
  CK_ATTRIBUTE *result;
1605
0
  CK_RV ret = CKR_OK;
1606
0
  CK_ATTRIBUTE *attrs;
1607
0
  CK_ATTRIBUTE *attr;
1608
0
  Session *sess;
1609
0
  CK_ULONG i;
1610
0
  CK_RV rv;
1611
1612
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1613
0
  if (sess == NULL)
1614
0
    return CKR_SESSION_HANDLE_INVALID;
1615
1616
0
  rv = lookup_object (sess, object, &attrs, NULL);
1617
0
  if (rv != CKR_OK)
1618
0
    return rv;
1619
1620
0
  for (i = 0; i < count; ++i) {
1621
0
    result = template + i;
1622
0
    attr = p11_attrs_find (attrs, result->type);
1623
0
    if (!attr) {
1624
0
      result->ulValueLen = (CK_ULONG)-1;
1625
0
      ret = CKR_ATTRIBUTE_TYPE_INVALID;
1626
0
      continue;
1627
0
    }
1628
1629
0
    if (!result->pValue) {
1630
0
      result->ulValueLen = attr->ulValueLen;
1631
0
      continue;
1632
0
    }
1633
1634
0
    if (result->ulValueLen >= attr->ulValueLen) {
1635
0
      memcpy (result->pValue, attr->pValue, attr->ulValueLen);
1636
0
      result->ulValueLen = attr->ulValueLen;
1637
0
      continue;
1638
0
    }
1639
1640
0
    result->ulValueLen = (CK_ULONG)-1;
1641
0
    ret = CKR_BUFFER_TOO_SMALL;
1642
0
  }
1643
1644
0
  return ret;
1645
0
}
1646
1647
CK_RV
1648
mock_C_GetAttributeValue__invalid_handle (CK_SESSION_HANDLE session,
1649
                                          CK_OBJECT_HANDLE object,
1650
                                          CK_ATTRIBUTE_PTR template,
1651
                                          CK_ULONG count)
1652
2
{
1653
2
  return CKR_SESSION_HANDLE_INVALID;
1654
2
}
1655
1656
CK_RV
1657
mock_X_GetAttributeValue__invalid_handle (CK_X_FUNCTION_LIST *self,
1658
                                          CK_SESSION_HANDLE session,
1659
                                          CK_OBJECT_HANDLE object,
1660
                                          CK_ATTRIBUTE_PTR template,
1661
                                          CK_ULONG count)
1662
0
{
1663
0
  return CKR_SESSION_HANDLE_INVALID;
1664
0
}
1665
1666
CK_RV
1667
mock_C_GetAttributeValue__fail_first (CK_SESSION_HANDLE session,
1668
                                      CK_OBJECT_HANDLE object,
1669
                                      CK_ATTRIBUTE_PTR template,
1670
                                      CK_ULONG count)
1671
0
{
1672
0
  return CKR_FUNCTION_REJECTED;
1673
0
}
1674
1675
CK_RV
1676
mock_C_GetAttributeValue__fail_late (CK_SESSION_HANDLE session,
1677
                                     CK_OBJECT_HANDLE object,
1678
                                     CK_ATTRIBUTE_PTR template,
1679
                                     CK_ULONG count)
1680
0
{
1681
0
  CK_ULONG i;
1682
1683
0
  for (i = 0; i < count; i++) {
1684
0
    if (template[i].pValue)
1685
0
      return CKR_FUNCTION_FAILED;
1686
0
  }
1687
0
  return mock_C_GetAttributeValue (session, object, template, count);
1688
0
}
1689
1690
CK_RV
1691
mock_C_SetAttributeValue (CK_SESSION_HANDLE session,
1692
                          CK_OBJECT_HANDLE object,
1693
                          CK_ATTRIBUTE_PTR template,
1694
                          CK_ULONG count)
1695
0
{
1696
0
  Session *sess;
1697
0
  CK_ATTRIBUTE *attrs;
1698
0
  p11_dict *table;
1699
0
  CK_RV rv;
1700
1701
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1702
0
  if (!sess)
1703
0
    return CKR_SESSION_HANDLE_INVALID;
1704
1705
0
  rv = lookup_object (sess, object, &attrs, &table);
1706
0
  if (rv != CKR_OK)
1707
0
    return rv;
1708
1709
0
  p11_dict_steal (table, handle_to_pointer (object), NULL, (void **)&attrs);
1710
0
  attrs = p11_attrs_buildn (attrs, template, count);
1711
0
  p11_dict_set (table, handle_to_pointer (object), attrs);
1712
0
  return CKR_OK;
1713
0
}
1714
1715
CK_RV
1716
mock_C_SetAttributeValue__invalid_handle (CK_SESSION_HANDLE session,
1717
                                          CK_OBJECT_HANDLE object,
1718
                                          CK_ATTRIBUTE_PTR template,
1719
                                          CK_ULONG count)
1720
0
{
1721
0
  return CKR_SESSION_HANDLE_INVALID;
1722
0
}
1723
1724
CK_RV
1725
mock_X_SetAttributeValue__invalid_handle (CK_X_FUNCTION_LIST *self,
1726
                                          CK_SESSION_HANDLE session,
1727
                                          CK_OBJECT_HANDLE object,
1728
                                          CK_ATTRIBUTE_PTR template,
1729
                                          CK_ULONG count)
1730
0
{
1731
0
  return CKR_SESSION_HANDLE_INVALID;
1732
0
}
1733
1734
typedef struct _FindObjects {
1735
  CK_ATTRIBUTE *template;
1736
  CK_ULONG count;
1737
  Session *sess;
1738
} FindObjects;
1739
1740
static bool
1741
enumerate_and_find_objects (CK_OBJECT_HANDLE object,
1742
                            CK_ATTRIBUTE *attrs,
1743
                            void *user_data)
1744
0
{
1745
0
  FindObjects *ctx = user_data;
1746
0
  CK_ATTRIBUTE *match;
1747
0
  CK_ATTRIBUTE *attr;
1748
0
  CK_BBOOL private;
1749
0
  CK_ULONG i;
1750
1751
0
  if (!logged_in) {
1752
0
    if (p11_attrs_find_bool (attrs, CKA_PRIVATE, &private) && private)
1753
0
      return 1; /* Continue */
1754
0
  }
1755
1756
0
  for (i = 0; i < ctx->count; ++i) {
1757
0
    match = ctx->template + i;
1758
0
    attr = p11_attrs_find (attrs, match->type);
1759
0
    if (!attr)
1760
0
      return true; /* Continue */
1761
1762
0
    if (attr->ulValueLen != match->ulValueLen ||
1763
0
        memcmp (attr->pValue, match->pValue, attr->ulValueLen) != 0)
1764
0
      return true; /* Continue */
1765
0
  }
1766
1767
0
  p11_array_push (ctx->sess->matches, handle_to_pointer (object));
1768
0
  return true; /* Continue */
1769
0
}
1770
1771
static int
1772
compar_handles (const void *one,
1773
                const void *two)
1774
0
{
1775
0
  void **p1 = (void **)one;
1776
0
  void **p2 = (void **)two;
1777
0
  return pointer_to_handle (*p2) - pointer_to_handle (*p1);
1778
0
}
1779
1780
CK_RV
1781
mock_C_FindObjectsInit (CK_SESSION_HANDLE session,
1782
                        CK_ATTRIBUTE_PTR template,
1783
                        CK_ULONG count)
1784
0
{
1785
0
  Session *sess;
1786
0
  FindObjects ctx;
1787
1788
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1789
0
  if (!sess)
1790
0
    return CKR_SESSION_HANDLE_INVALID;
1791
1792
  /* Starting an operation, cancels any previous one */
1793
0
  sess->crypto_mechanism = 0;
1794
0
  sess->hash_mechanism = 0;
1795
1796
0
  sess->finding = true;
1797
0
  p11_array_free (sess->matches);
1798
0
  sess->matches = p11_array_new (NULL);
1799
1800
0
  ctx.template = template;
1801
0
  ctx.count = count;
1802
0
  ctx.sess = sess;
1803
1804
0
  mock_module_enumerate_objects (session, enumerate_and_find_objects, &ctx);
1805
0
  qsort (sess->matches->elem, sess->matches->num, sizeof (void *), compar_handles);
1806
0
  return CKR_OK;
1807
0
}
1808
1809
CK_RV
1810
mock_C_FindObjectsInit__invalid_handle (CK_SESSION_HANDLE session,
1811
                                        CK_ATTRIBUTE_PTR template,
1812
                                        CK_ULONG count)
1813
0
{
1814
0
  return CKR_SESSION_HANDLE_INVALID;
1815
0
}
1816
1817
CK_RV
1818
mock_X_FindObjectsInit__invalid_handle (CK_X_FUNCTION_LIST *self,
1819
                                        CK_SESSION_HANDLE session,
1820
                                        CK_ATTRIBUTE_PTR template,
1821
                                        CK_ULONG count)
1822
0
{
1823
0
  return CKR_SESSION_HANDLE_INVALID;
1824
0
}
1825
1826
CK_RV
1827
mock_C_FindObjectsInit__fails (CK_SESSION_HANDLE session,
1828
                               CK_ATTRIBUTE_PTR template,
1829
                               CK_ULONG count)
1830
0
{
1831
0
  return CKR_DEVICE_MEMORY;
1832
0
}
1833
1834
CK_RV
1835
mock_C_FindObjects (CK_SESSION_HANDLE session,
1836
                    CK_OBJECT_HANDLE_PTR objects,
1837
                    CK_ULONG max_object_count,
1838
                    CK_ULONG_PTR object_count)
1839
0
{
1840
0
  Session *sess;
1841
1842
0
  return_val_if_fail (objects, CKR_ARGUMENTS_BAD);
1843
0
  return_val_if_fail (object_count, CKR_ARGUMENTS_BAD);
1844
0
  return_val_if_fail (max_object_count != 0, CKR_ARGUMENTS_BAD);
1845
1846
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1847
0
  if (sess == NULL)
1848
0
    return CKR_SESSION_HANDLE_INVALID;
1849
0
  if (!sess->finding)
1850
0
    return CKR_OPERATION_NOT_INITIALIZED;
1851
1852
0
  *object_count = 0;
1853
0
  while (max_object_count > 0) {
1854
0
    if (sess->matches->num == 0)
1855
0
      break;
1856
0
    *objects = pointer_to_handle (sess->matches->elem[sess->matches->num - 1]);
1857
0
    ++objects;
1858
0
    --max_object_count;
1859
0
    ++(*object_count);
1860
0
    p11_array_remove (sess->matches, sess->matches->num - 1);
1861
0
  }
1862
1863
0
  return CKR_OK;
1864
0
}
1865
1866
CK_RV
1867
mock_C_FindObjects__invalid_handle (CK_SESSION_HANDLE session,
1868
                                    CK_OBJECT_HANDLE_PTR objects,
1869
                                    CK_ULONG max_count,
1870
                                    CK_ULONG_PTR count)
1871
0
{
1872
0
  return_val_if_fail (count, CKR_ARGUMENTS_BAD);
1873
1874
0
  return CKR_SESSION_HANDLE_INVALID;
1875
0
}
1876
1877
CK_RV
1878
mock_X_FindObjects__invalid_handle (CK_X_FUNCTION_LIST *self,
1879
                                    CK_SESSION_HANDLE session,
1880
                                    CK_OBJECT_HANDLE_PTR objects,
1881
                                    CK_ULONG max_count,
1882
                                    CK_ULONG_PTR count)
1883
0
{
1884
0
  return_val_if_fail (count, CKR_ARGUMENTS_BAD);
1885
1886
0
  return CKR_SESSION_HANDLE_INVALID;
1887
0
}
1888
1889
CK_RV
1890
mock_C_FindObjects__fails (CK_SESSION_HANDLE session,
1891
                           CK_OBJECT_HANDLE_PTR objects,
1892
                           CK_ULONG max_count,
1893
                           CK_ULONG_PTR count)
1894
0
{
1895
0
  return_val_if_fail (count, CKR_ARGUMENTS_BAD);
1896
1897
0
  return CKR_DEVICE_REMOVED;
1898
0
}
1899
1900
CK_RV
1901
mock_C_FindObjectsFinal (CK_SESSION_HANDLE session)
1902
0
{
1903
1904
0
  Session *sess;
1905
1906
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1907
0
  if (sess == NULL)
1908
0
    return CKR_SESSION_HANDLE_INVALID;
1909
0
  if (!sess->finding)
1910
0
    return CKR_OPERATION_NOT_INITIALIZED;
1911
1912
0
  sess->finding = false;
1913
0
  p11_array_free (sess->matches);
1914
0
  sess->matches = NULL;
1915
1916
0
  return CKR_OK;
1917
0
}
1918
1919
CK_RV
1920
mock_C_FindObjectsFinal__invalid_handle (CK_SESSION_HANDLE session)
1921
0
{
1922
0
  return CKR_SESSION_HANDLE_INVALID;
1923
0
}
1924
1925
CK_RV
1926
mock_X_FindObjectsFinal__invalid_handle (CK_X_FUNCTION_LIST *self,
1927
                                         CK_SESSION_HANDLE session)
1928
0
{
1929
0
  return CKR_SESSION_HANDLE_INVALID;
1930
0
}
1931
1932
CK_RV
1933
mock_C_EncryptInit (CK_SESSION_HANDLE session,
1934
                    CK_MECHANISM_PTR mechanism,
1935
                    CK_OBJECT_HANDLE key)
1936
0
{
1937
0
  Session *sess;
1938
1939
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1940
0
  if (!sess)
1941
0
    return CKR_SESSION_HANDLE_INVALID;
1942
1943
  /* can be called with pMechanism set to NULL_PTR to terminate an active encryption operation */
1944
0
  if (mechanism == NULL) {
1945
0
    if (sess->crypto_method & CKF_ENCRYPT) {
1946
0
      sess->crypto_method &= ~CKF_ENCRYPT;
1947
0
      return CKR_OK;
1948
0
    } else
1949
0
      return CKR_ARGUMENTS_BAD;
1950
0
  }
1951
1952
  /* Starting an operation, cancels any previous one */
1953
0
  sess->finding = CK_FALSE;
1954
1955
0
  if (mechanism->mechanism != CKM_MOCK_CAPITALIZE)
1956
0
    return CKR_MECHANISM_INVALID;
1957
0
  if (key != MOCK_PUBLIC_KEY_CAPITALIZE)
1958
0
    return CKR_KEY_HANDLE_INVALID;
1959
1960
0
  sess->crypto_method |= CKF_ENCRYPT;
1961
0
  sess->crypto_mechanism = CKM_MOCK_CAPITALIZE;
1962
0
  sess->crypto_key = key;
1963
0
  return CKR_OK;
1964
0
}
1965
1966
CK_RV
1967
mock_C_EncryptInit__invalid_handle (CK_SESSION_HANDLE session,
1968
                                    CK_MECHANISM_PTR mechanism,
1969
                                    CK_OBJECT_HANDLE key)
1970
0
{
1971
0
  return CKR_SESSION_HANDLE_INVALID;
1972
0
}
1973
1974
CK_RV
1975
mock_X_EncryptInit__invalid_handle (CK_X_FUNCTION_LIST *self,
1976
                                    CK_SESSION_HANDLE session,
1977
                                    CK_MECHANISM_PTR mechanism,
1978
                                    CK_OBJECT_HANDLE key)
1979
0
{
1980
0
  return CKR_SESSION_HANDLE_INVALID;
1981
0
}
1982
1983
CK_RV
1984
mock_C_Encrypt (CK_SESSION_HANDLE session,
1985
                CK_BYTE_PTR data,
1986
                CK_ULONG data_len,
1987
                CK_BYTE_PTR encrypted_data,
1988
                CK_ULONG_PTR encrypted_data_len)
1989
0
{
1990
0
  CK_ULONG last = 0;
1991
0
  Session *sess;
1992
0
  CK_RV rv;
1993
1994
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
1995
0
  if (!sess)
1996
0
    return CKR_SESSION_HANDLE_INVALID;
1997
1998
0
  rv = mock_C_EncryptUpdate (session, data, data_len, encrypted_data, encrypted_data_len);
1999
0
  if (rv == CKR_OK && sess->crypto_final)
2000
0
    rv = mock_C_EncryptFinal (session, encrypted_data, &last);
2001
0
  return rv;
2002
0
}
2003
2004
CK_RV
2005
mock_C_Encrypt__invalid_handle (CK_SESSION_HANDLE session,
2006
                                CK_BYTE_PTR data,
2007
                                CK_ULONG data_len,
2008
                                CK_BYTE_PTR encrypted_data,
2009
                                CK_ULONG_PTR encrypted_data_len)
2010
0
{
2011
0
  return_val_if_fail (encrypted_data_len, CKR_ARGUMENTS_BAD);
2012
2013
0
  return CKR_SESSION_HANDLE_INVALID;
2014
0
}
2015
2016
CK_RV
2017
mock_X_Encrypt__invalid_handle (CK_X_FUNCTION_LIST *self,
2018
                                CK_SESSION_HANDLE session,
2019
                                CK_BYTE_PTR data,
2020
                                CK_ULONG data_len,
2021
                                CK_BYTE_PTR encrypted_data,
2022
                                CK_ULONG_PTR encrypted_data_len)
2023
0
{
2024
0
  return_val_if_fail (encrypted_data_len, CKR_ARGUMENTS_BAD);
2025
2026
0
  return CKR_SESSION_HANDLE_INVALID;
2027
0
}
2028
2029
CK_RV
2030
mock_C_EncryptUpdate (CK_SESSION_HANDLE session,
2031
                      CK_BYTE_PTR part,
2032
                      CK_ULONG part_len,
2033
                      CK_BYTE_PTR encrypted_part,
2034
                      CK_ULONG_PTR encrypted_part_len)
2035
0
{
2036
0
  Session *sess;
2037
0
  CK_ULONG i;
2038
2039
0
  return_val_if_fail (part != NULL, CKR_DATA_INVALID);
2040
0
  return_val_if_fail (encrypted_part_len != NULL, CKR_ARGUMENTS_BAD);
2041
2042
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2043
0
  if (!sess)
2044
0
    return CKR_SESSION_HANDLE_INVALID;
2045
2046
0
  sess->crypto_final = false;
2047
0
  if (!sess->crypto_mechanism)
2048
0
    return CKR_OPERATION_NOT_INITIALIZED;
2049
0
  if (!(sess->crypto_method & CKF_ENCRYPT))
2050
0
    return CKR_OPERATION_NOT_INITIALIZED;
2051
0
  assert (sess->crypto_mechanism == CKM_MOCK_CAPITALIZE);
2052
0
  assert (sess->crypto_key == MOCK_PUBLIC_KEY_CAPITALIZE);
2053
2054
0
  if (!encrypted_part) {
2055
0
    *encrypted_part_len = part_len;
2056
0
    return CKR_OK;
2057
0
  }
2058
2059
0
  if (*encrypted_part_len < part_len) {
2060
0
    *encrypted_part_len = part_len;
2061
0
    return CKR_BUFFER_TOO_SMALL;
2062
0
  }
2063
2064
0
  for (i = 0; i < part_len; ++i)
2065
0
    encrypted_part[i] = p11_ascii_toupper (part[i]);
2066
0
  *encrypted_part_len = part_len;
2067
0
  sess->crypto_final = true;
2068
0
  return CKR_OK;
2069
0
}
2070
2071
CK_RV
2072
mock_C_EncryptUpdate__invalid_handle (CK_SESSION_HANDLE session,
2073
                                      CK_BYTE_PTR part,
2074
                                      CK_ULONG part_len,
2075
                                      CK_BYTE_PTR encrypted_part,
2076
                                      CK_ULONG_PTR encrypted_part_len)
2077
0
{
2078
0
  return_val_if_fail (encrypted_part_len, CKR_ARGUMENTS_BAD);
2079
2080
0
  return CKR_SESSION_HANDLE_INVALID;
2081
0
}
2082
2083
CK_RV
2084
mock_X_EncryptUpdate__invalid_handle (CK_X_FUNCTION_LIST *self,
2085
                                      CK_SESSION_HANDLE session,
2086
                                      CK_BYTE_PTR part,
2087
                                      CK_ULONG part_len,
2088
                                      CK_BYTE_PTR encrypted_part,
2089
                                      CK_ULONG_PTR encrypted_part_len)
2090
0
{
2091
0
  return_val_if_fail (encrypted_part_len, CKR_ARGUMENTS_BAD);
2092
2093
0
  return CKR_SESSION_HANDLE_INVALID;
2094
0
}
2095
2096
CK_RV
2097
mock_C_EncryptFinal (CK_SESSION_HANDLE session,
2098
                     CK_BYTE_PTR last_encrypted_part,
2099
                     CK_ULONG_PTR last_encrypted_part_len)
2100
0
{
2101
0
  Session *sess;
2102
2103
0
  return_val_if_fail (last_encrypted_part_len != NULL, CKR_ARGUMENTS_BAD);
2104
2105
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2106
0
  if (!sess)
2107
0
    return CKR_SESSION_HANDLE_INVALID;
2108
2109
0
  if (!sess->crypto_mechanism)
2110
0
    return CKR_OPERATION_NOT_INITIALIZED;
2111
0
  if (!(sess->crypto_method & CKF_ENCRYPT))
2112
0
    return CKR_OPERATION_NOT_INITIALIZED;
2113
2114
0
  *last_encrypted_part_len = 0;
2115
2116
0
  sess->crypto_method &= ~CKF_ENCRYPT;
2117
0
  sess->crypto_mechanism = 0;
2118
0
  sess->crypto_key = 0;
2119
0
  return CKR_OK;
2120
0
}
2121
2122
CK_RV
2123
mock_C_EncryptFinal__invalid_handle (CK_SESSION_HANDLE session,
2124
                                     CK_BYTE_PTR last_part,
2125
                                     CK_ULONG_PTR last_part_len)
2126
0
{
2127
0
  return_val_if_fail (last_part_len, CKR_ARGUMENTS_BAD);
2128
2129
0
  return CKR_SESSION_HANDLE_INVALID;
2130
0
}
2131
2132
CK_RV
2133
mock_X_EncryptFinal__invalid_handle (CK_X_FUNCTION_LIST *self,
2134
                                     CK_SESSION_HANDLE session,
2135
                                     CK_BYTE_PTR last_part,
2136
                                     CK_ULONG_PTR last_part_len)
2137
0
{
2138
0
  return_val_if_fail (last_part_len, CKR_ARGUMENTS_BAD);
2139
2140
0
  return CKR_SESSION_HANDLE_INVALID;
2141
0
}
2142
2143
CK_RV
2144
mock_C_DecryptInit (CK_SESSION_HANDLE session,
2145
                    CK_MECHANISM_PTR mechanism,
2146
                    CK_OBJECT_HANDLE key)
2147
0
{
2148
0
  Session *sess;
2149
2150
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2151
0
  if (!sess)
2152
0
    return CKR_SESSION_HANDLE_INVALID;
2153
2154
  /* can be called with pMechanism set to NULL_PTR to terminate an active decryption operation */
2155
0
  if (mechanism == NULL) {
2156
0
    if (sess->crypto_method & CKF_DECRYPT) {
2157
0
      sess->crypto_method &= ~CKF_DECRYPT;
2158
0
      return CKR_OK;
2159
0
    } else
2160
0
      return CKR_ARGUMENTS_BAD;
2161
0
  }
2162
2163
  /* Starting an operation, cancels any previous one */
2164
0
  sess->finding = false;
2165
2166
0
  if (mechanism->mechanism != CKM_MOCK_CAPITALIZE)
2167
0
    return CKR_MECHANISM_INVALID;
2168
0
  if (key != MOCK_PRIVATE_KEY_CAPITALIZE)
2169
0
    return CKR_KEY_HANDLE_INVALID;
2170
2171
0
  sess->crypto_method |= CKF_DECRYPT;
2172
0
  sess->crypto_mechanism = CKM_MOCK_CAPITALIZE;
2173
0
  sess->crypto_key = key;
2174
0
  return CKR_OK;
2175
0
}
2176
2177
CK_RV
2178
mock_C_DecryptInit__invalid_handle (CK_SESSION_HANDLE session,
2179
                                    CK_MECHANISM_PTR mechanism,
2180
                                    CK_OBJECT_HANDLE key)
2181
1
{
2182
1
  return CKR_SESSION_HANDLE_INVALID;
2183
1
}
2184
2185
CK_RV
2186
mock_X_DecryptInit__invalid_handle (CK_X_FUNCTION_LIST *self,
2187
                                    CK_SESSION_HANDLE session,
2188
                                    CK_MECHANISM_PTR mechanism,
2189
                                    CK_OBJECT_HANDLE key)
2190
0
{
2191
0
  return CKR_SESSION_HANDLE_INVALID;
2192
0
}
2193
2194
CK_RV
2195
mock_C_Decrypt (CK_SESSION_HANDLE session,
2196
                CK_BYTE_PTR encrypted_data,
2197
                CK_ULONG encrypted_data_len,
2198
                CK_BYTE_PTR data,
2199
                CK_ULONG_PTR data_len)
2200
0
{
2201
0
  CK_ULONG last = 0;
2202
0
  Session *sess;
2203
0
  CK_RV rv;
2204
2205
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2206
0
  if (!sess)
2207
0
    return CKR_SESSION_HANDLE_INVALID;
2208
0
  rv = mock_C_DecryptUpdate (session, encrypted_data, encrypted_data_len, data, data_len);
2209
0
  if (rv == CKR_OK && sess->crypto_final)
2210
0
    rv = mock_C_DecryptFinal (session, data, &last);
2211
0
  return rv;
2212
0
}
2213
2214
CK_RV
2215
mock_C_Decrypt__invalid_handle (CK_SESSION_HANDLE session,
2216
                                CK_BYTE_PTR enc_data,
2217
                                CK_ULONG enc_data_len,
2218
                                CK_BYTE_PTR data,
2219
                                CK_ULONG_PTR data_len)
2220
0
{
2221
0
  return_val_if_fail (data_len, CKR_ARGUMENTS_BAD);
2222
2223
0
  return CKR_SESSION_HANDLE_INVALID;
2224
0
}
2225
2226
CK_RV
2227
mock_X_Decrypt__invalid_handle (CK_X_FUNCTION_LIST *self,
2228
                                CK_SESSION_HANDLE session,
2229
                                CK_BYTE_PTR enc_data,
2230
                                CK_ULONG enc_data_len,
2231
                                CK_BYTE_PTR data,
2232
                                CK_ULONG_PTR data_len)
2233
0
{
2234
0
  return_val_if_fail (data_len, CKR_ARGUMENTS_BAD);
2235
2236
0
  return CKR_SESSION_HANDLE_INVALID;
2237
0
}
2238
2239
CK_RV
2240
mock_C_DecryptUpdate (CK_SESSION_HANDLE session,
2241
                      CK_BYTE_PTR encrypted_part,
2242
                      CK_ULONG encrypted_part_len,
2243
                      CK_BYTE_PTR part,
2244
                      CK_ULONG_PTR part_len)
2245
0
{
2246
0
  Session *sess;
2247
0
  CK_ULONG i;
2248
2249
0
  return_val_if_fail (encrypted_part, CKR_ENCRYPTED_DATA_INVALID);
2250
0
  return_val_if_fail (part_len, CKR_ARGUMENTS_BAD);
2251
2252
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2253
0
  if (!sess)
2254
0
    return CKR_SESSION_HANDLE_INVALID;
2255
2256
0
  sess->crypto_final = false;
2257
0
  if (!sess->crypto_mechanism)
2258
0
    return CKR_OPERATION_NOT_INITIALIZED;
2259
0
  if (!(sess->crypto_method & CKF_DECRYPT))
2260
0
    return CKR_OPERATION_NOT_INITIALIZED;
2261
0
  assert (sess->crypto_mechanism == CKM_MOCK_CAPITALIZE);
2262
0
  assert (sess->crypto_key == MOCK_PRIVATE_KEY_CAPITALIZE);
2263
2264
0
  if (!part) {
2265
0
    *part_len = encrypted_part_len;
2266
0
    return CKR_OK;
2267
0
  }
2268
2269
0
  if (*part_len < encrypted_part_len) {
2270
0
    *part_len = encrypted_part_len;
2271
0
    return CKR_BUFFER_TOO_SMALL;
2272
0
  }
2273
2274
0
  for (i = 0; i < encrypted_part_len; ++i)
2275
0
    part[i] = p11_ascii_tolower (encrypted_part[i]);
2276
0
  *part_len = encrypted_part_len;
2277
0
  sess->crypto_final = true;
2278
0
  return CKR_OK;
2279
0
}
2280
2281
CK_RV
2282
mock_C_DecryptUpdate__invalid_handle (CK_SESSION_HANDLE session,
2283
                                      CK_BYTE_PTR enc_part,
2284
                                      CK_ULONG enc_part_len,
2285
                                      CK_BYTE_PTR part,
2286
                                      CK_ULONG_PTR part_len)
2287
0
{
2288
0
  return_val_if_fail (part_len, CKR_ARGUMENTS_BAD);
2289
2290
0
  return CKR_SESSION_HANDLE_INVALID;
2291
0
}
2292
2293
CK_RV
2294
mock_X_DecryptUpdate__invalid_handle (CK_X_FUNCTION_LIST *self,
2295
                                      CK_SESSION_HANDLE session,
2296
                                      CK_BYTE_PTR enc_part,
2297
                                      CK_ULONG enc_part_len,
2298
                                      CK_BYTE_PTR part,
2299
                                      CK_ULONG_PTR part_len)
2300
0
{
2301
0
  return_val_if_fail (part_len, CKR_ARGUMENTS_BAD);
2302
2303
0
  return CKR_SESSION_HANDLE_INVALID;
2304
0
}
2305
2306
CK_RV
2307
mock_C_DecryptFinal (CK_SESSION_HANDLE session,
2308
                     CK_BYTE_PTR last_part,
2309
                     CK_ULONG_PTR last_part_len)
2310
0
{
2311
0
  Session *sess;
2312
2313
0
  return_val_if_fail (last_part_len != NULL, CKR_ARGUMENTS_BAD);
2314
2315
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2316
0
  if (!sess)
2317
0
    return CKR_SESSION_HANDLE_INVALID;
2318
2319
0
  if (!sess->crypto_mechanism)
2320
0
    return CKR_OPERATION_NOT_INITIALIZED;
2321
0
  if (!(sess->crypto_method & CKF_DECRYPT))
2322
0
    return CKR_OPERATION_NOT_INITIALIZED;
2323
2324
0
  *last_part_len = 0;
2325
2326
0
  sess->crypto_method &= ~CKF_DECRYPT;
2327
0
  sess->crypto_mechanism = 0;
2328
0
  sess->crypto_key = 0;
2329
2330
0
  return CKR_OK;
2331
0
}
2332
2333
CK_RV
2334
mock_C_DecryptFinal__invalid_handle (CK_SESSION_HANDLE session,
2335
                                     CK_BYTE_PTR last_part,
2336
                                     CK_ULONG_PTR last_part_len)
2337
0
{
2338
0
  return_val_if_fail (last_part_len, CKR_ARGUMENTS_BAD);
2339
2340
0
  return CKR_SESSION_HANDLE_INVALID;
2341
0
}
2342
2343
CK_RV
2344
mock_X_DecryptFinal__invalid_handle (CK_X_FUNCTION_LIST *self,
2345
                                     CK_SESSION_HANDLE session,
2346
                                     CK_BYTE_PTR last_part,
2347
                                     CK_ULONG_PTR last_part_len)
2348
0
{
2349
0
  return_val_if_fail (last_part_len, CKR_ARGUMENTS_BAD);
2350
2351
0
  return CKR_SESSION_HANDLE_INVALID;
2352
0
}
2353
2354
CK_RV
2355
mock_C_DigestInit (CK_SESSION_HANDLE session,
2356
                   CK_MECHANISM_PTR mechanism)
2357
0
{
2358
0
  Session *sess;
2359
2360
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2361
0
  if (!sess)
2362
0
    return CKR_SESSION_HANDLE_INVALID;
2363
2364
  /* can be called with pMechanism set to NULL_PTR to terminate an active message-digesting operation */
2365
0
  if (mechanism == NULL) {
2366
0
    if (sess->hash_method == CKF_DIGEST) {
2367
0
      sess->hash_method = 0;
2368
0
      return CKR_OK;
2369
0
    } else
2370
0
      return CKR_ARGUMENTS_BAD;
2371
0
  }
2372
2373
  /* Starting an operation, cancels any previous one */
2374
0
  sess->finding = false;
2375
2376
0
  if (mechanism->mechanism != CKM_MOCK_COUNT)
2377
0
    return CKR_MECHANISM_INVALID;
2378
2379
0
  sess->hash_mechanism = CKM_MOCK_COUNT;
2380
0
  sess->hash_method = CKF_DIGEST;
2381
0
  sess->hash_count = 0;
2382
0
  sess->hash_key = 0;
2383
0
  return CKR_OK;
2384
0
}
2385
2386
CK_RV
2387
mock_C_DigestInit__invalid_handle (CK_SESSION_HANDLE session,
2388
                                   CK_MECHANISM_PTR mechanism)
2389
8
{
2390
8
  return CKR_SESSION_HANDLE_INVALID;
2391
8
}
2392
2393
CK_RV
2394
mock_X_DigestInit__invalid_handle (CK_X_FUNCTION_LIST *self,
2395
                                   CK_SESSION_HANDLE session,
2396
                                   CK_MECHANISM_PTR mechanism)
2397
0
{
2398
0
  return CKR_SESSION_HANDLE_INVALID;
2399
0
}
2400
2401
CK_RV
2402
mock_C_Digest (CK_SESSION_HANDLE session,
2403
               CK_BYTE_PTR data,
2404
               CK_ULONG data_len,
2405
               CK_BYTE_PTR digest,
2406
               CK_ULONG_PTR digest_len)
2407
0
{
2408
0
  Session *sess;
2409
0
  CK_RV rv;
2410
2411
0
  return_val_if_fail (digest_len, CKR_ARGUMENTS_BAD);
2412
2413
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2414
0
  if (!sess)
2415
0
    return CKR_SESSION_HANDLE_INVALID;
2416
2417
0
  rv = mock_C_DigestUpdate (session, data, data_len);
2418
0
  if (rv == CKR_OK) {
2419
0
    rv = mock_C_DigestFinal (session, digest, digest_len);
2420
0
    if (sess->hash_method == CKF_DIGEST) {
2421
      /* not finalized -- reset the state */
2422
0
      sess->hash_count = 0;
2423
0
    }
2424
0
  }
2425
0
  return rv;
2426
0
}
2427
2428
CK_RV
2429
mock_C_Digest__invalid_handle (CK_SESSION_HANDLE session,
2430
                               CK_BYTE_PTR data,
2431
                               CK_ULONG data_len,
2432
                               CK_BYTE_PTR digest,
2433
                               CK_ULONG_PTR digest_len)
2434
0
{
2435
0
  return_val_if_fail (digest_len, CKR_ARGUMENTS_BAD);
2436
2437
0
  return CKR_SESSION_HANDLE_INVALID;
2438
0
}
2439
2440
CK_RV
2441
mock_X_Digest__invalid_handle (CK_X_FUNCTION_LIST *self,
2442
                               CK_SESSION_HANDLE session,
2443
                               CK_BYTE_PTR data,
2444
                               CK_ULONG data_len,
2445
                               CK_BYTE_PTR digest,
2446
                               CK_ULONG_PTR digest_len)
2447
0
{
2448
0
  return_val_if_fail (digest_len, CKR_ARGUMENTS_BAD);
2449
2450
0
  return CKR_SESSION_HANDLE_INVALID;
2451
0
}
2452
2453
CK_RV
2454
mock_C_DigestUpdate (CK_SESSION_HANDLE session,
2455
                     CK_BYTE_PTR part,
2456
                     CK_ULONG part_len)
2457
0
{
2458
0
  Session *sess;
2459
2460
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2461
0
  if (!sess)
2462
0
    return CKR_SESSION_HANDLE_INVALID;
2463
2464
0
  if (!sess->hash_mechanism)
2465
0
    return CKR_OPERATION_NOT_INITIALIZED;
2466
0
  if (sess->hash_method != CKF_DIGEST)
2467
0
    return CKR_OPERATION_NOT_INITIALIZED;
2468
0
  assert (sess->hash_mechanism == CKM_MOCK_COUNT);
2469
2470
0
  sess->hash_count += part_len;
2471
0
  return CKR_OK;
2472
0
}
2473
2474
CK_RV
2475
mock_C_DigestUpdate__invalid_handle (CK_SESSION_HANDLE session,
2476
                                     CK_BYTE_PTR part,
2477
                                     CK_ULONG part_len)
2478
0
{
2479
0
  return CKR_SESSION_HANDLE_INVALID;
2480
0
}
2481
2482
CK_RV
2483
mock_X_DigestUpdate__invalid_handle (CK_X_FUNCTION_LIST *self,
2484
                                     CK_SESSION_HANDLE session,
2485
                                     CK_BYTE_PTR part,
2486
                                     CK_ULONG part_len)
2487
0
{
2488
0
  return CKR_SESSION_HANDLE_INVALID;
2489
0
}
2490
2491
CK_RV
2492
mock_C_DigestKey (CK_SESSION_HANDLE session,
2493
                  CK_OBJECT_HANDLE key)
2494
0
{
2495
0
  Session *sess;
2496
2497
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2498
0
  if (!sess)
2499
0
    return CKR_SESSION_HANDLE_INVALID;
2500
2501
0
  if (!sess->hash_mechanism)
2502
0
    return CKR_OPERATION_NOT_INITIALIZED;
2503
0
  if (sess->hash_method != CKF_DIGEST)
2504
0
    return CKR_OPERATION_NOT_INITIALIZED;
2505
0
  assert (sess->hash_mechanism == CKM_MOCK_COUNT);
2506
2507
0
  sess->hash_count += key;
2508
0
  return CKR_OK;
2509
0
}
2510
2511
CK_RV
2512
mock_C_DigestKey__invalid_handle (CK_SESSION_HANDLE session,
2513
                                  CK_OBJECT_HANDLE key)
2514
0
{
2515
0
  return CKR_SESSION_HANDLE_INVALID;
2516
0
}
2517
2518
CK_RV
2519
mock_X_DigestKey__invalid_handle (CK_X_FUNCTION_LIST *self,
2520
                                  CK_SESSION_HANDLE session,
2521
                                  CK_OBJECT_HANDLE key)
2522
0
{
2523
0
  return CKR_SESSION_HANDLE_INVALID;
2524
0
}
2525
2526
CK_RV
2527
mock_C_DigestFinal (CK_SESSION_HANDLE session,
2528
                    CK_BYTE_PTR digest,
2529
                    CK_ULONG_PTR digest_len)
2530
0
{
2531
0
  char buffer[32];
2532
0
  Session *sess;
2533
0
  int len;
2534
2535
0
  return_val_if_fail (digest_len != NULL, CKR_ARGUMENTS_BAD);
2536
2537
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2538
0
  if (!sess)
2539
0
    return CKR_SESSION_HANDLE_INVALID;
2540
2541
0
  if (!sess->hash_mechanism)
2542
0
    return CKR_OPERATION_NOT_INITIALIZED;
2543
0
  if (sess->hash_method != CKF_DIGEST)
2544
0
    return CKR_OPERATION_NOT_INITIALIZED;
2545
0
  assert (sess->hash_mechanism == CKM_MOCK_COUNT);
2546
2547
0
  len = snprintf (buffer, sizeof (buffer), "%lu", sess->hash_count);
2548
2549
0
  if (!digest) {
2550
0
    *digest_len = len;
2551
0
    return CKR_OK;
2552
0
  } else if (*digest_len < len) {
2553
0
    *digest_len = len;
2554
0
    return CKR_BUFFER_TOO_SMALL;
2555
0
  }
2556
2557
0
  memcpy (digest, &buffer, len);
2558
0
  *digest_len = len;
2559
2560
0
  sess->hash_count = 0;
2561
0
  sess->hash_mechanism = 0;
2562
0
  sess->hash_key = 0;
2563
0
  sess->hash_method = 0;
2564
2565
0
  return CKR_OK;
2566
0
}
2567
2568
CK_RV
2569
mock_C_DigestFinal__invalid_handle (CK_SESSION_HANDLE session,
2570
                                    CK_BYTE_PTR digest,
2571
                                    CK_ULONG_PTR digest_len)
2572
0
{
2573
0
  return_val_if_fail (digest_len, CKR_ARGUMENTS_BAD);
2574
2575
0
  return CKR_SESSION_HANDLE_INVALID;
2576
0
}
2577
2578
CK_RV
2579
mock_X_DigestFinal__invalid_handle (CK_X_FUNCTION_LIST *self,
2580
                                    CK_SESSION_HANDLE session,
2581
                                    CK_BYTE_PTR digest,
2582
                                    CK_ULONG_PTR digest_len)
2583
0
{
2584
0
  return_val_if_fail (digest_len, CKR_ARGUMENTS_BAD);
2585
2586
0
  return CKR_SESSION_HANDLE_INVALID;
2587
0
}
2588
2589
static CK_RV
2590
prefix_mechanism_init (CK_SESSION_HANDLE session,
2591
                       CK_FLAGS method,
2592
                       CK_MECHANISM_PTR mechanism,
2593
                       CK_OBJECT_HANDLE key)
2594
0
{
2595
0
  Session *sess;
2596
0
  CK_ATTRIBUTE *attrs;
2597
0
  CK_ATTRIBUTE *value;
2598
0
  CK_BYTE_PTR param;
2599
0
  CK_ULONG n_param;
2600
0
  CK_ULONG length;
2601
0
  CK_RV rv;
2602
2603
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2604
0
  if (!sess)
2605
0
    return CKR_SESSION_HANDLE_INVALID;
2606
2607
0
  if (mechanism->mechanism != CKM_MOCK_PREFIX)
2608
0
    return CKR_MECHANISM_INVALID;
2609
0
  if (method == CKF_SIGN || method == CKF_SIGN_RECOVER) {
2610
0
    if (key != MOCK_PRIVATE_KEY_PREFIX)
2611
0
      return CKR_KEY_HANDLE_INVALID;
2612
0
  } else if (method == CKF_VERIFY || method == CKF_VERIFY_RECOVER) {
2613
0
    if (key != MOCK_PUBLIC_KEY_PREFIX)
2614
0
      return CKR_KEY_HANDLE_INVALID;
2615
0
  } else {
2616
0
    assert_not_reached ();
2617
0
  }
2618
2619
0
  rv = lookup_object (sess, key, &attrs, NULL);
2620
0
  if (rv != CKR_OK)
2621
0
    return rv;
2622
2623
0
  value = p11_attrs_find_valid (attrs, CKA_VALUE);
2624
0
  if (value == NULL)
2625
0
    return CKR_KEY_TYPE_INCONSISTENT;
2626
2627
0
  if (mechanism->pParameter) {
2628
0
    param = mechanism->pParameter;
2629
0
    n_param = mechanism->ulParameterLen;
2630
0
  } else {
2631
0
    param = (CK_BYTE_PTR)SIGNED_PREFIX;
2632
0
    n_param = strlen (SIGNED_PREFIX) + 1;
2633
0
  }
2634
2635
0
  length = value->ulValueLen + n_param;
2636
0
  if (length > sizeof (sess->sign_prefix))
2637
0
    return CKR_KEY_SIZE_RANGE;
2638
2639
  /* Starting an operation, cancels any finding */
2640
0
  sess->finding = false;
2641
2642
0
  sess->hash_mechanism = CKM_MOCK_PREFIX;
2643
0
  sess->hash_method = method;
2644
0
  sess->hash_key = key;
2645
0
  sess->hash_count = 0;
2646
2647
0
  memcpy (sess->sign_prefix, param, n_param);
2648
0
  memcpy (sess->sign_prefix + n_param, value->pValue, value->ulValueLen);
2649
0
  sess->n_sign_prefix = length;
2650
2651
  /* The private key has CKA_ALWAYS_AUTHENTICATE above */
2652
0
  if (method == CKF_SIGN || method == CKF_SIGN_RECOVER)
2653
0
    sess->want_context_login = true;
2654
2655
0
  return CKR_OK;
2656
2657
0
}
2658
2659
CK_RV
2660
mock_C_SignInit (CK_SESSION_HANDLE session,
2661
                 CK_MECHANISM_PTR mechanism,
2662
                 CK_OBJECT_HANDLE key)
2663
0
{
2664
0
  Session *sess;
2665
2666
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2667
0
  if (!sess)
2668
0
    return CKR_SESSION_HANDLE_INVALID;
2669
2670
  /* can be called with pMechanism set to NULL_PTR to terminate an active signature operation */
2671
0
  if (mechanism == NULL) {
2672
0
    if (sess->hash_method == CKF_SIGN) {
2673
0
      sess->hash_method = 0;
2674
0
      return CKR_OK;
2675
0
    } else
2676
0
      return CKR_ARGUMENTS_BAD;
2677
0
  }
2678
2679
0
  return prefix_mechanism_init (session, CKF_SIGN, mechanism, key);
2680
0
}
2681
2682
CK_RV
2683
mock_C_SignInit__invalid_handle (CK_SESSION_HANDLE session,
2684
                                 CK_MECHANISM_PTR mechanism,
2685
                                 CK_OBJECT_HANDLE key)
2686
0
{
2687
0
  return CKR_SESSION_HANDLE_INVALID;
2688
0
}
2689
2690
CK_RV
2691
mock_X_SignInit__invalid_handle (CK_X_FUNCTION_LIST *self,
2692
                                 CK_SESSION_HANDLE session,
2693
                                 CK_MECHANISM_PTR mechanism,
2694
                                 CK_OBJECT_HANDLE key)
2695
0
{
2696
0
  return CKR_SESSION_HANDLE_INVALID;
2697
0
}
2698
2699
CK_RV
2700
mock_C_Sign (CK_SESSION_HANDLE session,
2701
             CK_BYTE_PTR data,
2702
             CK_ULONG data_len,
2703
             CK_BYTE_PTR signature,
2704
             CK_ULONG_PTR signature_len)
2705
0
{
2706
0
  Session *sess;
2707
0
  CK_RV rv;
2708
2709
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2710
0
  if (!sess)
2711
0
    return CKR_SESSION_HANDLE_INVALID;
2712
2713
0
  rv = mock_C_SignUpdate (session, data, data_len);
2714
2715
0
  if (rv == CKR_OK) {
2716
0
    rv = mock_C_SignFinal (session, signature, signature_len);
2717
0
    if (sess->hash_method == CKF_SIGN) {
2718
      /* not finalized -- reset the state */
2719
0
      sess->hash_count = 0;
2720
0
    }
2721
0
  }
2722
2723
0
  return rv;
2724
0
}
2725
2726
CK_RV
2727
mock_C_Sign__invalid_handle (CK_SESSION_HANDLE session,
2728
                             CK_BYTE_PTR data,
2729
                             CK_ULONG data_len,
2730
                             CK_BYTE_PTR signature,
2731
                             CK_ULONG_PTR signature_len)
2732
0
{
2733
0
  return_val_if_fail (signature_len, CKR_ARGUMENTS_BAD);
2734
2735
0
  return CKR_SESSION_HANDLE_INVALID;
2736
0
}
2737
2738
CK_RV
2739
mock_X_Sign__invalid_handle (CK_X_FUNCTION_LIST *self,
2740
                             CK_SESSION_HANDLE session,
2741
                             CK_BYTE_PTR data,
2742
                             CK_ULONG data_len,
2743
                             CK_BYTE_PTR signature,
2744
                             CK_ULONG_PTR signature_len)
2745
0
{
2746
0
  return_val_if_fail (signature_len, CKR_ARGUMENTS_BAD);
2747
2748
0
  return CKR_SESSION_HANDLE_INVALID;
2749
0
}
2750
2751
CK_RV
2752
mock_C_SignUpdate (CK_SESSION_HANDLE session,
2753
                   CK_BYTE_PTR part,
2754
                   CK_ULONG part_len)
2755
0
{
2756
0
  Session *sess;
2757
2758
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2759
0
  if (!sess)
2760
0
    return CKR_SESSION_HANDLE_INVALID;
2761
0
  if (sess->hash_mechanism != CKM_MOCK_PREFIX ||
2762
0
      sess->hash_method != CKF_SIGN)
2763
0
    return CKR_OPERATION_NOT_INITIALIZED;
2764
0
  if (sess->want_context_login)
2765
0
    return CKR_USER_NOT_LOGGED_IN;
2766
2767
0
  sess->hash_count += part_len;
2768
0
  return CKR_OK;
2769
0
}
2770
2771
CK_RV
2772
mock_C_SignUpdate__invalid_handle (CK_SESSION_HANDLE session,
2773
                                   CK_BYTE_PTR part,
2774
                                   CK_ULONG part_len)
2775
0
{
2776
0
  return_val_if_fail (part_len, CKR_ARGUMENTS_BAD);
2777
2778
0
  return CKR_SESSION_HANDLE_INVALID;
2779
0
}
2780
2781
CK_RV
2782
mock_X_SignUpdate__invalid_handle (CK_X_FUNCTION_LIST *self,
2783
                                   CK_SESSION_HANDLE session,
2784
                                   CK_BYTE_PTR part,
2785
                                   CK_ULONG part_len)
2786
0
{
2787
0
  return_val_if_fail (part_len, CKR_ARGUMENTS_BAD);
2788
2789
0
  return CKR_SESSION_HANDLE_INVALID;
2790
0
}
2791
2792
CK_RV
2793
mock_C_SignFinal (CK_SESSION_HANDLE session,
2794
                  CK_BYTE_PTR signature,
2795
                  CK_ULONG_PTR signature_len)
2796
0
{
2797
0
  char buffer[32];
2798
0
  Session *sess;
2799
0
  CK_ULONG length;
2800
0
  int len;
2801
2802
0
  return_val_if_fail (signature_len, CKR_ARGUMENTS_BAD);
2803
2804
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2805
0
  if (!sess)
2806
0
    return CKR_SESSION_HANDLE_INVALID;
2807
0
  if (sess->hash_mechanism != CKM_MOCK_PREFIX ||
2808
0
      sess->hash_method != CKF_SIGN)
2809
0
    return CKR_OPERATION_NOT_INITIALIZED;
2810
0
  if (sess->want_context_login)
2811
0
    return CKR_USER_NOT_LOGGED_IN;
2812
2813
0
  len = snprintf (buffer, sizeof (buffer), "%lu", sess->hash_count);
2814
0
  length = sess->n_sign_prefix + len;
2815
2816
0
  if (!signature) {
2817
0
    *signature_len = length;
2818
0
    return CKR_OK;
2819
0
  }
2820
2821
0
  if (*signature_len < length) {
2822
0
    *signature_len = length;
2823
0
    return CKR_BUFFER_TOO_SMALL;
2824
0
  }
2825
2826
0
  memcpy (signature, sess->sign_prefix, sess->n_sign_prefix);
2827
0
  memcpy (signature + sess->n_sign_prefix, buffer, len);
2828
0
  *signature_len = length;
2829
2830
0
  sess->hash_mechanism = 0;
2831
0
  sess->hash_method = 0;
2832
0
  sess->hash_count = 0;
2833
0
  sess->hash_key = 0;
2834
2835
0
  return CKR_OK;
2836
0
}
2837
2838
CK_RV
2839
mock_C_SignFinal__invalid_handle (CK_SESSION_HANDLE session,
2840
                                  CK_BYTE_PTR signature,
2841
                                  CK_ULONG_PTR signature_len)
2842
0
{
2843
0
  return_val_if_fail (signature_len, CKR_ARGUMENTS_BAD);
2844
2845
0
  return CKR_SESSION_HANDLE_INVALID;
2846
0
}
2847
2848
CK_RV
2849
mock_X_SignFinal__invalid_handle (CK_X_FUNCTION_LIST *self,
2850
                                  CK_SESSION_HANDLE session,
2851
                                  CK_BYTE_PTR signature,
2852
                                  CK_ULONG_PTR signature_len)
2853
0
{
2854
0
  return_val_if_fail (signature_len, CKR_ARGUMENTS_BAD);
2855
2856
0
  return CKR_SESSION_HANDLE_INVALID;
2857
0
}
2858
2859
CK_RV
2860
mock_C_SignRecoverInit (CK_SESSION_HANDLE session,
2861
                        CK_MECHANISM_PTR mechanism,
2862
                        CK_OBJECT_HANDLE key)
2863
0
{
2864
0
  Session *sess;
2865
2866
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2867
0
  if (!sess)
2868
0
    return CKR_SESSION_HANDLE_INVALID;
2869
2870
  /* can be called with pMechanism set to NULL_PTR to terminate
2871
   * an active signature with data recovery operation */
2872
0
  if (mechanism == NULL) {
2873
0
    if (sess->hash_method == CKF_SIGN_RECOVER) {
2874
0
      sess->hash_method = 0;
2875
0
      return CKR_OK;
2876
0
    } else
2877
0
      return CKR_ARGUMENTS_BAD;
2878
0
  }
2879
2880
0
  return prefix_mechanism_init (session, CKF_SIGN_RECOVER, mechanism, key);
2881
0
}
2882
2883
CK_RV
2884
mock_C_SignRecoverInit__invalid_handle (CK_SESSION_HANDLE session,
2885
                                        CK_MECHANISM_PTR mechanism,
2886
                                        CK_OBJECT_HANDLE key)
2887
0
{
2888
0
  return CKR_SESSION_HANDLE_INVALID;
2889
0
}
2890
2891
CK_RV
2892
mock_X_SignRecoverInit__invalid_handle (CK_X_FUNCTION_LIST *self,
2893
                                        CK_SESSION_HANDLE session,
2894
                                        CK_MECHANISM_PTR mechanism,
2895
                                        CK_OBJECT_HANDLE key)
2896
0
{
2897
0
  return CKR_SESSION_HANDLE_INVALID;
2898
0
}
2899
2900
CK_RV
2901
mock_C_SignRecover (CK_SESSION_HANDLE session,
2902
                    CK_BYTE_PTR data,
2903
                    CK_ULONG data_len,
2904
                    CK_BYTE_PTR signature,
2905
                    CK_ULONG_PTR signature_len)
2906
0
{
2907
0
  Session *sess;
2908
0
  CK_ULONG length;
2909
2910
0
  return_val_if_fail (data, CKR_DATA_INVALID);
2911
0
  return_val_if_fail (signature_len, CKR_ARGUMENTS_BAD);
2912
2913
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2914
0
  if (!sess)
2915
0
    return CKR_SESSION_HANDLE_INVALID;
2916
0
  if (sess->hash_method != CKF_SIGN_RECOVER ||
2917
0
      sess->hash_mechanism != CKM_MOCK_PREFIX)
2918
0
    return CKR_OPERATION_NOT_INITIALIZED;
2919
0
  if (sess->want_context_login)
2920
0
    return CKR_USER_NOT_LOGGED_IN;
2921
2922
0
  length = sess->n_sign_prefix + data_len;
2923
2924
0
  if (!signature) {
2925
0
    *signature_len = length;
2926
0
    return CKR_OK;
2927
0
  }
2928
2929
0
  if (*signature_len < length) {
2930
0
    *signature_len = length;
2931
0
    return CKR_BUFFER_TOO_SMALL;
2932
0
  }
2933
2934
0
  memcpy (signature, sess->sign_prefix, sess->n_sign_prefix);
2935
0
  memcpy (signature + sess->n_sign_prefix, data, data_len);
2936
0
  *signature_len = length;
2937
2938
0
  sess->hash_method = 0;
2939
0
  sess->hash_mechanism = 0;
2940
0
  sess->hash_key = 0;
2941
0
  sess->hash_count = 0;
2942
2943
0
  return CKR_OK;
2944
0
}
2945
2946
CK_RV
2947
mock_C_SignRecover__invalid_handle (CK_SESSION_HANDLE session,
2948
                                    CK_BYTE_PTR data,
2949
                                    CK_ULONG data_len,
2950
                                    CK_BYTE_PTR signature,
2951
                                    CK_ULONG_PTR signature_len)
2952
0
{
2953
0
  return_val_if_fail (signature_len, CKR_ARGUMENTS_BAD);
2954
2955
0
  return CKR_SESSION_HANDLE_INVALID;
2956
0
}
2957
2958
CK_RV
2959
mock_X_SignRecover__invalid_handle (CK_X_FUNCTION_LIST *self,
2960
                                    CK_SESSION_HANDLE session,
2961
                                    CK_BYTE_PTR data,
2962
                                    CK_ULONG data_len,
2963
                                    CK_BYTE_PTR signature,
2964
                                    CK_ULONG_PTR signature_len)
2965
0
{
2966
0
  return_val_if_fail (signature_len, CKR_ARGUMENTS_BAD);
2967
2968
0
  return CKR_SESSION_HANDLE_INVALID;
2969
0
}
2970
2971
CK_RV
2972
mock_C_VerifyInit (CK_SESSION_HANDLE session,
2973
                   CK_MECHANISM_PTR mechanism,
2974
                   CK_OBJECT_HANDLE key)
2975
0
{
2976
0
  Session *sess;
2977
2978
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
2979
0
  if (!sess)
2980
0
    return CKR_SESSION_HANDLE_INVALID;
2981
2982
  /* can be called with pMechanism set to NULL_PTR to terminate an active verification operation */
2983
0
  if (mechanism == NULL) {
2984
0
    if (sess->hash_method == CKF_VERIFY) {
2985
0
      sess->hash_method = 0;
2986
0
      return CKR_OK;
2987
0
    } else
2988
0
      return CKR_ARGUMENTS_BAD;
2989
0
  }
2990
2991
0
  return prefix_mechanism_init (session, CKF_VERIFY, mechanism, key);
2992
0
}
2993
2994
CK_RV
2995
mock_C_VerifyInit__invalid_handle (CK_SESSION_HANDLE session,
2996
                                   CK_MECHANISM_PTR mechanism,
2997
                                   CK_OBJECT_HANDLE key)
2998
0
{
2999
0
  return CKR_SESSION_HANDLE_INVALID;
3000
0
}
3001
3002
CK_RV
3003
mock_X_VerifyInit__invalid_handle (CK_X_FUNCTION_LIST *self,
3004
                                   CK_SESSION_HANDLE session,
3005
                                   CK_MECHANISM_PTR mechanism,
3006
                                   CK_OBJECT_HANDLE key)
3007
0
{
3008
0
  return CKR_SESSION_HANDLE_INVALID;
3009
0
}
3010
3011
CK_RV
3012
mock_C_Verify (CK_SESSION_HANDLE session,
3013
               CK_BYTE_PTR data,
3014
               CK_ULONG data_len,
3015
               CK_BYTE_PTR signature,
3016
               CK_ULONG signature_len)
3017
0
{
3018
0
  CK_RV rv;
3019
3020
0
  rv = mock_C_VerifyUpdate (session, data, data_len);
3021
0
  if (rv == CKR_OK)
3022
0
    rv = mock_C_VerifyFinal (session, signature, signature_len);
3023
3024
0
  return rv;
3025
0
}
3026
3027
CK_RV
3028
mock_C_Verify__invalid_handle (CK_SESSION_HANDLE session,
3029
                               CK_BYTE_PTR data,
3030
                               CK_ULONG data_len,
3031
                               CK_BYTE_PTR signature,
3032
                               CK_ULONG signature_len)
3033
0
{
3034
0
  return CKR_SESSION_HANDLE_INVALID;
3035
0
}
3036
3037
CK_RV
3038
mock_X_Verify__invalid_handle (CK_X_FUNCTION_LIST *self,
3039
                               CK_SESSION_HANDLE session,
3040
                               CK_BYTE_PTR data,
3041
                               CK_ULONG data_len,
3042
                               CK_BYTE_PTR signature,
3043
                               CK_ULONG signature_len)
3044
0
{
3045
0
  return CKR_SESSION_HANDLE_INVALID;
3046
0
}
3047
3048
CK_RV
3049
mock_C_VerifyUpdate (CK_SESSION_HANDLE session,
3050
                     CK_BYTE_PTR part,
3051
                     CK_ULONG part_len)
3052
0
{
3053
0
  Session *sess;
3054
3055
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
3056
0
  if (!sess)
3057
0
    return CKR_SESSION_HANDLE_INVALID;
3058
0
  if (sess->hash_mechanism != CKM_MOCK_PREFIX ||
3059
0
      sess->hash_method != CKF_VERIFY)
3060
0
    return CKR_OPERATION_NOT_INITIALIZED;
3061
0
  if (sess->want_context_login)
3062
0
    return CKR_USER_NOT_LOGGED_IN;
3063
3064
0
  sess->hash_count += part_len;
3065
0
  return CKR_OK;
3066
0
}
3067
3068
CK_RV
3069
mock_C_VerifyUpdate__invalid_handle (CK_SESSION_HANDLE session,
3070
                                     CK_BYTE_PTR part,
3071
                                     CK_ULONG part_len)
3072
0
{
3073
0
  return CKR_SESSION_HANDLE_INVALID;
3074
0
}
3075
3076
CK_RV
3077
mock_X_VerifyUpdate__invalid_handle (CK_X_FUNCTION_LIST *self,
3078
                                     CK_SESSION_HANDLE session,
3079
                                     CK_BYTE_PTR part,
3080
                                     CK_ULONG part_len)
3081
0
{
3082
0
  return CKR_SESSION_HANDLE_INVALID;
3083
0
}
3084
3085
CK_RV
3086
mock_C_VerifyFinal (CK_SESSION_HANDLE session,
3087
                    CK_BYTE_PTR signature,
3088
                    CK_ULONG signature_len)
3089
0
{
3090
0
  char buffer[32];
3091
0
  Session *sess;
3092
0
  CK_ULONG length;
3093
0
  int len;
3094
0
  CK_RV rv = CKR_OK;
3095
3096
0
  return_val_if_fail (signature, CKR_ARGUMENTS_BAD);
3097
3098
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
3099
0
  if (!sess)
3100
0
    return CKR_SESSION_HANDLE_INVALID;
3101
0
  if (sess->hash_mechanism != CKM_MOCK_PREFIX ||
3102
0
      sess->hash_method != CKF_VERIFY)
3103
0
    return CKR_OPERATION_NOT_INITIALIZED;
3104
0
  if (sess->want_context_login)
3105
0
    return CKR_USER_NOT_LOGGED_IN;
3106
3107
0
  len = snprintf (buffer, sizeof (buffer), "%lu", sess->hash_count);
3108
0
  length = sess->n_sign_prefix + len;
3109
3110
0
  if (signature_len != length)
3111
0
    return CKR_SIGNATURE_LEN_RANGE;
3112
3113
0
  if (memcmp (signature, sess->sign_prefix, sess->n_sign_prefix) != 0 ||
3114
0
      memcmp (signature + sess->n_sign_prefix, buffer, len) != 0)
3115
0
    rv = CKR_SIGNATURE_INVALID;
3116
3117
0
  sess->hash_mechanism = 0;
3118
0
  sess->hash_method = 0;
3119
0
  sess->hash_count = 0;
3120
0
  sess->hash_key = 0;
3121
3122
0
  return rv;
3123
0
}
3124
3125
CK_RV
3126
mock_C_VerifyFinal__invalid_handle (CK_SESSION_HANDLE session,
3127
                                    CK_BYTE_PTR signature,
3128
                                    CK_ULONG signature_len)
3129
0
{
3130
0
  return CKR_SESSION_HANDLE_INVALID;
3131
0
}
3132
3133
CK_RV
3134
mock_X_VerifyFinal__invalid_handle (CK_X_FUNCTION_LIST *self,
3135
                                    CK_SESSION_HANDLE session,
3136
                                    CK_BYTE_PTR signature,
3137
                                    CK_ULONG signature_len)
3138
0
{
3139
0
  return CKR_SESSION_HANDLE_INVALID;
3140
0
}
3141
3142
CK_RV
3143
mock_C_VerifyRecoverInit (CK_SESSION_HANDLE session,
3144
                          CK_MECHANISM_PTR mechanism,
3145
                          CK_OBJECT_HANDLE key)
3146
0
{
3147
0
  Session *sess;
3148
3149
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
3150
0
  if (!sess)
3151
0
    return CKR_SESSION_HANDLE_INVALID;
3152
3153
  /* can be called with pMechanism set to NULL_PTR to terminate
3154
   * an active verification with data recovery operation */
3155
0
  if (mechanism == NULL) {
3156
0
    if (sess->hash_method == CKF_VERIFY_RECOVER) {
3157
0
      sess->hash_method = 0;
3158
0
      return CKR_OK;
3159
0
    } else
3160
0
      return CKR_ARGUMENTS_BAD;
3161
0
  }
3162
3163
0
  return prefix_mechanism_init (session, CKF_VERIFY_RECOVER, mechanism, key);
3164
0
}
3165
3166
CK_RV
3167
mock_C_VerifyRecoverInit__invalid_handle (CK_SESSION_HANDLE session,
3168
                                          CK_MECHANISM_PTR mechanism,
3169
                                          CK_OBJECT_HANDLE key)
3170
0
{
3171
0
  return CKR_SESSION_HANDLE_INVALID;
3172
0
}
3173
3174
CK_RV
3175
mock_X_VerifyRecoverInit__invalid_handle (CK_X_FUNCTION_LIST *self,
3176
                                          CK_SESSION_HANDLE session,
3177
                                          CK_MECHANISM_PTR mechanism,
3178
                                          CK_OBJECT_HANDLE key)
3179
0
{
3180
0
  return CKR_SESSION_HANDLE_INVALID;
3181
0
}
3182
3183
CK_RV
3184
mock_C_VerifyRecover (CK_SESSION_HANDLE session,
3185
                      CK_BYTE_PTR signature,
3186
                      CK_ULONG signature_len,
3187
                      CK_BYTE_PTR data,
3188
                      CK_ULONG_PTR data_len)
3189
0
{
3190
0
  Session *sess;
3191
0
  CK_ULONG length;
3192
3193
0
  return_val_if_fail (signature, CKR_ARGUMENTS_BAD);
3194
3195
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
3196
0
  if (!sess)
3197
0
    return CKR_SESSION_HANDLE_INVALID;
3198
0
  if (sess->hash_mechanism != CKM_MOCK_PREFIX ||
3199
0
      sess->hash_method != CKF_VERIFY_RECOVER)
3200
0
    return CKR_OPERATION_NOT_INITIALIZED;
3201
0
  if (sess->want_context_login)
3202
0
    return CKR_USER_NOT_LOGGED_IN;
3203
3204
0
  if (signature_len < sess->n_sign_prefix)
3205
0
    return CKR_SIGNATURE_LEN_RANGE;
3206
0
  if (memcmp (signature, sess->sign_prefix, sess->n_sign_prefix) != 0)
3207
0
    return CKR_SIGNATURE_INVALID;
3208
3209
0
  length = signature_len - sess->n_sign_prefix;
3210
0
  if (!data) {
3211
0
    *data_len = length;
3212
0
    return CKR_OK;
3213
0
  }
3214
3215
0
  if (*data_len < length) {
3216
0
    *data_len = length;
3217
0
    return CKR_BUFFER_TOO_SMALL;
3218
0
  }
3219
3220
0
  *data_len = length;
3221
0
  memcpy (data, signature + sess->n_sign_prefix, length);
3222
0
  return CKR_OK;
3223
0
}
3224
3225
CK_RV
3226
mock_C_VerifyRecover__invalid_handle (CK_SESSION_HANDLE session,
3227
                                      CK_BYTE_PTR signature,
3228
                                      CK_ULONG signature_len,
3229
                                      CK_BYTE_PTR data,
3230
                                      CK_ULONG_PTR data_len)
3231
0
{
3232
0
  return_val_if_fail (data_len, CKR_ARGUMENTS_BAD);
3233
3234
0
  return CKR_SESSION_HANDLE_INVALID;
3235
0
}
3236
3237
CK_RV
3238
mock_X_VerifyRecover__invalid_handle (CK_X_FUNCTION_LIST *self,
3239
                                      CK_SESSION_HANDLE session,
3240
                                      CK_BYTE_PTR signature,
3241
                                      CK_ULONG signature_len,
3242
                                      CK_BYTE_PTR data,
3243
                                      CK_ULONG_PTR data_len)
3244
0
{
3245
0
  return_val_if_fail (data_len, CKR_ARGUMENTS_BAD);
3246
3247
0
  return CKR_SESSION_HANDLE_INVALID;
3248
0
}
3249
3250
CK_RV
3251
mock_C_DigestEncryptUpdate (CK_SESSION_HANDLE session,
3252
                            CK_BYTE_PTR part,
3253
                            CK_ULONG part_len,
3254
                            CK_BYTE_PTR encrypted_part,
3255
                            CK_ULONG_PTR encrypted_part_len)
3256
0
{
3257
0
  CK_RV rv;
3258
3259
0
  rv = mock_C_EncryptUpdate (session, part, part_len, encrypted_part, encrypted_part_len);
3260
0
  if (rv == CKR_OK)
3261
0
    rv = mock_C_DigestUpdate (session, part, part_len);
3262
3263
0
  return rv;
3264
0
}
3265
3266
CK_RV
3267
mock_C_DigestEncryptUpdate__invalid_handle (CK_SESSION_HANDLE session,
3268
                                            CK_BYTE_PTR part,
3269
                                            CK_ULONG part_len,
3270
                                            CK_BYTE_PTR enc_part,
3271
                                            CK_ULONG_PTR enc_part_len)
3272
0
{
3273
0
  return_val_if_fail (enc_part_len, CKR_ARGUMENTS_BAD);
3274
3275
0
  return CKR_SESSION_HANDLE_INVALID;
3276
0
}
3277
3278
CK_RV
3279
mock_X_DigestEncryptUpdate__invalid_handle (CK_X_FUNCTION_LIST *self,
3280
                                            CK_SESSION_HANDLE session,
3281
                                            CK_BYTE_PTR part,
3282
                                            CK_ULONG part_len,
3283
                                            CK_BYTE_PTR enc_part,
3284
                                            CK_ULONG_PTR enc_part_len)
3285
0
{
3286
0
  return_val_if_fail (enc_part_len, CKR_ARGUMENTS_BAD);
3287
3288
0
  return CKR_SESSION_HANDLE_INVALID;
3289
0
}
3290
3291
CK_RV
3292
mock_C_DecryptDigestUpdate (CK_SESSION_HANDLE session,
3293
                            CK_BYTE_PTR encrypted_part,
3294
                            CK_ULONG encrypted_part_len,
3295
                            CK_BYTE_PTR part,
3296
                            CK_ULONG_PTR part_len)
3297
0
{
3298
0
  CK_RV rv;
3299
3300
0
  rv = mock_C_DecryptUpdate (session, encrypted_part, encrypted_part_len, part, part_len);
3301
0
  if (rv == CKR_OK)
3302
0
    rv = mock_C_DigestUpdate (session, part, *part_len);
3303
3304
0
  return rv;
3305
0
}
3306
3307
CK_RV
3308
mock_C_DecryptDigestUpdate__invalid_handle (CK_SESSION_HANDLE session,
3309
                                            CK_BYTE_PTR enc_part,
3310
                                            CK_ULONG enc_part_len,
3311
                                            CK_BYTE_PTR part,
3312
                                            CK_ULONG_PTR part_len)
3313
0
{
3314
0
  return_val_if_fail (part_len, CKR_ARGUMENTS_BAD);
3315
3316
0
  return CKR_SESSION_HANDLE_INVALID;
3317
0
}
3318
3319
CK_RV
3320
mock_X_DecryptDigestUpdate__invalid_handle (CK_X_FUNCTION_LIST *self,
3321
                                            CK_SESSION_HANDLE session,
3322
                                            CK_BYTE_PTR enc_part,
3323
                                            CK_ULONG enc_part_len,
3324
                                            CK_BYTE_PTR part,
3325
                                            CK_ULONG_PTR part_len)
3326
0
{
3327
0
  return_val_if_fail (part_len, CKR_ARGUMENTS_BAD);
3328
3329
0
  return CKR_SESSION_HANDLE_INVALID;
3330
0
}
3331
3332
CK_RV
3333
mock_C_SignEncryptUpdate (CK_SESSION_HANDLE session,
3334
                          CK_BYTE_PTR part,
3335
                          CK_ULONG part_len,
3336
                          CK_BYTE_PTR encrypted_part,
3337
                          CK_ULONG_PTR encrypted_part_len)
3338
0
{
3339
0
  CK_RV rv;
3340
3341
0
  rv = mock_C_EncryptUpdate (session, part, part_len, encrypted_part, encrypted_part_len);
3342
0
  if (rv == CKR_OK)
3343
0
    rv = mock_C_SignUpdate (session, part, part_len);
3344
3345
0
  return rv;
3346
0
}
3347
3348
CK_RV
3349
mock_C_SignEncryptUpdate__invalid_handle (CK_SESSION_HANDLE session,
3350
                                          CK_BYTE_PTR part,
3351
                                          CK_ULONG part_len,
3352
                                          CK_BYTE_PTR enc_part,
3353
                                          CK_ULONG_PTR enc_part_len)
3354
0
{
3355
0
  return_val_if_fail (enc_part_len, CKR_ARGUMENTS_BAD);
3356
3357
0
  return CKR_SESSION_HANDLE_INVALID;
3358
0
}
3359
3360
CK_RV
3361
mock_X_SignEncryptUpdate__invalid_handle (CK_X_FUNCTION_LIST *self,
3362
                                          CK_SESSION_HANDLE session,
3363
                                          CK_BYTE_PTR part,
3364
                                          CK_ULONG part_len,
3365
                                          CK_BYTE_PTR enc_part,
3366
                                          CK_ULONG_PTR enc_part_len)
3367
0
{
3368
0
  return_val_if_fail (enc_part_len, CKR_ARGUMENTS_BAD);
3369
3370
0
  return CKR_SESSION_HANDLE_INVALID;
3371
0
}
3372
3373
CK_RV
3374
mock_C_DecryptVerifyUpdate (CK_SESSION_HANDLE session,
3375
                            CK_BYTE_PTR encrypted_part,
3376
                            CK_ULONG encrypted_part_len,
3377
                            CK_BYTE_PTR part,
3378
                            CK_ULONG_PTR part_len)
3379
0
{
3380
0
  CK_RV rv;
3381
3382
0
  rv = mock_C_DecryptUpdate (session, encrypted_part, encrypted_part_len, part, part_len);
3383
0
  if (rv == CKR_OK)
3384
0
    rv = mock_C_VerifyUpdate (session, part, *part_len);
3385
3386
0
  return rv;
3387
0
}
3388
3389
CK_RV
3390
mock_C_DecryptVerifyUpdate__invalid_handle (CK_SESSION_HANDLE session,
3391
                                            CK_BYTE_PTR enc_part,
3392
                                            CK_ULONG enc_part_len,
3393
                                            CK_BYTE_PTR part,
3394
                                            CK_ULONG_PTR part_len)
3395
0
{
3396
0
  return_val_if_fail (part_len, CKR_ARGUMENTS_BAD);
3397
3398
0
  return CKR_SESSION_HANDLE_INVALID;
3399
0
}
3400
3401
CK_RV
3402
mock_X_DecryptVerifyUpdate__invalid_handle (CK_X_FUNCTION_LIST *self,
3403
                                            CK_SESSION_HANDLE session,
3404
                                            CK_BYTE_PTR enc_part,
3405
                                            CK_ULONG enc_part_len,
3406
                                            CK_BYTE_PTR part,
3407
                                            CK_ULONG_PTR part_len)
3408
0
{
3409
0
  return_val_if_fail (part_len, CKR_ARGUMENTS_BAD);
3410
3411
0
  return CKR_SESSION_HANDLE_INVALID;
3412
0
}
3413
3414
CK_RV
3415
mock_C_GenerateKey (CK_SESSION_HANDLE session,
3416
                    CK_MECHANISM_PTR mechanism,
3417
                    CK_ATTRIBUTE_PTR template,
3418
                    CK_ULONG count,
3419
                    CK_OBJECT_HANDLE_PTR key)
3420
0
{
3421
0
  CK_ATTRIBUTE *attrs;
3422
0
  CK_ATTRIBUTE value;
3423
0
  Session *sess;
3424
0
  CK_BBOOL token;
3425
3426
0
  return_val_if_fail (mechanism, CKR_MECHANISM_INVALID);
3427
0
  return_val_if_fail (template, CKR_TEMPLATE_INCOMPLETE);
3428
0
  return_val_if_fail (count, CKR_TEMPLATE_INCOMPLETE);
3429
0
  return_val_if_fail (key, CKR_ARGUMENTS_BAD);
3430
3431
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
3432
0
  if (!sess)
3433
0
    return CKR_SESSION_HANDLE_INVALID;
3434
3435
0
  if (mechanism->mechanism != CKM_MOCK_GENERATE)
3436
0
    return CKR_MECHANISM_INVALID;
3437
3438
0
  if (!mechanism->pParameter || mechanism->ulParameterLen != 9 ||
3439
0
      memcmp (mechanism->pParameter, "generate", 9) != 0)
3440
0
    return CKR_MECHANISM_PARAM_INVALID;
3441
3442
0
  value.type = CKA_VALUE;
3443
0
  value.pValue = "generated";
3444
0
  value.ulValueLen = strlen (value.pValue);
3445
3446
0
  attrs = p11_attrs_buildn (NULL, template, count);
3447
0
  attrs = p11_attrs_buildn (attrs, &value, 1);
3448
3449
0
  *key = ++unique_identifier;
3450
0
  if (p11_attrs_find_bool (attrs, CKA_TOKEN, &token) && token)
3451
0
    p11_dict_set (the_objects, handle_to_pointer (*key), attrs);
3452
0
  else
3453
0
    p11_dict_set (sess->objects, handle_to_pointer (*key), attrs);
3454
3455
0
  return CKR_OK;
3456
0
}
3457
3458
CK_RV
3459
mock_C_GenerateKey__invalid_handle (CK_SESSION_HANDLE session,
3460
                                    CK_MECHANISM_PTR mechanism,
3461
                                    CK_ATTRIBUTE_PTR template,
3462
                                    CK_ULONG count,
3463
                                    CK_OBJECT_HANDLE_PTR key)
3464
0
{
3465
0
  return CKR_SESSION_HANDLE_INVALID;
3466
0
}
3467
3468
CK_RV
3469
mock_X_GenerateKey__invalid_handle (CK_X_FUNCTION_LIST *self,
3470
                                    CK_SESSION_HANDLE session,
3471
                                    CK_MECHANISM_PTR mechanism,
3472
                                    CK_ATTRIBUTE_PTR template,
3473
                                    CK_ULONG count,
3474
                                    CK_OBJECT_HANDLE_PTR key)
3475
0
{
3476
0
  return CKR_SESSION_HANDLE_INVALID;
3477
0
}
3478
3479
CK_RV
3480
mock_C_GenerateKeyPair (CK_SESSION_HANDLE session,
3481
                        CK_MECHANISM_PTR mechanism,
3482
                        CK_ATTRIBUTE_PTR public_key_template,
3483
                        CK_ULONG public_key_count,
3484
                        CK_ATTRIBUTE_PTR private_key_template,
3485
                        CK_ULONG private_key_count,
3486
                        CK_OBJECT_HANDLE_PTR public_key,
3487
                        CK_OBJECT_HANDLE_PTR private_key)
3488
0
{
3489
0
  CK_ATTRIBUTE *attrs;
3490
0
  CK_ATTRIBUTE value;
3491
0
  Session *sess;
3492
0
  CK_BBOOL token;
3493
3494
0
  return_val_if_fail (mechanism, CKR_MECHANISM_INVALID);
3495
0
  return_val_if_fail (public_key_template, CKR_TEMPLATE_INCOMPLETE);
3496
0
  return_val_if_fail (public_key_count, CKR_TEMPLATE_INCOMPLETE);
3497
0
  return_val_if_fail (private_key_template, CKR_TEMPLATE_INCOMPLETE);
3498
0
  return_val_if_fail (private_key_count, CKR_TEMPLATE_INCOMPLETE);
3499
0
  return_val_if_fail (public_key, CKR_ARGUMENTS_BAD);
3500
0
  return_val_if_fail (private_key, CKR_ARGUMENTS_BAD);
3501
3502
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
3503
0
  if (!sess)
3504
0
    return CKR_SESSION_HANDLE_INVALID;
3505
3506
0
  if (mechanism->mechanism != CKM_MOCK_GENERATE)
3507
0
    return CKR_MECHANISM_INVALID;
3508
3509
0
  if (!mechanism->pParameter || mechanism->ulParameterLen != 9 ||
3510
0
      memcmp (mechanism->pParameter, "generate", 9) != 0)
3511
0
    return CKR_MECHANISM_PARAM_INVALID;
3512
3513
0
  value.type = CKA_VALUE;
3514
0
  value.pValue = "generated";
3515
0
  value.ulValueLen = strlen (value.pValue);
3516
3517
0
  attrs = p11_attrs_buildn (NULL, public_key_template, public_key_count);
3518
0
  attrs = p11_attrs_buildn (attrs, &value, 1);
3519
3520
0
  *public_key = ++unique_identifier;
3521
0
  if (p11_attrs_find_bool (attrs, CKA_TOKEN, &token) && token)
3522
0
    p11_dict_set (the_objects, handle_to_pointer (*public_key), attrs);
3523
0
  else
3524
0
    p11_dict_set (sess->objects, handle_to_pointer (*public_key), attrs);
3525
3526
0
  attrs = p11_attrs_buildn (NULL, private_key_template, private_key_count);
3527
0
  attrs = p11_attrs_buildn (attrs, &value, 1);
3528
3529
0
  *private_key = ++unique_identifier;
3530
0
  if (p11_attrs_find_bool (attrs, CKA_TOKEN, &token) && token)
3531
0
    p11_dict_set (the_objects, handle_to_pointer (*private_key), attrs);
3532
0
  else
3533
0
    p11_dict_set (sess->objects, handle_to_pointer (*private_key), attrs);
3534
3535
0
  return CKR_OK;
3536
0
}
3537
3538
CK_RV
3539
mock_C_GenerateKeyPair__invalid_handle (CK_SESSION_HANDLE session,
3540
                                        CK_MECHANISM_PTR mechanism,
3541
                                        CK_ATTRIBUTE_PTR pub_template,
3542
                                        CK_ULONG pub_count,
3543
                                        CK_ATTRIBUTE_PTR priv_template,
3544
                                        CK_ULONG priv_count,
3545
                                        CK_OBJECT_HANDLE_PTR pub_key,
3546
                                        CK_OBJECT_HANDLE_PTR priv_key)
3547
0
{
3548
0
  return CKR_SESSION_HANDLE_INVALID;
3549
0
}
3550
3551
CK_RV
3552
mock_X_GenerateKeyPair__invalid_handle (CK_X_FUNCTION_LIST *self,
3553
                                        CK_SESSION_HANDLE session,
3554
                                        CK_MECHANISM_PTR mechanism,
3555
                                        CK_ATTRIBUTE_PTR pub_template,
3556
                                        CK_ULONG pub_count,
3557
                                        CK_ATTRIBUTE_PTR priv_template,
3558
                                        CK_ULONG priv_count,
3559
                                        CK_OBJECT_HANDLE_PTR pub_key,
3560
                                        CK_OBJECT_HANDLE_PTR priv_key)
3561
0
{
3562
0
  return CKR_SESSION_HANDLE_INVALID;
3563
0
}
3564
3565
CK_RV
3566
mock_C_WrapKey (CK_SESSION_HANDLE session,
3567
                CK_MECHANISM_PTR mechanism,
3568
                CK_OBJECT_HANDLE wrapping_key,
3569
                CK_OBJECT_HANDLE key,
3570
                CK_BYTE_PTR wrapped_key,
3571
                CK_ULONG_PTR wrapped_key_len)
3572
0
{
3573
0
  CK_ATTRIBUTE *attrs;
3574
0
  CK_ATTRIBUTE *attr;
3575
0
  Session *sess;
3576
0
  CK_RV rv;
3577
3578
0
  return_val_if_fail (mechanism, CKR_MECHANISM_INVALID);
3579
0
  return_val_if_fail (wrapping_key, CKR_OBJECT_HANDLE_INVALID);
3580
0
  return_val_if_fail (key, CKR_OBJECT_HANDLE_INVALID);
3581
0
  return_val_if_fail (wrapped_key_len, CKR_WRAPPED_KEY_LEN_RANGE);
3582
3583
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
3584
0
  if (!sess)
3585
0
    return CKR_SESSION_HANDLE_INVALID;
3586
3587
0
  rv = lookup_object (sess, wrapping_key, &attrs, NULL);
3588
0
  if (rv == CKR_OBJECT_HANDLE_INVALID)
3589
0
    return CKR_WRAPPING_KEY_HANDLE_INVALID;
3590
0
  else if (rv != CKR_OK)
3591
0
    return rv;
3592
3593
0
  rv = lookup_object (sess, key, &attrs, NULL);
3594
0
  if (rv == CKR_OBJECT_HANDLE_INVALID)
3595
0
    return CKR_WRAPPING_KEY_HANDLE_INVALID;
3596
0
  else if (rv != CKR_OK)
3597
0
    return rv;
3598
3599
0
  if (mechanism->mechanism != CKM_MOCK_WRAP)
3600
0
    return CKR_MECHANISM_INVALID;
3601
3602
0
  if (mechanism->pParameter == NULL ||
3603
0
      mechanism->ulParameterLen != 4 ||
3604
0
      memcmp (mechanism->pParameter, "wrap", 4) != 0) {
3605
0
    return CKR_MECHANISM_PARAM_INVALID;
3606
0
  }
3607
3608
0
  attr = p11_attrs_find_valid (attrs, CKA_VALUE);
3609
0
  if (attr == NULL)
3610
0
    return CKR_WRAPPED_KEY_INVALID;
3611
3612
0
  if (!wrapped_key) {
3613
0
    *wrapped_key_len = attr->ulValueLen;
3614
0
    return CKR_OK;
3615
0
  }
3616
3617
0
  if (*wrapped_key_len < attr->ulValueLen) {
3618
0
    *wrapped_key_len = attr->ulValueLen;
3619
0
    return CKR_BUFFER_TOO_SMALL;
3620
0
  }
3621
3622
0
  memcpy (wrapped_key, attr->pValue, attr->ulValueLen);
3623
0
  *wrapped_key_len = attr->ulValueLen;
3624
3625
0
  return CKR_OK;
3626
0
}
3627
3628
CK_RV
3629
mock_C_WrapKey__invalid_handle (CK_SESSION_HANDLE session,
3630
                                CK_MECHANISM_PTR mechanism,
3631
                                CK_OBJECT_HANDLE wrapping_key,
3632
                                CK_OBJECT_HANDLE key,
3633
                                CK_BYTE_PTR wrapped_key,
3634
                                CK_ULONG_PTR wrapped_key_len)
3635
0
{
3636
0
  return_val_if_fail (wrapped_key_len, CKR_ARGUMENTS_BAD);
3637
3638
0
  return CKR_SESSION_HANDLE_INVALID;
3639
0
}
3640
3641
CK_RV
3642
mock_X_WrapKey__invalid_handle (CK_X_FUNCTION_LIST *self,
3643
                                CK_SESSION_HANDLE session,
3644
                                CK_MECHANISM_PTR mechanism,
3645
                                CK_OBJECT_HANDLE wrapping_key,
3646
                                CK_OBJECT_HANDLE key,
3647
                                CK_BYTE_PTR wrapped_key,
3648
                                CK_ULONG_PTR wrapped_key_len)
3649
0
{
3650
0
  return_val_if_fail (wrapped_key_len, CKR_ARGUMENTS_BAD);
3651
3652
0
  return CKR_SESSION_HANDLE_INVALID;
3653
0
}
3654
3655
CK_RV
3656
mock_C_UnwrapKey (CK_SESSION_HANDLE session,
3657
                  CK_MECHANISM_PTR mechanism,
3658
                  CK_OBJECT_HANDLE unwrapping_key,
3659
                  CK_BYTE_PTR wrapped_key,
3660
                  CK_ULONG wrapped_key_len,
3661
                  CK_ATTRIBUTE_PTR template,
3662
                  CK_ULONG count,
3663
                  CK_OBJECT_HANDLE_PTR key)
3664
0
{
3665
0
  CK_ATTRIBUTE *attrs;
3666
0
  CK_ATTRIBUTE value;
3667
0
  Session *sess;
3668
0
  CK_BBOOL token;
3669
0
  CK_RV rv;
3670
3671
0
  return_val_if_fail (mechanism, CKR_MECHANISM_INVALID);
3672
0
  return_val_if_fail (unwrapping_key, CKR_WRAPPING_KEY_HANDLE_INVALID);
3673
0
  return_val_if_fail (wrapped_key, CKR_WRAPPED_KEY_INVALID);
3674
0
  return_val_if_fail (wrapped_key_len, CKR_WRAPPED_KEY_LEN_RANGE);
3675
0
  return_val_if_fail (key, CKR_ARGUMENTS_BAD);
3676
0
  return_val_if_fail (template, CKR_TEMPLATE_INCOMPLETE);
3677
0
  return_val_if_fail (count, CKR_TEMPLATE_INCONSISTENT);
3678
3679
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
3680
0
  if (!sess)
3681
0
    return CKR_SESSION_HANDLE_INVALID;
3682
3683
0
  rv = lookup_object (sess, unwrapping_key, &attrs, NULL);
3684
0
  if (rv == CKR_OBJECT_HANDLE_INVALID)
3685
0
    return CKR_WRAPPING_KEY_HANDLE_INVALID;
3686
0
  else if (rv != CKR_OK)
3687
0
    return rv;
3688
3689
0
  if (mechanism->mechanism != CKM_MOCK_WRAP)
3690
0
    return CKR_MECHANISM_INVALID;
3691
3692
0
  if (mechanism->pParameter == NULL ||
3693
0
      mechanism->ulParameterLen != 4 ||
3694
0
      memcmp (mechanism->pParameter, "wrap", 4) != 0) {
3695
0
    return CKR_MECHANISM_PARAM_INVALID;
3696
0
  }
3697
3698
0
  value.type = CKA_VALUE;
3699
0
  value.pValue = wrapped_key;
3700
0
  value.ulValueLen = wrapped_key_len;
3701
3702
0
  attrs = p11_attrs_buildn (NULL, template, count);
3703
0
  attrs = p11_attrs_buildn (attrs, &value, 1);
3704
3705
0
  *key = ++unique_identifier;
3706
0
  if (p11_attrs_find_bool (attrs, CKA_TOKEN, &token) && token)
3707
0
    p11_dict_set (the_objects, handle_to_pointer (*key), attrs);
3708
0
  else
3709
0
    p11_dict_set (sess->objects, handle_to_pointer (*key), attrs);
3710
3711
0
  return CKR_OK;
3712
0
}
3713
3714
CK_RV
3715
mock_C_UnwrapKey__invalid_handle (CK_SESSION_HANDLE session,
3716
                                  CK_MECHANISM_PTR mechanism,
3717
                                  CK_OBJECT_HANDLE unwrapping_key,
3718
                                  CK_BYTE_PTR wrapped_key,
3719
                                  CK_ULONG wrapped_key_len,
3720
                                  CK_ATTRIBUTE_PTR template,
3721
                                  CK_ULONG count,
3722
                                  CK_OBJECT_HANDLE_PTR key)
3723
0
{
3724
0
  return CKR_SESSION_HANDLE_INVALID;
3725
0
}
3726
3727
CK_RV
3728
mock_X_UnwrapKey__invalid_handle (CK_X_FUNCTION_LIST *self,
3729
                                  CK_SESSION_HANDLE session,
3730
                                  CK_MECHANISM_PTR mechanism,
3731
                                  CK_OBJECT_HANDLE unwrapping_key,
3732
                                  CK_BYTE_PTR wrapped_key,
3733
                                  CK_ULONG wrapped_key_len,
3734
                                  CK_ATTRIBUTE_PTR template,
3735
                                  CK_ULONG count,
3736
                                  CK_OBJECT_HANDLE_PTR key)
3737
0
{
3738
0
  return CKR_SESSION_HANDLE_INVALID;
3739
0
}
3740
3741
CK_RV
3742
mock_C_DeriveKey (CK_SESSION_HANDLE session,
3743
                  CK_MECHANISM_PTR mechanism,
3744
                  CK_OBJECT_HANDLE base_key,
3745
                  CK_ATTRIBUTE_PTR template,
3746
                  CK_ULONG count,
3747
                  CK_OBJECT_HANDLE_PTR key)
3748
0
{
3749
0
  CK_ATTRIBUTE *attrs, *copy;
3750
0
  CK_ATTRIBUTE value;
3751
0
  Session *sess;
3752
0
  CK_BBOOL token;
3753
0
  CK_RV rv;
3754
3755
0
  return_val_if_fail (mechanism, CKR_MECHANISM_INVALID);
3756
0
  return_val_if_fail (count, CKR_TEMPLATE_INCOMPLETE);
3757
0
  return_val_if_fail (template, CKR_TEMPLATE_INCOMPLETE);
3758
0
  return_val_if_fail (key, CKR_ARGUMENTS_BAD);
3759
3760
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
3761
0
  if (!sess)
3762
0
    return CKR_SESSION_HANDLE_INVALID;
3763
3764
0
  rv = lookup_object (sess, base_key, &attrs, NULL);
3765
0
  if (rv == CKR_OBJECT_HANDLE_INVALID)
3766
0
    return CKR_KEY_HANDLE_INVALID;
3767
0
  else if (rv != CKR_OK)
3768
0
    return rv;
3769
3770
0
  if (mechanism->mechanism != CKM_MOCK_DERIVE)
3771
0
    return CKR_MECHANISM_INVALID;
3772
3773
0
  if (mechanism->pParameter == NULL ||
3774
0
      mechanism->ulParameterLen != 6 ||
3775
0
      memcmp (mechanism->pParameter, "derive", 6) != 0) {
3776
0
    return CKR_MECHANISM_PARAM_INVALID;
3777
0
  }
3778
3779
0
  value.type = CKA_VALUE;
3780
0
  value.pValue = "derived";
3781
0
  value.ulValueLen = strlen (value.pValue);
3782
3783
0
  copy = p11_attrs_buildn (NULL, template, count);
3784
0
  copy = p11_attrs_buildn (copy, &value, 1);
3785
3786
0
  *key = ++unique_identifier;
3787
0
  if (p11_attrs_find_bool (copy, CKA_TOKEN, &token) && token)
3788
0
    p11_dict_set (the_objects, handle_to_pointer (*key), copy);
3789
0
  else
3790
0
    p11_dict_set (sess->objects, handle_to_pointer (*key), copy);
3791
3792
0
  return CKR_OK;
3793
0
}
3794
3795
CK_RV
3796
mock_C_DeriveKey__invalid_handle (CK_SESSION_HANDLE session,
3797
                                  CK_MECHANISM_PTR mechanism,
3798
                                  CK_OBJECT_HANDLE base_key,
3799
                                  CK_ATTRIBUTE_PTR template,
3800
                                  CK_ULONG count,
3801
                                  CK_OBJECT_HANDLE_PTR key)
3802
0
{
3803
0
  return CKR_SESSION_HANDLE_INVALID;
3804
0
}
3805
3806
CK_RV
3807
mock_X_DeriveKey__invalid_handle (CK_X_FUNCTION_LIST *self,
3808
                                  CK_SESSION_HANDLE session,
3809
                                  CK_MECHANISM_PTR mechanism,
3810
                                  CK_OBJECT_HANDLE base_key,
3811
                                  CK_ATTRIBUTE_PTR template,
3812
                                  CK_ULONG count,
3813
                                  CK_OBJECT_HANDLE_PTR key)
3814
0
{
3815
0
  return CKR_SESSION_HANDLE_INVALID;
3816
0
}
3817
3818
CK_RV
3819
mock_C_SeedRandom (CK_SESSION_HANDLE session,
3820
                   CK_BYTE_PTR seed,
3821
                   CK_ULONG seed_len)
3822
0
{
3823
0
  Session *sess;
3824
3825
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
3826
0
  if (!sess)
3827
0
    return CKR_SESSION_HANDLE_INVALID;
3828
3829
0
  if (seed_len > sizeof (sess->random_seed))
3830
0
    return CKR_RANDOM_SEED_NOT_SUPPORTED;
3831
3832
0
  memcpy (sess->random_seed, seed, seed_len);
3833
0
  sess->random_seed_len = seed_len;
3834
0
  return CKR_OK;
3835
0
}
3836
3837
CK_RV
3838
mock_C_SeedRandom__invalid_handle (CK_SESSION_HANDLE session,
3839
                                   CK_BYTE_PTR seed,
3840
                                   CK_ULONG seed_len)
3841
0
{
3842
0
  return CKR_SESSION_HANDLE_INVALID;
3843
0
}
3844
3845
CK_RV
3846
mock_X_SeedRandom__invalid_handle (CK_X_FUNCTION_LIST *self,
3847
                                   CK_SESSION_HANDLE session,
3848
                                   CK_BYTE_PTR seed,
3849
                                   CK_ULONG seed_len)
3850
0
{
3851
0
  return CKR_SESSION_HANDLE_INVALID;
3852
0
}
3853
3854
CK_RV
3855
mock_C_GenerateRandom (CK_SESSION_HANDLE session,
3856
                       CK_BYTE_PTR random_data,
3857
                       CK_ULONG random_len)
3858
0
{
3859
0
  Session *sess;
3860
0
  CK_ULONG block;
3861
3862
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
3863
0
  if (!sess)
3864
0
    return CKR_SESSION_HANDLE_INVALID;
3865
3866
0
  while (random_len > 0) {
3867
0
    block = sess->random_seed_len;
3868
0
    if (block > random_len)
3869
0
      block = random_len;
3870
0
    memcpy (random_data, sess->random_seed, block);
3871
0
    random_data += block;
3872
0
    random_len -= block;
3873
0
  }
3874
3875
0
  return CKR_OK;
3876
0
}
3877
3878
CK_RV
3879
mock_C_GenerateRandom__invalid_handle (CK_SESSION_HANDLE session,
3880
                                       CK_BYTE_PTR random_data,
3881
                                       CK_ULONG random_len)
3882
0
{
3883
0
  return CKR_SESSION_HANDLE_INVALID;
3884
0
}
3885
3886
CK_RV
3887
mock_X_GenerateRandom__invalid_handle (CK_X_FUNCTION_LIST *self,
3888
                                       CK_SESSION_HANDLE session,
3889
                                       CK_BYTE_PTR random_data,
3890
                                       CK_ULONG random_len)
3891
0
{
3892
0
  return CKR_SESSION_HANDLE_INVALID;
3893
0
}
3894
3895
CK_RV
3896
mock_C_GetInterfaceList_not_supported (CK_INTERFACE_PTR interfaces_list,
3897
                                       CK_ULONG_PTR count)
3898
0
{
3899
  /* This would be a strange call to receive, should be overridden  */
3900
0
  return_val_if_reached (CKR_FUNCTION_NOT_SUPPORTED);
3901
0
}
3902
3903
CK_RV
3904
mock_X_GetInterfaceList_not_supported (CK_X_FUNCTION_LIST *self,
3905
                                       CK_INTERFACE_PTR interfaces_list,
3906
                                       CK_ULONG_PTR count)
3907
0
{
3908
  /* This would be a strange call to receive, should be overridden  */
3909
0
  return_val_if_reached (CKR_FUNCTION_NOT_SUPPORTED);
3910
0
}
3911
3912
CK_RV
3913
mock_C_GetInterface_not_supported (CK_UTF8CHAR_PTR interface_name,
3914
                                   CK_VERSION_PTR version,
3915
                                   CK_INTERFACE_PTR_PTR interface,
3916
                                   CK_FLAGS flags)
3917
0
{
3918
  /* This would be a strange call to receive, should be overridden  */
3919
0
  return_val_if_reached (CKR_FUNCTION_NOT_SUPPORTED);
3920
0
}
3921
3922
CK_RV
3923
mock_X_GetInterface_not_supported (CK_X_FUNCTION_LIST *self,
3924
                                   CK_UTF8CHAR_PTR interface_name,
3925
                                   CK_VERSION_PTR version,
3926
                                   CK_INTERFACE_PTR_PTR interface,
3927
                                   CK_FLAGS flags)
3928
0
{
3929
  /* This would be a strange call to receive, should be overridden  */
3930
0
  return_val_if_reached (CKR_FUNCTION_NOT_SUPPORTED);
3931
0
}
3932
3933
CK_RV
3934
mock_C_LoginUser (CK_SESSION_HANDLE session,
3935
                  CK_USER_TYPE user_type,
3936
                  CK_UTF8CHAR_PTR pin,
3937
                  CK_ULONG pin_len,
3938
                  CK_UTF8CHAR_PTR username,
3939
                  CK_ULONG username_len)
3940
0
{
3941
0
  Session *sess;
3942
3943
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
3944
0
  if (sess == NULL)
3945
0
    return CKR_SESSION_HANDLE_INVALID;
3946
3947
0
  if (!username)
3948
0
    return CKR_PIN_INCORRECT;
3949
3950
0
  if (username_len != n_the_username)
3951
0
    return CKR_PIN_INCORRECT;
3952
0
  if (strncmp ((char *)username, (char *)the_username, username_len) != 0)
3953
0
    return CKR_PIN_INCORRECT;
3954
3955
0
  return mock_C_Login (session, user_type, pin, pin_len);
3956
0
}
3957
3958
CK_RV
3959
mock_C_LoginUser__invalid_handle (CK_SESSION_HANDLE session,
3960
                                  CK_USER_TYPE user_type,
3961
                                  CK_UTF8CHAR_PTR pin,
3962
                                  CK_ULONG pin_len,
3963
                                  CK_UTF8CHAR_PTR username,
3964
                                  CK_ULONG username_len)
3965
0
{
3966
0
  return CKR_SESSION_HANDLE_INVALID;
3967
0
}
3968
3969
CK_RV
3970
mock_X_LoginUser__invalid_handle (CK_X_FUNCTION_LIST *self,
3971
                                  CK_SESSION_HANDLE session,
3972
                                  CK_USER_TYPE user_type,
3973
                                  CK_UTF8CHAR_PTR pin,
3974
                                  CK_ULONG pin_len,
3975
                                  CK_UTF8CHAR_PTR username,
3976
                                  CK_ULONG username_len)
3977
0
{
3978
0
  return CKR_SESSION_HANDLE_INVALID;
3979
0
}
3980
3981
CK_RV
3982
mock_C_SessionCancel (CK_SESSION_HANDLE session,
3983
                      CK_FLAGS flags)
3984
0
{
3985
0
  Session *sess;
3986
3987
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
3988
0
  if (!sess)
3989
0
    return CKR_SESSION_HANDLE_INVALID;
3990
3991
0
  if (flags & CKF_FIND_OBJECTS)
3992
0
    sess->finding = CK_FALSE;
3993
0
  sess->hash_method &= ~flags;
3994
0
  sess->crypto_method &= ~flags;
3995
0
  sess->message_method &= ~flags;
3996
0
  sess->message_progress = false;
3997
0
  sess->crypto_mechanism = 0;
3998
0
  sess->crypto_key = 0;
3999
4000
0
  return CKR_OK;
4001
0
}
4002
4003
CK_RV
4004
mock_C_SessionCancel__invalid_handle (CK_SESSION_HANDLE session,
4005
                                      CK_FLAGS flags)
4006
0
{
4007
0
  return CKR_SESSION_HANDLE_INVALID;
4008
0
}
4009
4010
CK_RV
4011
mock_X_SessionCancel__invalid_handle (CK_X_FUNCTION_LIST *self,
4012
                                      CK_SESSION_HANDLE session,
4013
                                      CK_FLAGS flags)
4014
0
{
4015
0
  return CKR_SESSION_HANDLE_INVALID;
4016
0
}
4017
4018
CK_RV
4019
mock_C_MessageEncryptInit (CK_SESSION_HANDLE session,
4020
                           CK_MECHANISM_PTR mechanism,
4021
                           CK_OBJECT_HANDLE key)
4022
0
{
4023
0
  Session *sess;
4024
0
  CK_RV rv;
4025
4026
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
4027
0
  if (!sess)
4028
0
    return CKR_SESSION_HANDLE_INVALID;
4029
0
  if (mechanism == NULL && sess->message_method == CKF_MESSAGE_ENCRYPT) {
4030
0
    sess->message_method = 0;
4031
0
    return CKR_OK;
4032
0
  }
4033
0
  if (sess->message_method != 0)
4034
0
    return CKR_OPERATION_ACTIVE;
4035
4036
0
  rv = mock_C_EncryptInit (session, mechanism, key);
4037
0
  if (rv != CKR_OK)
4038
0
    return rv;
4039
4040
0
  sess->message_method = CKF_MESSAGE_ENCRYPT;
4041
4042
0
  return CKR_OK;
4043
0
}
4044
4045
CK_RV
4046
mock_C_MessageEncryptInit__invalid_handle (CK_SESSION_HANDLE session,
4047
                                           CK_MECHANISM_PTR mechanism,
4048
                                           CK_OBJECT_HANDLE key)
4049
0
{
4050
0
  return CKR_SESSION_HANDLE_INVALID;
4051
0
}
4052
4053
CK_RV
4054
mock_X_MessageEncryptInit__invalid_handle (CK_X_FUNCTION_LIST *self,
4055
                                           CK_SESSION_HANDLE session,
4056
                                           CK_MECHANISM_PTR mechanism,
4057
                                           CK_OBJECT_HANDLE key)
4058
0
{
4059
0
  return CKR_SESSION_HANDLE_INVALID;
4060
0
}
4061
4062
CK_RV
4063
mock_C_EncryptMessage (CK_SESSION_HANDLE session,
4064
                       CK_VOID_PTR parameter,
4065
                       CK_ULONG parameter_len,
4066
                       CK_BYTE_PTR associated_data,
4067
                       CK_ULONG associated_data_len,
4068
                       CK_BYTE_PTR plaintext,
4069
                       CK_ULONG plaintext_len,
4070
                       CK_BYTE_PTR ciphertext,
4071
                       CK_ULONG_PTR ciphertext_len)
4072
0
{
4073
0
  CK_RV rv;
4074
4075
0
  rv = mock_C_EncryptMessageBegin (session, parameter, parameter_len,
4076
0
                                   associated_data, associated_data_len);
4077
0
  if (rv != CKR_OK)
4078
0
    return rv;
4079
4080
0
  return mock_C_EncryptMessageNext (session, parameter, parameter_len, plaintext, plaintext_len,
4081
0
                                    ciphertext, ciphertext_len, CKF_END_OF_MESSAGE);
4082
0
}
4083
4084
CK_RV
4085
mock_C_EncryptMessage__invalid_handle (CK_SESSION_HANDLE session,
4086
                                       CK_VOID_PTR parameter,
4087
                                       CK_ULONG parameter_len,
4088
                                       CK_BYTE_PTR associated_data,
4089
                                       CK_ULONG associated_data_len,
4090
                                       CK_BYTE_PTR plaintext,
4091
                                       CK_ULONG plaintext_len,
4092
                                       CK_BYTE_PTR ciphertext,
4093
                                       CK_ULONG_PTR ciphertext_len)
4094
0
{
4095
0
  return CKR_SESSION_HANDLE_INVALID;
4096
0
}
4097
4098
CK_RV
4099
mock_X_EncryptMessage__invalid_handle (CK_X_FUNCTION_LIST *self,
4100
                                       CK_SESSION_HANDLE session,
4101
                                       CK_VOID_PTR parameter,
4102
                                       CK_ULONG parameter_len,
4103
                                       CK_BYTE_PTR associated_data,
4104
                                       CK_ULONG associated_data_len,
4105
                                       CK_BYTE_PTR plaintext,
4106
                                       CK_ULONG plaintext_len,
4107
                                       CK_BYTE_PTR ciphertext,
4108
                                       CK_ULONG_PTR ciphertext_len)
4109
0
{
4110
0
  return CKR_SESSION_HANDLE_INVALID;
4111
0
}
4112
4113
CK_RV
4114
mock_C_EncryptMessageBegin (CK_SESSION_HANDLE session,
4115
                            CK_VOID_PTR parameter,
4116
                            CK_ULONG parameter_len,
4117
                            CK_BYTE_PTR associated_data,
4118
                            CK_ULONG associated_data_len)
4119
0
{
4120
0
  Session *sess;
4121
4122
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
4123
0
  if (!sess)
4124
0
    return CKR_SESSION_HANDLE_INVALID;
4125
4126
0
  if (sess->message_method != CKF_MESSAGE_ENCRYPT)
4127
0
    return CKR_OPERATION_NOT_INITIALIZED;
4128
4129
0
  if (parameter_len != 13 || memcmp (parameter, "encrypt-param", 13))
4130
0
    return CKR_ARGUMENTS_BAD;
4131
4132
  /* no AEAD */
4133
0
  if (associated_data != NULL || associated_data_len != 0)
4134
0
    return CKR_ARGUMENTS_BAD;
4135
4136
0
  sess->message_progress = true;
4137
0
  return CKR_OK;
4138
0
}
4139
4140
CK_RV
4141
mock_C_EncryptMessageBegin__invalid_handle (CK_SESSION_HANDLE session,
4142
                                            CK_VOID_PTR parameter,
4143
                                            CK_ULONG parameter_len,
4144
                                            CK_BYTE_PTR associated_data,
4145
                                            CK_ULONG associated_data_len)
4146
0
{
4147
0
  return CKR_SESSION_HANDLE_INVALID;
4148
0
}
4149
4150
CK_RV
4151
mock_X_EncryptMessageBegin__invalid_handle (CK_X_FUNCTION_LIST *self,
4152
                                            CK_SESSION_HANDLE session,
4153
                                            CK_VOID_PTR parameter,
4154
                                            CK_ULONG parameter_len,
4155
                                            CK_BYTE_PTR associated_data,
4156
                                            CK_ULONG associated_data_len)
4157
0
{
4158
0
  return CKR_SESSION_HANDLE_INVALID;
4159
0
}
4160
4161
CK_RV
4162
mock_C_EncryptMessageNext (CK_SESSION_HANDLE session,
4163
                           CK_VOID_PTR parameter,
4164
                           CK_ULONG parameter_len,
4165
                           CK_BYTE_PTR plaintext_part,
4166
                           CK_ULONG plaintext_part_len,
4167
                           CK_BYTE_PTR ciphertext_part,
4168
                           CK_ULONG_PTR ciphertext_part_len,
4169
                           CK_FLAGS flags)
4170
0
{
4171
0
  Session *sess;
4172
0
  CK_RV rv;
4173
4174
0
  if (parameter_len != 13 || memcmp (parameter, "encrypt-param", 13))
4175
0
    return CKR_ARGUMENTS_BAD;
4176
4177
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
4178
0
  if (!sess)
4179
0
    return CKR_SESSION_HANDLE_INVALID;
4180
4181
0
  if (sess->message_method != CKF_MESSAGE_ENCRYPT || !sess->message_progress)
4182
0
    return CKR_OPERATION_NOT_INITIALIZED;
4183
4184
0
  rv = mock_C_EncryptUpdate (session, plaintext_part, plaintext_part_len,
4185
0
                             ciphertext_part, ciphertext_part_len);
4186
0
  if (rv == CKR_OK && flags & CKF_END_OF_MESSAGE)
4187
0
    sess->message_progress = false;
4188
4189
0
  return rv;
4190
0
}
4191
4192
CK_RV
4193
mock_C_EncryptMessageNext__invalid_handle (CK_SESSION_HANDLE session,
4194
                                           CK_VOID_PTR parameter,
4195
                                           CK_ULONG parameter_len,
4196
                                           CK_BYTE_PTR plaintext_part,
4197
                                           CK_ULONG plaintext_part_len,
4198
                                           CK_BYTE_PTR ciphertext_part,
4199
                                           CK_ULONG_PTR ciphertext_part_len,
4200
                                           CK_FLAGS flags)
4201
0
{
4202
0
  return CKR_SESSION_HANDLE_INVALID;
4203
0
}
4204
4205
CK_RV
4206
mock_X_EncryptMessageNext__invalid_handle (CK_X_FUNCTION_LIST *self,
4207
                                           CK_SESSION_HANDLE session,
4208
                                           CK_VOID_PTR parameter,
4209
                                           CK_ULONG parameter_len,
4210
                                           CK_BYTE_PTR plaintext_part,
4211
                                           CK_ULONG plaintext_part_len,
4212
                                           CK_BYTE_PTR ciphertext_part,
4213
                                           CK_ULONG_PTR ciphertext_part_len,
4214
                                           CK_FLAGS flags)
4215
0
{
4216
0
  return CKR_SESSION_HANDLE_INVALID;
4217
0
}
4218
4219
CK_RV
4220
mock_C_MessageEncryptFinal (CK_SESSION_HANDLE session)
4221
0
{
4222
0
  Session *sess;
4223
0
  unsigned long len = 0;
4224
0
  int rv;
4225
4226
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
4227
0
  if (!sess)
4228
0
    return CKR_SESSION_HANDLE_INVALID;
4229
4230
0
  if (sess->message_method != CKF_MESSAGE_ENCRYPT)
4231
0
    return CKR_OPERATION_NOT_INITIALIZED;
4232
4233
0
  sess->message_method = 0;
4234
0
  sess->message_progress = false;
4235
4236
0
  rv = mock_C_EncryptFinal (session, NULL, &len);
4237
0
  assert (len == 0);
4238
0
  return rv;
4239
0
}
4240
4241
CK_RV
4242
mock_C_MessageEncryptFinal__invalid_handle (CK_SESSION_HANDLE session)
4243
0
{
4244
0
  return CKR_SESSION_HANDLE_INVALID;
4245
0
}
4246
4247
CK_RV
4248
mock_X_MessageEncryptFinal__invalid_handle (CK_X_FUNCTION_LIST *self,
4249
                                            CK_SESSION_HANDLE session)
4250
0
{
4251
0
  return CKR_SESSION_HANDLE_INVALID;
4252
0
}
4253
4254
CK_RV
4255
mock_C_MessageDecryptInit (CK_SESSION_HANDLE session,
4256
                           CK_MECHANISM_PTR mechanism,
4257
                           CK_OBJECT_HANDLE key)
4258
0
{
4259
0
  CK_RV rv;
4260
0
  Session *sess;
4261
4262
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
4263
0
  if (!sess)
4264
0
    return CKR_SESSION_HANDLE_INVALID;
4265
0
  if (mechanism == NULL && sess->message_method == CKF_MESSAGE_DECRYPT) {
4266
0
    sess->message_method = 0;
4267
0
    return CKR_OK;
4268
0
  }
4269
0
  if (sess->message_method != 0)
4270
0
    return CKR_OPERATION_ACTIVE;
4271
4272
0
  rv = mock_C_DecryptInit (session, mechanism, key);
4273
0
  if (rv != CKR_OK)
4274
0
    return rv;
4275
4276
0
  sess->message_method = CKF_MESSAGE_DECRYPT;
4277
4278
0
  return CKR_OK;
4279
0
}
4280
4281
CK_RV
4282
mock_C_MessageDecryptInit__invalid_handle (CK_SESSION_HANDLE session,
4283
                                           CK_MECHANISM_PTR mechanism,
4284
                                           CK_OBJECT_HANDLE key)
4285
0
{
4286
0
  return CKR_SESSION_HANDLE_INVALID;
4287
0
}
4288
4289
CK_RV
4290
mock_X_MessageDecryptInit__invalid_handle (CK_X_FUNCTION_LIST *self,
4291
                                           CK_SESSION_HANDLE session,
4292
                                           CK_MECHANISM_PTR mechanism,
4293
                                           CK_OBJECT_HANDLE key)
4294
0
{
4295
0
  return CKR_SESSION_HANDLE_INVALID;
4296
0
}
4297
4298
CK_RV
4299
mock_C_DecryptMessage (CK_SESSION_HANDLE session,
4300
                       CK_VOID_PTR parameter,
4301
                       CK_ULONG parameter_len,
4302
                       CK_BYTE_PTR associated_data,
4303
                       CK_ULONG associated_data_len,
4304
                       CK_BYTE_PTR ciphertext,
4305
                       CK_ULONG ciphertext_len,
4306
                       CK_BYTE_PTR plaintext,
4307
                       CK_ULONG_PTR plaintext_len)
4308
0
{
4309
0
  CK_RV rv;
4310
4311
0
  rv = mock_C_DecryptMessageBegin (session, parameter, parameter_len,
4312
0
                                   associated_data, associated_data_len);
4313
0
  if (rv != CKR_OK)
4314
0
    return rv;
4315
4316
0
  return mock_C_DecryptMessageNext (session, parameter, parameter_len, ciphertext, ciphertext_len,
4317
0
                                    plaintext, plaintext_len, CKF_END_OF_MESSAGE);
4318
0
}
4319
4320
CK_RV
4321
mock_C_DecryptMessage__invalid_handle (CK_SESSION_HANDLE session,
4322
                                       CK_VOID_PTR parameter,
4323
                                       CK_ULONG parameter_len,
4324
                                       CK_BYTE_PTR associated_data,
4325
                                       CK_ULONG associated_data_len,
4326
                                       CK_BYTE_PTR ciphertext,
4327
                                       CK_ULONG ciphertext_len,
4328
                                       CK_BYTE_PTR plaintext,
4329
                                       CK_ULONG_PTR plaintext_len)
4330
0
{
4331
0
  return CKR_SESSION_HANDLE_INVALID;
4332
0
}
4333
4334
CK_RV
4335
mock_X_DecryptMessage__invalid_handle (CK_X_FUNCTION_LIST *self,
4336
                                       CK_SESSION_HANDLE session,
4337
                                       CK_VOID_PTR parameter,
4338
                                       CK_ULONG parameter_len,
4339
                                       CK_BYTE_PTR associated_data,
4340
                                       CK_ULONG associated_data_len,
4341
                                       CK_BYTE_PTR ciphertext,
4342
                                       CK_ULONG ciphertext_len,
4343
                                       CK_BYTE_PTR plaintext,
4344
                                       CK_ULONG_PTR plaintext_len)
4345
0
{
4346
0
  return CKR_SESSION_HANDLE_INVALID;
4347
0
}
4348
4349
CK_RV
4350
mock_C_DecryptMessageBegin (CK_SESSION_HANDLE session,
4351
                            CK_VOID_PTR parameter,
4352
                            CK_ULONG parameter_len,
4353
                            CK_BYTE_PTR associated_data,
4354
                            CK_ULONG associated_data_len)
4355
0
{
4356
0
  Session *sess;
4357
4358
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
4359
0
  if (!sess)
4360
0
    return CKR_SESSION_HANDLE_INVALID;
4361
4362
0
  if (sess->message_method != CKF_MESSAGE_DECRYPT)
4363
0
    return CKR_OPERATION_NOT_INITIALIZED;
4364
4365
0
  if (parameter_len != 13 || memcmp (parameter, "decrypt-param", 13))
4366
0
    return CKR_ARGUMENTS_BAD;
4367
4368
  /* no AEAD */
4369
0
  if (associated_data != NULL || associated_data_len != 0)
4370
0
    return CKR_ARGUMENTS_BAD;
4371
4372
0
  sess->message_progress = true;
4373
4374
0
  return CKR_OK;
4375
0
}
4376
4377
CK_RV
4378
mock_C_DecryptMessageBegin__invalid_handle (CK_SESSION_HANDLE session,
4379
                                            CK_VOID_PTR parameter,
4380
                                            CK_ULONG parameter_len,
4381
                                            CK_BYTE_PTR associated_data,
4382
                                            CK_ULONG associated_data_len)
4383
0
{
4384
0
  return CKR_SESSION_HANDLE_INVALID;
4385
0
}
4386
4387
CK_RV
4388
mock_X_DecryptMessageBegin__invalid_handle (CK_X_FUNCTION_LIST *self,
4389
                                            CK_SESSION_HANDLE session,
4390
                                            CK_VOID_PTR parameter,
4391
                                            CK_ULONG parameter_len,
4392
                                            CK_BYTE_PTR associated_data,
4393
                                            CK_ULONG associated_data_len)
4394
0
{
4395
0
  return CKR_SESSION_HANDLE_INVALID;
4396
0
}
4397
4398
CK_RV
4399
mock_C_DecryptMessageNext (CK_SESSION_HANDLE session,
4400
                           CK_VOID_PTR parameter,
4401
                           CK_ULONG parameter_len,
4402
                           CK_BYTE_PTR ciphertext_part,
4403
                           CK_ULONG ciphertext_part_len,
4404
                           CK_BYTE_PTR plaintext_part,
4405
                           CK_ULONG_PTR plaintext_part_len,
4406
                           CK_FLAGS flags)
4407
0
{
4408
0
  Session *sess;
4409
0
  CK_RV rv;
4410
4411
0
  if (parameter_len != 13 || memcmp (parameter, "decrypt-param", 13))
4412
0
    return CKR_ARGUMENTS_BAD;
4413
4414
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
4415
0
  if (!sess)
4416
0
    return CKR_SESSION_HANDLE_INVALID;
4417
4418
0
  if (sess->message_method != CKF_MESSAGE_DECRYPT || !sess->message_progress)
4419
0
    return CKR_OPERATION_NOT_INITIALIZED;
4420
4421
0
  rv = mock_C_DecryptUpdate (session, ciphertext_part, ciphertext_part_len,
4422
0
                             plaintext_part, plaintext_part_len);
4423
0
  if (rv == CKR_OK && flags & CKF_END_OF_MESSAGE)
4424
0
    sess->message_progress = false;
4425
4426
0
  return rv;
4427
0
}
4428
4429
CK_RV
4430
mock_C_DecryptMessageNext__invalid_handle (CK_SESSION_HANDLE session,
4431
                                           CK_VOID_PTR parameter,
4432
                                           CK_ULONG parameter_len,
4433
                                           CK_BYTE_PTR ciphertext_part,
4434
                                           CK_ULONG ciphertext_part_len,
4435
                                           CK_BYTE_PTR plaintext_part,
4436
                                           CK_ULONG_PTR plaintext_part_len,
4437
                                           CK_FLAGS flags)
4438
0
{
4439
0
  return CKR_SESSION_HANDLE_INVALID;
4440
0
}
4441
4442
CK_RV
4443
mock_X_DecryptMessageNext__invalid_handle (CK_X_FUNCTION_LIST *self,
4444
                                           CK_SESSION_HANDLE session,
4445
                                           CK_VOID_PTR parameter,
4446
                                           CK_ULONG parameter_len,
4447
                                           CK_BYTE_PTR ciphertext_part,
4448
                                           CK_ULONG ciphertext_part_len,
4449
                                           CK_BYTE_PTR plaintext_part,
4450
                                           CK_ULONG_PTR plaintext_part_len,
4451
                                           CK_FLAGS flags)
4452
0
{
4453
0
  return CKR_SESSION_HANDLE_INVALID;
4454
0
}
4455
4456
CK_RV
4457
mock_C_MessageDecryptFinal (CK_SESSION_HANDLE session)
4458
0
{
4459
0
  Session *sess;
4460
0
  unsigned long len = 0;
4461
0
  int rv;
4462
4463
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
4464
0
  if (!sess)
4465
0
    return CKR_SESSION_HANDLE_INVALID;
4466
4467
0
  if (sess->message_method != CKF_MESSAGE_DECRYPT)
4468
0
    return CKR_OPERATION_NOT_INITIALIZED;
4469
4470
0
  sess->message_method = 0;
4471
0
  sess->message_progress = false;
4472
4473
0
  rv = mock_C_DecryptFinal (session, NULL, &len);
4474
0
  assert (len == 0);
4475
0
  return rv;
4476
0
}
4477
4478
CK_RV
4479
mock_C_MessageDecryptFinal__invalid_handle (CK_SESSION_HANDLE session)
4480
0
{
4481
0
  return CKR_SESSION_HANDLE_INVALID;
4482
0
}
4483
4484
CK_RV
4485
mock_X_MessageDecryptFinal__invalid_handle (CK_X_FUNCTION_LIST *self,
4486
                                            CK_SESSION_HANDLE session)
4487
0
{
4488
0
  return CKR_SESSION_HANDLE_INVALID;
4489
0
}
4490
4491
CK_RV
4492
mock_C_MessageSignInit (CK_SESSION_HANDLE session,
4493
                        CK_MECHANISM_PTR mechanism,
4494
                        CK_OBJECT_HANDLE key)
4495
0
{
4496
0
  Session *sess;
4497
0
  CK_RV rv;
4498
4499
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
4500
0
  if (!sess)
4501
0
    return CKR_SESSION_HANDLE_INVALID;
4502
0
  if (mechanism == NULL && sess->message_method == CKF_MESSAGE_SIGN) {
4503
0
    sess->message_method = 0;
4504
0
    return CKR_OK;
4505
0
  }
4506
0
  if (sess->message_method != 0)
4507
0
    return CKR_OPERATION_ACTIVE;
4508
4509
0
  rv = mock_C_SignInit (session, mechanism, key);
4510
0
  if (rv != CKR_OK)
4511
0
    return rv;
4512
4513
0
  sess->message_method = CKF_MESSAGE_SIGN;
4514
0
  free (sess->message_mechanism.pParameter);
4515
0
  sess->message_mechanism = *mechanism;
4516
0
  if (mechanism->pParameter != NULL) {
4517
0
    sess->message_mechanism.pParameter = memdup (mechanism->pParameter, mechanism->ulParameterLen);
4518
0
    sess->message_mechanism.ulParameterLen = mechanism->ulParameterLen;
4519
0
  }
4520
0
  sess->message_key = key;
4521
4522
0
  return CKR_OK;
4523
0
}
4524
4525
CK_RV
4526
mock_C_MessageSignInit__invalid_handle (CK_SESSION_HANDLE session,
4527
                                        CK_MECHANISM_PTR mechanism,
4528
                                        CK_OBJECT_HANDLE key)
4529
0
{
4530
0
  return CKR_SESSION_HANDLE_INVALID;
4531
0
}
4532
4533
CK_RV
4534
mock_X_MessageSignInit__invalid_handle (CK_X_FUNCTION_LIST *self,
4535
                                        CK_SESSION_HANDLE session,
4536
                                        CK_MECHANISM_PTR mechanism,
4537
                                        CK_OBJECT_HANDLE key)
4538
0
{
4539
0
  return CKR_SESSION_HANDLE_INVALID;
4540
0
}
4541
4542
CK_RV
4543
mock_C_SignMessage (CK_SESSION_HANDLE session,
4544
                    CK_VOID_PTR parameter,
4545
                    CK_ULONG parameter_len,
4546
                    CK_BYTE_PTR data,
4547
                    CK_ULONG data_len,
4548
                    CK_BYTE_PTR signature,
4549
                    CK_ULONG_PTR signature_len)
4550
0
{
4551
0
  CK_RV rv;
4552
4553
0
  rv = mock_C_SignMessageBegin (session, parameter, parameter_len);
4554
0
  if (rv == CKR_OK) {
4555
0
    rv = mock_C_SignMessageNext (session, parameter, parameter_len, data, data_len,
4556
0
                                 signature, signature_len);
4557
0
  }
4558
4559
0
  return rv;
4560
0
}
4561
4562
CK_RV
4563
mock_C_SignMessage__invalid_handle (CK_SESSION_HANDLE session,
4564
                                    CK_VOID_PTR parameter,
4565
                                    CK_ULONG parameter_len,
4566
                                    CK_BYTE_PTR data,
4567
                                    CK_ULONG data_len,
4568
                                    CK_BYTE_PTR signature,
4569
                                    CK_ULONG_PTR signature_len)
4570
0
{
4571
0
  return CKR_SESSION_HANDLE_INVALID;
4572
0
}
4573
4574
CK_RV
4575
mock_X_SignMessage__invalid_handle (CK_X_FUNCTION_LIST *self,
4576
                                    CK_SESSION_HANDLE session,
4577
                                    CK_VOID_PTR parameter,
4578
                                    CK_ULONG parameter_len,
4579
                                    CK_BYTE_PTR data,
4580
                                    CK_ULONG data_len,
4581
                                    CK_BYTE_PTR signature,
4582
                                    CK_ULONG_PTR signature_len)
4583
0
{
4584
0
  return CKR_SESSION_HANDLE_INVALID;
4585
0
}
4586
4587
CK_RV
4588
mock_C_SignMessageBegin (CK_SESSION_HANDLE session,
4589
                         CK_VOID_PTR parameter,
4590
                         CK_ULONG parameter_len)
4591
0
{
4592
0
  Session *sess;
4593
0
  CK_RV rv;
4594
4595
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
4596
0
  if (!sess)
4597
0
    return CKR_SESSION_HANDLE_INVALID;
4598
4599
0
  if (sess->message_method != CKF_MESSAGE_SIGN)
4600
0
    return CKR_OPERATION_NOT_INITIALIZED;
4601
4602
0
  if (parameter_len != 10 || memcmp (parameter, "sign-param", 10))
4603
0
    return CKR_ARGUMENTS_BAD;
4604
4605
0
  if (sess->hash_method != CKF_SIGN) {
4606
    /* The Final already terminates this mechanism */
4607
0
    rv = prefix_mechanism_init (session, CKF_SIGN, &sess->message_mechanism, sess->message_key);
4608
0
    if (rv != CKR_OK)
4609
0
      return rv;
4610
0
  }
4611
4612
0
  sess->message_progress = true;
4613
4614
0
  return CKR_OK;
4615
0
}
4616
4617
CK_RV
4618
mock_C_SignMessageBegin__invalid_handle (CK_SESSION_HANDLE session,
4619
                                         CK_VOID_PTR parameter,
4620
                                         CK_ULONG parameter_len)
4621
0
{
4622
0
  return CKR_SESSION_HANDLE_INVALID;
4623
0
}
4624
4625
CK_RV
4626
mock_X_SignMessageBegin__invalid_handle (CK_X_FUNCTION_LIST *self,
4627
                                         CK_SESSION_HANDLE session,
4628
                                         CK_VOID_PTR parameter,
4629
                                         CK_ULONG parameter_len)
4630
0
{
4631
0
  return CKR_SESSION_HANDLE_INVALID;
4632
0
}
4633
4634
CK_RV
4635
mock_C_SignMessageNext (CK_SESSION_HANDLE session,
4636
                        CK_VOID_PTR parameter,
4637
                        CK_ULONG parameter_len,
4638
                        CK_BYTE_PTR data,
4639
                        CK_ULONG data_len,
4640
                        CK_BYTE_PTR signature,
4641
                        CK_ULONG_PTR signature_len)
4642
0
{
4643
0
  Session *sess;
4644
0
  CK_RV rv;
4645
4646
0
  if (parameter_len != 10 || memcmp (parameter, "sign-param", 10))
4647
0
    return CKR_ARGUMENTS_BAD;
4648
4649
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
4650
0
  if (!sess)
4651
0
    return CKR_SESSION_HANDLE_INVALID;
4652
4653
0
  if (sess->message_method != CKF_MESSAGE_SIGN || !sess->message_progress)
4654
0
    return CKR_OPERATION_NOT_INITIALIZED;
4655
4656
0
  rv = mock_C_SignUpdate (session, data, data_len);
4657
0
  if (rv != CKR_OK) {
4658
0
    return rv;
4659
0
  }
4660
4661
0
  if (signature_len != NULL) {
4662
0
    rv = mock_C_SignFinal (session, signature, signature_len);
4663
0
    if (rv != CKR_BUFFER_TOO_SMALL && rv != CKR_OK)
4664
0
      sess->message_progress = false;
4665
0
  }
4666
4667
0
  return rv;
4668
0
}
4669
4670
CK_RV
4671
mock_C_SignMessageNext__invalid_handle (CK_SESSION_HANDLE session,
4672
                                        CK_VOID_PTR parameter,
4673
                                        CK_ULONG parameter_len,
4674
                                        CK_BYTE_PTR data,
4675
                                        CK_ULONG data_len,
4676
                                        CK_BYTE_PTR signature,
4677
                                        CK_ULONG_PTR signature_len)
4678
0
{
4679
0
  return CKR_SESSION_HANDLE_INVALID;
4680
0
}
4681
4682
CK_RV
4683
mock_X_SignMessageNext__invalid_handle (CK_X_FUNCTION_LIST *self,
4684
                                        CK_SESSION_HANDLE session,
4685
                                        CK_VOID_PTR parameter,
4686
                                        CK_ULONG parameter_len,
4687
                                        CK_BYTE_PTR data,
4688
                                        CK_ULONG data_len,
4689
                                        CK_BYTE_PTR signature,
4690
                                        CK_ULONG_PTR signature_len)
4691
0
{
4692
0
  return CKR_SESSION_HANDLE_INVALID;
4693
0
}
4694
4695
CK_RV
4696
mock_C_MessageSignFinal (CK_SESSION_HANDLE session)
4697
0
{
4698
0
  Session *sess;
4699
4700
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
4701
0
  if (!sess)
4702
0
    return CKR_SESSION_HANDLE_INVALID;
4703
4704
0
  if (sess->message_method != CKF_MESSAGE_SIGN)
4705
0
    return CKR_OPERATION_NOT_INITIALIZED;
4706
4707
0
  sess->message_method = 0;
4708
0
  sess->message_progress = false;
4709
0
  return CKR_OK;
4710
0
}
4711
4712
CK_RV
4713
mock_C_MessageSignFinal__invalid_handle (CK_SESSION_HANDLE session)
4714
0
{
4715
0
  return CKR_SESSION_HANDLE_INVALID;
4716
0
}
4717
4718
CK_RV
4719
mock_X_MessageSignFinal__invalid_handle (CK_X_FUNCTION_LIST *self,
4720
                                         CK_SESSION_HANDLE session)
4721
0
{
4722
0
  return CKR_SESSION_HANDLE_INVALID;
4723
0
}
4724
4725
CK_RV
4726
mock_C_MessageVerifyInit (CK_SESSION_HANDLE session,
4727
                          CK_MECHANISM_PTR mechanism,
4728
                          CK_OBJECT_HANDLE key)
4729
0
{
4730
0
  Session *sess;
4731
0
  CK_RV rv;
4732
4733
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
4734
0
  if (!sess)
4735
0
    return CKR_SESSION_HANDLE_INVALID;
4736
0
  if (mechanism == NULL && sess->message_method == CKF_MESSAGE_VERIFY) {
4737
0
    sess->message_method = 0;
4738
0
    return CKR_OK;
4739
0
  }
4740
0
  if (sess->message_method != 0)
4741
0
    return CKR_OPERATION_ACTIVE;
4742
4743
0
  rv = mock_C_VerifyInit (session, mechanism, key);
4744
0
  if (rv != CKR_OK)
4745
0
    return rv;
4746
4747
0
  sess->message_method = CKF_MESSAGE_VERIFY;
4748
0
  free (sess->message_mechanism.pParameter);
4749
0
  sess->message_mechanism = *mechanism;
4750
0
  if (mechanism->pParameter != NULL) {
4751
0
    sess->message_mechanism.pParameter = memdup (mechanism->pParameter, mechanism->ulParameterLen);
4752
0
    assert (sess->message_mechanism.pParameter != NULL);
4753
0
    sess->message_mechanism.ulParameterLen = mechanism->ulParameterLen;
4754
0
  }
4755
0
  sess->message_key = key;
4756
4757
0
  return CKR_OK;
4758
0
}
4759
4760
CK_RV
4761
mock_C_MessageVerifyInit__invalid_handle (CK_SESSION_HANDLE session,
4762
                                          CK_MECHANISM_PTR mechanism,
4763
                                          CK_OBJECT_HANDLE key)
4764
0
{
4765
0
  return CKR_SESSION_HANDLE_INVALID;
4766
0
}
4767
4768
CK_RV
4769
mock_X_MessageVerifyInit__invalid_handle (CK_X_FUNCTION_LIST *self,
4770
                                          CK_SESSION_HANDLE session,
4771
                                          CK_MECHANISM_PTR mechanism,
4772
                                          CK_OBJECT_HANDLE key)
4773
0
{
4774
0
  return CKR_SESSION_HANDLE_INVALID;
4775
0
}
4776
4777
CK_RV
4778
mock_C_VerifyMessage (CK_SESSION_HANDLE session,
4779
                      CK_VOID_PTR parameter,
4780
                      CK_ULONG parameter_len,
4781
                      CK_BYTE_PTR data,
4782
                      CK_ULONG data_len,
4783
                      CK_BYTE_PTR signature,
4784
                      CK_ULONG signature_len)
4785
0
{
4786
0
  CK_RV rv;
4787
4788
0
  rv = mock_C_VerifyMessageBegin (session, parameter, parameter_len);
4789
0
  if (rv == CKR_OK) {
4790
0
    rv = mock_C_VerifyMessageNext (session, parameter, parameter_len, data, data_len,
4791
0
                                   signature, signature_len);
4792
0
  }
4793
4794
0
  return rv;
4795
0
}
4796
4797
CK_RV
4798
mock_C_VerifyMessage__invalid_handle (CK_SESSION_HANDLE session,
4799
                                      CK_VOID_PTR parameter,
4800
                                      CK_ULONG parameter_len,
4801
                                      CK_BYTE_PTR data,
4802
                                      CK_ULONG data_len,
4803
                                      CK_BYTE_PTR signature,
4804
                                      CK_ULONG signature_len)
4805
0
{
4806
0
  return CKR_SESSION_HANDLE_INVALID;
4807
0
}
4808
4809
CK_RV
4810
mock_X_VerifyMessage__invalid_handle (CK_X_FUNCTION_LIST *self,
4811
                                      CK_SESSION_HANDLE session,
4812
                                      CK_VOID_PTR parameter,
4813
                                      CK_ULONG parameter_len,
4814
                                      CK_BYTE_PTR data,
4815
                                      CK_ULONG data_len,
4816
                                      CK_BYTE_PTR signature,
4817
                                      CK_ULONG signature_len)
4818
0
{
4819
0
  return CKR_SESSION_HANDLE_INVALID;
4820
0
}
4821
4822
CK_RV
4823
mock_C_VerifyMessageBegin (CK_SESSION_HANDLE session,
4824
         CK_VOID_PTR parameter,
4825
         CK_ULONG parameter_len)
4826
0
{
4827
0
  Session *sess;
4828
0
  CK_RV rv;
4829
4830
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
4831
0
  if (!sess)
4832
0
    return CKR_SESSION_HANDLE_INVALID;
4833
4834
0
  if (sess->message_method != CKF_MESSAGE_VERIFY)
4835
0
    return CKR_OPERATION_NOT_INITIALIZED;
4836
4837
0
  if (parameter_len != 12 || memcmp (parameter, "verify-param", 12))
4838
0
    return CKR_ARGUMENTS_BAD;
4839
4840
0
  if (sess->hash_method != CKF_VERIFY) {
4841
    /* The Final already terminates this mechanism */
4842
0
    rv = prefix_mechanism_init (session, CKF_VERIFY, &sess->message_mechanism, sess->message_key);
4843
0
    if (rv != CKR_OK)
4844
0
      return rv;
4845
0
  }
4846
4847
0
  sess->message_progress = true;
4848
4849
0
  return CKR_OK;
4850
0
}
4851
4852
CK_RV
4853
mock_C_VerifyMessageBegin__invalid_handle (CK_SESSION_HANDLE session,
4854
                                           CK_VOID_PTR parameter,
4855
                                           CK_ULONG parameter_len)
4856
0
{
4857
0
  return CKR_SESSION_HANDLE_INVALID;
4858
0
}
4859
4860
CK_RV
4861
mock_X_VerifyMessageBegin__invalid_handle (CK_X_FUNCTION_LIST *self,
4862
                                           CK_SESSION_HANDLE session,
4863
                                           CK_VOID_PTR parameter,
4864
                                           CK_ULONG parameter_len)
4865
0
{
4866
0
  return CKR_SESSION_HANDLE_INVALID;
4867
0
}
4868
4869
CK_RV
4870
mock_C_VerifyMessageNext (CK_SESSION_HANDLE session,
4871
                          CK_VOID_PTR parameter,
4872
                          CK_ULONG parameter_len,
4873
                          CK_BYTE_PTR data,
4874
                          CK_ULONG data_len,
4875
                          CK_BYTE_PTR signature,
4876
                          CK_ULONG signature_len)
4877
0
{
4878
0
  Session *sess;
4879
0
  CK_RV rv;
4880
4881
0
  if (parameter_len != 12 || memcmp (parameter, "verify-param", 12))
4882
0
    return CKR_ARGUMENTS_BAD;
4883
4884
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
4885
0
  if (!sess)
4886
0
    return CKR_SESSION_HANDLE_INVALID;
4887
4888
0
  if (sess->message_method != CKF_MESSAGE_VERIFY || !sess->message_progress)
4889
0
    return CKR_OPERATION_NOT_INITIALIZED;
4890
4891
0
  rv = mock_C_VerifyUpdate (session, data, data_len);
4892
0
  if (rv != CKR_OK) {
4893
0
    return rv;
4894
0
  }
4895
4896
0
  if (signature != NULL) {
4897
0
    rv = mock_C_VerifyFinal (session, signature, signature_len);
4898
0
    if (rv != CKR_BUFFER_TOO_SMALL)
4899
0
      sess->message_progress = false;
4900
0
  }
4901
4902
0
  return rv;
4903
0
}
4904
4905
CK_RV
4906
mock_C_VerifyMessageNext__invalid_handle (CK_SESSION_HANDLE session,
4907
                                          CK_VOID_PTR parameter,
4908
                                          CK_ULONG parameter_len,
4909
                                          CK_BYTE_PTR data,
4910
                                          CK_ULONG data_len,
4911
                                          CK_BYTE_PTR signature,
4912
                                          CK_ULONG signature_len)
4913
0
{
4914
0
  return CKR_SESSION_HANDLE_INVALID;
4915
0
}
4916
4917
CK_RV
4918
mock_X_VerifyMessageNext__invalid_handle (CK_X_FUNCTION_LIST *self,
4919
                                          CK_SESSION_HANDLE session,
4920
                                          CK_VOID_PTR parameter,
4921
                                          CK_ULONG parameter_len,
4922
                                          CK_BYTE_PTR data,
4923
                                          CK_ULONG data_len,
4924
                                          CK_BYTE_PTR signature,
4925
                                          CK_ULONG signature_len)
4926
0
{
4927
0
  return CKR_SESSION_HANDLE_INVALID;
4928
0
}
4929
4930
CK_RV
4931
mock_C_MessageVerifyFinal (CK_SESSION_HANDLE session)
4932
0
{
4933
0
  Session *sess;
4934
4935
0
  sess = p11_dict_get (the_sessions, handle_to_pointer (session));
4936
0
  if (!sess)
4937
0
    return CKR_SESSION_HANDLE_INVALID;
4938
4939
0
  if (sess->message_method != CKF_MESSAGE_VERIFY)
4940
0
    return CKR_OPERATION_NOT_INITIALIZED;
4941
4942
0
  sess->message_method = 0;
4943
0
  sess->message_progress = false;
4944
0
  return CKR_OK;
4945
0
}
4946
4947
CK_RV
4948
mock_C_MessageVerifyFinal__invalid_handle (CK_SESSION_HANDLE session)
4949
0
{
4950
0
  return CKR_SESSION_HANDLE_INVALID;
4951
0
}
4952
4953
CK_RV
4954
mock_X_MessageVerifyFinal__invalid_handle (CK_X_FUNCTION_LIST *self,
4955
                                           CK_SESSION_HANDLE session)
4956
0
{
4957
0
  return CKR_SESSION_HANDLE_INVALID;
4958
0
}
4959
4960
#define MOCK_MODULE_NO_SLOTS_FUNCTIONS \
4961
  mock_C_Initialize, \
4962
  mock_C_Finalize, \
4963
  mock_C_GetInfo, \
4964
  mock_C_GetFunctionList_not_supported, \
4965
  mock_C_GetSlotList__no_tokens, \
4966
  mock_C_GetSlotInfo__invalid_slotid, \
4967
  mock_C_GetTokenInfo__invalid_slotid, \
4968
  mock_C_GetMechanismList__invalid_slotid, \
4969
  mock_C_GetMechanismInfo__invalid_slotid, \
4970
  mock_C_InitToken__invalid_slotid, \
4971
  mock_C_InitPIN__invalid_handle, \
4972
  mock_C_SetPIN__invalid_handle, \
4973
  mock_C_OpenSession__invalid_slotid, \
4974
  mock_C_CloseSession__invalid_handle, \
4975
  mock_C_CloseAllSessions__invalid_slotid, \
4976
  mock_C_GetSessionInfo__invalid_handle, \
4977
  mock_C_GetOperationState__invalid_handle, \
4978
  mock_C_SetOperationState__invalid_handle, \
4979
  mock_C_Login__invalid_handle, \
4980
  mock_C_Logout__invalid_handle, \
4981
  mock_C_CreateObject__invalid_handle, \
4982
  mock_C_CopyObject__invalid_handle, \
4983
  mock_C_DestroyObject__invalid_handle, \
4984
  mock_C_GetObjectSize__invalid_handle, \
4985
  mock_C_GetAttributeValue__invalid_handle, \
4986
  mock_C_SetAttributeValue__invalid_handle, \
4987
  mock_C_FindObjectsInit__invalid_handle, \
4988
  mock_C_FindObjects__invalid_handle, \
4989
  mock_C_FindObjectsFinal__invalid_handle, \
4990
  mock_C_EncryptInit__invalid_handle, \
4991
  mock_C_Encrypt__invalid_handle, \
4992
  mock_C_EncryptUpdate__invalid_handle, \
4993
  mock_C_EncryptFinal__invalid_handle, \
4994
  mock_C_DecryptInit__invalid_handle, \
4995
  mock_C_Decrypt__invalid_handle, \
4996
  mock_C_DecryptUpdate__invalid_handle, \
4997
  mock_C_DecryptFinal__invalid_handle, \
4998
  mock_C_DigestInit__invalid_handle, \
4999
  mock_C_Digest__invalid_handle, \
5000
  mock_C_DigestUpdate__invalid_handle, \
5001
  mock_C_DigestKey__invalid_handle, \
5002
  mock_C_DigestFinal__invalid_handle, \
5003
  mock_C_SignInit__invalid_handle, \
5004
  mock_C_Sign__invalid_handle, \
5005
  mock_C_SignUpdate__invalid_handle, \
5006
  mock_C_SignFinal__invalid_handle, \
5007
  mock_C_SignRecoverInit__invalid_handle, \
5008
  mock_C_SignRecover__invalid_handle, \
5009
  mock_C_VerifyInit__invalid_handle, \
5010
  mock_C_Verify__invalid_handle, \
5011
  mock_C_VerifyUpdate__invalid_handle, \
5012
  mock_C_VerifyFinal__invalid_handle, \
5013
  mock_C_VerifyRecoverInit__invalid_handle, \
5014
  mock_C_VerifyRecover__invalid_handle, \
5015
  mock_C_DigestEncryptUpdate__invalid_handle, \
5016
  mock_C_DecryptDigestUpdate__invalid_handle, \
5017
  mock_C_SignEncryptUpdate__invalid_handle, \
5018
  mock_C_DecryptVerifyUpdate__invalid_handle, \
5019
  mock_C_GenerateKey__invalid_handle, \
5020
  mock_C_GenerateKeyPair__invalid_handle, \
5021
  mock_C_WrapKey__invalid_handle, \
5022
  mock_C_UnwrapKey__invalid_handle, \
5023
  mock_C_DeriveKey__invalid_handle, \
5024
  mock_C_SeedRandom__invalid_handle, \
5025
  mock_C_GenerateRandom__invalid_handle, \
5026
  mock_C_GetFunctionStatus__not_parallel, \
5027
  mock_C_CancelFunction__not_parallel, \
5028
  mock_C_WaitForSlotEvent__no_event, \
5029
5030
CK_FUNCTION_LIST mock_module_no_slots = {
5031
  { CRYPTOKI_LEGACY_VERSION_MAJOR, CRYPTOKI_LEGACY_VERSION_MINOR },  /* version */
5032
  MOCK_MODULE_NO_SLOTS_FUNCTIONS
5033
};
5034
5035
CK_FUNCTION_LIST_3_0 mock_module_v3_no_slots = {
5036
  { CRYPTOKI_VERSION_MAJOR, CRYPTOKI_VERSION_MINOR },  /* version */
5037
  MOCK_MODULE_NO_SLOTS_FUNCTIONS
5038
  /* PKCS #11 3.0 */
5039
  mock_C_GetInterfaceList_not_supported,
5040
  mock_C_GetInterface_not_supported,
5041
  mock_C_LoginUser__invalid_handle,
5042
  mock_C_SessionCancel__invalid_handle,
5043
  mock_C_MessageEncryptInit__invalid_handle,
5044
  mock_C_EncryptMessage__invalid_handle,
5045
  mock_C_EncryptMessageBegin__invalid_handle,
5046
  mock_C_EncryptMessageNext__invalid_handle,
5047
  mock_C_MessageEncryptFinal__invalid_handle,
5048
  mock_C_MessageDecryptInit__invalid_handle,
5049
  mock_C_DecryptMessage__invalid_handle,
5050
  mock_C_DecryptMessageBegin__invalid_handle,
5051
  mock_C_DecryptMessageNext__invalid_handle,
5052
  mock_C_MessageDecryptFinal__invalid_handle,
5053
  mock_C_MessageSignInit__invalid_handle,
5054
  mock_C_SignMessage__invalid_handle,
5055
  mock_C_SignMessageBegin__invalid_handle,
5056
  mock_C_SignMessageNext__invalid_handle,
5057
  mock_C_MessageSignFinal__invalid_handle,
5058
  mock_C_MessageVerifyInit__invalid_handle,
5059
  mock_C_VerifyMessage__invalid_handle,
5060
  mock_C_VerifyMessageBegin__invalid_handle,
5061
  mock_C_VerifyMessageNext__invalid_handle,
5062
  mock_C_MessageVerifyFinal__invalid_handle
5063
};
5064
5065
CK_X_FUNCTION_LIST mock_x_module_no_slots = {
5066
  { CRYPTOKI_VERSION_MAJOR, CRYPTOKI_VERSION_MINOR },  /* version */
5067
  mock_X_Initialize,
5068
  mock_X_Finalize,
5069
  mock_X_GetInfo,
5070
  mock_X_GetSlotList__no_tokens,
5071
  mock_X_GetSlotInfo__invalid_slotid,
5072
  mock_X_GetTokenInfo__invalid_slotid,
5073
  mock_X_GetMechanismList__invalid_slotid,
5074
  mock_X_GetMechanismInfo__invalid_slotid,
5075
  mock_X_InitToken__invalid_slotid,
5076
  mock_X_InitPIN__invalid_handle,
5077
  mock_X_SetPIN__invalid_handle,
5078
  mock_X_OpenSession__invalid_slotid,
5079
  mock_X_CloseSession__invalid_handle,
5080
  mock_X_CloseAllSessions__invalid_slotid,
5081
  mock_X_GetSessionInfo__invalid_handle,
5082
  mock_X_GetOperationState__invalid_handle,
5083
  mock_X_SetOperationState__invalid_handle,
5084
  mock_X_Login__invalid_handle,
5085
  mock_X_Logout__invalid_handle,
5086
  mock_X_CreateObject__invalid_handle,
5087
  mock_X_CopyObject__invalid_handle,
5088
  mock_X_DestroyObject__invalid_handle,
5089
  mock_X_GetObjectSize__invalid_handle,
5090
  mock_X_GetAttributeValue__invalid_handle,
5091
  mock_X_SetAttributeValue__invalid_handle,
5092
  mock_X_FindObjectsInit__invalid_handle,
5093
  mock_X_FindObjects__invalid_handle,
5094
  mock_X_FindObjectsFinal__invalid_handle,
5095
  mock_X_EncryptInit__invalid_handle,
5096
  mock_X_Encrypt__invalid_handle,
5097
  mock_X_EncryptUpdate__invalid_handle,
5098
  mock_X_EncryptFinal__invalid_handle,
5099
  mock_X_DecryptInit__invalid_handle,
5100
  mock_X_Decrypt__invalid_handle,
5101
  mock_X_DecryptUpdate__invalid_handle,
5102
  mock_X_DecryptFinal__invalid_handle,
5103
  mock_X_DigestInit__invalid_handle,
5104
  mock_X_Digest__invalid_handle,
5105
  mock_X_DigestUpdate__invalid_handle,
5106
  mock_X_DigestKey__invalid_handle,
5107
  mock_X_DigestFinal__invalid_handle,
5108
  mock_X_SignInit__invalid_handle,
5109
  mock_X_Sign__invalid_handle,
5110
  mock_X_SignUpdate__invalid_handle,
5111
  mock_X_SignFinal__invalid_handle,
5112
  mock_X_SignRecoverInit__invalid_handle,
5113
  mock_X_SignRecover__invalid_handle,
5114
  mock_X_VerifyInit__invalid_handle,
5115
  mock_X_Verify__invalid_handle,
5116
  mock_X_VerifyUpdate__invalid_handle,
5117
  mock_X_VerifyFinal__invalid_handle,
5118
  mock_X_VerifyRecoverInit__invalid_handle,
5119
  mock_X_VerifyRecover__invalid_handle,
5120
  mock_X_DigestEncryptUpdate__invalid_handle,
5121
  mock_X_DecryptDigestUpdate__invalid_handle,
5122
  mock_X_SignEncryptUpdate__invalid_handle,
5123
  mock_X_DecryptVerifyUpdate__invalid_handle,
5124
  mock_X_GenerateKey__invalid_handle,
5125
  mock_X_GenerateKeyPair__invalid_handle,
5126
  mock_X_WrapKey__invalid_handle,
5127
  mock_X_UnwrapKey__invalid_handle,
5128
  mock_X_DeriveKey__invalid_handle,
5129
  mock_X_SeedRandom__invalid_handle,
5130
  mock_X_GenerateRandom__invalid_handle,
5131
  mock_X_WaitForSlotEvent__no_event,
5132
  /* PKCS #11 3.0 */
5133
  mock_X_LoginUser__invalid_handle,
5134
  mock_X_SessionCancel__invalid_handle,
5135
  mock_X_MessageEncryptInit__invalid_handle,
5136
  mock_X_EncryptMessage__invalid_handle,
5137
  mock_X_EncryptMessageBegin__invalid_handle,
5138
  mock_X_EncryptMessageNext__invalid_handle,
5139
  mock_X_MessageEncryptFinal__invalid_handle,
5140
  mock_X_MessageDecryptInit__invalid_handle,
5141
  mock_X_DecryptMessage__invalid_handle,
5142
  mock_X_DecryptMessageBegin__invalid_handle,
5143
  mock_X_DecryptMessageNext__invalid_handle,
5144
  mock_X_MessageDecryptFinal__invalid_handle,
5145
  mock_X_MessageSignInit__invalid_handle,
5146
  mock_X_SignMessage__invalid_handle,
5147
  mock_X_SignMessageBegin__invalid_handle,
5148
  mock_X_SignMessageNext__invalid_handle,
5149
  mock_X_MessageSignFinal__invalid_handle,
5150
  mock_X_MessageVerifyInit__invalid_handle,
5151
  mock_X_VerifyMessage__invalid_handle,
5152
  mock_X_VerifyMessageBegin__invalid_handle,
5153
  mock_X_VerifyMessageNext__invalid_handle,
5154
  mock_X_MessageVerifyFinal__invalid_handle
5155
};
5156
5157
#define MOCK_MODULE_FUNCTIONS \
5158
  mock_C_Initialize, \
5159
  mock_C_Finalize, \
5160
  mock_C_GetInfo, \
5161
  mock_C_GetFunctionList_not_supported, \
5162
  mock_C_GetSlotList, \
5163
  mock_C_GetSlotInfo, \
5164
  mock_C_GetTokenInfo, \
5165
  mock_C_GetMechanismList, \
5166
  mock_C_GetMechanismInfo, \
5167
  mock_C_InitToken__specific_args, \
5168
  mock_C_InitPIN__specific_args, \
5169
  mock_C_SetPIN__specific_args, \
5170
  mock_C_OpenSession, \
5171
  mock_C_CloseSession, \
5172
  mock_C_CloseAllSessions, \
5173
  mock_C_GetSessionInfo, \
5174
  mock_C_GetOperationState, \
5175
  mock_C_SetOperationState, \
5176
  mock_C_Login, \
5177
  mock_C_Logout, \
5178
  mock_C_CreateObject, \
5179
  mock_C_CopyObject, \
5180
  mock_C_DestroyObject, \
5181
  mock_C_GetObjectSize, \
5182
  mock_C_GetAttributeValue, \
5183
  mock_C_SetAttributeValue, \
5184
  mock_C_FindObjectsInit, \
5185
  mock_C_FindObjects, \
5186
  mock_C_FindObjectsFinal, \
5187
  mock_C_EncryptInit, \
5188
  mock_C_Encrypt, \
5189
  mock_C_EncryptUpdate, \
5190
  mock_C_EncryptFinal, \
5191
  mock_C_DecryptInit, \
5192
  mock_C_Decrypt, \
5193
  mock_C_DecryptUpdate, \
5194
  mock_C_DecryptFinal, \
5195
  mock_C_DigestInit, \
5196
  mock_C_Digest, \
5197
  mock_C_DigestUpdate, \
5198
  mock_C_DigestKey, \
5199
  mock_C_DigestFinal, \
5200
  mock_C_SignInit, \
5201
  mock_C_Sign, \
5202
  mock_C_SignUpdate, \
5203
  mock_C_SignFinal, \
5204
  mock_C_SignRecoverInit, \
5205
  mock_C_SignRecover, \
5206
  mock_C_VerifyInit, \
5207
  mock_C_Verify, \
5208
  mock_C_VerifyUpdate, \
5209
  mock_C_VerifyFinal, \
5210
  mock_C_VerifyRecoverInit, \
5211
  mock_C_VerifyRecover, \
5212
  mock_C_DigestEncryptUpdate, \
5213
  mock_C_DecryptDigestUpdate, \
5214
  mock_C_SignEncryptUpdate, \
5215
  mock_C_DecryptVerifyUpdate, \
5216
  mock_C_GenerateKey, \
5217
  mock_C_GenerateKeyPair, \
5218
  mock_C_WrapKey, \
5219
  mock_C_UnwrapKey, \
5220
  mock_C_DeriveKey, \
5221
  mock_C_SeedRandom, \
5222
  mock_C_GenerateRandom, \
5223
  mock_C_GetFunctionStatus, \
5224
  mock_C_CancelFunction, \
5225
  mock_C_WaitForSlotEvent, \
5226
5227
5228
CK_FUNCTION_LIST mock_module = {
5229
  { CRYPTOKI_LEGACY_VERSION_MAJOR, CRYPTOKI_LEGACY_VERSION_MINOR },  /* version */
5230
  MOCK_MODULE_FUNCTIONS
5231
};
5232
5233
CK_FUNCTION_LIST_3_0 mock_module_v3 = {
5234
  { CRYPTOKI_VERSION_MAJOR, CRYPTOKI_VERSION_MINOR },  /* version */
5235
  MOCK_MODULE_FUNCTIONS
5236
  /* PKCS #11 3.0 */
5237
  mock_C_GetInterfaceList_not_supported,
5238
  mock_C_GetInterface_not_supported,
5239
  mock_C_LoginUser,
5240
  mock_C_SessionCancel,
5241
  mock_C_MessageEncryptInit,
5242
  mock_C_EncryptMessage,
5243
  mock_C_EncryptMessageBegin,
5244
  mock_C_EncryptMessageNext,
5245
  mock_C_MessageEncryptFinal,
5246
  mock_C_MessageDecryptInit,
5247
  mock_C_DecryptMessage,
5248
  mock_C_DecryptMessageBegin,
5249
  mock_C_DecryptMessageNext,
5250
  mock_C_MessageDecryptFinal,
5251
  mock_C_MessageSignInit,
5252
  mock_C_SignMessage,
5253
  mock_C_SignMessageBegin,
5254
  mock_C_SignMessageNext,
5255
  mock_C_MessageSignFinal,
5256
  mock_C_MessageVerifyInit,
5257
  mock_C_VerifyMessage,
5258
  mock_C_VerifyMessageBegin,
5259
  mock_C_VerifyMessageNext,
5260
  mock_C_MessageVerifyFinal
5261
};
5262
5263
CK_INTERFACE mock_interfaces[MOCK_INTERFACES] = {
5264
        {"PKCS 11", &mock_module_v3, 0}, /* 3.0 */
5265
};
5266
5267
5268
void
5269
mock_module_init (void)
5270
32
{
5271
32
  static bool initialized = false;
5272
32
  if (!initialized) {
5273
1
    p11_mutex_init (&init_mutex);
5274
1
    initialized = true;
5275
1
  }
5276
32
}