Coverage Report

Created: 2025-07-12 06:14

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