Coverage Report

Created: 2023-08-07 06:59

/src/p11-kit/p11-kit/rpc-server.c
Line
Count
Source (jump to first uncovered line)
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
#include "conf.h"
40
64
#define P11_DEBUG_FLAG P11_DEBUG_RPC
41
#include "debug.h"
42
#include "filter.h"
43
#include "iter.h"
44
#include "pkcs11.h"
45
#include "library.h"
46
#include "private.h"
47
#include "message.h"
48
#include "proxy.h"
49
#include "remote.h"
50
#include "rpc.h"
51
#include "rpc-message.h"
52
#include "uri.h"
53
54
#include <sys/types.h>
55
#include <sys/param.h>
56
#include <assert.h>
57
#include <errno.h>
58
#include <stdlib.h>
59
#include <string.h>
60
#include <unistd.h>
61
62
#ifdef ENABLE_NLS
63
#include <libintl.h>
64
14
#define _(x) dgettext(PACKAGE_NAME, x)
65
#else
66
#define _(x) (x)
67
#endif
68
69
/* The error returned on protocol failures */
70
13
#define PARSE_ERROR CKR_DEVICE_ERROR
71
0
#define PREP_ERROR  CKR_DEVICE_MEMORY
72
73
typedef struct {
74
  p11_virtual virt;
75
  uint8_t version;
76
} rpc_server;
77
78
static CK_RV
79
proto_read_byte_buffer (p11_rpc_message *msg,
80
                        CK_BYTE_PTR *buffer,
81
                        CK_ULONG *n_buffer)
82
0
{
83
0
  uint32_t length;
84
85
0
  assert (msg != NULL);
86
0
  assert (buffer != NULL);
87
0
  assert (n_buffer != NULL);
88
0
  assert (msg->input != NULL);
89
90
  /* Check that we're supposed to be reading this at this point */
91
0
  assert (!msg->signature || p11_rpc_message_verify_part (msg, "fy"));
92
93
  /* The number of ulongs there's room for on the other end */
94
0
  if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &length))
95
0
    return PARSE_ERROR;
96
97
0
  *n_buffer = length;
98
0
  *buffer = NULL;
99
100
  /* length = -1 indicates length = 0, but buffer not NULL */
101
0
  if (length == (uint32_t)-1) {
102
0
    *n_buffer = 0;
103
0
    length = 1; /*allocate 1 dummy byte */
104
0
  }
105
106
  /* If set to zero, then they just want the length */
107
0
  if (length == 0)
108
0
    return CKR_OK;
109
110
0
  *buffer = p11_rpc_message_alloc_extra_array (msg, length, sizeof (CK_BYTE));
111
0
  if (*buffer == NULL)
112
0
    return CKR_DEVICE_MEMORY;
113
114
0
  return CKR_OK;
115
0
}
116
117
static CK_RV
118
proto_read_byte_array (p11_rpc_message *msg,
119
                       CK_BYTE_PTR *array,
120
                       CK_ULONG *n_array)
121
4
{
122
4
  const unsigned char *data;
123
4
  unsigned char valid;
124
4
  uint32_t len;
125
4
  size_t n_data;
126
127
4
  assert (msg != NULL);
128
4
  assert (msg->input != NULL);
129
130
  /* Check that we're supposed to have this at this point */
131
4
  assert (!msg->signature || p11_rpc_message_verify_part (msg, "ay"));
132
133
  /* Read out the byte which says whether data is present or not */
134
4
  if (!p11_rpc_buffer_get_byte (msg->input, &msg->parsed, &valid))
135
0
    return PARSE_ERROR;
136
137
4
  if (!valid) {
138
0
    if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &len))
139
0
      return PARSE_ERROR;
140
0
    *array = NULL;
141
0
    *n_array = len;
142
0
    return CKR_OK;
143
0
  }
144
145
  /* Point our arguments into the buffer */
146
4
  if (!p11_rpc_buffer_get_byte_array (msg->input, &msg->parsed, &data, &n_data))
147
0
    return PARSE_ERROR;
148
149
4
  *array = (CK_BYTE_PTR)data;
150
4
  *n_array = n_data;
151
4
  return CKR_OK;
152
4
}
153
154
static CK_RV
155
proto_write_byte_array (p11_rpc_message *msg,
156
                        CK_BYTE_PTR array,
157
                        CK_ULONG len,
158
                        CK_RV ret)
159
0
{
160
0
  assert (msg != NULL);
161
162
  /*
163
   * When returning an byte array, in many cases we need to pass
164
   * an invalid array along with a length, which signifies CKR_BUFFER_TOO_SMALL.
165
   */
166
167
0
  switch (ret) {
168
0
  case CKR_BUFFER_TOO_SMALL:
169
0
    array = NULL;
170
    /* fall through */
171
0
  case CKR_OK:
172
0
    break;
173
174
  /* Pass all other errors straight through */
175
0
  default:
176
0
    return ret;
177
0
  };
178
179
0
  if (!p11_rpc_message_write_byte_array (msg, array, len))
180
0
    return PREP_ERROR;
181
182
0
  return CKR_OK;
183
0
}
184
185
static CK_RV
186
proto_read_ulong_buffer (p11_rpc_message *msg,
187
                         CK_ULONG_PTR *buffer,
188
                         CK_ULONG *n_buffer)
189
0
{
190
0
  uint32_t length;
191
192
0
  assert (msg != NULL);
193
0
  assert (buffer != NULL);
194
0
  assert (n_buffer != NULL);
195
0
  assert (msg->input != NULL);
196
197
  /* Check that we're supposed to be reading this at this point */
198
0
  assert (!msg->signature || p11_rpc_message_verify_part (msg, "fu"));
199
200
  /* The number of ulongs there's room for on the other end */
201
0
  if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &length))
202
0
    return PARSE_ERROR;
203
204
0
  *n_buffer = length;
205
0
  *buffer = NULL;
206
207
  /* If set to zero, then they just want the length */
208
0
  if (length == 0)
209
0
    return CKR_OK;
210
211
0
  *buffer = p11_rpc_message_alloc_extra_array (msg, length, sizeof (CK_ULONG));
212
0
  if (!*buffer)
213
0
    return CKR_DEVICE_MEMORY;
214
215
0
  return CKR_OK;
216
0
}
217
218
static CK_RV
219
proto_write_ulong_array (p11_rpc_message *msg,
220
                         CK_ULONG_PTR array,
221
                         CK_ULONG len,
222
                         CK_RV ret)
223
0
{
224
0
  assert (msg != NULL);
225
226
  /*
227
   * When returning an ulong array, in many cases we need to pass
228
   * an invalid array along with a length, which signifies CKR_BUFFER_TOO_SMALL.
229
   */
230
231
0
  switch (ret) {
232
0
  case CKR_BUFFER_TOO_SMALL:
233
0
    array = NULL;
234
    /* fall through */
235
0
  case CKR_OK:
236
0
    break;
237
238
  /* Pass all other errors straight through */
239
0
  default:
240
0
    return ret;
241
0
  };
242
243
0
  if (!p11_rpc_message_write_ulong_array (msg, array, len))
244
0
    return PREP_ERROR;
245
246
0
  return CKR_OK;
247
0
}
248
249
static CK_RV
250
proto_read_attribute_buffer (p11_rpc_message *msg,
251
                             CK_ATTRIBUTE_PTR *result,
252
                             CK_ULONG *n_result)
253
2
{
254
2
  CK_ATTRIBUTE_PTR attrs;
255
2
  uint32_t n_attrs, i;
256
2
  uint32_t value;
257
258
2
  assert (msg != NULL);
259
2
  assert (result != NULL);
260
2
  assert (n_result != NULL);
261
2
  assert (msg->input != NULL);
262
263
  /* Make sure this is in the right order */
264
2
  assert (!msg->signature || p11_rpc_message_verify_part (msg, "fA"));
265
266
  /* Read the number of attributes */
267
2
  if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &n_attrs))
268
0
    return PARSE_ERROR;
269
270
  /* Allocate memory for the attribute structures */
271
2
  attrs = p11_rpc_message_alloc_extra_array (msg, n_attrs, sizeof (CK_ATTRIBUTE));
272
2
  if (attrs == NULL)
273
0
    return CKR_DEVICE_MEMORY;
274
275
  /* Now go through and fill in each one */
276
8
  for (i = 0; i < n_attrs; ++i) {
277
278
    /* The attribute type */
279
6
    if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &value))
280
0
      return PARSE_ERROR;
281
282
6
    attrs[i].type = value;
283
284
    /* The number of bytes to allocate */
285
6
    if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &value))
286
0
      return PARSE_ERROR;
287
288
6
    if (value == 0) {
289
3
      attrs[i].pValue = NULL;
290
3
      attrs[i].ulValueLen = 0;
291
3
    } else {
292
3
      attrs[i].pValue = p11_rpc_message_alloc_extra (msg, value);
293
3
      if (!attrs[i].pValue)
294
0
        return CKR_DEVICE_MEMORY;
295
3
      attrs[i].ulValueLen = value;
296
3
    }
297
6
  }
298
299
2
  *result = attrs;
300
2
  *n_result = n_attrs;
301
2
  return CKR_OK;
302
2
}
303
304
static CK_RV
305
proto_read_attribute_array (p11_rpc_message *msg,
306
                            CK_ATTRIBUTE_PTR *result,
307
                            CK_ULONG *n_result)
308
9
{
309
9
  CK_ATTRIBUTE_PTR attrs;
310
9
  uint32_t n_attrs, i;
311
312
9
  assert (msg != NULL);
313
9
  assert (result != NULL);
314
9
  assert (n_result != NULL);
315
9
  assert (msg->input != NULL);
316
317
  /* Make sure this is in the right order */
318
9
  assert (!msg->signature || p11_rpc_message_verify_part (msg, "aA"));
319
320
  /* Read the number of attributes */
321
9
  if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &n_attrs))
322
0
    return PARSE_ERROR;
323
324
  /* Allocate memory for the attribute structures */
325
9
  attrs = p11_rpc_message_alloc_extra_array (msg, n_attrs, sizeof (CK_ATTRIBUTE));
326
9
  if (attrs == NULL)
327
0
    return CKR_DEVICE_MEMORY;
328
329
  /* Now go through and fill in each one */
330
748k
  for (i = 0; i < n_attrs; ++i) {
331
748k
    size_t offset = msg->parsed;
332
748k
    CK_ATTRIBUTE temp;
333
334
    /* Check the length needed to store the value */
335
748k
    memset (&temp, 0, sizeof (temp));
336
748k
    if (!p11_rpc_buffer_get_attribute (msg->input, &offset, &temp)) {
337
7
      msg->parsed = offset;
338
7
      return PARSE_ERROR;
339
7
    }
340
341
748k
    if (IS_ATTRIBUTE_ARRAY (&temp)) {
342
0
      p11_debug("recursive attribute array is not supported");
343
0
      return PARSE_ERROR;
344
0
    }
345
346
748k
    attrs[i].type = temp.type;
347
348
    /* Whether this one is valid or not */
349
748k
    if (temp.ulValueLen != ((CK_ULONG)-1)) {
350
45
      size_t offset2 = msg->parsed;
351
45
      attrs[i].pValue = p11_rpc_message_alloc_extra (msg, temp.ulValueLen);
352
45
      if (!p11_rpc_buffer_get_attribute (msg->input, &offset2, &attrs[i])) {
353
0
        msg->parsed = offset2;
354
0
        return PARSE_ERROR;
355
0
      }
356
748k
    } else {
357
748k
      attrs[i].pValue = NULL;
358
748k
      attrs[i].ulValueLen = -1;
359
748k
    }
360
361
748k
    msg->parsed = offset;
362
748k
  }
363
364
2
  *result = attrs;
365
2
  *n_result = n_attrs;
366
2
  return CKR_OK;
367
9
}
368
369
static CK_RV
370
proto_write_attribute_array (p11_rpc_message *msg,
371
                             CK_ATTRIBUTE_PTR array,
372
                             CK_ULONG len,
373
                             CK_RV ret)
374
2
{
375
2
  assert (msg != NULL);
376
377
  /*
378
   * When returning an attribute array, certain errors aren't
379
   * actually real errors, these are passed through to the other
380
   * side along with the attribute array.
381
   */
382
383
2
  switch (ret) {
384
0
  case CKR_ATTRIBUTE_SENSITIVE:
385
0
  case CKR_ATTRIBUTE_TYPE_INVALID:
386
0
  case CKR_BUFFER_TOO_SMALL:
387
0
  case CKR_OK:
388
0
    break;
389
390
  /* Pass all other errors straight through */
391
2
  default:
392
2
    return ret;
393
2
  };
394
395
0
  if (!p11_rpc_message_write_attribute_array (msg, array, len) ||
396
0
      !p11_rpc_message_write_ulong (msg, ret))
397
0
    return PREP_ERROR;
398
399
0
  return CKR_OK;
400
0
}
401
402
static CK_RV
403
proto_read_null_string (p11_rpc_message *msg,
404
                        CK_UTF8CHAR_PTR *val)
405
0
{
406
0
  const unsigned char *data;
407
0
  size_t n_data;
408
409
0
  assert (msg != NULL);
410
0
  assert (val != NULL);
411
0
  assert (msg->input != NULL);
412
413
  /* Check that we're supposed to have this at this point */
414
0
  assert (!msg->signature || p11_rpc_message_verify_part (msg, "z"));
415
416
0
  if (!p11_rpc_buffer_get_byte_array (msg->input, &msg->parsed, &data, &n_data))
417
0
    return PARSE_ERROR;
418
419
  /* Allocate a block of memory for it */
420
0
  *val = p11_rpc_message_alloc_extra (msg, n_data + 1);
421
0
  if (*val == NULL)
422
0
    return CKR_DEVICE_MEMORY;
423
424
0
  memcpy (*val, data, n_data);
425
0
  (*val)[n_data] = 0;
426
427
0
  return CKR_OK;
428
0
}
429
430
static CK_RV
431
proto_read_space_string (p11_rpc_message *msg,
432
                         CK_UTF8CHAR_PTR *val,
433
                         CK_ULONG len)
434
0
{
435
0
  const unsigned char *data;
436
0
  size_t n_data;
437
438
0
  assert (msg != NULL);
439
0
  assert (val != NULL);
440
0
  assert (msg->input != NULL);
441
442
  /* Check that we're supposed to have this at this point */
443
0
  assert (!msg->signature || p11_rpc_message_verify_part (msg, "s"));
444
445
0
  if (!p11_rpc_buffer_get_byte_array (msg->input, &msg->parsed, &data, &n_data))
446
0
    return PARSE_ERROR;
447
448
0
  if (n_data != len)
449
0
    return PARSE_ERROR;
450
451
  /* Allocate a block of memory for it */
452
0
  *val = p11_rpc_message_alloc_extra (msg, n_data);
453
0
  if (*val == NULL)
454
0
    return CKR_DEVICE_MEMORY;
455
456
0
  memcpy (*val, data, n_data);
457
458
0
  return CKR_OK;
459
0
}
460
461
static CK_RV
462
proto_read_mechanism (p11_rpc_message *msg,
463
                      CK_MECHANISM_PTR *mech)
