|
Packit |
ce73f7 |
/*
|
|
Packit |
ce73f7 |
* Copyright (C) 2008 Stefan Walter
|
|
Packit |
ce73f7 |
* Copyright (C) 2012 Red Hat Inc.
|
|
Packit |
ce73f7 |
*
|
|
Packit |
ce73f7 |
* Redistribution and use in source and binary forms, with or without
|
|
Packit |
ce73f7 |
* modification, are permitted provided that the following conditions
|
|
Packit |
ce73f7 |
* are met:
|
|
Packit |
ce73f7 |
*
|
|
Packit |
ce73f7 |
* * Redistributions of source code must retain the above
|
|
Packit |
ce73f7 |
* copyright notice, this list of conditions and the
|
|
Packit |
ce73f7 |
* following disclaimer.
|
|
Packit |
ce73f7 |
* * Redistributions in binary form must reproduce the
|
|
Packit |
ce73f7 |
* above copyright notice, this list of conditions and
|
|
Packit |
ce73f7 |
* the following disclaimer in the documentation and/or
|
|
Packit |
ce73f7 |
* other materials provided with the distribution.
|
|
Packit |
ce73f7 |
* * The names of contributors to this software may not be
|
|
Packit |
ce73f7 |
* used to endorse or promote products derived from this
|
|
Packit |
ce73f7 |
* software without specific prior written permission.
|
|
Packit |
ce73f7 |
*
|
|
Packit |
ce73f7 |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
Packit |
ce73f7 |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
Packit |
ce73f7 |
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
Packit |
ce73f7 |
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
Packit |
ce73f7 |
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
Packit |
ce73f7 |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
Packit |
ce73f7 |
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
|
Packit |
ce73f7 |
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
Packit |
ce73f7 |
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
Packit |
ce73f7 |
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
|
Packit |
ce73f7 |
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
|
Packit |
ce73f7 |
* DAMAGE.
|
|
Packit |
ce73f7 |
*
|
|
Packit |
ce73f7 |
* Author: Stef Walter <stefw@gnome.org>
|
|
Packit |
ce73f7 |
*/
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#include "config.h"
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define P11_DEBUG_FLAG P11_DEBUG_RPC
|
|
Packit |
ce73f7 |
#include "debug.h"
|
|
Packit |
ce73f7 |
#include "pkcs11.h"
|
|
Packit |
ce73f7 |
#include "pkcs11x.h"
|
|
Packit |
ce73f7 |
#include "library.h"
|
|
Packit |
ce73f7 |
#include "message.h"
|
|
Packit |
ce73f7 |
#include "private.h"
|
|
Packit |
ce73f7 |
#include "rpc.h"
|
|
Packit |
ce73f7 |
#include "rpc-message.h"
|
|
Packit |
ce73f7 |
#include "virtual.h"
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#include <assert.h>
|
|
Packit |
ce73f7 |
#include <string.h>
|
|
Packit |
ce73f7 |
#include <unistd.h>
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* The error used by us when parsing of rpc message fails */
|
|
Packit |
ce73f7 |
#define PARSE_ERROR CKR_DEVICE_ERROR
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
typedef struct {
|
|
Packit |
ce73f7 |
p11_mutex_t mutex;
|
|
Packit |
ce73f7 |
p11_rpc_client_vtable *vtable;
|
|
Packit |
ce73f7 |
unsigned int initialized_forkid;
|
|
Packit |
ce73f7 |
bool initialize_done;
|
|
Packit |
ce73f7 |
} rpc_client;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Allocator for call session buffers */
|
|
Packit |
ce73f7 |
static void *
|
|
Packit |
ce73f7 |
log_allocator (void *pointer,
|
|
Packit |
ce73f7 |
size_t size)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
void *result = realloc (pointer, (size_t)size);
|
|
Packit |
ce73f7 |
return_val_if_fail (!size || result != NULL, NULL);
|
|
Packit |
ce73f7 |
return result;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
call_prepare (rpc_client *module,
|
|
Packit |
ce73f7 |
p11_rpc_message *msg,
|
|
Packit |
ce73f7 |
int call_id)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
p11_buffer *buffer;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
assert (module != NULL);
|
|
Packit |
ce73f7 |
assert (msg != NULL);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (module->initialized_forkid != p11_forkid)
|
|
Packit |
ce73f7 |
return CKR_CRYPTOKI_NOT_INITIALIZED;
|
|
Packit |
ce73f7 |
if (!module->initialize_done)
|
|
Packit |
ce73f7 |
return CKR_DEVICE_REMOVED;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
buffer = p11_rpc_buffer_new_full (64, log_allocator, free);
|
|
Packit |
ce73f7 |
return_val_if_fail (buffer != NULL, CKR_GENERAL_ERROR);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* We use the same buffer for reading and writing */
|
|
Packit |
ce73f7 |
p11_rpc_message_init (msg, buffer, buffer);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Put in the Call ID and signature */
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_prep (msg, call_id, P11_RPC_REQUEST))
|
|
Packit |
ce73f7 |
return_val_if_reached (CKR_HOST_MEMORY);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
p11_debug ("prepared call: %d", call_id);
|
|
Packit |
ce73f7 |
return CKR_OK;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
call_run (rpc_client *module,
|
|
Packit |
ce73f7 |
p11_rpc_message *msg)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
CK_RV ret = CKR_OK;
|
|
Packit |
ce73f7 |
CK_ULONG ckerr;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
int call_id;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
assert (module != NULL);
|
|
Packit |
ce73f7 |
assert (msg != NULL);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Did building the call fail? */
|
|
Packit |
ce73f7 |
if (p11_buffer_failed (msg->output))
|
|
Packit |
ce73f7 |
return_val_if_reached (CKR_HOST_MEMORY);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Make sure that the signature is valid */
|
|
Packit |
ce73f7 |
assert (p11_rpc_message_is_verified (msg));
|
|
Packit |
ce73f7 |
call_id = msg->call_id;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Do the transport send and receive */
|
|
Packit |
ce73f7 |
assert (module->vtable->transport != NULL);
|
|
Packit |
ce73f7 |
ret = (module->vtable->transport) (module->vtable,
|
|
Packit |
ce73f7 |
msg->output,
|
|
Packit |
ce73f7 |
msg->input);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (ret != CKR_OK)
|
|
Packit |
ce73f7 |
return ret;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_parse (msg, P11_RPC_RESPONSE))
|
|
Packit |
ce73f7 |
return CKR_DEVICE_ERROR;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* If it's an error code then return it */
|
|
Packit |
ce73f7 |
if (msg->call_id == P11_RPC_CALL_ERROR) {
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_read_ulong (msg, &ckerr)) {
|
|
Packit |
ce73f7 |
p11_message ("invalid rpc error response: too short");
|
|
Packit |
ce73f7 |
return CKR_DEVICE_ERROR;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (ckerr <= CKR_OK) {
|
|
Packit |
ce73f7 |
p11_message ("invalid rpc error response: bad error code");
|
|
Packit |
ce73f7 |
return CKR_DEVICE_ERROR;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* An error code from the other side */
|
|
Packit |
ce73f7 |
return (CK_RV)ckerr;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Make sure other side answered the right call */
|
|
Packit |
ce73f7 |
if (call_id != msg->call_id) {
|
|
Packit |
ce73f7 |
p11_message ("invalid rpc response: call mismatch");
|
|
Packit |
ce73f7 |
return CKR_DEVICE_ERROR;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
assert (!p11_buffer_failed (msg->input));
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
p11_debug ("parsing response values");
|
|
Packit |
ce73f7 |
return CKR_OK;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
call_done (rpc_client *module,
|
|
Packit |
ce73f7 |
p11_rpc_message *msg,
|
|
Packit |
ce73f7 |
CK_RV ret)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
assert (module != NULL);
|
|
Packit |
ce73f7 |
assert (msg != NULL);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Check for parsing errors that were not caught elsewhere */
|
|
Packit |
ce73f7 |
if (ret == CKR_OK) {
|
|
Packit |
ce73f7 |
if (p11_buffer_failed (msg->input)) {
|
|
Packit |
ce73f7 |
p11_message ("invalid rpc response: bad argument data");
|
|
Packit |
ce73f7 |
ret = CKR_GENERAL_ERROR;
|
|
Packit |
ce73f7 |
} else {
|
|
Packit |
ce73f7 |
/* Double check that the signature matched our decoding */
|
|
Packit |
ce73f7 |
assert (p11_rpc_message_is_verified (msg));
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* We used the same buffer for input/output, so this frees both */
|
|
Packit |
ce73f7 |
assert (msg->input == msg->output);
|
|
Packit |
ce73f7 |
p11_rpc_buffer_free (msg->input);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
p11_rpc_message_clear (msg);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
return ret;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* -----------------------------------------------------------------------------
|
|
Packit |
ce73f7 |
* MODULE SPECIFIC PROTOCOL CODE
|
|
Packit |
ce73f7 |
*/
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
proto_read_attribute_array (p11_rpc_message *msg,
|
|
Packit |
ce73f7 |
CK_ATTRIBUTE_PTR arr,
|
|
Packit |
ce73f7 |
CK_ULONG len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
uint32_t i, num;
|
|
Packit |
ce73f7 |
CK_RV ret;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
assert (len != 0);
|
|
Packit |
ce73f7 |
assert (msg != NULL);
|
|
Packit |
ce73f7 |
assert (msg->input != NULL);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Make sure this is in the right order */
|
|
Packit |
ce73f7 |
assert (!msg->signature || p11_rpc_message_verify_part (msg, "aA"));
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Get the number of items. We need this value to be correct */
|
|
Packit |
ce73f7 |
if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &num))
|
|
Packit |
ce73f7 |
return PARSE_ERROR;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/*
|
|
Packit |
ce73f7 |
* This should never happen in normal operation. It denotes a goof up
|
|
Packit |
ce73f7 |
* on the other side of our RPC. We should be indicating the exact number
|
|
Packit |
ce73f7 |
* of attributes to the other side. And it should respond with the same
|
|
Packit |
ce73f7 |
* number.
|
|
Packit |
ce73f7 |
*/
|
|
Packit |
ce73f7 |
if (len != num) {
|
|
Packit |
ce73f7 |
p11_message ("received an attribute array with wrong number of attributes");
|
|
Packit |
ce73f7 |
return PARSE_ERROR;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
ret = CKR_OK;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* We need to go ahead and read everything in all cases */
|
|
Packit |
ce73f7 |
for (i = 0; i < num; ++i) {
|
|
Packit |
ce73f7 |
size_t offset = msg->parsed;
|
|
Packit |
ce73f7 |
CK_ATTRIBUTE temp;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
memset (&temp, 0, sizeof (temp));
|
|
Packit |
ce73f7 |
if (!p11_rpc_buffer_get_attribute (msg->input, &offset, &temp)) {
|
|
Packit |
ce73f7 |
msg->parsed = offset;
|
|
Packit |
ce73f7 |
return PARSE_ERROR;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Try and stuff it in the output data */
|
|
Packit |
ce73f7 |
if (arr) {
|
|
Packit |
ce73f7 |
CK_ATTRIBUTE *attr = &(arr[i]);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (temp.type != attr->type) {
|
|
Packit |
ce73f7 |
p11_message ("returned attributes in invalid order");
|
|
Packit |
ce73f7 |
msg->parsed = offset;
|
|
Packit |
ce73f7 |
return PARSE_ERROR;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (temp.ulValueLen != ((CK_ULONG)-1)) {
|
|
Packit |
ce73f7 |
/* Just requesting the attribute size */
|
|
Packit |
ce73f7 |
if (!attr->pValue) {
|
|
Packit |
ce73f7 |
attr->ulValueLen = temp.ulValueLen;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Wants attribute data, but too small */
|
|
Packit |
ce73f7 |
} else if (attr->ulValueLen < temp.ulValueLen) {
|
|
Packit |
ce73f7 |
attr->ulValueLen = temp.ulValueLen;
|
|
Packit |
ce73f7 |
ret = CKR_BUFFER_TOO_SMALL;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Wants attribute data, enough space */
|
|
Packit |
ce73f7 |
} else {
|
|
Packit |
ce73f7 |
size_t offset2 = msg->parsed;
|
|
Packit |
ce73f7 |
if (!p11_rpc_buffer_get_attribute (msg->input, &offset2, attr)) {
|
|
Packit |
ce73f7 |
msg->parsed = offset2;
|
|
Packit |
ce73f7 |
return PARSE_ERROR;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
} else {
|
|
Packit |
ce73f7 |
attr->ulValueLen = temp.ulValueLen;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
msg->parsed = offset;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (p11_buffer_failed (msg->input))
|
|
Packit |
ce73f7 |
return PARSE_ERROR;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Read in the code that goes along with these attributes */
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_read_ulong (msg, &ret))
|
|
Packit |
ce73f7 |
return PARSE_ERROR;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
return ret;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
proto_read_byte_array (p11_rpc_message *msg,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR arr,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR len,
|
|
Packit |
ce73f7 |
CK_ULONG max)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
const unsigned char *val;
|
|
Packit |
ce73f7 |
unsigned char valid;
|
|
Packit |
ce73f7 |
uint32_t length;
|
|
Packit |
ce73f7 |
size_t vlen;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
assert (len != NULL);
|
|
Packit |
ce73f7 |
assert (msg != NULL);
|
|
Packit |
ce73f7 |
assert (msg->input != NULL);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Make sure this is in the right order */
|
|
Packit |
ce73f7 |
assert (!msg->signature || p11_rpc_message_verify_part (msg, "ay"));
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* A single byte which determines whether valid or not */
|
|
Packit |
ce73f7 |
if (!p11_rpc_buffer_get_byte (msg->input, &msg->parsed, &valid))
|
|
Packit |
ce73f7 |
return PARSE_ERROR;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* If not valid, then just the length is encoded, this can signify CKR_BUFFER_TOO_SMALL */
|
|
Packit |
ce73f7 |
if (!valid) {
|
|
Packit |
ce73f7 |
if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &length))
|
|
Packit |
ce73f7 |
return PARSE_ERROR;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
*len = length;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (arr)
|
|
Packit |
ce73f7 |
return CKR_BUFFER_TOO_SMALL;
|
|
Packit |
ce73f7 |
else
|
|
Packit |
ce73f7 |
return CKR_OK;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Get the actual bytes */
|
|
Packit |
ce73f7 |
if (!p11_rpc_buffer_get_byte_array (msg->input, &msg->parsed, &val, &vlen))
|
|
Packit |
ce73f7 |
return PARSE_ERROR;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
*len = vlen;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Just asking us for size */
|
|
Packit |
ce73f7 |
if (!arr)
|
|
Packit |
ce73f7 |
return CKR_OK;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (max < vlen)
|
|
Packit |
ce73f7 |
return CKR_BUFFER_TOO_SMALL;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Enough space, yay */
|
|
Packit |
ce73f7 |
memcpy (arr, val, vlen);
|
|
Packit |
ce73f7 |
return CKR_OK;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
proto_read_ulong_array (p11_rpc_message *msg, CK_ULONG_PTR arr,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR len, CK_ULONG max)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
uint32_t i, num;
|
|
Packit |
ce73f7 |
uint64_t val;
|
|
Packit |
ce73f7 |
unsigned char valid;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
assert (len != NULL);
|
|
Packit |
ce73f7 |
assert (msg != NULL);
|
|
Packit |
ce73f7 |
assert (msg->input != NULL);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Make sure this is in the right order */
|
|
Packit |
ce73f7 |
assert (!msg->signature || p11_rpc_message_verify_part (msg, "au"));
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* A single byte which determines whether valid or not */
|
|
Packit |
ce73f7 |
if (!p11_rpc_buffer_get_byte (msg->input, &msg->parsed, &valid))
|
|
Packit |
ce73f7 |
return PARSE_ERROR;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Get the number of items. */
|
|
Packit |
ce73f7 |
if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &num))
|
|
Packit |
ce73f7 |
return PARSE_ERROR;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
*len = num;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* If not valid, then just the length is encoded, this can signify CKR_BUFFER_TOO_SMALL */
|
|
Packit |
ce73f7 |
if (!valid) {
|
|
Packit |
ce73f7 |
if (arr)
|
|
Packit |
ce73f7 |
return CKR_BUFFER_TOO_SMALL;
|
|
Packit |
ce73f7 |
else
|
|
Packit |
ce73f7 |
return CKR_OK;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (max < num)
|
|
Packit |
ce73f7 |
return CKR_BUFFER_TOO_SMALL;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* We need to go ahead and read everything in all cases */
|
|
Packit |
ce73f7 |
for (i = 0; i < num; ++i) {
|
|
Packit Service |
068555 |
p11_rpc_buffer_get_uint64 (msg->input, &msg->parsed, &val;;
|
|
Packit |
ce73f7 |
if (arr)
|
|
Packit |
ce73f7 |
arr[i] = (CK_ULONG)val;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
return p11_buffer_failed (msg->input) ? PARSE_ERROR : CKR_OK;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static void
|
|
Packit |
ce73f7 |
mechanism_list_purge (CK_MECHANISM_TYPE_PTR mechs,
|
|
Packit |
ce73f7 |
CK_ULONG *n_mechs)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
int i;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
assert (mechs != NULL);
|
|
Packit |
ce73f7 |
assert (n_mechs != NULL);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
for (i = 0; i < (int)(*n_mechs); ++i) {
|
|
Packit |
ce73f7 |
if (!p11_rpc_mechanism_is_supported (mechs[i])) {
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Remove the mechanism from the list */
|
|
Packit |
ce73f7 |
memmove (&mechs[i], &mechs[i + 1],
|
|
Packit |
ce73f7 |
(*n_mechs - i) * sizeof (CK_MECHANISM_TYPE));
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
--(*n_mechs);
|
|
Packit |
ce73f7 |
--i;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
proto_write_mechanism (p11_rpc_message *msg,
|
|
Packit |
ce73f7 |
CK_MECHANISM_PTR mech)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
assert (msg != NULL);
|
|
Packit |
ce73f7 |
assert (mech != NULL);
|
|
Packit |
ce73f7 |
assert (msg->output != NULL);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Make sure this is in the right order */
|
|
Packit |
ce73f7 |
assert (!msg->signature || p11_rpc_message_verify_part (msg, "M"));
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (!p11_rpc_mechanism_is_supported (mech->mechanism))
|
|
Packit |
ce73f7 |
return CKR_MECHANISM_INVALID;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/*
|
|
Packit |
ce73f7 |
* PKCS#11 mechanism parameters are not easy to serialize. They're
|
|
Packit |
ce73f7 |
* completely different for so many mechanisms, they contain
|
|
Packit |
ce73f7 |
* pointers to arbitrary memory, and many callers don't initialize
|
|
Packit |
ce73f7 |
* them completely or properly.
|
|
Packit |
ce73f7 |
*
|
|
Packit |
ce73f7 |
* We only support certain mechanisms.
|
|
Packit |
ce73f7 |
*
|
|
Packit |
ce73f7 |
* Also callers do yucky things like leaving parts of the structure
|
|
Packit |
ce73f7 |
* pointing to garbage if they don't think it's going to be used.
|
|
Packit |
ce73f7 |
*/
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
p11_rpc_buffer_add_mechanism (msg->output, mech);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
return p11_buffer_failed (msg->output) ? CKR_HOST_MEMORY : CKR_OK;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
proto_read_info (p11_rpc_message *msg,
|
|
Packit |
ce73f7 |
CK_INFO_PTR info)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
assert (msg != NULL);
|
|
Packit |
ce73f7 |
assert (info != NULL);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_read_version (msg, &info->cryptokiVersion) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_space_string (msg, info->manufacturerID, 32) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->flags) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_space_string (msg, info->libraryDescription, 32) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_version (msg, &info->libraryVersion))
|
|
Packit |
ce73f7 |
return PARSE_ERROR;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
return CKR_OK;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
proto_read_slot_info (p11_rpc_message *msg,
|
|
Packit |
ce73f7 |
CK_SLOT_INFO_PTR info)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
assert (msg != NULL);
|
|
Packit |
ce73f7 |
assert (info != NULL);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_read_space_string (msg, info->slotDescription, 64) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_space_string (msg, info->manufacturerID, 32) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->flags) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_version (msg, &info->hardwareVersion) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_version (msg, &info->firmwareVersion))
|
|
Packit |
ce73f7 |
return PARSE_ERROR;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
return CKR_OK;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
proto_read_token_info (p11_rpc_message *msg,
|
|
Packit |
ce73f7 |
CK_TOKEN_INFO_PTR info)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
assert (msg != NULL);
|
|
Packit |
ce73f7 |
assert (info != NULL);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_read_space_string (msg, info->label, 32) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_space_string (msg, info->manufacturerID, 32) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_space_string (msg, info->model, 16) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_space_string (msg, info->serialNumber, 16) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->flags) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->ulMaxSessionCount) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->ulSessionCount) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->ulMaxRwSessionCount) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->ulRwSessionCount) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->ulMaxPinLen) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->ulMinPinLen) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->ulTotalPublicMemory) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->ulFreePublicMemory) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->ulTotalPrivateMemory) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->ulFreePrivateMemory) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_version (msg, &info->hardwareVersion) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_version (msg, &info->firmwareVersion) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_space_string (msg, info->utcTime, 16))
|
|
Packit |
ce73f7 |
return PARSE_ERROR;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
return CKR_OK;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
proto_read_mechanism_info (p11_rpc_message *msg,
|
|
Packit |
ce73f7 |
CK_MECHANISM_INFO_PTR info)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
assert (msg != NULL);
|
|
Packit |
ce73f7 |
assert (info != NULL);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_read_ulong (msg, &info->ulMinKeySize) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->ulMaxKeySize) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->flags))
|
|
Packit |
ce73f7 |
return PARSE_ERROR;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
return CKR_OK;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
proto_read_sesssion_info (p11_rpc_message *msg,
|
|
Packit |
ce73f7 |
CK_SESSION_INFO_PTR info)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
assert (msg != NULL);
|
|
Packit |
ce73f7 |
assert (info != NULL);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_read_ulong (msg, &info->slotID) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->state) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->flags) ||
|
|
Packit |
ce73f7 |
!p11_rpc_message_read_ulong (msg, &info->ulDeviceError))
|
|
Packit |
ce73f7 |
return PARSE_ERROR;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
return CKR_OK;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* -------------------------------------------------------------------
|
|
Packit |
ce73f7 |
* CALL MACROS
|
|
Packit |
ce73f7 |
*/
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define BEGIN_CALL_OR(call_id, self, if_no_daemon) \
|
|
Packit |
ce73f7 |
p11_debug (#call_id ": enter"); \
|
|
Packit |
ce73f7 |
{ \
|
|
Packit |
ce73f7 |
rpc_client *_mod = ((p11_virtual *)self)->lower_module; p11_rpc_message _msg; \
|
|
Packit |
ce73f7 |
CK_RV _ret = call_prepare (_mod, &_msg, P11_RPC_CALL_##call_id); \
|
|
Packit |
ce73f7 |
if (_ret == CKR_DEVICE_REMOVED) return (if_no_daemon); \
|
|
Packit |
ce73f7 |
if (_ret != CKR_OK) return _ret;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define PROCESS_CALL \
|
|
Packit |
ce73f7 |
_ret = call_run (_mod, &_msg); \
|
|
Packit |
ce73f7 |
if (_ret != CKR_OK) goto _cleanup;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define RETURN(ret) \
|
|
Packit |
ce73f7 |
_ret = ret; \
|
|
Packit |
ce73f7 |
goto _cleanup;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define END_CALL \
|
|
Packit |
ce73f7 |
_cleanup: \
|
|
Packit |
ce73f7 |
_ret = call_done (_mod, &_msg, _ret); \
|
|
Packit |
ce73f7 |
p11_debug ("ret: %lu", _ret); \
|
|
Packit |
ce73f7 |
return _ret; \
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define IN_BYTE(val) \
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_write_byte (&_msg, val)) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_HOST_MEMORY; goto _cleanup; }
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define IN_ULONG(val) \
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_write_ulong (&_msg, val)) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_HOST_MEMORY; goto _cleanup; }
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define IN_STRING(val) \
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_write_zero_string (&_msg, val)) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_HOST_MEMORY; goto _cleanup; }
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define IN_BYTE_BUFFER(arr, len) \
|
|
Packit |
ce73f7 |
if (len == NULL) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_ARGUMENTS_BAD; goto _cleanup; } \
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_write_byte_buffer (&_msg, arr ? *len : 0)) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_HOST_MEMORY; goto _cleanup; }
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define IN_BYTE_ARRAY(arr, len) \
|
|
Packit |
ce73f7 |
if (len != 0 && arr == NULL) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_ARGUMENTS_BAD; goto _cleanup; } \
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_write_byte_array (&_msg, arr, len)) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_HOST_MEMORY; goto _cleanup; }
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define IN_ULONG_BUFFER(arr, len) \
|
|
Packit |
ce73f7 |
if (len == NULL) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_ARGUMENTS_BAD; goto _cleanup; } \
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_write_ulong_buffer (&_msg, arr ? *len : 0)) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_HOST_MEMORY; goto _cleanup; }
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define IN_ULONG_ARRAY(arr, len) \
|
|
Packit |
ce73f7 |
if (len != 0 && arr == NULL) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_ARGUMENTS_BAD; goto _cleanup; }\
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_write_ulong_array (&_msg, arr, len)) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_HOST_MEMORY; goto _cleanup; }
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define IN_ATTRIBUTE_BUFFER(arr, num) \
|
|
Packit |
ce73f7 |
if (num != 0 && arr == NULL) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_ARGUMENTS_BAD; goto _cleanup; } \
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_write_attribute_buffer (&_msg, (arr), (num))) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_HOST_MEMORY; goto _cleanup; }
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define IN_ATTRIBUTE_ARRAY(arr, num) \
|
|
Packit |
ce73f7 |
if (num != 0 && arr == NULL) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_ARGUMENTS_BAD; goto _cleanup; } \
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_write_attribute_array (&_msg, (arr), (num))) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_HOST_MEMORY; goto _cleanup; }
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define IN_MECHANISM_TYPE(val) \
|
|
Packit |
ce73f7 |
if(!p11_rpc_mechanism_is_supported (val)) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_MECHANISM_INVALID; goto _cleanup; } \
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_write_ulong (&_msg, val)) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_HOST_MEMORY; goto _cleanup; }
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define IN_MECHANISM(val) \
|
|
Packit |
ce73f7 |
if (val == NULL) \
|
|
Packit |
ce73f7 |
{ _ret = CKR_ARGUMENTS_BAD; goto _cleanup; } \
|
|
Packit |
ce73f7 |
_ret = proto_write_mechanism (&_msg, val); \
|
|
Packit |
ce73f7 |
if (_ret != CKR_OK) goto _cleanup;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define OUT_ULONG(val) \
|
|
Packit |
ce73f7 |
if (val == NULL) \
|
|
Packit |
ce73f7 |
_ret = CKR_ARGUMENTS_BAD; \
|
|
Packit |
ce73f7 |
if (_ret == CKR_OK && !p11_rpc_message_read_ulong (&_msg, val)) \
|
|
Packit |
ce73f7 |
_ret = PARSE_ERROR;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define OUT_BYTE_ARRAY(arr, len) \
|
|
Packit |
ce73f7 |
if (len == NULL) \
|
|
Packit |
ce73f7 |
_ret = CKR_ARGUMENTS_BAD; \
|
|
Packit |
ce73f7 |
if (_ret == CKR_OK) \
|
|
Packit |
ce73f7 |
_ret = proto_read_byte_array (&_msg, (arr), (len), *(len));
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define OUT_ULONG_ARRAY(a, len) \
|
|
Packit |
ce73f7 |
if (len == NULL) \
|
|
Packit |
ce73f7 |
_ret = CKR_ARGUMENTS_BAD; \
|
|
Packit |
ce73f7 |
if (_ret == CKR_OK) \
|
|
Packit |
ce73f7 |
_ret = proto_read_ulong_array (&_msg, (a), (len), *(len));
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define OUT_ATTRIBUTE_ARRAY(arr, num) \
|
|
Packit |
ce73f7 |
if (_ret == CKR_OK) \
|
|
Packit |
ce73f7 |
_ret = proto_read_attribute_array (&_msg, (arr), (num));
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define OUT_INFO(info) \
|
|
Packit |
ce73f7 |
if (info == NULL) \
|
|
Packit |
ce73f7 |
_ret = CKR_ARGUMENTS_BAD; \
|
|
Packit |
ce73f7 |
if (_ret == CKR_OK) \
|
|
Packit |
ce73f7 |
_ret = proto_read_info (&_msg, info);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define OUT_SLOT_INFO(info) \
|
|
Packit |
ce73f7 |
if (info == NULL) \
|
|
Packit |
ce73f7 |
_ret = CKR_ARGUMENTS_BAD; \
|
|
Packit |
ce73f7 |
if (_ret == CKR_OK) \
|
|
Packit |
ce73f7 |
_ret = proto_read_slot_info (&_msg, info);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define OUT_TOKEN_INFO(info) \
|
|
Packit |
ce73f7 |
if (info == NULL) \
|
|
Packit |
ce73f7 |
_ret = CKR_ARGUMENTS_BAD; \
|
|
Packit |
ce73f7 |
if (_ret == CKR_OK) \
|
|
Packit |
ce73f7 |
_ret = proto_read_token_info (&_msg, info);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define OUT_SESSION_INFO(info) \
|
|
Packit |
ce73f7 |
if (info == NULL) \
|
|
Packit |
ce73f7 |
_ret = CKR_ARGUMENTS_BAD; \
|
|
Packit |
ce73f7 |
if (_ret == CKR_OK) \
|
|
Packit |
ce73f7 |
_ret = proto_read_sesssion_info (&_msg, info);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define OUT_MECHANISM_TYPE_ARRAY(arr, len) \
|
|
Packit |
ce73f7 |
if (len == NULL) \
|
|
Packit |
ce73f7 |
_ret = CKR_ARGUMENTS_BAD; \
|
|
Packit |
ce73f7 |
if (_ret == CKR_OK) \
|
|
Packit |
ce73f7 |
_ret = proto_read_ulong_array (&_msg, (arr), (len), *(len)); \
|
|
Packit |
ce73f7 |
if (_ret == CKR_OK && arr) \
|
|
Packit |
ce73f7 |
mechanism_list_purge (arr, len);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
#define OUT_MECHANISM_INFO(info) \
|
|
Packit |
ce73f7 |
if (info == NULL) \
|
|
Packit |
ce73f7 |
_ret = CKR_ARGUMENTS_BAD; \
|
|
Packit |
ce73f7 |
if (_ret == CKR_OK) \
|
|
Packit |
ce73f7 |
_ret = proto_read_mechanism_info (&_msg, info);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* -------------------------------------------------------------------
|
|
Packit |
ce73f7 |
* INITIALIZATION and 'GLOBAL' CALLS
|
|
Packit |
ce73f7 |
*/
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_Initialize (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_VOID_PTR init_args)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
rpc_client *module = ((p11_virtual *)self)->lower_module;
|
|
Packit |
ce73f7 |
CK_C_INITIALIZE_ARGS_PTR args = NULL;
|
|
Packit |
ce73f7 |
void *reserved = NULL;
|
|
Packit |
ce73f7 |
CK_RV ret = CKR_OK;
|
|
Packit |
ce73f7 |
p11_rpc_message msg;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
assert (module != NULL);
|
|
Packit |
ce73f7 |
p11_debug ("C_Initialize: enter");
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (init_args != NULL) {
|
|
Packit |
ce73f7 |
int supplied_ok;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/*
|
|
Packit |
ce73f7 |
* pReserved is either a string or NULL. Other cases
|
|
Packit |
ce73f7 |
* should be rejected by the caller of this function.
|
|
Packit |
ce73f7 |
*/
|
|
Packit |
ce73f7 |
args = init_args;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* ALL supplied function pointers need to have the value either NULL or non-NULL. */
|
|
Packit |
ce73f7 |
supplied_ok = (args->CreateMutex == NULL && args->DestroyMutex == NULL &&
|
|
Packit |
ce73f7 |
args->LockMutex == NULL && args->UnlockMutex == NULL) ||
|
|
Packit |
ce73f7 |
(args->CreateMutex != NULL && args->DestroyMutex != NULL &&
|
|
Packit |
ce73f7 |
args->LockMutex != NULL && args->UnlockMutex != NULL);
|
|
Packit |
ce73f7 |
if (!supplied_ok) {
|
|
Packit |
ce73f7 |
p11_message ("invalid set of mutex calls supplied");
|
|
Packit |
ce73f7 |
return CKR_ARGUMENTS_BAD;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/*
|
|
Packit |
ce73f7 |
* When the CKF_OS_LOCKING_OK flag isn't set return an error.
|
|
Packit |
ce73f7 |
* We must be able to use our mutex functionality.
|
|
Packit |
ce73f7 |
*/
|
|
Packit |
ce73f7 |
if (!(args->flags & CKF_OS_LOCKING_OK)) {
|
|
Packit |
ce73f7 |
p11_message ("can't do without os locking");
|
|
Packit |
ce73f7 |
return CKR_CANT_LOCK;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (args->pReserved)
|
|
Packit |
ce73f7 |
reserved = args->pReserved;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
p11_mutex_lock (&module->mutex);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (module->initialized_forkid != 0) {
|
|
Packit |
ce73f7 |
/* This process has called C_Initialize already */
|
|
Packit |
ce73f7 |
if (p11_forkid == module->initialized_forkid) {
|
|
Packit |
ce73f7 |
p11_message ("C_Initialize called twice for same process");
|
|
Packit |
ce73f7 |
ret = CKR_CRYPTOKI_ALREADY_INITIALIZED;
|
|
Packit |
ce73f7 |
goto done;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Call out to initialize client callback */
|
|
Packit |
ce73f7 |
assert (module->vtable->connect != NULL);
|
|
Packit |
ce73f7 |
ret = (module->vtable->connect) (module->vtable, reserved);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Successfully initialized */
|
|
Packit |
ce73f7 |
if (ret == CKR_OK) {
|
|
Packit |
ce73f7 |
module->initialized_forkid = p11_forkid;
|
|
Packit |
ce73f7 |
module->initialize_done = true;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* Server doesn't exist, initialize but don't call */
|
|
Packit |
ce73f7 |
} else if (ret == CKR_DEVICE_REMOVED) {
|
|
Packit |
ce73f7 |
module->initialized_forkid = p11_forkid;
|
|
Packit |
ce73f7 |
module->initialize_done = false;
|
|
Packit |
ce73f7 |
ret = CKR_OK;
|
|
Packit |
ce73f7 |
goto done;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
} else {
|
|
Packit |
ce73f7 |
goto done;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* If we don't have read and write fds now, then initialize other side */
|
|
Packit |
ce73f7 |
ret = call_prepare (module, &msg, P11_RPC_CALL_C_Initialize);
|
|
Packit |
ce73f7 |
if (ret == CKR_OK)
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_write_byte_array (&msg, P11_RPC_HANDSHAKE, P11_RPC_HANDSHAKE_LEN))
|
|
Packit |
ce73f7 |
ret = CKR_HOST_MEMORY;
|
|
Packit |
ce73f7 |
if (ret == CKR_OK) {
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_write_byte (&msg, reserved != NULL))
|
|
Packit |
ce73f7 |
ret = CKR_HOST_MEMORY;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
if (ret == CKR_OK) {
|
|
Packit |
ce73f7 |
char *reserved_string = "";
|
|
Packit |
ce73f7 |
if (reserved != NULL)
|
|
Packit |
ce73f7 |
reserved_string = (char *) reserved;
|
|
Packit |
ce73f7 |
if (!p11_rpc_message_write_byte_array (&msg, (CK_BYTE_PTR) reserved_string, strlen (reserved_string) + 1))
|
|
Packit |
ce73f7 |
ret = CKR_HOST_MEMORY;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
if (ret == CKR_OK)
|
|
Packit |
ce73f7 |
ret = call_run (module, &msg;;
|
|
Packit |
ce73f7 |
call_done (module, &msg, ret);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
done:
|
|
Packit |
ce73f7 |
/* If failed then unmark initialized */
|
|
Packit |
ce73f7 |
if (ret != CKR_OK && ret != CKR_CRYPTOKI_ALREADY_INITIALIZED)
|
|
Packit |
ce73f7 |
module->initialized_forkid = 0;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
/* If we told our caller that we're initialized, but not really, then finalize */
|
|
Packit |
ce73f7 |
if (ret != CKR_OK && module->initialize_done) {
|
|
Packit |
ce73f7 |
module->initialize_done = false;
|
|
Packit |
ce73f7 |
assert (module->vtable->disconnect != NULL);
|
|
Packit |
ce73f7 |
(module->vtable->disconnect) (module->vtable, reserved);
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
p11_mutex_unlock (&module->mutex);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
p11_debug ("C_Initialize: %lu", ret);
|
|
Packit |
ce73f7 |
return ret;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_Finalize (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_VOID_PTR reserved)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
rpc_client *module = ((p11_virtual *)self)->lower_module;
|
|
Packit |
ce73f7 |
CK_RV ret = CKR_OK;
|
|
Packit |
ce73f7 |
p11_rpc_message msg;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
p11_debug ("C_Finalize: enter");
|
|
Packit |
ce73f7 |
return_val_if_fail (module->initialized_forkid == p11_forkid, CKR_CRYPTOKI_NOT_INITIALIZED);
|
|
Packit |
ce73f7 |
return_val_if_fail (!reserved, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
p11_mutex_lock (&module->mutex);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
if (module->initialize_done) {
|
|
Packit |
ce73f7 |
ret = call_prepare (module, &msg, P11_RPC_CALL_C_Finalize);
|
|
Packit |
ce73f7 |
if (ret == CKR_OK)
|
|
Packit |
ce73f7 |
ret = call_run (module, &msg;;
|
|
Packit |
ce73f7 |
call_done (module, &msg, ret);
|
|
Packit |
ce73f7 |
if (ret != CKR_OK)
|
|
Packit |
ce73f7 |
p11_message ("finalizing rpc module returned an error: %lu", ret);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
module->initialize_done = false;
|
|
Packit |
ce73f7 |
assert (module->vtable->disconnect != NULL);
|
|
Packit |
ce73f7 |
(module->vtable->disconnect) (module->vtable, reserved);
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
module->initialized_forkid = 0;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
p11_mutex_unlock (&module->mutex);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
p11_debug ("C_Finalize: %lu", CKR_OK);
|
|
Packit |
ce73f7 |
return CKR_OK;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
fill_stand_in_info (CK_INFO_PTR info)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
static CK_INFO stand_in_info = {
|
|
Packit |
ce73f7 |
{ CRYPTOKI_VERSION_MAJOR, CRYPTOKI_VERSION_MINOR },
|
|
Packit |
ce73f7 |
"p11-kit ",
|
|
Packit |
ce73f7 |
0,
|
|
Packit |
ce73f7 |
"p11-kit (no connection) ",
|
|
Packit |
ce73f7 |
{ 1, 1 },
|
|
Packit |
ce73f7 |
};
|
|
Packit |
ce73f7 |
memcpy (info, &stand_in_info, sizeof (CK_INFO));
|
|
Packit |
ce73f7 |
return CKR_OK;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_GetInfo (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_INFO_PTR info)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (info, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_GetInfo, self, fill_stand_in_info (info));
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_INFO (info);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_GetSlotList (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_BBOOL token_present,
|
|
Packit |
ce73f7 |
CK_SLOT_ID_PTR slot_list,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR count)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (count, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_GetSlotList, self, (*count = 0, CKR_OK));
|
|
Packit |
ce73f7 |
IN_BYTE (token_present);
|
|
Packit |
ce73f7 |
IN_ULONG_BUFFER (slot_list, count);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_ULONG_ARRAY (slot_list, count);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_GetSlotInfo (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SLOT_ID slot_id,
|
|
Packit |
ce73f7 |
CK_SLOT_INFO_PTR info)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (info, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_GetSlotInfo, self, CKR_SLOT_ID_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (slot_id);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_SLOT_INFO (info);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_GetTokenInfo (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SLOT_ID slot_id,
|
|
Packit |
ce73f7 |
CK_TOKEN_INFO_PTR info)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (info, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_GetTokenInfo, self, CKR_SLOT_ID_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (slot_id);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_TOKEN_INFO (info);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_GetMechanismList (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SLOT_ID slot_id,
|
|
Packit |
ce73f7 |
CK_MECHANISM_TYPE_PTR mechanism_list,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR count)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (count, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_GetMechanismList, self, CKR_SLOT_ID_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (slot_id);
|
|
Packit |
ce73f7 |
IN_ULONG_BUFFER (mechanism_list, count);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_MECHANISM_TYPE_ARRAY (mechanism_list, count);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_GetMechanismInfo (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SLOT_ID slot_id,
|
|
Packit |
ce73f7 |
CK_MECHANISM_TYPE type,
|
|
Packit |
ce73f7 |
CK_MECHANISM_INFO_PTR info)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (info, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_GetMechanismInfo, self, CKR_SLOT_ID_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (slot_id);
|
|
Packit |
ce73f7 |
IN_MECHANISM_TYPE (type);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_MECHANISM_INFO (info);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_InitToken (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SLOT_ID slot_id,
|
|
Packit |
ce73f7 |
CK_UTF8CHAR_PTR pin, CK_ULONG pin_len,
|
|
Packit |
ce73f7 |
CK_UTF8CHAR_PTR label)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_InitToken, self, CKR_SLOT_ID_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (slot_id);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (pin, pin_len);
|
|
Packit |
ce73f7 |
IN_STRING (label);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_WaitForSlotEvent (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_FLAGS flags,
|
|
Packit |
ce73f7 |
CK_SLOT_ID_PTR slot,
|
|
Packit |
ce73f7 |
CK_VOID_PTR reserved)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (slot, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_WaitForSlotEvent, self, CKR_DEVICE_REMOVED);
|
|
Packit |
ce73f7 |
IN_ULONG (flags);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_ULONG (slot);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_OpenSession (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SLOT_ID slot_id,
|
|
Packit |
ce73f7 |
CK_FLAGS flags,
|
|
Packit |
ce73f7 |
CK_VOID_PTR user_data,
|
|
Packit |
ce73f7 |
CK_NOTIFY callback,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE_PTR session)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (session, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_OpenSession, self, CKR_SLOT_ID_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (slot_id);
|
|
Packit |
ce73f7 |
IN_ULONG (flags);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_ULONG (session);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_CloseSession (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_CloseSession, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_CloseAllSessions (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SLOT_ID slot_id)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_CloseAllSessions, self, CKR_SLOT_ID_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (slot_id);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_GetSessionInfo (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_SESSION_INFO_PTR info)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (info, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_GetSessionInfo, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_SESSION_INFO (info);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_InitPIN (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_UTF8CHAR_PTR pin,
|
|
Packit |
ce73f7 |
CK_ULONG pin_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_InitPIN, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (pin, pin_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_SetPIN (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_UTF8CHAR_PTR old_pin,
|
|
Packit |
ce73f7 |
CK_ULONG old_pin_len,
|
|
Packit |
ce73f7 |
CK_UTF8CHAR_PTR new_pin,
|
|
Packit |
ce73f7 |
CK_ULONG new_pin_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_SetPIN, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (old_pin, old_pin_len);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (new_pin, new_pin_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_GetOperationState (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR operation_state,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR operation_state_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (operation_state_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_GetOperationState, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (operation_state, operation_state_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (operation_state, operation_state_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_SetOperationState (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR operation_state,
|
|
Packit |
ce73f7 |
CK_ULONG operation_state_len,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE encryption_key,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE authentication_key)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_SetOperationState, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (operation_state, operation_state_len);
|
|
Packit |
ce73f7 |
IN_ULONG (encryption_key);
|
|
Packit |
ce73f7 |
IN_ULONG (authentication_key);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_Login (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_USER_TYPE user_type,
|
|
Packit |
ce73f7 |
CK_UTF8CHAR_PTR pin,
|
|
Packit |
ce73f7 |
CK_ULONG pin_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_Login, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_ULONG (user_type);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (pin, pin_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_Logout (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_Logout, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_CreateObject (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_ATTRIBUTE_PTR template,
|
|
Packit |
ce73f7 |
CK_ULONG count,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE_PTR new_object)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (new_object, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_CreateObject, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_ATTRIBUTE_ARRAY (template, count);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_ULONG (new_object);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_CopyObject (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE object,
|
|
Packit |
ce73f7 |
CK_ATTRIBUTE_PTR template,
|
|
Packit |
ce73f7 |
CK_ULONG count,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE_PTR new_object)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (new_object, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_CopyObject, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_ULONG (object);
|
|
Packit |
ce73f7 |
IN_ATTRIBUTE_ARRAY (template, count);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_ULONG (new_object);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_DestroyObject (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE object)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_DestroyObject, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_ULONG (object);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_GetObjectSize (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE object,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR size)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (size, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_GetObjectSize, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_ULONG (object);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_ULONG (size);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_GetAttributeValue (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE object,
|
|
Packit |
ce73f7 |
CK_ATTRIBUTE_PTR template,
|
|
Packit |
ce73f7 |
CK_ULONG count)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_GetAttributeValue, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_ULONG (object);
|
|
Packit |
ce73f7 |
IN_ATTRIBUTE_BUFFER (template, count);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_ATTRIBUTE_ARRAY (template, count);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_SetAttributeValue (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE object,
|
|
Packit |
ce73f7 |
CK_ATTRIBUTE_PTR template,
|
|
Packit |
ce73f7 |
CK_ULONG count)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_SetAttributeValue, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_ULONG (object);
|
|
Packit |
ce73f7 |
IN_ATTRIBUTE_ARRAY (template, count);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_FindObjectsInit (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_ATTRIBUTE_PTR template,
|
|
Packit |
ce73f7 |
CK_ULONG count)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_FindObjectsInit, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_ATTRIBUTE_ARRAY (template, count);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_FindObjects (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE_PTR objects,
|
|
Packit |
ce73f7 |
CK_ULONG max_count,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR count)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
/* HACK: To fix a stupid gcc warning */
|
|
Packit |
ce73f7 |
CK_ULONG_PTR address_of_max_count = &max_count;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
return_val_if_fail (count, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_FindObjects, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_ULONG_BUFFER (objects, address_of_max_count);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
*count = max_count;
|
|
Packit |
ce73f7 |
OUT_ULONG_ARRAY (objects, count);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_FindObjectsFinal (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_FindObjectsFinal, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_EncryptInit (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_MECHANISM_PTR mechanism,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE key)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_EncryptInit, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_MECHANISM (mechanism);
|
|
Packit |
ce73f7 |
IN_ULONG (key);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_Encrypt (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR data,
|
|
Packit |
ce73f7 |
CK_ULONG data_len,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR encrypted_data,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR encrypted_data_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (encrypted_data_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_Encrypt, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (data, data_len);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (encrypted_data, encrypted_data_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (encrypted_data, encrypted_data_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_EncryptUpdate (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR part,
|
|
Packit |
ce73f7 |
CK_ULONG part_len,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR encrypted_part,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR encrypted_part_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (encrypted_part_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_EncryptUpdate, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (part, part_len);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (encrypted_part, encrypted_part_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (encrypted_part, encrypted_part_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_EncryptFinal (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR last_part,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR last_part_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (last_part_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_EncryptFinal, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (last_part, last_part_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (last_part, last_part_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_DecryptInit (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_MECHANISM_PTR mechanism,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE key)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_DecryptInit, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_MECHANISM (mechanism);
|
|
Packit |
ce73f7 |
IN_ULONG (key);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_Decrypt (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR enc_data,
|
|
Packit |
ce73f7 |
CK_ULONG enc_data_len,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR data,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR data_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (data_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_Decrypt, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (enc_data, enc_data_len);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (data, data_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (data, data_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_DecryptUpdate (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR enc_part,
|
|
Packit |
ce73f7 |
CK_ULONG enc_part_len,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR part,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR part_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (part_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_DecryptUpdate, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (enc_part, enc_part_len);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (part, part_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (part, part_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_DecryptFinal (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR last_part,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR last_part_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (last_part_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_DecryptFinal, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (last_part, last_part_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (last_part, last_part_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_DigestInit (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_MECHANISM_PTR mechanism)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_DigestInit, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_MECHANISM (mechanism);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_Digest (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR data,
|
|
Packit |
ce73f7 |
CK_ULONG data_len,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR digest,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR digest_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (digest_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_Digest, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (data, data_len);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (digest, digest_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (digest, digest_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_DigestUpdate (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR part,
|
|
Packit |
ce73f7 |
CK_ULONG part_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_DigestUpdate, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (part, part_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_DigestKey (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE key)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_DigestKey, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_ULONG (key);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_DigestFinal (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR digest,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR digest_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (digest_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_DigestFinal, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (digest, digest_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (digest, digest_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_SignInit (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_MECHANISM_PTR mechanism,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE key)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_SignInit, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_MECHANISM (mechanism);
|
|
Packit |
ce73f7 |
IN_ULONG (key);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_Sign (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR data,
|
|
Packit |
ce73f7 |
CK_ULONG data_len,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR signature,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR signature_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (signature_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_Sign, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (data, data_len);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (signature, signature_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (signature, signature_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_SignUpdate (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR part,
|
|
Packit |
ce73f7 |
CK_ULONG part_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (part_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_SignUpdate, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (part, part_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_SignFinal (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR signature,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR signature_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (signature_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_SignFinal, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (signature, signature_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (signature, signature_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_SignRecoverInit (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_MECHANISM_PTR mechanism,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE key)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_SignRecoverInit, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_MECHANISM (mechanism);
|
|
Packit |
ce73f7 |
IN_ULONG (key);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_SignRecover (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR data,
|
|
Packit |
ce73f7 |
CK_ULONG data_len,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR signature, CK_ULONG_PTR signature_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (signature_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_SignRecover, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (data, data_len);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (signature, signature_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (signature, signature_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_VerifyInit (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_MECHANISM_PTR mechanism,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE key)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_VerifyInit, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_MECHANISM (mechanism);
|
|
Packit |
ce73f7 |
IN_ULONG (key);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_Verify (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR data,
|
|
Packit |
ce73f7 |
CK_ULONG data_len,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR signature,
|
|
Packit |
ce73f7 |
CK_ULONG signature_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_Verify, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (data, data_len);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (signature, signature_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_VerifyUpdate (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR part,
|
|
Packit |
ce73f7 |
CK_ULONG part_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_VerifyUpdate, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (part, part_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_VerifyFinal (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR signature,
|
|
Packit |
ce73f7 |
CK_ULONG signature_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_VerifyFinal, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (signature, signature_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_VerifyRecoverInit (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_MECHANISM_PTR mechanism,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE key)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_VerifyRecoverInit, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_MECHANISM (mechanism);
|
|
Packit |
ce73f7 |
IN_ULONG (key);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_VerifyRecover (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR signature,
|
|
Packit |
ce73f7 |
CK_ULONG signature_len,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR data,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR data_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (data_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_VerifyRecover, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (signature, signature_len);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (data, data_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (data, data_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_DigestEncryptUpdate (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR part,
|
|
Packit |
ce73f7 |
CK_ULONG part_len,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR enc_part,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR enc_part_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (enc_part_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_DigestEncryptUpdate, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (part, part_len);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (enc_part, enc_part_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (enc_part, enc_part_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_DecryptDigestUpdate (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR enc_part,
|
|
Packit |
ce73f7 |
CK_ULONG enc_part_len,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR part,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR part_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (part_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_DecryptDigestUpdate, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (enc_part, enc_part_len);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (part, part_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (part, part_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_SignEncryptUpdate (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR part,
|
|
Packit |
ce73f7 |
CK_ULONG part_len,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR enc_part,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR enc_part_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (enc_part_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_SignEncryptUpdate, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (part, part_len);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (enc_part, enc_part_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (enc_part, enc_part_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_DecryptVerifyUpdate (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR enc_part,
|
|
Packit |
ce73f7 |
CK_ULONG enc_part_len,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR part,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR part_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (part_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_DecryptVerifyUpdate, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (enc_part, enc_part_len);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (part, part_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (part, part_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_GenerateKey (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_MECHANISM_PTR mechanism,
|
|
Packit |
ce73f7 |
CK_ATTRIBUTE_PTR template,
|
|
Packit |
ce73f7 |
CK_ULONG count,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE_PTR key)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_GenerateKey, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_MECHANISM (mechanism);
|
|
Packit |
ce73f7 |
IN_ATTRIBUTE_ARRAY (template, count);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_ULONG (key);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_GenerateKeyPair (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_MECHANISM_PTR mechanism,
|
|
Packit |
ce73f7 |
CK_ATTRIBUTE_PTR pub_template,
|
|
Packit |
ce73f7 |
CK_ULONG pub_count,
|
|
Packit |
ce73f7 |
CK_ATTRIBUTE_PTR priv_template,
|
|
Packit |
ce73f7 |
CK_ULONG priv_count,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE_PTR pub_key,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE_PTR priv_key)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_GenerateKeyPair, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_MECHANISM (mechanism);
|
|
Packit |
ce73f7 |
IN_ATTRIBUTE_ARRAY (pub_template, pub_count);
|
|
Packit |
ce73f7 |
IN_ATTRIBUTE_ARRAY (priv_template, priv_count);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_ULONG (pub_key);
|
|
Packit |
ce73f7 |
OUT_ULONG (priv_key);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_WrapKey (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_MECHANISM_PTR mechanism,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE wrapping_key,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE key,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR wrapped_key,
|
|
Packit |
ce73f7 |
CK_ULONG_PTR wrapped_key_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
return_val_if_fail (wrapped_key_len, CKR_ARGUMENTS_BAD);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_WrapKey, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_MECHANISM (mechanism);
|
|
Packit |
ce73f7 |
IN_ULONG (wrapping_key);
|
|
Packit |
ce73f7 |
IN_ULONG (key);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (wrapped_key, wrapped_key_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (wrapped_key, wrapped_key_len);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_UnwrapKey (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_MECHANISM_PTR mechanism,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE unwrapping_key,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR wrapped_key,
|
|
Packit |
ce73f7 |
CK_ULONG wrapped_key_len,
|
|
Packit |
ce73f7 |
CK_ATTRIBUTE_PTR template,
|
|
Packit |
ce73f7 |
CK_ULONG count,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE_PTR key)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_UnwrapKey, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_MECHANISM (mechanism);
|
|
Packit |
ce73f7 |
IN_ULONG (unwrapping_key);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (wrapped_key, wrapped_key_len);
|
|
Packit |
ce73f7 |
IN_ATTRIBUTE_ARRAY (template, count);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_ULONG (key);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_DeriveKey (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_MECHANISM_PTR mechanism,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE base_key,
|
|
Packit |
ce73f7 |
CK_ATTRIBUTE_PTR template,
|
|
Packit |
ce73f7 |
CK_ULONG count,
|
|
Packit |
ce73f7 |
CK_OBJECT_HANDLE_PTR key)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_DeriveKey, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_MECHANISM (mechanism);
|
|
Packit |
ce73f7 |
IN_ULONG (base_key);
|
|
Packit |
ce73f7 |
IN_ATTRIBUTE_ARRAY (template, count);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_ULONG (key);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_SeedRandom (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR seed,
|
|
Packit |
ce73f7 |
CK_ULONG seed_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_SeedRandom, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_ARRAY (seed, seed_len);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_RV
|
|
Packit |
ce73f7 |
rpc_C_GenerateRandom (CK_X_FUNCTION_LIST *self,
|
|
Packit |
ce73f7 |
CK_SESSION_HANDLE session,
|
|
Packit |
ce73f7 |
CK_BYTE_PTR random_data,
|
|
Packit |
ce73f7 |
CK_ULONG random_len)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
CK_ULONG_PTR address = &random_len;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
BEGIN_CALL_OR (C_GenerateRandom, self, CKR_SESSION_HANDLE_INVALID);
|
|
Packit |
ce73f7 |
IN_ULONG (session);
|
|
Packit |
ce73f7 |
IN_BYTE_BUFFER (random_data, address);
|
|
Packit |
ce73f7 |
PROCESS_CALL;
|
|
Packit |
ce73f7 |
OUT_BYTE_ARRAY (random_data, address);
|
|
Packit |
ce73f7 |
END_CALL;
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static CK_X_FUNCTION_LIST rpc_functions = {
|
|
Packit |
ce73f7 |
{ -1, -1 },
|
|
Packit |
ce73f7 |
rpc_C_Initialize,
|
|
Packit |
ce73f7 |
rpc_C_Finalize,
|
|
Packit |
ce73f7 |
rpc_C_GetInfo,
|
|
Packit |
ce73f7 |
rpc_C_GetSlotList,
|
|
Packit |
ce73f7 |
rpc_C_GetSlotInfo,
|
|
Packit |
ce73f7 |
rpc_C_GetTokenInfo,
|
|
Packit |
ce73f7 |
rpc_C_GetMechanismList,
|
|
Packit |
ce73f7 |
rpc_C_GetMechanismInfo,
|
|
Packit |
ce73f7 |
rpc_C_InitToken,
|
|
Packit |
ce73f7 |
rpc_C_InitPIN,
|
|
Packit |
ce73f7 |
rpc_C_SetPIN,
|
|
Packit |
ce73f7 |
rpc_C_OpenSession,
|
|
Packit |
ce73f7 |
rpc_C_CloseSession,
|
|
Packit |
ce73f7 |
rpc_C_CloseAllSessions,
|
|
Packit |
ce73f7 |
rpc_C_GetSessionInfo,
|
|
Packit |
ce73f7 |
rpc_C_GetOperationState,
|
|
Packit |
ce73f7 |
rpc_C_SetOperationState,
|
|
Packit |
ce73f7 |
rpc_C_Login,
|
|
Packit |
ce73f7 |
rpc_C_Logout,
|
|
Packit |
ce73f7 |
rpc_C_CreateObject,
|
|
Packit |
ce73f7 |
rpc_C_CopyObject,
|
|
Packit |
ce73f7 |
rpc_C_DestroyObject,
|
|
Packit |
ce73f7 |
rpc_C_GetObjectSize,
|
|
Packit |
ce73f7 |
rpc_C_GetAttributeValue,
|
|
Packit |
ce73f7 |
rpc_C_SetAttributeValue,
|
|
Packit |
ce73f7 |
rpc_C_FindObjectsInit,
|
|
Packit |
ce73f7 |
rpc_C_FindObjects,
|
|
Packit |
ce73f7 |
rpc_C_FindObjectsFinal,
|
|
Packit |
ce73f7 |
rpc_C_EncryptInit,
|
|
Packit |
ce73f7 |
rpc_C_Encrypt,
|
|
Packit |
ce73f7 |
rpc_C_EncryptUpdate,
|
|
Packit |
ce73f7 |
rpc_C_EncryptFinal,
|
|
Packit |
ce73f7 |
rpc_C_DecryptInit,
|
|
Packit |
ce73f7 |
rpc_C_Decrypt,
|
|
Packit |
ce73f7 |
rpc_C_DecryptUpdate,
|
|
Packit |
ce73f7 |
rpc_C_DecryptFinal,
|
|
Packit |
ce73f7 |
rpc_C_DigestInit,
|
|
Packit |
ce73f7 |
rpc_C_Digest,
|
|
Packit |
ce73f7 |
rpc_C_DigestUpdate,
|
|
Packit |
ce73f7 |
rpc_C_DigestKey,
|
|
Packit |
ce73f7 |
rpc_C_DigestFinal,
|
|
Packit |
ce73f7 |
rpc_C_SignInit,
|
|
Packit |
ce73f7 |
rpc_C_Sign,
|
|
Packit |
ce73f7 |
rpc_C_SignUpdate,
|
|
Packit |
ce73f7 |
rpc_C_SignFinal,
|
|
Packit |
ce73f7 |
rpc_C_SignRecoverInit,
|
|
Packit |
ce73f7 |
rpc_C_SignRecover,
|
|
Packit |
ce73f7 |
rpc_C_VerifyInit,
|
|
Packit |
ce73f7 |
rpc_C_Verify,
|
|
Packit |
ce73f7 |
rpc_C_VerifyUpdate,
|
|
Packit |
ce73f7 |
rpc_C_VerifyFinal,
|
|
Packit |
ce73f7 |
rpc_C_VerifyRecoverInit,
|
|
Packit |
ce73f7 |
rpc_C_VerifyRecover,
|
|
Packit |
ce73f7 |
rpc_C_DigestEncryptUpdate,
|
|
Packit |
ce73f7 |
rpc_C_DecryptDigestUpdate,
|
|
Packit |
ce73f7 |
rpc_C_SignEncryptUpdate,
|
|
Packit |
ce73f7 |
rpc_C_DecryptVerifyUpdate,
|
|
Packit |
ce73f7 |
rpc_C_GenerateKey,
|
|
Packit |
ce73f7 |
rpc_C_GenerateKeyPair,
|
|
Packit |
ce73f7 |
rpc_C_WrapKey,
|
|
Packit |
ce73f7 |
rpc_C_UnwrapKey,
|
|
Packit |
ce73f7 |
rpc_C_DeriveKey,
|
|
Packit |
ce73f7 |
rpc_C_SeedRandom,
|
|
Packit |
ce73f7 |
rpc_C_GenerateRandom,
|
|
Packit |
ce73f7 |
rpc_C_WaitForSlotEvent,
|
|
Packit |
ce73f7 |
};
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
static void
|
|
Packit |
ce73f7 |
rpc_client_free (void *data)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
rpc_client *client = data;
|
|
Packit |
ce73f7 |
p11_mutex_uninit (&client->mutex);
|
|
Packit |
ce73f7 |
free (client);
|
|
Packit |
ce73f7 |
}
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
bool
|
|
Packit |
ce73f7 |
p11_rpc_client_init (p11_virtual *virt,
|
|
Packit |
ce73f7 |
p11_rpc_client_vtable *vtable)
|
|
Packit |
ce73f7 |
{
|
|
Packit |
ce73f7 |
rpc_client *client;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
p11_message_clear ();
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
return_val_if_fail (vtable != NULL, false);
|
|
Packit |
ce73f7 |
return_val_if_fail (vtable->connect != NULL, false);
|
|
Packit |
ce73f7 |
return_val_if_fail (vtable->transport != NULL, false);
|
|
Packit |
ce73f7 |
return_val_if_fail (vtable->disconnect != NULL, false);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
P11_RPC_CHECK_CALLS ();
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
client = calloc (1, sizeof (rpc_client));
|
|
Packit |
ce73f7 |
return_val_if_fail (client != NULL, false);
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
p11_mutex_init (&client->mutex);
|
|
Packit |
ce73f7 |
client->vtable = vtable;
|
|
Packit |
ce73f7 |
|
|
Packit |
ce73f7 |
p11_virtual_init (virt, &rpc_functions, client, rpc_client_free);
|
|
Packit |
ce73f7 |
return true;
|
|
Packit |
ce73f7 |
}
|