PKCS#11在dll中的C_getfunctionlist
问题描述:
我在写一个最终将连接到虚拟标记的dll。我试图制作一个可导出的C_getfunctionlist函数,它将包含指向PCKS#11标准支持的函数的指针地址,但我无法弄清楚为什么我无法在使用该DLL的程序中访问这些函数。我试图加载只是C_Initialize函数。PKCS#11在dll中的C_getfunctionlist
extern "C" __declspec(dllexport)
CK_RV C_GetFunctionList(CK_FUNCTION_LIST_PTR_PTR ppFunctionList) {
CK_FUNCTION_LIST_PTR function_list;
function_list=new CK_FUNCTION_LIST;
function_list->C_Initialize=&C_Initialize;
ppFunctionList=&function_list;
return CKR_OK;
}
答
如果你想在你的代码中使用一个PKCS#11实现的功能,您必须加载它实现了标准,然后使用由DLL提供的功能的DLL。这里是我在Linux系统上使用的代码。我希望它有帮助。
static char const * PKCS11_SO_NAME = "/usr/lib/pkcs11/PKCS11_API.so";
static void * pkcs11_so;
//list of all pkcs#11 functions
static CK_FUNCTION_LIST_PTR pkcs11;
CK_RV load_pkcs11() {
CK_RV rv = CKR_OK;
CK_RV (*C_GetFunctionList) (CK_FUNCTION_LIST_PTR_PTR) = 0;
pkcs11_so = dlopen(PKCS11_SO_NAME, RTLD_NOW);
if (!pkcs11_so) {
fprintf(stderr, "Error loading pkcs#11 so: %s\n", dlerror());
return CKR_GENERAL_ERROR;
}
rv = load_symbol((void **)&C_GetFunctionList, "C_GetFunctionList");
if (CKR_OK != rv) {
return rv;
}
rv = C_GetFunctionList(&pkcs11);
if (CKR_OK != rv) {
fprintf(stderr, "C_GetFunctionList call failed: 0x%.8lX", rv);
return rv;
}
return CKR_OK;
}