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