背景
PKCS(Public—Key Cryptography Standards)是著名的RSA实验室为提供公钥加密技术的互操作性而发布的一系列可供参照的标准。
最近在对新版本签名控件(包含交易签名、证书下载更新等功能)添加支持PKCS11标准时, 遇到这种问题场景,银行客户手中有一款老版本的客户端软件可以调用某UK厂商的PKCS11库进行签名、下载证书等操作,但由于该UKey厂商已经倒闭,所以新版本签名控件在集成该UKey类型时没有UK厂商的支持,根据标准的PKCS11文档中调用该PKCS11库并没有得到期望的响应,所以想通过DLL劫持的方式,捕捉一下银行客户老版本客户端调用UK厂商的PKCS11库传入的什么参数。
PKCS11函数表
我想到最快的方式就是去Github去找一下有没有类似的PKCS11Demo,果然是有的,根据自己的需要,每个函数只需要进行打印需要的参数,然后调用UKey厂商真实PKCS11库即可,需要注意的是C_GetFunctionList 需要返回自己库的函数表。
链接: link.
我把自己的库上传资源,如果有遇到类似问题的可以下载参考;
环境:Windows10 + VS2010
有问题 可以添加我的QQ 942098061
HKB_DFTX_pkcs11.cpp
.
// HKB_DFTX_pkcs11.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "cryptoki.h"
//#include "pkcs11.h"
#include <string.h>
#include "Utility.h"
/* SPDX-License-Identifier: BSD-2-Clause */
//#include "cryptoki.h"
//自定义信息
HMODULE m_hInstLib;
CK_FUNCTION_LIST_PTR p11;
typedef CK_RV(*C_GETFUNCTIONLIST)(CK_FUNCTION_LIST_PTR_PTR ppFunctionList);
#define DATA_TYPE_STRING 0
#define DATA_TYPE_LONG 1
#define DATA_TYPE_BOOL 2
///
void PRINT_CK_ATTRIBUTE (CK_ATTRIBUTE_PTR templ)
{
CK_ATTRIBUTE_TYPE type =templ->type;
std::wstring wstrtype = L"";
std::wstring wstrValue = L"";
std::wstring wstrtemp = L"";
int nDataType = DATA_TYPE_STRING;
switch(type)
{
case CKA_CLASS:
wstrtype = L"CKA_CLASS";
nDataType = DATA_TYPE_LONG;
break;
case CKA_TOKEN:
wstrtype = L"CKA_TOKEN";
nDataType = DATA_TYPE_BOOL;
break;
case CKA_CERTIFICATE_TYPE:
wstrtype = L"CKA_CERTIFICATE_TYPE";
nDataType = DATA_TYPE_LONG;
break;
case CKA_SUBJECT:
wstrtype = L"CKA_SUBJECT";
nDataType = DATA_TYPE_STRING;
break;
case CKA_ID:
wstrtype = L"CKA_ID";
nDataType = DATA_TYPE_STRING;
break;
case CKA_VALUE:
wstrtype = L"CKA_VALUE";
nDataType = DATA_TYPE_STRING;
break;
case CKA_PRIVATE:
wstrtype = L"CKA_PRIVATE";
nDataType = DATA_TYPE_BOOL;
break;
case CKA_KEY_TYPE:
wstrtype = L"CKA_KEY_TYPE";
nDataType = DATA_TYPE_LONG;
break;
case CKA_ENCRYPT:
wstrtype = L"CKA_ENCRYPT";
nDataType = DATA_TYPE_BOOL;
break;
case CKA_VERIFY:
wstrtype = L"CKA_VERIFY";
nDataType = DATA_TYPE_BOOL;
break;
case CKA_WRAP:
wstrtype = L"CKA_WRAP";
nDataType = DATA_TYPE_BOOL;
break;
case CKA_MODULUS_BITS:
wstrtype = L"CKA_MODULUS_BITS";
nDataType = DATA_TYPE_LONG;
break;
case CKA_PUBLIC_EXPONENT:
wstrtype = L"CKA_PUBLIC_EXPONENT";
nDataType = DATA_TYPE_STRING;
break;
case CKA_SENSITIVE:
wstrtype = L"CKA_SENSITIVE";
nDataType = DATA_TYPE_BOOL;
break;
case CKA_DECRYPT:
wstrtype = L"CKA_DECRYPT";
nDataType = DATA_TYPE_BOOL;
break;
case CKA_SIGN:
wstrtype = L"CKA_TOKEN";
nDataType = DATA_TYPE_BOOL;
break;
case CKA_UNWRAP:
wstrtype = L"CKA_UNWRAP";
nDataType = DATA_TYPE_BOOL;
break;
case CKA_DERIVE:
wstrtype = L"CKA_DERIVE";
nDataType = DATA_TYPE_BOOL;
break;
case CKA_VERIFY_RECOVER:
wstrtype = L"CKA_VERIFY_RECOVER";
nDataType = DATA_TYPE_BOOL;
break;
case CKA_LABEL:
wstrtype = L"CKA_LABEL";
nDataType = DATA_TYPE_STRING;
break;
case CKA_ISSUER:
wstrtype = L"CKA_ISSUER";
nDataType = DATA_TYPE_STRING;
break;
case CKA_SERIAL_NUMBER:
wstrtype = L"CKA_SERIAL_NUMBER";
nDataType = DATA_TYPE_STRING;
break;
default :
wstrtemp = CUtility::b64encode_to_wstring((unsigned char*)templ->pValue, templ->ulValueLen);
PRINT_INFO(L"Default type = 0x%.8X,Value = %s",type, wstrtemp.c_str());
return;
}
std::wstring wstrDataType = L"";
switch(nDataType)
{
case DATA_TYPE_STRING:
wstrDataType = L"string";
wstrtemp = CUtility::b64encode_to_wstring((unsigned char*)templ->pValue, templ->ulValueLen);
PRINT_INFO(L"type = %s, DataType = %s, Value = %s",wstrtype.c_str(),wstrDataType.c_str(), wstrtemp.c_str());
break;
case DATA_TYPE_LONG:
wstrDataType = L"unsigned long int";
PRINT_INFO(L"type = %s, DataType = %s, Value = 0x%.8X",wstrtype.c_str(),wstrDataType.c_str(),*((CK_ULONG *)templ->pValue));
break;
case DATA_TYPE_BOOL:
wstrDataType = L"bool";
if (*((CK_BBOOL *)templ->pValue) == TRUE)
wstrValue = L"TRUE";
else
wstrValue = L"FALSE";
PRINT_INFO(L"type = %s, DataType = %s, Value = %s",wstrtype.c_str(),wstrDataType.c_str(),wstrValue.c_str());
break;
default :
PRINT_INFO(L"nDataType not found");
}
}
__declspec(dllexport) CK_RV C_Initialize (void *init_args) {
PRINT_INFO(L"-----***------");
CK_RV rv;
TCHAR buf[MAX_PATH] = {'\0'};
WCHAR* p11path = L"";
::GetModuleFileName( NULL, buf, MAX_PATH);
p11path = buf;
WCHAR* p11name = L"\\HKB_DFTX_pkcs11.dll";
wcscpy(p11path+wcslen(p11path),p11name);
m_hInstLib = LoadLibrary(TEXT("D:\\p11lib\\HKB_DFTX_pkcs11.dll"));
//m_hInstLib = LoadLibrary(TEXT("D:\\p11lib\\HKB_Enterprise_Jansh_2.1.dll"));
if (!m_hInstLib)
return -1;
C_GETFUNCTIONLIST pfC_GetFunctionList = (C_GETFUNCTIONLIST) GetProcAddress(m_hInstLib, "C_GetFunctionList");
if (!pfC_GetFunctionList)
{
FreeLibrary(m_hInstLib);
m_hInstLib = NULL;
return -2;
}
rv = pfC_GetFunctionList(&p11);
if (rv != CKR_OK)
{
FreeLibrary(m_hInstLib);
m_hInstLib = NULL;
return -3;
}
rv = pfC_GetFunctionList(&p11);
if (rv != CKR_OK)
{
FreeLibrary(m_hInstLib);
m_hInstLib = NULL;
return -3;
}
rv = p11->C_Initialize(init_args);
if(rv != CKR_OK && rv != CKR_CRYPTOKI_ALREADY_INITIALIZED)
{
p11 = NULL;
return rv;
}
return rv;
}
__declspec(dllexport) CK_RV C_Finalize (void *pReserved) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_Finalize(pReserved);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_GetInfo (CK_INFO *info) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_GetInfo(info);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_GetFunctionList (CK_FUNCTION_LIST **ppFunctionList) {
PRINT_INFO(L"-----***------");
//CUtility::InitLog();
CK_FUNCTION_LIST_PTR function_list;
//CK_FUNCTION_LIST* function_list;
function_list = new CK_FUNCTION_LIST;
function_list->version.major = 2;
function_list->version.minor = 4;
function_list->C_CancelFunction = C_CancelFunction;
function_list->C_CloseAllSessions = C_CloseAllSessions;
function_list->C_CloseSession = C_CloseSession;
function_list->C_CopyObject = C_CopyObject;
function_list->C_CreateObject = C_CreateObject;
function_list->C_Decrypt = C_Decrypt;
function_list->C_DecryptDigestUpdate = C_DecryptDigestUpdate;
function_list->C_DecryptFinal = C_DecryptFinal;
function_list->C_DecryptInit = C_DecryptInit;
function_list->C_DecryptUpdate = C_DecryptUpdate;
function_list->C_DecryptVerifyUpdate = C_DecryptVerifyUpdate;
function_list->C_DeriveKey = C_DeriveKey;
function_list->C_DestroyObject = C_DestroyObject;
function_list->C_Digest = C_Digest;
function_list->C_DigestEncryptUpdate = C_DigestEncryptUpdate;
function_list->C_DigestFinal = C_DigestFinal;
function_list->C_DigestInit = C_DigestInit;
function_list->C_DigestKey = C_DigestKey;
function_list->C_DigestUpdate = C_DigestUpdate;
function_list->C_Encrypt = C_Encrypt;
function_list->C_EncryptFinal = C_EncryptFinal;
function_list->C_EncryptInit = C_EncryptInit;
function_list->C_EncryptUpdate = C_EncryptUpdate;
function_list->C_Finalize = C_Finalize;
function_list->C_FindObjects = C_FindObjects;
function_list->C_FindObjectsFinal = C_FindObjectsFinal;
function_list->C_FindObjectsInit = C_FindObjectsInit;
function_list->C_GenerateKey = C_GenerateKey;
function_list->C_GenerateKeyPair = C_GenerateKeyPair;
function_list->C_GenerateRandom = C_GenerateRandom;
function_list->C_GetAttributeValue = C_GetAttributeValue;
function_list->C_GetFunctionList = C_GetFunctionList;
function_list->C_GetFunctionStatus = C_GetFunctionStatus;
function_list->C_GetInfo = C_GetInfo;
function_list->C_GetMechanismInfo = C_GetMechanismInfo;
function_list->C_GetMechanismList = C_GetMechanismList;
function_list->C_GetObjectSize = C_GetObjectSize;
function_list->C_GetOperationState = C_GetOperationState;
function_list->C_GetSessionInfo = C_GetSessionInfo;
function_list->C_GetSlotInfo = C_GetSlotInfo;
function_list->C_GetSlotList = C_GetSlotList;
function_list->C_GetTokenInfo = C_GetTokenInfo;
function_list->C_Initialize = C_Initialize;
function_list->C_InitPIN = C_InitPIN;
function_list->C_InitToken = C_InitToken;
function_list->C_Login = C_Login;
function_list->C_Logout = C_Logout;
function_list->C_OpenSession = C_OpenSession;
function_list->C_SeedRandom = C_SeedRandom;
function_list->C_SetAttributeValue = C_SetAttributeValue;
function_list->C_SetOperationState = C_SetOperationState;
function_list->C_SetPIN = C_SetPIN;
function_list->C_Sign = C_Sign;
function_list->C_SignEncryptUpdate = C_SignEncryptUpdate;
function_list->C_SignFinal = C_SignFinal;
function_list->C_SignInit = C_SignInit;
function_list->C_SignRecover = C_SignRecover;
function_list->C_SignRecoverInit = C_SignRecoverInit;
function_list->C_SignUpdate = C_SignUpdate;
function_list->C_UnwrapKey = C_UnwrapKey;
function_list->C_Verify = C_Verify;
function_list->C_VerifyFinal = C_VerifyFinal;
function_list->C_VerifyInit = C_VerifyInit;
function_list->C_VerifyRecover = C_VerifyRecover;
function_list->C_VerifyRecoverInit = C_VerifyRecoverInit;
function_list->C_VerifyUpdate = C_VerifyUpdate;
function_list->C_WaitForSlotEvent = C_WaitForSlotEvent;
function_list->C_WrapKey = C_WrapKey;
*ppFunctionList=function_list;
return CKR_OK;
}
__declspec(dllexport) CK_RV C_GetSlotList (CK_BYTE token_present, CK_SLOT_ID *slot_list, CK_ULONG_PTR count) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_GetSlotList(token_present, slot_list, count);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_GetSlotInfo (CK_SLOT_ID slotID, CK_SLOT_INFO *info) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_GetSlotInfo(slotID, info);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_GetTokenInfo (CK_SLOT_ID slotID, CK_TOKEN_INFO *info) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_GetTokenInfo(slotID, info);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_WaitForSlotEvent (CK_FLAGS flags, CK_SLOT_ID *slot, void *pReserved) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_WaitForSlotEvent ( flags, slot, pReserved);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_GetMechanismList (CK_SLOT_ID slotID, CK_MECHANISM_TYPE *mechanism_list, CK_ULONG_PTR count) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_GetMechanismList( slotID, mechanism_list, count);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_GetMechanismInfo (CK_SLOT_ID slotID, CK_MECHANISM_TYPE type, CK_MECHANISM_INFO *info) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_GetMechanismInfo( slotID, type, info);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_InitToken (CK_SLOT_ID slotID, CK_BYTE_PTR pin, CK_ULONG pin_len, CK_BYTE_PTR label) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_InitToken( slotID, pin, pin_len, label);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_InitPIN (CK_SESSION_HANDLE session, CK_UTF8CHAR_PTR pin, CK_ULONG pin_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_InitPIN( session, pin, pin_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_SetPIN (CK_SESSION_HANDLE session, CK_UTF8CHAR_PTR old_pin, CK_ULONG old_len, CK_UTF8CHAR_PTR new_pin, CK_ULONG new_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_SetPIN( session, old_pin, old_len, new_pin, new_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_OpenSession (CK_SLOT_ID slotID, CK_FLAGS flags, void *application, CK_NOTIFY notify, CK_SESSION_HANDLE *session) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_OpenSession( slotID, flags, application, notify, session);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_CloseSession (CK_SESSION_HANDLE session) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_CloseSession(session);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_CloseAllSessions (CK_SLOT_ID slotID) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_CloseAllSessions(slotID);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_GetSessionInfo (CK_SESSION_HANDLE session, CK_SESSION_INFO *info) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_GetSessionInfo(session, info );
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_GetOperationState (CK_SESSION_HANDLE session, CK_BYTE_PTR operation_state, CK_ULONG_PTR operation_state_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_GetOperationState(session, operation_state, operation_state_len );
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_SetOperationState (CK_SESSION_HANDLE session, CK_BYTE_PTR operation_state, CK_ULONG operation_state_len, CK_OBJECT_HANDLE encryption_key, CK_OBJECT_HANDLE authentiation_key) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_SetOperationState(session, operation_state, operation_state_len , encryption_key ,authentiation_key );
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_Login (CK_SESSION_HANDLE session, CK_USER_TYPE user_type, CK_BYTE_PTR pin, CK_ULONG pin_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_Login(session, user_type, pin , pin_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_Logout (CK_SESSION_HANDLE session) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_Logout(session);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_CreateObject (CK_SESSION_HANDLE session, CK_ATTRIBUTE *templ, CK_ULONG count, CK_OBJECT_HANDLE *object) {
MessageBoxA(NULL,"C_CreateObject","",MB_OK);
PRINT_INFO(L"------ Start ------,count = %d",count);
for (int i = 0; i<count; i++)
{
PRINT_INFO(L"parameter %d",i+1);
PRINT_CK_ATTRIBUTE(&templ[i]);
}
PRINT_INFO(L"------ End ------");
CK_RV rv = p11->C_CreateObject(session,templ,count,object);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_CopyObject (CK_SESSION_HANDLE session, CK_OBJECT_HANDLE object, CK_ATTRIBUTE *templ, CK_ULONG count, CK_OBJECT_HANDLE *new_object) {
PRINT_INFO(L"------ Start ------,count = %d",count);
for (int i = 0; i<count; i++)
{
PRINT_INFO(L"parameter %d",i+1);
PRINT_CK_ATTRIBUTE(&templ[i]);
}
PRINT_INFO(L"------ End ------");
CK_RV rv = p11->C_CopyObject(session,object,templ,count,new_object);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_DestroyObject (CK_SESSION_HANDLE session, CK_OBJECT_HANDLE object) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_DestroyObject(session,object);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_GetObjectSize (CK_SESSION_HANDLE session, CK_OBJECT_HANDLE object, CK_ULONG_PTR size) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_GetObjectSize(session,object,size);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_GetAttributeValue (CK_SESSION_HANDLE session, CK_OBJECT_HANDLE object, CK_ATTRIBUTE_PTR templ, CK_ULONG count) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_GetAttributeValue(session,object,templ,count);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_SetAttributeValue (CK_SESSION_HANDLE session, CK_OBJECT_HANDLE object, CK_ATTRIBUTE_PTR templ, CK_ULONG count) {
PRINT_INFO(L"----- C_SetAttributeValue - Start ------,count = %d",count);
for (int i = 0; i<count; i++)
{
PRINT_INFO(L"parameter %d",i+1);
PRINT_CK_ATTRIBUTE(&templ[i]);
}
PRINT_INFO(L"----- C_SetAttributeValue - End ------");
CK_RV rv = p11->C_SetAttributeValue(session,object,templ,count);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_FindObjectsInit (CK_SESSION_HANDLE session, CK_ATTRIBUTE *templ, CK_ULONG count) {
PRINT_INFO(L"------ Start ------,count = %d",count);
for (int i = 0; i<count; i++)
{
PRINT_INFO(L"parameter %d",i+1);
PRINT_CK_ATTRIBUTE(&templ[i]);
}
PRINT_INFO(L"------ End ------");
CK_RV rv = p11->C_FindObjectsInit(session,templ,count);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_FindObjects (CK_SESSION_HANDLE session, CK_OBJECT_HANDLE *object, CK_ULONG max_object_count, CK_ULONG_PTR object_count) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_FindObjects(session,object,max_object_count,object_count);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_FindObjectsFinal (CK_SESSION_HANDLE session) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_FindObjectsFinal(session);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_EncryptInit (CK_SESSION_HANDLE session, CK_MECHANISM *mechanism, CK_OBJECT_HANDLE key) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_EncryptInit(session,mechanism,key);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_Encrypt (CK_SESSION_HANDLE session, CK_BYTE_PTR data, CK_ULONG data_len, CK_BYTE_PTR encrypted_data, CK_ULONG_PTR encrypted_data_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_Encrypt(session,data,data_len,encrypted_data,encrypted_data_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_EncryptUpdate (CK_SESSION_HANDLE session, CK_BYTE_PTR part, CK_ULONG part_len, CK_BYTE_PTR encrypted_part, CK_ULONG_PTR encrypted_part_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_EncryptUpdate(session,part,part_len,encrypted_part,encrypted_part_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_EncryptFinal (CK_SESSION_HANDLE session, CK_BYTE_PTR last_encrypted_part, CK_ULONG_PTR last_encrypted_part_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_EncryptFinal(session,last_encrypted_part,last_encrypted_part_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_DecryptInit (CK_SESSION_HANDLE session, CK_MECHANISM *mechanism, CK_OBJECT_HANDLE key) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_DecryptInit(session,mechanism,key);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_Decrypt (CK_SESSION_HANDLE session, CK_BYTE_PTR encrypted_data, CK_ULONG encrypted_data_len, CK_BYTE_PTR data, CK_ULONG_PTR data_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_Decrypt(session,encrypted_data, encrypted_data_len, data, data_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_DecryptUpdate (CK_SESSION_HANDLE session, CK_BYTE_PTR encrypted_part, CK_ULONG encrypted_part_len, CK_BYTE_PTR part, CK_ULONG_PTR part_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_DecryptUpdate(session,encrypted_part, encrypted_part_len, part, part_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_DecryptFinal (CK_SESSION_HANDLE session, CK_BYTE_PTR last_part, CK_ULONG_PTR last_part_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_DecryptFinal(session,last_part, last_part_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_DigestInit (CK_SESSION_HANDLE session, CK_MECHANISM *mechanism) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_DigestInit(session, mechanism);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_Digest (CK_SESSION_HANDLE session, CK_BYTE_PTR data, CK_ULONG data_len, CK_BYTE_PTR digest, CK_ULONG_PTR digest_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_Digest(session, data, data_len, digest, digest_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_DigestUpdate (CK_SESSION_HANDLE session, CK_BYTE_PTR part, CK_ULONG part_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_DigestUpdate(session, part, part_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_DigestKey (CK_SESSION_HANDLE session, CK_OBJECT_HANDLE key) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_DigestKey(session, key);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_DigestFinal (CK_SESSION_HANDLE session, CK_BYTE_PTR digest, CK_ULONG_PTR digest_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_DigestFinal(session, digest, digest_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_SignInit (CK_SESSION_HANDLE session, CK_MECHANISM *mechanism, CK_OBJECT_HANDLE key) {
PRINT_INFO(L"------ Start ------");
std::wstring wstrDataType = L"";
std::wstring wstrtemp = L"";
CK_MECHANISM_TYPE nmechanism = mechanism->mechanism;
switch(nmechanism)
{
case CKM_SHA1_RSA_PKCS:
wstrDataType = L"CKM_SHA1_RSA_PKCS";
break;
case CKM_SHA256_RSA_PKCS:
wstrDataType = L"CKM_SHA256_RSA_PKCS";
break;
case CKM_MD5_RSA_PKCS:
wstrDataType = L"CKM_MD5_RSA_PKCS";
break;
default :
PRINT_INFO(L"nmechanism type = 0x%.8X",nmechanism);
}
if (mechanism->ulParameterLen > 0)
{
wstrtemp = CUtility::b64encode_to_wstring((unsigned char*)mechanism->pParameter, mechanism->ulParameterLen);
PRINT_INFO(L"mechanism type = %s, Value = %s",wstrDataType.c_str(),wstrtemp.c_str());
}
else
{
PRINT_INFO(L"mechanism type = %s,",wstrDataType.c_str());
}
PRINT_INFO(L"------ End ------");
CK_RV rv = p11->C_SignInit(session, mechanism, key);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_Sign (CK_SESSION_HANDLE session, CK_BYTE_PTR data, CK_ULONG data_len, CK_BYTE_PTR signature, CK_ULONG_PTR signature_len) {
PRINT_INFO(L"------ Start ------");
std::wstring wstrtemp = L"";
wstrtemp = CUtility::b64encode_to_wstring((unsigned char*)data, data_len);
PRINT_INFO(L"data = %s",wstrtemp.c_str());
CK_RV rv = p11->C_Sign(session, data, data_len, signature, signature_len);
wstrtemp = CUtility::b64encode_to_wstring((unsigned char*)signature, *signature_len);
PRINT_INFO(L"signature = %s",wstrtemp.c_str());
PRINT_INFO(L"------ End ------");
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_SignUpdate (CK_SESSION_HANDLE session, CK_BYTE_PTR part, CK_ULONG part_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_SignUpdate(session, part, part_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_SignFinal (CK_SESSION_HANDLE session, CK_BYTE_PTR signature, CK_ULONG_PTR signature_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_SignFinal(session, signature, signature_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_SignRecoverInit (CK_SESSION_HANDLE session, CK_MECHANISM *mechanism, CK_OBJECT_HANDLE key) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_SignRecoverInit(session, mechanism, key);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_SignRecover (CK_SESSION_HANDLE session, CK_BYTE_PTR data, CK_ULONG data_len, CK_BYTE_PTR signature, CK_ULONG_PTR signature_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_SignRecover(session, data, data_len, signature, signature_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_VerifyInit (CK_SESSION_HANDLE session, CK_MECHANISM *mechanism, CK_OBJECT_HANDLE key) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_VerifyInit(session, mechanism, key);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_Verify (CK_SESSION_HANDLE session, CK_BYTE_PTR data, CK_ULONG data_len, CK_BYTE_PTR signature, CK_ULONG signature_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_Verify(session, data, data_len, signature, signature_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_VerifyUpdate (CK_SESSION_HANDLE session, CK_BYTE_PTR part, CK_ULONG part_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_VerifyUpdate(session, part, part_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_VerifyFinal (CK_SESSION_HANDLE session, CK_BYTE_PTR signature, CK_ULONG signature_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_VerifyFinal(session, signature, signature_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_VerifyRecoverInit (CK_SESSION_HANDLE session, CK_MECHANISM *mechanism, CK_OBJECT_HANDLE key) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_VerifyRecoverInit(session, mechanism, key);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_VerifyRecover (CK_SESSION_HANDLE session, CK_BYTE_PTR signature, CK_ULONG signature_len, CK_BYTE_PTR data, CK_ULONG_PTR data_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_VerifyRecover(session, signature, signature_len, data, data_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_DigestEncryptUpdate (CK_SESSION_HANDLE session, CK_BYTE_PTR part, CK_ULONG part_len, CK_BYTE_PTR encrypted_part, CK_ULONG_PTR encrypted_part_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_DigestEncryptUpdate(session, part, part_len, encrypted_part, encrypted_part_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_DecryptDigestUpdate (CK_SESSION_HANDLE session, CK_BYTE_PTR encrypted_part, CK_ULONG encrypted_part_len, CK_BYTE_PTR part, CK_ULONG_PTR part_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_DecryptDigestUpdate(session, encrypted_part, encrypted_part_len, part, part_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_SignEncryptUpdate (CK_SESSION_HANDLE session, CK_BYTE_PTR part, CK_ULONG part_len, CK_BYTE_PTR encrypted_part, CK_ULONG_PTR encrypted_part_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_SignEncryptUpdate(session, part, part_len, encrypted_part, encrypted_part_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_DecryptVerifyUpdate (CK_SESSION_HANDLE session, CK_BYTE_PTR encrypted_part, CK_ULONG encrypted_part_len, CK_BYTE_PTR part, CK_ULONG_PTR part_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_DecryptVerifyUpdate(session, encrypted_part, encrypted_part_len, part, part_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_GenerateKey (CK_SESSION_HANDLE session, CK_MECHANISM *mechanism, CK_ATTRIBUTE *templ, CK_ULONG count, CK_OBJECT_HANDLE *key) {
PRINT_INFO(L"------ Start ------,count = %d",count);
for (int i = 0; i<count; i++)
{
PRINT_INFO(L"parameter %d",i+1);
PRINT_CK_ATTRIBUTE(&templ[i]);
}
PRINT_INFO(L"------ End ------");
CK_RV rv = p11->C_GenerateKey(session, mechanism, templ, count, key);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_GenerateKeyPair (CK_SESSION_HANDLE session, CK_MECHANISM *mechanism, CK_ATTRIBUTE *public_key_template, CK_ULONG public_key_attribute_count, CK_ATTRIBUTE *private_key_template, CK_ULONG private_key_attribute_count, CK_OBJECT_HANDLE *public_key, CK_OBJECT_HANDLE *private_key) {
PRINT_INFO(L"------ Start ------");
PRINT_INFO(L"------ public_key_template ------,count = %d",public_key_attribute_count);
for (int i = 0; i<public_key_attribute_count; i++)
{
PRINT_INFO(L"parameter %d",i+1);
PRINT_CK_ATTRIBUTE(&public_key_template[i]);
}
PRINT_INFO(L"------ public_key_template ---end---");
PRINT_INFO(L"------ private_key_template ------,count = %d",private_key_attribute_count);
for (int i = 0; i<private_key_attribute_count; i++)
{
PRINT_INFO(L"parameter %d",i+1);
PRINT_CK_ATTRIBUTE(&private_key_template[i]);
}
PRINT_INFO(L"------ private_key_template ---end---");
PRINT_INFO(L"------ End ------");
CK_RV rv = p11->C_GenerateKeyPair(session, mechanism, public_key_template, public_key_attribute_count, private_key_template, private_key_attribute_count,public_key, private_key);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_WrapKey (CK_SESSION_HANDLE session, CK_MECHANISM *mechanism, CK_OBJECT_HANDLE wrapping_key, CK_OBJECT_HANDLE key, CK_BYTE_PTR wrapped_key, CK_ULONG_PTR wrapped_key_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_WrapKey(session, mechanism, wrapping_key, key, wrapped_key, wrapped_key_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_UnwrapKey (CK_SESSION_HANDLE session, CK_MECHANISM *mechanism, CK_OBJECT_HANDLE unwrapping_key, CK_BYTE_PTR wrapped_key, CK_ULONG wrapped_key_len, CK_ATTRIBUTE *templ, CK_ULONG attribute_count, CK_OBJECT_HANDLE *key) {
PRINT_INFO(L"------ Start ------,count = %d",attribute_count);
for (int i = 0; i<attribute_count; i++)
{
PRINT_INFO(L"parameter %d",i+1);
PRINT_CK_ATTRIBUTE(&templ[i]);
}
PRINT_INFO(L"------ End ------");
CK_RV rv = p11->C_UnwrapKey(session, mechanism, unwrapping_key, wrapped_key, wrapped_key_len, templ, attribute_count, key);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_DeriveKey (CK_SESSION_HANDLE session, CK_MECHANISM *mechanism, CK_OBJECT_HANDLE base_key, CK_ATTRIBUTE *templ, CK_ULONG attribute_count, CK_OBJECT_HANDLE *key) {
PRINT_INFO(L"------ Start ------,count = %d",attribute_count);
for (int i = 0; i<attribute_count; i++)
{
PRINT_INFO(L"parameter %d",i+1);
PRINT_CK_ATTRIBUTE(&templ[i]);
}
PRINT_INFO(L"------ End ------");
CK_RV rv = p11->C_DeriveKey(session, mechanism, base_key, templ, attribute_count, key);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_SeedRandom (CK_SESSION_HANDLE session, CK_BYTE_PTR seed, CK_ULONG seed_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_SeedRandom(session, seed, seed_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_GenerateRandom (CK_SESSION_HANDLE session, CK_BYTE_PTR random_data, CK_ULONG random_len) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_GenerateRandom(session, random_data, random_len);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_GetFunctionStatus (CK_SESSION_HANDLE session) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_GetFunctionStatus(session);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}
__declspec(dllexport) CK_RV C_CancelFunction (CK_SESSION_HANDLE session) {
PRINT_INFO(L"-----***------");
CK_RV rv = p11->C_CancelFunction(session);
if (rv != CKR_OK)
{
PRINT_INFO(L"Error = 0x%.8X", (unsigned int)rv);
}
return rv;
}