📄 htcspact.h
字号:
// HTCSPAct.h
#ifndef _HTCSPACT_H
#define _HTCSPACT_H
#include <windows.h>
// 格式化HaiKey参数
#define HT_UNKNOWN_APP 0x00000000 // 未知应用
#define HT_CSP_APP 0x00000001 // CSP应用
#define HT_BLANK_HW 0x80000000 // 空白HaiKey
#define HT_LABEL_LEN 32 // HaiKey的名字的最大长度
// 自创建文件
#define MAX_FILE_NUM 0xFF // 能创建的最大文件个数
#define MAX_FILE_LEN 0x8000-3 // 文件的最大长度,32K-3,3字节为内部管理文件用
// 口令长度
#define MIN_UI_PIN_LEN 1 // 口令的最小长度
#define MAX_UI_PIN_LEN 16 // 口令的最大长度
// 校验口令的模式
#define HT_NEEDNT_PIN 0x00 // 不需要任何口令
#define HT_SO_PIN 0x01 // 使用管理员口令
#define HT_USER_PIN 0x02 // 使用用户口令
// CSP
#define HAITAI_CSP_NAME "HaiTai Cryptographic Service Provider" // CSP名字
#define PROVIDER_TYPE PROV_RSA_FULL // CSP类型
#define MAX_CON_NAME_LEN 64 // 密钥容器名字的最大长度
// 密钥容器属性
#define HC_EXCHANGE_KEY_EXISTING 0x00000001 // 加密密钥已存在
#define HC_EXCHANGE_CERT_EXISTING 0x00000003 // 加密证书已存在
#define HC_SIGN_KEY_EXISTING 0x00000001<<16 // 签名密钥已存在
#define HC_SIGN_CERT_EXISTING 0x00000003<<16 // 签名证书已存在
// CSP中的RSA属性,copy from wincrypt.h
#define AT_KEYEXCHANGE 1 // 交换密钥,即加密密钥
#define AT_SIGNATURE 2 // 签名密钥
// RSA公私钥类型
#define HT_RSA_PUB_KEY 1 // RSA公钥
#define HT_RSA_PRI_KEY 2 // RSA私钥
// RSA补码模式
#define RSA_ZERO_PADDING 0 // 高位前补0x00,做RSA运算时输入数据的长度最长为128字节
#define RSA_PKCS1_PADDING 1 // PKCS#1补码,加密或签名时输入数据的长度最长为128-11字节
#define RSA_NO_PADDING 3 // 不做补码,做RSA运算时输入数据的长度必须与N的长度相同,为128字节
#define RSA_PKCS1_OAEP_PADDING 4 // PKCS#1的OAEP补码,Hash运算使用SHA1,加密时输入数据的长度最长为128-2*21字节
// 对称算法加解密模式
#define ENCRYPT_MODE 1 // 加密模式
#define DECRYPT_MODE 2 // 解密模式
// 硬件对称算法类型
#define HT_DES_KEY 1 // DES密钥,密钥长8字节
#define HT_3DES_112_KEY 2 // 3DES_112密钥,密钥长16字节
#define HT_SSF33_KEY 3 // SSF33,密钥长16字节
#ifdef __cplusplus
extern "C" {
#endif
// 取HaiKey的序列号
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// OUT char szSerial[17]:HaiKey的序列号,序列号本身为16个字符,最后1个字节为结束符NULL
// 返回0成功,其它失败
DWORD _stdcall HC_GetSerial
(
IN LPVOID hContext,
IN LPCSTR szReader,
OUT char szSerial[17]
);
// 取HaiKey的剩余空间
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// OUT DWORD *pdwFreeSize:HaiKey的剩余空间大小
// 返回0成功,其它失败
DWORD _stdcall HC_GetFreeSize
(
IN LPVOID hContext,
IN LPCSTR szReader,
OUT DWORD *pdwFreeSize
);
// 生成随机数
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// IN DWORD dwRandomLen:生成的随机数的长度
// OUT BYTE *pbRandom:生成的随机数
// 返回0成功,其它失败
DWORD _stdcall HC_GenRandom
(
IN LPVOID hContext,
IN LPCSTR szReader,
IN DWORD dwRandomLen,
OUT BYTE *pbRandom
);
// 校验用户口令
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// IN LPCTSTR szUserPin:HaiKey的用户口令
// OUT BYTE *pbRetryNum:当HaiKey的用户口令错误时,返回用户口令还能重试的次数
// 返回0成功,其它失败
DWORD _stdcall HC_VerifyUserPin
(
IN LPVOID hContext,
IN LPCSTR szReader,
IN LPCSTR szUserPin,
OUT BYTE *pbRetryNum
);
// 修改用户口令
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// IN LPCTSTR szOldPin:HaiKey的旧的用户口令
// IN LPCTSTR szNewPin:HaiKey的新的用户口令
// OUT BYTE *pbRetryNum:当HaiKey的旧的用户口令错误时,返回用户口令还能重试的次数
// 返回0成功,其它失败
DWORD _stdcall HC_ChangeUserPin
(
IN LPVOID hContext,
IN LPCSTR szReader,
IN LPCSTR szOldPin,
IN LPCSTR szNewPin,
OUT BYTE *pbRetryNum
);
// 校验管理员口令
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// IN LPCTSTR szSOPin:HaiKey的管理员口令
// OUT BYTE *pbRetryNum:当HaiKey的管理员口令错误时,返回管理员口令还能重试的次数
// 返回0成功,其它失败
DWORD _stdcall HC_VerifySOPin
(
IN LPVOID hContext,
IN LPCSTR szReader,
IN LPCSTR szSOPin,
OUT BYTE *pbRetryNum
);
// 修改管理员口令
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// IN LPCTSTR szOldPin:HaiKey的旧的管理员口令
// IN LPCTSTR szNewPin:HaiKey的新的管理员口令
// OUT BYTE *pbRetryNum:当HaiKey的旧的管理员口令错误时,返回管理员口令还能重试的次数
// 返回0成功,其它失败
DWORD _stdcall HC_ChangeSOPin
(
IN LPVOID hContext,
IN LPCSTR szReader,
IN LPCSTR szOldPin,
IN LPCSTR szNewPin,
OUT BYTE *pbRetryNum
);
// 重新设置用户口令
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// IN LPCTSTR szSOPin:HaiKey的管理员口令
// IN LPCTSTR szNewUserPin:HaiKey的新的用户口令
// OUT BYTE *pbRetryNum:当HaiKey的管理员口令错误时,返回管理员口令还能重试的次数
// 返回0成功,其它失败
DWORD _stdcall HC_ReWriteUserPin
(
IN LPVOID hContext,
IN LPCSTR szReader,
IN LPCSTR szSOPin,
IN LPCSTR szNewUserPin,
OUT BYTE *pbRetryNum
);
// 格式化HaiKey
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// IN BOOL fUseCustomCtrlCode:是否使用定制的传输代码,默认为FALSE
// IN BOOL fForcePin:是否每次使用私钥都要校验用户口令,默认为FALSE
// IN LPCTSTR szSOPin:HaiKey的管理员口令
// IN LPCTSTR szUserPin:HaiKey的用户口令
// IN LPCSTR szLabel:HaiKey的名字,最大长度为HT_LABEL_LEN
// IN DWORD dwMultiApp:支持的应用,目前仅能为HT_CSP_APP
// IN BOOL fShowUI:是否显示提示的用户界面
// 返回0成功,其它失败
DWORD _stdcall HC_FormatHW
(
IN LPVOID hContext,
IN LPCSTR szReader,
IN BOOL fUseCustomCtrlCode,
IN BOOL fForcePin,
IN LPCSTR szSOPin,
IN LPCSTR szUserPin,
IN LPCSTR szLabel,
IN DWORD dwMultiApp,
IN BOOL fShowUI
);
// 擦除HaiKey
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// IN LPCTSTR szSOPin:HaiKey的管理员口令
// IN BOOL fShowUI:是否显示提示的用户界面
// OUT BYTE *pbRetryNum:当HaiKey的管理员口令错误时,返回管理员口令还能重试的次数
// 返回0成功,其它失败
DWORD _stdcall HC_EraseHW
(
IN LPVOID hContext,
IN LPCSTR szReader,
IN LPCSTR szSOPin,
IN BOOL fShowUI,
OUT BYTE *pbRetryNum
);
// 取当前HaiKey支持的应用
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// OUT DWORD *pdwHWApp:当前Haikey支持的应用,目前仅支持HT_CSP_APP,
// 如果pdwHWApp&HT_CSP_APP==HT_CSP_APP,说明该HaiKey支持CSP应用
// 可能的其它值为HT_UNKNOWN_APP、HT_BLANK_HW
DWORD _stdcall HC_GetHWApp
(
IN LPVOID hContext,
IN LPCSTR szReader,
OUT DWORD *pdwHWApp
);
// 读HaiKey的名字
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// OUT char *pszLabel:返回HaiKey的名字
// IN OUT DWORD *pdwLabelLen:输入时,为pszLabel缓冲区的长度;输出时,为HaiKey名字的长度,包括结尾的NULL
// 当pszLabel为NULL时,*pdwLabelLen返回HaiKey名字的长度,包括结尾的NULL
// HaiKey的名字的最大长度为HT_LABEL_LEN,*pdwLabelLen最大为strlen(pszLabel)+1
// 返回0成功,其它失败
DWORD _stdcall HC_ReadLabel
(
IN LPVOID hContext,
IN LPCSTR szReader,
OUT char *pszLabel,
IN OUT DWORD *pdwLabelLen
);
// 修改HaiKey的名字
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// IN LPCTSTR szUserPin:HaiKey的用户口令
// IN LPCSTR szLabel:HaiKey的名字,最大长度为HT_LABEL_LEN
// OUT BYTE *pbRetryNum:当HaiKey的用户口令错误时,返回用户口令还能重试的次数
// 返回0成功,其它失败
DWORD _stdcall HC_WriteLabel
(
IN LPVOID hContext,
IN LPCSTR szReader,
IN LPCSTR szUserPin,
IN LPCSTR szLabel, // NULL end string, not LV format
OUT BYTE *pbRetryNum
);
// 创建文件,文件的长度必须是该文件要保存数据的最大长度
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// IN DWORD dwFileIndex:要创建文件的索引号,0<=dwFileIndex<=MAX_FILE_NUM
// IN DWORD dwReadRight:该文件的读权限,为以下值之一:HT_SO_PIN、HT_USER_PIN、HT_NEEDNT_PIN
// IN DWORD dwWriteRight:该文件的写权限,为以下值之一:HT_SO_PIN、HT_USER_PIN、HT_NEEDNT_PIN
// IN DWORD dwFileLen:要创建的文件长度,0<=dwFileLen<=MAX_FILE_LEN
// 返回0成功,其它失败
DWORD _stdcall HC_CreateFile
(
IN LPVOID hContext,
IN LPCTSTR szReader,
IN DWORD dwFileIndex,
IN DWORD dwReadRight,
IN DWORD dwWriteRight,
IN DWORD dwFileLen
);
// 写文件
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// IN DWORD dwFileIndex:文件的索引号,0<=dwFileIndex<=MAX_FILE_NUM
// IN DWORD dwPinType:写文件时要使用的口令类型,可以为HT_SO_PIN、HT_USER_PIN或HT_NEEDNT_PIN之一
// IN LPCTSTR szPin:写文件时需要的口令,当dwPinType为HT_NEEDNT_PIN时,忽略该参数
// IN BYTE *pbData:要写入的用户数据
// IN DWORD dwDataLen:要写入的用户数据的长度,0<=dwDataLen<=MAX_FILE_LEN
// OUT BYTE *pbRetryNum:当HaiKey的口令错误时,返回口令还能重试的次数
// 返回0成功,其它失败
DWORD _stdcall HC_WriteFile
(
IN LPVOID hContext,
IN LPCTSTR szReader,
IN DWORD dwFileIndex,
IN DWORD dwPinType,
IN LPCTSTR szPin,
IN BYTE *pbData,
IN DWORD dwDataLen,
OUT BYTE *pbRetryNum
);
// 读文件
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// IN DWORD dwFileIndex:文件的索引号,0<=dwFileIndex<=MAX_FILE_NUM
// IN DWORD dwPinType:读文件时要使用的口令类型,可以为HT_SO_PIN、HT_USER_PIN或HT_NEEDNT_PIN之一
// IN LPCTSTR szPin:读文件时需要的口令,当dwPinType为HT_NEEDNT_PIN时,忽略该参数
// IN BYTE *pbData:返回读出的数据
// IN DWORD *pdwReadLen:输入时,表示要读的数据的长度,此时pbData应当已经分配内存;输出时,表示实际读出的数据的长度
// 当pbData为NULL时,返回该文件中所保存数据的长度
// 当*pdwReadLen==MAX_FILE_LEN且pbData!=NULL时,一定能够读出该文件的数据
// OUT BYTE *pbRetryNum:当HaiKey的口令错误时,返回口令还能重试的次数
// 返回0成功,其它失败
DWORD _stdcall HC_ReadFile
(
IN LPVOID hContext,
IN LPCTSTR szReader,
IN DWORD dwFileIndex,
IN DWORD dwPinType,
IN LPCTSTR szPin,
IN BYTE *pbData,
IN DWORD *pdwReadLen,
OUT BYTE *pbRetryNum
);
// 枚举HaiKey中密钥容器的个数
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// OUT DWORD *pdwContainerNum:返回HaiKey中密钥容器的个数
// 返回0成功,其它失败
DWORD _stdcall HC_GetContainerNum
(
IN LPVOID hContext,
IN LPCTSTR szReader,
OUT DWORD *pdwContainerNum
);
// 取HaiKey中密钥容器的名字和属性
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// IN DWORD dwContainerIndex:要检索的密钥容器的索引值,0<=dwContainerIndex<=*pdwContainerNum-1
// OUT LPTSTR pszContainerName:返回的密钥容器名字
// 当pszContainerName==NUL时,pdwContainerNameLen返回密钥容器名字的长度
// IN OUT DWORD *pdwContainerNameLen:输入时,为pszContainerName缓冲区的长度,
// 输出时,为密钥容器名字的长度(包括结尾的NULL字符)
// OUT DWORD *pdwContainerParam:返回的密钥容器的属性,其值见说明
// 返回0成功,其它失败
DWORD _stdcall HC_GetContainerName
(
IN LPVOID hContext,
IN LPCTSTR szReader,
IN DWORD dwContainerIndex,
OUT LPTSTR pszContainerName,
IN OUT DWORD *pdwContainerNameLen,
OUT DWORD *pdwContainerParam
);
// 创建密钥容器
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// IN LPCTSTR szUserPin:HaiKey的用户口令
// IN LPCTSTR szContainerName:密钥容器名字,如果szContainerName为NULL或长度为0,则在函数内部生成GUID做为密钥容器的名字
// 密钥容器名字的长度最长为MAX_CON_NAME_LEN
// OUT BYTE *pbRetryNum:当HaiKey的用户口令错误时,返回用户口令还能重试的次数
// 返回0成功,其它失败
DWORD _stdcall HC_CreateContainer
(
IN LPVOID hContext,
IN LPCTSTR szReader,
IN LPCTSTR szUserPin,
IN LPCTSTR szContainerName,
OUT BYTE *pbRetryNum
);
// 删除密钥容器
// IN LPVOID hContext:PC/SC上下文
// IN LPCTSTR szReader:读卡器名字
// IN LPCTSTR szUserPin:HaiKey的用户口令
// IN LPCTSTR szContainerName:密钥容器名字
// OUT BYTE *pbRetryNum:当HaiKey的用户口令错误时,返回用户口令还能重试的次数
// 返回0成功,其它失败
DWORD _stdcall HC_DelContainer
(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -