Blame p11-kit/test-rpc.c

Packit Service 3749ba
/*
Packit Service 3749ba
 * Copyright (c) 2012 Stefan Walter
Packit Service 3749ba
 * Copyright (C) 2012-2017 Red Hat Inc.
Packit Service 3749ba
 *
Packit Service 3749ba
 * Redistribution and use in source and binary forms, with or without
Packit Service 3749ba
 * modification, are permitted provided that the following conditions
Packit Service 3749ba
 * are met:
Packit Service 3749ba
 *
Packit Service 3749ba
 *     * Redistributions of source code must retain the above
Packit Service 3749ba
 *       copyright notice, this list of conditions and the
Packit Service 3749ba
 *       following disclaimer.
Packit Service 3749ba
 *     * Redistributions in binary form must reproduce the
Packit Service 3749ba
 *       above copyright notice, this list of conditions and
Packit Service 3749ba
 *       the following disclaimer in the documentation and/or
Packit Service 3749ba
 *       other materials provided with the distribution.
Packit Service 3749ba
 *     * The names of contributors to this software may not be
Packit Service 3749ba
 *       used to endorse or promote products derived from this
Packit Service 3749ba
 *       software without specific prior written permission.
Packit Service 3749ba
 *
Packit Service 3749ba
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 3749ba
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 3749ba
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
Packit Service 3749ba
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
Packit Service 3749ba
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
Packit Service 3749ba
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
Packit Service 3749ba
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
Packit Service 3749ba
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
Packit Service 3749ba
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Packit Service 3749ba
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
Packit Service 3749ba
 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
Packit Service 3749ba
 * DAMAGE.
Packit Service 3749ba
 *
Packit Service 3749ba
 * Author: Stef Walter <stef@thewalter.net>
Packit Service 3749ba
 */
