/* * Load the shared library, and initialize it. */ int PKCS11_CTX_load(PKCS11_CTX * ctx, const char *name) { PKCS11_CTX_private *priv = PRIVCTX(ctx); CK_C_INITIALIZE_ARGS args; CK_INFO ck_info; int rv; if (priv->libinfo != NULL) { PKCS11err(PKCS11_F_PKCS11_CTX_LOAD, PKCS11_MODULE_LOADED_ERROR); return -1; } handle = C_LoadModule(name, &priv->method); if (!handle) { PKCS11err(PKCS11_F_PKCS11_CTX_LOAD, PKCS11_LOAD_MODULE_ERROR); return -1; } /* Tell the PKCS11 to initialize itself */ memset(&args, 0, sizeof(args)); args.pReserved = priv->init_args; rv = priv->method->C_Initialize(&args); if (rv && rv != CKR_CRYPTOKI_ALREADY_INITIALIZED) { PKCS11err(PKCS11_F_PKCS11_CTX_LOAD, rv); return -1; } /* Get info on the library */ rv = priv->method->C_GetInfo(&ck_info); CRYPTOKI_checkerr(PKCS11_F_PKCS11_CTX_LOAD, rv); ctx->manufacturer = PKCS11_DUP(ck_info.manufacturerID); ctx->description = PKCS11_DUP(ck_info.libraryDescription); return 0; }
const char * get_module_name(const char *module_path) { const char *name = NULL; CK_FUNCTION_LIST_PTR p11 = NULL; void *module = C_LoadModule(module_path, &p11); if (module) { CK_INFO info; if (CKR_OK == p11->C_Initialize(NULL) && CKR_OK == p11->C_GetInfo(&info)) { static char module_name[32+sizeof " (255.255)"]; int libraryDescription_len = 32; while (libraryDescription_len > 0 && info.libraryDescription[libraryDescription_len-1] == ' ') libraryDescription_len--; snprintf(module_name, sizeof module_name, "%.*s (%d.%d)", libraryDescription_len, info.libraryDescription, info.libraryVersion.major, info.libraryVersion.minor); name = module_name; } p11->C_Finalize(NULL); C_UnloadModule(module); } return name; }
/* * Load the shared library, and initialize it. */ int pkcs11_CTX_load(PKCS11_CTX * ctx, const char *name) { PKCS11_CTX_private *cpriv = PRIVCTX(ctx); CK_C_INITIALIZE_ARGS _args; CK_C_INITIALIZE_ARGS *args = NULL; CK_INFO ck_info; int rv; cpriv->handle = C_LoadModule(name, &cpriv->method); if (cpriv->handle == NULL) { PKCS11err(PKCS11_F_PKCS11_CTX_LOAD, PKCS11_LOAD_MODULE_ERROR); return -1; } /* Tell the PKCS11 to initialize itself */ if (cpriv->init_args != NULL) { memset(&_args, 0, sizeof(_args)); args = &_args; /* Unconditionally say using OS locking primitives is OK */ args->flags |= CKF_OS_LOCKING_OK; args->pReserved = cpriv->init_args; } rv = cpriv->method->C_Initialize(args); if (rv && rv != CKR_CRYPTOKI_ALREADY_INITIALIZED) { PKCS11err(PKCS11_F_PKCS11_CTX_LOAD, rv); return -1; } /* Get info on the library */ rv = cpriv->method->C_GetInfo(&ck_info); CRYPTOKI_checkerr(PKCS11_F_PKCS11_CTX_LOAD, rv); ctx->manufacturer = PKCS11_DUP(ck_info.manufacturerID); ctx->description = PKCS11_DUP(ck_info.libraryDescription); return 0; }