464
18
{
465
18
  size_t offset;
466
18
  CK_MECHANISM temp;
467
468
18
  assert (msg != NULL);
469
18
  assert (mech != NULL);
470
18
  assert (msg->input != NULL);
471
472
  /* Make sure this is in the right order */
473
18
  assert (!msg->signature || p11_rpc_message_verify_part (msg, "M"));
474
475
  /* Check the length needed to store the parameter */
476
18
  memset (&temp, 0, sizeof (temp));
477
18
  offset = msg->parsed;
478
18
  if (!p11_rpc_buffer_get_mechanism (msg->input, &offset, &temp)) {
479
6
    msg->parsed = offset;
480
6
    return PARSE_ERROR;
481
6
  }
482
483
12
  if (temp.mechanism == 0) {
484
0
    *mech = NULL;
485
0
    return CKR_OK;
486
0
  }
487
488
12
  (*mech)->mechanism = temp.mechanism;
489
490
  /* The mechanism doesn't require parameter */
491
12
  if (temp.ulParameterLen == 0) {
492
0
    (*mech)->pParameter = NULL;
493
0
    (*mech)->ulParameterLen = 0;
494
0
    msg->parsed = offset;
495
0
    return CKR_OK;
496
0
  }
497
498
  /* Actually retrieve the parameter */
499
12
  (*mech)->pParameter = p11_rpc_message_alloc_extra (msg, temp.ulParameterLen);
500
12
  if (!p11_rpc_buffer_get_mechanism (msg->input, &msg->parsed, *mech))
501
0
    return PARSE_ERROR;
502
503
12
  assert (msg->parsed == offset);
504
505
12
  return CKR_OK;
506
12
}
507
508
static CK_RV
509
proto_write_info (p11_rpc_message *msg,
510
                  CK_INFO_PTR info)
511
0
{
512
0
  assert (msg != NULL);
513
0
  assert (info != NULL);
514
515
0
  if (!p11_rpc_message_write_version (msg, &info->cryptokiVersion) ||
516
0
      !p11_rpc_message_write_space_string (msg, info->manufacturerID, 32) ||
517
0
      !p11_rpc_message_write_ulong (msg, info->flags) ||
518
0
      !p11_rpc_message_write_space_string (msg, info->libraryDescription, 32) ||
519
0
      !p11_rpc_message_write_version (msg, &info->libraryVersion))
520
0
    return PREP_ERROR;
521
522
0
  return CKR_OK;
523
0
}
524
525
static CK_RV
526
proto_write_slot_info (p11_rpc_message *msg,
527
                       CK_SLOT_INFO_PTR info)
528
0
{
529
0
  assert (msg != NULL);
530
0
  assert (info != NULL);
531
532
0
  if (!p11_rpc_message_write_space_string (msg, info->slotDescription, 64) ||
533
0
      !p11_rpc_message_write_space_string (msg, info->manufacturerID, 32) ||
534
0
      !p11_rpc_message_write_ulong (msg, info->flags) ||
535
0
      !p11_rpc_message_write_version (msg, &info->hardwareVersion) ||
536
0
      !p11_rpc_message_write_version (msg, &info->firmwareVersion))
537
0
    return PREP_ERROR;
538
539
0
  return CKR_OK;
540
0
}
541
542
static CK_RV
543
proto_write_token_info (p11_rpc_message *msg,
544
                        CK_TOKEN_INFO_PTR info)
545
0
{
546
0
  assert (msg != NULL);
547
0
  assert (info != NULL);
548
549
0
  if (!p11_rpc_message_write_space_string (msg, info->label, 32) ||
550
0
      !p11_rpc_message_write_space_string (msg, info->manufacturerID, 32) ||
551
0
      !p11_rpc_message_write_space_string (msg, info->model, 16) ||
552
0
      !p11_rpc_message_write_space_string (msg, info->serialNumber, 16) ||
553
0
      !p11_rpc_message_write_ulong (msg, info->flags) ||
554
0
      !p11_rpc_message_write_ulong (msg, info->ulMaxSessionCount) ||
555
0
      !p11_rpc_message_write_ulong (msg, info->ulSessionCount) ||
556
0
      !p11_rpc_message_write_ulong (msg, info->ulMaxRwSessionCount) ||
557
0
      !p11_rpc_message_write_ulong (msg, info->ulRwSessionCount) ||
558
0
      !p11_rpc_message_write_ulong (msg, info->ulMaxPinLen) ||
559
0
      !p11_rpc_message_write_ulong (msg, info->ulMinPinLen) ||
560
0
      !p11_rpc_message_write_ulong (msg, info->ulTotalPublicMemory) ||
561
0
      !p11_rpc_message_write_ulong (msg, info->ulFreePublicMemory) ||
562
0
      !p11_rpc_message_write_ulong (msg, info->ulTotalPrivateMemory) ||
563
0
      !p11_rpc_message_write_ulong (msg, info->ulFreePrivateMemory) ||
564
0
      !p11_rpc_message_write_version (msg, &info->hardwareVersion) ||
565
0
      !p11_rpc_message_write_version (msg, &info->firmwareVersion) ||
566
0
      !p11_rpc_message_write_space_string (msg, info->utcTime, 16))
567
0
    return PREP_ERROR;
568
569
0
  return CKR_OK;
570
0
}
571
572
static CK_RV
573
proto_write_mechanism_info (p11_rpc_message *msg,
574
                            CK_MECHANISM_INFO_PTR info)
575
0
{
576
0
  assert (msg != NULL);
577
0
  assert (info != NULL);
578
579
0
  if (!p11_rpc_message_write_ulong (msg, info->ulMinKeySize) ||
580
0
      !p11_rpc_message_write_ulong (msg, info->ulMaxKeySize) ||
581
0
      !p11_rpc_message_write_ulong (msg, info->flags))
582
0
    return PREP_ERROR;
583
584
0
  return CKR_OK;
585
0
}
586
587
static CK_RV
588
proto_write_session_info (p11_rpc_message *msg,
589
                          CK_SESSION_INFO_PTR info)
590
0
{
591
0
  assert (msg != NULL);
592
0
  assert (info != NULL);
593
594
0
  if (!p11_rpc_message_write_ulong (msg, info->slotID) ||
595
0
      !p11_rpc_message_write_ulong (msg, info->state) ||
596
0
      !p11_rpc_message_write_ulong (msg, info->flags) ||
597
0
      !p11_rpc_message_write_ulong (msg, info->ulDeviceError))
598
0
    return PREP_ERROR;
599
600
0
  return CKR_OK;
601
0
}
602
603
static CK_RV
604
call_ready (p11_rpc_message *msg)
605
15
{
606
15
  assert (msg->output);
607
608
  /*
609
   * Called right before invoking the actual PKCS#11 function
610
   * Reading out of data is complete, get ready to write return values.
611
   */
612
613
15
  if (p11_buffer_failed (msg->output)) {
614
0
    p11_message (_("invalid request from module, probably too short")); \
615
0
    return PARSE_ERROR;
616
0
  }
617
618
15
  assert (p11_rpc_message_is_verified (msg));
619
620
  /* All done parsing input */
621
15
  msg->input = NULL;
622
623
15
  if (!p11_rpc_message_prep (msg, msg->call_id, P11_RPC_RESPONSE)) {
624
0
    p11_message (_("couldn't initialize rpc response"));
625
0
    return CKR_DEVICE_MEMORY;
626
0
  }
627
628
15
  return CKR_OK;
629
15
}
630
631
/* -------------------------------------------------------------------
632
 * CALL MACROS
633
 */
