Coverage Report

Created: 2026-02-26 06:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/p11-kit/p11-kit/rpc-client.c
Line
Count
Source
1
/*
2
 * Copyright (C) 2008 Stefan Walter
3
 * Copyright (C) 2012 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@gnome.org>
34
 */
35
36
#include "config.h"
37
38
#include "attrs.h"
39
0
#define P11_DEBUG_FLAG P11_DEBUG_RPC
40
#include "debug.h"
41
#include "pkcs11.h"
42
#include "pkcs11x.h"
43
#include "library.h"
44
#include "message.h"
45
#include "private.h"
46
#include "rpc.h"
47
#include "rpc-message.h"
48
#include "virtual.h"
49
50
#include <assert.h>
51
#include <string.h>
52
#include <unistd.h>
53
54
#ifdef ENABLE_NLS
55
#include <libintl.h>
56
0
#define _(x) dgettext(PACKAGE_NAME, x)
57
#else
58
#define _(x) (x)
59
#endif
60
61
/* The error used by us when parsing of rpc message fails */
62
0
#define PARSE_ERROR   CKR_DEVICE_ERROR
63
64
typedef struct {
65
  p11_mutex_t mutex;
66
  p11_rpc_client_vtable *vtable;
67
  unsigned int initialized_forkid;
68
  bool initialize_done;
69
  uint8_t version;
70
} rpc_client;
71
72
/* Allocator for call session buffers */
73
static void *
74
log_allocator (void *pointer,
75
               size_t size)
76
0
{
77
0
  void *result = realloc (pointer, (size_t)size);
78
0
  return_val_if_fail (!size || result != NULL, NULL);
79
0
  return result;
80
0
}
81
82
static CK_RV
83
call_prepare (rpc_client *module,
84
              p11_rpc_message *msg,
85
              int call_id)
86
0
{
87
0
  p11_buffer *buffer;
88
89
0
  assert (module != NULL);
90
0
  assert (msg != NULL);
91
92
0
  if (module->initialized_forkid != p11_forkid)
93
0
    return CKR_CRYPTOKI_NOT_INITIALIZED;
94
0
  if (!module->initialize_done)
95
0
    return CKR_DEVICE_REMOVED;
96
97
0
  buffer = p11_rpc_buffer_new_full (64, log_allocator, free);
98
0
  return_val_if_fail (buffer != NULL, CKR_GENERAL_ERROR);
99
100
  /* We use the same buffer for reading and writing */
101
0
  p11_rpc_message_init (msg, buffer, buffer);
102
103
  /* Put in the Call ID and signature */
104
0
  if (!p11_rpc_message_prep (msg, call_id, P11_RPC_REQUEST))
105
0
    return_val_if_reached (CKR_HOST_MEMORY);
106
107
0
  p11_debug ("prepared call: %d", call_id);
108
0
  return CKR_OK;
109
0
}
110
111
static CK_RV
112
call_run (rpc_client *module,
113
          p11_rpc_message *msg)
114
0
{
115
0
  CK_RV ret = CKR_OK;
116
0
  CK_ULONG ckerr;
117
118
0
  int call_id;
119
120
0
  assert (module != NULL);
121
0
  assert (msg != NULL);
122
123
  /* Did building the call fail? */
124
0
  if (p11_buffer_failed (msg->output))
125
0
    return_val_if_reached (CKR_HOST_MEMORY);
126
127
  /* Make sure that the signature is valid */
128
0
  assert (p11_rpc_message_is_verified (msg));
129
0
  call_id = msg->call_id;
130
131
  /* Do the transport send and receive */
132
0
  assert (module->vtable->transport != NULL);
133
0
  ret = (module->vtable->transport) (module->vtable,
134
0
                                     msg->output,
135
0
                                     msg->input);
136
137
0
  if (ret != CKR_OK)
138
0
    return ret;
139
140
0
  if (!p11_rpc_message_parse (msg, P11_RPC_RESPONSE))
141
0
    return CKR_DEVICE_ERROR;
142
143
  /* If it's an error code then return it */
144
0
  if (msg->call_id == P11_RPC_CALL_ERROR) {
145
0
    if (!p11_rpc_message_read_ulong (msg, &ckerr)) {
146
0
      p11_message (_("invalid rpc error response: too short"));
147
0
      return CKR_DEVICE_ERROR;
148
0
    }
149
150
0
    if (ckerr <= CKR_OK) {
151
0
      p11_message (_("invalid rpc error response: bad error code"));
152
0
      return CKR_DEVICE_ERROR;
153
0
    }
154
155
    /* An error code from the other side */
156
0
    return (CK_RV)ckerr;
157
0
  }
158
159
  /* Make sure other side answered the right call */
160
0
  if (call_id != msg->call_id) {
161
0
    p11_message (_("invalid rpc response: call mismatch"));
162
0
    return CKR_DEVICE_ERROR;
163
0
  }
164
165
0
  assert (!p11_buffer_failed (msg->input));
166
167
0
  p11_debug ("parsing response values");
168
0
  return CKR_OK;
169
0
}
170
171
static CK_RV
172
call_done (rpc_client *module,
173
           p11_rpc_message *msg,
174
           CK_RV ret)
175
0
{
176
0
  p11_buffer *buf;
177
178
0
  assert (module != NULL);
179
0
  assert (msg != NULL);
180
181
  /* Check for parsing errors that were not caught elsewhere */
182
0
  if (ret == CKR_OK) {
183
0
    if (p11_buffer_failed (msg->input)) {
184
0
      p11_message (_("invalid rpc response: bad argument data"));
185
0
      ret = CKR_GENERAL_ERROR;
186
0
    } else {
187
      /* Double check that the signature matched our decoding */
188
0
      assert (p11_rpc_message_is_verified (msg));
189
0
    }
190
0
  }
191
192
  /* We used the same buffer for input/output, so this frees both */
193
0
  assert (msg->input == msg->output);
194
0
  buf = msg->input;
195
0
  p11_rpc_message_clear (msg);
196
0
  p11_rpc_buffer_free (buf);
197
198
0
  return ret;
199
0
}
200
201
/* -----------------------------------------------------------------------------
202
 * MODULE SPECIFIC PROTOCOL CODE
203
 */
204
205
static CK_RV
206
proto_read_attribute_array (p11_rpc_message *msg,
207
                            CK_ATTRIBUTE_PTR arr,
208
                            CK_ULONG len)
209
0
{
210
0
  uint32_t i, num;
211
0
  CK_RV ret;
212
213
0
  assert (len != 0);
214
0
  assert (msg != NULL);
215
0
  assert (msg->input != NULL);
216
217
  /* Make sure this is in the right order */
218
0
  assert (!msg->signature || p11_rpc_message_verify_part (msg, "aA"));
219
220
  /* Get the number of items. We need this value to be correct */
221
0
  if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &num))
222
0
    return PARSE_ERROR;
223
224
  /*
225
   * This should never happen in normal operation. It denotes a goof up
226
   * on the other side of our RPC. We should be indicating the exact number
227
   * of attributes to the other side. And it should respond with the same
228
   * number.
229
   */
230
0
  if (len != num) {
231
0
    p11_message (_("received an attribute array with wrong number of attributes"));
232
0
    return PARSE_ERROR;
233
0
  }
234
235
0
  ret = CKR_OK;
236
237
  /* We need to go ahead and read everything in all cases */
238
0
  for (i = 0; i < num; ++i) {
239
0
    size_t offset = msg->parsed;
240
0
    CK_ATTRIBUTE temp;
241
242
0
    memset (&temp, 0, sizeof (temp));
243
0
    if (!p11_rpc_message_get_attribute (msg, msg->input, &offset, &temp)) {
244
0
      msg->parsed = offset;
245
0
      return PARSE_ERROR;
246
0
    }
247
248
    /* Try and stuff it in the output data */
249
0
    if (arr) {
250
0
      CK_ATTRIBUTE *attr = &(arr[i]);
251
252
0
      if (temp.type != attr->type) {
253
0
        p11_message (_("returned attributes in invalid order"));
254
0
        msg->parsed = offset;
255
0
        return PARSE_ERROR;
256
0
      }
257
258
0
      if (temp.ulValueLen != ((CK_ULONG)-1)) {
259
        /* Just requesting the attribute size */
260
0
        if (!attr->pValue) {
261
0
          attr->ulValueLen = temp.ulValueLen;
262
263
        /* Wants attribute data, but too small */
264
0
        } else if (attr->ulValueLen < temp.ulValueLen) {
265
0
          attr->ulValueLen = temp.ulValueLen;
266
0
          ret = CKR_BUFFER_TOO_SMALL;
267
268
        /* Wants attribute data, enough space */
269
0
        } else {
270
0
          size_t offset2 = msg->parsed;
271
0
          if (!p11_rpc_buffer_get_attribute (msg->input, &offset2, attr)) {
272
0
            msg->parsed = offset2;
273
0
            return PARSE_ERROR;
274
0
          }
275
0
        }
276
0
      } else {
277
0
        attr->ulValueLen = temp.ulValueLen;
278
0
      }
279
0
    }
280
281
0
    msg->parsed = offset;
282
0
  }
283
284
0
  if (p11_buffer_failed (msg->input))
285
0
    return PARSE_ERROR;
286
287
  /* Read in the code that goes along with these attributes */
288
0
  if (!p11_rpc_message_read_ulong (msg, &ret))
289
0
    return PARSE_ERROR;
290
291
0
  return ret;
292
0
}
293
294
static CK_RV
295
proto_read_byte_array (p11_rpc_message *msg,
296
                       CK_BYTE_PTR arr,
297
                       CK_ULONG_PTR len,
298
                       CK_ULONG max)
299
0
{
300
0
  const unsigned char *val;
301
0
  unsigned char valid;
302
0
  uint32_t length;
303
0
  size_t vlen;
304
305
0
  assert (msg != NULL);
306
0
  assert (msg->input != NULL);
307
308
  /* Make sure this is in the right order */
309
0
  assert (!msg->signature || p11_rpc_message_verify_part (msg, "ay"));
310
311
  /* A single byte which determines whether valid or not */
312
0
  if (!p11_rpc_buffer_get_byte (msg->input, &msg->parsed, &valid))
313
0
    return PARSE_ERROR;
314
315
  /* If not valid, then just the length is encoded, this can signify CKR_BUFFER_TOO_SMALL */
316
0
  if (!valid) {
317
0
    if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &length))
318
0
      return PARSE_ERROR;
319
320
0
    if (len != NULL)
321
0
      *len = length;
322
323
0
    if (arr)
324
0
      return CKR_BUFFER_TOO_SMALL;
325
0
    else
326
0
      return CKR_OK;
327
0
  }
328
329
  /* Get the actual bytes */
330
0
  if (!p11_rpc_buffer_get_byte_array (msg->input, &msg->parsed, &val, &vlen))
331
0
    return PARSE_ERROR;
332
333
0
  if (len != NULL)
334
0
    *len = vlen;
335
336
  /* Just asking us for size */
337
0
  if (!arr)
338
0
    return CKR_OK;
339
340
0
  if (max < vlen)
341
0
    return CKR_BUFFER_TOO_SMALL;
342
343
  /* Enough space, yay */
344
0
  memcpy (arr, val, vlen);
345
0
  return CKR_OK;
346
0
}
347
348
static CK_RV
349
proto_read_ulong_array (p11_rpc_message *msg, CK_ULONG_PTR arr,
350
                        CK_ULONG_PTR len, CK_ULONG max)
351
0
{
352
0
  uint32_t i, num;
353
0
  uint64_t val;
354
0
  unsigned char valid;
355
356
0
  assert (len != NULL);
357
0
  assert (msg != NULL);
358
0
  assert (msg->input != NULL);
359
360
  /* Make sure this is in the right order */
361
0
  assert (!msg->signature || p11_rpc_message_verify_part (msg, "au"));
362
363
  /* A single byte which determines whether valid or not */
364
0
  if (!p11_rpc_buffer_get_byte (msg->input, &msg->parsed, &valid))
365
0
    return PARSE_ERROR;
366
367
  /* Get the number of items. */
368
0
  if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &num))
369
0
    return PARSE_ERROR;
370
371
0
  *len = num;
372
373
  /* If not valid, then just the length is encoded, this can signify CKR_BUFFER_TOO_SMALL */
374
0
  if (!valid) {
375
0
    if (arr)
376
0
      return CKR_BUFFER_TOO_SMALL;
377
0
    else
378
0
      return CKR_OK;
379
0
  }
380
381
0
  if (max < num)
382
0
    return CKR_BUFFER_TOO_SMALL;
383
384
  /* We need to go ahead and read everything in all cases */
385
0
  for (i = 0; i < num; ++i) {
386
0
    if (!p11_rpc_buffer_get_uint64 (msg->input, &msg->parsed, &val))
387
0
      return PARSE_ERROR;
388
0
    if (arr)
389
0
      arr[i] = (CK_ULONG)val;
390
0
  }
391
392
0
  return p11_buffer_failed (msg->input) ? PARSE_ERROR : CKR_OK;
393
0
}
394
395
static void
396
mechanism_list_purge (CK_MECHANISM_TYPE_PTR mechs,
397
                      CK_ULONG *n_mechs)
398
0
{
399
0
  CK_ULONG i;
400
401
0
  assert (mechs != NULL);
402
0
  assert (n_mechs != NULL);
403
404
  /* Trim unsupported mechanisms at the end */
405
0
  for (; *n_mechs > 0 && !p11_rpc_mechanism_is_supported (mechs[*n_mechs - 1]); --*n_mechs)
406
0
    ;
407
408
0
  for (i = 0; i < *n_mechs; ++i) {
409
0
    if (!p11_rpc_mechanism_is_supported (mechs[i])) {
410
      /* Remove the mechanism from the list */
411
0
      memmove (&mechs[i], &mechs[i + 1],
412
0
         (*n_mechs - (i + 1)) * sizeof (CK_MECHANISM_TYPE));
413
414
0
      --(*n_mechs);
415
0
      --i;
416
0
    }
417
0
  }
418
0
}
419
420
static CK_RV
421
proto_write_mechanism (p11_rpc_message *msg,
422
                       CK_MECHANISM_PTR mech)
