⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htcspact.h

📁 作为信息安全的一辅助工具,主要用于初始化USBKEY,从而使USBKEY存储用户的相关信息.
💻 H
📖 第 1 页 / 共 2 页
字号:
// 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 + -