Blame src/libpkcs11.c

Packit 6b81fa
/* libp11, a simple layer on to of PKCS#11 API
Packit 6b81fa
 * Copyright (C) 2005 Olaf Kirch <okir@lst.de>
Packit 6b81fa
 *
Packit 6b81fa
 *  This library is free software; you can redistribute it and/or
Packit 6b81fa
 *  modify it under the terms of the GNU Lesser General Public
Packit 6b81fa
 *  License as published by the Free Software Foundation; either
Packit 6b81fa
 *  version 2.1 of the License, or (at your option) any later version.
Packit 6b81fa
 *
Packit 6b81fa
 *  This library is distributed in the hope that it will be useful,
Packit 6b81fa
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6b81fa
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6b81fa
 *  Lesser General Public License for more details.
Packit 6b81fa
 *
Packit 6b81fa
 *  You should have received a copy of the GNU Lesser General Public
Packit 6b81fa
 *  License along with this library; if not, write to the Free Software
Packit 6b81fa
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
Packit 6b81fa
 */
Packit 6b81fa
Packit 6b81fa
/*
Packit 6b81fa
 * Convenience pkcs11 library that can be linked into an application,
Packit 6b81fa
 * and will bind to a specific pkcs11 module.
Packit 6b81fa
 *
Packit 6b81fa
 * Copyright (C) 2002  Olaf Kirch <okir@lst.de>
Packit 6b81fa
 */
Packit 6b81fa
Packit 6b81fa
#include "libp11-int.h"
Packit 6b81fa
#include <stdlib.h>
Packit 6b81fa
#include <stdio.h>
Packit 6b81fa
#include <string.h>
Packit 6b81fa
#ifdef _WIN32
Packit 6b81fa
#include <windows.h>
Packit 6b81fa
#else
Packit 6b81fa
#include <dlfcn.h>
Packit 6b81fa
#endif
Packit 6b81fa
Packit 6b81fa
#define MAGIC			0xd00bed00
Packit 6b81fa
Packit 6b81fa
struct sc_pkcs11_module {
Packit 6b81fa
	unsigned int _magic;
Packit 6b81fa
	void *handle;
Packit 6b81fa
};
Packit 6b81fa
typedef struct sc_pkcs11_module sc_pkcs11_module_t;
Packit 6b81fa
Packit 6b81fa
/*
Packit 6b81fa
 * Load a module - this will load the shared object, call
Packit 6b81fa
 * C_Initialize, and get the list of function pointers
Packit 6b81fa
 */
Packit 6b81fa
void *
Packit 6b81fa
C_LoadModule(const char *mspec, CK_FUNCTION_LIST_PTR_PTR funcs)
Packit 6b81fa
{
Packit 6b81fa
	sc_pkcs11_module_t *mod;
Packit 6b81fa
	CK_RV (*c_get_function_list)(CK_FUNCTION_LIST_PTR_PTR);
Packit 6b81fa
	int rv;
Packit 6b81fa
Packit 6b81fa
	if (mspec == NULL)
Packit 6b81fa
		return NULL;
Packit 6b81fa
Packit 6b81fa
	mod = OPENSSL_malloc(sizeof(sc_pkcs11_module_t));
Packit 6b81fa
	if (mod == NULL)
Packit 6b81fa
		return NULL;
Packit 6b81fa
	memset(mod, 0, sizeof(sc_pkcs11_module_t));
Packit 6b81fa
	mod->_magic = MAGIC;
Packit 6b81fa
Packit 6b81fa
#ifdef WIN32
Packit 6b81fa
	mod->handle = LoadLibraryA(mspec);
Packit 6b81fa
#else
Packit 6b81fa
	mod->handle = dlopen(mspec, RTLD_LAZY | RTLD_LOCAL);
Packit 6b81fa
#endif
Packit 6b81fa
Packit 6b81fa
	if (mod->handle == NULL) {
Packit 6b81fa
#ifndef WIN32
Packit 6b81fa
		fprintf(stderr, "%s\n", dlerror());
Packit 6b81fa
#endif
Packit 6b81fa
		goto failed;
Packit 6b81fa
	}
Packit 6b81fa
Packit 6b81fa
#ifdef WIN32
Packit 6b81fa
	c_get_function_list = (CK_C_GetFunctionList)
Packit 6b81fa
		GetProcAddress(mod->handle, "C_GetFunctionList");
Packit 6b81fa
#else
Packit 6b81fa
	{
Packit 6b81fa
		/*
Packit 6b81fa
		 * Make compiler happy!
Packit 6b81fa
		 */
Packit 6b81fa
		void *p = dlsym(mod->handle, "C_GetFunctionList");
Packit 6b81fa
		memmove(&c_get_function_list, &p, sizeof(void *));
Packit 6b81fa
	}
Packit 6b81fa
#endif
Packit 6b81fa
Packit 6b81fa
	if (c_get_function_list == NULL) {
Packit 6b81fa
#ifndef WIN32
Packit 6b81fa
		fprintf(stderr, "%s\n", dlerror());
Packit 6b81fa
#endif
Packit 6b81fa
		goto failed;
Packit 6b81fa
	}
Packit 6b81fa
	rv = c_get_function_list(funcs);
Packit 6b81fa
	if (rv == CKR_OK)
Packit 6b81fa
		return mod;
Packit 6b81fa
Packit 6b81fa
failed:
Packit 6b81fa
	C_UnloadModule((void *) mod);
Packit 6b81fa
	return NULL;
Packit 6b81fa
}
Packit 6b81fa
Packit 6b81fa
/*
Packit 6b81fa
 * Unload a pkcs11 module.
Packit 6b81fa
 * The calling application is responsible for cleaning up
Packit 6b81fa
 * and calling C_Finalize
Packit 6b81fa
 */
Packit 6b81fa
CK_RV
Packit 6b81fa
C_UnloadModule(void *module)
Packit 6b81fa
{
Packit 6b81fa
	sc_pkcs11_module_t *mod = (sc_pkcs11_module_t *) module;
Packit 6b81fa
Packit 6b81fa
	if (mod == NULL || mod->_magic != MAGIC)
Packit 6b81fa
		return CKR_ARGUMENTS_BAD;
Packit 6b81fa
Packit 6b81fa
	if (mod->handle) {
Packit 6b81fa
#ifdef WIN32
Packit 6b81fa
		FreeLibrary(mod->handle);
Packit 6b81fa
#else
Packit 6b81fa
		dlclose(mod->handle);
Packit 6b81fa
#endif
Packit 6b81fa
	}
Packit 6b81fa
Packit 6b81fa
	memset(mod, 0, sizeof(sc_pkcs11_module_t));
Packit 6b81fa
	OPENSSL_free(mod);
Packit 6b81fa
Packit 6b81fa
	return CKR_OK;
Packit 6b81fa
}
Packit 6b81fa
Packit 6b81fa
/* vim: set noexpandtab: */