423
0
{
424
0
  assert (msg != NULL);
425
0
  assert (msg->output != NULL);
426
427
  /* Make sure this is in the right order */
428
0
  assert (!msg->signature || p11_rpc_message_verify_part (msg, "M"));
429
430
  /*
431
   * The NULL mechanism is used for C_*Init () functions to
432
   * cancel operation.  We use a special value 0xffffffff as a
433
   * marker to indicate that.
434
   */
435
0
  if (mech == NULL) {
436
0
    p11_rpc_buffer_add_uint32 (msg->output, 0xffffffff);
437
0
    return p11_buffer_failed (msg->output) ? CKR_HOST_MEMORY : CKR_OK;
438
0
  }
439
440
0
  if (!p11_rpc_mechanism_is_supported (mech->mechanism))
441
0
    return CKR_MECHANISM_INVALID;
442
443
  /*
444
   * PKCS#11 mechanism parameters are not easy to serialize. They're
445
   * completely different for so many mechanisms, they contain
446
   * pointers to arbitrary memory, and many callers don't initialize
447
   * them completely or properly.
448
   *
449
   * We only support certain mechanisms.
450
   *
451
   * Also callers do yucky things like leaving parts of the structure
452
   * pointing to garbage if they don't think it's going to be used.
453
   */
454
455
0
  p11_rpc_buffer_add_mechanism (msg->output, mech);
456
457
0
  return p11_buffer_failed (msg->output) ? CKR_HOST_MEMORY : CKR_OK;
458
0
}
459
460
static CK_RV
461
proto_read_error (p11_rpc_message *msg, CK_RV *error)
462
0
{
463
0
  if (!p11_rpc_message_read_ulong(msg, error))
464
0
    return PARSE_ERROR;
465
466
0
  return CKR_OK;
467
0
}
468
469
static CK_RV
470
proto_read_mech_param_update (p11_rpc_message *msg,
471
                      CK_MECHANISM_PTR *mech)
472
0
{
473
0
  size_t offset;
474
0
  CK_MECHANISM temp;
475
476
0
  assert (msg != NULL);
477
0
  assert (mech != NULL);
478
0
  assert (msg->input != NULL);
479
480
  /* Make sure this is in the right order */
481
0
  assert (!msg->signature || p11_rpc_message_verify_part (msg, "P"));
482
483
  /* Check the length needed to store the parameter */
484
0
  memset (&temp, 0, sizeof (temp));
485
0
  temp.mechanism = (*mech)->mechanism;
486
0
  offset = msg->parsed;
487
0
  if (!p11_rpc_buffer_get_mech_param_update (msg->input, &offset, &temp)) {
488
0
    msg->parsed = offset;
489
0
    return PARSE_ERROR;
490
0
  }
491
492
  /* The mechanism doesn't require parameter */
493
0
  if (temp.ulParameterLen == 0) {
494
0
    msg->parsed = offset;
495
0
    return CKR_OK;
496
0
  }
497
498
  /* Actually retrieve the parameter */
499
0
  if ((*mech)->ulParameterLen != temp.ulParameterLen)
500
0
    return CKR_MECHANISM_PARAM_INVALID;
501
0
  if (!p11_rpc_buffer_get_mech_param_update (msg->input, &msg->parsed, *mech))
502
0
    return PARSE_ERROR;
503
504
0
  assert (msg->parsed == offset);
505
506
0
  return CKR_OK;
507
0
}
508
509
static CK_RV
510
proto_read_info (p11_rpc_message *msg,
511
                 CK_INFO_PTR info)
512
0
{
513
0
  assert (msg != NULL);
514
0
  assert (info != NULL);
515
516
0
  if (!p11_rpc_message_read_version (msg, &info->cryptokiVersion) ||
517
0
      !p11_rpc_message_read_space_string (msg, info->manufacturerID, 32) ||
518
0
      !p11_rpc_message_read_ulong (msg, &info->flags) ||
519
0
      !p11_rpc_message_read_space_string (msg, info->libraryDescription, 32) ||
520
0
      !p11_rpc_message_read_version (msg, &info->libraryVersion))
521
0
    return PARSE_ERROR;
522
523
0
  return CKR_OK;
524
0
}
525
526
static CK_RV
527
proto_read_slot_info (p11_rpc_message *msg,
528
                      CK_SLOT_INFO_PTR info)
529
0
{
530
0
  assert (msg != NULL);
531
0
  assert (info != NULL);
532
533
0
  if (!p11_rpc_message_read_space_string (msg, info->slotDescription, 64) ||
534
0
      !p11_rpc_message_read_space_string (msg, info->manufacturerID, 32) ||
535
0
      !p11_rpc_message_read_ulong (msg, &info->flags) ||
536
0
      !p11_rpc_message_read_version (msg, &info->hardwareVersion) ||
537
0
      !p11_rpc_message_read_version (msg, &info->firmwareVersion))
538
0
    return PARSE_ERROR;
539
540
0
  return CKR_OK;
541
0
}
542
543
static CK_RV
544
proto_read_token_info (p11_rpc_message *msg,
545
                       CK_TOKEN_INFO_PTR info)
546
0
{
547
0
  assert (msg != NULL);
548
0
  assert (info != NULL);
549
550
0
  if (!p11_rpc_message_read_space_string (msg, info->label, 32) ||
551
0
      !p11_rpc_message_read_space_string (msg, info->manufacturerID, 32) ||
552
0
      !p11_rpc_message_read_space_string (msg, info->model, 16) ||
553
0
      !p11_rpc_message_read_space_string (msg, info->serialNumber, 16) ||
554
0
      !p11_rpc_message_read_ulong (msg, &info->flags) ||
555
0
      !p11_rpc_message_read_ulong (msg, &info->ulMaxSessionCount) ||
556
0
      !p11_rpc_message_read_ulong (msg, &info->ulSessionCount) ||
557
0
      !p11_rpc_message_read_ulong (msg, &info->ulMaxRwSessionCount) ||
558
0
      !p11_rpc_message_read_ulong (msg, &info->ulRwSessionCount) ||
559
0
      !p11_rpc_message_read_ulong (msg, &info->ulMaxPinLen) ||
560
0
      !p11_rpc_message_read_ulong (msg, &info->ulMinPinLen) ||
561
0
      !p11_rpc_message_read_ulong (msg, &info->ulTotalPublicMemory) ||
562
0
      !p11_rpc_message_read_ulong (msg, &info->ulFreePublicMemory) ||
563
0
      !p11_rpc_message_read_ulong (msg, &info->ulTotalPrivateMemory) ||
564
0
      !p11_rpc_message_read_ulong (msg, &info->ulFreePrivateMemory) ||
565
0
      !p11_rpc_message_read_version (msg, &info->hardwareVersion) ||
566
0
      !p11_rpc_message_read_version (msg, &info->firmwareVersion) ||
567
0
      !p11_rpc_message_read_space_string (msg, info->utcTime, 16))
568
0
    return PARSE_ERROR;
569
570
0
  return CKR_OK;
571
0
}
572
573
static CK_RV
574
proto_read_mechanism_info (p11_rpc_message *msg,
575
                           CK_MECHANISM_INFO_PTR info)
576
0
{
577
0
  assert (msg != NULL);
578
0
  assert (info != NULL);
579
580
0
  if (!p11_rpc_message_read_ulong (msg, &info->ulMinKeySize) ||
581
0
      !p11_rpc_message_read_ulong (msg, &info->ulMaxKeySize) ||
582
0
      !p11_rpc_message_read_ulong (msg, &info->flags))
583
0
    return PARSE_ERROR;
584
585
0
  return CKR_OK;
586
0
}
587
588
static CK_RV
589
proto_read_sesssion_info (p11_rpc_message *msg,
590
                          CK_SESSION_INFO_PTR info)
591
0
{
592
0
  assert (msg != NULL);
593
0
  assert (info != NULL);
594
595
0
  if (!p11_rpc_message_read_ulong (msg, &info->slotID) ||
596
0
      !p11_rpc_message_read_ulong (msg, &info->state) ||
597
0
      !p11_rpc_message_read_ulong (msg, &info->flags) ||
598
0
      !p11_rpc_message_read_ulong (msg, &info->ulDeviceError))
599
0
    return PARSE_ERROR;
600
601
0
  return CKR_OK;
602
0
}
603
604
/* -------------------------------------------------------------------
605
 * CALL MACROS
606
 */
