summaryrefslogtreecommitdiff
path: root/p11-kit/rpc-server.c
diff options
context:
space:
mode:
Diffstat (limited to 'p11-kit/rpc-server.c')
-rw-r--r--p11-kit/rpc-server.c2017
1 files changed, 0 insertions, 2017 deletions
diff --git a/p11-kit/rpc-server.c b/p11-kit/rpc-server.c
deleted file mode 100644
index 225cc86..0000000
--- a/p11-kit/rpc-server.c
+++ /dev/null
@@ -1,2017 +0,0 @@
-/*
- * Copyright (C) 2008 Stefan Walter
- * Copyright (C) 2012 Red Hat Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above
- * copyright notice, this list of conditions and the
- * following disclaimer.
- * * Redistributions in binary form must reproduce the
- * above copyright notice, this list of conditions and
- * the following disclaimer in the documentation and/or
- * other materials provided with the distribution.
- * * The names of contributors to this software may not be
- * used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
- * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * Author: Stef Walter <stefw@gnome.org>
- */
-
-#include "config.h"
-
-#define P11_DEBUG_FLAG P11_DEBUG_RPC
-#include "debug.h"
-#include "pkcs11.h"
-#include "library.h"
-#include "private.h"
-#include "message.h"
-#include "remote.h"
-#include "rpc.h"
-#include "rpc-message.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <assert.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-/* The error returned on protocol failures */
-#define PARSE_ERROR CKR_DEVICE_ERROR
-#define PREP_ERROR CKR_DEVICE_MEMORY
-
-static CK_RV
-proto_read_byte_buffer (p11_rpc_message *msg,
- CK_BYTE_PTR *buffer,
- CK_ULONG *n_buffer)
-{
- uint32_t length;
-
- assert (msg != NULL);
- assert (buffer != NULL);
- assert (n_buffer != NULL);
- assert (msg->input != NULL);
-
- /* Check that we're supposed to be reading this at this point */
- assert (!msg->signature || p11_rpc_message_verify_part (msg, "fy"));
-
- /* The number of ulongs there's room for on the other end */
- if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &length))
- return PARSE_ERROR;
-
- *n_buffer = length;
- *buffer = NULL;
-
- /* If set to zero, then they just want the length */
- if (length == 0)
- return CKR_OK;
-
- *buffer = p11_rpc_message_alloc_extra (msg, length * sizeof (CK_BYTE));
- if (*buffer == NULL)
- return CKR_DEVICE_MEMORY;
-
- return CKR_OK;
-}
-
-static CK_RV
-proto_read_byte_array (p11_rpc_message *msg,
- CK_BYTE_PTR *array,
- CK_ULONG *n_array)
-{
- const unsigned char *data;
- unsigned char valid;
- size_t n_data;
-
- assert (msg != NULL);
- assert (msg->input != NULL);
-
- /* Check that we're supposed to have this at this point */
- assert (!msg->signature || p11_rpc_message_verify_part (msg, "ay"));
-
- /* Read out the byte which says whether data is present or not */
- if (!p11_rpc_buffer_get_byte (msg->input, &msg->parsed, &valid))
- return PARSE_ERROR;
-
- if (!valid) {
- *array = NULL;
- *n_array = 0;
- return CKR_OK;
- }
-
- /* Point our arguments into the buffer */
- if (!p11_rpc_buffer_get_byte_array (msg->input, &msg->parsed, &data, &n_data))
- return PARSE_ERROR;
-
- *array = (CK_BYTE_PTR)data;
- *n_array = n_data;
- return CKR_OK;
-}
-
-static CK_RV
-proto_write_byte_array (p11_rpc_message *msg,
- CK_BYTE_PTR array,
- CK_ULONG len,
- CK_RV ret)
-{
- assert (msg != NULL);
-
- /*
- * When returning an byte array, in many cases we need to pass
- * an invalid array along with a length, which signifies CKR_BUFFER_TOO_SMALL.
- */
-
- switch (ret) {
- case CKR_BUFFER_TOO_SMALL:
- array = NULL;
- /* fall through */
- case CKR_OK:
- break;
-
- /* Pass all other errors straight through */
- default:
- return ret;
- };
-
- if (!p11_rpc_message_write_byte_array (msg, array, len))
- return PREP_ERROR;
-
- return CKR_OK;
-}
-
-static CK_RV
-proto_read_ulong_buffer (p11_rpc_message *msg,
- CK_ULONG_PTR *buffer,
- CK_ULONG *n_buffer)
-{
- uint32_t length;
-
- assert (msg != NULL);
- assert (buffer != NULL);
- assert (n_buffer != NULL);
- assert (msg->input != NULL);
-
- /* Check that we're supposed to be reading this at this point */
- assert (!msg->signature || p11_rpc_message_verify_part (msg, "fu"));
-
- /* The number of ulongs there's room for on the other end */
- if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &length))
- return PARSE_ERROR;
-
- *n_buffer = length;
- *buffer = NULL;
-
- /* If set to zero, then they just want the length */
- if (length == 0)
- return CKR_OK;
-
- *buffer = p11_rpc_message_alloc_extra (msg, length * sizeof (CK_ULONG));
- if (!*buffer)
- return CKR_DEVICE_MEMORY;
-
- return CKR_OK;
-}
-
-static CK_RV
-proto_write_ulong_array (p11_rpc_message *msg,
- CK_ULONG_PTR array,
- CK_ULONG len,
- CK_RV ret)
-{
- assert (msg != NULL);
-
- /*
- * When returning an ulong array, in many cases we need to pass
- * an invalid array along with a length, which signifies CKR_BUFFER_TOO_SMALL.
- */
-
- switch (ret) {
- case CKR_BUFFER_TOO_SMALL:
- array = NULL;
- /* fall through */
- case CKR_OK:
- break;
-
- /* Pass all other errors straight through */
- default:
- return ret;
- };
-
- if (!p11_rpc_message_write_ulong_array (msg, array, len))
- return PREP_ERROR;
-
- return CKR_OK;
-}
-
-static CK_RV
-proto_read_attribute_buffer (p11_rpc_message *msg,
- CK_ATTRIBUTE_PTR *result,
- CK_ULONG *n_result)
-{
- CK_ATTRIBUTE_PTR attrs;
- uint32_t n_attrs, i;
- uint32_t value;
-
- assert (msg != NULL);
- assert (result != NULL);
- assert (n_result != NULL);
- assert (msg->input != NULL);
-
- /* Make sure this is in the rigth order */
- assert (!msg->signature || p11_rpc_message_verify_part (msg, "fA"));
-
- /* Read the number of attributes */
- if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &n_attrs))
- return PARSE_ERROR;
-
- /* Allocate memory for the attribute structures */
- attrs = p11_rpc_message_alloc_extra (msg, n_attrs * sizeof (CK_ATTRIBUTE));
- if (attrs == NULL)
- return CKR_DEVICE_MEMORY;
-
- /* Now go through and fill in each one */
- for (i = 0; i < n_attrs; ++i) {
-
- /* The attribute type */
- if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &value))
- return PARSE_ERROR;
-
- attrs[i].type = value;
-
- /* The number of bytes to allocate */
- if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &value))
- return PARSE_ERROR;
-
- if (value == 0) {
- attrs[i].pValue = NULL;
- attrs[i].ulValueLen = 0;
- } else {
- attrs[i].pValue = p11_rpc_message_alloc_extra (msg, value);
- if (!attrs[i].pValue)
- return CKR_DEVICE_MEMORY;
- attrs[i].ulValueLen = value;
- }
- }
-
- *result = attrs;
- *n_result = n_attrs;
- return CKR_OK;
-}
-
-static CK_RV
-proto_read_attribute_array (p11_rpc_message *msg,
- CK_ATTRIBUTE_PTR *result,
- CK_ULONG *n_result)
-{
- CK_ATTRIBUTE_PTR attrs;
- const unsigned char *data;
- unsigned char valid;
- uint32_t n_attrs, i;
- uint32_t value;
- size_t n_data;
-
- assert (msg != NULL);
- assert (result != NULL);
- assert (n_result != NULL);
- assert (msg->input != NULL);
-
- /* Make sure this is in the rigth order */
- assert (!msg->signature || p11_rpc_message_verify_part (msg, "aA"));
-
- /* Read the number of attributes */
- if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &n_attrs))
- return PARSE_ERROR;
-
- /* Allocate memory for the attribute structures */
- attrs = p11_rpc_message_alloc_extra (msg, n_attrs * sizeof (CK_ATTRIBUTE));
- if (attrs == NULL)
- return CKR_DEVICE_MEMORY;
-
- /* Now go through and fill in each one */
- for (i = 0; i < n_attrs; ++i) {
-
- /* The attribute type */
- if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &value))
- return PARSE_ERROR;
-
- attrs[i].type = value;
-
- /* Whether this one is valid or not */
- if (!p11_rpc_buffer_get_byte (msg->input, &msg->parsed, &valid))
- return PARSE_ERROR;
-
- if (valid) {
- if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &value))
- return PARSE_ERROR;
- if (!p11_rpc_buffer_get_byte_array (msg->input, &msg->parsed, &data, &n_data))
- return PARSE_ERROR;
-
- if (data != NULL && n_data != value) {
- p11_message ("attribute length and data do not match");
- return PARSE_ERROR;
- }
-
- attrs[i].pValue = (CK_VOID_PTR)data;
- attrs[i].ulValueLen = value;
- } else {
- attrs[i].pValue = NULL;
- attrs[i].ulValueLen = -1;
- }
- }
-
- *result = attrs;
- *n_result = n_attrs;
- return CKR_OK;
-}
-
-static CK_RV
-proto_write_attribute_array (p11_rpc_message *msg,
- CK_ATTRIBUTE_PTR array,
- CK_ULONG len,
- CK_RV ret)
-{
- assert (msg != NULL);
-
- /*
- * When returning an attribute array, certain errors aren't
- * actually real errors, these are passed through to the other
- * side along with the attribute array.
- */
-
- switch (ret) {
- case CKR_ATTRIBUTE_SENSITIVE:
- case CKR_ATTRIBUTE_TYPE_INVALID:
- case CKR_BUFFER_TOO_SMALL:
- case CKR_OK:
- break;
-
- /* Pass all other errors straight through */
- default:
- return ret;
- };
-
- if (!p11_rpc_message_write_attribute_array (msg, array, len) ||
- !p11_rpc_message_write_ulong (msg, ret))
- return PREP_ERROR;
-
- return CKR_OK;
-}
-
-static CK_RV
-proto_read_null_string (p11_rpc_message *msg,
- CK_UTF8CHAR_PTR *val)
-{
- const unsigned char *data;
- size_t n_data;
-
- assert (msg != NULL);
- assert (val != NULL);
- assert (msg->input != NULL);
-
- /* Check that we're supposed to have this at this point */
- assert (!msg->signature || p11_rpc_message_verify_part (msg, "z"));
-
- if (!p11_rpc_buffer_get_byte_array (msg->input, &msg->parsed, &data, &n_data))
- return PARSE_ERROR;
-
- /* Allocate a block of memory for it */
- *val = p11_rpc_message_alloc_extra (msg, n_data + 1);
- if (*val == NULL)
- return CKR_DEVICE_MEMORY;
-
- memcpy (*val, data, n_data);
- (*val)[n_data] = 0;
-
- return CKR_OK;
-}
-
-static CK_RV
-proto_read_mechanism (p11_rpc_message *msg,
- CK_MECHANISM_PTR mech)
-{
- const unsigned char *data;
- uint32_t value;
- size_t n_data;
-
- assert (msg != NULL);
- assert (mech != NULL);
- assert (msg->input != NULL);
-
- /* Make sure this is in the right order */
- assert (!msg->signature || p11_rpc_message_verify_part (msg, "M"));
-
- /* The mechanism type */
- if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &value))
- return PARSE_ERROR;
-
- /* The mechanism data */
- if (!p11_rpc_buffer_get_byte_array (msg->input, &msg->parsed, &data, &n_data))
- return PARSE_ERROR;
-
- mech->mechanism = value;
- mech->pParameter = (CK_VOID_PTR)data;
- mech->ulParameterLen = n_data;
- return CKR_OK;
-}
-
-static CK_RV
-proto_write_info (p11_rpc_message *msg,
- CK_INFO_PTR info)
-{
- assert (msg != NULL);
- assert (info != NULL);
-
- if (!p11_rpc_message_write_version (msg, &info->cryptokiVersion) ||
- !p11_rpc_message_write_space_string (msg, info->manufacturerID, 32) ||
- !p11_rpc_message_write_ulong (msg, info->flags) ||
- !p11_rpc_message_write_space_string (msg, info->libraryDescription, 32) ||
- !p11_rpc_message_write_version (msg, &info->libraryVersion))
- return PREP_ERROR;
-
- return CKR_OK;
-}
-
-static CK_RV
-proto_write_slot_info (p11_rpc_message *msg,
- CK_SLOT_INFO_PTR info)
-{
- assert (msg != NULL);
- assert (info != NULL);
-
- if (!p11_rpc_message_write_space_string (msg, info->slotDescription, 64) ||
- !p11_rpc_message_write_space_string (msg, info->manufacturerID, 32) ||
- !p11_rpc_message_write_ulong (msg, info->flags) ||
- !p11_rpc_message_write_version (msg, &info->hardwareVersion) ||
- !p11_rpc_message_write_version (msg, &info->firmwareVersion))
- return PREP_ERROR;
-
- return CKR_OK;
-}
-
-static CK_RV
-proto_write_token_info (p11_rpc_message *msg,
- CK_TOKEN_INFO_PTR info)
-{
- assert (msg != NULL);
- assert (info != NULL);
-
- if (!p11_rpc_message_write_space_string (msg, info->label, 32) ||
- !p11_rpc_message_write_space_string (msg, info->manufacturerID, 32) ||
- !p11_rpc_message_write_space_string (msg, info->model, 16) ||
- !p11_rpc_message_write_space_string (msg, info->serialNumber, 16) ||
- !p11_rpc_message_write_ulong (msg, info->flags) ||
- !p11_rpc_message_write_ulong (msg, info->ulMaxSessionCount) ||
- !p11_rpc_message_write_ulong (msg, info->ulSessionCount) ||
- !p11_rpc_message_write_ulong (msg, info->ulMaxRwSessionCount) ||
- !p11_rpc_message_write_ulong (msg, info->ulRwSessionCount) ||
- !p11_rpc_message_write_ulong (msg, info->ulMaxPinLen) ||
- !p11_rpc_message_write_ulong (msg, info->ulMinPinLen) ||
- !p11_rpc_message_write_ulong (msg, info->ulTotalPublicMemory) ||
- !p11_rpc_message_write_ulong (msg, info->ulFreePublicMemory) ||
- !p11_rpc_message_write_ulong (msg, info->ulTotalPrivateMemory) ||
- !p11_rpc_message_write_ulong (msg, info->ulFreePrivateMemory) ||
- !p11_rpc_message_write_version (msg, &info->hardwareVersion) ||
- !p11_rpc_message_write_version (msg, &info->firmwareVersion) ||
- !p11_rpc_message_write_space_string (msg, info->utcTime, 16))
- return PREP_ERROR;
-
- return CKR_OK;
-}
-
-static CK_RV
-proto_write_mechanism_info (p11_rpc_message *msg,
- CK_MECHANISM_INFO_PTR info)
-{
- assert (msg != NULL);
- assert (info != NULL);
-
- if (!p11_rpc_message_write_ulong (msg, info->ulMinKeySize) ||
- !p11_rpc_message_write_ulong (msg, info->ulMaxKeySize) ||
- !p11_rpc_message_write_ulong (msg, info->flags))
- return PREP_ERROR;
-
- return CKR_OK;
-}
-
-static CK_RV
-proto_write_session_info (p11_rpc_message *msg,
- CK_SESSION_INFO_PTR info)
-{
- assert (msg != NULL);
- assert (info != NULL);
-
- if (!p11_rpc_message_write_ulong (msg, info->slotID) ||
- !p11_rpc_message_write_ulong (msg, info->state) ||
- !p11_rpc_message_write_ulong (msg, info->flags) ||
- !p11_rpc_message_write_ulong (msg, info->ulDeviceError))
- return PREP_ERROR;
-
- return CKR_OK;
-}
-
-static CK_RV
-call_ready (p11_rpc_message *msg)
-{
- assert (msg->output);
-
- /*
- * Called right before invoking the actual PKCS#11 function
- * Reading out of data is complete, get ready to write return values.
- */
-
- if (p11_buffer_failed (msg->output)) {
- p11_message ("invalid request from module, probably too short"); \
- return PARSE_ERROR;
- }
-
- assert (p11_rpc_message_is_verified (msg));
-
- /* All done parsing input */
- msg->input = NULL;
-
- if (!p11_rpc_message_prep (msg, msg->call_id, P11_RPC_RESPONSE)) {
- p11_message ("couldn't initialize rpc response");
- return CKR_DEVICE_MEMORY;
- }
-
- return CKR_OK;
-}
-
-/* -------------------------------------------------------------------
- * CALL MACROS
- */
-
-#define BEGIN_CALL(call_id) \
- p11_debug (#call_id ": enter"); \
- assert (msg != NULL); \
- assert (self != NULL); \
- { \
- CK_X_##call_id _func = self->C_##call_id; \
- CK_RV _ret = CKR_OK; \
- if (!_func) { _ret = CKR_GENERAL_ERROR; goto _cleanup; }
-
-#define PROCESS_CALL(args) \
- _ret = call_ready (msg); \
- if (_ret != CKR_OK) { goto _cleanup; } \
- _ret = _func args
-
-#define END_CALL \
- _cleanup: \
- p11_debug ("ret: %d", (int)_ret); \
- return _ret; \
- }
-
-#define IN_BYTE(val) \
- if (!p11_rpc_message_read_byte (msg, &val)) \
- { _ret = PARSE_ERROR; goto _cleanup; }
-
-#define IN_ULONG(val) \
- if (!p11_rpc_message_read_ulong (msg, &val)) \
- { _ret = PARSE_ERROR; goto _cleanup; }
-
-#define IN_STRING(val) \
- _ret = proto_read_null_string (msg, &val); \
- if (_ret != CKR_OK) goto _cleanup;
-
-#define IN_BYTE_BUFFER(buffer, buffer_len) \
- _ret = proto_read_byte_buffer (msg, &buffer, &buffer_len); \
- if (_ret != CKR_OK) goto _cleanup;
-
-#define IN_BYTE_ARRAY(buffer, buffer_len) \
- _ret = proto_read_byte_array (msg, &buffer, &buffer_len); \
- if (_ret != CKR_OK) goto _cleanup;
-
-#define IN_ULONG_BUFFER(buffer, buffer_len) \
- _ret = proto_read_ulong_buffer (msg, &buffer, &buffer_len); \
- if (_ret != CKR_OK) goto _cleanup;
-
-#define IN_ATTRIBUTE_BUFFER(buffer, buffer_len) \
- _ret = proto_read_attribute_buffer (msg, &buffer, &buffer_len); \
- if (_ret != CKR_OK) goto _cleanup;
-
-#define IN_ATTRIBUTE_ARRAY(attrs, n_attrs) \
- _ret = proto_read_attribute_array (msg, &attrs, &n_attrs); \
- if (_ret != CKR_OK) goto _cleanup;
-
-#define IN_MECHANISM(mech) \
- _ret = proto_read_mechanism (msg, &mech); \
- if (_ret != CKR_OK) goto _cleanup;
-
-
-#define OUT_ULONG(val) \
- if (_ret == CKR_OK && !p11_rpc_message_write_ulong (msg, val)) \
- _ret = PREP_ERROR;
-
-#define OUT_BYTE_ARRAY(array, len) \
- /* Note how we filter return codes */ \
- _ret = proto_write_byte_array (msg, array, len, _ret);
-
-#define OUT_ULONG_ARRAY(array, len) \
- /* Note how we filter return codes */ \
- _ret = proto_write_ulong_array (msg, array, len, _ret);
-
-#define OUT_ATTRIBUTE_ARRAY(array, len) \
- /* Note how we filter return codes */ \
- _ret = proto_write_attribute_array (msg, array, len, _ret);
-
-#define OUT_INFO(val) \
- if (_ret == CKR_OK) \
- _ret = proto_write_info (msg, &val);
-
-#define OUT_SLOT_INFO(val) \
- if (_ret == CKR_OK) \
- _ret = proto_write_slot_info (msg, &val);
-
-#define OUT_TOKEN_INFO(val) \
- if (_ret == CKR_OK) \
- _ret = proto_write_token_info (msg, &val);
-
-#define OUT_MECHANISM_INFO(val) \
- if (_ret == CKR_OK) \
- _ret = proto_write_mechanism_info (msg, &val);
-
-#define OUT_SESSION_INFO(val) \
- if (_ret == CKR_OK) \
- _ret = proto_write_session_info (msg, &val);
-
-/* ---------------------------------------------------------------------------
- * DISPATCH SPECIFIC CALLS
- */
-
-static CK_RV
-rpc_C_Initialize (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_X_Initialize func;
- CK_C_INITIALIZE_ARGS init_args;
- CK_BYTE_PTR handshake;
- CK_ULONG n_handshake;
- CK_BYTE reserved_present = 0;
- CK_BYTE_PTR reserved = NULL;
- CK_ULONG n_reserved;
- CK_RV ret = CKR_OK;
-
- p11_debug ("C_Initialize: enter");
-
- assert (msg != NULL);
- assert (self != NULL);
-
- ret = proto_read_byte_array (msg, &handshake, &n_handshake);
- if (ret == CKR_OK) {
-
- /* Check to make sure the header matches */
- if (n_handshake != P11_RPC_HANDSHAKE_LEN ||
- memcmp (handshake, P11_RPC_HANDSHAKE, n_handshake) != 0) {
- p11_message ("invalid handshake received from connecting module");
- ret = CKR_GENERAL_ERROR;
- }
- }
-
- if (ret == CKR_OK) {
- if (!p11_rpc_message_read_byte (msg, &reserved_present))
- ret = PARSE_ERROR;
- }
-
- if (ret == CKR_OK) {
- ret = proto_read_byte_array (msg, &reserved, &n_reserved);
-
- assert (p11_rpc_message_is_verified (msg));
- }
-
- if (ret == CKR_OK) {
- memset (&init_args, 0, sizeof (init_args));
- init_args.flags = CKF_OS_LOCKING_OK;
- init_args.pReserved = reserved_present ? reserved : NULL;
-
- func = self->C_Initialize;
- assert (func != NULL);
- ret = (func) (self, &init_args);
-
- /* Empty response */
- if (ret == CKR_OK)
- ret = call_ready (msg);
- }
-
- p11_debug ("ret: %d", (int)ret);
- return ret;
-}
-
-static CK_RV
-rpc_C_Finalize (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- BEGIN_CALL (Finalize);
- PROCESS_CALL ((self, NULL));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_GetInfo (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_INFO info;
-
- BEGIN_CALL (GetInfo);
- PROCESS_CALL ((self, &info));
- OUT_INFO (info);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_GetSlotList (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_BBOOL token_present;
- CK_SLOT_ID_PTR slot_list;
- CK_ULONG count;
-
- BEGIN_CALL (GetSlotList);
- IN_BYTE (token_present);
- IN_ULONG_BUFFER (slot_list, count);
- PROCESS_CALL ((self, token_present, slot_list, &count));
- OUT_ULONG_ARRAY (slot_list, count);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_GetSlotInfo (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SLOT_ID slot_id;
- CK_SLOT_INFO info;
-
- BEGIN_CALL (GetSlotInfo);
- IN_ULONG (slot_id);
- PROCESS_CALL ((self, slot_id, &info));
- OUT_SLOT_INFO (info);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_GetTokenInfo (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SLOT_ID slot_id;
- CK_TOKEN_INFO info;
-
- BEGIN_CALL (GetTokenInfo);
- IN_ULONG (slot_id);
- PROCESS_CALL ((self, slot_id, &info));
- OUT_TOKEN_INFO (info);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_GetMechanismList (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SLOT_ID slot_id;
- CK_MECHANISM_TYPE_PTR mechanism_list;
- CK_ULONG count;
-
- BEGIN_CALL (GetMechanismList);
- IN_ULONG (slot_id);
- IN_ULONG_BUFFER (mechanism_list, count);
- PROCESS_CALL ((self, slot_id, mechanism_list, &count));
- OUT_ULONG_ARRAY (mechanism_list, count);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_GetMechanismInfo (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SLOT_ID slot_id;
- CK_MECHANISM_TYPE type;
- CK_MECHANISM_INFO info;
-
- BEGIN_CALL (GetMechanismInfo);
- IN_ULONG (slot_id);
- IN_ULONG (type);
- PROCESS_CALL ((self, slot_id, type, &info));
- OUT_MECHANISM_INFO (info);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_InitToken (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SLOT_ID slot_id;
- CK_UTF8CHAR_PTR pin;
- CK_ULONG pin_len;
- CK_UTF8CHAR_PTR label;
-
- BEGIN_CALL (InitToken);
- IN_ULONG (slot_id);
- IN_BYTE_ARRAY (pin, pin_len);
- IN_STRING (label);
- PROCESS_CALL ((self, slot_id, pin, pin_len, label));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_WaitForSlotEvent (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_FLAGS flags;
- CK_SLOT_ID slot_id;
-
- BEGIN_CALL (WaitForSlotEvent);
- IN_ULONG (flags);
- PROCESS_CALL ((self, flags, &slot_id, NULL));
- OUT_ULONG (slot_id);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_OpenSession (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SLOT_ID slot_id;
- CK_FLAGS flags;
- CK_SESSION_HANDLE session;
-
- BEGIN_CALL (OpenSession);
- IN_ULONG (slot_id);
- IN_ULONG (flags);
- PROCESS_CALL ((self, slot_id, flags, NULL, NULL, &session));
- OUT_ULONG (session);
- END_CALL;
-}
-
-
-static CK_RV
-rpc_C_CloseSession (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
-
- BEGIN_CALL (CloseSession);
- IN_ULONG (session);
- PROCESS_CALL ((self, session));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_CloseAllSessions (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SLOT_ID slot_id;
-
- /* Slot id becomes apartment so lower layers can tell clients apart. */
-
- BEGIN_CALL (CloseAllSessions);
- IN_ULONG (slot_id);
- PROCESS_CALL ((self, slot_id));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_GetSessionInfo (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_SESSION_INFO info;
-
- BEGIN_CALL (GetSessionInfo);
- IN_ULONG (session);
- PROCESS_CALL ((self, session, &info));
- OUT_SESSION_INFO (info);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_InitPIN (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_UTF8CHAR_PTR pin;
- CK_ULONG pin_len;
-
- BEGIN_CALL (InitPIN);
- IN_ULONG (session);
- IN_BYTE_ARRAY (pin, pin_len);
- PROCESS_CALL ((self, session, pin, pin_len));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_SetPIN (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_UTF8CHAR_PTR old_pin;
- CK_ULONG old_len;
- CK_UTF8CHAR_PTR new_pin;
- CK_ULONG new_len;
-
- BEGIN_CALL (SetPIN);
- IN_ULONG (session);
- IN_BYTE_ARRAY (old_pin, old_len);
- IN_BYTE_ARRAY (new_pin, new_len);
- PROCESS_CALL ((self, session, old_pin, old_len, new_pin, new_len));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_GetOperationState (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR operation_state;
- CK_ULONG operation_state_len;
-
- BEGIN_CALL (GetOperationState);
- IN_ULONG (session);
- IN_BYTE_BUFFER (operation_state, operation_state_len);
- PROCESS_CALL ((self, session, operation_state, &operation_state_len));
- OUT_BYTE_ARRAY (operation_state, operation_state_len);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_SetOperationState (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR operation_state;
- CK_ULONG operation_state_len;
- CK_OBJECT_HANDLE encryption_key;
- CK_OBJECT_HANDLE authentication_key;
-
- BEGIN_CALL (SetOperationState);
- IN_ULONG (session);
- IN_BYTE_ARRAY (operation_state, operation_state_len);
- IN_ULONG (encryption_key);
- IN_ULONG (authentication_key);
- PROCESS_CALL ((self, session, operation_state, operation_state_len, encryption_key, authentication_key));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_Login (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_USER_TYPE user_type;
- CK_UTF8CHAR_PTR pin;
- CK_ULONG pin_len;
-
- BEGIN_CALL (Login);
- IN_ULONG (session);
- IN_ULONG (user_type);
- IN_BYTE_ARRAY (pin, pin_len);
- PROCESS_CALL ((self, session, user_type, pin, pin_len));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_Logout (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
-
- BEGIN_CALL (Logout);
- IN_ULONG (session);
- PROCESS_CALL ((self, session));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_CreateObject (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_ATTRIBUTE_PTR template;
- CK_ULONG count;
- CK_OBJECT_HANDLE new_object;
-
- BEGIN_CALL (CreateObject);
- IN_ULONG (session);
- IN_ATTRIBUTE_ARRAY (template, count);
- PROCESS_CALL ((self, session, template, count, &new_object));
- OUT_ULONG (new_object);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_CopyObject (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_OBJECT_HANDLE object;
- CK_ATTRIBUTE_PTR template;
- CK_ULONG count;
- CK_OBJECT_HANDLE new_object;
-
- BEGIN_CALL (CopyObject);
- IN_ULONG (session);
- IN_ULONG (object);
- IN_ATTRIBUTE_ARRAY (template, count);
- PROCESS_CALL ((self, session, object, template, count, &new_object));
- OUT_ULONG (new_object);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_DestroyObject (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_OBJECT_HANDLE object;
-
- BEGIN_CALL (DestroyObject);
- IN_ULONG (session);
- IN_ULONG (object);
- PROCESS_CALL ((self, session, object));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_GetObjectSize (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_OBJECT_HANDLE object;
- CK_ULONG size;
-
- BEGIN_CALL (GetObjectSize);
- IN_ULONG (session);
- IN_ULONG (object);
- PROCESS_CALL ((self, session, object, &size));
- OUT_ULONG (size);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_GetAttributeValue (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_OBJECT_HANDLE object;
- CK_ATTRIBUTE_PTR template;
- CK_ULONG count;
-
- BEGIN_CALL (GetAttributeValue);
- IN_ULONG (session);
- IN_ULONG (object);
- IN_ATTRIBUTE_BUFFER (template, count);
- PROCESS_CALL ((self, session, object, template, count));
- OUT_ATTRIBUTE_ARRAY (template, count);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_SetAttributeValue (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_OBJECT_HANDLE object;
- CK_ATTRIBUTE_PTR template;
- CK_ULONG count;
-
- BEGIN_CALL (SetAttributeValue);
- IN_ULONG (session);
- IN_ULONG (object);
- IN_ATTRIBUTE_ARRAY (template, count);
- PROCESS_CALL ((self, session, object, template, count));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_FindObjectsInit (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_ATTRIBUTE_PTR template;
- CK_ULONG count;
-
- BEGIN_CALL (FindObjectsInit);
- IN_ULONG (session);
- IN_ATTRIBUTE_ARRAY (template, count);
- PROCESS_CALL ((self, session, template, count));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_FindObjects (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_OBJECT_HANDLE_PTR objects;
- CK_ULONG max_object_count;
- CK_ULONG object_count;
-
- BEGIN_CALL (FindObjects);
- IN_ULONG (session);
- IN_ULONG_BUFFER (objects, max_object_count);
- PROCESS_CALL ((self, session, objects, max_object_count, &object_count));
- OUT_ULONG_ARRAY (objects, object_count);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_FindObjectsFinal (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
-
- BEGIN_CALL (FindObjectsFinal);
- IN_ULONG (session);
- PROCESS_CALL ((self, session));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_EncryptInit (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_MECHANISM mechanism;
- CK_OBJECT_HANDLE key;
-
- BEGIN_CALL (EncryptInit);
- IN_ULONG (session);
- IN_MECHANISM (mechanism);
- IN_ULONG (key);
- PROCESS_CALL ((self, session, &mechanism, key));
- END_CALL;
-
-}
-
-static CK_RV
-rpc_C_Encrypt (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR data;
- CK_ULONG data_len;
- CK_BYTE_PTR encrypted_data;
- CK_ULONG encrypted_data_len;
-
- BEGIN_CALL (Encrypt);
- IN_ULONG (session);
- IN_BYTE_ARRAY (data, data_len);
- IN_BYTE_BUFFER (encrypted_data, encrypted_data_len);
- PROCESS_CALL ((self, session, data, data_len, encrypted_data, &encrypted_data_len));
- OUT_BYTE_ARRAY (encrypted_data, encrypted_data_len);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_EncryptUpdate (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR part;
- CK_ULONG part_len;
- CK_BYTE_PTR encrypted_part;
- CK_ULONG encrypted_part_len;
-
- BEGIN_CALL (EncryptUpdate);
- IN_ULONG (session);
- IN_BYTE_ARRAY (part, part_len);
- IN_BYTE_BUFFER (encrypted_part, encrypted_part_len);
- PROCESS_CALL ((self, session, part, part_len, encrypted_part, &encrypted_part_len));
- OUT_BYTE_ARRAY (encrypted_part, encrypted_part_len);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_EncryptFinal (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR last_encrypted_part;
- CK_ULONG last_encrypted_part_len;
-
- BEGIN_CALL (EncryptFinal);
- IN_ULONG (session);
- IN_BYTE_BUFFER (last_encrypted_part, last_encrypted_part_len);
- PROCESS_CALL ((self, session, last_encrypted_part, &last_encrypted_part_len));
- OUT_BYTE_ARRAY (last_encrypted_part, last_encrypted_part_len);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_DecryptInit (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_MECHANISM mechanism;
- CK_OBJECT_HANDLE key;
-
- BEGIN_CALL (DecryptInit);
- IN_ULONG (session);
- IN_MECHANISM (mechanism);
- IN_ULONG (key);
- PROCESS_CALL ((self, session, &mechanism, key));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_Decrypt (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR encrypted_data;
- CK_ULONG encrypted_data_len;
- CK_BYTE_PTR data;
- CK_ULONG data_len;
-
- BEGIN_CALL (Decrypt);
- IN_ULONG (session);
- IN_BYTE_ARRAY (encrypted_data, encrypted_data_len);
- IN_BYTE_BUFFER (data, data_len);
- PROCESS_CALL ((self, session, encrypted_data, encrypted_data_len, data, &data_len));
- OUT_BYTE_ARRAY (data, data_len);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_DecryptUpdate (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR encrypted_part;
- CK_ULONG encrypted_part_len;
- CK_BYTE_PTR part;
- CK_ULONG part_len;
-
- BEGIN_CALL (DecryptUpdate);
- IN_ULONG (session);
- IN_BYTE_ARRAY (encrypted_part, encrypted_part_len);
- IN_BYTE_BUFFER (part, part_len);
- PROCESS_CALL ((self, session, encrypted_part, encrypted_part_len, part, &part_len));
- OUT_BYTE_ARRAY (part, part_len);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_DecryptFinal (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR last_part;
- CK_ULONG last_part_len;
-
- BEGIN_CALL (DecryptFinal);
- IN_ULONG (session);
- IN_BYTE_BUFFER (last_part, last_part_len);
- PROCESS_CALL ((self, session, last_part, &last_part_len));
- OUT_BYTE_ARRAY (last_part, last_part_len);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_DigestInit (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_MECHANISM mechanism;
-
- BEGIN_CALL (DigestInit);
- IN_ULONG (session);
- IN_MECHANISM (mechanism);
- PROCESS_CALL ((self, session, &mechanism));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_Digest (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR data;
- CK_ULONG data_len;
- CK_BYTE_PTR digest;
- CK_ULONG digest_len;
-
- BEGIN_CALL (Digest);
- IN_ULONG (session);
- IN_BYTE_ARRAY (data, data_len);
- IN_BYTE_BUFFER (digest, digest_len);
- PROCESS_CALL ((self, session, data, data_len, digest, &digest_len));
- OUT_BYTE_ARRAY (digest, digest_len);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_DigestUpdate (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR part;
- CK_ULONG part_len;
-
- BEGIN_CALL (DigestUpdate);
- IN_ULONG (session);
- IN_BYTE_ARRAY (part, part_len);
- PROCESS_CALL ((self, session, part, part_len));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_DigestKey (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_OBJECT_HANDLE key;
-
- BEGIN_CALL (DigestKey);
- IN_ULONG (session);
- IN_ULONG (key);
- PROCESS_CALL ((self, session, key));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_DigestFinal (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR digest;
- CK_ULONG digest_len;
-
- BEGIN_CALL (DigestFinal);
- IN_ULONG (session);
- IN_BYTE_BUFFER (digest, digest_len);
- PROCESS_CALL ((self, session, digest, &digest_len));
- OUT_BYTE_ARRAY (digest, digest_len);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_SignInit (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_MECHANISM mechanism;
- CK_OBJECT_HANDLE key;
-
- BEGIN_CALL (SignInit);
- IN_ULONG (session);
- IN_MECHANISM (mechanism);
- IN_ULONG (key);
- PROCESS_CALL ((self, session, &mechanism, key));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_Sign (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR part;
- CK_ULONG part_len;
- CK_BYTE_PTR signature;
- CK_ULONG signature_len;
-
- BEGIN_CALL (Sign);
- IN_ULONG (session);
- IN_BYTE_ARRAY (part, part_len);
- IN_BYTE_BUFFER (signature, signature_len);
- PROCESS_CALL ((self, session, part, part_len, signature, &signature_len));
- OUT_BYTE_ARRAY (signature, signature_len);
- END_CALL;
-
-}
-
-static CK_RV
-rpc_C_SignUpdate (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR part;
- CK_ULONG part_len;
-
- BEGIN_CALL (SignUpdate);
- IN_ULONG (session);
- IN_BYTE_ARRAY (part, part_len);
- PROCESS_CALL ((self, session, part, part_len));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_SignFinal (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR signature;
- CK_ULONG signature_len;
-
- BEGIN_CALL (SignFinal);
- IN_ULONG (session);
- IN_BYTE_BUFFER (signature, signature_len);
- PROCESS_CALL ((self, session, signature, &signature_len));
- OUT_BYTE_ARRAY (signature, signature_len);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_SignRecoverInit (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_MECHANISM mechanism;
- CK_OBJECT_HANDLE key;
-
- BEGIN_CALL (SignRecoverInit);
- IN_ULONG (session);
- IN_MECHANISM (mechanism);
- IN_ULONG (key);
- PROCESS_CALL ((self, session, &mechanism, key));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_SignRecover (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR data;
- CK_ULONG data_len;
- CK_BYTE_PTR signature;
- CK_ULONG signature_len;
-
- BEGIN_CALL (SignRecover);
- IN_ULONG (session);
- IN_BYTE_ARRAY (data, data_len);
- IN_BYTE_BUFFER (signature, signature_len);
- PROCESS_CALL ((self, session, data, data_len, signature, &signature_len));
- OUT_BYTE_ARRAY (signature, signature_len);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_VerifyInit (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_MECHANISM mechanism;
- CK_OBJECT_HANDLE key;
-
- BEGIN_CALL (VerifyInit);
- IN_ULONG (session);
- IN_MECHANISM (mechanism);
- IN_ULONG (key);
- PROCESS_CALL ((self, session, &mechanism, key));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_Verify (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR data;
- CK_ULONG data_len;
- CK_BYTE_PTR signature;
- CK_ULONG signature_len;
-
- BEGIN_CALL (Verify);
- IN_ULONG (session);
- IN_BYTE_ARRAY (data, data_len);
- IN_BYTE_ARRAY (signature, signature_len);
- PROCESS_CALL ((self, session, data, data_len, signature, signature_len));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_VerifyUpdate (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR part;
- CK_ULONG part_len;
-
- BEGIN_CALL (VerifyUpdate);
- IN_ULONG (session);
- IN_BYTE_ARRAY (part, part_len);
- PROCESS_CALL ((self, session, part, part_len));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_VerifyFinal (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR signature;
- CK_ULONG signature_len;
-
- BEGIN_CALL (VerifyFinal);
- IN_ULONG (session);
- IN_BYTE_ARRAY (signature, signature_len);
- PROCESS_CALL ((self, session, signature, signature_len));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_VerifyRecoverInit (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_MECHANISM mechanism;
- CK_OBJECT_HANDLE key;
-
- BEGIN_CALL (VerifyRecoverInit);
- IN_ULONG (session);
- IN_MECHANISM (mechanism);
- IN_ULONG (key);
- PROCESS_CALL ((self, session, &mechanism, key));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_VerifyRecover (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR signature;
- CK_ULONG signature_len;
- CK_BYTE_PTR data;
- CK_ULONG data_len;
-
- BEGIN_CALL (VerifyRecover);
- IN_ULONG (session);
- IN_BYTE_ARRAY (signature, signature_len);
- IN_BYTE_BUFFER (data, data_len);
- PROCESS_CALL ((self, session, signature, signature_len, data, &data_len));
- OUT_BYTE_ARRAY (data, data_len);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_DigestEncryptUpdate (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR part;
- CK_ULONG part_len;
- CK_BYTE_PTR encrypted_part;
- CK_ULONG encrypted_part_len;
-
- BEGIN_CALL (DigestEncryptUpdate);
- IN_ULONG (session);
- IN_BYTE_ARRAY (part, part_len);
- IN_BYTE_BUFFER (encrypted_part, encrypted_part_len);
- PROCESS_CALL ((self, session, part, part_len, encrypted_part, &encrypted_part_len));
- OUT_BYTE_ARRAY (encrypted_part, encrypted_part_len);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_DecryptDigestUpdate (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR encrypted_part;
- CK_ULONG encrypted_part_len;
- CK_BYTE_PTR part;
- CK_ULONG part_len;
-
- BEGIN_CALL (DecryptDigestUpdate);
- IN_ULONG (session);
- IN_BYTE_ARRAY (encrypted_part, encrypted_part_len);
- IN_BYTE_BUFFER (part, part_len);
- PROCESS_CALL ((self, session, encrypted_part, encrypted_part_len, part, &part_len));
- OUT_BYTE_ARRAY (part, part_len);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_SignEncryptUpdate (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR part;
- CK_ULONG part_len;
- CK_BYTE_PTR encrypted_part;
- CK_ULONG encrypted_part_len;
-
- BEGIN_CALL (SignEncryptUpdate);
- IN_ULONG (session);
- IN_BYTE_ARRAY (part, part_len);
- IN_BYTE_BUFFER (encrypted_part, encrypted_part_len);
- PROCESS_CALL ((self, session, part, part_len, encrypted_part, &encrypted_part_len));
- OUT_BYTE_ARRAY (encrypted_part, encrypted_part_len);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_DecryptVerifyUpdate (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR encrypted_part;
- CK_ULONG encrypted_part_len;
- CK_BYTE_PTR part;
- CK_ULONG part_len;
-
- BEGIN_CALL (DecryptVerifyUpdate);
- IN_ULONG (session);
- IN_BYTE_ARRAY (encrypted_part, encrypted_part_len);
- IN_BYTE_BUFFER (part, part_len);
- PROCESS_CALL ((self, session, encrypted_part, encrypted_part_len, part, &part_len));
- OUT_BYTE_ARRAY (part, part_len);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_GenerateKey (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_MECHANISM mechanism;
- CK_ATTRIBUTE_PTR template;
- CK_ULONG count;
- CK_OBJECT_HANDLE key;
-
- BEGIN_CALL (GenerateKey);
- IN_ULONG (session);
- IN_MECHANISM (mechanism);
- IN_ATTRIBUTE_ARRAY (template, count);
- PROCESS_CALL ((self, session, &mechanism, template, count, &key));
- OUT_ULONG (key);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_GenerateKeyPair (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_MECHANISM mechanism;
- CK_ATTRIBUTE_PTR public_key_template;
- CK_ULONG public_key_attribute_count;
- CK_ATTRIBUTE_PTR private_key_template;
- CK_ULONG private_key_attribute_count;
- CK_OBJECT_HANDLE public_key;
- CK_OBJECT_HANDLE private_key;
-
- BEGIN_CALL (GenerateKeyPair);
- IN_ULONG (session);
- IN_MECHANISM (mechanism);
- IN_ATTRIBUTE_ARRAY (public_key_template, public_key_attribute_count);
- IN_ATTRIBUTE_ARRAY (private_key_template, private_key_attribute_count);
- PROCESS_CALL ((self, session, &mechanism, public_key_template, public_key_attribute_count, private_key_template, private_key_attribute_count, &public_key, &private_key));
- OUT_ULONG (public_key);
- OUT_ULONG (private_key);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_WrapKey (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_MECHANISM mechanism;
- CK_OBJECT_HANDLE wrapping_key;
- CK_OBJECT_HANDLE key;
- CK_BYTE_PTR wrapped_key;
- CK_ULONG wrapped_key_len;
-
- BEGIN_CALL (WrapKey);
- IN_ULONG (session);
- IN_MECHANISM (mechanism);
- IN_ULONG (wrapping_key);
- IN_ULONG (key);
- IN_BYTE_BUFFER (wrapped_key, wrapped_key_len);
- PROCESS_CALL ((self, session, &mechanism, wrapping_key, key, wrapped_key, &wrapped_key_len));
- OUT_BYTE_ARRAY (wrapped_key, wrapped_key_len);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_UnwrapKey (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_MECHANISM mechanism;
- CK_OBJECT_HANDLE unwrapping_key;
- CK_BYTE_PTR wrapped_key;
- CK_ULONG wrapped_key_len;
- CK_ATTRIBUTE_PTR template;
- CK_ULONG attribute_count;
- CK_OBJECT_HANDLE key;
-
- BEGIN_CALL (UnwrapKey);
- IN_ULONG (session);
- IN_MECHANISM (mechanism);
- IN_ULONG (unwrapping_key);
- IN_BYTE_ARRAY (wrapped_key, wrapped_key_len);
- IN_ATTRIBUTE_ARRAY (template, attribute_count);
- PROCESS_CALL ((self, session, &mechanism, unwrapping_key, wrapped_key, wrapped_key_len, template, attribute_count, &key));
- OUT_ULONG (key);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_DeriveKey (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_MECHANISM mechanism;
- CK_OBJECT_HANDLE base_key;
- CK_ATTRIBUTE_PTR template;
- CK_ULONG attribute_count;
- CK_OBJECT_HANDLE key;
-
- BEGIN_CALL (DeriveKey);
- IN_ULONG (session);
- IN_MECHANISM (mechanism);
- IN_ULONG (base_key);
- IN_ATTRIBUTE_ARRAY (template, attribute_count);
- PROCESS_CALL ((self, session, &mechanism, base_key, template, attribute_count, &key));
- OUT_ULONG (key);
- END_CALL;
-}
-
-static CK_RV
-rpc_C_SeedRandom (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR seed;
- CK_ULONG seed_len;
-
- BEGIN_CALL (SeedRandom);
- IN_ULONG (session);
- IN_BYTE_ARRAY (seed, seed_len);
- PROCESS_CALL ((self, session, seed, seed_len));
- END_CALL;
-}
-
-static CK_RV
-rpc_C_GenerateRandom (CK_X_FUNCTION_LIST *self,
- p11_rpc_message *msg)
-{
- CK_SESSION_HANDLE session;
- CK_BYTE_PTR random_data;
- CK_ULONG random_len;
-
- BEGIN_CALL (GenerateRandom);
- IN_ULONG (session);
- IN_BYTE_BUFFER (random_data, random_len);
- PROCESS_CALL ((self, session, random_data, random_len));
- OUT_BYTE_ARRAY (random_data, random_len);
- END_CALL;
-}
-
-bool
-p11_rpc_server_handle (CK_X_FUNCTION_LIST *self,
- p11_buffer *request,
- p11_buffer *response)
-{
- p11_rpc_message msg;
- CK_RV ret;
- int req_id;
-
- return_val_if_fail (self != NULL, false);
- return_val_if_fail (request != NULL, false);
- return_val_if_fail (response != NULL, false);
-
- p11_message_clear ();
-
- p11_rpc_message_init (&msg, request, response);
-
- if (!p11_rpc_message_parse (&msg, P11_RPC_REQUEST)) {
- p11_rpc_message_clear (&msg);
- p11_message ("couldn't parse pkcs11 rpc message");
- return false;
- }
-
- /* This should have been checked by the parsing code */
- assert (msg.call_id > P11_RPC_CALL_ERROR);
- assert (msg.call_id < P11_RPC_CALL_MAX);
- req_id = msg.call_id;
-
- switch(req_id) {
- #define CASE_CALL(name) \
- case P11_RPC_CALL_##name: \
- ret = rpc_##name (self, &msg); \
- break;
- CASE_CALL (C_Initialize)
- CASE_CALL (C_Finalize)
- CASE_CALL (C_GetInfo)
- CASE_CALL (C_GetSlotList)
- CASE_CALL (C_GetSlotInfo)
- CASE_CALL (C_GetTokenInfo)
- CASE_CALL (C_GetMechanismList)
- CASE_CALL (C_GetMechanismInfo)
- CASE_CALL (C_InitToken)
- CASE_CALL (C_OpenSession)
- CASE_CALL (C_CloseSession)
- CASE_CALL (C_CloseAllSessions)
- CASE_CALL (C_GetSessionInfo)
- CASE_CALL (C_InitPIN)
- CASE_CALL (C_SetPIN)
- CASE_CALL (C_GetOperationState)
- CASE_CALL (C_SetOperationState)
- CASE_CALL (C_Login)
- CASE_CALL (C_Logout)
- CASE_CALL (C_CreateObject)
- CASE_CALL (C_CopyObject)
- CASE_CALL (C_DestroyObject)
- CASE_CALL (C_GetObjectSize)
- CASE_CALL (C_GetAttributeValue)
- CASE_CALL (C_SetAttributeValue)
- CASE_CALL (C_FindObjectsInit)
- CASE_CALL (C_FindObjects)
- CASE_CALL (C_FindObjectsFinal)
- CASE_CALL (C_EncryptInit)
- CASE_CALL (C_Encrypt)
- CASE_CALL (C_EncryptUpdate)
- CASE_CALL (C_EncryptFinal)
- CASE_CALL (C_DecryptInit)
- CASE_CALL (C_Decrypt)
- CASE_CALL (C_DecryptUpdate)
- CASE_CALL (C_DecryptFinal)
- CASE_CALL (C_DigestInit)
- CASE_CALL (C_Digest)
- CASE_CALL (C_DigestUpdate)
- CASE_CALL (C_DigestKey)
- CASE_CALL (C_DigestFinal)
- CASE_CALL (C_SignInit)
- CASE_CALL (C_Sign)
- CASE_CALL (C_SignUpdate)
- CASE_CALL (C_SignFinal)
- CASE_CALL (C_SignRecoverInit)
- CASE_CALL (C_SignRecover)
- CASE_CALL (C_VerifyInit)
- CASE_CALL (C_Verify)
- CASE_CALL (C_VerifyUpdate)
- CASE_CALL (C_VerifyFinal)
- CASE_CALL (C_VerifyRecoverInit)
- CASE_CALL (C_VerifyRecover)
- CASE_CALL (C_DigestEncryptUpdate)
- CASE_CALL (C_DecryptDigestUpdate)
- CASE_CALL (C_SignEncryptUpdate)
- CASE_CALL (C_DecryptVerifyUpdate)
- CASE_CALL (C_GenerateKey)
- CASE_CALL (C_GenerateKeyPair)
- CASE_CALL (C_WrapKey)
- CASE_CALL (C_UnwrapKey)
- CASE_CALL (C_DeriveKey)
- CASE_CALL (C_SeedRandom)
- CASE_CALL (C_GenerateRandom)
- CASE_CALL (C_WaitForSlotEvent)
- #undef CASE_CALL
- default:
- /* This should have been caught by the parse code */
- assert (0 && "Unchecked call");
- break;
- };
-
- if (p11_buffer_failed (msg.output)) {
- p11_message ("out of memory error putting together message");
- p11_rpc_message_clear (&msg);
- return false;
- }
-
- /* A filled in response */
- if (ret == CKR_OK) {
-
- /*
- * Since we're dealing with many many functions above generating
- * these messages we want to make sure each of them actually
- * does what it's supposed to.
- */
- assert (p11_rpc_message_is_verified (&msg));
- assert (msg.call_type == P11_RPC_RESPONSE);
- assert (msg.call_id == req_id);
- assert (p11_rpc_calls[msg.call_id].response);
- assert (strcmp (p11_rpc_calls[msg.call_id].response, msg.signature) == 0);
-
- /* Fill in an error respnose */
- } else {
- if (!p11_rpc_message_prep (&msg, P11_RPC_CALL_ERROR, P11_RPC_RESPONSE) ||
- !p11_rpc_message_write_ulong (&msg, (uint32_t)ret) ||
- p11_buffer_failed (msg.output)) {
- p11_message ("out of memory responding with error");
- p11_rpc_message_clear (&msg);
- return false;
- }
- }
-
- p11_rpc_message_clear (&msg);
- return true;
-}
-
-int
-p11_kit_remote_serve_module (CK_FUNCTION_LIST *module,
- int in_fd,
- int out_fd)
-{
- p11_rpc_status status;
- unsigned char version;
- p11_virtual virt;
- p11_buffer options;
- p11_buffer buffer;
- size_t state;
- int ret = 1;
- int code;
-
- return_val_if_fail (module != NULL, 1);
-
- p11_buffer_init (&options, 0);
- p11_buffer_init (&buffer, 0);
-
- p11_virtual_init (&virt, &p11_virtual_base, module, NULL);
-
- switch (read (in_fd, &version, 1)) {
- case 0:
- goto out;
- case 1:
- if (version != 0) {
- p11_message ("unspported version received: %d", (int)version);
- goto out;
- }
- break;
- default:
- p11_message_err (errno, "couldn't read credential byte");
- goto out;
- }
-
- version = 0;
- switch (write (out_fd, &version, out_fd)) {
- case 1:
- break;
- default:
- p11_message_err (errno, "couldn't write credential byte");
- goto out;
- }
-
- status = P11_RPC_OK;
- while (status == P11_RPC_OK) {
- state = 0;
- code = 0;
-
- do {
- status = p11_rpc_transport_read (in_fd, &state, &code,
- &options, &buffer);
- } while (status == P11_RPC_AGAIN);
-
- switch (status) {
- case P11_RPC_OK:
- break;
- case P11_RPC_EOF:
- ret = 0;
- continue;
- case P11_RPC_AGAIN:
- assert_not_reached ();
- case P11_RPC_ERROR:
- p11_message_err (errno, "failed to read rpc message");
- goto out;
- }
-
- if (!p11_rpc_server_handle (&virt.funcs, &buffer, &buffer)) {
- p11_message ("unexpected error handling rpc message");
- goto out;
- }
-
- state = 0;
- options.len = 0;
- do {
- status = p11_rpc_transport_write (out_fd, &state, code,
- &options, &buffer);
- } while (status == P11_RPC_AGAIN);
-
- switch (status) {
- case P11_RPC_OK:
- break;
- case P11_RPC_EOF:
- case P11_RPC_AGAIN:
- assert_not_reached ();
- case P11_RPC_ERROR:
- p11_message_err (errno, "failed to write rpc message");
- goto out;
- }
- }
-
-out:
- p11_buffer_uninit (&buffer);
- p11_buffer_uninit (&options);
-
- p11_virtual_uninit (&virt);
-
- return ret;
-}