|
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: */
|