607
608
#define BEGIN_CALL_OR(call_id, self, if_no_daemon) \
609
0
  p11_debug (#call_id ": enter"); \
610
0
  { \
611
0
    rpc_client *_mod = ((p11_virtual *)self)->lower_module; p11_rpc_message _msg; \
612
0
    CK_RV _ret = call_prepare (_mod, &_msg, P11_RPC_CALL_##call_id); \
613
0
    if (_ret == CKR_DEVICE_REMOVED) return (if_no_daemon); \
614
0
    if (_ret != CKR_OK) return _ret;
615
616
#define PROCESS_CALL \
617
0
    _ret = call_run (_mod, &_msg); \
618
0
    if (_ret != CKR_OK) goto _cleanup;
619
620
#define RETURN(ret) \
621
    _ret = ret; \
622
    goto _cleanup;
623
624
#define END_CALL \
625
0
  _cleanup: \
626
0
    _ret = call_done (_mod, &_msg, _ret); \
627
0
    p11_debug ("ret: %lu", _ret); \
628
0
    return _ret; \
629
0
  }
630
631
#define RPC_VERSION \
632
0
    ((rpc_client *)((p11_virtual *)self)->lower_module)->version
633
634
#define IN_BYTE(val) \
635
0
  if (!p11_rpc_message_write_byte (&_msg, val)) \
636
0
    { _ret = CKR_HOST_MEMORY; goto _cleanup; }
637
638
#define IN_ULONG(val) \
639
0
  if (!p11_rpc_message_write_ulong (&_msg, val)) \
640
0
    { _ret = CKR_HOST_MEMORY; goto _cleanup; }
641
642
#define IN_ZERO_STRING(val) \
643
0
  if (!p11_rpc_message_write_zero_string (&_msg, val)) \
644
0
    { _ret = CKR_HOST_MEMORY; goto _cleanup; }
645
646
#define IN_SPACE_STRING(val, len) \
647
0
  if (!p11_rpc_message_write_space_string (&_msg, val, len)) \
648
0
    { _ret = CKR_HOST_MEMORY; goto _cleanup; }
649
650
#define IN_BYTE_BUFFER(arr, len) \
651
0
  if ((len) == NULL) \
652
0
    { _ret = CKR_ARGUMENTS_BAD; goto _cleanup; } \
653
0
  if (!p11_rpc_message_write_byte_buffer (&_msg, (arr) ? (*(len) > 0 ? *(len) : (uint32_t)-1) : 0)) \
654
0
    { _ret = CKR_HOST_MEMORY; goto _cleanup; }
655
656
#define IN_BYTE_ARRAY(arr, len) \
657
0
  if (len != 0 && arr == NULL) \
658
0
    { _ret = CKR_ARGUMENTS_BAD; goto _cleanup; } \
659
0
  if (!p11_rpc_message_write_byte_array (&_msg, arr, len)) \
660
0
    { _ret = CKR_HOST_MEMORY; goto _cleanup; }
661
662
#define IN_ULONG_BUFFER(arr, len) \
663
0
  if (len == NULL) \
664
0
    { _ret = CKR_ARGUMENTS_BAD; goto _cleanup; } \
665
0
  if (!p11_rpc_message_write_ulong_buffer (&_msg, arr ? *len : 0)) \
666
0
    { _ret = CKR_HOST_MEMORY; goto _cleanup; }
667
668
#define IN_ULONG_ARRAY(arr, len) \
669
  if (len != 0 && arr == NULL) \
670
    { _ret = CKR_ARGUMENTS_BAD; goto _cleanup; }\
671
  if (!p11_rpc_message_write_ulong_array (&_msg, arr, len)) \
672
    { _ret = CKR_HOST_MEMORY; goto _cleanup; }
673
674
#define IN_ATTRIBUTE_BUFFER(arr, num) \
675
0
  if (num != 0 && arr == NULL) \
676
0
    { _ret = CKR_ARGUMENTS_BAD; goto _cleanup; } \
677
0
  if (!p11_rpc_message_write_attribute_buffer (&_msg, (arr), (num))) \
678
0
    { _ret = CKR_HOST_MEMORY; goto _cleanup; }
679
680
#define IN_ATTRIBUTE_ARRAY(arr, num) \
681
0
  if (num != 0 && arr == NULL) \
682
0
    { _ret = CKR_ARGUMENTS_BAD; goto _cleanup; } \
683
0
  if (!p11_rpc_message_write_attribute_array (&_msg, (arr), (num))) \
684
0
    { _ret = CKR_HOST_MEMORY; goto _cleanup; }
685
686
#define IN_MECHANISM_TYPE(val) \
687
0
  if(!p11_rpc_mechanism_is_supported (val)) \
688
0
    { _ret = CKR_MECHANISM_INVALID; goto _cleanup; } \
689
0
  if (!p11_rpc_message_write_ulong (&_msg, val)) \
690
0
    { _ret = CKR_HOST_MEMORY; goto _cleanup; }
691
692
#define IN_MECHANISM(val) \
693
0
  _ret = proto_write_mechanism (&_msg, val); \
694
0
  if (_ret != CKR_OK) goto _cleanup;
695
696
697
698
#define OUT_ULONG(val) \
699
0
  if (val == NULL) \
700
0
    _ret = CKR_ARGUMENTS_BAD; \
701
0
  if (_ret == CKR_OK && !p11_rpc_message_read_ulong (&_msg, val)) \
702
0
    _ret = PARSE_ERROR;
703
704
#define OUT_MECH_PARAM_UPDATE(mech) \
705
0
  if (_ret != CKR_OK) goto _cleanup; \
706
0
  _ret = proto_read_mech_param_update (&_msg, &mech); \
707
0
  if (_ret != CKR_OK) goto _cleanup;
708
709
#define OUT_ERROR(err) \
710
0
  if (_ret != CKR_OK) goto _cleanup; \
711
0
  _ret = proto_read_error (&_msg, &err);
712
713
714
#define OUT_BYTE_ARRAY(arr, len)  \
715
0
  if (len == NULL) \
716
0
    _ret = CKR_ARGUMENTS_BAD; \
717
0
  if (_ret == CKR_OK) \
718
0
    _ret = proto_read_byte_array (&_msg, (arr), (len), *(len));
719
720
#define OUT_ULONG_ARRAY(a, len) \
721
0
  if (len == NULL) \
722
0
    _ret = CKR_ARGUMENTS_BAD; \
723
0
  if (_ret == CKR_OK) \
724
0
    _ret = proto_read_ulong_array (&_msg, (a), (len), *(len));
725
726
#define OUT_ATTRIBUTE_ARRAY(arr, num) \
727
0
  if (_ret == CKR_OK) \
728
0
    _ret = proto_read_attribute_array (&_msg, (arr), (num));
729
730
#define OUT_INFO(info) \
731
0
  if (info == NULL) \
732
0
    _ret = CKR_ARGUMENTS_BAD; \
733
0
  if (_ret == CKR_OK) \
734
0
    _ret = proto_read_info (&_msg, info);
735
736
#define OUT_SLOT_INFO(info) \
737
0
  if (info == NULL) \
738
0
    _ret = CKR_ARGUMENTS_BAD; \
739
0
  if (_ret == CKR_OK) \
740
0
    _ret = proto_read_slot_info (&_msg, info);
741
742
#define OUT_TOKEN_INFO(info) \
743
0
  if (info == NULL) \
744
0
    _ret = CKR_ARGUMENTS_BAD; \
745
0
  if (_ret == CKR_OK) \
746
0
    _ret = proto_read_token_info (&_msg, info);
747
748
#define OUT_SESSION_INFO(info) \
749
0
  if (info == NULL) \
750
0
    _ret = CKR_ARGUMENTS_BAD; \
751
0
  if (_ret == CKR_OK) \
752
0
    _ret = proto_read_sesssion_info (&_msg, info);
753
754
#define OUT_MECHANISM_TYPE_ARRAY(arr, len) \
755
0
  if (len == NULL) \
756
0
    _ret = CKR_ARGUMENTS_BAD; \
757
0
  if (_ret == CKR_OK) \
758
0
    _ret = proto_read_ulong_array (&_msg, (arr), (len), *(len)); \
759
0
  if (_ret == CKR_OK && arr) \
760
0
    mechanism_list_purge (arr, len);
761
762
#define OUT_MECHANISM_INFO(info) \
763
0
  if (info == NULL) \
764
0
    _ret = CKR_ARGUMENTS_BAD; \
765
0
  if (_ret == CKR_OK) \
766
0
    _ret = proto_read_mechanism_info (&_msg, info);
767
768
// EARLY_EXIT_ON_FAIL
769
#define PREP_EEOF \
770
0
  CK_RV err;
771
772
#define PROCESS_CALL_NO_CHECK \
773
0
    _ret = call_run (_mod, &_msg);
774
775
#define CHECK_EEOF \
776
0
  if(err != CKR_OK) \
777
0
    _ret = err;
778
779
780
/* -------------------------------------------------------------------
781
 * INITIALIZATION and 'GLOBAL' CALLS
782
 */
783
784
static CK_RV
785
rpc_C_Initialize (CK_X_FUNCTION_LIST *self,
786
                  CK_VOID_PTR init_args)
787
0
{
788
0
  rpc_client *module = ((p11_virtual *)self)->lower_module;
789
0
  CK_C_INITIALIZE_ARGS_PTR args = NULL;
790
0
  void *reserved = NULL;
791
0
  CK_RV ret = CKR_OK;
792
0
  p11_rpc_message msg;
793
794
0
  assert (module != NULL);
795
0
  p11_debug ("C_Initialize: enter");
796
797
0
  if (init_args != NULL) {
798
0
    int supplied_ok;
799
800
    /*
801
     * pReserved is either a string or NULL.  Other cases
802
     * should be rejected by the caller of this function.
803
     */
804
0
    args = init_args;
805
806
    /* ALL supplied function pointers need to have the value either NULL or non-NULL. */
807
0
    supplied_ok = (args->CreateMutex == NULL && args->DestroyMutex == NULL &&
808
0
                   args->LockMutex == NULL && args->UnlockMutex == NULL) ||
809
0
                  (args->CreateMutex != NULL && args->DestroyMutex != NULL &&
810
0
                   args->LockMutex != NULL && args->UnlockMutex != NULL);
811
0
    if (!supplied_ok) {
812
0
      p11_message (_("invalid set of mutex calls supplied"));
813
0
      return CKR_ARGUMENTS_BAD;
814
0
    }
815
816
    /*
817
     * When the CKF_OS_LOCKING_OK flag isn't set return an error.
818
     * We must be able to use our mutex functionality.
819
     */
820
0
    if (!(args->flags & CKF_OS_LOCKING_OK)) {
821
0
      p11_message (_("can't do without os locking"));
822
0
      return CKR_CANT_LOCK;
823
0
    }
824
825
0
    if (args->pReserved)
826
0
      reserved = args->pReserved;
827
0
  }
828
829
0
  p11_mutex_lock (&module->mutex);
830
831
0
  if (module->initialized_forkid != 0) {
832
    /* This process has called C_Initialize already */
833
0
    if (p11_forkid == module->initialized_forkid) {
834
0
      p11_message (_("C_Initialize called twice for same process"));
835
0
      ret = CKR_CRYPTOKI_ALREADY_INITIALIZED;
836
0
      goto done;
837
0
    }
838
0
  }
839
840
  /* Call out to initialize client callback */
841
0
  assert (module->vtable->connect != NULL);
842
0
  ret = (module->vtable->connect) (module->vtable, reserved);
843
844
0
  if (ret == CKR_OK) {
845
0
    module->version = P11_RPC_PROTOCOL_VERSION_MAXIMUM;
846
0
    ret = (module->vtable->authenticate) (module->vtable,
847
0
                  &module->version);
848
849
0
#if P11_RPC_PROTOCOL_VERSION_MAXIMUM > 0
850
    /* If the server is too old to support version negotiation
851
     * (i.e., not accepting version bytes other than 0), try to
852
     * reconnect and reauthenticate with version 0 */
853
0
    if (ret != CKR_OK) {
854
0
      assert (module->vtable->disconnect != NULL);
855
0
      (module->vtable->disconnect) (module->vtable, reserved);
856
0
      ret = (module->vtable->connect) (module->vtable, reserved);
857
0
      if (ret == CKR_OK) {
858
0
        module->version = 0;
859
0
        ret = (module->vtable->authenticate) (module->vtable,
860
0
                      &module->version);
861
0
      }
862
0
    }
863
0
#endif
864
0
  }
865
866
  /* Successfully initialized */
867
0
  if (ret == CKR_OK) {
868
0
    module->initialized_forkid = p11_forkid;
869
0
    module->initialize_done = true;
870
0
    p11_debug ("authenticated with protocol version %u",
871
0
         module->version);
872
873
  /* Server doesn't exist, initialize but don't call */
874
0
  } else if (ret == CKR_DEVICE_REMOVED) {
875
0
    module->initialized_forkid = p11_forkid;
876
0
    module->initialize_done = false;
877
0
    ret = CKR_OK;
878
0
    goto done;
879
880
0
  } else {
881
0
    goto done;
882
0
  }
883
884
  /* If we don't have read and write fds now, then initialize other side */
885
0
  ret = call_prepare (module, &msg, P11_RPC_CALL_C_Initialize);
886
0
  if (ret == CKR_OK)
887
0
    if (!p11_rpc_message_write_byte_array (&msg, P11_RPC_HANDSHAKE, P11_RPC_HANDSHAKE_LEN))
888
0
      ret = CKR_HOST_MEMORY;
889
0
  if (ret == CKR_OK) {
890
0
    if (!p11_rpc_message_write_byte (&msg, reserved != NULL))
891
0
      ret = CKR_HOST_MEMORY;
892
0
  }
893
0
  if (ret == CKR_OK) {
894
0
    char *reserved_string = "";
895
0
    if (reserved != NULL)
896
0
      reserved_string = (char *) reserved;
897
0
    if (!p11_rpc_message_write_byte_array (&msg, (CK_BYTE_PTR) reserved_string, strlen (reserved_string) + 1))
898
0
      ret = CKR_HOST_MEMORY;
899
0
  }
900
0
  if (ret == CKR_OK)
901
0
    ret = call_run (module, &msg);
902
0
  call_done (module, &msg, ret);
903
904
0
done:
905
  /* If failed then unmark initialized */
906
0
  if (ret != CKR_OK && ret != CKR_CRYPTOKI_ALREADY_INITIALIZED)
907
0
    module->initialized_forkid = 0;
908
909
  /* If we told our caller that we're initialized, but not really, then finalize */
910
0
  if (ret != CKR_OK && ret != CKR_CRYPTOKI_ALREADY_INITIALIZED && module->initialize_done) {
911
0
    module->initialize_done = false;
912
0
    assert (module->vtable->disconnect != NULL);
913
0
    (module->vtable->disconnect) (module->vtable, reserved);
914
0
  }
915
916
0
  p11_mutex_unlock (&module->mutex);
917
918
0
  p11_debug ("C_Initialize: %lu", ret);
919
0
  return ret;
920
0
}
921
922
static CK_RV
923
rpc_C_Finalize (CK_X_FUNCTION_LIST *self,
924
                CK_VOID_PTR reserved)
925
0
{
926
0
  rpc_client *module = ((p11_virtual *)self)->lower_module;
927
0
  CK_RV ret = CKR_OK;
928
0
  p11_rpc_message msg;
929
930
0
  p11_debug ("C_Finalize: enter");
931
0
  return_val_if_fail (module->initialized_forkid == p11_forkid, CKR_CRYPTOKI_NOT_INITIALIZED);
932
0
  return_val_if_fail (!reserved, CKR_ARGUMENTS_BAD);
933
934
0
  p11_mutex_lock (&module->mutex);
935
936
0
  if (module->initialize_done) {
937
0
    ret = call_prepare (module, &msg, P11_RPC_CALL_C_Finalize);
938
0
    if (ret == CKR_OK)
939
0
      ret = call_run (module, &msg);
940
0
    call_done (module, &msg, ret);
941
0
    if (ret != CKR_OK)
942
0
      p11_message (_("finalizing rpc module returned an error: %lu"), ret);
943
944
0
    module->initialize_done = false;
945
0
    assert (module->vtable->disconnect != NULL);
946
0
    (module->vtable->disconnect) (module->vtable, reserved);
947
0
  }
948
949
0
  module->initialized_forkid = 0;
950
951
0
  p11_mutex_unlock (&module->mutex);
952
953
0
  p11_debug ("C_Finalize: %lu", CKR_OK);
954
0
  return CKR_OK;
955
0
}
956
957
static CK_RV
958
fill_stand_in_info (CK_INFO_PTR info)
959
0
{
960
0
  static CK_INFO stand_in_info = {
961
0
    { CRYPTOKI_VERSION_MAJOR, CRYPTOKI_VERSION_MINOR },
962
0
    "p11-kit                         ",
963
0
    0,
964
0
    "p11-kit (no connection)         ",
965
0
    { 1, 1 },
966
0
  };
967
0
  memcpy (info, &stand_in_info, sizeof (CK_INFO));
968
0
  return CKR_OK;
969
970
0
}
971
972
static CK_RV
973
rpc_C_GetInfo (CK_X_FUNCTION_LIST *self,
974
               CK_INFO_PTR info)
975
0
{
976
0
  return_val_if_fail (info, CKR_ARGUMENTS_BAD);
977
978
0
  BEGIN_CALL_OR (C_GetInfo, self, fill_stand_in_info (info));
979
0
  PROCESS_CALL;
980
0
    OUT_INFO (info);
981
0
  END_CALL;
982
0
}
983
984
static CK_RV
985
rpc_C_GetSlotList (CK_X_FUNCTION_LIST *self,
986
                   CK_BBOOL token_present,
987
                   CK_SLOT_ID_PTR slot_list,
988
                   CK_ULONG_PTR count)
989
0
{
990
0
  return_val_if_fail (count, CKR_ARGUMENTS_BAD);
991
992
0
  BEGIN_CALL_OR (C_GetSlotList, self, (*count = 0, CKR_OK));
993
0
    IN_BYTE (token_present);
994
0
    IN_ULONG_BUFFER (slot_list, count);
995
0
  PROCESS_CALL;
996
0
    OUT_ULONG_ARRAY (slot_list, count);
997
0
  END_CALL;
998
0
}
999
1000
static CK_RV
1001
rpc_C_GetSlotInfo (CK_X_FUNCTION_LIST *self,
1002
                   CK_SLOT_ID slot_id,
1003
                   CK_SLOT_INFO_PTR info)
1004
0
{
1005
0
  return_val_if_fail (info, CKR_ARGUMENTS_BAD);
1006
1007
0
  BEGIN_CALL_OR (C_GetSlotInfo, self, CKR_SLOT_ID_INVALID);
1008
0
    IN_ULONG (slot_id);
1009
0
  PROCESS_CALL;
1010
0
    OUT_SLOT_INFO (info);
1011
0
  END_CALL;
1012
0
}
1013
1014
static CK_RV
1015
rpc_C_GetTokenInfo (CK_X_FUNCTION_LIST *self,
1016
                    CK_SLOT_ID slot_id,
1017
                    CK_TOKEN_INFO_PTR info)
1018
0
{
1019
0
  return_val_if_fail (info, CKR_ARGUMENTS_BAD);
1020
1021
0
  BEGIN_CALL_OR (C_GetTokenInfo, self, CKR_SLOT_ID_INVALID);
1022
0
    IN_ULONG (slot_id);
1023
0
  PROCESS_CALL;
1024
0
    OUT_TOKEN_INFO (info);
1025
0
  END_CALL;
1026
0
}
1027
1028
static CK_RV
1029
rpc_C_GetMechanismList (CK_X_FUNCTION_LIST *self,
1030
                        CK_SLOT_ID slot_id,
1031
                        CK_MECHANISM_TYPE_PTR mechanism_list,
1032
                        CK_ULONG_PTR count)
1033
0
{
1034
0
  return_val_if_fail (count, CKR_ARGUMENTS_BAD);
1035
1036
0
  BEGIN_CALL_OR (C_GetMechanismList, self, CKR_SLOT_ID_INVALID);
1037
0
    IN_ULONG (slot_id);
1038
0
    IN_ULONG_BUFFER (mechanism_list, count);
1039
0
  PROCESS_CALL;
1040
0
    OUT_MECHANISM_TYPE_ARRAY (mechanism_list, count);
1041
0
  END_CALL;
1042
0
}
1043
1044
static CK_RV
1045
rpc_C_GetMechanismInfo (CK_X_FUNCTION_LIST *self,
1046
                        CK_SLOT_ID slot_id,
1047
                        CK_MECHANISM_TYPE type,
1048
                        CK_MECHANISM_INFO_PTR info)
1049
0
{
1050
0
  return_val_if_fail (info, CKR_ARGUMENTS_BAD);
1051
1052
0
  BEGIN_CALL_OR (C_GetMechanismInfo, self, CKR_SLOT_ID_INVALID);
1053
0
    IN_ULONG (slot_id);
1054
0
    IN_MECHANISM_TYPE (type);
1055
0
  PROCESS_CALL;
1056
0
    OUT_MECHANISM_INFO (info);
1057
0
  END_CALL;
1058
0
}
1059
1060
static CK_RV
1061
C_InitToken1 (CK_X_FUNCTION_LIST *self,
1062
              CK_SLOT_ID slot_id,
1063
              CK_UTF8CHAR_PTR pin, CK_ULONG pin_len,
1064
              CK_UTF8CHAR_PTR label)
1065
0
{
1066
0
  BEGIN_CALL_OR (C_InitToken, self, CKR_SLOT_ID_INVALID);
1067
0
    IN_ULONG (slot_id);
1068
0
    IN_BYTE_ARRAY (pin, pin_len);
1069
0
    IN_ZERO_STRING (label);
1070
0
  PROCESS_CALL;
1071
0
  END_CALL;
1072
0
}
1073
1074
static CK_RV
1075
C_InitToken2 (CK_X_FUNCTION_LIST *self,
1076
              CK_SLOT_ID slot_id,
1077
              CK_UTF8CHAR_PTR pin, CK_ULONG pin_len,
1078
              CK_UTF8CHAR_PTR label)
1079
0
{
1080
0
  BEGIN_CALL_OR (C_InitToken2, self, CKR_SLOT_ID_INVALID);
1081
0
    IN_ULONG (slot_id);
1082
0
    IN_BYTE_ARRAY (pin, pin_len);
1083
0
    IN_SPACE_STRING (label, 32);
1084
0
  PROCESS_CALL;
1085
0
  END_CALL;
1086
0
}
1087
1088
static CK_RV
1089
rpc_C_InitToken (CK_X_FUNCTION_LIST *self,
1090
                 CK_SLOT_ID slot_id,
1091
                 CK_UTF8CHAR_PTR pin, CK_ULONG pin_len,
1092
                 CK_UTF8CHAR_PTR label)
1093
0
{
1094
0
        uint8_t version = RPC_VERSION;
1095
1096
0
        if (version == 0)
1097
0
    return C_InitToken1 (self, slot_id, pin, pin_len, label);
1098
0
  else
1099
0
    return C_InitToken2 (self, slot_id, pin, pin_len, label);
1100
0
}
1101
1102
static CK_RV
1103
rpc_C_WaitForSlotEvent (CK_X_FUNCTION_LIST *self,
1104
                        CK_FLAGS flags,
1105
                        CK_SLOT_ID_PTR slot,
1106
                        CK_VOID_PTR reserved)
1107
0
{
1108
0
  return_val_if_fail (slot, CKR_ARGUMENTS_BAD);
1109
1110
0
  BEGIN_CALL_OR (C_WaitForSlotEvent, self, CKR_DEVICE_REMOVED);
1111
0
    IN_ULONG (flags);
1112
0
  PROCESS_CALL;
1113
0
    OUT_ULONG (slot);
1114
0
  END_CALL;
1115
0
}
1116
1117
static CK_RV
1118
rpc_C_OpenSession (CK_X_FUNCTION_LIST *self,
1119
                   CK_SLOT_ID slot_id,
1120
                   CK_FLAGS flags,
1121
                   CK_VOID_PTR user_data,
1122
                   CK_NOTIFY callback,
1123
                   CK_SESSION_HANDLE_PTR session)
1124
0
{
1125
0
  return_val_if_fail (session, CKR_ARGUMENTS_BAD);
1126
1127
0
  BEGIN_CALL_OR (C_OpenSession, self, CKR_SLOT_ID_INVALID);
1128
0
    IN_ULONG (slot_id);
1129
0
    IN_ULONG (flags);
1130
0
  PROCESS_CALL;
1131
0
    OUT_ULONG (session);
1132
0
  END_CALL;
1133
0
}
1134
1135
static CK_RV
1136
rpc_C_CloseSession (CK_X_FUNCTION_LIST *self,
1137
                    CK_SESSION_HANDLE session)
1138
0
{
1139
0
  BEGIN_CALL_OR (C_CloseSession, self, CKR_SESSION_HANDLE_INVALID);
1140
0
    IN_ULONG (session);
1141
0
  PROCESS_CALL;
1142
0
  END_CALL;
1143
0
}
1144
1145
static CK_RV
1146
rpc_C_CloseAllSessions (CK_X_FUNCTION_LIST *self,
1147
                        CK_SLOT_ID slot_id)
1148
0
{
1149
0
  BEGIN_CALL_OR (C_CloseAllSessions, self, CKR_SLOT_ID_INVALID);
1150
0
    IN_ULONG (slot_id);
1151
0
  PROCESS_CALL;
1152
0
  END_CALL;
1153
0
}
1154
1155
static CK_RV
1156
rpc_C_GetSessionInfo (CK_X_FUNCTION_LIST *self,
1157
                      CK_SESSION_HANDLE session,
1158
                      CK_SESSION_INFO_PTR info)
1159
0
{
1160
0
  return_val_if_fail (info, CKR_ARGUMENTS_BAD);
1161
1162
0
  BEGIN_CALL_OR (C_GetSessionInfo, self, CKR_SESSION_HANDLE_INVALID);
1163
0
    IN_ULONG (session);
1164
0
  PROCESS_CALL;
1165
0
    OUT_SESSION_INFO (info);
1166
0
  END_CALL;
1167
0
}
1168
1169
static CK_RV
1170
rpc_C_InitPIN (CK_X_FUNCTION_LIST *self,
1171
               CK_SESSION_HANDLE session,
1172
               CK_UTF8CHAR_PTR pin,
1173
               CK_ULONG pin_len)
1174
0
{
1175
0
  BEGIN_CALL_OR (C_InitPIN, self, CKR_SESSION_HANDLE_INVALID);
1176
0
    IN_ULONG (session);
1177
0
    IN_BYTE_ARRAY (pin, pin_len);
1178
0
  PROCESS_CALL;
1179
0
  END_CALL;
1180
0
}
1181
1182
static CK_RV
1183
rpc_C_SetPIN (CK_X_FUNCTION_LIST *self,
1184
              CK_SESSION_HANDLE session,
1185
              CK_UTF8CHAR_PTR old_pin,
1186
              CK_ULONG old_pin_len,
1187
              CK_UTF8CHAR_PTR new_pin,
1188
              CK_ULONG new_pin_len)
1189
0
{
1190
0
  BEGIN_CALL_OR (C_SetPIN, self, CKR_SESSION_HANDLE_INVALID);
1191
0
    IN_ULONG (session);
1192
0
    IN_BYTE_ARRAY (old_pin, old_pin_len);
1193
0
    IN_BYTE_ARRAY (new_pin, new_pin_len);
1194
0
  PROCESS_CALL;
1195
0
  END_CALL;
1196
0
}
1197
1198
static CK_RV
1199
rpc_C_GetOperationState (CK_X_FUNCTION_LIST *self,
1200
                         CK_SESSION_HANDLE session,
1201
                         CK_BYTE_PTR operation_state,
1202
                         CK_ULONG_PTR operation_state_len)
1203
0
{
1204
0
  return_val_if_fail (operation_state_len, CKR_ARGUMENTS_BAD);
1205
1206
0
  BEGIN_CALL_OR (C_GetOperationState, self, CKR_SESSION_HANDLE_INVALID);
1207
0
    IN_ULONG (session);
1208
0
    IN_BYTE_BUFFER (operation_state, operation_state_len);
1209
0
  PROCESS_CALL;
1210
0
    OUT_BYTE_ARRAY (operation_state, operation_state_len);
1211
0
  END_CALL;
1212
0
}
1213
1214
static CK_RV
1215
rpc_C_SetOperationState (CK_X_FUNCTION_LIST *self,
1216
                         CK_SESSION_HANDLE session,
1217
                         CK_BYTE_PTR operation_state,
1218
                         CK_ULONG operation_state_len,
1219
                         CK_OBJECT_HANDLE encryption_key,
1220
                         CK_OBJECT_HANDLE authentication_key)
1221
0
{
1222
0
  BEGIN_CALL_OR (C_SetOperationState, self, CKR_SESSION_HANDLE_INVALID);
1223
0
    IN_ULONG (session);
1224
0
    IN_BYTE_ARRAY (operation_state, operation_state_len);
1225
0
    IN_ULONG (encryption_key);
1226
0
    IN_ULONG (authentication_key);
1227
0
  PROCESS_CALL;
1228
0
  END_CALL;
1229
0
}
1230
1231
static CK_RV
1232
rpc_C_Login (CK_X_FUNCTION_LIST *self,
1233
             CK_SESSION_HANDLE session,
1234
             CK_USER_TYPE user_type,
1235
             CK_UTF8CHAR_PTR pin,
1236
             CK_ULONG pin_len)
1237
0
{
1238
0
  BEGIN_CALL_OR (C_Login, self, CKR_SESSION_HANDLE_INVALID);
1239
0
    IN_ULONG (session);
1240
0
    IN_ULONG (user_type);
1241
0
    IN_BYTE_ARRAY (pin, pin_len);
1242
0
  PROCESS_CALL;
1243
0
  END_CALL;
1244
0
}
1245
1246
static CK_RV
1247
rpc_C_Logout (CK_X_FUNCTION_LIST *self,
1248
              CK_SESSION_HANDLE session)
1249
0
{
1250
0
  BEGIN_CALL_OR (C_Logout, self, CKR_SESSION_HANDLE_INVALID);
1251
0
    IN_ULONG (session);
1252
0
  PROCESS_CALL;
1253
0
  END_CALL;
1254
0
}
1255
1256
static CK_RV
1257
rpc_C_CreateObject (CK_X_FUNCTION_LIST *self,
1258
                    CK_SESSION_HANDLE session,
1259
                    CK_ATTRIBUTE_PTR template,
1260
                    CK_ULONG count,
1261
                    CK_OBJECT_HANDLE_PTR new_object)
1262
0
{
1263
0
  return_val_if_fail (new_object, CKR_ARGUMENTS_BAD);
1264
1265
0
  BEGIN_CALL_OR (C_CreateObject, self, CKR_SESSION_HANDLE_INVALID);
1266
0
    IN_ULONG (session);
1267
0
    IN_ATTRIBUTE_ARRAY (template, count);
1268
0
  PROCESS_CALL;
1269
0
    OUT_ULONG (new_object);
1270
0
  END_CALL;
1271
0
}
1272
1273
static CK_RV
1274
rpc_C_CopyObject (CK_X_FUNCTION_LIST *self,
1275
                  CK_SESSION_HANDLE session,
1276
                  CK_OBJECT_HANDLE object,
1277
                  CK_ATTRIBUTE_PTR template,
1278
                  CK_ULONG count,
1279
                  CK_OBJECT_HANDLE_PTR new_object)
1280
0
{
1281
0
  return_val_if_fail (new_object, CKR_ARGUMENTS_BAD);
1282
1283
0
  BEGIN_CALL_OR (C_CopyObject, self, CKR_SESSION_HANDLE_INVALID);
1284
0
    IN_ULONG (session);
1285
0
    IN_ULONG (object);
1286
0
    IN_ATTRIBUTE_ARRAY (template, count);
1287
0
  PROCESS_CALL;
1288
0
    OUT_ULONG (new_object);
1289
0
  END_CALL;
1290
0
}
1291
1292
1293
static CK_RV
1294
rpc_C_DestroyObject (CK_X_FUNCTION_LIST *self,
1295
                     CK_SESSION_HANDLE session,
1296
                     CK_OBJECT_HANDLE object)
1297
0
{
1298
0
  BEGIN_CALL_OR (C_DestroyObject, self, CKR_SESSION_HANDLE_INVALID);
1299
0
    IN_ULONG (session);
1300
0
    IN_ULONG (object);
1301
0
  PROCESS_CALL;
1302
0
  END_CALL;
1303
0
}
1304
1305
static CK_RV
1306
rpc_C_GetObjectSize (CK_X_FUNCTION_LIST *self,
1307
                     CK_SESSION_HANDLE session,
1308
                     CK_OBJECT_HANDLE object,
1309
                     CK_ULONG_PTR size)
1310
0
{
1311
0
  return_val_if_fail (size, CKR_ARGUMENTS_BAD);
1312
1313
0
  BEGIN_CALL_OR (C_GetObjectSize, self, CKR_SESSION_HANDLE_INVALID);
1314
0
    IN_ULONG (session);
1315
0
    IN_ULONG (object);
1316
0
  PROCESS_CALL;
1317
0
    OUT_ULONG (size);
1318
0
  END_CALL;
1319
0
}
1320
1321
static CK_RV
1322
rpc_C_GetAttributeValue (CK_X_FUNCTION_LIST *self,
1323
                         CK_SESSION_HANDLE session,
1324
                         CK_OBJECT_HANDLE object,
1325
                         CK_ATTRIBUTE_PTR template,
1326
                         CK_ULONG count)
1327
0
{
1328
0
  BEGIN_CALL_OR (C_GetAttributeValue, self, CKR_SESSION_HANDLE_INVALID);
1329
0
    IN_ULONG (session);
1330
0
    IN_ULONG (object);
1331
0
    IN_ATTRIBUTE_BUFFER (template, count);
1332
0
  PROCESS_CALL;
1333
0
    OUT_ATTRIBUTE_ARRAY (template, count);
1334
0
  END_CALL;
1335
0
}
1336
1337
static CK_RV
1338
rpc_C_SetAttributeValue (CK_X_FUNCTION_LIST *self,
1339
                         CK_SESSION_HANDLE session,
1340
                         CK_OBJECT_HANDLE object,
1341
                         CK_ATTRIBUTE_PTR template,
1342
                         CK_ULONG count)
1343
0
{
1344
0
  BEGIN_CALL_OR (C_SetAttributeValue, self, CKR_SESSION_HANDLE_INVALID);
1345
0
    IN_ULONG (session);
1346
0
    IN_ULONG (object);
1347
0
    IN_ATTRIBUTE_ARRAY (template, count);
1348
0
  PROCESS_CALL;
1349
0
  END_CALL;
1350
0
}
1351
1352
static CK_RV
1353
rpc_C_FindObjectsInit (CK_X_FUNCTION_LIST *self,
1354
                       CK_SESSION_HANDLE session,
1355
                       CK_ATTRIBUTE_PTR template,
1356
                       CK_ULONG count)
1357
0
{
1358
0
  BEGIN_CALL_OR (C_FindObjectsInit, self, CKR_SESSION_HANDLE_INVALID);
1359
0
    IN_ULONG (session);
1360
0
    IN_ATTRIBUTE_ARRAY (template, count);
1361
0
  PROCESS_CALL;
1362
0
  END_CALL;
1363
0
}
1364
1365
static CK_RV
1366
rpc_C_FindObjects (CK_X_FUNCTION_LIST *self,
1367
                   CK_SESSION_HANDLE session,
1368
                   CK_OBJECT_HANDLE_PTR objects,
1369
                   CK_ULONG max_count,
1370
                   CK_ULONG_PTR count)
1371
0
{
1372
  /* HACK: To fix a stupid gcc warning */
1373
0
  CK_ULONG_PTR address_of_max_count = &max_count;
1374
1375
0
  return_val_if_fail (count, CKR_ARGUMENTS_BAD);
1376
1377
0
  BEGIN_CALL_OR (C_FindObjects, self, CKR_SESSION_HANDLE_INVALID);
1378
0
    IN_ULONG (session);
1379
0
    IN_ULONG_BUFFER (objects, address_of_max_count);
1380
0
  PROCESS_CALL;
1381
0
    *count = max_count;
1382
0
    OUT_ULONG_ARRAY (objects, count);
1383
0
  END_CALL;
1384
0
}
1385
1386
static CK_RV
1387
rpc_C_FindObjectsFinal (CK_X_FUNCTION_LIST *self,
1388
                        CK_SESSION_HANDLE session)
1389
0
{
1390
0
  BEGIN_CALL_OR (C_FindObjectsFinal, self, CKR_SESSION_HANDLE_INVALID);
1391
0
    IN_ULONG (session);
1392
0
  PROCESS_CALL;
1393
0
  END_CALL;
1394
0
}
1395
1396
static CK_RV
1397
rpc_C_EncryptInit (CK_X_FUNCTION_LIST *self,
1398
                   CK_SESSION_HANDLE session,
1399
                   CK_MECHANISM_PTR mechanism,
1400
                   CK_OBJECT_HANDLE key)
1401
0
{
1402
0
  BEGIN_CALL_OR (C_EncryptInit, self, CKR_SESSION_HANDLE_INVALID);
1403
0
    IN_ULONG (session);
1404
0
    IN_MECHANISM (mechanism);
1405
0
    IN_ULONG (key);
1406
0
  PROCESS_CALL;
1407
0
  END_CALL;
1408
0
}
1409
1410
static CK_RV
1411
rpc_C_Encrypt (CK_X_FUNCTION_LIST *self,
1412
               CK_SESSION_HANDLE session,
1413
               CK_BYTE_PTR data,
1414
               CK_ULONG data_len,
1415
               CK_BYTE_PTR encrypted_data,
1416
               CK_ULONG_PTR encrypted_data_len)
1417
0
{
1418
0
  return_val_if_fail (encrypted_data_len, CKR_ARGUMENTS_BAD);
1419
1420
0
  BEGIN_CALL_OR (C_Encrypt, self, CKR_SESSION_HANDLE_INVALID);
1421
0
    IN_ULONG (session);
1422
0
    IN_BYTE_ARRAY (data, data_len);
1423
0
    IN_BYTE_BUFFER (encrypted_data, encrypted_data_len);
1424
0
  PROCESS_CALL;
1425
0
    OUT_BYTE_ARRAY (encrypted_data, encrypted_data_len);
1426
0
  END_CALL;
1427
0
}
1428
1429
static CK_RV
1430
rpc_C_EncryptUpdate (CK_X_FUNCTION_LIST *self,
1431
                     CK_SESSION_HANDLE session,
1432
                     CK_BYTE_PTR part,
1433
                     CK_ULONG part_len,
1434
                     CK_BYTE_PTR encrypted_part,
1435
                     CK_ULONG_PTR encrypted_part_len)
1436
0
{
1437
0
  return_val_if_fail (encrypted_part_len, CKR_ARGUMENTS_BAD);
1438
1439
0
  BEGIN_CALL_OR (C_EncryptUpdate, self, CKR_SESSION_HANDLE_INVALID);
1440
0
    IN_ULONG (session);
1441
0
    IN_BYTE_ARRAY (part, part_len);
1442
0
    IN_BYTE_BUFFER (encrypted_part, encrypted_part_len);
1443
0
  PROCESS_CALL;
1444
0
    OUT_BYTE_ARRAY (encrypted_part, encrypted_part_len);
1445
0
  END_CALL;
1446
0
}
1447
1448
static CK_RV
1449
rpc_C_EncryptFinal (CK_X_FUNCTION_LIST *self,
1450
                    CK_SESSION_HANDLE session,
1451
                    CK_BYTE_PTR last_part,
1452
                    CK_ULONG_PTR last_part_len)
1453
0
{
1454
0
  return_val_if_fail (last_part_len, CKR_ARGUMENTS_BAD);
1455
1456
0
  BEGIN_CALL_OR (C_EncryptFinal, self, CKR_SESSION_HANDLE_INVALID);
1457
0
    IN_ULONG (session);
1458
0
    IN_BYTE_BUFFER (last_part, last_part_len);
1459
0
  PROCESS_CALL;
1460
0
    OUT_BYTE_ARRAY (last_part, last_part_len);
1461
0
  END_CALL;
1462
0
}
1463
1464
static CK_RV
1465
rpc_C_DecryptInit (CK_X_FUNCTION_LIST *self,
1466
                   CK_SESSION_HANDLE session,
1467
                   CK_MECHANISM_PTR mechanism,
1468
                   CK_OBJECT_HANDLE key)
1469
0
{
1470
0
  BEGIN_CALL_OR (C_DecryptInit, self, CKR_SESSION_HANDLE_INVALID);
1471
0
    IN_ULONG (session);
1472
0
    IN_MECHANISM (mechanism);
1473
0
    IN_ULONG (key);
1474
0
  PROCESS_CALL;
1475
0
  END_CALL;
1476
0
}
1477
1478
static CK_RV
1479
rpc_C_Decrypt (CK_X_FUNCTION_LIST *self,
1480
               CK_SESSION_HANDLE session,
1481
               CK_BYTE_PTR enc_data,
1482
               CK_ULONG enc_data_len,
1483
               CK_BYTE_PTR data,
1484
               CK_ULONG_PTR data_len)
1485
0
{
1486
0
  return_val_if_fail (data_len, CKR_ARGUMENTS_BAD);
1487
1488
0
  BEGIN_CALL_OR (C_Decrypt, self, CKR_SESSION_HANDLE_INVALID);
1489
0
    IN_ULONG (session);
1490
0
    IN_BYTE_ARRAY (enc_data, enc_data_len);
1491
0
    IN_BYTE_BUFFER (data, data_len);
1492
0
  PROCESS_CALL;
1493
0
    OUT_BYTE_ARRAY (data, data_len);
1494
0
  END_CALL;
1495
0
}
1496
1497
static CK_RV
1498
rpc_C_DecryptUpdate (CK_X_FUNCTION_LIST *self,
1499
                     CK_SESSION_HANDLE session,
1500
                     CK_BYTE_PTR enc_part,
1501
                     CK_ULONG enc_part_len,
1502
                     CK_BYTE_PTR part,
1503
                     CK_ULONG_PTR part_len)
1504
0
{
1505
0
  return_val_if_fail (part_len, CKR_ARGUMENTS_BAD);
1506
1507
0
  BEGIN_CALL_OR (C_DecryptUpdate, self, CKR_SESSION_HANDLE_INVALID);
1508
0
    IN_ULONG (session);
1509
0
    IN_BYTE_ARRAY (enc_part, enc_part_len);
1510
0
    IN_BYTE_BUFFER (part, part_len);
1511
0
  PROCESS_CALL;
1512
0
    OUT_BYTE_ARRAY (part, part_len);
1513
0
  END_CALL;
1514
0
}
1515
1516
static CK_RV
1517
rpc_C_DecryptFinal (CK_X_FUNCTION_LIST *self,
1518
                    CK_SESSION_HANDLE session,
1519
                    CK_BYTE_PTR last_part,
1520
                    CK_ULONG_PTR last_part_len)
1521
0
{
1522
0
  return_val_if_fail (last_part_len, CKR_ARGUMENTS_BAD);
1523
1524
0
  BEGIN_CALL_OR (C_DecryptFinal, self, CKR_SESSION_HANDLE_INVALID);
1525
0
    IN_ULONG (session);
1526
0
    IN_BYTE_BUFFER (last_part, last_part_len);
1527
0
  PROCESS_CALL;
1528
0
    OUT_BYTE_ARRAY (last_part, last_part_len);
1529
0
  END_CALL;
1530
0
}
1531
1532
static CK_RV
1533
rpc_C_DigestInit (CK_X_FUNCTION_LIST *self,
1534
                  CK_SESSION_HANDLE session,
1535
                  CK_MECHANISM_PTR mechanism)
1536
0
{
1537
0
  BEGIN_CALL_OR (C_DigestInit, self, CKR_SESSION_HANDLE_INVALID);
1538
0
    IN_ULONG (session);
1539
0
    IN_MECHANISM (mechanism);
1540
0
  PROCESS_CALL;
1541
0
  END_CALL;
1542
0
}
1543
1544
static CK_RV
1545
rpc_C_Digest (CK_X_FUNCTION_LIST *self,
1546
              CK_SESSION_HANDLE session,
1547
              CK_BYTE_PTR data,
1548
              CK_ULONG data_len,
1549
              CK_BYTE_PTR digest,
1550
              CK_ULONG_PTR digest_len)
1551
0
{
1552
0
  return_val_if_fail (digest_len, CKR_ARGUMENTS_BAD);
1553
1554
0
  BEGIN_CALL_OR (C_Digest, self, CKR_SESSION_HANDLE_INVALID);
1555
0
    IN_ULONG (session);
1556
0
    IN_BYTE_ARRAY (data, data_len);
1557
0
    IN_BYTE_BUFFER (digest, digest_len);
1558
0
  PROCESS_CALL;
1559
0
    OUT_BYTE_ARRAY (digest, digest_len);
1560
0
  END_CALL;
1561
0
}
1562
1563
static CK_RV
1564
rpc_C_DigestUpdate (CK_X_FUNCTION_LIST *self,
1565
                    CK_SESSION_HANDLE session,
1566
                    CK_BYTE_PTR part,
1567
                    CK_ULONG part_len)
1568
0
{
1569
0
  BEGIN_CALL_OR (C_DigestUpdate, self, CKR_SESSION_HANDLE_INVALID);
1570
0
    IN_ULONG (session);
1571
0
    IN_BYTE_ARRAY (part, part_len);
1572
0
  PROCESS_CALL;
1573
0
  END_CALL;
1574
0
}
1575
1576
static CK_RV
1577
rpc_C_DigestKey (CK_X_FUNCTION_LIST *self,
1578
                 CK_SESSION_HANDLE session,
1579
                 CK_OBJECT_HANDLE key)
1580
0
{
1581
0
  BEGIN_CALL_OR (C_DigestKey, self, CKR_SESSION_HANDLE_INVALID);
1582
0
    IN_ULONG (session);
1583
0
    IN_ULONG (key);
1584
0
  PROCESS_CALL;
1585
0
  END_CALL;
1586
0
}
1587
1588
static CK_RV
1589
rpc_C_DigestFinal (CK_X_FUNCTION_LIST *self,
1590
                   CK_SESSION_HANDLE session,
1591
                   CK_BYTE_PTR digest,
1592
                   CK_ULONG_PTR digest_len)
1593
0
{
1594
0
  return_val_if_fail (digest_len, CKR_ARGUMENTS_BAD);
1595
1596
0
  BEGIN_CALL_OR (C_DigestFinal, self, CKR_SESSION_HANDLE_INVALID);
1597
0
    IN_ULONG (session);
1598
0
    IN_BYTE_BUFFER (digest, digest_len);
1599
0
  PROCESS_CALL;
1600
0
    OUT_BYTE_ARRAY (digest, digest_len);
1601
0
  END_CALL;
1602
0
}
1603
1604
static CK_RV
1605
rpc_C_SignInit (CK_X_FUNCTION_LIST *self,
1606
                CK_SESSION_HANDLE session,
1607
                CK_MECHANISM_PTR mechanism,
1608
                CK_OBJECT_HANDLE key)
1609
0
{
1610
0
  BEGIN_CALL_OR (C_SignInit, self, CKR_SESSION_HANDLE_INVALID);
1611
0
    IN_ULONG (session);
1612
0
    IN_MECHANISM (mechanism);
1613
0
    IN_ULONG (key);
1614
0
  PROCESS_CALL;
1615
0
  END_CALL;
1616
0
}
1617
1618
static CK_RV
1619
rpc_C_Sign (CK_X_FUNCTION_LIST *self,
1620
            CK_SESSION_HANDLE session,
1621
            CK_BYTE_PTR data,
1622
            CK_ULONG data_len,
1623
            CK_BYTE_PTR signature,
1624
            CK_ULONG_PTR signature_len)
1625
0
{
1626
0
  return_val_if_fail (signature_len, CKR_ARGUMENTS_BAD);
1627
1628
0
  BEGIN_CALL_OR (C_Sign, self, CKR_SESSION_HANDLE_INVALID);
1629
0
    IN_ULONG (session);
1630
0
    IN_BYTE_ARRAY (data, data_len);
1631
0
    IN_BYTE_BUFFER (signature, signature_len);
1632
0
  PROCESS_CALL;
1633
0
    OUT_BYTE_ARRAY (signature, signature_len);
1634
0
  END_CALL;
1635
0
}
1636
1637
static CK_RV
1638
rpc_C_SignUpdate (CK_X_FUNCTION_LIST *self,
1639
                  CK_SESSION_HANDLE session,
1640
                  CK_BYTE_PTR part,
1641
                  CK_ULONG part_len)
1642
0
{
1643
0
  BEGIN_CALL_OR (C_SignUpdate, self, CKR_SESSION_HANDLE_INVALID);
1644
0
    IN_ULONG (session);
1645
0
    IN_BYTE_ARRAY (part, part_len);
1646
0
  PROCESS_CALL;
1647
0
  END_CALL;
1648
0
}
1649
1650
static CK_RV
1651
rpc_C_SignFinal (CK_X_FUNCTION_LIST *self,
1652
                 CK_SESSION_HANDLE session,
1653
                 CK_BYTE_PTR signature,
1654
                 CK_ULONG_PTR signature_len)
1655
0
{
1656
0
  return_val_if_fail (signature_len, CKR_ARGUMENTS_BAD);
1657
1658
0
  BEGIN_CALL_OR (C_SignFinal, self, CKR_SESSION_HANDLE_INVALID);
1659
0
    IN_ULONG (session);
1660
0
    IN_BYTE_BUFFER (signature, signature_len);
1661
0
  PROCESS_CALL;
1662
0
    OUT_BYTE_ARRAY (signature, signature_len);
1663
0
  END_CALL;
1664
0
}
1665
1666
static CK_RV
1667
rpc_C_SignRecoverInit (CK_X_FUNCTION_LIST *self,
1668
                       CK_SESSION_HANDLE session,
1669
                       CK_MECHANISM_PTR mechanism,
1670
                       CK_OBJECT_HANDLE key)
1671
0
{
1672
0
  BEGIN_CALL_OR (C_SignRecoverInit, self, CKR_SESSION_HANDLE_INVALID);
1673
0
    IN_ULONG (session);
1674
0
    IN_MECHANISM (mechanism);
1675
0
    IN_ULONG (key);
1676
0
  PROCESS_CALL;
1677
0
  END_CALL;
1678
0
}
1679
1680
static CK_RV
1681
rpc_C_SignRecover (CK_X_FUNCTION_LIST *self,
1682
                   CK_SESSION_HANDLE session,
1683
                   CK_BYTE_PTR data,
1684
                   CK_ULONG data_len,
1685
                   CK_BYTE_PTR signature, CK_ULONG_PTR signature_len)
1686
0
{
1687
0
  return_val_if_fail (signature_len, CKR_ARGUMENTS_BAD);
1688
1689
0
  BEGIN_CALL_OR (C_SignRecover, self, CKR_SESSION_HANDLE_INVALID);
1690
0
    IN_ULONG (session);
1691
0
    IN_BYTE_ARRAY (data, data_len);
1692
0
    IN_BYTE_BUFFER (signature, signature_len);
1693
0
  PROCESS_CALL;
1694
0
    OUT_BYTE_ARRAY (signature, signature_len);
1695
0
  END_CALL;
1696
0
}
1697
1698
static CK_RV
1699
rpc_C_VerifyInit (CK_X_FUNCTION_LIST *self,
1700
                  CK_SESSION_HANDLE session,
1701
                  CK_MECHANISM_PTR mechanism,
1702
                  CK_OBJECT_HANDLE key)
1703
0
{
1704
0
  BEGIN_CALL_OR (C_VerifyInit, self, CKR_SESSION_HANDLE_INVALID);
1705
0
    IN_ULONG (session);
1706
0
    IN_MECHANISM (mechanism);
1707
0
    IN_ULONG (key);
1708
0
  PROCESS_CALL;
1709
0
  END_CALL;
1710
0
}
1711
1712
static CK_RV
1713
rpc_C_Verify (CK_X_FUNCTION_LIST *self,
1714
              CK_SESSION_HANDLE session,
1715
              CK_BYTE_PTR data,
1716
              CK_ULONG data_len,
1717
              CK_BYTE_PTR signature,
1718
              CK_ULONG signature_len)
1719
0
{
1720
0
  BEGIN_CALL_OR (C_Verify, self, CKR_SESSION_HANDLE_INVALID);
1721
0
    IN_ULONG (session);
1722
0
    IN_BYTE_ARRAY (data, data_len);
1723
0
    IN_BYTE_ARRAY (signature, signature_len);
1724
0
  PROCESS_CALL;
1725
0
  END_CALL;
1726
0
}
1727
1728
static CK_RV
1729
rpc_C_VerifyUpdate (CK_X_FUNCTION_LIST *self,
1730
                    CK_SESSION_HANDLE session,
1731
                    CK_BYTE_PTR part,
1732
                    CK_ULONG part_len)
1733
0
{
1734
0
  BEGIN_CALL_OR (C_VerifyUpdate, self, CKR_SESSION_HANDLE_INVALID);
1735
0
    IN_ULONG (session);
1736
0
    IN_BYTE_ARRAY (part, part_len);
1737
0
  PROCESS_CALL;
1738
0
  END_CALL;
1739
0
}
1740
1741
static CK_RV
1742
rpc_C_VerifyFinal (CK_X_FUNCTION_LIST *self,
1743
                   CK_SESSION_HANDLE session,
1744
                   CK_BYTE_PTR signature,
1745
                   CK_ULONG signature_len)
1746
0
{
1747
0
  BEGIN_CALL_OR (C_VerifyFinal, self, CKR_SESSION_HANDLE_INVALID);
1748
0
    IN_ULONG (session);
1749
0
    IN_BYTE_ARRAY (signature, signature_len);
1750
0
  PROCESS_CALL;
1751
0
  END_CALL;
1752
0
}
1753
1754
static CK_RV
1755
rpc_C_VerifyRecoverInit (CK_X_FUNCTION_LIST *self,
1756
                         CK_SESSION_HANDLE session,
1757
                         CK_MECHANISM_PTR mechanism,
1758
                         CK_OBJECT_HANDLE key)
1759
0
{
1760
0
  BEGIN_CALL_OR (C_VerifyRecoverInit, self, CKR_SESSION_HANDLE_INVALID);
1761
0
    IN_ULONG (session);
1762
0
    IN_MECHANISM (mechanism);
1763
0
    IN_ULONG (key);
1764
0
  PROCESS_CALL;
1765
0
  END_CALL;
1766
0
}
1767
1768
static CK_RV
1769
rpc_C_VerifyRecover (CK_X_FUNCTION_LIST *self,
1770
                     CK_SESSION_HANDLE session,
1771
                     CK_BYTE_PTR signature,
1772
                     CK_ULONG signature_len,
1773
                     CK_BYTE_PTR data,
1774
                     CK_ULONG_PTR data_len)
1775
0
{
1776
0
  return_val_if_fail (data_len, CKR_ARGUMENTS_BAD);
1777
1778
0
  BEGIN_CALL_OR (C_VerifyRecover, self, CKR_SESSION_HANDLE_INVALID);
1779
0
    IN_ULONG (session);
1780
0
    IN_BYTE_ARRAY (signature, signature_len);
1781
0
    IN_BYTE_BUFFER (data, data_len);
1782
0
  PROCESS_CALL;
1783
0
    OUT_BYTE_ARRAY (data, data_len);
1784
0
  END_CALL;
1785
0
}
1786
1787
static CK_RV
1788
rpc_C_DigestEncryptUpdate (CK_X_FUNCTION_LIST *self,
1789
                           CK_SESSION_HANDLE session,
1790
                           CK_BYTE_PTR part,
1791
                           CK_ULONG part_len,
1792
                           CK_BYTE_PTR enc_part,
1793
                           CK_ULONG_PTR enc_part_len)
1794
0
{
1795
0
  return_val_if_fail (enc_part_len, CKR_ARGUMENTS_BAD);
1796
1797
0
  BEGIN_CALL_OR (C_DigestEncryptUpdate, self, CKR_SESSION_HANDLE_INVALID);
1798
0
    IN_ULONG (session);
1799
0
    IN_BYTE_ARRAY (part, part_len);
1800
0
    IN_BYTE_BUFFER (enc_part, enc_part_len);
1801
0
  PROCESS_CALL;
1802
0
    OUT_BYTE_ARRAY (enc_part, enc_part_len);
1803
0
  END_CALL;
1804
0
}
1805
1806
static CK_RV
1807
rpc_C_DecryptDigestUpdate (CK_X_FUNCTION_LIST *self,
1808
                           CK_SESSION_HANDLE session,
1809
                           CK_BYTE_PTR enc_part,
1810
                           CK_ULONG enc_part_len,
1811
                           CK_BYTE_PTR part,
1812
                           CK_ULONG_PTR part_len)
1813
0
{
1814
0
  return_val_if_fail (part_len, CKR_ARGUMENTS_BAD);
1815
1816
0
  BEGIN_CALL_OR (C_DecryptDigestUpdate, self, CKR_SESSION_HANDLE_INVALID);
1817
0
    IN_ULONG (session);
1818
0
    IN_BYTE_ARRAY (enc_part, enc_part_len);
1819
0
    IN_BYTE_BUFFER (part, part_len);
1820
0
  PROCESS_CALL;
1821
0
    OUT_BYTE_ARRAY (part, part_len);
1822
0
  END_CALL;
1823
0
}
1824
1825
static CK_RV
1826
rpc_C_SignEncryptUpdate (CK_X_FUNCTION_LIST *self,
1827
                         CK_SESSION_HANDLE session,
1828
                         CK_BYTE_PTR part,
1829
                         CK_ULONG part_len,
1830
                         CK_BYTE_PTR enc_part,
1831
                         CK_ULONG_PTR enc_part_len)
1832
0
{
1833
0
  return_val_if_fail (enc_part_len, CKR_ARGUMENTS_BAD);
1834
1835
0
  BEGIN_CALL_OR (C_SignEncryptUpdate, self, CKR_SESSION_HANDLE_INVALID);
1836
0
    IN_ULONG (session);
1837
0
    IN_BYTE_ARRAY (part, part_len);
1838
0
    IN_BYTE_BUFFER (enc_part, enc_part_len);
1839
0
  PROCESS_CALL;
1840
0
    OUT_BYTE_ARRAY (enc_part, enc_part_len);
1841
0
  END_CALL;
1842
0
}
1843
1844
static CK_RV
1845
rpc_C_DecryptVerifyUpdate (CK_X_FUNCTION_LIST *self,
1846
                           CK_SESSION_HANDLE session,
1847
                           CK_BYTE_PTR enc_part,
1848
                           CK_ULONG enc_part_len,
1849
                           CK_BYTE_PTR part,
1850
                           CK_ULONG_PTR part_len)
1851
0
{
1852
0
  return_val_if_fail (part_len, CKR_ARGUMENTS_BAD);
1853
1854
0
  BEGIN_CALL_OR (C_DecryptVerifyUpdate, self, CKR_SESSION_HANDLE_INVALID);
1855
0
    IN_ULONG (session);
1856
0
    IN_BYTE_ARRAY (enc_part, enc_part_len);
1857
0
    IN_BYTE_BUFFER (part, part_len);
1858
0
  PROCESS_CALL;
1859
0
    OUT_BYTE_ARRAY (part, part_len);
1860
0
  END_CALL;
1861
0
}
1862
1863
static CK_RV
1864
rpc_C_GenerateKey (CK_X_FUNCTION_LIST *self,
1865
                   CK_SESSION_HANDLE session,
1866
                   CK_MECHANISM_PTR mechanism,
1867
                   CK_ATTRIBUTE_PTR template,
1868
                   CK_ULONG count,
1869
                   CK_OBJECT_HANDLE_PTR key)
1870
0
{
1871
0
  BEGIN_CALL_OR (C_GenerateKey, self, CKR_SESSION_HANDLE_INVALID);
1872
0
    IN_ULONG (session);
1873
0
    IN_MECHANISM (mechanism);
1874
0
    IN_ATTRIBUTE_ARRAY (template, count);
1875
0
  PROCESS_CALL;
1876
0
    OUT_ULONG (key);
1877
0
  END_CALL;
1878
0
}
1879
1880
static CK_RV
1881
rpc_C_GenerateKeyPair (CK_X_FUNCTION_LIST *self,
1882
                       CK_SESSION_HANDLE session,
1883
                       CK_MECHANISM_PTR mechanism,
1884
                       CK_ATTRIBUTE_PTR pub_template,
1885
                       CK_ULONG pub_count,
1886
                       CK_ATTRIBUTE_PTR priv_template,
1887
                       CK_ULONG priv_count,
1888
                       CK_OBJECT_HANDLE_PTR pub_key,
1889
                       CK_OBJECT_HANDLE_PTR priv_key)
1890
0
{
1891
0
  BEGIN_CALL_OR (C_GenerateKeyPair, self, CKR_SESSION_HANDLE_INVALID);
1892
0
    IN_ULONG (session);
1893
0
    IN_MECHANISM (mechanism);
1894
0
    IN_ATTRIBUTE_ARRAY (pub_template, pub_count);
1895
0
    IN_ATTRIBUTE_ARRAY (priv_template, priv_count);
1896
0
  PROCESS_CALL;
1897
0
    OUT_ULONG (pub_key);
1898
0
    OUT_ULONG (priv_key);
1899
0
  END_CALL;
1900
0
}
1901
1902
static CK_RV
1903
rpc_C_WrapKey (CK_X_FUNCTION_LIST *self,
1904
               CK_SESSION_HANDLE session,
1905
               CK_MECHANISM_PTR mechanism,
1906
               CK_OBJECT_HANDLE wrapping_key,
1907
               CK_OBJECT_HANDLE key,
1908
               CK_BYTE_PTR wrapped_key,
1909
               CK_ULONG_PTR wrapped_key_len)
1910
0
{
1911
0
  return_val_if_fail (wrapped_key_len, CKR_ARGUMENTS_BAD);
1912
1913
0
  BEGIN_CALL_OR (C_WrapKey, self, CKR_SESSION_HANDLE_INVALID);
1914
0
    IN_ULONG (session);
1915
0
    IN_MECHANISM (mechanism);
1916
0
    IN_ULONG (wrapping_key);
1917
0
    IN_ULONG (key);
1918
0
    IN_BYTE_BUFFER (wrapped_key, wrapped_key_len);
1919
0
  PROCESS_CALL;
1920
0
    OUT_BYTE_ARRAY (wrapped_key, wrapped_key_len);
1921
0
  END_CALL;
1922
0
}
1923
1924
static CK_RV
1925
rpc_C_UnwrapKey (CK_X_FUNCTION_LIST *self,
1926
                 CK_SESSION_HANDLE session,
1927
                 CK_MECHANISM_PTR mechanism,
1928
                 CK_OBJECT_HANDLE unwrapping_key,
1929
                 CK_BYTE_PTR wrapped_key,
1930
                 CK_ULONG wrapped_key_len,
1931
                 CK_ATTRIBUTE_PTR template,
1932
                 CK_ULONG count,
1933
                 CK_OBJECT_HANDLE_PTR key)
1934
0
{
1935
0
  BEGIN_CALL_OR (C_UnwrapKey, self, CKR_SESSION_HANDLE_INVALID);
1936
0
    IN_ULONG (session);
1937
0
    IN_MECHANISM (mechanism);
1938
0
    IN_ULONG (unwrapping_key);
1939
0
    IN_BYTE_ARRAY (wrapped_key, wrapped_key_len);
1940
0
    IN_ATTRIBUTE_ARRAY (template, count);
1941
0
  PROCESS_CALL;
1942
0
    OUT_ULONG (key);
1943
0
  END_CALL;
1944
0
}
1945
1946
static CK_RV
1947
C_DeriveKey1 (CK_X_FUNCTION_LIST *self,
1948
              CK_SESSION_HANDLE session,
1949
              CK_MECHANISM_PTR mechanism,
1950
              CK_OBJECT_HANDLE base_key,
1951
              CK_ATTRIBUTE_PTR template,
1952
              CK_ULONG count,
1953
              CK_OBJECT_HANDLE_PTR key)
1954
0
{
1955
0
  BEGIN_CALL_OR (C_DeriveKey, self, CKR_SESSION_HANDLE_INVALID);
1956
0
    IN_ULONG (session);
1957
0
    IN_MECHANISM (mechanism);
1958
0
    IN_ULONG (base_key);
1959
0
    IN_ATTRIBUTE_ARRAY (template, count);
1960
0
  PROCESS_CALL;
1961
0
    OUT_ULONG (key);
1962
0
  END_CALL;
1963
0
}
1964
1965
static CK_RV
1966
C_DeriveKey2 (CK_X_FUNCTION_LIST *self,
1967
              CK_SESSION_HANDLE session,
1968
              CK_MECHANISM_PTR mechanism,
1969
              CK_OBJECT_HANDLE base_key,
1970
              CK_ATTRIBUTE_PTR template,
1971
              CK_ULONG count,
1972
              CK_OBJECT_HANDLE_PTR key)
1973
0
{
1974
0
  PREP_EEOF;
1975
0
  BEGIN_CALL_OR (C_DeriveKey2, self, CKR_SESSION_HANDLE_INVALID);
1976
0
    IN_ULONG (session);
1977
0
    IN_MECHANISM (mechanism);
1978
0
    IN_ULONG (base_key);
1979
0
    IN_ATTRIBUTE_ARRAY (template, count);
1980
0
  PROCESS_CALL_NO_CHECK;
1981
0
    OUT_ERROR (err);
1982
0
    OUT_MECH_PARAM_UPDATE (mechanism);
1983
0
    CHECK_EEOF;
1984
0
    OUT_ULONG (key);
1985
0
  END_CALL;
1986
0
}
1987
1988
static CK_RV
1989
rpc_C_DeriveKey (CK_X_FUNCTION_LIST *self,
1990
                 CK_SESSION_HANDLE session,
1991
                 CK_MECHANISM_PTR mechanism,
1992
                 CK_OBJECT_HANDLE base_key,
1993
                 CK_ATTRIBUTE_PTR template,
1994
                 CK_ULONG count,
1995
                 CK_OBJECT_HANDLE_PTR key)
1996
0
{
1997
0
  uint8_t version = RPC_VERSION;
1998
1999
0
  if (version <= 1)
2000
0
    return C_DeriveKey1 (self, session, mechanism, base_key, template, count, key);
2001
0
  else
2002
0
    return C_DeriveKey2 (self, session, mechanism, base_key, template, count, key);
2003
0
}
2004
2005
static CK_RV
2006
rpc_C_SeedRandom (CK_X_FUNCTION_LIST *self,
2007
                  CK_SESSION_HANDLE session,
2008
                  CK_BYTE_PTR seed,
2009
                  CK_ULONG seed_len)
2010
0
{
2011
0
  BEGIN_CALL_OR (C_SeedRandom, self, CKR_SESSION_HANDLE_INVALID);
2012
0
    IN_ULONG (session);
2013
0
    IN_BYTE_ARRAY (seed, seed_len);
2014
0
  PROCESS_CALL;
2015
0
  END_CALL;
2016
0
}
2017
2018
static CK_RV
2019
rpc_C_GenerateRandom (CK_X_FUNCTION_LIST *self,
2020
                      CK_SESSION_HANDLE session,
2021
                      CK_BYTE_PTR random_data,
2022
                      CK_ULONG random_len)
2023
0
{
2024
0
  CK_ULONG_PTR address = &random_len;
2025
2026
0
  BEGIN_CALL_OR (C_GenerateRandom, self, CKR_SESSION_HANDLE_INVALID);
2027
0
    IN_ULONG (session);
2028
0
    IN_BYTE_BUFFER (random_data, address);
2029
0
  PROCESS_CALL;
2030
0
    OUT_BYTE_ARRAY (random_data, address);
2031
0
  END_CALL;
2032
0
}
2033
2034
static CK_RV
2035
rpc_C_LoginUser (CK_X_FUNCTION_LIST *self,
2036
                 CK_SESSION_HANDLE session,
2037
                 CK_USER_TYPE user_type,
2038
                 CK_UTF8CHAR_PTR pin,
2039
                 CK_ULONG pin_len,
2040
                 CK_UTF8CHAR_PTR username,
2041
                 CK_ULONG username_len)
2042
0
{
2043
0
  BEGIN_CALL_OR (C_LoginUser, self, CKR_SESSION_HANDLE_INVALID);
2044
0
    IN_ULONG (session)
2045
0
    IN_ULONG (user_type)
2046
0
    IN_BYTE_ARRAY (pin, pin_len)
2047
0
    IN_BYTE_ARRAY (username, username_len)
2048
0
  PROCESS_CALL;
2049
0
  END_CALL;
2050
0
}
2051
2052
static CK_RV
2053
rpc_C_SessionCancel (CK_X_FUNCTION_LIST *self,
2054
                     CK_SESSION_HANDLE session,
2055
                     CK_FLAGS flags)
2056
0
{
2057
0
  BEGIN_CALL_OR (C_SessionCancel, self, CKR_SESSION_HANDLE_INVALID);
2058
0
    IN_ULONG (session)
2059
0
    IN_ULONG (flags)
2060
0
  PROCESS_CALL;
2061
0
  END_CALL;
2062
0
}
2063
2064
static CK_RV
2065
rpc_C_MessageEncryptInit (CK_X_FUNCTION_LIST *self,
2066
                          CK_SESSION_HANDLE session,
2067
                          CK_MECHANISM_PTR mechanism,
2068
                          CK_OBJECT_HANDLE key)
2069
0
{
2070
0
  BEGIN_CALL_OR (C_MessageEncryptInit, self, CKR_SESSION_HANDLE_INVALID);
2071
0
    IN_ULONG (session)
2072
0
    IN_MECHANISM (mechanism)
2073
0
    IN_ULONG (key)
2074
0
  PROCESS_CALL;
2075
0
  END_CALL;
2076
0
}
2077
2078
static CK_RV
2079
rpc_C_EncryptMessage (CK_X_FUNCTION_LIST *self,
2080
                      CK_SESSION_HANDLE session,
2081
                      CK_VOID_PTR parameter,
2082
                      CK_ULONG parameter_len,
2083
                      CK_BYTE_PTR associated_data,
2084
                      CK_ULONG associated_data_len,
2085
                      CK_BYTE_PTR plaintext,
2086
                      CK_ULONG plaintext_len,
2087
                      CK_BYTE_PTR ciphertext,
2088
                      CK_ULONG_PTR ciphertext_len)
2089
0
{
2090
0
  return_val_if_fail (ciphertext_len, CKR_ARGUMENTS_BAD);
2091
2092
0
  BEGIN_CALL_OR (C_EncryptMessage, self, CKR_SESSION_HANDLE_INVALID);
2093
0
    IN_ULONG (session)
2094
0
    IN_BYTE_ARRAY (parameter, parameter_len)
2095
0
    IN_BYTE_ARRAY (associated_data, associated_data_len)
2096
0
    IN_BYTE_ARRAY (plaintext, plaintext_len)
2097
0
    IN_BYTE_BUFFER (ciphertext, ciphertext_len);
2098
0
  PROCESS_CALL;
2099
0
    OUT_BYTE_ARRAY (ciphertext, ciphertext_len)
2100
0
  END_CALL;
2101
0
}
2102
2103
static CK_RV
2104
rpc_C_EncryptMessageBegin (CK_X_FUNCTION_LIST *self,
2105
                           CK_SESSION_HANDLE session,
2106
                           CK_VOID_PTR parameter,
2107
                           CK_ULONG parameter_len,
2108
                           CK_BYTE_PTR associated_data,
2109
                           CK_ULONG associated_data_len)
2110
0
{
2111
0
  BEGIN_CALL_OR (C_EncryptMessageBegin, self, CKR_SESSION_HANDLE_INVALID);
2112
0
    IN_ULONG (session)
2113
0
    IN_BYTE_ARRAY (parameter, parameter_len)
2114
0
    IN_BYTE_ARRAY (associated_data, associated_data_len)
2115
0
  PROCESS_CALL;
2116
0
  END_CALL;
2117
0
}
2118
2119
static CK_RV
2120
rpc_C_EncryptMessageNext (CK_X_FUNCTION_LIST *self,
2121
                          CK_SESSION_HANDLE session,
2122
                          CK_VOID_PTR parameter,
2123
                          CK_ULONG parameter_len,
2124
                          CK_BYTE_PTR plaintext_part,
2125
                          CK_ULONG plaintext_part_len,
2126
                          CK_BYTE_PTR ciphertext_part,
2127
                          CK_ULONG_PTR ciphertext_part_len,
2128
                          CK_FLAGS flags)
2129
0
{
2130
0
  BEGIN_CALL_OR (C_EncryptMessageNext, self, CKR_SESSION_HANDLE_INVALID);
2131
0
    IN_ULONG (session)
2132
0
    IN_BYTE_ARRAY (parameter, parameter_len)
2133
0
    IN_BYTE_ARRAY (plaintext_part, plaintext_part_len)
2134
0
    IN_BYTE_BUFFER (ciphertext_part, ciphertext_part_len);
2135
0
    IN_ULONG (flags)
2136
0
  PROCESS_CALL;
2137
0
    OUT_BYTE_ARRAY (ciphertext_part, ciphertext_part_len)
2138
0
  END_CALL;
2139
0
}
2140
2141
static CK_RV
2142
rpc_C_MessageEncryptFinal (CK_X_FUNCTION_LIST *self,
2143
                           CK_SESSION_HANDLE session)
2144
0
{
2145
0
  BEGIN_CALL_OR (C_MessageEncryptFinal, self, CKR_SESSION_HANDLE_INVALID);
2146
0
    IN_ULONG (session)
2147
0
  PROCESS_CALL;
2148
0
  END_CALL;
2149
0
}
2150
2151
static CK_RV
2152
rpc_C_MessageDecryptInit (CK_X_FUNCTION_LIST *self,
2153
                          CK_SESSION_HANDLE session,
2154
                          CK_MECHANISM_PTR mechanism,
2155
                          CK_OBJECT_HANDLE key)
2156
0
{
2157
0
  BEGIN_CALL_OR (C_MessageDecryptInit, self, CKR_SESSION_HANDLE_INVALID);
2158
0
    IN_ULONG (session)
2159
0
    IN_MECHANISM (mechanism)
2160
0
    IN_ULONG (key)
2161
0
  PROCESS_CALL;
2162
0
  END_CALL;
2163
0
}
2164
2165
static CK_RV
2166
rpc_C_DecryptMessage (CK_X_FUNCTION_LIST *self,
2167
                      CK_SESSION_HANDLE session,
2168
                      CK_VOID_PTR parameter,
2169
                      CK_ULONG parameter_len,
2170
                      CK_BYTE_PTR associated_data,
2171
                      CK_ULONG associated_data_len,
2172
                      CK_BYTE_PTR ciphertext,
2173
                      CK_ULONG ciphertext_len,
2174
                      CK_BYTE_PTR plaintext,
2175
                      CK_ULONG_PTR plaintext_len)
2176
0
{
2177
0
  return_val_if_fail (plaintext_len, CKR_ARGUMENTS_BAD);
2178
2179
0
  BEGIN_CALL_OR (C_DecryptMessage, self, CKR_SESSION_HANDLE_INVALID);
2180
0
    IN_ULONG (session)
2181
0
    IN_BYTE_ARRAY (parameter, parameter_len)
2182
0
    IN_BYTE_ARRAY (associated_data, associated_data_len)
2183
0
    IN_BYTE_ARRAY (ciphertext, ciphertext_len)
2184
0
    IN_BYTE_BUFFER (plaintext, plaintext_len);
2185
0
  PROCESS_CALL;
2186
0
    OUT_BYTE_ARRAY (plaintext, plaintext_len)
2187
0
  END_CALL;
2188
0
}
2189
2190
static CK_RV
2191
rpc_C_DecryptMessageBegin (CK_X_FUNCTION_LIST *self,
2192
                           CK_SESSION_HANDLE session,
2193
                           CK_VOID_PTR parameter,
2194
                           CK_ULONG parameter_len,
2195
                           CK_BYTE_PTR associated_data,
2196
                           CK_ULONG associated_data_len)
2197
0
{
2198
0
  BEGIN_CALL_OR (C_DecryptMessageBegin, self, CKR_SESSION_HANDLE_INVALID);
2199
0
    IN_ULONG (session)
2200
0
    IN_BYTE_ARRAY (parameter, parameter_len)
2201
0
    IN_BYTE_ARRAY (associated_data, associated_data_len)
2202
0
  PROCESS_CALL;
2203
0
  END_CALL;
2204
0
}
2205
2206
static CK_RV
2207
rpc_C_DecryptMessageNext (CK_X_FUNCTION_LIST *self,
2208
                          CK_SESSION_HANDLE session,
2209
                          CK_VOID_PTR parameter,
2210
                          CK_ULONG parameter_len,
2211
                          CK_BYTE_PTR ciphertext_part,
2212
                          CK_ULONG ciphertext_part_len,
2213
                          CK_BYTE_PTR plaintext_part,
2214
                          CK_ULONG_PTR plaintext_part_len,
2215
                          CK_FLAGS flags)
2216
0
{
2217
0
  BEGIN_CALL_OR (C_DecryptMessageNext, self, CKR_SESSION_HANDLE_INVALID);
2218
0
    IN_ULONG (session)
2219
0
    IN_BYTE_ARRAY (parameter, parameter_len)
2220
0
    IN_BYTE_ARRAY (ciphertext_part, ciphertext_part_len)
2221
0
    IN_BYTE_BUFFER (plaintext_part, plaintext_part_len);
2222
0
    IN_ULONG (flags)
2223
0
  PROCESS_CALL;
2224
0
    OUT_BYTE_ARRAY (plaintext_part, plaintext_part_len)
2225
0
  END_CALL;
2226
0
}
2227
2228
static CK_RV
2229
rpc_C_MessageDecryptFinal (CK_X_FUNCTION_LIST *self,
2230
                           CK_SESSION_HANDLE session)
2231
0
{
2232
0
  BEGIN_CALL_OR (C_MessageDecryptFinal, self, CKR_SESSION_HANDLE_INVALID);
2233
0
    IN_ULONG (session)
2234
0
  PROCESS_CALL;
2235
0
  END_CALL;
2236
0
}
2237
2238
static CK_RV
2239
rpc_C_MessageSignInit (CK_X_FUNCTION_LIST *self,
2240
                       CK_SESSION_HANDLE session,
2241
                       CK_MECHANISM_PTR mechanism,
2242
                       CK_OBJECT_HANDLE key)
2243
0
{
2244
0
  BEGIN_CALL_OR (C_MessageSignInit, self, CKR_SESSION_HANDLE_INVALID);
2245
0
    IN_ULONG (session)
2246
0
    IN_MECHANISM (mechanism)
2247
0
    IN_ULONG (key)
2248
0
  PROCESS_CALL;
2249
0
  END_CALL;
2250
0
}
2251
2252
static CK_RV
2253
rpc_C_SignMessage (CK_X_FUNCTION_LIST *self,
2254
                   CK_SESSION_HANDLE session,
2255
                   CK_VOID_PTR parameter,
2256
                   CK_ULONG parameter_len,
2257
                   CK_BYTE_PTR data,
2258
                   CK_ULONG data_len,
2259
                   CK_BYTE_PTR signature,
2260
                   CK_ULONG_PTR signature_len)
2261
0
{
2262
0
  return_val_if_fail (signature_len, CKR_ARGUMENTS_BAD);
2263
2264
0
  BEGIN_CALL_OR (C_SignMessage, self, CKR_SESSION_HANDLE_INVALID);
2265
0
    IN_ULONG (session)
2266
0
    IN_BYTE_ARRAY (parameter, parameter_len)
2267
0
    IN_BYTE_ARRAY (data, data_len)
2268
0
    IN_BYTE_BUFFER (signature, signature_len);
2269
0
  PROCESS_CALL;
2270
0
    OUT_BYTE_ARRAY (signature, signature_len)
2271
0
  END_CALL;
2272
0
}
2273
2274
static CK_RV
2275
rpc_C_SignMessageBegin (CK_X_FUNCTION_LIST *self,
2276
                        CK_SESSION_HANDLE session,
2277
                        CK_VOID_PTR parameter,
2278
                        CK_ULONG parameter_len)
2279
0
{
2280
0
  BEGIN_CALL_OR (C_SignMessageBegin, self, CKR_SESSION_HANDLE_INVALID);
2281
0
    IN_ULONG (session)
2282
0
    IN_BYTE_ARRAY (parameter, parameter_len)
2283
0
  PROCESS_CALL;
2284
0
  END_CALL;
2285
0
}
2286
2287
static CK_RV
2288
rpc_C_SignMessageNext (CK_X_FUNCTION_LIST *self,
2289
                       CK_SESSION_HANDLE session,
2290
                       CK_VOID_PTR parameter,
2291
                       CK_ULONG parameter_len,
2292
                       CK_BYTE_PTR data,
2293
                       CK_ULONG data_len,
2294
                       CK_BYTE_PTR signature,
2295
                       CK_ULONG_PTR signature_len)
2296
0
{
2297
0
        CK_ULONG null_len = 0;
2298
0
        CK_BBOOL signature_expected = signature_len ? 1 : 0;
2299
2300
0
  BEGIN_CALL_OR (C_SignMessageNext, self, CKR_SESSION_HANDLE_INVALID);
2301
0
    IN_ULONG (session)
2302
0
    IN_BYTE_ARRAY (parameter, parameter_len)
2303
0
    IN_BYTE_ARRAY (data, data_len)
2304
0
    IN_BYTE (signature_expected)
2305
0
    IN_BYTE_BUFFER ((signature_expected ? signature : NULL),
2306
0
        (signature_expected ? signature_len : &null_len))
2307
0
  PROCESS_CALL;
2308
0
    OUT_BYTE_ARRAY ((signature_expected ? signature : NULL),
2309
0
        (signature_expected ? signature_len : &null_len))
2310
0
  END_CALL;
2311
0
}
2312
2313
static CK_RV
2314
rpc_C_MessageSignFinal (CK_X_FUNCTION_LIST *self,
2315
                        CK_SESSION_HANDLE session)
2316
0
{
2317
0
  BEGIN_CALL_OR (C_MessageSignFinal, self, CKR_SESSION_HANDLE_INVALID);
2318
0
    IN_ULONG (session)
2319
0
  PROCESS_CALL;
2320
0
  END_CALL;
2321
0
}
2322
2323
static CK_RV
2324
rpc_C_MessageVerifyInit (CK_X_FUNCTION_LIST *self,
2325
                         CK_SESSION_HANDLE session,
2326
                         CK_MECHANISM_PTR mechanism,
2327
                         CK_OBJECT_HANDLE key)
2328
0
{
2329
0
  BEGIN_CALL_OR (C_MessageVerifyInit, self, CKR_SESSION_HANDLE_INVALID);
2330
0
    IN_ULONG (session)
2331
0
    IN_MECHANISM (mechanism)
2332
0
    IN_ULONG (key)
2333
0
  PROCESS_CALL;
2334
0
  END_CALL;
2335
0
}
2336
2337
static CK_RV
2338
rpc_C_VerifyMessage (CK_X_FUNCTION_LIST *self,
2339
                     CK_SESSION_HANDLE session,
2340
                     CK_VOID_PTR parameter,
2341
                     CK_ULONG parameter_len,
2342
                     CK_BYTE_PTR data,
2343
                     CK_ULONG data_len,
2344
                     CK_BYTE_PTR signature,
2345
                     CK_ULONG signature_len)
2346
0
{
2347
0
  BEGIN_CALL_OR (C_VerifyMessage, self, CKR_SESSION_HANDLE_INVALID);
2348
0
    IN_ULONG (session)
2349
0
    IN_BYTE_ARRAY (parameter, parameter_len)
2350
0
    IN_BYTE_ARRAY (data, data_len)
2351
0
    IN_BYTE_ARRAY (signature, signature_len)
2352
0
  PROCESS_CALL;
2353
0
  END_CALL;
2354
0
}
2355
2356
static CK_RV
2357
rpc_C_VerifyMessageBegin (CK_X_FUNCTION_LIST *self,
2358
                          CK_SESSION_HANDLE session,
2359
                          CK_VOID_PTR parameter,
2360
                          CK_ULONG parameter_len)
2361
0
{
2362
0
  BEGIN_CALL_OR (C_VerifyMessageBegin, self, CKR_SESSION_HANDLE_INVALID);
2363
0
    IN_ULONG (session)
2364
0
    IN_BYTE_ARRAY (parameter, parameter_len)
2365
0
  PROCESS_CALL;
2366
0
  END_CALL;
2367
0
}
2368
2369
static CK_RV
2370
rpc_C_VerifyMessageNext (CK_X_FUNCTION_LIST *self,
2371
                         CK_SESSION_HANDLE session,
2372
                         CK_VOID_PTR parameter,
2373
                         CK_ULONG parameter_len,
2374
                         CK_BYTE_PTR data,
2375
                         CK_ULONG data_len,
2376
                         CK_BYTE_PTR signature,
2377
                         CK_ULONG signature_len)
2378
0
{
2379
0
  BEGIN_CALL_OR (C_VerifyMessageNext, self, CKR_SESSION_HANDLE_INVALID);
2380
0
    IN_ULONG (session)
2381
0
    IN_BYTE_ARRAY (parameter, parameter_len)
2382
0
    IN_BYTE_ARRAY (data, data_len)
2383
0
    IN_BYTE_ARRAY (signature, signature_len)
2384
0
  PROCESS_CALL;
2385
0
  END_CALL;
2386
0
}
2387
2388
static CK_RV
2389
rpc_C_MessageVerifyFinal (CK_X_FUNCTION_LIST *self,
2390
                          CK_SESSION_HANDLE session)
2391
0
{
2392
0
  BEGIN_CALL_OR (C_MessageVerifyFinal, self, CKR_SESSION_HANDLE_INVALID);
2393
0
    IN_ULONG (session)
2394
0
  PROCESS_CALL;
2395
0
  END_CALL;
2396
0
}
2397
2398
static CK_X_FUNCTION_LIST rpc_functions = {
2399
  { -1, -1 },
2400
  rpc_C_Initialize,
2401
  rpc_C_Finalize,
2402
  rpc_C_GetInfo,
2403
  rpc_C_GetSlotList,
2404
  rpc_C_GetSlotInfo,
2405
  rpc_C_GetTokenInfo,
2406
  rpc_C_GetMechanismList,
2407
  rpc_C_GetMechanismInfo,
2408
  rpc_C_InitToken,
2409
  rpc_C_InitPIN,
2410
  rpc_C_SetPIN,
2411
  rpc_C_OpenSession,
2412
  rpc_C_CloseSession,
2413
  rpc_C_CloseAllSessions,
2414
  rpc_C_GetSessionInfo,
2415
  rpc_C_GetOperationState,
2416
  rpc_C_SetOperationState,
2417
  rpc_C_Login,
2418
  rpc_C_Logout,
2419
  rpc_C_CreateObject,
2420
  rpc_C_CopyObject,
2421
  rpc_C_DestroyObject,
2422
  rpc_C_GetObjectSize,
2423
  rpc_C_GetAttributeValue,
2424
  rpc_C_SetAttributeValue,
2425
  rpc_C_FindObjectsInit,
2426
  rpc_C_FindObjects,
2427
  rpc_C_FindObjectsFinal,
2428
  rpc_C_EncryptInit,
2429
  rpc_C_Encrypt,
2430
  rpc_C_EncryptUpdate,
2431
  rpc_C_EncryptFinal,
2432
  rpc_C_DecryptInit,
2433
  rpc_C_Decrypt,
2434
  rpc_C_DecryptUpdate,
2435
  rpc_C_DecryptFinal,
2436
  rpc_C_DigestInit,
2437
  rpc_C_Digest,
2438
  rpc_C_DigestUpdate,
2439
  rpc_C_DigestKey,
2440
  rpc_C_DigestFinal,
2441
  rpc_C_SignInit,
2442
  rpc_C_Sign,
2443
  rpc_C_SignUpdate,
2444
  rpc_C_SignFinal,
2445
  rpc_C_SignRecoverInit,
2446
  rpc_C_SignRecover,
2447
  rpc_C_VerifyInit,
2448
  rpc_C_Verify,
2449
  rpc_C_VerifyUpdate,
2450
  rpc_C_VerifyFinal,
2451
  rpc_C_VerifyRecoverInit,
2452
  rpc_C_VerifyRecover,
2453
  rpc_C_DigestEncryptUpdate,
2454
  rpc_C_DecryptDigestUpdate,
2455
  rpc_C_SignEncryptUpdate,
2456
  rpc_C_DecryptVerifyUpdate,
2457
  rpc_C_GenerateKey,
2458
  rpc_C_GenerateKeyPair,
2459
  rpc_C_WrapKey,
2460
  rpc_C_UnwrapKey,
2461
  rpc_C_DeriveKey,
2462
  rpc_C_SeedRandom,
2463
  rpc_C_GenerateRandom,
2464
  rpc_C_WaitForSlotEvent,
2465
  /* PKCS #11 3.0 */
2466
  rpc_C_LoginUser,
2467
  rpc_C_SessionCancel,
2468
  rpc_C_MessageEncryptInit,
2469
  rpc_C_EncryptMessage,
2470
  rpc_C_EncryptMessageBegin,
2471
  rpc_C_EncryptMessageNext,
2472
  rpc_C_MessageEncryptFinal,
2473
  rpc_C_MessageDecryptInit,
2474
  rpc_C_DecryptMessage,
2475
  rpc_C_DecryptMessageBegin,
2476
  rpc_C_DecryptMessageNext,
2477
  rpc_C_MessageDecryptFinal,
2478
  rpc_C_MessageSignInit,
2479
  rpc_C_SignMessage,
2480
  rpc_C_SignMessageBegin,
2481
  rpc_C_SignMessageNext,
2482
  rpc_C_MessageSignFinal,
2483
  rpc_C_MessageVerifyInit,
2484
  rpc_C_VerifyMessage,
2485
  rpc_C_VerifyMessageBegin,
2486
  rpc_C_VerifyMessageNext,
2487
  rpc_C_MessageVerifyFinal
2488
};
2489
2490
static void
2491
rpc_client_free (void *data)
2492
0
{
2493
0
  rpc_client *client = data;
2494
0
  p11_mutex_uninit (&client->mutex);
2495
0
  free (client);
2496
0
}
2497
2498
bool
2499
p11_rpc_client_init (p11_virtual *virt,
2500
                     p11_rpc_client_vtable *vtable)
2501
0
{
2502
0
  rpc_client *client;
2503
2504
0
  p11_message_clear ();
2505
2506
0
  return_val_if_fail (vtable != NULL, false);
2507
0
  return_val_if_fail (vtable->connect != NULL, false);
2508
0
  return_val_if_fail (vtable->transport != NULL, false);
2509
0
  return_val_if_fail (vtable->disconnect != NULL, false);
2510
2511
0
  P11_RPC_CHECK_CALLS ();
2512
2513
0
  client = calloc (1, sizeof (rpc_client));
2514
0
  return_val_if_fail (client != NULL, false);
2515
2516
0
  p11_mutex_init (&client->mutex);
2517
0
  client->vtable = vtable;
2518
2519
0
  p11_virtual_init (virt, &rpc_functions, client, rpc_client_free);
2520
  return true;
2521
0
}