Blame gck/gck-mock.c

Packit Service f02b19
/*
Packit Service f02b19
 * gnome-keyring
Packit Service f02b19
 *
Packit Service f02b19
 * Copyright (C) 2010 Stefan Walter
Packit Service f02b19
 *
Packit Service f02b19
 * This program is free software; you can redistribute it and/or modify
Packit Service f02b19
 * it under the terms of the GNU Lesser General Public License as
Packit Service f02b19
 * published by the Free Software Foundation; either version 2.1 of
Packit Service f02b19
 * the License, or (at your option) any later version.
Packit Service f02b19
 *
Packit Service f02b19
 * This program is distributed in the hope that it will be useful, but
Packit Service f02b19
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service f02b19
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service f02b19
 * Lesser General Public License for more details.
Packit Service f02b19
 *
Packit Service f02b19
 * You should have received a copy of the GNU Lesser General Public
Packit Service f02b19
 * License along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit Service f02b19
 */
Packit Service f02b19
Packit Service f02b19
#include "config.h"
Packit Service f02b19
Packit Service f02b19
#include "gck.h"
Packit Service f02b19
#include "gck-mock.h"
Packit Service f02b19
Packit Service f02b19
#include <p11-kit/pkcs11.h>
Packit Service f02b19
#include "pkcs11i.h"
Packit Service f02b19
Packit Service f02b19
#include <glib.h>
Packit Service f02b19
Packit Service f02b19
#include <string.h>
Packit Service f02b19
Packit Service f02b19
/*
Packit Service f02b19
 * This is *NOT* how you'd want to implement a PKCS#11 module. This
Packit Service f02b19
 * fake module simply provides enough for gck library to test against.
Packit Service f02b19
 * It doesn't pass any tests, or behave as expected from a PKCS#11 module.
Packit Service f02b19
 */
