Coverage Report

Created: 2026-03-17 06:41

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