/* * Convenience pkcs11 library that can be linked into an application, * and will bind to a specific pkcs11 module. * * Copyright (C) 2002 Olaf Kirch */ #ifdef HAVE_CONFIG_H #include #endif #include "pkcs11.h" #include #include #include #include #define MAGIC 0xd00bed00 struct sc_pkcs11_module { unsigned int _magic; scdl_context_t *handle; }; /* * Load a module - this will load the shared object, call * C_Initialize, and get the list of function pointers */ sc_pkcs11_module_t * C_LoadModule(const char *mspec, CK_FUNCTION_LIST_PTR_PTR funcs) { sc_pkcs11_module_t *mod; CK_RV (*c_get_function_list)(CK_FUNCTION_LIST_PTR_PTR); int rv; mod = (sc_pkcs11_module_t *) calloc(1, sizeof(*mod)); mod->_magic = MAGIC; if (mspec == NULL) mspec = PKCS11_DEFAULT_MODULE_NAME; mod->handle = scdl_open(mspec); if (mod->handle == NULL) goto failed; /* Get the list of function pointers */ c_get_function_list = (CK_RV (*)(CK_FUNCTION_LIST_PTR_PTR)) scdl_get_address(mod->handle, "C_GetFunctionList"); if (!c_get_function_list) goto failed; rv = c_get_function_list(funcs); if (rv == CKR_OK) return mod; failed: C_UnloadModule(mod); return NULL; } /* * Unload a pkcs11 module. * The calling application is responsible for cleaning up * and calling C_Finalize */ CK_RV C_UnloadModule(sc_pkcs11_module_t *mod) { if (!mod || mod->_magic != MAGIC) return CKR_ARGUMENTS_BAD; if (scdl_close(mod->handle) < 0) return CKR_FUNCTION_FAILED; memset(mod, 0, sizeof(*mod)); free(mod); return CKR_OK; }