Packit Service f02b19
Packit Service f02b19
Packit Service f02b19
static gboolean initialized = FALSE;
Packit Service f02b19
static gchar *the_pin = NULL;
Packit Service f02b19
static gulong n_the_pin = 0;
Packit Service f02b19
Packit Service f02b19
static gboolean logged_in = FALSE;
Packit Service f02b19
static CK_USER_TYPE user_type = 0;
Packit Service f02b19
static CK_FUNCTION_LIST functionList;
Packit Service f02b19
Packit Service f02b19
typedef enum _Operation {
Packit Service f02b19
	OP_FIND = 1,
Packit Service f02b19
	OP_CRYPTO
Packit Service f02b19
} Operation;
Packit Service f02b19
Packit Service f02b19
typedef struct _Session {
Packit Service f02b19
	CK_SESSION_HANDLE handle;
Packit Service f02b19
	CK_SESSION_INFO info;
Packit Service f02b19
	GHashTable *objects;
Packit Service f02b19
Packit Service f02b19
	Operation operation;
Packit Service f02b19
Packit Service f02b19
	/* For find operations */
Packit Service f02b19
	GList *matches;
Packit Service f02b19
Packit Service f02b19
	/* For crypto operations */
Packit Service f02b19
	CK_OBJECT_HANDLE crypto_key;
Packit Service f02b19
	CK_ATTRIBUTE_TYPE crypto_method;
Packit Service f02b19
	CK_MECHANISM_TYPE crypto_mechanism;
Packit Service f02b19
	CK_BBOOL want_context_login;
Packit Service f02b19
Packit Service f02b19
	/* For 'signing' with CKM_MOCK_PREFIX */
Packit Service f02b19
	CK_BYTE sign_prefix[128];
Packit Service f02b19
	CK_ULONG n_sign_prefix;
Packit Service f02b19
} Session;
Packit Service f02b19
Packit Service f02b19
static guint unique_identifier = 100;
Packit Service f02b19
static GHashTable *the_sessions = NULL;
Packit Service f02b19
static GHashTable *the_objects = NULL;
Packit Service f02b19
Packit Service f02b19
enum {
Packit Service f02b19
	PRIVATE_KEY_CAPITALIZE = 3,
Packit Service f02b19
	PUBLIC_KEY_CAPITALIZE = 4,
Packit Service f02b19
	PRIVATE_KEY_PREFIX = 5,
Packit Service f02b19
	PUBLIC_KEY_PREFIX = 6
Packit Service f02b19
};
Packit Service f02b19
Packit Service f02b19
#define SIGNED_PREFIX "signed-prefix:"
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
free_session (gpointer data)
Packit Service f02b19
{
Packit Service f02b19
	Session *sess = (Session*)data;
Packit Service f02b19
	if (sess)
Packit Service f02b19
		g_hash_table_destroy (sess->objects);
Packit Service f02b19
	g_free (sess);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static GckAttributes *
Packit Service f02b19
lookup_object (Session *session,
Packit Service f02b19
               CK_OBJECT_HANDLE hObject,
Packit Service f02b19
               GHashTable **table)
Packit Service f02b19
{
Packit Service f02b19
	GckAttributes *attrs;
Packit Service f02b19
Packit Service f02b19
	attrs = g_hash_table_lookup (the_objects, GUINT_TO_POINTER (hObject));
Packit Service f02b19
	if (attrs) {
Packit Service f02b19
		if (table)
Packit Service f02b19
			*table = the_objects;
Packit Service f02b19
		return attrs;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	attrs = g_hash_table_lookup (session->objects, GUINT_TO_POINTER (hObject));
Packit Service f02b19
	if (attrs) {
Packit Service f02b19
		if (table)
Packit Service f02b19
			*table = session->objects;
Packit Service f02b19
		return attrs;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	return NULL;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_OBJECT_HANDLE
Packit Service f02b19
gck_mock_module_add_object (GckAttributes *attrs)
Packit Service f02b19
{
Packit Service f02b19
	GckBuilder builder;
Packit Service f02b19
	gboolean token;
Packit Service f02b19
	guint handle;
Packit Service f02b19
Packit Service f02b19
	g_return_val_if_fail (the_objects, 0);
Packit Service f02b19
Packit Service f02b19
Packit Service f02b19
	handle = ++unique_identifier;
Packit Service f02b19
	if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token)) {
Packit Service f02b19
		g_return_val_if_fail (token == TRUE, 0);
Packit Service f02b19
		gck_attributes_ref_sink (attrs);
Packit Service f02b19
	} else {
Packit Service f02b19
		gck_builder_init (&builder);
Packit Service f02b19
		gck_builder_add_except (&builder, attrs, CKA_TOKEN, GCK_INVALID);
Packit Service f02b19
		gck_builder_add_boolean (&builder, CKA_TOKEN, TRUE);
Packit Service f02b19
		gck_attributes_unref (attrs);
Packit Service f02b19
		attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
Packit Service f02b19
	}
Packit Service f02b19
	g_hash_table_insert (the_objects, GUINT_TO_POINTER (handle), attrs);
Packit Service f02b19
Packit Service f02b19
	return handle;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
void
Packit Service f02b19
gck_mock_module_enumerate_objects (CK_SESSION_HANDLE handle, GckMockEnumerator func,
Packit Service f02b19
                                   gpointer user_data)
Packit Service f02b19
{
Packit Service f02b19
	GHashTableIter iter;
Packit Service f02b19
	gpointer key;
Packit Service f02b19
	gpointer value;
Packit Service f02b19
	Session *session;
Packit Service f02b19
Packit Service f02b19
	g_assert (the_objects);
Packit Service f02b19
	g_assert (func);
Packit Service f02b19
Packit Service f02b19
	/* Token objects */
Packit Service f02b19
	g_hash_table_iter_init (&iter, the_objects);
Packit Service f02b19
	while (g_hash_table_iter_next (&iter, &key, &value)) {
Packit Service f02b19
		if (!(func) (GPOINTER_TO_UINT (key), value, user_data))
Packit Service f02b19
			return;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	/* session objects */
Packit Service f02b19
	if (handle) {
Packit Service f02b19
		session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (handle));
Packit Service f02b19
		if (session) {
Packit Service f02b19
			g_hash_table_iter_init (&iter, session->objects);
Packit Service f02b19
			while (g_hash_table_iter_next (&iter, &key, &value)) {
Packit Service f02b19
				if (!(func) (GPOINTER_TO_UINT (key), value, user_data))
Packit Service f02b19
					return;
Packit Service f02b19
			}
Packit Service f02b19
		}
Packit Service f02b19
	}
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
typedef struct _FindObject {
Packit Service f02b19
	CK_ATTRIBUTE_PTR attrs;
Packit Service f02b19
	CK_ULONG n_attrs;
Packit Service f02b19
	CK_OBJECT_HANDLE object;
Packit Service f02b19
} FindObject;
Packit Service f02b19
Packit Service f02b19
static gboolean
Packit Service f02b19
enumerate_and_find_object (CK_OBJECT_HANDLE object, GckAttributes *attrs, gpointer user_data)
Packit Service f02b19
{
Packit Service f02b19
	FindObject *ctx = user_data;
Packit Service f02b19
	CK_ATTRIBUTE_PTR match;
Packit Service f02b19
	const GckAttribute *attr;
Packit Service f02b19
	CK_ULONG i;
Packit Service f02b19
Packit Service f02b19
	for (i = 0; i < ctx->n_attrs; ++i) {
Packit Service f02b19
		match = ctx->attrs + i;
Packit Service f02b19
		attr = gck_attributes_find (attrs, match->type);
Packit Service f02b19
		if (!attr)
Packit Service f02b19
			return TRUE; /* Continue */
Packit Service f02b19
Packit Service f02b19
		if (attr->length != match->ulValueLen ||
Packit Service f02b19
		    memcmp (attr->value, match->pValue, attr->length) != 0)
Packit Service f02b19
			return TRUE; /* Continue */
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	ctx->object = object;
Packit Service f02b19
	return FALSE; /* Stop iteration */
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_OBJECT_HANDLE
Packit Service f02b19
gck_mock_module_find_object (CK_SESSION_HANDLE session, CK_ATTRIBUTE_PTR attrs, CK_ULONG n_attrs)
Packit Service f02b19
{
Packit Service f02b19
	FindObject ctx;
Packit Service f02b19
Packit Service f02b19
	ctx.attrs = attrs;
Packit Service f02b19
	ctx.n_attrs = n_attrs;
Packit Service f02b19
	ctx.object = 0;
Packit Service f02b19
Packit Service f02b19
	gck_mock_module_enumerate_objects (session, enumerate_and_find_object, &ctx;;
Packit Service f02b19
Packit Service f02b19
	return ctx.object;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static gboolean
Packit Service f02b19
enumerate_and_count_objects (CK_OBJECT_HANDLE object, GckAttributes *attrs, gpointer user_data)
Packit Service f02b19
{
Packit Service f02b19
	guint *n_objects = user_data;
Packit Service f02b19
	++(*n_objects);
Packit Service f02b19
	return TRUE; /* Continue */
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
guint
Packit Service f02b19
gck_mock_module_count_objects (CK_SESSION_HANDLE session)
Packit Service f02b19
{
Packit Service f02b19
	guint n_objects = 0;
Packit Service f02b19
	gck_mock_module_enumerate_objects (session, enumerate_and_count_objects, &n_objects);
Packit Service f02b19
	return n_objects;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static GckAttributes *
Packit Service f02b19
replace_attributes (GckAttributes *atts,
Packit Service f02b19
                    CK_ATTRIBUTE_PTR attrs,
Packit Service f02b19
                    CK_ULONG n_attrs)
Packit Service f02b19
{
Packit Service f02b19
	GckBuilder builder;
Packit Service f02b19
	CK_ULONG i;
Packit Service f02b19
	CK_ATTRIBUTE_PTR set;
Packit Service f02b19
	gulong *types;
Packit Service f02b19
Packit Service f02b19
	if (!n_attrs)
Packit Service f02b19
		return gck_attributes_ref_sink (atts);
Packit Service f02b19
Packit Service f02b19
	gck_builder_init (&builder);
Packit Service f02b19
	types = g_new0 (gulong, n_attrs);
Packit Service f02b19
	for (i = 0; i < n_attrs; ++i) {
Packit Service f02b19
		set = attrs + i;
Packit Service f02b19
		types[i] = set->type;
Packit Service f02b19
		gck_builder_add_data (&builder, set->type, set->pValue, set->ulValueLen);
Packit Service f02b19
	}
Packit Service f02b19
	gck_builder_add_exceptv (&builder, atts, types, n_attrs);
Packit Service f02b19
	g_free (types);
Packit Service f02b19
	return gck_attributes_ref_sink (gck_builder_end (&builder));
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
void
Packit Service f02b19
gck_mock_module_set_object (CK_OBJECT_HANDLE object, CK_ATTRIBUTE_PTR attrs,
Packit Service f02b19
                            CK_ULONG n_attrs)
Packit Service f02b19
{
Packit Service f02b19
	GckAttributes *atts;
Packit Service f02b19
	GckAttributes *replaced;
Packit Service f02b19
Packit Service f02b19
	g_return_if_fail (object != 0);
Packit Service f02b19
	g_return_if_fail (the_objects);
Packit Service f02b19
Packit Service f02b19
	atts = g_hash_table_lookup (the_objects, GUINT_TO_POINTER (object));
Packit Service f02b19
	g_return_if_fail (atts);
Packit Service f02b19
Packit Service f02b19
	if (!n_attrs)
Packit Service f02b19
		return;
Packit Service f02b19
Packit Service f02b19
	replaced = replace_attributes (atts, attrs, n_attrs);
Packit Service f02b19
	g_hash_table_replace (the_objects, GUINT_TO_POINTER (object), replaced);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
void
Packit Service f02b19
gck_mock_module_set_pin (const gchar *password)
Packit Service f02b19
{
Packit Service f02b19
	g_free (the_pin);
Packit Service f02b19
	the_pin = g_strdup (password);
Packit Service f02b19
	n_the_pin = strlen (password);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_Initialize (CK_VOID_PTR pInitArgs)
Packit Service f02b19
{
Packit Service f02b19
	GckBuilder builder;
Packit Service f02b19
	CK_ULONG value;
Packit Service f02b19
	CK_C_INITIALIZE_ARGS_PTR args;
Packit Service f02b19
Packit Service f02b19
	g_return_val_if_fail (initialized == FALSE, CKR_CRYPTOKI_ALREADY_INITIALIZED);
Packit Service f02b19
Packit Service f02b19
	args = (CK_C_INITIALIZE_ARGS_PTR)pInitArgs;
Packit Service f02b19
	if (args) {
Packit Service f02b19
		g_return_val_if_fail(
Packit Service f02b19
		              (args->CreateMutex == NULL && args->DestroyMutex == NULL &&
Packit Service f02b19
		               args->LockMutex == NULL && args->UnlockMutex == NULL) ||
Packit Service f02b19
		              (args->CreateMutex != NULL && args->DestroyMutex != NULL &&
Packit Service f02b19
		               args->LockMutex != NULL && args->UnlockMutex != NULL),
Packit Service f02b19
		               CKR_ARGUMENTS_BAD);
Packit Service f02b19
Packit Service f02b19
		/* Flags should allow OS locking and os threads */
Packit Service f02b19
		g_return_val_if_fail ((args->flags & CKF_OS_LOCKING_OK), CKR_CANT_LOCK);
Packit Service f02b19
		g_return_val_if_fail ((args->flags & CKF_LIBRARY_CANT_CREATE_OS_THREADS) == 0, CKR_NEED_TO_CREATE_THREADS);
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	the_pin = g_strdup ("booo");
Packit Service f02b19
	n_the_pin = strlen (the_pin);
Packit Service f02b19
	the_sessions = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, free_session);
Packit Service f02b19
	the_objects = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)gck_attributes_unref);
Packit Service f02b19
Packit Service f02b19
	/* Our token object */
Packit Service f02b19
	gck_builder_init (&builder);
Packit Service f02b19
	gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA);
Packit Service f02b19
	gck_builder_add_string (&builder, CKA_LABEL, "TEST LABEL");
Packit Service f02b19
	g_hash_table_insert (the_objects, GUINT_TO_POINTER (2),
Packit Service f02b19
	                     gck_attributes_ref_sink (gck_builder_end (&builder)));
Packit Service f02b19
Packit Service f02b19
	/* Private capitalize key */
Packit Service f02b19
	value = CKM_MOCK_CAPITALIZE;
Packit Service f02b19
	gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY);
Packit Service f02b19
	gck_builder_add_string (&builder, CKA_LABEL, "Private Capitalize Key");
Packit Service f02b19
	gck_builder_add_data (&builder, CKA_ALLOWED_MECHANISMS, (const guchar *)&value, sizeof (value));
Packit Service f02b19
	gck_builder_add_boolean (&builder, CKA_DECRYPT, CK_TRUE);
Packit Service f02b19
	gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_TRUE);
Packit Service f02b19
	gck_builder_add_boolean (&builder, CKA_WRAP, CK_TRUE);
Packit Service f02b19
	gck_builder_add_boolean (&builder, CKA_UNWRAP, CK_TRUE);
Packit Service f02b19
	gck_builder_add_boolean (&builder, CKA_DERIVE, CK_TRUE);
Packit Service f02b19
	gck_builder_add_string (&builder, CKA_VALUE, "value");
Packit Service f02b19
	gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique1");
Packit Service f02b19
	g_hash_table_insert (the_objects, GUINT_TO_POINTER (PRIVATE_KEY_CAPITALIZE),
Packit Service f02b19
	                     gck_attributes_ref_sink (gck_builder_end (&builder)));
Packit Service f02b19
Packit Service f02b19
	/* Public capitalize key */
Packit Service f02b19
	value = CKM_MOCK_CAPITALIZE;
Packit Service f02b19
	gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY);
Packit Service f02b19
	gck_builder_add_string (&builder, CKA_LABEL, "Public Capitalize Key");
Packit Service f02b19
	gck_builder_add_data (&builder, CKA_ALLOWED_MECHANISMS, (const guchar *)&value, sizeof (value));
Packit Service f02b19
	gck_builder_add_boolean (&builder, CKA_ENCRYPT, CK_TRUE);
Packit Service f02b19
	gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_FALSE);
Packit Service f02b19
	gck_builder_add_string (&builder, CKA_VALUE, "value");
Packit Service f02b19
	gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique2");
Packit Service f02b19
	g_hash_table_insert (the_objects, GUINT_TO_POINTER (PUBLIC_KEY_CAPITALIZE), gck_builder_end (&builder));
Packit Service f02b19
Packit Service f02b19
	/* Private prefix key */
Packit Service f02b19
	value = CKM_MOCK_PREFIX;
Packit Service f02b19
	gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY);
Packit Service f02b19
	gck_builder_add_string (&builder, CKA_LABEL, "Private prefix key");
Packit Service f02b19
	gck_builder_add_data (&builder, CKA_ALLOWED_MECHANISMS, (const guchar *)&value, sizeof (value));
Packit Service f02b19
	gck_builder_add_boolean (&builder, CKA_SIGN, CK_TRUE);
Packit Service f02b19
	gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_TRUE);
Packit Service f02b19
	gck_builder_add_boolean (&builder, CKA_ALWAYS_AUTHENTICATE, CK_TRUE);
Packit Service f02b19
	gck_builder_add_string (&builder, CKA_VALUE, "value");
Packit Service f02b19
	gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique3");
Packit Service f02b19
	g_hash_table_insert (the_objects, GUINT_TO_POINTER (PRIVATE_KEY_PREFIX),
Packit Service f02b19
	                     gck_attributes_ref_sink (gck_builder_end (&builder)));
Packit Service f02b19
Packit Service f02b19
	/* Private prefix key */
Packit Service f02b19
	value = CKM_MOCK_PREFIX;
Packit Service f02b19
	gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY);
Packit Service f02b19
	gck_builder_add_string (&builder, CKA_LABEL, "Public prefix key");
Packit Service f02b19
	gck_builder_add_data (&builder, CKA_ALLOWED_MECHANISMS, (const guchar *)&value, sizeof (value));
Packit Service f02b19
	gck_builder_add_boolean (&builder, CKA_VERIFY, CK_TRUE);
Packit Service f02b19
	gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_FALSE);
Packit Service f02b19
	gck_builder_add_string (&builder, CKA_VALUE, "value");
Packit Service f02b19
	gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique4");
Packit Service f02b19
	g_hash_table_insert (the_objects, GUINT_TO_POINTER (PUBLIC_KEY_PREFIX),
Packit Service f02b19
	                     gck_attributes_ref_sink (gck_builder_end (&builder)));
Packit Service f02b19
Packit Service f02b19
	logged_in = FALSE;
Packit Service f02b19
	initialized = TRUE;
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_validate_and_C_Initialize (CK_VOID_PTR pInitArgs)
Packit Service f02b19
{
Packit Service f02b19
	CK_C_INITIALIZE_ARGS_PTR args;
Packit Service f02b19
	void *mutex;
Packit Service f02b19
	CK_RV rv;
Packit Service f02b19
Packit Service f02b19
	args = (CK_C_INITIALIZE_ARGS_PTR)pInitArgs;
Packit Service f02b19
	if (args) {
Packit Service f02b19
		g_assert ((args->CreateMutex) (NULL) == CKR_ARGUMENTS_BAD && "CreateMutex succeeded wrong");
Packit Service f02b19
		g_assert ((args->DestroyMutex) (NULL) == CKR_MUTEX_BAD && "DestroyMutex succeeded wrong");
Packit Service f02b19
		g_assert ((args->LockMutex) (NULL) == CKR_MUTEX_BAD && "LockMutex succeeded wrong");
Packit Service f02b19
		g_assert ((args->UnlockMutex) (NULL) == CKR_MUTEX_BAD && "UnlockMutex succeeded wrong");
Packit Service f02b19
Packit Service f02b19
		/* Try to create an actual mutex */
Packit Service f02b19
		rv = (args->CreateMutex) (&mutex);
Packit Service f02b19
		g_assert (rv == CKR_OK && "CreateMutex g_assert_not_reacheded");
Packit Service f02b19
		g_assert (mutex != NULL && "CreateMutex created null mutex");
Packit Service f02b19
Packit Service f02b19
		/* Try and lock the mutex */
Packit Service f02b19
		rv = (args->LockMutex) (mutex);
Packit Service f02b19
		g_assert (rv == CKR_OK && "LockMutex g_assert_not_reacheded");
Packit Service f02b19
Packit Service f02b19
		/* Try and unlock the mutex */
Packit Service f02b19
		rv = (args->UnlockMutex) (mutex);
Packit Service f02b19
		g_assert (rv == CKR_OK && "UnlockMutex g_assert_not_reacheded");
Packit Service f02b19
Packit Service f02b19
		/* Try and destroy the mutex */
Packit Service f02b19
		rv = (args->DestroyMutex) (mutex);
Packit Service f02b19
		g_assert (rv == CKR_OK && "DestroyMutex g_assert_not_reacheded");
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	return gck_mock_C_Initialize (pInitArgs);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_Finalize (CK_VOID_PTR pReserved)
Packit Service f02b19
{
Packit Service f02b19
	g_return_val_if_fail (pReserved == NULL, CKR_ARGUMENTS_BAD);
Packit Service f02b19
	g_return_val_if_fail (initialized == TRUE, CKR_CRYPTOKI_NOT_INITIALIZED);
Packit Service f02b19
Packit Service f02b19
	initialized = FALSE;
Packit Service f02b19
	logged_in = FALSE;
Packit Service f02b19
	g_hash_table_destroy (the_objects);
Packit Service f02b19
	the_objects = NULL;
Packit Service f02b19
Packit Service f02b19
	g_hash_table_destroy (the_sessions);
Packit Service f02b19
	the_sessions = NULL;
Packit Service f02b19
Packit Service f02b19
	g_free (the_pin);
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static const CK_INFO TEST_INFO = {
Packit Service f02b19
	{ CRYPTOKI_VERSION_MAJOR, CRYPTOKI_VERSION_MINOR },
Packit Service f02b19
	"TEST MANUFACTURER              ",
Packit Service f02b19
	0,
Packit Service f02b19
	"TEST LIBRARY                   ",
Packit Service f02b19
	{ 45, 145 }
Packit Service f02b19
};
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_GetInfo (CK_INFO_PTR pInfo)
Packit Service f02b19
{
Packit Service f02b19
	g_return_val_if_fail (pInfo, CKR_ARGUMENTS_BAD);
Packit Service f02b19
	memcpy (pInfo, &TEST_INFO, sizeof (*pInfo));
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_GetFunctionList (CK_FUNCTION_LIST_PTR_PTR list)
Packit Service f02b19
{
Packit Service f02b19
	g_return_val_if_fail (list, CKR_ARGUMENTS_BAD);
Packit Service f02b19
	*list = &functionList;
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
/*
Packit Service f02b19
 * Two slots
Packit Service f02b19
 *  ONE: token present
Packit Service f02b19
 *  TWO: token not present
Packit Service f02b19
 */
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_GetSlotList (CK_BBOOL tokenPresent, CK_SLOT_ID_PTR pSlotList, CK_ULONG_PTR pulCount)
Packit Service f02b19
{
Packit Service f02b19
	CK_ULONG count;
Packit Service f02b19
Packit Service f02b19
	g_return_val_if_fail (pulCount, CKR_ARGUMENTS_BAD);
Packit Service f02b19
Packit Service f02b19
	count = tokenPresent ? 1 : 2;
Packit Service f02b19
Packit Service f02b19
	/* Application only wants to know the number of slots. */
Packit Service f02b19
	if (pSlotList == NULL) {
Packit Service f02b19
		*pulCount = count;
Packit Service f02b19
		return CKR_OK;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	if (*pulCount < count)
Packit Service f02b19
		g_return_val_if_reached (CKR_BUFFER_TOO_SMALL);
Packit Service f02b19
Packit Service f02b19
	*pulCount = count;
Packit Service f02b19
	pSlotList[0] = GCK_MOCK_SLOT_ONE_ID;
Packit Service f02b19
	if (!tokenPresent)
Packit Service f02b19
		pSlotList[1] = GCK_MOCK_SLOT_TWO_ID;
Packit Service f02b19
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
/* Update gck-mock.h URIs when updating this */
Packit Service f02b19
Packit Service f02b19
static const CK_SLOT_INFO TEST_INFO_ONE = {
Packit Service f02b19
	"TEST SLOT                                                       ",
Packit Service f02b19
	"TEST MANUFACTURER              ",
Packit Service f02b19
	CKF_TOKEN_PRESENT | CKF_REMOVABLE_DEVICE,
Packit Service f02b19
	{ 55, 155 },
Packit Service f02b19
	{ 65, 165 },
Packit Service f02b19
};
Packit Service f02b19
Packit Service f02b19
/* Update gck-mock.h URIs when updating this */
Packit Service f02b19
Packit Service f02b19
static const CK_SLOT_INFO TEST_INFO_TWO = {
Packit Service f02b19
	"TEST SLOT                                                       ",
Packit Service f02b19
	"TEST MANUFACTURER              ",
Packit Service f02b19
	CKF_REMOVABLE_DEVICE,
Packit Service f02b19
	{ 55, 155 },
Packit Service f02b19
	{ 65, 165 },
Packit Service f02b19
};
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_GetSlotInfo (CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo)
Packit Service f02b19
{
Packit Service f02b19
	g_return_val_if_fail (pInfo, CKR_ARGUMENTS_BAD);
Packit Service f02b19
Packit Service f02b19
	if (slotID == GCK_MOCK_SLOT_ONE_ID) {
Packit Service f02b19
		memcpy (pInfo, &TEST_INFO_ONE, sizeof (*pInfo));
Packit Service f02b19
		return CKR_OK;
Packit Service f02b19
	} else if (slotID == GCK_MOCK_SLOT_TWO_ID) {
Packit Service f02b19
		memcpy (pInfo, &TEST_INFO_TWO, sizeof (*pInfo));
Packit Service f02b19
		return CKR_OK;
Packit Service f02b19
	} else {
Packit Service f02b19
		g_return_val_if_reached (CKR_SLOT_ID_INVALID);
Packit Service f02b19
	}
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
/* Update gck-mock.h URIs when updating this */
Packit Service f02b19
Packit Service f02b19
static const CK_TOKEN_INFO TEST_TOKEN_ONE = {
Packit Service f02b19
	"TEST LABEL                      ",
Packit Service f02b19
	"TEST MANUFACTURER               ",
Packit Service f02b19
	"TEST MODEL      ",
Packit Service f02b19
	"TEST SERIAL     ",
Packit Service f02b19
	CKF_LOGIN_REQUIRED | CKF_USER_PIN_INITIALIZED | CKF_CLOCK_ON_TOKEN | CKF_TOKEN_INITIALIZED,
Packit Service f02b19
	1,
Packit Service f02b19
	2,
Packit Service f02b19
	3,
Packit Service f02b19
	4,
Packit Service f02b19
	5,
Packit Service f02b19
	6,
Packit Service f02b19
	7,
Packit Service f02b19
	8,
Packit Service f02b19
	9,
Packit Service f02b19
	10,
Packit Service f02b19
	{ 75, 175 },
Packit Service f02b19
	{ 85, 185 },
Packit Service f02b19
	{ '1', '9', '9', '9', '0', '5', '2', '5', '0', '9', '1', '9', '5', '9', '0', '0' }
Packit Service f02b19
};
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_GetTokenInfo (CK_SLOT_ID slotID, CK_TOKEN_INFO_PTR pInfo)
Packit Service f02b19
{
Packit Service f02b19
	g_return_val_if_fail (pInfo != NULL, CKR_ARGUMENTS_BAD);
Packit Service f02b19
Packit Service f02b19
	if (slotID == GCK_MOCK_SLOT_ONE_ID) {
Packit Service f02b19
		memcpy (pInfo, &TEST_TOKEN_ONE, sizeof (*pInfo));
Packit Service f02b19
		return CKR_OK;
Packit Service f02b19
	} else if (slotID == GCK_MOCK_SLOT_TWO_ID) {
Packit Service f02b19
		return CKR_TOKEN_NOT_PRESENT;
Packit Service f02b19
	} else {
Packit Service f02b19
		g_return_val_if_reached (CKR_SLOT_ID_INVALID);
Packit Service f02b19
	}
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_fail_C_GetTokenInfo (CK_SLOT_ID slotID, CK_TOKEN_INFO_PTR pInfo)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_GENERAL_ERROR;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
/*
Packit Service f02b19
 * TWO mechanisms:
Packit Service f02b19
 *  CKM_MOCK_CAPITALIZE
Packit Service f02b19
 *  CKM_MOCK_PREFIX
Packit Service f02b19
 */
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_GetMechanismList (CK_SLOT_ID slotID, CK_MECHANISM_TYPE_PTR pMechanismList,
Packit Service f02b19
                             CK_ULONG_PTR pulCount)
Packit Service f02b19
{
Packit Service f02b19
	g_return_val_if_fail (slotID == GCK_MOCK_SLOT_ONE_ID, CKR_SLOT_ID_INVALID);
Packit Service f02b19
	g_return_val_if_fail (pulCount, CKR_ARGUMENTS_BAD);
Packit Service f02b19
Packit Service f02b19
	/* Application only wants to know the number of slots. */
Packit Service f02b19
	if (pMechanismList == NULL) {
Packit Service f02b19
		*pulCount = 2;
Packit Service f02b19
		return CKR_OK;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	if (*pulCount != 2)
Packit Service f02b19
		g_return_val_if_reached (CKR_BUFFER_TOO_SMALL);
Packit Service f02b19
Packit Service f02b19
	pMechanismList[0] = CKM_MOCK_CAPITALIZE;
Packit Service f02b19
	pMechanismList[1] = CKM_MOCK_PREFIX;
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static const CK_MECHANISM_INFO TEST_MECH_CAPITALIZE = {
Packit Service f02b19
	512, 4096, 0
Packit Service f02b19
};
Packit Service f02b19
Packit Service f02b19
static const CK_MECHANISM_INFO TEST_MECH_PREFIX = {
Packit Service f02b19
	2048, 2048, 0
Packit Service f02b19
};
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_GetMechanismInfo (CK_SLOT_ID slotID, CK_MECHANISM_TYPE type,
Packit Service f02b19
                             CK_MECHANISM_INFO_PTR pInfo)
Packit Service f02b19
{
Packit Service f02b19
	g_return_val_if_fail (slotID == GCK_MOCK_SLOT_ONE_ID, CKR_SLOT_ID_INVALID);
Packit Service f02b19
	g_return_val_if_fail (pInfo, CKR_ARGUMENTS_BAD);
Packit Service f02b19
Packit Service f02b19
	if (type == CKM_MOCK_CAPITALIZE) {
Packit Service f02b19
		memcpy (pInfo, &TEST_MECH_CAPITALIZE, sizeof (*pInfo));
Packit Service f02b19
		return CKR_OK;
Packit Service f02b19
	} else if (type == CKM_MOCK_PREFIX) {
Packit Service f02b19
		memcpy (pInfo, &TEST_MECH_PREFIX, sizeof (*pInfo));
Packit Service f02b19
		return CKR_OK;
Packit Service f02b19
	} else {
Packit Service f02b19
		g_return_val_if_reached (CKR_MECHANISM_INVALID);
Packit Service f02b19
	}
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_specific_args_C_InitToken (CK_SLOT_ID slotID, CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen,
Packit Service f02b19
                                    CK_UTF8CHAR_PTR pLabel)
Packit Service f02b19
{
Packit Service f02b19
	g_return_val_if_fail (slotID == GCK_MOCK_SLOT_ONE_ID, CKR_SLOT_ID_INVALID);
Packit Service f02b19
Packit Service f02b19
	g_return_val_if_fail (pPin, CKR_PIN_INVALID);
Packit Service f02b19
	g_return_val_if_fail (strlen ("TEST PIN") == ulPinLen, CKR_PIN_INVALID);
Packit Service f02b19
	g_return_val_if_fail (strncmp ((gchar*)pPin, "TEST PIN", ulPinLen) == 0, CKR_PIN_INVALID);
Packit Service f02b19
	g_return_val_if_fail (pLabel != NULL, CKR_PIN_INVALID);
Packit Service f02b19
	g_return_val_if_fail (strcmp ((gchar*)pPin, "TEST LABEL") == 0, CKR_PIN_INVALID);
Packit Service f02b19
Packit Service f02b19
	g_free (the_pin);
Packit Service f02b19
	the_pin = g_strndup ((gchar*)pPin, ulPinLen);
Packit Service f02b19
	n_the_pin = ulPinLen;
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_WaitForSlotEvent (CK_FLAGS flags, CK_SLOT_ID_PTR pSlot, CK_VOID_PTR pReserved)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_OpenSession (CK_SLOT_ID slotID, CK_FLAGS flags, CK_VOID_PTR pApplication,
Packit Service f02b19
                        CK_NOTIFY Notify, CK_SESSION_HANDLE_PTR phSession)
Packit Service f02b19
{
Packit Service f02b19
	Session *sess;
Packit Service f02b19
Packit Service f02b19
	g_return_val_if_fail (slotID == GCK_MOCK_SLOT_ONE_ID || slotID == GCK_MOCK_SLOT_TWO_ID, CKR_SLOT_ID_INVALID);
Packit Service f02b19
	g_return_val_if_fail (phSession != NULL, CKR_ARGUMENTS_BAD);
Packit Service f02b19
	g_return_val_if_fail ((flags & CKF_SERIAL_SESSION) == CKF_SERIAL_SESSION, CKR_SESSION_PARALLEL_NOT_SUPPORTED);
Packit Service f02b19
Packit Service f02b19
	sess = g_new0 (Session, 1);
Packit Service f02b19
	sess->handle = ++unique_identifier;
Packit Service f02b19
	sess->info.flags = flags;
Packit Service f02b19
	sess->info.slotID = slotID;
Packit Service f02b19
	sess->info.state = 0;
Packit Service f02b19
	sess->info.ulDeviceError = 1414;
Packit Service f02b19
	sess->objects = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)gck_attributes_unref);
Packit Service f02b19
	*phSession = sess->handle;
Packit Service f02b19
Packit Service f02b19
	g_hash_table_replace (the_sessions, GUINT_TO_POINTER (sess->handle), sess);
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_fail_C_OpenSession (CK_SLOT_ID slotID, CK_FLAGS flags, CK_VOID_PTR pApplication,
Packit Service f02b19
                             CK_NOTIFY Notify, CK_SESSION_HANDLE_PTR phSession)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_GENERAL_ERROR;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_CloseSession (CK_SESSION_HANDLE hSession)
Packit Service f02b19
{
Packit Service f02b19
	Session *session;
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	g_hash_table_remove (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_CloseAllSessions (CK_SLOT_ID slotID)
Packit Service f02b19
{
Packit Service f02b19
	g_return_val_if_fail (slotID == GCK_MOCK_SLOT_ONE_ID, CKR_SLOT_ID_INVALID);
Packit Service f02b19
Packit Service f02b19
	g_hash_table_remove_all (the_sessions);
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_GetFunctionStatus (CK_SESSION_HANDLE hSession)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_PARALLEL;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_CancelFunction (CK_SESSION_HANDLE hSession)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_PARALLEL;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_GetSessionInfo (CK_SESSION_HANDLE hSession, CK_SESSION_INFO_PTR pInfo)
Packit Service f02b19
{
Packit Service f02b19
	Session *session;
Packit Service f02b19
Packit Service f02b19
	g_return_val_if_fail (pInfo != NULL, CKR_ARGUMENTS_BAD);
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_assert (session != NULL && "No such session found");
Packit Service f02b19
	if (!session)
Packit Service f02b19
		return CKR_SESSION_HANDLE_INVALID;
Packit Service f02b19
Packit Service f02b19
	if (logged_in) {
Packit Service f02b19
		if (session->info.flags & CKF_RW_SESSION)
Packit Service f02b19
			session->info.state = CKS_RW_USER_FUNCTIONS;
Packit Service f02b19
		else
Packit Service f02b19
			session->info.state = CKS_RO_USER_FUNCTIONS;
Packit Service f02b19
	} else {
Packit Service f02b19
		if (session->info.flags & CKF_RW_SESSION)
Packit Service f02b19
			session->info.state = CKS_RW_PUBLIC_SESSION;
Packit Service f02b19
		else
Packit Service f02b19
			session->info.state = CKS_RO_PUBLIC_SESSION;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	memcpy (pInfo, &session->info, sizeof (*pInfo));
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_fail_C_GetSessionInfo (CK_SESSION_HANDLE hSession, CK_SESSION_INFO_PTR pInfo)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_GENERAL_ERROR;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_InitPIN (CK_SESSION_HANDLE hSession, CK_UTF8CHAR_PTR pPin,
Packit Service f02b19
                    CK_ULONG ulPinLen)
Packit Service f02b19
{
Packit Service f02b19
	Session *session;
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	g_free (the_pin);
Packit Service f02b19
	the_pin = g_strndup ((gchar*)pPin, ulPinLen);
Packit Service f02b19
	n_the_pin = ulPinLen;
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_SetPIN (CK_SESSION_HANDLE hSession, CK_UTF8CHAR_PTR pOldPin,
Packit Service f02b19
                   CK_ULONG ulOldLen, CK_UTF8CHAR_PTR pNewPin, CK_ULONG ulNewLen)
Packit Service f02b19
{
Packit Service f02b19
	Session *session;
Packit Service f02b19
	gboolean match;
Packit Service f02b19
	gchar *old;
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	old = g_strndup ((gchar*)pOldPin, ulOldLen);
Packit Service f02b19
	match = old && g_str_equal (old, the_pin);
Packit Service f02b19
	g_free (old);
Packit Service f02b19
Packit Service f02b19
	if (!match)
Packit Service f02b19
		return CKR_PIN_INCORRECT;
Packit Service f02b19
Packit Service f02b19
	g_free (the_pin);
Packit Service f02b19
	the_pin = g_strndup ((gchar*)pNewPin, ulNewLen);
Packit Service f02b19
	n_the_pin = ulNewLen;
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_GetOperationState (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pOperationState,
Packit Service f02b19
                                          CK_ULONG_PTR pulOperationStateLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_SetOperationState (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pOperationState,
Packit Service f02b19
                                          CK_ULONG ulOperationStateLen, CK_OBJECT_HANDLE hEncryptionKey,
Packit Service f02b19
                                          CK_OBJECT_HANDLE hAuthenticationKey)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_Login (CK_SESSION_HANDLE hSession, CK_USER_TYPE userType,
Packit Service f02b19
                  CK_UTF8CHAR_PTR pPin, CK_ULONG pPinLen)
Packit Service f02b19
{
Packit Service f02b19
	Session *session;
Packit Service f02b19
Packit Service f02b19
	g_return_val_if_fail (userType == CKU_SO ||
Packit Service f02b19
	                      userType == CKU_USER ||
Packit Service f02b19
	                      userType == CKU_CONTEXT_SPECIFIC,
Packit Service f02b19
	                      CKR_USER_TYPE_INVALID);
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
	g_return_val_if_fail (logged_in == FALSE, CKR_USER_ALREADY_LOGGED_IN);
Packit Service f02b19
Packit Service f02b19
	if (!pPin)
Packit Service f02b19
		return CKR_PIN_INCORRECT;
Packit Service f02b19
Packit Service f02b19
	if (pPinLen != strlen (the_pin))
Packit Service f02b19
		return CKR_PIN_INCORRECT;
Packit Service f02b19
	if (strncmp ((gchar*)pPin, the_pin, pPinLen) != 0)
Packit Service f02b19
		return CKR_PIN_INCORRECT;
Packit Service f02b19
Packit Service f02b19
	if (userType == CKU_CONTEXT_SPECIFIC) {
Packit Service f02b19
		g_return_val_if_fail (session->want_context_login == TRUE, CKR_OPERATION_NOT_INITIALIZED);
Packit Service f02b19
		session->want_context_login = CK_FALSE;
Packit Service f02b19
	} else {
Packit Service f02b19
		logged_in = TRUE;
Packit Service f02b19
		user_type = userType;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_Logout (CK_SESSION_HANDLE hSession)
Packit Service f02b19
{
Packit Service f02b19
	Session *session;
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_assert (session != NULL && "No such session found");
Packit Service f02b19
	if (!session)
Packit Service f02b19
		return CKR_SESSION_HANDLE_INVALID;
Packit Service f02b19
Packit Service f02b19
	g_assert (logged_in && "Not logged in");
Packit Service f02b19
	logged_in = FALSE;
Packit Service f02b19
	user_type = 0;
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_CreateObject (CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate,
Packit Service f02b19
                         CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phObject)
Packit Service f02b19
{
Packit Service f02b19
	GckBuilder builder;
Packit Service f02b19
	GckAttributes *attrs;
Packit Service f02b19
	Session *session;
Packit Service f02b19
	gboolean token, priv;
Packit Service f02b19
	CK_OBJECT_CLASS klass;
Packit Service f02b19
	CK_OBJECT_HANDLE object;
Packit Service f02b19
	const GckAttribute *attr;
Packit Service f02b19
	CK_ULONG i;
Packit Service f02b19
Packit Service f02b19
	g_return_val_if_fail (phObject, CKR_ARGUMENTS_BAD);
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	gck_builder_init (&builder);
Packit Service f02b19
	for (i = 0; i < ulCount; ++i)
Packit Service f02b19
		gck_builder_add_data (&builder, pTemplate[i].type, pTemplate[i].pValue, pTemplate[i].ulValueLen);
Packit Service f02b19
Packit Service f02b19
	attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
Packit Service f02b19
	if (gck_attributes_find_boolean (attrs, CKA_PRIVATE, &priv) && priv) {
Packit Service f02b19
		if (!logged_in) {
Packit Service f02b19
			gck_attributes_unref (attrs);
Packit Service f02b19
			return CKR_USER_NOT_LOGGED_IN;
Packit Service f02b19
		}
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	/* In order to create a credential we must check CK_VALUE */
Packit Service f02b19
	if (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == CKO_G_CREDENTIAL) {
Packit Service f02b19
		if (gck_attributes_find_ulong (attrs, CKA_G_OBJECT, &object)) {
Packit Service f02b19
			attr = gck_attributes_find (attrs, CKA_VALUE);
Packit Service f02b19
			if (!attr || attr->length != n_the_pin ||
Packit Service f02b19
			    memcmp (attr->value, the_pin, attr->length) != 0) {
Packit Service f02b19
				gck_attributes_unref (attrs);
Packit Service f02b19
				return CKR_PIN_INCORRECT;
Packit Service f02b19
			}
Packit Service f02b19
		}
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	*phObject = ++unique_identifier;
Packit Service f02b19
	if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token)
Packit Service f02b19
		g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phObject), attrs);
Packit Service f02b19
	else
Packit Service f02b19
		g_hash_table_insert (session->objects, GUINT_TO_POINTER (*phObject), attrs);
Packit Service f02b19
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_fail_C_CreateObject (CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate,
Packit Service f02b19
                              CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phObject)
Packit Service f02b19
{
Packit Service f02b19
	/* Always fails */
Packit Service f02b19
	return CKR_FUNCTION_FAILED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_CopyObject (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject,
Packit Service f02b19
                                   CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount,
Packit Service f02b19
                                   CK_OBJECT_HANDLE_PTR phNewObject)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_DestroyObject (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject)
Packit Service f02b19
{
Packit Service f02b19
	GckAttributes *attrs;
Packit Service f02b19
	Session *session;
Packit Service f02b19
	gboolean priv;
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	attrs = lookup_object (session, hObject, NULL);
Packit Service f02b19
	g_return_val_if_fail (attrs, CKR_OBJECT_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	if (gck_attributes_find_boolean (attrs, CKA_PRIVATE, &priv) && priv) {
Packit Service f02b19
		if (!logged_in)
Packit Service f02b19
			return CKR_USER_NOT_LOGGED_IN;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	g_hash_table_remove (the_objects, GUINT_TO_POINTER (hObject));
Packit Service f02b19
	g_hash_table_remove (session->objects, GUINT_TO_POINTER (hObject));
Packit Service f02b19
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_GetObjectSize (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject,
Packit Service f02b19
                                      CK_ULONG_PTR pulSize)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_GetAttributeValue (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject,
Packit Service f02b19
                              CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount)
Packit Service f02b19
{
Packit Service f02b19
	CK_ATTRIBUTE_PTR result;
Packit Service f02b19
	CK_RV ret = CKR_OK;
Packit Service f02b19
	GckAttributes *attrs;
Packit Service f02b19
	const GckAttribute *attr;
Packit Service f02b19
	Session *session;
Packit Service f02b19
	CK_ULONG i;
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	if (session == NULL)
Packit Service f02b19
		return CKR_SESSION_HANDLE_INVALID;
Packit Service f02b19
Packit Service f02b19
	attrs = lookup_object (session, hObject, NULL);
Packit Service f02b19
	if (!attrs)
Packit Service f02b19
		return CKR_OBJECT_HANDLE_INVALID;
Packit Service f02b19
Packit Service f02b19
	for (i = 0; i < ulCount; ++i) {
Packit Service f02b19
		result = pTemplate + i;
Packit Service f02b19
		attr = gck_attributes_find (attrs, result->type);
Packit Service f02b19
		if (!attr) {
Packit Service f02b19
			result->ulValueLen = (CK_ULONG)-1;
Packit Service f02b19
			ret = CKR_ATTRIBUTE_TYPE_INVALID;
Packit Service f02b19
			continue;
Packit Service f02b19
		}
Packit Service f02b19
Packit Service f02b19
		if (!result->pValue) {
Packit Service f02b19
			result->ulValueLen = attr->length;
Packit Service f02b19
			continue;
Packit Service f02b19
		}
Packit Service f02b19
Packit Service f02b19
		if (result->ulValueLen >= attr->length) {
Packit Service f02b19
			memcpy (result->pValue, attr->value, attr->length);
Packit Service f02b19
			continue;
Packit Service f02b19
		}
Packit Service f02b19
Packit Service f02b19
		result->ulValueLen = (CK_ULONG)-1;
Packit Service f02b19
		ret = CKR_BUFFER_TOO_SMALL;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	return ret;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_fail_C_GetAttributeValue (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject,
Packit Service f02b19
                                   CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_FAILED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_SetAttributeValue (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject,
Packit Service f02b19
                              CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount)
Packit Service f02b19
{
Packit Service f02b19
	Session *session;
Packit Service f02b19
	GckAttributes *attrs;
Packit Service f02b19
	GckAttributes *replaced;
Packit Service f02b19
	GHashTable *table;
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	attrs = lookup_object (session, hObject, &table);
Packit Service f02b19
	g_return_val_if_fail (attrs, CKR_OBJECT_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	replaced = replace_attributes (attrs, pTemplate, ulCount);
Packit Service f02b19
	g_hash_table_replace (table, GUINT_TO_POINTER (hObject), replaced);
Packit Service f02b19
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
typedef struct _FindObjects {
Packit Service f02b19
	CK_ATTRIBUTE_PTR template;
Packit Service f02b19
	CK_ULONG count;
Packit Service f02b19
	Session *session;
Packit Service f02b19
} FindObjects;
Packit Service f02b19
Packit Service f02b19
static gboolean
Packit Service f02b19
enumerate_and_find_objects (CK_OBJECT_HANDLE object, GckAttributes *attrs, gpointer user_data)
Packit Service f02b19
{
Packit Service f02b19
	FindObjects *ctx = user_data;
Packit Service f02b19
	CK_ATTRIBUTE_PTR match;
Packit Service f02b19
	const GckAttribute *attr;
Packit Service f02b19
	CK_ULONG i;
Packit Service f02b19
Packit Service f02b19
	for (i = 0; i < ctx->count; ++i) {
Packit Service f02b19
		match = ctx->template + i;
Packit Service f02b19
		attr = gck_attributes_find (attrs, match->type);
Packit Service f02b19
		if (!attr)
Packit Service f02b19
			return TRUE; /* Continue */
Packit Service f02b19
Packit Service f02b19
		if (attr->length != match->ulValueLen ||
Packit Service f02b19
		    memcmp (attr->value, match->pValue, attr->length) != 0)
Packit Service f02b19
			return TRUE; /* Continue */
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	ctx->session->matches = g_list_prepend (ctx->session->matches, GUINT_TO_POINTER (object));
Packit Service f02b19
	return TRUE; /* Continue */
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_FindObjectsInit (CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate,
Packit Service f02b19
                            CK_ULONG ulCount)
Packit Service f02b19
{
Packit Service f02b19
	Session *session;
Packit Service f02b19
	FindObjects ctx;
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	/* Starting an operation, cancels any previous one */
Packit Service f02b19
	if (session->operation != 0)
Packit Service f02b19
		session->operation = 0;
Packit Service f02b19
Packit Service f02b19
	session->operation = OP_FIND;
Packit Service f02b19
Packit Service f02b19
	ctx.template = pTemplate;
Packit Service f02b19
	ctx.count = ulCount;
Packit Service f02b19
	ctx.session = session;
Packit Service f02b19
Packit Service f02b19
	gck_mock_module_enumerate_objects (hSession, enumerate_and_find_objects, &ctx;;
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_fail_C_FindObjects (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE_PTR phObject,
Packit Service f02b19
                             CK_ULONG ulMaxObjectCount, CK_ULONG_PTR pulObjectCount)
Packit Service f02b19
{
Packit Service f02b19
	/* Always fails */
Packit Service f02b19
	return CKR_FUNCTION_FAILED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_FindObjects (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE_PTR phObject,
Packit Service f02b19
                        CK_ULONG ulMaxObjectCount, CK_ULONG_PTR pulObjectCount)
Packit Service f02b19
{
Packit Service f02b19
	Session *session;
Packit Service f02b19
Packit Service f02b19
	g_return_val_if_fail (phObject, CKR_ARGUMENTS_BAD);
Packit Service f02b19
	g_return_val_if_fail (pulObjectCount, CKR_ARGUMENTS_BAD);
Packit Service f02b19
	g_return_val_if_fail (ulMaxObjectCount != 0, CKR_ARGUMENTS_BAD);
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
	g_return_val_if_fail (session->operation == OP_FIND, CKR_OPERATION_NOT_INITIALIZED);
Packit Service f02b19
Packit Service f02b19
	*pulObjectCount = 0;
Packit Service f02b19
	while (ulMaxObjectCount > 0 && session->matches) {
Packit Service f02b19
		*phObject = GPOINTER_TO_UINT (session->matches->data);
Packit Service f02b19
		++phObject;
Packit Service f02b19
		--ulMaxObjectCount;
Packit Service f02b19
		++(*pulObjectCount);
Packit Service f02b19
		session->matches = g_list_remove (session->matches, session->matches->data);
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_FindObjectsFinal (CK_SESSION_HANDLE hSession)
Packit Service f02b19
{
Packit Service f02b19
Packit Service f02b19
	Session *session;
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
	g_return_val_if_fail (session->operation == OP_FIND, CKR_OPERATION_NOT_INITIALIZED);
Packit Service f02b19
Packit Service f02b19
	session->operation = 0;
Packit Service f02b19
	g_list_free (session->matches);
Packit Service f02b19
	session->matches = NULL;
Packit Service f02b19
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_EncryptInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
Packit Service f02b19
                        CK_OBJECT_HANDLE hKey)
Packit Service f02b19
{
Packit Service f02b19
	Session *session;
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	/* Starting an operation, cancels any previous one */
Packit Service f02b19
	if (session->operation != 0)
Packit Service f02b19
		session->operation = 0;
Packit Service f02b19
Packit Service f02b19
	g_assert (pMechanism);
Packit Service f02b19
	g_assert (pMechanism->mechanism == CKM_MOCK_CAPITALIZE);
Packit Service f02b19
	g_assert (hKey == PUBLIC_KEY_CAPITALIZE);
Packit Service f02b19
Packit Service f02b19
	session->operation = OP_CRYPTO;
Packit Service f02b19
	session->crypto_method = CKA_ENCRYPT;
Packit Service f02b19
	session->crypto_mechanism = CKM_MOCK_CAPITALIZE;
Packit Service f02b19
	session->crypto_key = hKey;
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_Encrypt (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen,
Packit Service f02b19
                    CK_BYTE_PTR pEncryptedData, CK_ULONG_PTR pulEncryptedDataLen)
Packit Service f02b19
{
Packit Service f02b19
	Session *session;
Packit Service f02b19
	CK_ULONG i;
Packit Service f02b19
Packit Service f02b19
	g_return_val_if_fail (pData, CKR_DATA_INVALID);
Packit Service f02b19
	g_return_val_if_fail (pulEncryptedDataLen, CKR_ARGUMENTS_BAD);
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
	g_return_val_if_fail (session->operation == OP_CRYPTO, CKR_OPERATION_NOT_INITIALIZED);
Packit Service f02b19
	g_return_val_if_fail (session->crypto_method == CKA_ENCRYPT, CKR_OPERATION_NOT_INITIALIZED);
Packit Service f02b19
Packit Service f02b19
	g_assert (session->crypto_mechanism == CKM_MOCK_CAPITALIZE);
Packit Service f02b19
	g_assert (session->crypto_key == PUBLIC_KEY_CAPITALIZE);
Packit Service f02b19
Packit Service f02b19
	if (!pEncryptedData) {
Packit Service f02b19
		*pulEncryptedDataLen = ulDataLen;
Packit Service f02b19
		return CKR_OK;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	if (*pulEncryptedDataLen < ulDataLen) {
Packit Service f02b19
		*pulEncryptedDataLen = ulDataLen;
Packit Service f02b19
		return CKR_BUFFER_TOO_SMALL;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	for (i = 0; i < ulDataLen; ++i)
Packit Service f02b19
		pEncryptedData[i] = g_ascii_toupper (pData[i]);
Packit Service f02b19
	*pulEncryptedDataLen = ulDataLen;
Packit Service f02b19
Packit Service f02b19
	session->operation = 0;
Packit Service f02b19
	session->crypto_method = 0;
Packit Service f02b19
	session->crypto_mechanism = 0;
Packit Service f02b19
	session->crypto_key = 0;
Packit Service f02b19
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_EncryptUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart,
Packit Service f02b19
                                      CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart,
Packit Service f02b19
                                      CK_ULONG_PTR pulEncryptedPartLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_EncryptFinal (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pLastEncryptedPart,
Packit Service f02b19
                                     CK_ULONG_PTR pulLastEncryptedPartLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_DecryptInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
Packit Service f02b19
                        CK_OBJECT_HANDLE hKey)
Packit Service f02b19
{
Packit Service f02b19
	Session *session;
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	/* Starting an operation, cancels any previous one */
Packit Service f02b19
	if (session->operation != 0)
Packit Service f02b19
		session->operation = 0;
Packit Service f02b19
Packit Service f02b19
	g_assert (pMechanism);
Packit Service f02b19
	g_assert (pMechanism->mechanism == CKM_MOCK_CAPITALIZE);
Packit Service f02b19
	g_assert (hKey == PRIVATE_KEY_CAPITALIZE);
Packit Service f02b19
Packit Service f02b19
	session->operation = OP_CRYPTO;
Packit Service f02b19
	session->crypto_method = CKA_DECRYPT;
Packit Service f02b19
	session->crypto_mechanism = CKM_MOCK_CAPITALIZE;
Packit Service f02b19
	session->crypto_key = hKey;
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_Decrypt (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedData,
Packit Service f02b19
                    CK_ULONG ulEncryptedDataLen, CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen)
Packit Service f02b19
{
Packit Service f02b19
	Session *session;
Packit Service f02b19
	CK_ULONG i;
Packit Service f02b19
Packit Service f02b19
	g_return_val_if_fail (pEncryptedData, CKR_ENCRYPTED_DATA_INVALID);
Packit Service f02b19
	g_return_val_if_fail (pulDataLen, CKR_ARGUMENTS_BAD);
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
	g_return_val_if_fail (session->operation == OP_CRYPTO, CKR_OPERATION_NOT_INITIALIZED);
Packit Service f02b19
	g_return_val_if_fail (session->crypto_method == CKA_DECRYPT, CKR_OPERATION_NOT_INITIALIZED);
Packit Service f02b19
Packit Service f02b19
	g_assert (session->crypto_method == CKA_DECRYPT);
Packit Service f02b19
	g_assert (session->crypto_mechanism == CKM_MOCK_CAPITALIZE);
Packit Service f02b19
	g_assert (session->crypto_key == PRIVATE_KEY_CAPITALIZE);
Packit Service f02b19
Packit Service f02b19
	if (!pData) {
Packit Service f02b19
		*pulDataLen = ulEncryptedDataLen;
Packit Service f02b19
		return CKR_OK;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	if (*pulDataLen < ulEncryptedDataLen) {
Packit Service f02b19
		*pulDataLen = ulEncryptedDataLen;
Packit Service f02b19
		return CKR_BUFFER_TOO_SMALL;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	for (i = 0; i < ulEncryptedDataLen; ++i)
Packit Service f02b19
		pData[i] = g_ascii_tolower (pEncryptedData[i]);
Packit Service f02b19
	*pulDataLen = ulEncryptedDataLen;
Packit Service f02b19
Packit Service f02b19
	session->operation = 0;
Packit Service f02b19
	session->crypto_method = 0;
Packit Service f02b19
	session->crypto_mechanism = 0;
Packit Service f02b19
	session->crypto_key = 0;
Packit Service f02b19
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_DecryptUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedPart,
Packit Service f02b19
                                      CK_ULONG ulEncryptedPartLen, CK_BYTE_PTR pPart, CK_ULONG_PTR pulPartLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_DecryptFinal (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pLastPart,
Packit Service f02b19
                                     CK_ULONG_PTR pulLastPartLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_DigestInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_Digest (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen,
Packit Service f02b19
                               CK_BYTE_PTR pDigest, CK_ULONG_PTR pulDigestLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_DigestUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_DigestKey (CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hKey)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_DigestFinal (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pDigest,
Packit Service f02b19
                                    CK_ULONG_PTR pulDigestLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_SignInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
Packit Service f02b19
                     CK_OBJECT_HANDLE hKey)
Packit Service f02b19
{
Packit Service f02b19
	Session *session;
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	/* Starting an operation, cancels any previous one */
Packit Service f02b19
	if (session->operation != 0)
Packit Service f02b19
		session->operation = 0;
Packit Service f02b19
Packit Service f02b19
	g_assert (pMechanism);
Packit Service f02b19
	g_assert (pMechanism->mechanism == CKM_MOCK_PREFIX);
Packit Service f02b19
	g_assert (hKey == PRIVATE_KEY_PREFIX);
Packit Service f02b19
Packit Service f02b19
	session->operation = OP_CRYPTO;
Packit Service f02b19
	session->crypto_method = CKA_SIGN;
Packit Service f02b19
	session->crypto_mechanism = CKM_MOCK_PREFIX;
Packit Service f02b19
	session->crypto_key = hKey;
Packit Service f02b19
Packit Service f02b19
	if (pMechanism->pParameter) {
Packit Service f02b19
		g_assert (pMechanism->ulParameterLen < sizeof (session->sign_prefix));
Packit Service f02b19
		memcpy (session->sign_prefix, pMechanism->pParameter, pMechanism->ulParameterLen);
Packit Service f02b19
		session->n_sign_prefix = pMechanism->ulParameterLen;
Packit Service f02b19
	} else {
Packit Service f02b19
		g_assert (strlen (SIGNED_PREFIX) + 1 < sizeof (session->sign_prefix));
Packit Service f02b19
		strcpy ((gchar*)session->sign_prefix, SIGNED_PREFIX);
Packit Service f02b19
		session->n_sign_prefix = strlen (SIGNED_PREFIX);
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	/* The private key has CKA_ALWAYS_AUTHENTICATE above */
Packit Service f02b19
	session->want_context_login = CK_TRUE;
Packit Service f02b19
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_Sign (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen,
Packit Service f02b19
                 CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen)
Packit Service f02b19
{
Packit Service f02b19
	Session *session;
Packit Service f02b19
	CK_ULONG length;
Packit Service f02b19
Packit Service f02b19
	g_return_val_if_fail (pData, CKR_DATA_INVALID);
Packit Service f02b19
	g_return_val_if_fail (pulSignatureLen, CKR_ARGUMENTS_BAD);
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
	g_return_val_if_fail (session->operation == OP_CRYPTO, CKR_OPERATION_NOT_INITIALIZED);
Packit Service f02b19
	g_return_val_if_fail (session->crypto_method == CKA_SIGN, CKR_OPERATION_NOT_INITIALIZED);
Packit Service f02b19
Packit Service f02b19
	if (session->want_context_login)
Packit Service f02b19
		return CKR_USER_NOT_LOGGED_IN;
Packit Service f02b19
Packit Service f02b19
	g_assert (session->crypto_method == CKA_SIGN);
Packit Service f02b19
	g_assert (session->crypto_mechanism == CKM_MOCK_PREFIX);
Packit Service f02b19
	g_assert (session->crypto_key == PRIVATE_KEY_PREFIX);
Packit Service f02b19
Packit Service f02b19
	length = session->n_sign_prefix + ulDataLen;
Packit Service f02b19
Packit Service f02b19
	if (!pSignature) {
Packit Service f02b19
		*pulSignatureLen = length;
Packit Service f02b19
		return CKR_OK;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	if (*pulSignatureLen < length) {
Packit Service f02b19
		*pulSignatureLen = length;
Packit Service f02b19
		return CKR_BUFFER_TOO_SMALL;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	memcpy (pSignature, session->sign_prefix, session->n_sign_prefix);
Packit Service f02b19
	memcpy (pSignature + session->n_sign_prefix, pData, ulDataLen);
Packit Service f02b19
	*pulSignatureLen = length;
Packit Service f02b19
Packit Service f02b19
	session->operation = 0;
Packit Service f02b19
	session->crypto_method = 0;
Packit Service f02b19
	session->crypto_mechanism = 0;
Packit Service f02b19
	session->crypto_key = 0;
Packit Service f02b19
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_SignUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_SignFinal (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature,
Packit Service f02b19
                                  CK_ULONG_PTR pulSignatureLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_SignRecoverInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
Packit Service f02b19
                                        CK_OBJECT_HANDLE hKey)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_SignRecover (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen,
Packit Service f02b19
                                    CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_VerifyInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
Packit Service f02b19
                       CK_OBJECT_HANDLE hKey)
Packit Service f02b19
{
Packit Service f02b19
	Session *session;
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	/* Starting an operation, cancels any previous one */
Packit Service f02b19
	if (session->operation != 0)
Packit Service f02b19
		session->operation = 0;
Packit Service f02b19
Packit Service f02b19
	g_assert (pMechanism);
Packit Service f02b19
	g_assert (pMechanism->mechanism == CKM_MOCK_PREFIX);
Packit Service f02b19
	g_assert (hKey == PUBLIC_KEY_PREFIX);
Packit Service f02b19
Packit Service f02b19
	session->operation = OP_CRYPTO;
Packit Service f02b19
	session->crypto_method = CKA_VERIFY;
Packit Service f02b19
	session->crypto_mechanism = CKM_MOCK_PREFIX;
Packit Service f02b19
	session->crypto_key = hKey;
Packit Service f02b19
Packit Service f02b19
	if (pMechanism->pParameter) {
Packit Service f02b19
		g_assert (pMechanism->ulParameterLen < sizeof (session->sign_prefix));
Packit Service f02b19
		memcpy (session->sign_prefix, pMechanism->pParameter, pMechanism->ulParameterLen);
Packit Service f02b19
		session->n_sign_prefix = pMechanism->ulParameterLen;
Packit Service f02b19
	} else {
Packit Service f02b19
		g_assert (strlen (SIGNED_PREFIX) + 1 < sizeof (session->sign_prefix));
Packit Service f02b19
		strcpy ((gchar*)session->sign_prefix, SIGNED_PREFIX);
Packit Service f02b19
		session->n_sign_prefix = strlen (SIGNED_PREFIX);
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_C_Verify (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen,
Packit Service f02b19
                   CK_BYTE_PTR pSignature, CK_ULONG ulSignatureLen)
Packit Service f02b19
{
Packit Service f02b19
	Session *session;
Packit Service f02b19
	CK_ULONG length;
Packit Service f02b19
Packit Service f02b19
	g_return_val_if_fail (pData, CKR_DATA_INVALID);
Packit Service f02b19
	g_return_val_if_fail (pSignature, CKR_ARGUMENTS_BAD);
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
	g_return_val_if_fail (session->operation == OP_CRYPTO, CKR_OPERATION_NOT_INITIALIZED);
Packit Service f02b19
	g_return_val_if_fail (session->crypto_method == CKA_VERIFY, CKR_OPERATION_NOT_INITIALIZED);
Packit Service f02b19
Packit Service f02b19
	g_assert (session->crypto_method == CKA_VERIFY);
Packit Service f02b19
	g_assert (session->crypto_mechanism == CKM_MOCK_PREFIX);
Packit Service f02b19
	g_assert (session->crypto_key == PUBLIC_KEY_PREFIX);
Packit Service f02b19
Packit Service f02b19
	length = session->n_sign_prefix + ulDataLen;
Packit Service f02b19
Packit Service f02b19
	if (ulSignatureLen < length) {
Packit Service f02b19
		g_assert (FALSE);
Packit Service f02b19
		return CKR_SIGNATURE_LEN_RANGE;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	if (memcmp (pSignature, session->sign_prefix, session->n_sign_prefix) == 0 &&
Packit Service f02b19
	    memcmp (pSignature + session->n_sign_prefix, pData, ulDataLen) == 0)
Packit Service f02b19
		return CKR_OK;
Packit Service f02b19
Packit Service f02b19
	return CKR_SIGNATURE_INVALID;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_VerifyUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_VerifyFinal (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature,
Packit Service f02b19
                                    CK_ULONG pulSignatureLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_VerifyRecoverInit (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
Packit Service f02b19
                                          CK_OBJECT_HANDLE hKey)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_VerifyRecover (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature,
Packit Service f02b19
                                      CK_ULONG pulSignatureLen, CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_DigestEncryptUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart,
Packit Service f02b19
                                            CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart,
Packit Service f02b19
                                            CK_ULONG_PTR ulEncryptedPartLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_DecryptDigestUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedPart,
Packit Service f02b19
                                            CK_ULONG ulEncryptedPartLen, CK_BYTE_PTR pPart,
Packit Service f02b19
                                            CK_ULONG_PTR pulPartLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_SignEncryptUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart,
Packit Service f02b19
                                          CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart,
Packit Service f02b19
                                          CK_ULONG_PTR ulEncryptedPartLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_DecryptVerifyUpdate (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedPart,
Packit Service f02b19
                                            CK_ULONG ulEncryptedPartLen, CK_BYTE_PTR pPart,
Packit Service f02b19
                                            CK_ULONG_PTR pulPartLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_GenerateKey (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
Packit Service f02b19
                                    CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount,
Packit Service f02b19
                                    CK_OBJECT_HANDLE_PTR phKey)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_GenerateKeyPair (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
Packit Service f02b19
                                        CK_ATTRIBUTE_PTR pPublicKeyTemplate, CK_ULONG ulPublicKeyAttributeCount,
Packit Service f02b19
                                        CK_ATTRIBUTE_PTR pPrivateKeyTemplate, CK_ULONG ulPrivateKeyAttributeCount,
Packit Service f02b19
                                        CK_OBJECT_HANDLE_PTR phPublicKey, CK_OBJECT_HANDLE_PTR phPrivateKey)
Packit Service f02b19
{
Packit Service f02b19
	GckBuilder builder;
Packit Service f02b19
	GckAttributes *attrs;
Packit Service f02b19
	Session *session;
Packit Service f02b19
	gboolean token;
Packit Service f02b19
	CK_ULONG i;
Packit Service f02b19
Packit Service f02b19
	g_return_val_if_fail (pMechanism, CKR_MECHANISM_INVALID);
Packit Service f02b19
	g_return_val_if_fail (pPublicKeyTemplate, CKR_TEMPLATE_INCOMPLETE);
Packit Service f02b19
	g_return_val_if_fail (ulPublicKeyAttributeCount, CKR_TEMPLATE_INCOMPLETE);
Packit Service f02b19
	g_return_val_if_fail (pPrivateKeyTemplate, CKR_TEMPLATE_INCOMPLETE);
Packit Service f02b19
	g_return_val_if_fail (ulPrivateKeyAttributeCount, CKR_TEMPLATE_INCOMPLETE);
Packit Service f02b19
	g_return_val_if_fail (phPublicKey, CKR_ARGUMENTS_BAD);
Packit Service f02b19
	g_return_val_if_fail (phPrivateKey, CKR_ARGUMENTS_BAD);
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	if (pMechanism->mechanism != CKM_MOCK_GENERATE)
Packit Service f02b19
		return CKR_MECHANISM_INVALID;
Packit Service f02b19
Packit Service f02b19
	if (!pMechanism->pParameter || pMechanism->ulParameterLen != 9 ||
Packit Service f02b19
	    memcmp (pMechanism->pParameter, "generate", 9) != 0)
Packit Service f02b19
		g_return_val_if_reached (CKR_MECHANISM_PARAM_INVALID);
Packit Service f02b19
Packit Service f02b19
	gck_builder_init (&builder);
Packit Service f02b19
	gck_builder_add_string (&builder, CKA_VALUE, "generated");
Packit Service f02b19
	for (i = 0; i < ulPublicKeyAttributeCount; ++i)
Packit Service f02b19
		gck_builder_add_data (&builder, pPublicKeyTemplate[i].type,
Packit Service f02b19
		                         pPublicKeyTemplate[i].pValue,
Packit Service f02b19
		                         pPublicKeyTemplate[i].ulValueLen);
Packit Service f02b19
	*phPublicKey = ++unique_identifier;
Packit Service f02b19
	attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
Packit Service f02b19
	if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token)
Packit Service f02b19
		g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phPublicKey), attrs);
Packit Service f02b19
	else
Packit Service f02b19
		g_hash_table_insert (session->objects, GUINT_TO_POINTER (*phPublicKey), attrs);
Packit Service f02b19
Packit Service f02b19
	gck_builder_init (&builder);
Packit Service f02b19
	gck_builder_add_string (&builder, CKA_VALUE, "generated");
Packit Service f02b19
	for (i = 0; i < ulPrivateKeyAttributeCount; ++i)
Packit Service f02b19
		gck_builder_add_data (&builder, pPrivateKeyTemplate[i].type,
Packit Service f02b19
		                         pPrivateKeyTemplate[i].pValue,
Packit Service f02b19
		                         pPrivateKeyTemplate[i].ulValueLen);
Packit Service f02b19
	*phPrivateKey = ++unique_identifier;
Packit Service f02b19
	attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
Packit Service f02b19
	if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token)
Packit Service f02b19
		g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phPrivateKey), attrs);
Packit Service f02b19
	else
Packit Service f02b19
		g_hash_table_insert (session->objects, GUINT_TO_POINTER (*phPrivateKey), attrs);
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_WrapKey (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
Packit Service f02b19
                                CK_OBJECT_HANDLE hWrappingKey, CK_OBJECT_HANDLE hKey,
Packit Service f02b19
                                CK_BYTE_PTR pWrappedKey, CK_ULONG_PTR pulWrappedKeyLen)
Packit Service f02b19
{
Packit Service f02b19
	GckAttributes *attrs;
Packit Service f02b19
	const GckAttribute *attr;
Packit Service f02b19
	Session *session;
Packit Service f02b19
Packit Service f02b19
	g_return_val_if_fail (pMechanism, CKR_MECHANISM_INVALID);
Packit Service f02b19
	g_return_val_if_fail (hWrappingKey, CKR_OBJECT_HANDLE_INVALID);
Packit Service f02b19
	g_return_val_if_fail (hKey, CKR_OBJECT_HANDLE_INVALID);
Packit Service f02b19
	g_return_val_if_fail (pulWrappedKeyLen, CKR_WRAPPED_KEY_LEN_RANGE);
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	attrs = lookup_object (session, hWrappingKey, NULL);
Packit Service f02b19
	g_return_val_if_fail (attrs, CKR_WRAPPING_KEY_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	attrs = lookup_object (session, hKey, NULL);
Packit Service f02b19
	g_return_val_if_fail (attrs, CKR_WRAPPED_KEY_INVALID);
Packit Service f02b19
Packit Service f02b19
	if (pMechanism->mechanism != CKM_MOCK_WRAP)
Packit Service f02b19
		return CKR_MECHANISM_INVALID;
Packit Service f02b19
Packit Service f02b19
	if (pMechanism->pParameter) {
Packit Service f02b19
		if (pMechanism->ulParameterLen != 4 ||
Packit Service f02b19
		    memcmp (pMechanism->pParameter, "wrap", 4) != 0)
Packit Service f02b19
			g_return_val_if_reached (CKR_MECHANISM_PARAM_INVALID);
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	attr = gck_attributes_find (attrs, CKA_VALUE);
Packit Service f02b19
	if (attr == NULL)
Packit Service f02b19
		return CKR_WRAPPED_KEY_INVALID;
Packit Service f02b19
Packit Service f02b19
	if (!pWrappedKey) {
Packit Service f02b19
		*pulWrappedKeyLen = attr->length;
Packit Service f02b19
		return CKR_OK;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	if (*pulWrappedKeyLen < attr->length) {
Packit Service f02b19
		*pulWrappedKeyLen = attr->length;
Packit Service f02b19
		return CKR_BUFFER_TOO_SMALL;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	memcpy (pWrappedKey, attr->value, attr->length);
Packit Service f02b19
	*pulWrappedKeyLen = attr->length;
Packit Service f02b19
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_UnwrapKey (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
Packit Service f02b19
                                  CK_OBJECT_HANDLE hUnwrappingKey, CK_BYTE_PTR pWrappedKey,
Packit Service f02b19
                                  CK_ULONG ulWrappedKeyLen, CK_ATTRIBUTE_PTR pTemplate,
Packit Service f02b19
                                  CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phKey)
Packit Service f02b19
{
Packit Service f02b19
	GckBuilder builder;
Packit Service f02b19
	GckAttributes *attrs;
Packit Service f02b19
	Session *session;
Packit Service f02b19
	gboolean token;
Packit Service f02b19
	CK_ULONG i;
Packit Service f02b19
Packit Service f02b19
	g_return_val_if_fail (pMechanism, CKR_MECHANISM_INVALID);
Packit Service f02b19
	g_return_val_if_fail (hUnwrappingKey, CKR_WRAPPING_KEY_HANDLE_INVALID);
Packit Service f02b19
	g_return_val_if_fail (pWrappedKey, CKR_WRAPPED_KEY_INVALID);
Packit Service f02b19
	g_return_val_if_fail (ulWrappedKeyLen, CKR_WRAPPED_KEY_LEN_RANGE);
Packit Service f02b19
	g_return_val_if_fail (phKey, CKR_ARGUMENTS_BAD);
Packit Service f02b19
	g_return_val_if_fail (pTemplate, CKR_TEMPLATE_INCOMPLETE);
Packit Service f02b19
	g_return_val_if_fail (ulCount, CKR_TEMPLATE_INCONSISTENT);
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session != NULL, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	attrs = lookup_object (session, hUnwrappingKey, NULL);
Packit Service f02b19
	g_return_val_if_fail (attrs, CKR_WRAPPING_KEY_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	if (pMechanism->mechanism != CKM_MOCK_WRAP)
Packit Service f02b19
		return CKR_MECHANISM_INVALID;
Packit Service f02b19
Packit Service f02b19
	if (pMechanism->pParameter) {
Packit Service f02b19
		if (pMechanism->ulParameterLen != 4 ||
Packit Service f02b19
		    memcmp (pMechanism->pParameter, "wrap", 4) != 0)
Packit Service f02b19
			g_return_val_if_reached (CKR_MECHANISM_PARAM_INVALID);
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	gck_builder_init (&builder);
Packit Service f02b19
	gck_builder_add_data (&builder, CKA_VALUE, pWrappedKey, ulWrappedKeyLen);
Packit Service f02b19
	for (i = 0; i < ulCount; ++i)
Packit Service f02b19
		gck_builder_add_data (&builder, pTemplate[i].type,
Packit Service f02b19
		                         pTemplate[i].pValue,
Packit Service f02b19
		                         pTemplate[i].ulValueLen);
Packit Service f02b19
	*phKey = ++unique_identifier;
Packit Service f02b19
	attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
Packit Service f02b19
	if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token)
Packit Service f02b19
		g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phKey), attrs);
Packit Service f02b19
	else
Packit Service f02b19
		g_hash_table_insert (session->objects, GUINT_TO_POINTER (*phKey), attrs);
Packit Service f02b19
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_DeriveKey (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
Packit Service f02b19
                                  CK_OBJECT_HANDLE hBaseKey, CK_ATTRIBUTE_PTR pTemplate,
Packit Service f02b19
                                  CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phKey)
Packit Service f02b19
{
Packit Service f02b19
	GckBuilder builder;
Packit Service f02b19
	GckAttributes *attrs, *copy;
Packit Service f02b19
	Session *session;
Packit Service f02b19
	gboolean token;
Packit Service f02b19
	CK_ULONG i;
Packit Service f02b19
Packit Service f02b19
	g_return_val_if_fail (pMechanism, CKR_MECHANISM_INVALID);
Packit Service f02b19
	g_return_val_if_fail (ulCount, CKR_TEMPLATE_INCOMPLETE);
Packit Service f02b19
	g_return_val_if_fail (pTemplate, CKR_TEMPLATE_INCOMPLETE);
Packit Service f02b19
	g_return_val_if_fail (phKey, CKR_ARGUMENTS_BAD);
Packit Service f02b19
Packit Service f02b19
	session = g_hash_table_lookup (the_sessions, GUINT_TO_POINTER (hSession));
Packit Service f02b19
	g_return_val_if_fail (session, CKR_SESSION_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	attrs = lookup_object (session, hBaseKey, NULL);
Packit Service f02b19
	g_return_val_if_fail (attrs, CKR_KEY_HANDLE_INVALID);
Packit Service f02b19
Packit Service f02b19
	if (pMechanism->mechanism != CKM_MOCK_DERIVE)
Packit Service f02b19
		return CKR_MECHANISM_INVALID;
Packit Service f02b19
Packit Service f02b19
	if (pMechanism->pParameter) {
Packit Service f02b19
		if (pMechanism->ulParameterLen != 6 ||
Packit Service f02b19
		    memcmp (pMechanism->pParameter, "derive", 6) != 0)
Packit Service f02b19
			g_return_val_if_reached (CKR_MECHANISM_PARAM_INVALID);
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	gck_builder_init (&builder);
Packit Service f02b19
	gck_builder_add_string (&builder, CKA_VALUE, "derived");
Packit Service f02b19
	for (i = 0; i < ulCount; ++i)
Packit Service f02b19
		gck_builder_add_data (&builder, pTemplate[i].type,
Packit Service f02b19
		                      pTemplate[i].pValue,
Packit Service f02b19
		                      pTemplate[i].ulValueLen);
Packit Service f02b19
	gck_builder_add_all (&builder, attrs);
Packit Service f02b19
	*phKey = ++unique_identifier;
Packit Service f02b19
	copy = gck_attributes_ref_sink (gck_builder_end (&builder));
Packit Service f02b19
	if (gck_attributes_find_boolean (copy, CKA_TOKEN, &token) && token)
Packit Service f02b19
		g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phKey), copy);
Packit Service f02b19
	else
Packit Service f02b19
		g_hash_table_insert (session->objects, GUINT_TO_POINTER (*phKey), copy);
Packit Service f02b19
Packit Service f02b19
	return CKR_OK;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_SeedRandom (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSeed, CK_ULONG ulSeedLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
CK_RV
Packit Service f02b19
gck_mock_unsupported_C_GenerateRandom (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pRandomData,
Packit Service f02b19
                           CK_ULONG ulRandomLen)
Packit Service f02b19
{
Packit Service f02b19
	return CKR_FUNCTION_NOT_SUPPORTED;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static CK_FUNCTION_LIST functionList = {
Packit Service f02b19
	{ 2, 11 },	/* version */
Packit Service f02b19
	gck_mock_C_Initialize,
Packit Service f02b19
	gck_mock_C_Finalize,
Packit Service f02b19
	gck_mock_C_GetInfo,
Packit Service f02b19
	gck_mock_C_GetFunctionList,
Packit Service f02b19
	gck_mock_C_GetSlotList,
Packit Service f02b19
	gck_mock_C_GetSlotInfo,
Packit Service f02b19
	gck_mock_C_GetTokenInfo,
Packit Service f02b19
	gck_mock_C_GetMechanismList,
Packit Service f02b19
	gck_mock_C_GetMechanismInfo,
Packit Service f02b19
	gck_mock_specific_args_C_InitToken,
Packit Service f02b19
	gck_mock_C_InitPIN,
Packit Service f02b19
	gck_mock_C_SetPIN,
Packit Service f02b19
	gck_mock_C_OpenSession,
Packit Service f02b19
	gck_mock_C_CloseSession,
Packit Service f02b19
	gck_mock_C_CloseAllSessions,
Packit Service f02b19
	gck_mock_C_GetSessionInfo,
Packit Service f02b19
	gck_mock_unsupported_C_GetOperationState,
Packit Service f02b19
	gck_mock_unsupported_C_SetOperationState,
Packit Service f02b19
	gck_mock_C_Login,
Packit Service f02b19
	gck_mock_C_Logout,
Packit Service f02b19
	gck_mock_C_CreateObject,
Packit Service f02b19
	gck_mock_unsupported_C_CopyObject,
Packit Service f02b19
	gck_mock_C_DestroyObject,
Packit Service f02b19
	gck_mock_unsupported_C_GetObjectSize,
Packit Service f02b19
	gck_mock_C_GetAttributeValue,
Packit Service f02b19
	gck_mock_C_SetAttributeValue,
Packit Service f02b19
	gck_mock_C_FindObjectsInit,
Packit Service f02b19
	gck_mock_C_FindObjects,
Packit Service f02b19
	gck_mock_C_FindObjectsFinal,
Packit Service f02b19
	gck_mock_C_EncryptInit,
Packit Service f02b19
	gck_mock_C_Encrypt,
Packit Service f02b19
	gck_mock_unsupported_C_EncryptUpdate,
Packit Service f02b19
	gck_mock_unsupported_C_EncryptFinal,
Packit Service f02b19
	gck_mock_C_DecryptInit,
Packit Service f02b19
	gck_mock_C_Decrypt,
Packit Service f02b19
	gck_mock_unsupported_C_DecryptUpdate,
Packit Service f02b19
	gck_mock_unsupported_C_DecryptFinal,
Packit Service f02b19
	gck_mock_unsupported_C_DigestInit,
Packit Service f02b19
	gck_mock_unsupported_C_Digest,
Packit Service f02b19
	gck_mock_unsupported_C_DigestUpdate,
Packit Service f02b19
	gck_mock_unsupported_C_DigestKey,
Packit Service f02b19
	gck_mock_unsupported_C_DigestFinal,
Packit Service f02b19
	gck_mock_C_SignInit,
Packit Service f02b19
	gck_mock_C_Sign,
Packit Service f02b19
	gck_mock_unsupported_C_SignUpdate,
Packit Service f02b19
	gck_mock_unsupported_C_SignFinal,
Packit Service f02b19
	gck_mock_unsupported_C_SignRecoverInit,
Packit Service f02b19
	gck_mock_unsupported_C_SignRecover,
Packit Service f02b19
	gck_mock_C_VerifyInit,
Packit Service f02b19
	gck_mock_C_Verify,
Packit Service f02b19
	gck_mock_unsupported_C_VerifyUpdate,
Packit Service f02b19
	gck_mock_unsupported_C_VerifyFinal,
Packit Service f02b19
	gck_mock_unsupported_C_VerifyRecoverInit,
Packit Service f02b19
	gck_mock_unsupported_C_VerifyRecover,
Packit Service f02b19
	gck_mock_unsupported_C_DigestEncryptUpdate,
Packit Service f02b19
	gck_mock_unsupported_C_DecryptDigestUpdate,
Packit Service f02b19
	gck_mock_unsupported_C_SignEncryptUpdate,
Packit Service f02b19
	gck_mock_unsupported_C_DecryptVerifyUpdate,
Packit Service f02b19
	gck_mock_unsupported_C_GenerateKey,
Packit Service f02b19
	gck_mock_unsupported_C_GenerateKeyPair,
Packit Service f02b19
	gck_mock_unsupported_C_WrapKey,
Packit Service f02b19
	gck_mock_unsupported_C_UnwrapKey,
Packit Service f02b19
	gck_mock_unsupported_C_DeriveKey,
Packit Service f02b19
	gck_mock_unsupported_C_SeedRandom,
Packit Service f02b19
	gck_mock_unsupported_C_GenerateRandom,
Packit Service f02b19
	gck_mock_C_GetFunctionStatus,
Packit Service f02b19
	gck_mock_C_CancelFunction,
Packit Service f02b19
	gck_mock_unsupported_C_WaitForSlotEvent
Packit Service f02b19
};