Packit Service 3749ba
Packit Service 3749ba
#include "config.h"
Packit Service 3749ba
#include "test.h"
Packit Service 3749ba
Packit Service 3749ba
#include "debug.h"
Packit Service 3749ba
#include "library.h"
Packit Service 3749ba
#include "message.h"
Packit Service 3749ba
#include "mock.h"
Packit Service 3749ba
#include "p11-kit.h"
Packit Service 3749ba
#include "private.h"
Packit Service 3749ba
#include "rpc.h"
Packit Service 3749ba
#include "rpc-message.h"
Packit Service 3749ba
#include "virtual.h"
Packit Service 3749ba
Packit Service 3749ba
#include <sys/types.h>
Packit Service 3749ba
#ifdef OS_UNIX
Packit Service 3749ba
#include <sys/wait.h>
Packit Service 3749ba
#endif
Packit Service 3749ba
#include <assert.h>
Packit Service 3749ba
#include <limits.h>
Packit Service 3749ba
#include <string.h>
Packit Service 3749ba
#include <stdio.h>
Packit Service 3749ba
#include <stdlib.h>
Packit Service 3749ba
Packit Service 3749ba
#define ELEMS(x) (sizeof (x) / sizeof (x[0]))
Packit Service 3749ba
Packit Service 3749ba
#if SIZEOF_UNSIGNED_LONG == 8
Packit Service 3749ba
#define ULONG_VAL 0x0123456708ABCDEF
Packit Service 3749ba
#elif SIZEOF_UNSIGNED_LONG == 4
Packit Service 3749ba
#define ULONG_VAL 0x01234567
Packit Service 3749ba
#else
Packit Service 3749ba
#error "unsupported size of CK_ULONG"
Packit Service 3749ba
#endif
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_new_free (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer *buf;
Packit Service 3749ba
Packit Service 3749ba
	buf = p11_rpc_buffer_new (0);
Packit Service 3749ba
Packit Service 3749ba
	assert_ptr_not_null (buf->data);
Packit Service 3749ba
	assert_num_eq (0, buf->len);
Packit Service 3749ba
	assert_num_eq (0, buf->flags);
Packit Service 3749ba
	assert (buf->size == 0);
Packit Service 3749ba
	assert_ptr_not_null (buf->ffree);
Packit Service 3749ba
	assert_ptr_not_null (buf->frealloc);
Packit Service 3749ba
Packit Service 3749ba
	p11_rpc_buffer_free (buf);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_uint16 (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer buffer;
Packit Service 3749ba
	uint16_t val = UINT16_MAX;
Packit Service 3749ba
	size_t next;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_init (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	next = 0;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_uint16 (&buffer, &next, &val;;
Packit Service 3749ba
	assert_num_eq (false, ret);
Packit Service 3749ba
	assert_num_eq (0, next);
Packit Service 3749ba
	assert_num_eq (UINT16_MAX, val);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_reset (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	ret = p11_rpc_buffer_set_uint16 (&buffer, 0, 0x6789);
Packit Service 3749ba
	assert_num_eq (false, ret);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_reset (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_add (&buffer, (unsigned char *)"padding", 7);
Packit Service 3749ba
Packit Service 3749ba
	p11_rpc_buffer_add_uint16 (&buffer, 0x6789);
Packit Service 3749ba
	assert_num_eq (9, buffer.len);
Packit Service 3749ba
	assert (!p11_buffer_failed (&buffer));
Packit Service 3749ba
Packit Service 3749ba
	next = 7;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_uint16 (&buffer, &next, &val;;
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
	assert_num_eq (9, next);
Packit Service 3749ba
	assert_num_eq (0x6789, val);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_uninit (&buffer);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_uint16_static (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer buf = { (unsigned char *)"pad0\x67\x89", 6, };
Packit Service 3749ba
	uint16_t val = UINT16_MAX;
Packit Service 3749ba
	size_t next;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	next = 4;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_uint16 (&buf, &next, &val;;
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
	assert_num_eq (6, next);
Packit Service 3749ba
	assert_num_eq (0x6789, val);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_uint32 (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer buffer;
Packit Service 3749ba
	uint32_t val = UINT32_MAX;
Packit Service 3749ba
	size_t next;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_init (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	next = 0;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_uint32 (&buffer, &next, &val;;
Packit Service 3749ba
	assert_num_eq (false, ret);
Packit Service 3749ba
	assert_num_eq (0, next);
Packit Service 3749ba
	assert_num_eq (UINT32_MAX, val);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_reset (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	ret = p11_rpc_buffer_set_uint32 (&buffer, 0, 0x12345678);
Packit Service 3749ba
	assert_num_eq (false, ret);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_reset (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_add (&buffer, (unsigned char *)"padding", 7);
Packit Service 3749ba
Packit Service 3749ba
	p11_rpc_buffer_add_uint32 (&buffer, 0x12345678);
Packit Service 3749ba
	assert_num_eq (11, buffer.len);
Packit Service 3749ba
	assert (!p11_buffer_failed (&buffer));
Packit Service 3749ba
Packit Service 3749ba
	next = 7;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_uint32 (&buffer, &next, &val;;
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
	assert_num_eq (11, next);
Packit Service 3749ba
	assert_num_eq (0x12345678, val);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_uninit (&buffer);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_uint32_static (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer buf = { (unsigned char *)"pad0\x23\x45\x67\x89", 8, };
Packit Service 3749ba
	uint32_t val = UINT32_MAX;
Packit Service 3749ba
	size_t next;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	next = 4;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_uint32 (&buf, &next, &val;;
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
	assert_num_eq (8, next);
Packit Service 3749ba
	assert_num_eq (0x23456789, val);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_uint64 (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer buffer;
Packit Service 3749ba
	uint64_t val = UINT64_MAX;
Packit Service 3749ba
	size_t next;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_init (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	next = 0;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_uint64 (&buffer, &next, &val;;
Packit Service 3749ba
	assert_num_eq (0, ret);
Packit Service 3749ba
	assert_num_eq (0, next);
Packit Service 3749ba
	assert (UINT64_MAX == val);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_reset (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_add (&buffer, (unsigned char *)"padding", 7);
Packit Service 3749ba
Packit Service 3749ba
	p11_rpc_buffer_add_uint64 (&buffer, 0x0123456708ABCDEFull);
Packit Service 3749ba
	assert_num_eq (15, buffer.len);
Packit Service 3749ba
	assert (!p11_buffer_failed (&buffer));
Packit Service 3749ba
Packit Service 3749ba
	next = 7;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_uint64 (&buffer, &next, &val;;
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
	assert_num_eq (15, next);
Packit Service 3749ba
	assert (0x0123456708ABCDEFull == val);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_uninit (&buffer);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_uint64_static (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer buf = { (unsigned char *)"pad0\x89\x67\x45\x23\x11\x22\x33\x44", 12, };
Packit Service 3749ba
	uint64_t val = UINT64_MAX;
Packit Service 3749ba
	size_t next;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	next = 4;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_uint64 (&buf, &next, &val;;
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
	assert_num_eq (12, next);
Packit Service 3749ba
	assert (0x8967452311223344ull == val);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_byte_array (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer buffer;
Packit Service 3749ba
	unsigned char bytes[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
Packit Service 3749ba
	                          0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
Packit Service 3749ba
	                          0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
Packit Service 3749ba
	                          0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F };
Packit Service 3749ba
Packit Service 3749ba
	const unsigned char *val;
Packit Service 3749ba
	size_t length = ~0;
Packit Service 3749ba
	size_t next;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_init (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	/* Invalid read */
Packit Service 3749ba
Packit Service 3749ba
	next = 0;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_byte_array (&buffer, &next, &val, &length);
Packit Service 3749ba
	assert_num_eq (false, ret);
Packit Service 3749ba
	assert_num_eq (0, next);
Packit Service 3749ba
	assert_num_eq (~0, length);
Packit Service 3749ba
Packit Service 3749ba
	/* Test full array */
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_reset (&buffer, 0);
Packit Service 3749ba
	p11_buffer_add (&buffer, (unsigned char *)"padding", 7);
Packit Service 3749ba
Packit Service 3749ba
	p11_rpc_buffer_add_byte_array (&buffer, bytes, 32);
Packit Service 3749ba
	assert_num_eq (43, buffer.len);
Packit Service 3749ba
	assert (!p11_buffer_failed (&buffer));
Packit Service 3749ba
Packit Service 3749ba
	next = 7;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_byte_array (&buffer, &next, &val, &length);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
	assert_num_eq (43, next);
Packit Service 3749ba
	assert_num_eq (32, length);
Packit Service 3749ba
	assert (memcmp (val, bytes, 32) == 0);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_uninit (&buffer);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_byte_array_null (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer buffer;
Packit Service 3749ba
	const unsigned char *val;
Packit Service 3749ba
	size_t length = ~0;
Packit Service 3749ba
	size_t next;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_init (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_reset (&buffer, 0);
Packit Service 3749ba
	p11_buffer_add (&buffer, (unsigned char *)"padding", 7);
Packit Service 3749ba
Packit Service 3749ba
	p11_rpc_buffer_add_byte_array (&buffer, NULL, 0);
Packit Service 3749ba
	assert_num_eq (11, buffer.len);
Packit Service 3749ba
	assert (!p11_buffer_failed (&buffer));
Packit Service 3749ba
Packit Service 3749ba
	next = 7;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_byte_array (&buffer, &next, &val, &length);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
	assert_num_eq (11, next);
Packit Service 3749ba
	assert_num_eq (0, length);
Packit Service 3749ba
	assert_ptr_eq (NULL, (void*)val);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_uninit (&buffer);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_byte_array_too_long (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer buffer;
Packit Service 3749ba
	const unsigned char *val = NULL;
Packit Service 3749ba
	size_t length = ~0;
Packit Service 3749ba
	size_t next;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_init (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_reset (&buffer, 0);
Packit Service 3749ba
	p11_buffer_add (&buffer, (unsigned char *)"padding", 7);
Packit Service 3749ba
	assert (!p11_buffer_failed (&buffer));
Packit Service 3749ba
Packit Service 3749ba
	/* Passing a too short buffer here shouldn't matter, as length is checked for sanity */
Packit Service 3749ba
	p11_rpc_buffer_add_byte_array (&buffer, (unsigned char *)"", 0x9fffffff);
Packit Service 3749ba
	assert (p11_buffer_failed (&buffer));
Packit Service 3749ba
Packit Service 3749ba
	/* Force write a too long byte arary to buffer */
Packit Service 3749ba
	p11_buffer_reset (&buffer, 0);
Packit Service 3749ba
	p11_rpc_buffer_add_uint32 (&buffer, 0x9fffffff);
Packit Service 3749ba
Packit Service 3749ba
	next = 0;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_byte_array (&buffer, &next, &val, &length);
Packit Service 3749ba
	assert_num_eq (false, ret);
Packit Service 3749ba
	assert_num_eq (0, next);
Packit Service 3749ba
	assert_num_eq (~0, length);
Packit Service 3749ba
	assert_ptr_eq (NULL, (void*)val);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_uninit (&buffer);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_byte_array_static (void)
Packit Service 3749ba
{
Packit Service 3749ba
	unsigned char data[] = { 'p', 'a', 'd', 0x00, 0x00, 0x00, 0x00, 0x20,
Packit Service 3749ba
	                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
Packit Service 3749ba
	                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
Packit Service 3749ba
	                         0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
Packit Service 3749ba
	                         0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F };
Packit Service 3749ba
	p11_buffer buf = { data, 0x40, };
Packit Service 3749ba
	const unsigned char *val;
Packit Service 3749ba
	size_t length = ~0;
Packit Service 3749ba
	size_t next;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	next = 4;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_byte_array (&buf, &next, &val, &length);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
	assert_num_eq (40, next);
Packit Service 3749ba
	assert_num_eq (32, length);
Packit Service 3749ba
	assert (memcmp (data + 8, val, 32) == 0);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_byte_value (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer buffer;
Packit Service 3749ba
	unsigned char bytes[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
Packit Service 3749ba
	                          0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
Packit Service 3749ba
	                          0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
Packit Service 3749ba
	                          0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F };
Packit Service 3749ba
Packit Service 3749ba
	char val[16];
Packit Service 3749ba
	size_t offset = 0;
Packit Service 3749ba
	CK_ULONG val_size;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_init (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	p11_rpc_buffer_add_byte_value (&buffer, bytes, sizeof(bytes));
Packit Service 3749ba
	assert (p11_buffer_failed (&buffer));
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_reset (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	p11_rpc_buffer_add_byte_value (&buffer, bytes, 1);
Packit Service 3749ba
	assert (!p11_buffer_failed (&buffer));
Packit Service 3749ba
Packit Service 3749ba
	ret = p11_rpc_buffer_get_byte_value (&buffer, &offset, val, &val_size);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
Packit Service 3749ba
	assert_num_eq (bytes[0], val[0]);
Packit Service 3749ba
Packit Service 3749ba
	/* Read out of bound */
Packit Service 3749ba
	ret = p11_rpc_buffer_get_byte_value (&buffer, &offset, val, &val_size);
Packit Service 3749ba
	assert_num_eq (false, ret);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_uninit (&buffer);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_ulong_value (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer buffer;
Packit Service 3749ba
	p11_buffer buf = { (unsigned char *)"pad0\x00\x00\x00\x00\x23\x45\x67\x89", 12, };
Packit Service 3749ba
	CK_ULONG val = ULONG_MAX;
Packit Service 3749ba
	size_t offset = 0;
Packit Service 3749ba
	CK_ULONG val_size;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	offset = 4;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_ulong_value (&buf, &offset, &val, &val_size);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
	assert_num_eq (12, offset);
Packit Service 3749ba
	assert_num_eq (sizeof(val), val_size);
Packit Service 3749ba
	assert_num_eq (0x23456789, val);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_init (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	val = ULONG_MAX;
Packit Service 3749ba
	offset = 0;
Packit Service 3749ba
	val_size = SIZEOF_UNSIGNED_LONG;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_ulong_value (&buffer, &offset, &val, &val_size);
Packit Service 3749ba
	assert_num_eq (0, ret);
Packit Service 3749ba
	assert_num_eq (0, offset);
Packit Service 3749ba
	assert_num_eq (SIZEOF_UNSIGNED_LONG, val_size);
Packit Service 3749ba
	assert_num_eq (ULONG_MAX, val);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_reset (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_add (&buffer, (unsigned char *)"padding", 7);
Packit Service 3749ba
Packit Service 3749ba
	val = ULONG_VAL;
Packit Service 3749ba
	p11_rpc_buffer_add_ulong_value (&buffer, &val, SIZEOF_UNSIGNED_LONG);
Packit Service 3749ba
	assert (!p11_buffer_failed (&buffer));
Packit Service 3749ba
	/* The value is always stored as 64-bit integer */
Packit Service 3749ba
	assert_num_eq (7 + 8, buffer.len);
Packit Service 3749ba
Packit Service 3749ba
	val = ULONG_MAX;
Packit Service 3749ba
	offset = 7;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_ulong_value (&buffer, &offset, &val, &val_size);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
	/* The value is always stored as 64-bit integer */
Packit Service 3749ba
	assert_num_eq (7 + 8, offset);
Packit Service 3749ba
	assert_num_eq (ULONG_VAL, *(CK_ULONG *)&val;;
Packit Service 3749ba
Packit Service 3749ba
	/* Read out of bound */
Packit Service 3749ba
	val = ULONG_MAX;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_ulong_value (&buffer, &offset, &val, &val_size);
Packit Service 3749ba
	assert_num_eq (false, ret);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_uninit (&buffer);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_attribute_array_value (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer buffer;
Packit Service 3749ba
	CK_BBOOL truev = CK_TRUE;
Packit Service 3749ba
	char labelv[] = "label";
Packit Service 3749ba
	CK_ATTRIBUTE attrs[] = {
Packit Service 3749ba
		{ CKA_MODIFIABLE, &truev, sizeof (truev) },
Packit Service 3749ba
		{ CKA_LABEL, labelv, sizeof (labelv) }
Packit Service 3749ba
	};
Packit Service 3749ba
	CK_BBOOL boolv = CK_FALSE;
Packit Service 3749ba
	char strv[] = "\0\0\0\0\0";
Packit Service 3749ba
	CK_ATTRIBUTE val[] = {
Packit Service 3749ba
		{ CKA_MODIFIABLE, &boolv, sizeof (boolv) },
Packit Service 3749ba
		{ CKA_LABEL, strv, sizeof (strv) }
Packit Service 3749ba
	};
Packit Service 3749ba
	CK_ULONG val_size;
Packit Service 3749ba
	size_t offset = 0, offset2;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_init (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	p11_rpc_buffer_add_attribute_array_value(&buffer, attrs, sizeof(attrs));
Packit Service 3749ba
	assert (!p11_buffer_failed (&buffer));
Packit Service 3749ba
Packit Service 3749ba
	offset2 = offset;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_attribute_array_value(&buffer, &offset, NULL, &val_size);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
Packit Service 3749ba
	offset = offset2;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_attribute_array_value(&buffer, &offset, val, &val_size);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
	assert_num_eq (val[0].type, CKA_MODIFIABLE);
Packit Service 3749ba
	assert_num_eq (*(CK_BBOOL *)val[0].pValue, CK_TRUE);
Packit Service 3749ba
	assert_num_eq (val[0].ulValueLen, sizeof (truev));
Packit Service 3749ba
	assert_num_eq (val[1].type, CKA_LABEL);
Packit Service 3749ba
	assert_str_eq (val[1].pValue, "label");
Packit Service 3749ba
	assert_num_eq (val[1].ulValueLen, sizeof (labelv));
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_uninit (&buffer);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_mechanism_type_array_value (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer buffer;
Packit Service 3749ba
	CK_MECHANISM_TYPE mechs[] = { CKM_RSA_PKCS, CKM_DSA, CKM_SHA256_RSA_PKCS };
Packit Service 3749ba
	CK_MECHANISM_TYPE val[3];
Packit Service 3749ba
	CK_ULONG val_size;
Packit Service 3749ba
	size_t offset = 0, offset2;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_init (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	p11_rpc_buffer_add_mechanism_type_array_value(&buffer, mechs, sizeof(mechs));
Packit Service 3749ba
	assert (!p11_buffer_failed (&buffer));
Packit Service 3749ba
Packit Service 3749ba
	offset2 = offset;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_mechanism_type_array_value(&buffer, &offset, NULL, &val_size);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
Packit Service 3749ba
	offset = offset2;
Packit Service 3749ba
	ret = p11_rpc_buffer_get_mechanism_type_array_value(&buffer, &offset, val, &val_size);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
	assert_num_eq (val[0], CKM_RSA_PKCS);
Packit Service 3749ba
	assert_num_eq (val[1], CKM_DSA);
Packit Service 3749ba
	assert_num_eq (val[2], CKM_SHA256_RSA_PKCS);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_uninit (&buffer);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_date_value (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer buffer;
Packit Service 3749ba
	CK_DATE date, val;
Packit Service 3749ba
	size_t offset = 0;
Packit Service 3749ba
	CK_ULONG val_size;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	memcpy (date.year, "2017", 4);
Packit Service 3749ba
	memcpy (date.month, "05", 2);
Packit Service 3749ba
	memcpy (date.day, "16", 2);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_init (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	p11_rpc_buffer_add_date_value(&buffer, &date, sizeof(date));
Packit Service 3749ba
	assert (!p11_buffer_failed (&buffer));
Packit Service 3749ba
Packit Service 3749ba
	ret = p11_rpc_buffer_get_date_value(&buffer, &offset, &val, &val_size);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
Packit Service 3749ba
	assert (memcmp (val.year, date.year, 4) == 0);
Packit Service 3749ba
	assert (memcmp (val.month, date.month, 2) == 0);
Packit Service 3749ba
	assert (memcmp (val.day, date.day, 2) == 0);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_uninit (&buffer);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_date_value_empty (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer buffer;
Packit Service 3749ba
	CK_DATE val;
Packit Service 3749ba
	size_t offset = 0;
Packit Service 3749ba
	CK_ULONG val_size;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_init (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	p11_rpc_buffer_add_date_value(&buffer, NULL, 0);
Packit Service 3749ba
	assert (!p11_buffer_failed (&buffer));
Packit Service 3749ba
Packit Service 3749ba
	ret = p11_rpc_buffer_get_date_value(&buffer, &offset, &val, &val_size);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
Packit Service 3749ba
	assert_num_eq (0, val_size);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_uninit (&buffer);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_byte_array_value (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer buffer;
Packit Service 3749ba
	unsigned char bytes[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
Packit Service 3749ba
	                          0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
Packit Service 3749ba
	                          0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
Packit Service 3749ba
	                          0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F };
Packit Service 3749ba
Packit Service 3749ba
	unsigned char val[32];
Packit Service 3749ba
	size_t offset = 0;
Packit Service 3749ba
	CK_ULONG val_size;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_init (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	p11_rpc_buffer_add_byte_array_value(&buffer, bytes, sizeof(bytes));
Packit Service 3749ba
	assert (!p11_buffer_failed (&buffer));
Packit Service 3749ba
Packit Service 3749ba
	ret = p11_rpc_buffer_get_byte_array_value(&buffer, &offset, val, &val_size);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
Packit Service 3749ba
	assert_num_eq (bytes[0], val[0]);
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_uninit (&buffer);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_mechanism_value (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_buffer buffer;
Packit Service 3749ba
	CK_MECHANISM_TYPE *mechanisms;
Packit Service 3749ba
	CK_RSA_PKCS_PSS_PARAMS pss_params = {
Packit Service 3749ba
		CKM_SHA256,
Packit Service 3749ba
		CKG_MGF1_SHA256,
Packit Service 3749ba
		32
Packit Service 3749ba
	};
Packit Service 3749ba
	CK_RSA_PKCS_OAEP_PARAMS oaep_params = {
Packit Service 3749ba
		CKM_SHA384,
Packit Service 3749ba
		CKG_MGF1_SHA384,
Packit Service 3749ba
		0,
Packit Service 3749ba
		NULL,
Packit Service 3749ba
		0
Packit Service 3749ba
	};
Packit Service 3749ba
	CK_MECHANISM mechs[] = {
Packit Service 3749ba
		{ CKM_RSA_PKCS_PSS, &pss_params, sizeof (pss_params) },
Packit Service 3749ba
		{ CKM_RSA_PKCS_OAEP, &oaep_params, sizeof (oaep_params) }
Packit Service 3749ba
	};
Packit Service 3749ba
Packit Service 3749ba
	CK_MECHANISM val;
Packit Service 3749ba
	size_t offset = 0;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
	size_t i;
Packit Service 3749ba
Packit Service 3749ba
	mechanisms = p11_rpc_mechanisms_override_supported;
Packit Service 3749ba
	p11_rpc_mechanisms_override_supported = NULL;
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_init (&buffer, 0);
Packit Service 3749ba
Packit Service 3749ba
	for (i = 0; i < ELEMS (mechs); i++) {
Packit Service 3749ba
		size_t offset2 = offset;
Packit Service 3749ba
Packit Service 3749ba
		p11_rpc_buffer_add_mechanism (&buffer, &mechs[i]);
Packit Service 3749ba
		assert (!p11_buffer_failed (&buffer));
Packit Service 3749ba
Packit Service 3749ba
		memset (&val, 0, sizeof (val));
Packit Service 3749ba
		ret = p11_rpc_buffer_get_mechanism (&buffer, &offset, &val;;
Packit Service 3749ba
		assert_num_eq (true, ret);
Packit Service 3749ba
		assert_num_eq (mechs[i].mechanism, val.mechanism);
Packit Service 3749ba
		assert_ptr_eq (NULL, val.pParameter);
Packit Service 3749ba
		assert_num_eq (mechs[i].ulParameterLen, val.ulParameterLen);
Packit Service 3749ba
Packit Service 3749ba
		val.pParameter = malloc (val.ulParameterLen);
Packit Service 3749ba
		assert_ptr_not_null (val.pParameter);
Packit Service 3749ba
Packit Service 3749ba
		offset = offset2;
Packit Service 3749ba
		ret = p11_rpc_buffer_get_mechanism (&buffer, &offset, &val;;
Packit Service 3749ba
		assert_num_eq (true, ret);
Packit Service 3749ba
		assert_num_eq (mechs[i].mechanism, val.mechanism);
Packit Service 3749ba
		assert_num_eq (mechs[i].ulParameterLen, val.ulParameterLen);
Packit Service 3749ba
		assert (memcmp (val.pParameter, mechs[i].pParameter, val.ulParameterLen) == 0);
Packit Service 3749ba
Packit Service 3749ba
		free (val.pParameter);
Packit Service 3749ba
	}
Packit Service 3749ba
Packit Service 3749ba
	p11_buffer_uninit (&buffer);
Packit Service 3749ba
Packit Service 3749ba
	p11_rpc_mechanisms_override_supported = mechanisms;
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_message_write (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_rpc_message msg;
Packit Service 3749ba
	p11_buffer buffer;
Packit Service 3749ba
	CK_BBOOL truev = CK_TRUE;
Packit Service 3749ba
	CK_ULONG zerov = (CK_ULONG)0;
Packit Service 3749ba
	char labelv[] = "label";
Packit Service 3749ba
	CK_ATTRIBUTE attrs[] = {
Packit Service 3749ba
		{ CKA_MODIFIABLE, &truev, sizeof (truev) },
Packit Service 3749ba
		{ CKA_LABEL, labelv, sizeof (labelv) },
Packit Service 3749ba
		/* These are cases when C_GetAttributeValue is called
Packit Service 3749ba
		 * to obtain the length */
Packit Service 3749ba
		{ CKA_COPYABLE, NULL, sizeof (truev) },
Packit Service 3749ba
		{ CKA_BITS_PER_PIXEL, NULL, sizeof (zerov) }
Packit Service 3749ba
	};
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	ret = p11_buffer_init (&buffer, 0);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
	p11_rpc_message_init (&msg, &buffer, &buffer);
Packit Service 3749ba
	ret = p11_rpc_message_write_attribute_array (&msg, attrs, ELEMS(attrs));
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
	p11_rpc_message_clear (&msg;;
Packit Service 3749ba
	p11_buffer_uninit (&buffer);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static p11_virtual base;
Packit Service 3749ba
static unsigned int rpc_initialized = 0;
Packit Service 3749ba
Packit Service 3749ba
static CK_RV
Packit Service 3749ba
rpc_initialize (p11_rpc_client_vtable *vtable,
Packit Service 3749ba
                void *init_reserved)
Packit Service 3749ba
{
Packit Service 3749ba
	assert_str_eq (vtable->data, "vtable-data");
Packit Service 3749ba
	assert_num_cmp (p11_forkid, !=, rpc_initialized);
Packit Service 3749ba
	rpc_initialized = p11_forkid;
Packit Service 3749ba
Packit Service 3749ba
	return CKR_OK;
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static CK_RV
Packit Service 3749ba
rpc_initialize_fails (p11_rpc_client_vtable *vtable,
Packit Service 3749ba
                      void *init_reserved)
Packit Service 3749ba
{
Packit Service 3749ba
	assert_str_eq (vtable->data, "vtable-data");
Packit Service 3749ba
	assert_num_cmp (p11_forkid, !=, rpc_initialized);
Packit Service 3749ba
	return CKR_FUNCTION_FAILED;
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static CK_RV
Packit Service 3749ba
rpc_initialize_device_removed (p11_rpc_client_vtable *vtable,
Packit Service 3749ba
                               void *init_reserved)
Packit Service 3749ba
{
Packit Service 3749ba
	assert_str_eq (vtable->data, "vtable-data");
Packit Service 3749ba
	assert_num_cmp (p11_forkid, !=, rpc_initialized);
Packit Service 3749ba
	return CKR_DEVICE_REMOVED;
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static CK_RV
Packit Service 3749ba
rpc_transport (p11_rpc_client_vtable *vtable,
Packit Service 3749ba
               p11_buffer *request,
Packit Service 3749ba
               p11_buffer *response)
Packit Service 3749ba
{
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
Packit Service 3749ba
	assert_str_eq (vtable->data, "vtable-data");
Packit Service 3749ba
Packit Service 3749ba
	/* Just pass directly to the server code */
Packit Service 3749ba
	ret = p11_rpc_server_handle (&base.funcs, request, response);
Packit Service 3749ba
	assert (ret == true);
Packit Service 3749ba
Packit Service 3749ba
	return CKR_OK;
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
rpc_finalize (p11_rpc_client_vtable *vtable,
Packit Service 3749ba
              void *fini_reserved)
Packit Service 3749ba
{
Packit Service 3749ba
	assert_str_eq (vtable->data, "vtable-data");
Packit Service 3749ba
	assert_num_cmp (p11_forkid, ==, rpc_initialized);
Packit Service 3749ba
	rpc_initialized = 0;
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_initialize (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_rpc_client_vtable vtable = { "vtable-data", rpc_initialize, rpc_transport, rpc_finalize };
Packit Service 3749ba
	p11_virtual mixin;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
Packit Service 3749ba
	/* Build up our own function list */
Packit Service 3749ba
	rpc_initialized = 0;
Packit Service 3749ba
	p11_virtual_init (&base, &p11_virtual_base, &mock_module_no_slots, NULL);
Packit Service 3749ba
Packit Service 3749ba
	ret = p11_rpc_client_init (&mixin, &vtable);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
Packit Service 3749ba
	rv = mixin.funcs.C_Initialize (&mixin.funcs, NULL);
Packit Service 3749ba
	assert (rv == CKR_OK);
Packit Service 3749ba
	assert_num_eq (p11_forkid, rpc_initialized);
Packit Service 3749ba
Packit Service 3749ba
	rv = mixin.funcs.C_Finalize (&mixin.funcs, NULL);
Packit Service 3749ba
	assert (rv == CKR_OK);
Packit Service 3749ba
	assert_num_cmp (p11_forkid, !=, rpc_initialized);
Packit Service 3749ba
Packit Service 3749ba
	p11_virtual_uninit (&mixin);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_not_initialized (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_rpc_client_vtable vtable = { "vtable-data", rpc_initialize, rpc_transport, rpc_finalize };
Packit Service 3749ba
	p11_virtual mixin;
Packit Service 3749ba
	CK_INFO info;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
Packit Service 3749ba
	/* Build up our own function list */
Packit Service 3749ba
	rpc_initialized = 0;
Packit Service 3749ba
	p11_virtual_init (&base, &p11_virtual_base, &mock_module_no_slots, NULL);
Packit Service 3749ba
Packit Service 3749ba
	ret = p11_rpc_client_init (&mixin, &vtable);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
Packit Service 3749ba
	rv = (mixin.funcs.C_GetInfo) (&mixin.funcs, &info;;
Packit Service 3749ba
	assert (rv == CKR_CRYPTOKI_NOT_INITIALIZED);
Packit Service 3749ba
Packit Service 3749ba
	p11_virtual_uninit (&mixin);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_initialize_fails_on_client (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_rpc_client_vtable vtable = { "vtable-data", rpc_initialize_fails, rpc_transport, rpc_finalize };
Packit Service 3749ba
	p11_virtual mixin;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
Packit Service 3749ba
	/* Build up our own function list */
Packit Service 3749ba
	rpc_initialized = 0;
Packit Service 3749ba
	p11_virtual_init (&base, &p11_virtual_base, &mock_module_no_slots, NULL);
Packit Service 3749ba
Packit Service 3749ba
	ret = p11_rpc_client_init (&mixin, &vtable);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
Packit Service 3749ba
	rv = (mixin.funcs.C_Initialize) (&mixin.funcs, NULL);
Packit Service 3749ba
	assert (rv == CKR_FUNCTION_FAILED);
Packit Service 3749ba
	assert_num_eq (0, rpc_initialized);
Packit Service 3749ba
Packit Service 3749ba
	p11_virtual_uninit (&mixin);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static CK_RV
Packit Service 3749ba
rpc_transport_fails (p11_rpc_client_vtable *vtable,
Packit Service 3749ba
                     p11_buffer *request,
Packit Service 3749ba
                     p11_buffer *response)
Packit Service 3749ba
{
Packit Service 3749ba
	return CKR_FUNCTION_REJECTED;
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_transport_fails (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_rpc_client_vtable vtable = { "vtable-data", rpc_initialize, rpc_transport_fails, rpc_finalize };
Packit Service 3749ba
	p11_virtual mixin;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
Packit Service 3749ba
	/* Build up our own function list */
Packit Service 3749ba
	rpc_initialized = 0;
Packit Service 3749ba
	p11_virtual_init (&base, &p11_virtual_base, &mock_module_no_slots, NULL);
Packit Service 3749ba
Packit Service 3749ba
	ret = p11_rpc_client_init (&mixin, &vtable);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
Packit Service 3749ba
	rv = (mixin.funcs.C_Initialize) (&mixin.funcs, NULL);
Packit Service 3749ba
	assert (rv == CKR_FUNCTION_REJECTED);
Packit Service 3749ba
	assert_num_eq (0, rpc_initialized);
Packit Service 3749ba
Packit Service 3749ba
	p11_virtual_uninit (&mixin);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_initialize_fails_on_server (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_rpc_client_vtable vtable = { "vtable-data", rpc_initialize, rpc_transport, rpc_finalize };
Packit Service 3749ba
	p11_virtual mixin;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
Packit Service 3749ba
	/* Build up our own function list */
Packit Service 3749ba
	p11_virtual_init (&base, &p11_virtual_base, &mock_module_no_slots, NULL);
Packit Service 3749ba
	base.funcs.C_Initialize = mock_X_Initialize__fails;
Packit Service 3749ba
Packit Service 3749ba
	ret = p11_rpc_client_init (&mixin, &vtable);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
Packit Service 3749ba
	rv = (mixin.funcs.C_Initialize) (&mixin.funcs, NULL);
Packit Service 3749ba
	assert (rv == CKR_FUNCTION_FAILED);
Packit Service 3749ba
	assert_num_eq (0, rpc_initialized);
Packit Service 3749ba
Packit Service 3749ba
	p11_virtual_uninit (&mixin);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static CK_RV
Packit Service 3749ba
rpc_transport_bad_parse (p11_rpc_client_vtable *vtable,
Packit Service 3749ba
                         p11_buffer *request,
Packit Service 3749ba
                         p11_buffer *response)
Packit Service 3749ba
{
Packit Service 3749ba
	int rc;
Packit Service 3749ba
Packit Service 3749ba
	assert_str_eq (vtable->data, "vtable-data");
Packit Service 3749ba
Packit Service 3749ba
	/* Just zero bytes is an invalid message */
Packit Service 3749ba
	rc = p11_buffer_reset (response, 2);
Packit Service 3749ba
	assert (rc >= 0);
Packit Service 3749ba
Packit Service 3749ba
	memset (response->data, 0, 2);
Packit Service 3749ba
	response->len = 2;
Packit Service 3749ba
	return CKR_OK;
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_transport_bad_parse (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_rpc_client_vtable vtable = { "vtable-data", rpc_initialize, rpc_transport_bad_parse, rpc_finalize };
Packit Service 3749ba
	p11_virtual mixin;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
Packit Service 3749ba
	/* Build up our own function list */
Packit Service 3749ba
	rpc_initialized = 0;
Packit Service 3749ba
	p11_virtual_init (&base, &p11_virtual_base, &mock_module_no_slots, NULL);
Packit Service 3749ba
Packit Service 3749ba
	ret = p11_rpc_client_init (&mixin, &vtable);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
Packit Service 3749ba
	p11_kit_be_quiet ();
Packit Service 3749ba
Packit Service 3749ba
	rv = (mixin.funcs.C_Initialize) (&mixin.funcs, NULL);
Packit Service 3749ba
	assert (rv == CKR_DEVICE_ERROR);
Packit Service 3749ba
	assert_num_eq (0, rpc_initialized);
Packit Service 3749ba
Packit Service 3749ba
	p11_message_loud ();
Packit Service 3749ba
	p11_virtual_uninit (&mixin);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static CK_RV
Packit Service 3749ba
rpc_transport_short_error (p11_rpc_client_vtable *vtable,
Packit Service 3749ba
                           p11_buffer *request,
Packit Service 3749ba
                           p11_buffer *response)
Packit Service 3749ba
{
Packit Service 3749ba
	int rc;
Packit Service 3749ba
Packit Service 3749ba
	unsigned char data[] = {
Packit Service 3749ba
		0x00, 0x00, 0x00, 0x00,       /* RPC_CALL_ERROR */
Packit Service 3749ba
		0x00, 0x00, 0x00, 0x01, 0x75, /* signature 'u' */
Packit Service 3749ba
		0x00, 0x01,                   /* short error */
Packit Service 3749ba
	};
Packit Service 3749ba
Packit Service 3749ba
	assert_str_eq (vtable->data, "vtable-data");
Packit Service 3749ba
Packit Service 3749ba
	rc = p11_buffer_reset (response, sizeof (data));
Packit Service 3749ba
	assert (rc >= 0);
Packit Service 3749ba
Packit Service 3749ba
	memcpy (response->data, data, sizeof (data));
Packit Service 3749ba
	response->len = sizeof (data);
Packit Service 3749ba
	return CKR_OK;
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_transport_short_error (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_rpc_client_vtable vtable = { "vtable-data", rpc_initialize, rpc_transport_short_error, rpc_finalize };
Packit Service 3749ba
	p11_virtual mixin;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
Packit Service 3749ba
	/* Build up our own function list */
Packit Service 3749ba
	p11_virtual_init (&base, &p11_virtual_base, &mock_module_no_slots, NULL);
Packit Service 3749ba
Packit Service 3749ba
	ret = p11_rpc_client_init (&mixin, &vtable);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
Packit Service 3749ba
	p11_kit_be_quiet ();
Packit Service 3749ba
Packit Service 3749ba
	rv = (mixin.funcs.C_Initialize) (&mixin.funcs, NULL);
Packit Service 3749ba
	assert (rv == CKR_DEVICE_ERROR);
Packit Service 3749ba
	assert_num_eq (0, rpc_initialized);
Packit Service 3749ba
Packit Service 3749ba
	p11_message_loud ();
Packit Service 3749ba
	p11_virtual_uninit (&mixin);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static CK_RV
Packit Service 3749ba
rpc_transport_invalid_error (p11_rpc_client_vtable *vtable,
Packit Service 3749ba
                             p11_buffer *request,
Packit Service 3749ba
                             p11_buffer *response)
Packit Service 3749ba
{
Packit Service 3749ba
	int rc;
Packit Service 3749ba
Packit Service 3749ba
	unsigned char data[] = {
Packit Service 3749ba
		0x00, 0x00, 0x00, 0x00,       /* RPC_CALL_ERROR */
Packit Service 3749ba
		0x00, 0x00, 0x00, 0x01, 0x75, /* signature 'u' */
Packit Service 3749ba
		0x00, 0x00, 0x00, 0x00,       /* a CKR_OK error*/
Packit Service 3749ba
		0x00, 0x00, 0x00, 0x00,
Packit Service 3749ba
	};
Packit Service 3749ba
Packit Service 3749ba
	assert_str_eq (vtable->data, "vtable-data");
Packit Service 3749ba
Packit Service 3749ba
	rc = p11_buffer_reset (response, sizeof (data));
Packit Service 3749ba
	assert (rc >= 0);
Packit Service 3749ba
	memcpy (response->data, data, sizeof (data));
Packit Service 3749ba
	response->len = sizeof (data);
Packit Service 3749ba
	return CKR_OK;
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_transport_invalid_error (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_rpc_client_vtable vtable = { "vtable-data", rpc_initialize, rpc_transport_invalid_error, rpc_finalize };
Packit Service 3749ba
	p11_virtual mixin;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
Packit Service 3749ba
	/* Build up our own function list */
Packit Service 3749ba
	p11_virtual_init (&base, &p11_virtual_base, &mock_module_no_slots, NULL);
Packit Service 3749ba
Packit Service 3749ba
	ret = p11_rpc_client_init (&mixin, &vtable);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
Packit Service 3749ba
	p11_kit_be_quiet ();
Packit Service 3749ba
Packit Service 3749ba
	rv = (mixin.funcs.C_Initialize) (&mixin.funcs, NULL);
Packit Service 3749ba
	assert (rv == CKR_DEVICE_ERROR);
Packit Service 3749ba
	assert_num_eq (0, rpc_initialized);
Packit Service 3749ba
Packit Service 3749ba
	p11_message_loud ();
Packit Service 3749ba
	p11_virtual_uninit (&mixin);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static CK_RV
Packit Service 3749ba
rpc_transport_wrong_response (p11_rpc_client_vtable *vtable,
Packit Service 3749ba
                              p11_buffer *request,
Packit Service 3749ba
                              p11_buffer *response)
Packit Service 3749ba
{
Packit Service 3749ba
	int rc;
Packit Service 3749ba
Packit Service 3749ba
	unsigned char data[] = {
Packit Service 3749ba
		0x00, 0x00, 0x00, 0x02,       /* RPC_CALL_C_Finalize */
Packit Service 3749ba
		0x00, 0x00, 0x00, 0x00,       /* signature '' */
Packit Service 3749ba
	};
Packit Service 3749ba
Packit Service 3749ba
	assert_str_eq (vtable->data, "vtable-data");
Packit Service 3749ba
Packit Service 3749ba
	rc = p11_buffer_reset (response, sizeof (data));
Packit Service 3749ba
	assert (rc >= 0);
Packit Service 3749ba
	memcpy (response->data, data, sizeof (data));
Packit Service 3749ba
	response->len = sizeof (data);
Packit Service 3749ba
	return CKR_OK;
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_transport_wrong_response (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_rpc_client_vtable vtable = { "vtable-data", rpc_initialize, rpc_transport_wrong_response, rpc_finalize };
Packit Service 3749ba
	p11_virtual mixin;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
Packit Service 3749ba
	/* Build up our own function list */
Packit Service 3749ba
	p11_virtual_init (&base, &p11_virtual_base, &mock_module_no_slots, NULL);
Packit Service 3749ba
Packit Service 3749ba
	ret = p11_rpc_client_init (&mixin, &vtable);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
Packit Service 3749ba
	p11_kit_be_quiet ();
Packit Service 3749ba
Packit Service 3749ba
	rv = (mixin.funcs.C_Initialize) (&mixin.funcs, NULL);
Packit Service 3749ba
	assert (rv == CKR_DEVICE_ERROR);
Packit Service 3749ba
	assert_num_eq (0, rpc_initialized);
Packit Service 3749ba
Packit Service 3749ba
	p11_message_loud ();
Packit Service 3749ba
	p11_virtual_uninit (&mixin);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static CK_RV
Packit Service 3749ba
rpc_transport_bad_contents (p11_rpc_client_vtable *vtable,
Packit Service 3749ba
                            p11_buffer *request,
Packit Service 3749ba
                            p11_buffer *response)
Packit Service 3749ba
{
Packit Service 3749ba
	int rc;
Packit Service 3749ba
Packit Service 3749ba
	unsigned char data[] = {
Packit Service 3749ba
		0x00, 0x00, 0x00, 0x02,       /* RPC_CALL_C_GetInfo */
Packit Service 3749ba
		0x00, 0x00, 0x00, 0x05,       /* signature 'vsusv' */
Packit Service 3749ba
		'v', 's', 'u', 's', 'v',
Packit Service 3749ba
		0x00, 0x00, 0x00, 0x00,       /* invalid data */
Packit Service 3749ba
	};
Packit Service 3749ba
Packit Service 3749ba
	assert_str_eq (vtable->data, "vtable-data");
Packit Service 3749ba
Packit Service 3749ba
	rc = p11_buffer_reset (response, sizeof (data));
Packit Service 3749ba
	assert (rc >= 0);
Packit Service 3749ba
	memcpy (response->data, data, sizeof (data));
Packit Service 3749ba
	response->len = sizeof (data);
Packit Service 3749ba
	return CKR_OK;
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_transport_bad_contents (void)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_rpc_client_vtable vtable = { "vtable-data", rpc_initialize, rpc_transport_bad_contents, rpc_finalize };
Packit Service 3749ba
	p11_virtual mixin;
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
Packit Service 3749ba
	/* Build up our own function list */
Packit Service 3749ba
	p11_virtual_init (&base, &p11_virtual_base, &mock_module_no_slots, NULL);
Packit Service 3749ba
Packit Service 3749ba
	ret = p11_rpc_client_init (&mixin, &vtable);
Packit Service 3749ba
	assert_num_eq (true, ret);
Packit Service 3749ba
Packit Service 3749ba
	p11_kit_be_quiet ();
Packit Service 3749ba
Packit Service 3749ba
	rv = (mixin.funcs.C_Initialize) (&mixin.funcs, NULL);
Packit Service 3749ba
	assert (rv == CKR_DEVICE_ERROR);
Packit Service 3749ba
	assert_num_eq (0, rpc_initialized);
Packit Service 3749ba
Packit Service 3749ba
	p11_message_loud ();
Packit Service 3749ba
	p11_virtual_uninit (&mixin);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static p11_rpc_client_vtable test_normal_vtable = {
Packit Service 3749ba
	NULL,
Packit Service 3749ba
	rpc_initialize,
Packit Service 3749ba
	rpc_transport,
Packit Service 3749ba
	rpc_finalize,
Packit Service 3749ba
};
Packit Service 3749ba
Packit Service 3749ba
static p11_rpc_client_vtable test_device_removed_vtable = {
Packit Service 3749ba
	NULL,
Packit Service 3749ba
	rpc_initialize_device_removed,
Packit Service 3749ba
	rpc_transport,
Packit Service 3749ba
	rpc_finalize,
Packit Service 3749ba
};
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
mixin_free (void *data)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_virtual *mixin = data;
Packit Service 3749ba
	p11_virtual_uninit (mixin);
Packit Service 3749ba
	free (mixin);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static CK_FUNCTION_LIST_PTR
Packit Service 3749ba
setup_test_rpc_module (p11_rpc_client_vtable *vtable,
Packit Service 3749ba
                       CK_FUNCTION_LIST *module_template,
Packit Service 3749ba
                       CK_SESSION_HANDLE *session)
Packit Service 3749ba
{
Packit Service 3749ba
	CK_FUNCTION_LIST *rpc_module;
Packit Service 3749ba
	p11_virtual *mixin;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
Packit Service 3749ba
	/* Build up our own function list */
Packit Service 3749ba
	p11_virtual_init (&base, &p11_virtual_base, module_template, NULL);
Packit Service 3749ba
Packit Service 3749ba
	mixin = calloc (1, sizeof (p11_virtual));
Packit Service 3749ba
	assert (mixin != NULL);
Packit Service 3749ba
Packit Service 3749ba
	vtable->data = "vtable-data";
Packit Service 3749ba
	if (!p11_rpc_client_init (mixin, vtable))
Packit Service 3749ba
		assert_not_reached ();
Packit Service 3749ba
Packit Service 3749ba
	rpc_module = p11_virtual_wrap (mixin, mixin_free);
Packit Service 3749ba
	assert_ptr_not_null (rpc_module);
Packit Service 3749ba
Packit Service 3749ba
	rv = p11_kit_module_initialize (rpc_module);
Packit Service 3749ba
	assert (rv == CKR_OK);
Packit Service 3749ba
Packit Service 3749ba
	if (session) {
Packit Service 3749ba
		rv = (rpc_module->C_OpenSession) (MOCK_SLOT_ONE_ID, CKF_RW_SESSION | CKF_SERIAL_SESSION,
Packit Service 3749ba
		                                  NULL, NULL, session);
Packit Service 3749ba
		assert (rv == CKR_OK);
Packit Service 3749ba
	}
Packit Service 3749ba
Packit Service 3749ba
	return rpc_module;
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static CK_FUNCTION_LIST *
Packit Service 3749ba
setup_mock_module (CK_SESSION_HANDLE *session)
Packit Service 3749ba
{
Packit Service 3749ba
	return setup_test_rpc_module (&test_normal_vtable, &mock_module, session);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
teardown_mock_module (CK_FUNCTION_LIST *rpc_module)
Packit Service 3749ba
{
Packit Service 3749ba
	p11_kit_module_finalize (rpc_module);
Packit Service 3749ba
	p11_virtual_unwrap (rpc_module);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_get_info_stand_in (void)
Packit Service 3749ba
{
Packit Service 3749ba
	CK_FUNCTION_LIST_PTR rpc_module;
Packit Service 3749ba
	CK_INFO info;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
	char *string;
Packit Service 3749ba
Packit Service 3749ba
	rpc_module = setup_test_rpc_module (&test_device_removed_vtable,
Packit Service 3749ba
	                                    &mock_module_no_slots, NULL);
Packit Service 3749ba
Packit Service 3749ba
	rv = (rpc_module->C_GetInfo) (&info;;
Packit Service 3749ba
	assert (rv == CKR_OK);
Packit Service 3749ba
Packit Service 3749ba
	assert_num_eq (CRYPTOKI_VERSION_MAJOR, info.cryptokiVersion.major);
Packit Service 3749ba
	assert_num_eq (CRYPTOKI_VERSION_MINOR, info.cryptokiVersion.minor);
Packit Service 3749ba
	string = p11_kit_space_strdup (info.manufacturerID, sizeof (info.manufacturerID));
Packit Service 3749ba
	assert_str_eq ("p11-kit", string);
Packit Service 3749ba
	free (string);
Packit Service 3749ba
	string = p11_kit_space_strdup (info.libraryDescription, sizeof (info.libraryDescription));
Packit Service 3749ba
	assert_str_eq ("p11-kit (no connection)", string);
Packit Service 3749ba
	free (string);
Packit Service 3749ba
	assert_num_eq (0, info.flags);
Packit Service 3749ba
	assert_num_eq (1, info.libraryVersion.major);
Packit Service 3749ba
	assert_num_eq (1, info.libraryVersion.minor);
Packit Service 3749ba
Packit Service 3749ba
	teardown_mock_module (rpc_module);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_get_slot_list_no_device (void)
Packit Service 3749ba
{
Packit Service 3749ba
	CK_FUNCTION_LIST_PTR rpc_module;
Packit Service 3749ba
	CK_SLOT_ID slot_list[8];
Packit Service 3749ba
	CK_ULONG count;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
Packit Service 3749ba
	rpc_module = setup_test_rpc_module (&test_device_removed_vtable,
Packit Service 3749ba
	                                    &mock_module_no_slots, NULL);
Packit Service 3749ba
Packit Service 3749ba
	rv = (rpc_module->C_GetSlotList) (CK_TRUE, NULL, &count);
Packit Service 3749ba
	assert (rv == CKR_OK);
Packit Service 3749ba
	assert_num_eq (0, count);
Packit Service 3749ba
	rv = (rpc_module->C_GetSlotList) (CK_FALSE, NULL, &count);
Packit Service 3749ba
	assert (rv == CKR_OK);
Packit Service 3749ba
	assert_num_eq (0, count);
Packit Service 3749ba
Packit Service 3749ba
	count = 8;
Packit Service 3749ba
	rv = (rpc_module->C_GetSlotList) (CK_TRUE, slot_list, &count);
Packit Service 3749ba
	assert (rv == CKR_OK);
Packit Service 3749ba
	assert_num_eq (0, count);
Packit Service 3749ba
Packit Service 3749ba
	count = 8;
Packit Service 3749ba
	rv = (rpc_module->C_GetSlotList) (CK_FALSE, slot_list, &count);
Packit Service 3749ba
	assert (rv == CKR_OK);
Packit Service 3749ba
	assert_num_eq (0, count);
Packit Service 3749ba
Packit Service 3749ba
	teardown_mock_module (rpc_module);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void *
Packit Service 3749ba
invoke_in_thread (void *arg)
Packit Service 3749ba
{
Packit Service 3749ba
	CK_FUNCTION_LIST *rpc_module = arg;
Packit Service 3749ba
	CK_INFO info;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
Packit Service 3749ba
	rv = (rpc_module->C_GetInfo) (&info;;
Packit Service 3749ba
	assert_num_eq (rv, CKR_OK);
Packit Service 3749ba
Packit Service 3749ba
	assert (memcmp (info.manufacturerID, MOCK_INFO.manufacturerID,
Packit Service 3749ba
	                sizeof (info.manufacturerID)) == 0);
Packit Service 3749ba
Packit Service 3749ba
	return NULL;
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static p11_mutex_t delay_mutex;
Packit Service 3749ba
Packit Service 3749ba
static CK_RV
Packit Service 3749ba
delayed_C_GetInfo (CK_INFO_PTR info)
Packit Service 3749ba
{
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
Packit Service 3749ba
	p11_sleep_ms (rand () % 100);
Packit Service 3749ba
Packit Service 3749ba
	p11_mutex_lock (&delay_mutex);
Packit Service 3749ba
	rv = mock_C_GetInfo (info);
Packit Service 3749ba
	p11_mutex_unlock (&delay_mutex);
Packit Service 3749ba
Packit Service 3749ba
	return rv;
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_simultaneous_functions (void)
Packit Service 3749ba
{
Packit Service 3749ba
	CK_FUNCTION_LIST real_module;
Packit Service 3749ba
	CK_FUNCTION_LIST *rpc_module;
Packit Service 3749ba
	const int num_threads = 128;
Packit Service 3749ba
	p11_thread_t threads[num_threads];
Packit Service 3749ba
	int i, ret;
Packit Service 3749ba
Packit Service 3749ba
	p11_mutex_init (&delay_mutex);
Packit Service 3749ba
Packit Service 3749ba
	memcpy (&real_module, &mock_module_no_slots, sizeof (CK_FUNCTION_LIST));
Packit Service 3749ba
	real_module.C_GetInfo = delayed_C_GetInfo;
Packit Service 3749ba
Packit Service 3749ba
	rpc_module = setup_test_rpc_module (&test_normal_vtable,
Packit Service 3749ba
	                                    &real_module, NULL);
Packit Service 3749ba
Packit Service 3749ba
	/* Make the invoked function (above) wait */
Packit Service 3749ba
	p11_mutex_lock (&delay_mutex);
Packit Service 3749ba
Packit Service 3749ba
	for (i = 0; i < num_threads; i++) {
Packit Service 3749ba
		ret = p11_thread_create (threads + i, invoke_in_thread, rpc_module);
Packit Service 3749ba
		assert_num_eq (0, ret);
Packit Service 3749ba
	}
Packit Service 3749ba
Packit Service 3749ba
	/* Let the invoked functions return */
Packit Service 3749ba
	p11_mutex_unlock (&delay_mutex);
Packit Service 3749ba
Packit Service 3749ba
	for (i = 0; i < num_threads; i++)
Packit Service 3749ba
		p11_thread_join (threads[i]);
Packit Service 3749ba
Packit Service 3749ba
	teardown_mock_module (rpc_module);
Packit Service 3749ba
	p11_mutex_uninit (&delay_mutex);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
#ifdef OS_UNIX
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_fork_and_reinitialize (void)
Packit Service 3749ba
{
Packit Service 3749ba
	CK_FUNCTION_LIST *rpc_module;
Packit Service 3749ba
	CK_INFO info;
Packit Service 3749ba
	int status;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
	pid_t pid;
Packit Service 3749ba
	int i;
Packit Service 3749ba
Packit Service 3749ba
	rpc_module = setup_test_rpc_module (&test_normal_vtable,
Packit Service 3749ba
	                                    &mock_module_no_slots, NULL);
Packit Service 3749ba
Packit Service 3749ba
	pid = fork ();
Packit Service 3749ba
	assert_num_cmp (pid, >=, 0);
Packit Service 3749ba
Packit Service 3749ba
	/* The child */
Packit Service 3749ba
	if (pid == 0) {
Packit Service 3749ba
		rv = (rpc_module->C_Initialize) (NULL);
Packit Service 3749ba
		assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
		for (i = 0; i < 32; i++) {
Packit Service 3749ba
			rv = (rpc_module->C_GetInfo) (&info;;
Packit Service 3749ba
			assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
		}
Packit Service 3749ba
Packit Service 3749ba
		rv = (rpc_module->C_Finalize) (NULL);
Packit Service 3749ba
		assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
		_exit (66);
Packit Service 3749ba
	}
Packit Service 3749ba
Packit Service 3749ba
	for (i = 0; i < 128; i++) {
Packit Service 3749ba
		rv = (rpc_module->C_GetInfo) (&info;;
Packit Service 3749ba
		assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
	}
Packit Service 3749ba
Packit Service 3749ba
	assert_num_eq (waitpid (pid, &status, 0), pid);
Packit Service 3749ba
	assert_num_eq (WEXITSTATUS (status), 66);
Packit Service 3749ba
Packit Service 3749ba
	teardown_mock_module (rpc_module);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
#endif /* OS_UNIX */
Packit Service 3749ba
Packit Service 3749ba
#include "test-mock.c"
Packit Service 3749ba
Packit Service 3749ba
int
Packit Service 3749ba
main (int argc,
Packit Service 3749ba
      char *argv[])
Packit Service 3749ba
{
Packit Service 3749ba
	CK_MECHANISM_TYPE mechanisms[] = {
Packit Service 3749ba
		CKM_MOCK_CAPITALIZE,
Packit Service 3749ba
		CKM_MOCK_PREFIX,
Packit Service 3749ba
		CKM_MOCK_GENERATE,
Packit Service 3749ba
		CKM_MOCK_WRAP,
Packit Service 3749ba
		CKM_MOCK_DERIVE,
Packit Service 3749ba
		CKM_MOCK_COUNT,
Packit Service 3749ba
		0,
Packit Service 3749ba
	};
Packit Service 3749ba
Packit Service 3749ba
	mock_module_init ();
Packit Service 3749ba
	p11_library_init ();
Packit Service 3749ba
Packit Service 3749ba
	/* Override the mechanisms that the RPC mechanism will handle */
Packit Service 3749ba
	p11_rpc_mechanisms_override_supported = mechanisms;
Packit Service 3749ba
Packit Service 3749ba
	p11_test (test_new_free, "/rpc/new-free");
Packit Service 3749ba
	p11_test (test_uint16, "/rpc/uint16");
Packit Service 3749ba
	p11_test (test_uint16_static, "/rpc/uint16-static");
Packit Service 3749ba
	p11_test (test_uint32, "/rpc/uint32");
Packit Service 3749ba
	p11_test (test_uint32_static, "/rpc/uint32-static");
Packit Service 3749ba
	p11_test (test_uint64, "/rpc/uint64");
Packit Service 3749ba
	p11_test (test_uint64_static, "/rpc/uint64-static");
Packit Service 3749ba
	p11_test (test_byte_array, "/rpc/byte-array");
Packit Service 3749ba
	p11_test (test_byte_array_null, "/rpc/byte-array-null");
Packit Service 3749ba
	p11_test (test_byte_array_too_long, "/rpc/byte-array-too-long");
Packit Service 3749ba
	p11_test (test_byte_array_static, "/rpc/byte-array-static");
Packit Service 3749ba
	p11_test (test_byte_value, "/rpc/byte-value");
Packit Service 3749ba
	p11_test (test_ulong_value, "/rpc/ulong-value");
Packit Service 3749ba
	p11_test (test_attribute_array_value, "/rpc/attribute-array-value");
Packit Service 3749ba
	p11_test (test_mechanism_type_array_value, "/rpc/mechanism-type-array-value");
Packit Service 3749ba
	p11_test (test_date_value, "/rpc/date-value");
Packit Service 3749ba
	p11_test (test_date_value_empty, "/rpc/date-value-empty");
Packit Service 3749ba
	p11_test (test_byte_array_value, "/rpc/byte-array-value");
Packit Service 3749ba
	p11_test (test_mechanism_value, "/rpc/mechanism-value");
Packit Service 3749ba
	p11_test (test_message_write, "/rpc/message-write");
Packit Service 3749ba
Packit Service 3749ba
	p11_test (test_initialize_fails_on_client, "/rpc/initialize-fails-on-client");
Packit Service 3749ba
	p11_test (test_initialize_fails_on_server, "/rpc/initialize-fails-on-server");
Packit Service 3749ba
	p11_test (test_initialize, "/rpc/initialize");
Packit Service 3749ba
	p11_test (test_not_initialized, "/rpc/not-initialized");
Packit Service 3749ba
	p11_test (test_transport_fails, "/rpc/transport-fails");
Packit Service 3749ba
	p11_test (test_transport_bad_parse, "/rpc/transport-bad-parse");
Packit Service 3749ba
	p11_test (test_transport_short_error, "/rpc/transport-short-error");
Packit Service 3749ba
	p11_test (test_transport_invalid_error, "/rpc/transport-invalid-error");
Packit Service 3749ba
	p11_test (test_transport_wrong_response, "/rpc/transport-wrong-response");
Packit Service 3749ba
	p11_test (test_transport_bad_contents, "/rpc/transport-bad-contents");
Packit Service 3749ba
	p11_test (test_get_info_stand_in, "/rpc/get-info-stand-in");
Packit Service 3749ba
	p11_test (test_get_slot_list_no_device, "/rpc/get-slot-list-no-device");
Packit Service 3749ba
	p11_test (test_simultaneous_functions, "/rpc/simultaneous-functions");
Packit Service 3749ba
Packit Service 3749ba
#ifdef OS_UNIX
Packit Service 3749ba
	p11_test (test_fork_and_reinitialize, "/rpc/fork-and-reinitialize");
Packit Service 3749ba
#endif
Packit Service 3749ba
Packit Service 3749ba
	test_mock_add_tests ("/rpc");
Packit Service 3749ba
Packit Service 3749ba
	return  p11_test_run (argc, argv);
Packit Service 3749ba
}