634
635
#define BEGIN_CALL(call_id) \
636
28
  p11_debug (#call_id ": enter"); \
637
28
  assert (msg != NULL); \
638
28
  assert (self != NULL); \
639
28
  {  \
640
28
    CK_X_##call_id _func = self->C_##call_id; \
641
28
    CK_RV _ret = CKR_OK; \
642
28
    if (!_func) { _ret = CKR_GENERAL_ERROR; goto _cleanup; }
643
644
#define PROCESS_CALL(args) \
645
15
    _ret = call_ready (msg); \
646
15
    if (_ret != CKR_OK) { goto _cleanup; } \
647
15
    _ret = _func args
648
649
#define END_CALL \
650
28
  _cleanup: \
651
28
    p11_debug ("ret: %d", (int)_ret); \
652
28
    return _ret; \
653
28
  }
654
655
#define IN_BYTE(val) \
656
0
  if (!p11_rpc_message_read_byte (msg, &val)) \
657
0
    { _ret = PARSE_ERROR; goto _cleanup; }
658
659
#define IN_ULONG(val) \
660
31
  if (!p11_rpc_message_read_ulong (msg, &val)) \
661
31
    { _ret = PARSE_ERROR; goto _cleanup; }
662
663
#define IN_ZERO_STRING(val) \
664
0
  _ret = proto_read_null_string (msg, &val); \
665
0
  if (_ret != CKR_OK) goto _cleanup;
666
667
#define IN_SPACE_STRING(val, len) \
668
0
  _ret = proto_read_space_string (msg, &val, len); \
669
0
  if (_ret != CKR_OK) goto _cleanup;
670
671
#define IN_BYTE_BUFFER(buffer, buffer_len) \
672
0
  _ret = proto_read_byte_buffer (msg, &buffer, &buffer_len); \
673
0
  if (_ret != CKR_OK) goto _cleanup;
674
675
#define IN_BYTE_ARRAY(buffer, buffer_len) \
676
0
  _ret = proto_read_byte_array (msg, &buffer, &buffer_len); \
677
0
  if (_ret != CKR_OK) goto _cleanup;
678
679
#define IN_ULONG_BUFFER(buffer, buffer_len) \
680
0
  _ret = proto_read_ulong_buffer (msg, &buffer, &buffer_len); \
681
0
  if (_ret != CKR_OK) goto _cleanup;
682
683
#define IN_ATTRIBUTE_BUFFER(buffer, buffer_len) \
684
2
  _ret = proto_read_attribute_buffer (msg, &buffer, &buffer_len); \
685
2
  if (_ret != CKR_OK) goto _cleanup;
686
687
#define IN_ATTRIBUTE_ARRAY(attrs, n_attrs) \
688
9
  _ret = proto_read_attribute_array (msg, &attrs, &n_attrs); \
689
9
  if (_ret != CKR_OK) goto _cleanup;
690
691
#define IN_MECHANISM(mech) \
692
18
  _ret = proto_read_mechanism (msg, &mech); \
693
18
  if (_ret != CKR_OK) goto _cleanup;
694
695
696
#define OUT_ULONG(val) \
697
2
  if (_ret == CKR_OK && !p11_rpc_message_write_ulong (msg, val)) \
698
2
    _ret = PREP_ERROR;
699
700
#define OUT_BYTE_ARRAY(array, len) \
701
  /* Note how we filter return codes */ \
702
0
  _ret = proto_write_byte_array (msg, array, len, _ret);
703
704
#define OUT_ULONG_ARRAY(array, len) \
705
  /* Note how we filter return codes */ \
706
0
  _ret = proto_write_ulong_array (msg, array, len, _ret);
707
708
#define OUT_ATTRIBUTE_ARRAY(array, len) \
709
  /* Note how we filter return codes */ \
710
2
  _ret = proto_write_attribute_array (msg, array, len, _ret);
711
712
#define OUT_INFO(val) \
713
0
  if (_ret == CKR_OK) \
714
0
    _ret = proto_write_info (msg, &val);
715
716
#define OUT_SLOT_INFO(val) \
717
0
  if (_ret == CKR_OK) \
718
0
    _ret = proto_write_slot_info (msg, &val);
719
720
#define OUT_TOKEN_INFO(val) \
721
0
  if (_ret == CKR_OK) \
722
0
    _ret = proto_write_token_info (msg, &val);
723
724
#define OUT_MECHANISM_INFO(val) \
725
0
  if (_ret == CKR_OK) \
726
0
    _ret = proto_write_mechanism_info (msg, &val);
727
728
#define OUT_SESSION_INFO(val) \
729
0
  if (_ret == CKR_OK) \
730
0
    _ret = proto_write_session_info (msg, &val);
731
732
/* ---------------------------------------------------------------------------
733
 * DISPATCH SPECIFIC CALLS
734
 */
735
736
static CK_RV
737
rpc_C_Initialize (CK_X_FUNCTION_LIST *self,
738
                  p11_rpc_message *msg)
739
4
{
740
4
  CK_X_Initialize func;
741
4
  CK_C_INITIALIZE_ARGS init_args;
742
4
  CK_BYTE_PTR handshake;
743
4
  CK_ULONG n_handshake;
744
4
  CK_BYTE reserved_present = 0;
745
4
  CK_BYTE_PTR reserved = NULL;
746
4
  CK_ULONG n_reserved;
747
4
  CK_RV ret = CKR_OK;
748
749
4
  p11_debug ("C_Initialize: enter");
750
751
4
  assert (msg != NULL);
752
4
  assert (self != NULL);
753
754
4
  ret = proto_read_byte_array (msg, &handshake, &n_handshake);
755
4
  if (ret == CKR_OK) {
756
757
    /* Check to make sure the header matches */
758
4
    if (!handshake ||
759
4
        n_handshake != P11_RPC_HANDSHAKE_LEN ||
760
4
        memcmp (handshake, P11_RPC_HANDSHAKE, n_handshake) != 0) {
761
4
      p11_message (_("invalid handshake received from connecting module"));
762
4
      ret = CKR_GENERAL_ERROR;
763
4
    }
764
4
  }
765
766
4
  if (ret == CKR_OK) {
767
0
    if (!p11_rpc_message_read_byte (msg, &reserved_present))
768
0
      ret = PARSE_ERROR;
769
0
  }
770
771
4
  if (ret == CKR_OK) {
772
0
    ret = proto_read_byte_array (msg, &reserved, &n_reserved);
773
774
0
    assert (p11_rpc_message_is_verified (msg));
775
0
  }
776
777
4
  if (ret == CKR_OK) {
778
0
    memset (&init_args, 0, sizeof (init_args));
779
0
    init_args.flags = CKF_OS_LOCKING_OK;
780
0
    init_args.pReserved = reserved_present ? reserved : NULL;
781
782
0
    func = self->C_Initialize;
783
0
    assert (func != NULL);
784
0
    ret = (func) (self, &init_args);
785
786
    /* Empty response */
787
0
    if (ret == CKR_OK)
788
0
      ret = call_ready (msg);
789
0
  }
790
791
4
  p11_debug ("ret: %d", (int)ret);
792
4
  return ret;
793
4
}
794
795
static CK_RV
796
rpc_C_Finalize (CK_X_FUNCTION_LIST *self,
797
                p11_rpc_message *msg)
798
0
{
799
0
  BEGIN_CALL (Finalize);
800
0
  PROCESS_CALL ((self, NULL));
801
0
  END_CALL;
802
0
}
803
804
static CK_RV
805
rpc_C_GetInfo (CK_X_FUNCTION_LIST *self,
806
               p11_rpc_message *msg)
807
0
{
808
0
  CK_INFO info;
809
810
0
  BEGIN_CALL (GetInfo);
811
0
  PROCESS_CALL ((self, &info));
812
0
    OUT_INFO (info);
813
0
  END_CALL;
814
0
}
815
816
static CK_RV
817
rpc_C_GetSlotList (CK_X_FUNCTION_LIST *self,
818
                   p11_rpc_message *msg)
819
0
{
820
0
  CK_BBOOL token_present;
821
0
  CK_SLOT_ID_PTR slot_list;
822
0
  CK_ULONG count;
823
824
0
  BEGIN_CALL (GetSlotList);
825
0
    IN_BYTE (token_present);
826
0
    IN_ULONG_BUFFER (slot_list, count);
827
0
  PROCESS_CALL ((self, token_present, slot_list, &count));
828
0
    OUT_ULONG_ARRAY (slot_list, count);
829
0
  END_CALL;
830
0
}
831
832
static CK_RV
833
rpc_C_GetSlotInfo (CK_X_FUNCTION_LIST *self,
834
                   p11_rpc_message *msg)
835
0
{
836
0
  CK_SLOT_ID slot_id;
837
0
  CK_SLOT_INFO info;
838
839
0
  BEGIN_CALL (GetSlotInfo);
840
0
    IN_ULONG (slot_id);
841
0
  PROCESS_CALL ((self, slot_id, &info));
842
0
    OUT_SLOT_INFO (info);
843
0
  END_CALL;
844
0
}
845
846
static CK_RV
847
rpc_C_GetTokenInfo (CK_X_FUNCTION_LIST *self,
848
                    p11_rpc_message *msg)
849
0
{
850
0
  CK_SLOT_ID slot_id;
851
0
  CK_TOKEN_INFO info;
852
853
0
  BEGIN_CALL (GetTokenInfo);
854
0
    IN_ULONG (slot_id);
855
0
  PROCESS_CALL ((self, slot_id, &info));
856
0
    OUT_TOKEN_INFO (info);
857
0
  END_CALL;
858
0
}
859
860
static CK_RV
861
rpc_C_GetMechanismList (CK_X_FUNCTION_LIST *self,
862
                        p11_rpc_message *msg)
863
0
{
864
0
  CK_SLOT_ID slot_id;
865
0
  CK_MECHANISM_TYPE_PTR mechanism_list;
866
0
  CK_ULONG count;
867
868
0
  BEGIN_CALL (GetMechanismList);
869
0
    IN_ULONG (slot_id);
870
0
    IN_ULONG_BUFFER (mechanism_list, count);
871
0
  PROCESS_CALL ((self, slot_id, mechanism_list, &count));
872
0
    OUT_ULONG_ARRAY (mechanism_list, count);
873
0
  END_CALL;
874
0
}
875
876
static CK_RV
877
rpc_C_GetMechanismInfo (CK_X_FUNCTION_LIST *self,
878
                        p11_rpc_message *msg)
879
0
{
880
0
  CK_SLOT_ID slot_id;
881
0
  CK_MECHANISM_TYPE type;
882
0
  CK_MECHANISM_INFO info;
883
884
0
  BEGIN_CALL (GetMechanismInfo);
885
0
    IN_ULONG (slot_id);
886
0
    IN_ULONG (type);
887
0
  PROCESS_CALL ((self, slot_id, type, &info));
888
0
    OUT_MECHANISM_INFO (info);
889
0
  END_CALL;
890
0
}
891
892
static CK_RV
893
rpc_C_InitToken (CK_X_FUNCTION_LIST *self,
894
                 p11_rpc_message *msg)
895
0
{
896
0
  CK_SLOT_ID slot_id;
897
0
  CK_UTF8CHAR_PTR pin;
898
0
  CK_ULONG pin_len;
899
0
  CK_UTF8CHAR_PTR label;
900
901
0
  BEGIN_CALL (InitToken);
902
0
    IN_ULONG (slot_id);
903
0
    IN_BYTE_ARRAY (pin, pin_len);
904
0
    IN_ZERO_STRING (label);
905
0
  PROCESS_CALL ((self, slot_id, pin, pin_len, label));
906
0
  END_CALL;
907
0
}
908
909
static CK_RV
910
rpc_C_InitToken2 (CK_X_FUNCTION_LIST *self,
911
                  p11_rpc_message *msg)
912
0
{
913
0
  CK_SLOT_ID slot_id;
914
0
  CK_UTF8CHAR_PTR pin;
915
0
  CK_ULONG pin_len;
916
0
  CK_UTF8CHAR_PTR label;
917
918
0
  BEGIN_CALL (InitToken);
919
0
    IN_ULONG (slot_id);
920
0
    IN_BYTE_ARRAY (pin, pin_len);
921
0
    IN_SPACE_STRING (label, 32);
922
0
  PROCESS_CALL ((self, slot_id, pin, pin_len, label));
923
0
  END_CALL;
924
0
}
925
926
static CK_RV
927
rpc_C_WaitForSlotEvent (CK_X_FUNCTION_LIST *self,
928
                        p11_rpc_message *msg)
929
0
{
930
0
  CK_FLAGS flags;
931
0
  CK_SLOT_ID slot_id;
932
933
0
  BEGIN_CALL (WaitForSlotEvent);
934
0
    IN_ULONG (flags);
935
0
  PROCESS_CALL ((self, flags, &slot_id, NULL));
936
0
    OUT_ULONG (slot_id);
937
0
  END_CALL;
938
0
}
939
940
static CK_RV
941
rpc_C_OpenSession (CK_X_FUNCTION_LIST *self,
942
                   p11_rpc_message *msg)
943
0
{
944
0
  CK_SLOT_ID slot_id;
945
0
  CK_FLAGS flags;
946
0
  CK_SESSION_HANDLE session;
947
948
0
  BEGIN_CALL (OpenSession);
949
0
    IN_ULONG (slot_id);
950
0
    IN_ULONG (flags);
951
0
  PROCESS_CALL ((self, slot_id, flags, NULL, NULL, &session));
952
0
    OUT_ULONG (session);
953
0
  END_CALL;
954
0
}
955
956
957
static CK_RV
958
rpc_C_CloseSession (CK_X_FUNCTION_LIST *self,
959
                    p11_rpc_message *msg)
960
0
{
961
0
  CK_SESSION_HANDLE session;
962
963
0
  BEGIN_CALL (CloseSession);
964
0
    IN_ULONG (session);
965
0
  PROCESS_CALL ((self, session));
966
0
  END_CALL;
967
0
}
968
969
static CK_RV
970
rpc_C_CloseAllSessions (CK_X_FUNCTION_LIST *self,
971
                        p11_rpc_message *msg)
972
0
{
973
0
  CK_SLOT_ID slot_id;
974
975
  /* Slot id becomes apartment so lower layers can tell clients apart. */
976
977
0
  BEGIN_CALL (CloseAllSessions);
978
0
    IN_ULONG (slot_id);
979
0
  PROCESS_CALL ((self, slot_id));
980
0
  END_CALL;
981
0
}
982
983
static CK_RV
984
rpc_C_GetSessionInfo (CK_X_FUNCTION_LIST *self,
985
                      p11_rpc_message *msg)
986
0
{
987
0
  CK_SESSION_HANDLE session;
988
0
  CK_SESSION_INFO info;
989
990
0
  BEGIN_CALL (GetSessionInfo);
991
0
    IN_ULONG (session);
992
0
  PROCESS_CALL ((self, session, &info));
993
0
    OUT_SESSION_INFO (info);
994
0
  END_CALL;
995
0
}
996
997
static CK_RV
998
rpc_C_InitPIN (CK_X_FUNCTION_LIST *self,
999
               p11_rpc_message *msg)
1000
0
{
1001
0
  CK_SESSION_HANDLE session;
1002
0
  CK_UTF8CHAR_PTR pin;
1003
0
  CK_ULONG pin_len;
1004
1005
0
  BEGIN_CALL (InitPIN);
1006
0
    IN_ULONG (session);
1007
0
    IN_BYTE_ARRAY (pin, pin_len);
1008
0
  PROCESS_CALL ((self, session, pin, pin_len));
1009
0
  END_CALL;
1010
0
}
1011
1012
static CK_RV
1013
rpc_C_SetPIN (CK_X_FUNCTION_LIST *self,
1014
              p11_rpc_message *msg)
1015
0
{
1016
0
  CK_SESSION_HANDLE session;
1017
0
  CK_UTF8CHAR_PTR old_pin;
1018
0
  CK_ULONG old_len;
1019
0
  CK_UTF8CHAR_PTR new_pin;
1020
0
  CK_ULONG new_len;
1021
1022
0
  BEGIN_CALL (SetPIN);
1023
0
    IN_ULONG (session);
1024
0
    IN_BYTE_ARRAY (old_pin, old_len);
1025
0
    IN_BYTE_ARRAY (new_pin, new_len);
1026
0
  PROCESS_CALL ((self, session, old_pin, old_len, new_pin, new_len));
1027
0
  END_CALL;
1028
0
}
1029
1030
static CK_RV
1031
rpc_C_GetOperationState (CK_X_FUNCTION_LIST *self,
1032
                                p11_rpc_message *msg)
1033
0
{
1034
0
  CK_SESSION_HANDLE session;
1035
0
  CK_BYTE_PTR operation_state;
1036
0
  CK_ULONG operation_state_len;
1037
1038
0
  BEGIN_CALL (GetOperationState);
1039
0
    IN_ULONG (session);
1040
0
    IN_BYTE_BUFFER (operation_state, operation_state_len);
1041
0
  PROCESS_CALL ((self, session, operation_state, &operation_state_len));
1042
0
    OUT_BYTE_ARRAY (operation_state, operation_state_len);
1043
0
  END_CALL;
1044
0
}
1045
1046
static CK_RV
1047
rpc_C_SetOperationState (CK_X_FUNCTION_LIST *self,
1048
                         p11_rpc_message *msg)
1049
0
{
1050
0
  CK_SESSION_HANDLE session;
1051
0
  CK_BYTE_PTR operation_state;
1052
0
  CK_ULONG operation_state_len;
1053
0
  CK_OBJECT_HANDLE encryption_key;
1054
0
  CK_OBJECT_HANDLE authentication_key;
1055
1056
0
  BEGIN_CALL (SetOperationState);
1057
0
    IN_ULONG (session);
1058
0
    IN_BYTE_ARRAY (operation_state, operation_state_len);
1059
0
    IN_ULONG (encryption_key);
1060
0
    IN_ULONG (authentication_key);
1061
0
  PROCESS_CALL ((self, session, operation_state, operation_state_len, encryption_key, authentication_key));
1062
0
  END_CALL;
1063
0
}
1064
1065
static CK_RV
1066
rpc_C_Login (CK_X_FUNCTION_LIST *self,
1067
             p11_rpc_message *msg)
1068
0
{
1069
0
  CK_SESSION_HANDLE session;
1070
0
  CK_USER_TYPE user_type;
1071
0
  CK_UTF8CHAR_PTR pin;
1072
0
  CK_ULONG pin_len;
1073
1074
0
  BEGIN_CALL (Login);
1075
0
    IN_ULONG (session);
1076
0
    IN_ULONG (user_type);
1077
0
    IN_BYTE_ARRAY (pin, pin_len);
1078
0
  PROCESS_CALL ((self, session, user_type, pin, pin_len));
1079
0
  END_CALL;
1080
0
}
1081
1082
static CK_RV
1083
rpc_C_Logout (CK_X_FUNCTION_LIST *self,
1084
              p11_rpc_message *msg)
1085
0
{
1086
0
  CK_SESSION_HANDLE session;
1087
1088
0
  BEGIN_CALL (Logout);
1089
0
    IN_ULONG (session);
1090
0
  PROCESS_CALL ((self, session));
1091
0
  END_CALL;
1092
0
}
1093
1094
static CK_RV
1095
rpc_C_CreateObject (CK_X_FUNCTION_LIST *self,
1096
                    p11_rpc_message *msg)
1097
6
{
1098
6
  CK_SESSION_HANDLE session;
1099
6
  CK_ATTRIBUTE_PTR template;
1100
6
  CK_ULONG count;
1101
6
  CK_OBJECT_HANDLE new_object;
1102
1103
12
  BEGIN_CALL (CreateObject);
1104
6
    IN_ULONG (session);
1105
6
    IN_ATTRIBUTE_ARRAY (template, count);
1106
1
  PROCESS_CALL ((self, session, template, count, &new_object));
1107
1
    OUT_ULONG (new_object);
1108
6
  END_CALL;
1109
0
}
1110
1111
static CK_RV
1112
rpc_C_CopyObject (CK_X_FUNCTION_LIST *self,
1113
                  p11_rpc_message *msg)
1114
0
{
1115
0
  CK_SESSION_HANDLE session;
1116
0
  CK_OBJECT_HANDLE object;
1117
0
  CK_ATTRIBUTE_PTR template;
1118
0
  CK_ULONG count;
1119
0
  CK_OBJECT_HANDLE new_object;
1120
1121
0
  BEGIN_CALL (CopyObject);
1122
0
    IN_ULONG (session);
1123
0
    IN_ULONG (object);
1124
0
    IN_ATTRIBUTE_ARRAY (template, count);
1125
0
  PROCESS_CALL ((self, session, object, template, count, &new_object));
1126
0
    OUT_ULONG (new_object);
1127
0
  END_CALL;
1128
0
}
1129
1130
static CK_RV
1131
rpc_C_DestroyObject (CK_X_FUNCTION_LIST *self,
1132
                     p11_rpc_message *msg)
1133
0
{
1134
0
  CK_SESSION_HANDLE session;
1135
0
  CK_OBJECT_HANDLE object;
1136
1137
0
  BEGIN_CALL (DestroyObject);
1138
0
    IN_ULONG (session);
1139
0
    IN_ULONG (object);
1140
0
  PROCESS_CALL ((self, session, object));
1141
0
  END_CALL;
1142
0
}
1143
1144
static CK_RV
1145
rpc_C_GetObjectSize (CK_X_FUNCTION_LIST *self,
1146
                     p11_rpc_message *msg)
1147
0
{
1148
0
  CK_SESSION_HANDLE session;
1149
0
  CK_OBJECT_HANDLE object;
1150
0
  CK_ULONG size;
1151
1152
0
  BEGIN_CALL (GetObjectSize);
1153
0
    IN_ULONG (session);
1154
0
    IN_ULONG (object);
1155
0
  PROCESS_CALL ((self, session, object, &size));
1156
0
    OUT_ULONG (size);
1157
0
  END_CALL;
1158
0
}
1159
1160
static CK_RV
1161
rpc_C_GetAttributeValue (CK_X_FUNCTION_LIST *self,
1162
                         p11_rpc_message *msg)
1163
2
{
1164
2
  CK_SESSION_HANDLE session;
1165
2
  CK_OBJECT_HANDLE object;
1166
2
  CK_ATTRIBUTE_PTR template;
1167
2
  CK_ULONG count;
1168
1169
4
  BEGIN_CALL (GetAttributeValue);
1170
2
    IN_ULONG (session);
1171
2
    IN_ULONG (object);
1172
2
    IN_ATTRIBUTE_BUFFER (template, count);
1173
2
  PROCESS_CALL ((self, session, object, template, count));
1174
2
    OUT_ATTRIBUTE_ARRAY (template, count);
1175
2
  END_CALL;
1176
0
}
1177
1178
static CK_RV
1179
rpc_C_SetAttributeValue (CK_X_FUNCTION_LIST *self,
1180
                         p11_rpc_message *msg)
1181
0
{
1182
0
  CK_SESSION_HANDLE session;
1183
0
  CK_OBJECT_HANDLE object;
1184
0
  CK_ATTRIBUTE_PTR template;
1185
0
  CK_ULONG count;
1186
1187
0
  BEGIN_CALL (SetAttributeValue);
1188
0
    IN_ULONG (session);
1189
0
    IN_ULONG (object);
1190
0
    IN_ATTRIBUTE_ARRAY (template, count);
1191
0
  PROCESS_CALL ((self, session, object, template, count));
1192
0
  END_CALL;
1193
0
}
1194
1195
static CK_RV
1196
rpc_C_FindObjectsInit (CK_X_FUNCTION_LIST *self,
1197
                       p11_rpc_message *msg)
1198
2
{
1199
2
  CK_SESSION_HANDLE session;
1200
2
  CK_ATTRIBUTE_PTR template;
1201
2
  CK_ULONG count;
1202
1203
4
  BEGIN_CALL (FindObjectsInit);
1204
2
    IN_ULONG (session);
1205
2
    IN_ATTRIBUTE_ARRAY (template, count);
1206
0
  PROCESS_CALL ((self, session, template, count));
1207
2
  END_CALL;
1208
0
}
1209
1210
static CK_RV
1211
rpc_C_FindObjects (CK_X_FUNCTION_LIST *self,
1212
                    p11_rpc_message *msg)
1213
0
{
1214
0
  CK_SESSION_HANDLE session;
1215
0
  CK_OBJECT_HANDLE_PTR objects;
1216
0
  CK_ULONG max_object_count;
1217
0
  CK_ULONG object_count;
1218
1219
0
  BEGIN_CALL (FindObjects);
1220
0
    IN_ULONG (session);
1221
0
    IN_ULONG_BUFFER (objects, max_object_count);
1222
0
  PROCESS_CALL ((self, session, objects, max_object_count, &object_count));
1223
0
    OUT_ULONG_ARRAY (objects, object_count);
1224
0
  END_CALL;
1225
0
}
1226
1227
static CK_RV
1228
rpc_C_FindObjectsFinal (CK_X_FUNCTION_LIST *self,
1229
                        p11_rpc_message *msg)
1230
0
{
1231
0
  CK_SESSION_HANDLE session;
1232
1233
0
  BEGIN_CALL (FindObjectsFinal);
1234
0
    IN_ULONG (session);
1235
0
  PROCESS_CALL ((self, session));
1236
0
  END_CALL;
1237
0
}
1238
1239
static CK_RV
1240
rpc_C_EncryptInit (CK_X_FUNCTION_LIST *self,
1241
                   p11_rpc_message *msg)
1242
0
{
1243
0
  CK_SESSION_HANDLE session;
1244
0
  CK_MECHANISM mechanism_;
1245
0
  CK_MECHANISM_PTR mechanism = &mechanism_;
1246
0
  CK_OBJECT_HANDLE key;
1247
1248
0
  BEGIN_CALL (EncryptInit);
1249
0
    IN_ULONG (session);
1250
0
    IN_MECHANISM (mechanism);
1251
0
    IN_ULONG (key);
1252
0
  PROCESS_CALL ((self, session, mechanism, key));
1253
0
  END_CALL;
1254
1255
0
}
1256
1257
static CK_RV
1258
rpc_C_Encrypt (CK_X_FUNCTION_LIST *self,
1259
               p11_rpc_message *msg)
1260
0
{
1261
0
  CK_SESSION_HANDLE session;
1262
0
  CK_BYTE_PTR data;
1263
0
  CK_ULONG data_len;
1264
0
  CK_BYTE_PTR encrypted_data;
1265
0
  CK_ULONG encrypted_data_len;
1266
1267
0
  BEGIN_CALL (Encrypt);
1268
0
    IN_ULONG (session);
1269
0
    IN_BYTE_ARRAY (data, data_len);
1270
0
    IN_BYTE_BUFFER (encrypted_data, encrypted_data_len);
1271
0
  PROCESS_CALL ((self, session, data, data_len, encrypted_data, &encrypted_data_len));
1272
0
    OUT_BYTE_ARRAY (encrypted_data, encrypted_data_len);
1273
0
  END_CALL;
1274
0
}
1275
1276
static CK_RV
1277
rpc_C_EncryptUpdate (CK_X_FUNCTION_LIST *self,
1278
                        p11_rpc_message *msg)
1279
0
{
1280
0
  CK_SESSION_HANDLE session;
1281
0
  CK_BYTE_PTR part;
1282
0
  CK_ULONG part_len;
1283
0
  CK_BYTE_PTR encrypted_part;
1284
0
  CK_ULONG encrypted_part_len;
1285
1286
0
  BEGIN_CALL (EncryptUpdate);
1287
0
    IN_ULONG (session);
1288
0
    IN_BYTE_ARRAY (part, part_len);
1289
0
    IN_BYTE_BUFFER (encrypted_part, encrypted_part_len);
1290
0
  PROCESS_CALL ((self, session, part, part_len, encrypted_part, &encrypted_part_len));
1291
0
    OUT_BYTE_ARRAY (encrypted_part, encrypted_part_len);
1292
0
  END_CALL;
1293
0
}
1294
1295
static CK_RV
1296
rpc_C_EncryptFinal (CK_X_FUNCTION_LIST *self,
1297
                    p11_rpc_message *msg)
1298
0
{
1299
0
  CK_SESSION_HANDLE session;
1300
0
  CK_BYTE_PTR last_encrypted_part;
1301
0
  CK_ULONG last_encrypted_part_len;
1302
1303
0
  BEGIN_CALL (EncryptFinal);
1304
0
    IN_ULONG (session);
1305
0
    IN_BYTE_BUFFER (last_encrypted_part, last_encrypted_part_len);
1306
0
  PROCESS_CALL ((self, session, last_encrypted_part, &last_encrypted_part_len));
1307
0
    OUT_BYTE_ARRAY (last_encrypted_part, last_encrypted_part_len);
1308
0
  END_CALL;
1309
0
}
1310
1311
static CK_RV
1312
rpc_C_DecryptInit (CK_X_FUNCTION_LIST *self,
1313
                    p11_rpc_message *msg)
1314
1
{
1315
1
  CK_SESSION_HANDLE session;
1316
1
  CK_MECHANISM mechanism_;
1317
1
  CK_MECHANISM_PTR mechanism = &mechanism_;
1318
1
  CK_OBJECT_HANDLE key;
1319
1320
2
  BEGIN_CALL (DecryptInit);
1321
1
    IN_ULONG (session);
1322
1
    IN_MECHANISM (mechanism);
1323
1
    IN_ULONG (key);
1324
1
  PROCESS_CALL ((self, session, mechanism, key));
1325
1
  END_CALL;
1326
0
}
1327
1328
static CK_RV
1329
rpc_C_Decrypt (CK_X_FUNCTION_LIST *self,
1330
               p11_rpc_message *msg)
1331
0
{
1332
0
  CK_SESSION_HANDLE session;
1333
0
  CK_BYTE_PTR encrypted_data;
1334
0
  CK_ULONG encrypted_data_len;
1335
0
  CK_BYTE_PTR data;
1336
0
  CK_ULONG data_len;
1337
1338
0
  BEGIN_CALL (Decrypt);
1339
0
    IN_ULONG (session);
1340
0
    IN_BYTE_ARRAY (encrypted_data, encrypted_data_len);
1341
0
    IN_BYTE_BUFFER (data, data_len);
1342
0
  PROCESS_CALL ((self, session, encrypted_data, encrypted_data_len, data, &data_len));
1343
0
    OUT_BYTE_ARRAY (data, data_len);
1344
0
  END_CALL;
1345
0
}
1346
1347
static CK_RV
1348
rpc_C_DecryptUpdate (CK_X_FUNCTION_LIST *self,
1349
                     p11_rpc_message *msg)
1350
0
{
1351
0
  CK_SESSION_HANDLE session;
1352
0
  CK_BYTE_PTR encrypted_part;
1353
0
  CK_ULONG encrypted_part_len;
1354
0
  CK_BYTE_PTR part;
1355
0
  CK_ULONG part_len;
1356
1357
0
  BEGIN_CALL (DecryptUpdate);
1358
0
    IN_ULONG (session);
1359
0
    IN_BYTE_ARRAY (encrypted_part, encrypted_part_len);
1360
0
    IN_BYTE_BUFFER (part, part_len);
1361
0
  PROCESS_CALL ((self, session, encrypted_part, encrypted_part_len, part, &part_len));
1362
0
    OUT_BYTE_ARRAY (part, part_len);
1363
0
  END_CALL;
1364
0
}
1365
1366
static CK_RV
1367
rpc_C_DecryptFinal (CK_X_FUNCTION_LIST *self,
1368
                    p11_rpc_message *msg)
1369
0
{
1370
0
  CK_SESSION_HANDLE session;
1371
0
  CK_BYTE_PTR last_part;
1372
0
  CK_ULONG last_part_len;
1373
1374
0
  BEGIN_CALL (DecryptFinal);
1375
0
    IN_ULONG (session);
1376
0
    IN_BYTE_BUFFER (last_part, last_part_len);
1377
0
  PROCESS_CALL ((self, session, last_part, &last_part_len));
1378
0
    OUT_BYTE_ARRAY (last_part, last_part_len);
1379
0
  END_CALL;
1380
0
}
1381
1382
static CK_RV
1383
rpc_C_DigestInit (CK_X_FUNCTION_LIST *self,
1384
                  p11_rpc_message *msg)
1385
16
{
1386
16
  CK_SESSION_HANDLE session;
1387
16
  CK_MECHANISM mechanism_;
1388
16
  CK_MECHANISM_PTR mechanism = &mechanism_;
1389
1390
32
  BEGIN_CALL (DigestInit);
1391
16
    IN_ULONG (session);
1392
16
    IN_MECHANISM (mechanism);
1393
10
  PROCESS_CALL ((self, session, mechanism));
1394
16
  END_CALL;
1395
0
}
1396
1397
static CK_RV
1398
rpc_C_Digest (CK_X_FUNCTION_LIST *self,
1399
              p11_rpc_message *msg)
1400
0
{
1401
0
  CK_SESSION_HANDLE session;
1402
0
  CK_BYTE_PTR data;
1403
0
  CK_ULONG data_len;
1404
0
  CK_BYTE_PTR digest;
1405
0
  CK_ULONG digest_len;
1406
1407
0
  BEGIN_CALL (Digest);
1408
0
    IN_ULONG (session);
1409
0
    IN_BYTE_ARRAY (data, data_len);
1410
0
    IN_BYTE_BUFFER (digest, digest_len);
1411
0
  PROCESS_CALL ((self, session, data, data_len, digest, &digest_len));
1412
0
    OUT_BYTE_ARRAY (digest, digest_len);
1413
0
  END_CALL;
1414
0
}
1415
1416
static CK_RV
1417
rpc_C_DigestUpdate (CK_X_FUNCTION_LIST *self,
1418
                    p11_rpc_message *msg)
1419
0
{
1420
0
  CK_SESSION_HANDLE session;
1421
0
  CK_BYTE_PTR part;
1422
0
  CK_ULONG part_len;
1423
1424
0
  BEGIN_CALL (DigestUpdate);
1425
0
    IN_ULONG (session);
1426
0
    IN_BYTE_ARRAY (part, part_len);
1427
0
  PROCESS_CALL ((self, session, part, part_len));
1428
0
  END_CALL;
1429
0
}
1430
1431
static CK_RV
1432
rpc_C_DigestKey (CK_X_FUNCTION_LIST *self,
1433
                 p11_rpc_message *msg)
1434
0
{
1435
0
  CK_SESSION_HANDLE session;
1436
0
  CK_OBJECT_HANDLE key;
1437
1438
0
  BEGIN_CALL (DigestKey);
1439
0
    IN_ULONG (session);
1440
0
    IN_ULONG (key);
1441
0
  PROCESS_CALL ((self, session, key));
1442
0
  END_CALL;
1443
0
}
1444
1445
static CK_RV
1446
rpc_C_DigestFinal (CK_X_FUNCTION_LIST *self,
1447
                   p11_rpc_message *msg)
1448
0
{
1449
0
  CK_SESSION_HANDLE session;
1450
0
  CK_BYTE_PTR digest;
1451
0
  CK_ULONG digest_len;
1452
1453
0
  BEGIN_CALL (DigestFinal);
1454
0
    IN_ULONG (session);
1455
0
    IN_BYTE_BUFFER (digest, digest_len);
1456
0
  PROCESS_CALL ((self, session, digest, &digest_len));
1457
0
    OUT_BYTE_ARRAY (digest, digest_len);
1458
0
  END_CALL;
1459
0
}
1460
1461
static CK_RV
1462
rpc_C_SignInit (CK_X_FUNCTION_LIST *self,
1463
                p11_rpc_message *msg)
1464
0
{
1465
0
  CK_SESSION_HANDLE session;
1466
0
  CK_MECHANISM mechanism_;
1467
0
  CK_MECHANISM_PTR mechanism = &mechanism_;
1468
0
  CK_OBJECT_HANDLE key;
1469
1470
0
  BEGIN_CALL (SignInit);
1471
0
    IN_ULONG (session);
1472
0
    IN_MECHANISM (mechanism);
1473
0
    IN_ULONG (key);
1474
0
  PROCESS_CALL ((self, session, mechanism, key));
1475
0
  END_CALL;
1476
0
}
1477
1478
static CK_RV
1479
rpc_C_Sign (CK_X_FUNCTION_LIST *self,
1480
            p11_rpc_message *msg)
1481
0
{
1482
0
  CK_SESSION_HANDLE session;
1483
0
  CK_BYTE_PTR part;
1484
0
  CK_ULONG part_len;
1485
0
  CK_BYTE_PTR signature;
1486
0
  CK_ULONG signature_len;
1487
1488
0
  BEGIN_CALL (Sign);
1489
0
    IN_ULONG (session);
1490
0
    IN_BYTE_ARRAY (part, part_len);
1491
0
    IN_BYTE_BUFFER (signature, signature_len);
1492
0
  PROCESS_CALL ((self, session, part, part_len, signature, &signature_len));
1493
0
    OUT_BYTE_ARRAY (signature, signature_len);
1494
0
  END_CALL;
1495
1496
0
}
1497
1498
static CK_RV
1499
rpc_C_SignUpdate (CK_X_FUNCTION_LIST *self,
1500
                  p11_rpc_message *msg)
1501
0
{
1502
0
  CK_SESSION_HANDLE session;
1503
0
  CK_BYTE_PTR part;
1504
0
  CK_ULONG part_len;
1505
1506
0
  BEGIN_CALL (SignUpdate);
1507
0
    IN_ULONG (session);
1508
0
    IN_BYTE_ARRAY (part, part_len);
1509
0
  PROCESS_CALL ((self, session, part, part_len));
1510
0
  END_CALL;
1511
0
}
1512
1513
static CK_RV
1514
rpc_C_SignFinal (CK_X_FUNCTION_LIST *self,
1515
                 p11_rpc_message *msg)
1516
0
{
1517
0
  CK_SESSION_HANDLE session;
1518
0
  CK_BYTE_PTR signature;
1519
0
  CK_ULONG signature_len;
1520
1521
0
  BEGIN_CALL (SignFinal);
1522
0
    IN_ULONG (session);
1523
0
    IN_BYTE_BUFFER (signature, signature_len);
1524
0
  PROCESS_CALL ((self, session, signature, &signature_len));
1525
0
    OUT_BYTE_ARRAY (signature, signature_len);
1526
0
  END_CALL;
1527
0
}
1528
1529
static CK_RV
1530
rpc_C_SignRecoverInit (CK_X_FUNCTION_LIST *self,
1531
                       p11_rpc_message *msg)
1532
0
{
1533
0
  CK_SESSION_HANDLE session;
1534
0
  CK_MECHANISM mechanism_;
1535
0
  CK_MECHANISM_PTR mechanism = &mechanism_;
1536
0
  CK_OBJECT_HANDLE key;
1537
1538
0
  BEGIN_CALL (SignRecoverInit);
1539
0
    IN_ULONG (session);
1540
0
    IN_MECHANISM (mechanism);
1541
0
    IN_ULONG (key);
1542
0
  PROCESS_CALL ((self, session, mechanism, key));
1543
0
  END_CALL;
1544
0
}
1545
1546
static CK_RV
1547
rpc_C_SignRecover (CK_X_FUNCTION_LIST *self,
1548
                   p11_rpc_message *msg)
1549
0
{
1550
0
  CK_SESSION_HANDLE session;
1551
0
  CK_BYTE_PTR data;
1552
0
  CK_ULONG data_len;
1553
0
  CK_BYTE_PTR signature;
1554
0
  CK_ULONG signature_len;
1555
1556
0
  BEGIN_CALL (SignRecover);
1557
0
    IN_ULONG (session);
1558
0
    IN_BYTE_ARRAY (data, data_len);
1559
0
    IN_BYTE_BUFFER (signature, signature_len);
1560
0
  PROCESS_CALL ((self, session, data, data_len, signature, &signature_len));
1561
0
    OUT_BYTE_ARRAY (signature, signature_len);
1562
0
  END_CALL;
1563
0
}
1564
1565
static CK_RV
1566
rpc_C_VerifyInit (CK_X_FUNCTION_LIST *self,
1567
                  p11_rpc_message *msg)
1568
0
{
1569
0
  CK_SESSION_HANDLE session;
1570
0
  CK_MECHANISM mechanism_;
1571
0
  CK_MECHANISM_PTR mechanism = &mechanism_;
1572
0
  CK_OBJECT_HANDLE key;
1573
1574
0
  BEGIN_CALL (VerifyInit);
1575
0
    IN_ULONG (session);
1576
0
    IN_MECHANISM (mechanism);
1577
0
    IN_ULONG (key);
1578
0
  PROCESS_CALL ((self, session, mechanism, key));
1579
0
  END_CALL;
1580
0
}
1581
1582
static CK_RV
1583
rpc_C_Verify (CK_X_FUNCTION_LIST *self,
1584
              p11_rpc_message *msg)
1585
0
{
1586
0
  CK_SESSION_HANDLE session;
1587
0
  CK_BYTE_PTR data;
1588
0
  CK_ULONG data_len;
1589
0
  CK_BYTE_PTR signature;
1590
0
  CK_ULONG signature_len;
1591
1592
0
  BEGIN_CALL (Verify);
1593
0
    IN_ULONG (session);
1594
0
    IN_BYTE_ARRAY (data, data_len);
1595
0
    IN_BYTE_ARRAY (signature, signature_len);
1596
0
  PROCESS_CALL ((self, session, data, data_len, signature, signature_len));
1597
0
  END_CALL;
1598
0
}
1599
1600
static CK_RV
1601
rpc_C_VerifyUpdate (CK_X_FUNCTION_LIST *self,
1602
                    p11_rpc_message *msg)
1603
0
{
1604
0
  CK_SESSION_HANDLE session;
1605
0
  CK_BYTE_PTR part;
1606
0
  CK_ULONG part_len;
1607
1608
0
  BEGIN_CALL (VerifyUpdate);
1609
0
    IN_ULONG (session);
1610
0
    IN_BYTE_ARRAY (part, part_len);
1611
0
  PROCESS_CALL ((self, session, part, part_len));
1612
0
  END_CALL;
1613
0
}
1614
1615
static CK_RV
1616
rpc_C_VerifyFinal (CK_X_FUNCTION_LIST *self,
1617
                   p11_rpc_message *msg)
1618
0
{
1619
0
  CK_SESSION_HANDLE session;
1620
0
  CK_BYTE_PTR signature;
1621
0
  CK_ULONG signature_len;
1622
1623
0
  BEGIN_CALL (VerifyFinal);
1624
0
    IN_ULONG (session);
1625
0
    IN_BYTE_ARRAY (signature, signature_len);
1626
0
  PROCESS_CALL ((self, session, signature, signature_len));
1627
0
  END_CALL;
1628
0
}
1629
1630
static CK_RV
1631
rpc_C_VerifyRecoverInit (CK_X_FUNCTION_LIST *self,
1632
                         p11_rpc_message *msg)
1633
0
{
1634
0
  CK_SESSION_HANDLE session;
1635
0
  CK_MECHANISM mechanism_;
1636
0
  CK_MECHANISM_PTR mechanism = &mechanism_;
1637
0
  CK_OBJECT_HANDLE key;
1638
1639
0
  BEGIN_CALL (VerifyRecoverInit);
1640
0
    IN_ULONG (session);
1641
0
    IN_MECHANISM (mechanism);
1642
0
    IN_ULONG (key);
1643
0
  PROCESS_CALL ((self, session, mechanism, key));
1644
0
  END_CALL;
1645
0
}
1646
1647
static CK_RV
1648
rpc_C_VerifyRecover (CK_X_FUNCTION_LIST *self,
1649
                     p11_rpc_message *msg)
1650
0
{
1651
0
  CK_SESSION_HANDLE session;
1652
0
  CK_BYTE_PTR signature;
1653
0
  CK_ULONG signature_len;
1654
0
  CK_BYTE_PTR data;
1655
0
  CK_ULONG data_len;
1656
1657
0
  BEGIN_CALL (VerifyRecover);
1658
0
    IN_ULONG (session);
1659
0
    IN_BYTE_ARRAY (signature, signature_len);
1660
0
    IN_BYTE_BUFFER (data, data_len);
1661
0
  PROCESS_CALL ((self, session, signature, signature_len, data, &data_len));
1662
0
    OUT_BYTE_ARRAY (data, data_len);
1663
0
  END_CALL;
1664
0
}
1665
1666
static CK_RV
1667
rpc_C_DigestEncryptUpdate (CK_X_FUNCTION_LIST *self,
1668
                           p11_rpc_message *msg)
1669
0
{
1670
0
  CK_SESSION_HANDLE session;
1671
0
  CK_BYTE_PTR part;
1672
0
  CK_ULONG part_len;
1673
0
  CK_BYTE_PTR encrypted_part;
1674
0
  CK_ULONG encrypted_part_len;
1675
1676
0
  BEGIN_CALL (DigestEncryptUpdate);
1677
0
    IN_ULONG (session);
1678
0
    IN_BYTE_ARRAY (part, part_len);
1679
0
    IN_BYTE_BUFFER (encrypted_part, encrypted_part_len);
1680
0
  PROCESS_CALL ((self, session, part, part_len, encrypted_part, &encrypted_part_len));
1681
0
    OUT_BYTE_ARRAY (encrypted_part, encrypted_part_len);
1682
0
  END_CALL;
1683
0
}
1684
1685
static CK_RV
1686
rpc_C_DecryptDigestUpdate (CK_X_FUNCTION_LIST *self,
1687
                                    p11_rpc_message *msg)
1688
0
{
1689
0
  CK_SESSION_HANDLE session;
1690
0
  CK_BYTE_PTR encrypted_part;
1691
0
  CK_ULONG encrypted_part_len;
1692
0
  CK_BYTE_PTR part;
1693
0
  CK_ULONG part_len;
1694
1695
0
  BEGIN_CALL (DecryptDigestUpdate);
1696
0
    IN_ULONG (session);
1697
0
    IN_BYTE_ARRAY (encrypted_part, encrypted_part_len);
1698
0
    IN_BYTE_BUFFER (part, part_len);
1699
0
  PROCESS_CALL ((self, session, encrypted_part, encrypted_part_len, part, &part_len));
1700
0
    OUT_BYTE_ARRAY (part, part_len);
1701
0
  END_CALL;
1702
0
}
1703
1704
static CK_RV
1705
rpc_C_SignEncryptUpdate (CK_X_FUNCTION_LIST *self,
1706
                         p11_rpc_message *msg)
1707
0
{
1708
0
  CK_SESSION_HANDLE session;
1709
0
  CK_BYTE_PTR part;
1710
0
  CK_ULONG part_len;
1711
0
  CK_BYTE_PTR encrypted_part;
1712
0
  CK_ULONG encrypted_part_len;
1713
1714
0
  BEGIN_CALL (SignEncryptUpdate);
1715
0
    IN_ULONG (session);
1716
0
    IN_BYTE_ARRAY (part, part_len);
1717
0
    IN_BYTE_BUFFER (encrypted_part, encrypted_part_len);
1718
0
  PROCESS_CALL ((self, session, part, part_len, encrypted_part, &encrypted_part_len));
1719
0
    OUT_BYTE_ARRAY (encrypted_part, encrypted_part_len);
1720
0
  END_CALL;
1721
0
}
1722
1723
static CK_RV
1724
rpc_C_DecryptVerifyUpdate (CK_X_FUNCTION_LIST *self,
1725
                           p11_rpc_message *msg)
1726
0
{
1727
0
  CK_SESSION_HANDLE session;
1728
0
  CK_BYTE_PTR encrypted_part;
1729
0
  CK_ULONG encrypted_part_len;
1730
0
  CK_BYTE_PTR part;
1731
0
  CK_ULONG part_len;
1732
1733
0
  BEGIN_CALL (DecryptVerifyUpdate);
1734
0
    IN_ULONG (session);
1735
0
    IN_BYTE_ARRAY (encrypted_part, encrypted_part_len);
1736
0
    IN_BYTE_BUFFER (part, part_len);
1737
0
  PROCESS_CALL ((self, session, encrypted_part, encrypted_part_len, part, &part_len));
1738
0
    OUT_BYTE_ARRAY (part, part_len);
1739
0
  END_CALL;
1740
0
}
1741
1742
static CK_RV
1743
rpc_C_GenerateKey (CK_X_FUNCTION_LIST *self,
1744
                   p11_rpc_message *msg)
1745
1
{
1746
1
  CK_SESSION_HANDLE session;
1747
1
  CK_MECHANISM mechanism_;
1748
1
  CK_MECHANISM_PTR mechanism = &mechanism_;
1749
1
  CK_ATTRIBUTE_PTR template;
1750
1
  CK_ULONG count;
1751
1
  CK_OBJECT_HANDLE key;
1752
1753
2
  BEGIN_CALL (GenerateKey);
1754
1
    IN_ULONG (session);
1755
1
    IN_MECHANISM (mechanism);
1756
1
    IN_ATTRIBUTE_ARRAY (template, count);
1757
1
  PROCESS_CALL ((self, session, mechanism, template, count, &key));
1758
1
    OUT_ULONG (key);
1759
1
  END_CALL;
1760
0
}
1761
1762
static CK_RV
1763
rpc_C_GenerateKeyPair (CK_X_FUNCTION_LIST *self,
1764
                       p11_rpc_message *msg)
1765
0
{
1766
0
  CK_SESSION_HANDLE session;
1767
0
  CK_MECHANISM mechanism_;
1768
0
  CK_MECHANISM_PTR mechanism = &mechanism_;
1769
0
  CK_ATTRIBUTE_PTR public_key_template;
1770
0
  CK_ULONG public_key_attribute_count;
1771
0
  CK_ATTRIBUTE_PTR private_key_template;
1772
0
  CK_ULONG private_key_attribute_count;
1773
0
  CK_OBJECT_HANDLE public_key;
1774
0
  CK_OBJECT_HANDLE private_key;
1775
1776
0
  BEGIN_CALL (GenerateKeyPair);
1777
0
    IN_ULONG (session);
1778
0
    IN_MECHANISM (mechanism);
1779
0
    IN_ATTRIBUTE_ARRAY (public_key_template, public_key_attribute_count);
1780
0
    IN_ATTRIBUTE_ARRAY (private_key_template, private_key_attribute_count);
1781
0
  PROCESS_CALL ((self, session, mechanism, public_key_template, public_key_attribute_count,
1782
0
                 private_key_template, private_key_attribute_count, &public_key, &private_key));
1783
0
    OUT_ULONG (public_key);
1784
0
    OUT_ULONG (private_key);
1785
0
  END_CALL;
1786
0
}
1787
1788
static CK_RV
1789
rpc_C_WrapKey (CK_X_FUNCTION_LIST *self,
1790
               p11_rpc_message *msg)
1791
0
{
1792
0
  CK_SESSION_HANDLE session;
1793
0
  CK_MECHANISM mechanism_;
1794
0
  CK_MECHANISM_PTR mechanism = &mechanism_;
1795
0
  CK_OBJECT_HANDLE wrapping_key;
1796
0
  CK_OBJECT_HANDLE key;
1797
0
  CK_BYTE_PTR wrapped_key;
1798
0
  CK_ULONG wrapped_key_len;
1799
1800
0
  BEGIN_CALL (WrapKey);
1801
0
    IN_ULONG (session);
1802
0
    IN_MECHANISM (mechanism);
1803
0
    IN_ULONG (wrapping_key);
1804
0
    IN_ULONG (key);
1805
0
    IN_BYTE_BUFFER (wrapped_key, wrapped_key_len);
1806
0
  PROCESS_CALL ((self, session, mechanism, wrapping_key, key, wrapped_key, &wrapped_key_len));
1807
0
    OUT_BYTE_ARRAY (wrapped_key, wrapped_key_len);
1808
0
  END_CALL;
1809
0
}
1810
1811
static CK_RV
1812
rpc_C_UnwrapKey (CK_X_FUNCTION_LIST *self,
1813
                 p11_rpc_message *msg)
1814
0
{
1815
0
  CK_SESSION_HANDLE session;
1816
0
  CK_MECHANISM mechanism_;
1817
0
  CK_MECHANISM_PTR mechanism = &mechanism_;
1818
0
  CK_OBJECT_HANDLE unwrapping_key;
1819
0
  CK_BYTE_PTR wrapped_key;
1820
0
  CK_ULONG wrapped_key_len;
1821
0
  CK_ATTRIBUTE_PTR template;
1822
0
  CK_ULONG attribute_count;
1823
0
  CK_OBJECT_HANDLE key;
1824
1825
0
  BEGIN_CALL (UnwrapKey);
1826
0
    IN_ULONG (session);
1827
0
    IN_MECHANISM (mechanism);
1828
0
    IN_ULONG (unwrapping_key);
1829
0
    IN_BYTE_ARRAY (wrapped_key, wrapped_key_len);
1830
0
    IN_ATTRIBUTE_ARRAY (template, attribute_count);
1831
0
  PROCESS_CALL ((self, session, mechanism, unwrapping_key, wrapped_key, wrapped_key_len, template, attribute_count, &key));
1832
0
    OUT_ULONG (key);
1833
0
  END_CALL;
1834
0
}
1835
1836
static CK_RV
1837
rpc_C_DeriveKey (CK_X_FUNCTION_LIST *self,
1838
                 p11_rpc_message *msg)
1839
0
{
1840
0
  CK_SESSION_HANDLE session;
1841
0
  CK_MECHANISM mechanism_;
1842
0
  CK_MECHANISM_PTR mechanism = &mechanism_;
1843
0
  CK_OBJECT_HANDLE base_key;
1844
0
  CK_ATTRIBUTE_PTR template;
1845
0
  CK_ULONG attribute_count;
1846
0
  CK_OBJECT_HANDLE key;
1847
1848
0
  BEGIN_CALL (DeriveKey);
1849
0
    IN_ULONG (session);
1850
0
    IN_MECHANISM (mechanism);
1851
0
    IN_ULONG (base_key);
1852
0
    IN_ATTRIBUTE_ARRAY (template, attribute_count);
1853
0
  PROCESS_CALL ((self, session, mechanism, base_key, template, attribute_count, &key));
1854
0
    OUT_ULONG (key);
1855
0
  END_CALL;
1856
0
}
1857
1858
static CK_RV
1859
rpc_C_SeedRandom (CK_X_FUNCTION_LIST *self,
1860
                  p11_rpc_message *msg)
1861
0
{
1862
0
  CK_SESSION_HANDLE session;
1863
0
  CK_BYTE_PTR seed;
1864
0
  CK_ULONG seed_len;
1865
1866
0
  BEGIN_CALL (SeedRandom);
1867
0
    IN_ULONG (session);
1868
0
    IN_BYTE_ARRAY (seed, seed_len);
1869
0
  PROCESS_CALL ((self, session, seed, seed_len));
1870
0
  END_CALL;
1871
0
}
1872
1873
static CK_RV
1874
rpc_C_GenerateRandom (CK_X_FUNCTION_LIST *self,
1875
                      p11_rpc_message *msg)
1876
0
{
1877
0
  CK_SESSION_HANDLE session;
1878
0
  CK_BYTE_PTR random_data;
1879
0
  CK_ULONG random_len;
1880
1881
0
  BEGIN_CALL (GenerateRandom);
1882
0
    IN_ULONG (session);
1883
0
    IN_BYTE_BUFFER (random_data, random_len);
1884
0
  PROCESS_CALL ((self, session, random_data, random_len));
1885
0
    OUT_BYTE_ARRAY (random_data, random_len);
1886
0
  END_CALL;
1887
0
}
1888
1889
static CK_RV
1890
rpc_C_LoginUser (CK_X_FUNCTION_LIST *self,
1891
                 p11_rpc_message *msg)
1892
0
{
1893
0
  CK_SESSION_HANDLE session;
1894
0
  CK_USER_TYPE user_type;
1895
0
  CK_UTF8CHAR_PTR pin;
1896
0
  CK_ULONG pin_len;
1897
0
  CK_UTF8CHAR_PTR username;
1898
0
  CK_ULONG username_len;
1899
1900
0
  BEGIN_CALL (LoginUser);
1901
0
    IN_ULONG (session);
1902
0
    IN_ULONG (user_type);
1903
0
    IN_BYTE_ARRAY (pin, pin_len);
1904
0
    IN_BYTE_ARRAY (username, username_len);
1905
0
  PROCESS_CALL ((self, session, user_type, pin, pin_len, username, username_len));
1906
0
  END_CALL;
1907
0
}
1908
1909
static CK_RV
1910
rpc_C_SessionCancel (CK_X_FUNCTION_LIST *self,
1911
                     p11_rpc_message *msg)
1912
0
{
1913
0
  CK_SESSION_HANDLE session;
1914
0
  CK_FLAGS flags;
1915
1916
0
  BEGIN_CALL (SessionCancel);
1917
0
    IN_ULONG (session);
1918
0
    IN_ULONG (flags);
1919
0
  PROCESS_CALL ((self, session, flags));
1920
0
  END_CALL;
1921
0
}
1922
1923
static CK_RV
1924
rpc_C_MessageEncryptInit (CK_X_FUNCTION_LIST *self,
1925
                          p11_rpc_message *msg)
1926
0
{
1927
0
  CK_SESSION_HANDLE session;
1928
0
  CK_MECHANISM mechanism_;
1929
0
  CK_MECHANISM_PTR mechanism = &mechanism_;
1930
0
  CK_OBJECT_HANDLE key;
1931
1932
0
  BEGIN_CALL (MessageEncryptInit);
1933
0
    IN_ULONG (session);
1934
0
    IN_MECHANISM (mechanism);
1935
0
    IN_ULONG (key);
1936
0
  PROCESS_CALL ((self, session, mechanism, key));
1937
0
  END_CALL;
1938
0
}
1939
1940
static CK_RV
1941
rpc_C_EncryptMessage (CK_X_FUNCTION_LIST *self,
1942
                      p11_rpc_message *msg)
1943
0
{
1944
0
  CK_SESSION_HANDLE session;
1945
0
  CK_BYTE_PTR parameter;
1946
0
  CK_ULONG parameter_len;
1947
0
  CK_BYTE_PTR associated_data;
1948
0
  CK_ULONG associated_data_len;
1949
0
  CK_BYTE_PTR plaintext;
1950
0
  CK_ULONG plaintext_len;
1951
0
  CK_BYTE_PTR ciphertext;
1952
0
  CK_ULONG ciphertext_len;
1953
1954
0
  BEGIN_CALL (EncryptMessage);
1955
0
    IN_ULONG (session);
1956
0
    IN_BYTE_ARRAY (parameter, parameter_len);
1957
0
    IN_BYTE_ARRAY (associated_data, associated_data_len);
1958
0
    IN_BYTE_ARRAY (plaintext, plaintext_len);
1959
0
    IN_BYTE_BUFFER (ciphertext, ciphertext_len);
1960
0
  PROCESS_CALL ((self, session, (void *)parameter, parameter_len, associated_data, associated_data_len,
1961
0
                 plaintext, plaintext_len, ciphertext, &ciphertext_len));
1962
0
    OUT_BYTE_ARRAY (ciphertext, ciphertext_len);
1963
0
  END_CALL;
1964
0
}
1965
1966
static CK_RV
1967
rpc_C_EncryptMessageBegin (CK_X_FUNCTION_LIST *self,
1968
                           p11_rpc_message *msg)
1969
0
{
1970
0
  CK_SESSION_HANDLE session;
1971
0
  CK_BYTE_PTR parameter;
1972
0
  CK_ULONG parameter_len;
1973
0
  CK_BYTE_PTR associated_data;
1974
0
  CK_ULONG associated_data_len;
1975
1976
0
  BEGIN_CALL (EncryptMessageBegin);
1977
0
    IN_ULONG (session)
1978
0
    IN_BYTE_ARRAY (parameter, parameter_len)
1979
0
    IN_BYTE_ARRAY (associated_data, associated_data_len)
1980
0
  PROCESS_CALL ((self, session, (void *)parameter, parameter_len, associated_data, associated_data_len));
1981
0
  END_CALL;
1982
0
}
1983
1984
static CK_RV
1985
rpc_C_EncryptMessageNext (CK_X_FUNCTION_LIST *self,
1986
                          p11_rpc_message *msg)
1987
0
{
1988
0
  CK_SESSION_HANDLE session;
1989
0
  CK_BYTE_PTR parameter;
1990
0
  CK_ULONG parameter_len;
1991
0
  CK_BYTE_PTR plaintext_part;
1992
0
  CK_ULONG plaintext_part_len;
1993
0
  CK_BYTE_PTR ciphertext_part;
1994
0
  CK_ULONG ciphertext_part_len;
1995
0
  CK_FLAGS flags;
1996
1997
0
  BEGIN_CALL (EncryptMessageNext);
1998
0
    IN_ULONG (session);
1999
0
    IN_BYTE_ARRAY (parameter, parameter_len);
2000
0
    IN_BYTE_ARRAY (plaintext_part, plaintext_part_len);
2001
0
    IN_BYTE_BUFFER (ciphertext_part, ciphertext_part_len);
2002
0
    IN_ULONG (flags);
2003
0
  PROCESS_CALL ((self, session, (void *)parameter, parameter_len, plaintext_part, plaintext_part_len,
2004
0
                 ciphertext_part, &ciphertext_part_len, flags));
2005
0
    OUT_BYTE_ARRAY (ciphertext_part, ciphertext_part_len)
2006
0
  END_CALL;
2007
0
}
2008
2009
static CK_RV
2010
rpc_C_MessageEncryptFinal (CK_X_FUNCTION_LIST *self,
2011
                           p11_rpc_message *msg)
2012
0
{
2013
0
  CK_SESSION_HANDLE session;
2014
2015
0
  BEGIN_CALL (MessageEncryptFinal);
2016
0
    IN_ULONG (session);
2017
0
  PROCESS_CALL ((self, session));
2018
0
  END_CALL;
2019
0
}
2020
2021
static CK_RV
2022
rpc_C_MessageDecryptInit (CK_X_FUNCTION_LIST *self,
2023
                          p11_rpc_message *msg)
2024
0
{
2025
0
  CK_SESSION_HANDLE session;
2026
0
  CK_MECHANISM mechanism_;
2027
0
  CK_MECHANISM_PTR mechanism = &mechanism_;
2028
0
  CK_OBJECT_HANDLE key;
2029
2030
0
  BEGIN_CALL (MessageDecryptInit);
2031
0
    IN_ULONG (session);
2032
0
    IN_MECHANISM (mechanism);
2033
0
    IN_ULONG (key);
2034
0
  PROCESS_CALL ((self, session, mechanism, key));
2035
0
  END_CALL;
2036
0
}
2037
2038
static CK_RV
2039
rpc_C_DecryptMessage (CK_X_FUNCTION_LIST *self,
2040
                      p11_rpc_message *msg)
2041
0
{
2042
0
  CK_SESSION_HANDLE session;
2043
0
  CK_BYTE_PTR parameter;
2044
0
  CK_ULONG parameter_len;
2045
0
  CK_BYTE_PTR associated_data;
2046
0
  CK_ULONG associated_data_len;
2047
0
  CK_BYTE_PTR ciphertext;
2048
0
  CK_ULONG ciphertext_len;
2049
0
  CK_BYTE_PTR plaintext;
2050
0
  CK_ULONG plaintext_len;
2051
2052
0
  BEGIN_CALL (DecryptMessage);
2053
0
    IN_ULONG (session);
2054
0
    IN_BYTE_ARRAY (parameter, parameter_len);
2055
0
    IN_BYTE_ARRAY (associated_data, associated_data_len);
2056
0
    IN_BYTE_ARRAY (ciphertext, ciphertext_len);
2057
0
    IN_BYTE_BUFFER (plaintext, plaintext_len);
2058
0
  PROCESS_CALL ((self, session, (void *)parameter, parameter_len, associated_data, associated_data_len,
2059
0
                 ciphertext, ciphertext_len, plaintext, &plaintext_len));
2060
0
    OUT_BYTE_ARRAY (plaintext, plaintext_len);
2061
0
  END_CALL;
2062
0
}
2063
2064
static CK_RV
2065
rpc_C_DecryptMessageBegin (CK_X_FUNCTION_LIST *self,
2066
                           p11_rpc_message *msg)
2067
0
{
2068
0
  CK_SESSION_HANDLE session;
2069
0
  CK_BYTE_PTR parameter;
2070
0
  CK_ULONG parameter_len;
2071
0
  CK_BYTE_PTR associated_data;
2072
0
  CK_ULONG associated_data_len;
2073
2074
0
  BEGIN_CALL (DecryptMessageBegin);
2075
0
    IN_ULONG (session);
2076
0
    IN_BYTE_ARRAY (parameter, parameter_len);
2077
0
    IN_BYTE_ARRAY (associated_data, associated_data_len);
2078
0
  PROCESS_CALL ((self, session, (void *)parameter, parameter_len, associated_data, associated_data_len));
2079
0
  END_CALL;
2080
0
}
2081
2082
static CK_RV
2083
rpc_C_DecryptMessageNext (CK_X_FUNCTION_LIST *self,
2084
                          p11_rpc_message *msg)
2085
0
{
2086
0
  CK_SESSION_HANDLE session;
2087
0
  CK_BYTE_PTR parameter;
2088
0
  CK_ULONG parameter_len;
2089
0
  CK_BYTE_PTR ciphertext_part;
2090
0
  CK_ULONG ciphertext_part_len;
2091
0
  CK_BYTE_PTR plaintext_part;
2092
0
  CK_ULONG plaintext_part_len;
2093
0
  CK_FLAGS flags;
2094
2095
0
  BEGIN_CALL (DecryptMessageNext);
2096
0
    IN_ULONG (session);
2097
0
    IN_BYTE_ARRAY (parameter, parameter_len);
2098
0
    IN_BYTE_ARRAY (ciphertext_part, ciphertext_part_len);
2099
0
    IN_BYTE_BUFFER (plaintext_part, plaintext_part_len);
2100
0
    IN_ULONG (flags);
2101
0
  PROCESS_CALL ((self, session, (void *)parameter, parameter_len, ciphertext_part, ciphertext_part_len,
2102
0
                 plaintext_part, &plaintext_part_len, flags));
2103
0
    OUT_BYTE_ARRAY (plaintext_part, plaintext_part_len);
2104
0
  END_CALL;
2105
0
}
2106
2107
static CK_RV
2108
rpc_C_MessageDecryptFinal (CK_X_FUNCTION_LIST *self,
2109
                           p11_rpc_message *msg)
2110
0
{
2111
0
  CK_SESSION_HANDLE session;
2112
2113
0
  BEGIN_CALL (MessageDecryptFinal);
2114
0
    IN_ULONG (session);
2115
0
  PROCESS_CALL ((self, session));
2116
0
  END_CALL;
2117
0
}
2118
2119
static CK_RV
2120
rpc_C_MessageSignInit (CK_X_FUNCTION_LIST *self,
2121
                       p11_rpc_message *msg)
2122
0
{
2123
0
  CK_SESSION_HANDLE session;
2124
0
  CK_MECHANISM mechanism_;
2125
0
  CK_MECHANISM_PTR mechanism = &mechanism_;
2126
0
  CK_OBJECT_HANDLE key;
2127
2128
0
  BEGIN_CALL (MessageSignInit);
2129
0
    IN_ULONG (session);
2130
0
    IN_MECHANISM (mechanism);
2131
0
    IN_ULONG (key);
2132
0
  PROCESS_CALL ((self, session, mechanism, key));
2133
0
  END_CALL;
2134
0
}
2135
2136
static CK_RV
2137
rpc_C_SignMessage (CK_X_FUNCTION_LIST *self,
2138
                   p11_rpc_message *msg)
2139
0
{
2140
0
  CK_SESSION_HANDLE session;
2141
0
  CK_BYTE_PTR parameter;
2142
0
  CK_ULONG parameter_len;
2143
0
  CK_BYTE_PTR data;
2144
0
  CK_ULONG data_len;
2145
0
  CK_BYTE_PTR signature;
2146
0
  CK_ULONG signature_len;
2147
2148
0
  BEGIN_CALL (SignMessage);
2149
0
    IN_ULONG (session);
2150
0
    IN_BYTE_ARRAY (parameter, parameter_len);
2151
0
    IN_BYTE_ARRAY (data, data_len);
2152
0
    IN_BYTE_BUFFER (signature, signature_len);
2153
0
  PROCESS_CALL ((self, session, (void *)parameter, parameter_len, data, data_len,
2154
0
                 signature, &signature_len));
2155
0
    OUT_BYTE_ARRAY (signature, signature_len);
2156
0
  END_CALL;
2157
0
}
2158
2159
static CK_RV
2160
rpc_C_SignMessageBegin (CK_X_FUNCTION_LIST *self,
2161
                        p11_rpc_message *msg)
2162
0
{
2163
0
  CK_SESSION_HANDLE session;
2164
0
  CK_BYTE_PTR parameter;
2165
0
  CK_ULONG parameter_len;
2166
2167
0
  BEGIN_CALL (SignMessageBegin);
2168
0
    IN_ULONG (session);
2169
0
    IN_BYTE_ARRAY (parameter, parameter_len);
2170
0
  PROCESS_CALL ((self, session, (void *)parameter, parameter_len));
2171
0
  END_CALL;
2172
0
}
2173
2174
static CK_RV
2175
rpc_C_SignMessageNext (CK_X_FUNCTION_LIST *self,
2176
                       p11_rpc_message *msg)
2177
0
{
2178
0
  CK_SESSION_HANDLE session;
2179
0
  CK_BYTE_PTR parameter;
2180
0
  CK_ULONG parameter_len;
2181
0
  CK_BYTE_PTR data;
2182
0
  CK_ULONG data_len;
2183
0
  CK_BBOOL signature_expected;
2184
0
  CK_BYTE_PTR signature;
2185
0
  CK_ULONG signature_len;
2186
2187
0
  BEGIN_CALL (SignMessageNext);
2188
0
    IN_ULONG (session);
2189
0
    IN_BYTE_ARRAY (parameter, parameter_len);
2190
0
    IN_BYTE_ARRAY (data, data_len);
2191
0
    IN_BYTE (signature_expected);
2192
0
    IN_BYTE_BUFFER (signature, signature_len);
2193
0
  PROCESS_CALL ((self, session, (void *)parameter, parameter_len, data, data_len,
2194
0
           (signature_expected ? signature : NULL),
2195
0
           (signature_expected ? &signature_len : NULL)));
2196
0
    OUT_BYTE_ARRAY (signature, (signature_expected ? signature_len : 0));
2197
0
  END_CALL;
2198
0
}
2199
2200
static CK_RV
2201
rpc_C_MessageSignFinal (CK_X_FUNCTION_LIST *self,
2202
                        p11_rpc_message *msg)
2203
0
{
2204
0
  CK_SESSION_HANDLE session;
2205
2206
0
  BEGIN_CALL (MessageSignFinal);
2207
0
    IN_ULONG (session);
2208
0
  PROCESS_CALL ((self, session));
2209
0
  END_CALL;
2210
0
}
2211
2212
static CK_RV
2213
rpc_C_MessageVerifyInit (CK_X_FUNCTION_LIST *self,
2214
                         p11_rpc_message *msg)
2215
0
{
2216
0
  CK_SESSION_HANDLE session;
2217
0
  CK_MECHANISM mechanism_;
2218
0
  CK_MECHANISM_PTR mechanism = &mechanism_;
2219
0
  CK_OBJECT_HANDLE key;
2220
2221
0
  BEGIN_CALL (MessageVerifyInit);
2222
0
    IN_ULONG (session);
2223
0
    IN_MECHANISM (mechanism);
2224
0
    IN_ULONG (key);
2225
0
  PROCESS_CALL ((self, session, mechanism, key));
2226
0
  END_CALL;
2227
0
}
2228
2229
static CK_RV
2230
rpc_C_VerifyMessage (CK_X_FUNCTION_LIST *self,
2231
                     p11_rpc_message *msg)
2232
0
{
2233
0
  CK_SESSION_HANDLE session;
2234
0
  CK_BYTE_PTR parameter;
2235
0
  CK_ULONG parameter_len;
2236
0
  CK_BYTE_PTR data;
2237
0
  CK_ULONG data_len;
2238
0
  CK_BYTE_PTR signature;
2239
0
  CK_ULONG signature_len;
2240
2241
0
  BEGIN_CALL (VerifyMessage);
2242
0
    IN_ULONG (session);
2243
0
    IN_BYTE_ARRAY (parameter, parameter_len);
2244
0
    IN_BYTE_ARRAY (data, data_len);
2245
0
    IN_BYTE_ARRAY (signature, signature_len);
2246
0
  PROCESS_CALL ((self, session, (void *)parameter, parameter_len, data, data_len,
2247
0
                 signature, signature_len));
2248
0
  END_CALL;
2249
0
}
2250
2251
static CK_RV
2252
rpc_C_VerifyMessageBegin (CK_X_FUNCTION_LIST *self,
2253
                          p11_rpc_message *msg)
2254
0
{
2255
0
  CK_SESSION_HANDLE session;
2256
0
  CK_BYTE_PTR parameter;
2257
0
  CK_ULONG parameter_len;
2258
2259
0
  BEGIN_CALL (VerifyMessageBegin);
2260
0
    IN_ULONG (session);
2261
0
    IN_BYTE_ARRAY (parameter, parameter_len);
2262
0
  PROCESS_CALL ((self, session, (void *)parameter, parameter_len));
2263
0
  END_CALL;
2264
0
}
2265
2266
static CK_RV
2267
rpc_C_VerifyMessageNext (CK_X_FUNCTION_LIST *self,
2268
                         p11_rpc_message *msg)
2269
0
{
2270
0
  CK_SESSION_HANDLE session;
2271
0
  CK_BYTE_PTR parameter;
2272
0
  CK_ULONG parameter_len;
2273
0
  CK_BYTE_PTR data;
2274
0
  CK_ULONG data_len;
2275
0
  CK_BYTE_PTR signature;
2276
0
  CK_ULONG signature_len;
2277
2278
0
  BEGIN_CALL (VerifyMessageNext);
2279
0
    IN_ULONG (session);
2280
0
    IN_BYTE_ARRAY (parameter, parameter_len);
2281
0
    IN_BYTE_ARRAY (data, data_len);
2282
0
    IN_BYTE_ARRAY (signature, signature_len);
2283
0
  PROCESS_CALL ((self, session, (void *)parameter, parameter_len, data, data_len, signature, signature_len));
2284
0
  END_CALL;
2285
0
}
2286
2287
static CK_RV
2288
rpc_C_MessageVerifyFinal (CK_X_FUNCTION_LIST *self,
2289
                          p11_rpc_message *msg)
2290
0
{
2291
0
  CK_SESSION_HANDLE session;
2292
2293
0
  BEGIN_CALL (MessageVerifyFinal);
2294
0
    IN_ULONG (session);
2295
0
  PROCESS_CALL ((self, session));
2296
0
  END_CALL;
2297
0
}
2298
2299
bool
2300
p11_rpc_server_handle (CK_X_FUNCTION_LIST *self,
2301
                       p11_buffer *request,
2302
                       p11_buffer *response)
2303
38
{
2304
38
  p11_rpc_message msg;
2305
38
  CK_RV ret;
2306
38
  int req_id;
2307
2308
38
  return_val_if_fail (self != NULL, false);
2309
38
  return_val_if_fail (request != NULL, false);
2310
38
  return_val_if_fail (response != NULL, false);
2311
2312
38
  p11_message_clear ();
2313
2314
38
  p11_rpc_message_init (&msg, request, response);
2315
2316
38
  if (!p11_rpc_message_parse (&msg, P11_RPC_REQUEST)) {
2317
6
    p11_rpc_message_clear (&msg);
2318
6
    p11_message (_("couldn't parse pkcs11 rpc message"));
2319
6
    return false;
2320
6
  }
2321
2322
  /* This should have been checked by the parsing code */
2323
32
  assert (msg.call_id > P11_RPC_CALL_ERROR);
2324
32
  assert (msg.call_id < P11_RPC_CALL_MAX);
2325
32
  req_id = msg.call_id;
2326
2327
32
  switch(req_id) {
2328
0
  #define CASE_CALL(name) \
2329
32
  case P11_RPC_CALL_##name: \
2330
32
    ret = rpc_##name (self, &msg); \
2331
32
    break;
2332
4
  CASE_CALL (C_Initialize)
2333
0
  CASE_CALL (C_Finalize)
2334
0
  CASE_CALL (C_GetInfo)
2335
0
  CASE_CALL (C_GetSlotList)
2336
0
  CASE_CALL (C_GetSlotInfo)
2337
0
  CASE_CALL (C_GetTokenInfo)
2338
0
  CASE_CALL (C_GetMechanismList)
2339
0
  CASE_CALL (C_GetMechanismInfo)
2340
0
  CASE_CALL (C_InitToken)
2341
0
  CASE_CALL (C_OpenSession)
2342
0
  CASE_CALL (C_CloseSession)
2343
0
  CASE_CALL (C_CloseAllSessions)
2344
0
  CASE_CALL (C_GetSessionInfo)
2345
0
  CASE_CALL (C_InitPIN)
2346
0
  CASE_CALL (C_SetPIN)
2347
0
  CASE_CALL (C_GetOperationState)
2348
0
  CASE_CALL (C_SetOperationState)
2349
0
  CASE_CALL (C_Login)
2350
0
  CASE_CALL (C_Logout)
2351
6
  CASE_CALL (C_CreateObject)
2352
0
  CASE_CALL (C_CopyObject)
2353
0
  CASE_CALL (C_DestroyObject)
2354
0
  CASE_CALL (C_GetObjectSize)
2355
2
  CASE_CALL (C_GetAttributeValue)
2356
0
  CASE_CALL (C_SetAttributeValue)
2357
2
  CASE_CALL (C_FindObjectsInit)
2358
0
  CASE_CALL (C_FindObjects)
2359
0
  CASE_CALL (C_FindObjectsFinal)
2360
0
  CASE_CALL (C_EncryptInit)
2361
0
  CASE_CALL (C_Encrypt)
2362
0
  CASE_CALL (C_EncryptUpdate)
2363
0
  CASE_CALL (C_EncryptFinal)
2364
1
  CASE_CALL (C_DecryptInit)
2365
0
  CASE_CALL (C_Decrypt)
2366
0
  CASE_CALL (C_DecryptUpdate)
2367
0
  CASE_CALL (C_DecryptFinal)
2368
16
  CASE_CALL (C_DigestInit)
2369
0
  CASE_CALL (C_Digest)
2370
0
  CASE_CALL (C_DigestUpdate)
2371
0
  CASE_CALL (C_DigestKey)
2372
0
  CASE_CALL (C_DigestFinal)
2373
0
  CASE_CALL (C_SignInit)
2374
0
  CASE_CALL (C_Sign)
2375
0
  CASE_CALL (C_SignUpdate)
2376
0
  CASE_CALL (C_SignFinal)
2377
0
  CASE_CALL (C_SignRecoverInit)
2378
0
  CASE_CALL (C_SignRecover)
2379
0
  CASE_CALL (C_VerifyInit)
2380
0
  CASE_CALL (C_Verify)
2381
0
  CASE_CALL (C_VerifyUpdate)
2382
0
  CASE_CALL (C_VerifyFinal)
2383
0
  CASE_CALL (C_VerifyRecoverInit)
2384
0
  CASE_CALL (C_VerifyRecover)
2385
0
  CASE_CALL (C_DigestEncryptUpdate)
2386
0
  CASE_CALL (C_DecryptDigestUpdate)
2387
0
  CASE_CALL (C_SignEncryptUpdate)
2388
0
  CASE_CALL (C_DecryptVerifyUpdate)
2389
1
  CASE_CALL (C_GenerateKey)
2390
0
  CASE_CALL (C_GenerateKeyPair)
2391
0
  CASE_CALL (C_WrapKey)
2392
0
  CASE_CALL (C_UnwrapKey)
2393
0
  CASE_CALL (C_DeriveKey)
2394
0
  CASE_CALL (C_SeedRandom)
2395
0
  CASE_CALL (C_GenerateRandom)
2396
0
  CASE_CALL (C_WaitForSlotEvent)
2397
  /* PKCS #11 3.0 */
2398
0
  CASE_CALL (C_LoginUser)
2399
0
  CASE_CALL (C_SessionCancel)
2400
0
  CASE_CALL (C_MessageEncryptInit)
2401
0
  CASE_CALL (C_EncryptMessage)
2402
0
  CASE_CALL (C_EncryptMessageBegin)
2403
0
  CASE_CALL (C_EncryptMessageNext)
2404
0
  CASE_CALL (C_MessageEncryptFinal)
2405
0
  CASE_CALL (C_MessageDecryptInit)
2406
0
  CASE_CALL (C_DecryptMessage)
2407
0
  CASE_CALL (C_DecryptMessageBegin)
2408
0
  CASE_CALL (C_DecryptMessageNext)
2409
0
  CASE_CALL (C_MessageDecryptFinal)
2410
0
  CASE_CALL (C_MessageSignInit)
2411
0
  CASE_CALL (C_SignMessage)
2412
0
  CASE_CALL (C_SignMessageBegin)
2413
0
  CASE_CALL (C_SignMessageNext)
2414
0
  CASE_CALL (C_MessageSignFinal)
2415
0
  CASE_CALL (C_MessageVerifyInit)
2416
0
  CASE_CALL (C_VerifyMessage)
2417
0
  CASE_CALL (C_VerifyMessageBegin)
2418
0
  CASE_CALL (C_VerifyMessageNext)
2419
0
  CASE_CALL (C_MessageVerifyFinal)
2420
2421
0
  CASE_CALL (C_InitToken2)
2422
0
  #undef CASE_CALL
2423
0
  default:
2424
    /* This should have been caught by the parse code */
2425
0
    assert (0 && "Unchecked call");
2426
0
    break;
2427
32
  };
2428
2429
32
  if (p11_buffer_failed (msg.output)) {
2430
4
    p11_message (_("out of memory error putting together message"));
2431
4
    p11_rpc_message_clear (&msg);
2432
4
    return false;
2433
4
  }
2434
2435
  /* A filled in response */
2436
28
  if (ret == CKR_OK) {
2437
2438
    /*
2439
     * Since we're dealing with many many functions above generating
2440
     * these messages we want to make sure each of them actually
2441
     * does what it's supposed to.
2442
     */
2443
0
    assert (p11_rpc_message_is_verified (&msg));
2444
0
    assert (msg.call_type == P11_RPC_RESPONSE);
2445
0
    assert (msg.call_id == req_id);
2446
0
    assert (p11_rpc_calls[msg.call_id].response);
2447
0
    assert (strcmp (p11_rpc_calls[msg.call_id].response, msg.signature) == 0);
2448
2449
  /* Fill in an error respnose */
2450
28
  } else {
2451
28
    if (!p11_rpc_message_prep (&msg, P11_RPC_CALL_ERROR, P11_RPC_RESPONSE) ||
2452
28
        !p11_rpc_message_write_ulong (&msg, (uint32_t)ret) ||
2453
28
        p11_buffer_failed (msg.output)) {
2454
0
      p11_message (_("out of memory responding with error"));
2455
0
      p11_rpc_message_clear (&msg);
2456
0
      return false;
2457
0
    }
2458
28
  }
2459
2460
28
  p11_rpc_message_clear (&msg);
2461
28
  return true;
2462
28
}
2463
2464
/**
2465
 * p11_kit_remote_serve_module:
2466
 * @module: a pointer to a loaded module
2467
 * @in_fd: input fd
2468
 * @out_fd: output fd
2469
 *
2470
 * Run a module on a given pair of input/output FDs.
2471
 *
2472
 * Returns: 0 if success, non-zero otherwise.
2473
 */
2474
int
2475
p11_kit_remote_serve_module (CK_FUNCTION_LIST *module,
2476
                             int in_fd,
2477
                             int out_fd)
2478
0
{
2479
0
  p11_rpc_status status;
2480
0
  rpc_server server;
2481
0
  p11_buffer options;
2482
0
  p11_buffer buffer;
2483
0
  size_t state;
2484
0
  int ret = 1;
2485
0
  int code;
2486
2487
0
  return_val_if_fail (module != NULL, 1);
2488
2489
0
  p11_buffer_init (&options, 0);
2490
0
  p11_buffer_init (&buffer, 0);
2491
2492
0
  p11_virtual_init (&server.virt, &p11_virtual_base, module, NULL);
2493
2494
0
  switch (read (in_fd, &server.version, 1)) {
2495
0
  case 0:
2496
0
    goto out;
2497
0
  case 1:
2498
#if P11_RPC_PROTOCOL_VERSION_MINIMUM > 0
2499
    if (server.version < P11_RPC_PROTOCOL_VERSION_MINIMUM) {
2500
      p11_message (_("unsupported version received: %d"), (int)version);
2501
      goto out;
2502
    }
2503
#endif
2504
0
    break;
2505
0
  default:
2506
0
    p11_message_err (errno, _("couldn't read credential byte"));
2507
0
    goto out;
2508
0
  }
2509
2510
0
  if (server.version > P11_RPC_PROTOCOL_VERSION_MAXIMUM) {
2511
0
    server.version = P11_RPC_PROTOCOL_VERSION_MAXIMUM;
2512
0
  }
2513
2514
0
  switch (write (out_fd, &server.version, 1)) {
2515
0
  case 1:
2516
0
    break;
2517
0
  default:
2518
0
    p11_message_err (errno, _("couldn't write credential byte"));
2519
0
    goto out;
2520
0
  }
2521
2522
0
  status = P11_RPC_OK;
2523
0
  while (status == P11_RPC_OK) {
2524
0
    state = 0;
2525
0
    code = 0;
2526
2527
0
    do {
2528
0
      status = p11_rpc_transport_read (in_fd, &state, &code,
2529
0
                                       &options, &buffer);
2530
0
    } while (status == P11_RPC_AGAIN);
2531
2532
0
    switch (status) {
2533
0
    case P11_RPC_OK:
2534
0
      break;
2535
0
    case P11_RPC_EOF:
2536
0
      ret = 0;
2537
0
      continue;
2538
0
    case P11_RPC_AGAIN:
2539
0
      assert_not_reached ();
2540
0
    case P11_RPC_ERROR:
2541
0
      p11_message_err (errno, _("failed to read rpc message"));
2542
0
      goto out;
2543
0
    }
2544
2545
0
    if (!p11_rpc_server_handle (&server.virt.funcs, &buffer, &buffer)) {
2546
0
      p11_message (_("unexpected error handling rpc message"));
2547
0
      goto out;
2548
0
    }
2549
2550
0
    state = 0;
2551
0
    options.len = 0;
2552
0
    do {
2553
0
      status = p11_rpc_transport_write (out_fd, &state, code,
2554
0
                                        &options, &buffer);
2555
0
    } while (status == P11_RPC_AGAIN);
2556
2557
0
    switch (status) {
2558
0
    case P11_RPC_OK:
2559
0
      break;
2560
0
    case P11_RPC_EOF:
2561
0
    case P11_RPC_AGAIN:
2562
0
      assert_not_reached ();
2563
0
    case P11_RPC_ERROR:
2564
0
      p11_message_err (errno, _("failed to write rpc message"));
2565
0
      goto out;
2566
0
    }
2567
0
  }
2568
2569
0
out:
2570
0
  p11_buffer_uninit (&buffer);
2571
0
  p11_buffer_uninit (&options);
2572
2573
0
  p11_virtual_uninit (&server.virt);
2574
2575
0
  return ret;
2576
0
}
2577
2578
/**
2579
 * p11_kit_remote_serve_token:
2580
 * @module: a pointer to a loaded module
2581
 * @token: a token info
2582
 * @in_fd: input fd
2583
 * @out_fd: output fd
2584
 *
2585
 * Run a token wrapped in a module on a given pair of input/output FDs.
2586
 *
2587
 * Returns: 0 if success, non-zero otherwise.
2588
 *
2589
 * Deprecated: use p11_kit_remote_serve_tokens()
2590
 */
2591
int
2592
p11_kit_remote_serve_token (CK_FUNCTION_LIST *module,
2593
          CK_TOKEN_INFO *token,
2594
          int in_fd,
2595
          int out_fd)
2596
0
{
2597
0
  p11_virtual virt;
2598
0
  p11_virtual *filter = NULL;
2599
0
  CK_FUNCTION_LIST *filtered = NULL;
2600
0
  int ret = 1;
2601
2602
0
  return_val_if_fail (module != NULL, 1);
2603
0
  return_val_if_fail (token != NULL, 1);
2604
2605
0
  p11_virtual_init (&virt, &p11_virtual_base, module, NULL);
2606
0
  filter = p11_filter_subclass (&virt, NULL);
2607
0
  if (filter == NULL)
2608
0
    goto out;
2609
2610
0
  filtered = p11_virtual_wrap (filter, (p11_destroyer)p11_virtual_uninit);
2611
0
  if (filtered == NULL)
2612
0
    goto out;
2613
2614
0
  p11_filter_allow_token (filter, token);
2615
2616
0
  ret = p11_kit_remote_serve_module (filtered, in_fd, out_fd);
2617
2618
0
 out:
2619
0
  if (filtered != NULL)
2620
0
    p11_virtual_unwrap (filtered);
2621
0
  if (filter != NULL)
2622
0
    p11_filter_release (filter);
2623
2624
0
  return ret;
2625
0
}
2626
2627
static void
2628
token_set_write_protected (CK_TOKEN_INFO *token, P11KitUri *uri)
2629
0
{
2630
0
  const char *write_protected =
2631
0
    p11_kit_uri_get_vendor_query (uri, "write-protected");
2632
0
  if (write_protected &&
2633
0
      _p11_conf_parse_boolean (write_protected, false))
2634
0
    token->flags |= CKF_WRITE_PROTECTED;
2635
0
  else
2636
0
    token->flags &= ~CKF_WRITE_PROTECTED;
2637
0
}
2638
2639
static void
2640
module_unwrap (CK_FUNCTION_LIST *module)
2641
0
{
2642
0
  if (module)
2643
0
    p11_virtual_unwrap (module);
2644
0
}
2645
2646
/**
2647
 * p11_kit_remote_serve_tokens:
2648
 * @tokens: a list of token URIs
2649
 * @n_tokens: the length of @tokens
2650
 * @provider: (nullable): a PKCS\#11 module that provides the tokens
2651
 * @in_fd: input fd
2652
 * @out_fd: output fd
2653
 *
2654
 * Expose tokens on a given pair of input/output FDs.  If @provider is
2655
 * not NULL, all the tokens must be provided by the same module.
2656
 *
2657
 * Returns: 0 if success, non-zero otherwise.
2658
 */
2659
int
2660
p11_kit_remote_serve_tokens (const char **tokens,
2661
           size_t n_tokens,
2662
           CK_FUNCTION_LIST *provider,
2663
           int in_fd,
2664
           int out_fd)
2665
0
{
2666
0
  p11_virtual *lower = NULL;
2667
0
  p11_virtual *filter = NULL;
2668
0
  CK_FUNCTION_LIST *proxy = NULL;
2669
0
  CK_FUNCTION_LIST **modules = NULL;
2670
0
  CK_FUNCTION_LIST *provider_modules[2] = { NULL, NULL };
2671
0
  CK_FUNCTION_LIST *module;
2672
0
  p11_dict *filters = NULL;
2673
0
  p11_dictiter filters_iter;
2674
0
  p11_array *filtered = NULL;
2675
0
  P11KitIter *iter;
2676
0
  P11KitUri **uris = NULL;
2677
0
  void *value;
2678
0
  int ret = 1;
2679
0
  int error = 0;
2680
0
  size_t i;
2681
2682
0
  return_val_if_fail (tokens != NULL, 2);
2683
0
  return_val_if_fail (n_tokens > 0, 2);
2684
0
  return_val_if_fail (in_fd >= 0, 2);
2685
0
  return_val_if_fail (out_fd >= 0, 2);
2686
2687
0
  uris = calloc (n_tokens, sizeof (P11KitUri *));
2688
0
  if (uris == NULL) {
2689
0
    error = ENOMEM;
2690
0
    goto out;
2691
0
  }
2692
2693
0
  for (i = 0; i < n_tokens; i++) {
2694
0
    uris[i] = p11_kit_uri_new ();
2695
0
    if (uris[i] == NULL) {
2696
0
      error = ENOMEM;
2697
0
      goto out;
2698
0
    }
2699
0
    if (p11_kit_uri_parse (tokens[i], P11_KIT_URI_FOR_TOKEN, uris[i]) !=
2700
0
        P11_KIT_URI_OK) {
2701
0
      error = EINVAL;
2702
0
      goto out;
2703
0
    }
2704
0
  }
2705
2706
0
  if (provider) {
2707
0
    if (p11_kit_module_initialize (provider) != CKR_OK) {
2708
0
      error = EINVAL;
2709
0
      goto out;
2710
0
    }
2711
0
    provider_modules[0] = provider;
2712
0
    modules = provider_modules;
2713
0
  } else {
2714
0
    modules = p11_kit_modules_load_and_initialize (0);
2715
0
    if (modules == NULL) {
2716
0
      error = EINVAL;
2717
0
      goto out;
2718
0
    }
2719
0
  }
2720
2721
0
  filters = p11_dict_new (p11_dict_direct_hash, p11_dict_direct_equal,
2722
0
        NULL, p11_filter_release);
2723
0
  if (filters == NULL) {
2724
0
    error = ENOMEM;
2725
0
    goto out;
2726
0
  }
2727
2728
0
  iter = p11_kit_iter_new (NULL,
2729
0
         P11_KIT_ITER_WITH_TOKENS |
2730
0
         P11_KIT_ITER_WITHOUT_OBJECTS);
2731
0
  if (iter == NULL) {
2732
0
    error = ENOMEM;
2733
0
    goto out;
2734
0
  }
2735
2736
0
  p11_kit_iter_begin (iter, modules);
2737
0
  while (p11_kit_iter_next (iter) == CKR_OK) {
2738
0
    CK_TOKEN_INFO *token;
2739
2740
0
    assert (p11_kit_iter_get_kind (iter) == P11_KIT_ITER_KIND_TOKEN);
2741
2742
0
    token = p11_kit_iter_get_token (iter);
2743
2744
    /* Check if the token is the one we want to export */
2745
0
    for (i = 0; i < n_tokens; i++)
2746
0
      if (p11_kit_uri_match_token_info (uris[i], token))
2747
0
        break;
2748
0
    if (i == n_tokens)
2749
0
      continue;
2750
2751
0
    module = p11_kit_iter_get_module (iter);
2752
0
    assert (module != NULL);
2753
2754
    /* Create a virtual module that provides only the
2755
     * specified tokens */
2756
0
    filter = p11_dict_get (filters, module);
2757
0
    if (filter == NULL) {
2758
0
      lower = calloc (1, sizeof (p11_virtual));
2759
0
      if (lower == NULL) {
2760
0
        error = ENOMEM;
2761
0
        goto out;
2762
0
      }
2763
0
      p11_virtual_init (lower, &p11_virtual_base, module, NULL);
2764
0
      filter = p11_filter_subclass (lower, free);
2765
0
      if (filter == NULL) {
2766
0
        error = EINVAL;
2767
0
        p11_message_err (error, "couldn't subclass filter");
2768
0
        goto out;
2769
0
      }
2770
0
      if (!p11_dict_set (filters, module, filter)) {
2771
0
        error = EINVAL;
2772
0
        p11_message_err (error, "couldn't register filter");
2773
0
        goto out;
2774
0
      }
2775
0
    }
2776
2777
0
    for (i = 0; i < n_tokens; i++) {
2778
0
      if (p11_kit_uri_match_token_info (uris[i], token)) {
2779
0
        token_set_write_protected (token, uris[i]);
2780
0
        p11_filter_allow_token (filter, token);
2781
0
      }
2782
0
    }
2783
0
  }
2784
0
  p11_kit_iter_free (iter);
2785
2786
0
  filtered = p11_array_new ((p11_destroyer)module_unwrap);
2787
0
  p11_dict_iterate (filters, &filters_iter);
2788
0
  while (p11_dict_next (&filters_iter, NULL, &value)) {
2789
0
    module = p11_virtual_wrap ((p11_virtual *)value, NULL);
2790
0
    if (module == NULL) {
2791
0
      error = EINVAL;
2792
0
      p11_message_err (error, "couldn't wrap filter module");
2793
0
      goto out;
2794
0
    }
2795
0
    if (!p11_array_push (filtered, module)) {
2796
0
      error = ENOMEM;
2797
0
      goto out;
2798
0
    }
2799
0
  }
2800
2801
  /* NULL terminate the array */
2802
0
  if (!p11_array_push (filtered, NULL)) {
2803
0
    error = ENOMEM;
2804
0
    goto out;
2805
0
  }
2806
2807
  /* Need to finalize the modules that we initialized for iteration */
2808
0
  p11_kit_modules_finalize (modules);
2809
2810
0
  if (p11_proxy_module_create (&proxy, (CK_FUNCTION_LIST **)filtered->elem)
2811
0
      != CKR_OK) {
2812
0
    error = EINVAL;
2813
0
    p11_message_err (error, "couldn't create a proxy module");
2814
0
    goto out;
2815
0
  }
2816
2817
0
  ret = p11_kit_remote_serve_module (proxy, in_fd, out_fd);
2818
2819
0
 out:
2820
0
  if (filtered != NULL)
2821
0
    p11_array_free (filtered);
2822
0
  if (filters != NULL)
2823
0
    p11_dict_free (filters);
2824
0
  if (modules != provider_modules)
2825
0
    p11_kit_modules_release (modules);
2826
0
  if (error != 0)
2827
0
    errno = error;
2828
0
  if (uris) {
2829
0
    for (i = 0; i < n_tokens; i++)
2830
0
      p11_kit_uri_free (uris[i]);
2831
0
    free (uris);
2832
0
  }
2833
2834
0
  return ret;
2835
0
}