增加获取HSM私钥句柄

安装包增加libcertex库
增加HSM配置文件rcsp.con
This commit is contained in:
fengweihao
2020-11-25 14:10:26 +08:00
parent d452d7b5f2
commit f3cbd19825
17 changed files with 899 additions and 325 deletions

View File

@@ -0,0 +1,344 @@
//------------------------------------------------------------------------------
// RCSP Project
// Copyright (c) 2007 Scientific Lab. Gamma Technologies. All rights reserved.
//
// R-CSP/R-PKCS11 LIB Loader
//------------------------------------------------------------------------------
#include "tdefs.h"
#include <stdio.h>
#include <string.h>
#ifdef WIND32
#include <windows.h>
#else
#include <stdlib.h>
#include <unistd.h>
#include <dlfcn.h>
#endif
#include "rlib_load.h"
#ifndef WIND32
typedef void* HINSTANCE;
#endif
//------------------------------------------------------------------------------
#ifndef F_CPAcquireContext
#define F_CPAcquireContext 1
#define F_CPGetProvParam 2
#define F_CPReleaseContext 3
#define F_CPSetProvParam 4
#define F_CPDeriveKey 5
#define F_CPDestroyKey 6
#define F_CPDuplicateKey 7
#define F_CPExportKey 8
#define F_CPGenKey 9
#define F_CPGenRandom 10
#define F_CPGetKeyParam 11
#define F_CPGetUserKey 12
#define F_CPImportKey 13
#define F_CPSetKeyParam 14
#define F_CPDecrypt 15
#define F_CPEncrypt 16
#define F_CPCreateHash 17
#define F_CPDestroyHash 18
#define F_CPDuplicateHash 19
#define F_CPGetHashParam 20
#define F_CPHashData 21
#define F_CPHashSessionKey 22
#define F_CPSetHashParam 23
#define F_CPSignHash 24
#define F_CPVerifySignature 25
#endif
//------------------------------------------------------------------------------
#ifndef F_Initialize
#define F_Initialize 31
#define F_Finalize 32
#define F_GetInfo 33
#define F_GetFunctionList 34
#define F_GetSlotList 35
#define F_GetSlotInfo 36
#define F_GetTokenInfo 37
#define F_GetMechanismList 38
#define F_GetMechanismInfo 39
#define F_InitToken 40
#define F_InitPIN 41
#define F_SetPIN 42
#define F_OpenSession 43
#define F_CloseSession 44
#define F_CloseAllSessions 45
#define F_GetSessionInfo 46
#define F_GetOperationState 47
#define F_SetOperationState 48
#define F_Login 49
#define F_Logout 50
#define F_CreateObject 51
#define F_CopyObject 52
#define F_DestroyObject 53
#define F_GetObjectSize 54
#define F_GetAttributeValue 55
#define F_SetAttributeValue 56
#define F_FindObjectsInit 57
#define F_FindObjects 58
#define F_FindObjectsFinal 59
#define F_EncryptInit 60
#define F_Encrypt 61
#define F_EncryptUpdate 62
#define F_EncryptFinal 63
#define F_DecryptInit 64
#define F_Decrypt 65
#define F_DecryptUpdate 66
#define F_DecryptFinal 67
#define F_DigestInit 68
#define F_Digest 69
#define F_DigestUpdate 70
#define F_DigestKey 71
#define F_DigestFinal 72
#define F_SignInit 73
#define F_Sign 74
#define F_SignUpdate 75
#define F_SignFinal 76
#define F_SignRecoverInit 77
#define F_SignRecover 78
#define F_VerifyInit 79
#define F_Verify 80
#define F_VerifyUpdate 81
#define F_VerifyFinal 82
#define F_VerifyRecoverInit 83
#define F_VerifyRecover 84
#define F_DigestEncryptUpdate 85
#define F_DecryptDigestUpdate 86
#define F_SignEncryptUpdate 87
#define F_DecryptVerifyUpdate 88
#define F_GenerateKey 89
#define F_GenerateKeyPair 90
#define F_WrapKey 91
#define F_UnwrapKey 92
#define F_DeriveKey 93
#define F_SeedRandom 94
#define F_GenerateRandom 95
#define F_GetFunctionStatus 96
#define F_CancelFunction 97
#define F_WaitForSlotEvent 98
#endif
//------------------------------------------------------------------------------
CK_C_Initialize FC_Initialize;
CK_C_Finalize FC_Finalize;
CK_C_GetInfo FC_GetInfo;
CK_C_GetFunctionList FC_GetFunctionList;
CK_C_GetSlotList FC_GetSlotList;
CK_C_GetSlotInfo FC_GetSlotInfo;
CK_C_GetTokenInfo FC_GetTokenInfo;
CK_C_GetMechanismList FC_GetMechanismList;
CK_C_GetMechanismInfo FC_GetMechanismInfo;
CK_C_InitToken FC_InitToken;
CK_C_InitPIN FC_InitPIN;
CK_C_SetPIN FC_SetPIN;
CK_C_OpenSession FC_OpenSession;
CK_C_CloseSession FC_CloseSession;
CK_C_CloseAllSessions FC_CloseAllSessions;
CK_C_GetSessionInfo FC_GetSessionInfo;
CK_C_GetOperationState FC_GetOperationState;
CK_C_SetOperationState FC_SetOperationState;
CK_C_Login FC_Login;
CK_C_Logout FC_Logout;
CK_C_CreateObject FC_CreateObject;
CK_C_CopyObject FC_CopyObject;
CK_C_DestroyObject FC_DestroyObject;
CK_C_GetObjectSize FC_GetObjectSize;
CK_C_GetAttributeValue FC_GetAttributeValue;
CK_C_SetAttributeValue FC_SetAttributeValue;
CK_C_FindObjectsInit FC_FindObjectsInit;
CK_C_FindObjects FC_FindObjects;
CK_C_FindObjectsFinal FC_FindObjectsFinal;
CK_C_EncryptInit FC_EncryptInit;
CK_C_Encrypt FC_Encrypt;
CK_C_EncryptUpdate FC_EncryptUpdate;
CK_C_EncryptFinal FC_EncryptFinal;
CK_C_DecryptInit FC_DecryptInit;
CK_C_Decrypt FC_Decrypt;
CK_C_DecryptUpdate FC_DecryptUpdate;
CK_C_DecryptFinal FC_DecryptFinal;
CK_C_DigestInit FC_DigestInit;
CK_C_Digest FC_Digest;
CK_C_DigestUpdate FC_DigestUpdate;
CK_C_DigestKey FC_DigestKey;
CK_C_DigestFinal FC_DigestFinal;
CK_C_SignInit FC_SignInit;
CK_C_Sign FC_Sign;
CK_C_SignUpdate FC_SignUpdate;
CK_C_SignFinal FC_SignFinal;
CK_C_SignRecoverInit FC_SignRecoverInit;
CK_C_SignRecover FC_SignRecover;
CK_C_VerifyInit FC_VerifyInit;
CK_C_Verify FC_Verify;
CK_C_VerifyUpdate FC_VerifyUpdate;
CK_C_VerifyFinal FC_VerifyFinal;
CK_C_VerifyRecoverInit FC_VerifyRecoverInit;
CK_C_VerifyRecover FC_VerifyRecover;
CK_C_DigestEncryptUpdate FC_DigestEncryptUpdate;
CK_C_DecryptDigestUpdate FC_DecryptDigestUpdate;
CK_C_SignEncryptUpdate FC_SignEncryptUpdate;
CK_C_DecryptVerifyUpdate FC_DecryptVerifyUpdate;
CK_C_GenerateKey FC_GenerateKey;
CK_C_GenerateKeyPair FC_GenerateKeyPair;
CK_C_WrapKey FC_WrapKey;
CK_C_UnwrapKey FC_UnwrapKey;
CK_C_DeriveKey FC_DeriveKey;
CK_C_SeedRandom FC_SeedRandom;
CK_C_GenerateRandom FC_GenerateRandom;
CK_C_GetFunctionStatus FC_GetFunctionStatus;
CK_C_CancelFunction FC_CancelFunction;
CK_C_WaitForSlotEvent FC_WaitForSlotEvent;
//------------------------------------------------------------------------------
HINSTANCE load_lib(char *lib)
{
#ifdef WIND32
return LoadLibrary(lib);
#else
return dlopen(lib,RTLD_LAZY);
#endif
}
//------------------------------------------------------------------------------
void* get_sym(HINSTANCE inst, const char *proc)
{
#ifdef WIND32
return (void*) GetProcAddress(inst,proc);
#else
return dlsym(inst,proc);
#endif
}
//------------------------------------------------------------------------------
void free_lib(HINSTANCE inst)
{
#ifdef WIND32
FreeLibrary(inst);
#else
dlclose(inst);
#endif
}
//------------------------------------------------------------------------------
int Get_PKCS_Fancs(HINSTANCE hLib)
{
FC_Initialize =(CK_C_Initialize ) get_sym(hLib,"C_Initialize" ); if (!FC_Initialize ) return F_Initialize;
FC_Finalize =(CK_C_Finalize ) get_sym(hLib,"C_Finalize" ); if (!FC_Finalize ) return F_Finalize;
FC_GetInfo =(CK_C_GetInfo ) get_sym(hLib,"C_GetInfo" ); if (!FC_GetInfo ) return F_GetInfo;
FC_GetFunctionList =(CK_C_GetFunctionList ) get_sym(hLib,"C_GetFunctionList" ); if (!FC_GetFunctionList ) return F_GetFunctionList;
FC_GetSlotList =(CK_C_GetSlotList ) get_sym(hLib,"C_GetSlotList" ); if (!FC_GetSlotList ) return F_GetSlotList;
FC_GetSlotInfo =(CK_C_GetSlotInfo ) get_sym(hLib,"C_GetSlotInfo" ); if (!FC_GetSlotInfo ) return F_GetSlotInfo;
FC_GetTokenInfo =(CK_C_GetTokenInfo ) get_sym(hLib,"C_GetTokenInfo" ); if (!FC_GetTokenInfo ) return F_GetTokenInfo;
FC_GetMechanismList =(CK_C_GetMechanismList ) get_sym(hLib,"C_GetMechanismList" ); if (!FC_GetMechanismList ) return F_GetMechanismList;
FC_GetMechanismInfo =(CK_C_GetMechanismInfo ) get_sym(hLib,"C_GetMechanismInfo" ); if (!FC_GetMechanismInfo ) return F_GetMechanismInfo;
FC_InitToken =(CK_C_InitToken ) get_sym(hLib,"C_InitToken" ); if (!FC_InitToken ) return F_InitToken;
FC_InitPIN =(CK_C_InitPIN ) get_sym(hLib,"C_InitPIN" ); if (!FC_InitPIN ) return F_InitPIN;
FC_SetPIN =(CK_C_SetPIN ) get_sym(hLib,"C_SetPIN" ); if (!FC_SetPIN ) return F_SetPIN;
FC_OpenSession =(CK_C_OpenSession ) get_sym(hLib,"C_OpenSession" ); if (!FC_OpenSession ) return F_OpenSession;
FC_CloseSession =(CK_C_CloseSession ) get_sym(hLib,"C_CloseSession" ); if (!FC_CloseSession ) return F_CloseSession;
FC_CloseAllSessions =(CK_C_CloseAllSessions ) get_sym(hLib,"C_CloseAllSessions" ); if (!FC_CloseAllSessions ) return F_CloseAllSessions;
FC_GetSessionInfo =(CK_C_GetSessionInfo ) get_sym(hLib,"C_GetSessionInfo" ); if (!FC_GetSessionInfo ) return F_GetSessionInfo;
FC_GetOperationState =(CK_C_GetOperationState ) get_sym(hLib,"C_GetOperationState" ); if (!FC_GetOperationState ) return F_GetOperationState;
FC_SetOperationState =(CK_C_SetOperationState ) get_sym(hLib,"C_SetOperationState" ); if (!FC_SetOperationState ) return F_SetOperationState;
FC_Login =(CK_C_Login ) get_sym(hLib,"C_Login" ); if (!FC_Login ) return F_Login;
FC_Logout =(CK_C_Logout ) get_sym(hLib,"C_Logout" ); if (!FC_Logout ) return F_Logout;
FC_CreateObject =(CK_C_CreateObject ) get_sym(hLib,"C_CreateObject" ); if (!FC_CreateObject ) return F_CreateObject;
FC_CopyObject =(CK_C_CopyObject ) get_sym(hLib,"C_CopyObject" ); if (!FC_CopyObject ) return F_CopyObject;
FC_DestroyObject =(CK_C_DestroyObject ) get_sym(hLib,"C_DestroyObject" ); if (!FC_DestroyObject ) return F_DestroyObject;
FC_GetObjectSize =(CK_C_GetObjectSize ) get_sym(hLib,"C_GetObjectSize" ); if (!FC_GetObjectSize ) return F_GetObjectSize;
FC_GetAttributeValue =(CK_C_GetAttributeValue ) get_sym(hLib,"C_GetAttributeValue" ); if (!FC_GetAttributeValue ) return F_GetAttributeValue;
FC_SetAttributeValue =(CK_C_SetAttributeValue ) get_sym(hLib,"C_SetAttributeValue" ); if (!FC_SetAttributeValue ) return F_SetAttributeValue;
FC_FindObjectsInit =(CK_C_FindObjectsInit ) get_sym(hLib,"C_FindObjectsInit" ); if (!FC_FindObjectsInit ) return F_FindObjectsInit;
FC_FindObjects =(CK_C_FindObjects ) get_sym(hLib,"C_FindObjects" ); if (!FC_FindObjects ) return F_FindObjects;
FC_FindObjectsFinal =(CK_C_FindObjectsFinal ) get_sym(hLib,"C_FindObjectsFinal" ); if (!FC_FindObjectsFinal ) return F_FindObjectsFinal;
FC_EncryptInit =(CK_C_EncryptInit ) get_sym(hLib,"C_EncryptInit" ); if (!FC_EncryptInit ) return F_EncryptInit;
FC_Encrypt =(CK_C_Encrypt ) get_sym(hLib,"C_Encrypt" ); if (!FC_Encrypt ) return F_Encrypt;
FC_EncryptUpdate =(CK_C_EncryptUpdate ) get_sym(hLib,"C_EncryptUpdate" ); if (!FC_EncryptUpdate ) return F_EncryptUpdate;
FC_EncryptFinal =(CK_C_EncryptFinal ) get_sym(hLib,"C_EncryptFinal" ); if (!FC_EncryptFinal ) return F_EncryptFinal;
FC_DecryptInit =(CK_C_DecryptInit ) get_sym(hLib,"C_DecryptInit" ); if (!FC_DecryptInit ) return F_DecryptInit;
FC_Decrypt =(CK_C_Decrypt ) get_sym(hLib,"C_Decrypt" ); if (!FC_Decrypt ) return F_Decrypt;
FC_DecryptUpdate =(CK_C_DecryptUpdate ) get_sym(hLib,"C_DecryptUpdate" ); if (!FC_DecryptUpdate ) return F_DecryptUpdate;
FC_DecryptFinal =(CK_C_DecryptFinal ) get_sym(hLib,"C_DecryptFinal" ); if (!FC_DecryptFinal ) return F_DecryptFinal;
FC_DigestInit =(CK_C_DigestInit ) get_sym(hLib,"C_DigestInit" ); if (!FC_DigestInit ) return F_DigestInit;
FC_Digest =(CK_C_Digest ) get_sym(hLib,"C_Digest" ); if (!FC_Digest ) return F_Digest;
FC_DigestUpdate =(CK_C_DigestUpdate ) get_sym(hLib,"C_DigestUpdate" ); if (!FC_DigestUpdate ) return F_DigestUpdate;
FC_DigestKey =(CK_C_DigestKey ) get_sym(hLib,"C_DigestKey" ); if (!FC_DigestKey ) return F_DigestKey;
FC_DigestFinal =(CK_C_DigestFinal ) get_sym(hLib,"C_DigestFinal" ); if (!FC_DigestFinal ) return F_DigestFinal;
FC_SignInit =(CK_C_SignInit ) get_sym(hLib,"C_SignInit" ); if (!FC_SignInit ) return F_SignInit;
FC_Sign =(CK_C_Sign ) get_sym(hLib,"C_Sign" ); if (!FC_Sign ) return F_Sign;
FC_SignUpdate =(CK_C_SignUpdate ) get_sym(hLib,"C_SignUpdate" ); if (!FC_SignUpdate ) return F_SignUpdate;
FC_SignFinal =(CK_C_SignFinal ) get_sym(hLib,"C_SignFinal" ); if (!FC_SignFinal ) return F_SignFinal;
FC_SignRecoverInit =(CK_C_SignRecoverInit ) get_sym(hLib,"C_SignRecoverInit" ); if (!FC_SignRecoverInit ) return F_SignRecoverInit;
FC_SignRecover =(CK_C_SignRecover ) get_sym(hLib,"C_SignRecover" ); if (!FC_SignRecover ) return F_SignRecover;
FC_VerifyInit =(CK_C_VerifyInit ) get_sym(hLib,"C_VerifyInit" ); if (!FC_VerifyInit ) return F_VerifyInit;
FC_Verify =(CK_C_Verify ) get_sym(hLib,"C_Verify" ); if (!FC_Verify ) return F_Verify;
FC_VerifyUpdate =(CK_C_VerifyUpdate ) get_sym(hLib,"C_VerifyUpdate" ); if (!FC_VerifyUpdate ) return F_VerifyUpdate;
FC_VerifyFinal =(CK_C_VerifyFinal ) get_sym(hLib,"C_VerifyFinal" ); if (!FC_VerifyFinal ) return F_VerifyFinal;
FC_VerifyRecoverInit =(CK_C_VerifyRecoverInit ) get_sym(hLib,"C_VerifyRecoverInit" ); if (!FC_VerifyRecoverInit ) return F_VerifyRecoverInit;
FC_VerifyRecover =(CK_C_VerifyRecover ) get_sym(hLib,"C_VerifyRecover" ); if (!FC_VerifyRecover ) return F_VerifyRecover;
FC_DigestEncryptUpdate=(CK_C_DigestEncryptUpdate) get_sym(hLib,"C_DigestEncryptUpdate"); if (!FC_DigestEncryptUpdate) return F_DigestEncryptUpdate;
FC_DecryptDigestUpdate=(CK_C_DecryptDigestUpdate) get_sym(hLib,"C_DecryptDigestUpdate"); if (!FC_DecryptDigestUpdate) return F_DecryptDigestUpdate;
FC_SignEncryptUpdate =(CK_C_SignEncryptUpdate ) get_sym(hLib,"C_SignEncryptUpdate" ); if (!FC_SignEncryptUpdate ) return F_SignEncryptUpdate;
FC_DecryptVerifyUpdate=(CK_C_DecryptVerifyUpdate) get_sym(hLib,"C_DecryptVerifyUpdate"); if (!FC_DecryptVerifyUpdate) return F_DecryptVerifyUpdate;
FC_GenerateKey =(CK_C_GenerateKey ) get_sym(hLib,"C_GenerateKey" ); if (!FC_GenerateKey ) return F_GenerateKey;
FC_GenerateKeyPair =(CK_C_GenerateKeyPair ) get_sym(hLib,"C_GenerateKeyPair" ); if (!FC_GenerateKeyPair ) return F_GenerateKeyPair;
FC_WrapKey =(CK_C_WrapKey ) get_sym(hLib,"C_WrapKey" ); if (!FC_WrapKey ) return F_WrapKey;
FC_UnwrapKey =(CK_C_UnwrapKey ) get_sym(hLib,"C_UnwrapKey" ); if (!FC_UnwrapKey ) return F_UnwrapKey;
FC_DeriveKey =(CK_C_DeriveKey ) get_sym(hLib,"C_DeriveKey" ); if (!FC_DeriveKey ) return F_DeriveKey;
FC_SeedRandom =(CK_C_SeedRandom ) get_sym(hLib,"C_SeedRandom" ); if (!FC_SeedRandom ) return F_SeedRandom;
FC_GenerateRandom =(CK_C_GenerateRandom ) get_sym(hLib,"C_GenerateRandom" ); if (!FC_GenerateRandom ) return F_GenerateRandom;
FC_GetFunctionStatus =(CK_C_GetFunctionStatus ) get_sym(hLib,"C_GetFunctionStatus" ); if (!FC_GetFunctionStatus ) return F_GetFunctionStatus;
FC_CancelFunction =(CK_C_CancelFunction ) get_sym(hLib,"C_CancelFunction" ); if (!FC_CancelFunction ) return F_CancelFunction;
FC_WaitForSlotEvent =(CK_C_WaitForSlotEvent ) get_sym(hLib,"C_WaitForSlotEvent" ); if (!FC_WaitForSlotEvent ) return F_WaitForSlotEvent;
return 0;
}
//------------------------------------------------------------------------------
HINSTANCE hPkcsLib=NULL;
//------------------------------------------------------------------------------
#ifdef WIND32
int GetCapiPath(char *path)
{
HKEY hKey;
DWORD Disposition,DataSize;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,CSP_REGKEY,0,KEY_READ,&hKey)!=ERROR_SUCCESS) return 1;
path[0]=0; DataSize=255; RegQueryValueEx(hKey,"Image Path",0,&Disposition,(BYTE *)path,&DataSize);
RegCloseKey(hKey);
if (!strlen(path)) return 2;
return 0;
}
#else
int GetCapiPath(char *path) {strcpy(path,CAPI_LIB_PATH); return 0;}
#endif
//------------------------------------------------------------------------------
#ifdef WIND32
int GetPkcsPath(char *path)
{return GetCapiPath(path);}
#else
int GetPkcsPath(char *path) {strcpy(path,PKCS_LIB_PATH); return 0;}
#endif
//------------------------------------------------------------------------------
int LoadPkcsLib(char *dllpkcs)
{
int code;
char path[260];
if (hPkcsLib) return 0;
if ((dllpkcs)&&(*dllpkcs)) strcpy(path,dllpkcs);
else if (GetPkcsPath(path)) return -1;
hPkcsLib=load_lib(dllpkcs);
if (!hPkcsLib) return -2;
code=Get_PKCS_Fancs(hPkcsLib);
if (code) {free_lib(hPkcsLib); hPkcsLib=NULL;}
return code;
}
//------------------------------------------------------------------------------
void FreePkcsLib(void)
{
if (hPkcsLib) {free_lib(hPkcsLib); hPkcsLib=NULL;}
}
//------------------------------------------------------------------------------
int do_GetFunctionList( void )
{
CK_RV rc = 0;
extern CK_FUNCTION_LIST *funcs;
rc=FC_GetFunctionList(&funcs);
if (rc != CKR_OK) {printf ("err %x\n",rc); return rc;}
return 0;
}
//------------------------------------------------------------------------------