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

📄 bjcakey.h

📁 手机智能卡开发
💻 H
📖 第 1 页 / 共 2 页
字号:
//===========================================================================
//
// 		Copyright (c) 2004-2005 BJCA 保留所有权利。
//
//===========================================================================
//
// 		USBKEY  API 支持平台:WIN98/2K/XP...
//
//===========================================================================
// 		文件名:	BJCAKEY.H
//---------------------------------------------------------------------------
// 		描  述:		
//				
//				封装USBKEY的接口,提供USBKEY的基本功能
//
//---------------------------------------------------------------------------
//		修  改:
//
//			2004.11.5	- V1.0 - CAOWEI : 创建
//			2004.11.12	- V1.0 - Joyce Peng : 开发/测试
//			2004.11.18	- V1, 0, 0, 1 - CAOWEI : 修改: 增加分别导入公钥、私钥函数
//												修改容器名称定义,全部为unsigned char 传入长度
//			2004.11.22  - V1, 0, 0, 2 - CAOWEI : 增加SSF33密钥加密/解密函数
//			2004.12.15	- V1, 0, 0, 3 - CAOWEI : 增加GetBjcaKeyParam/BjcaKeyBlank函数
//			2004.12.19	- V1, 0, 0, 4 - CAOWEI : 修改类型,修改取得ekey信息的返回值
//			2004.02.22	- V1, 0, 0, 5 - CAOWEI : 增加得到密码重试的次数,增加接口OpenSpecCard
//          		2005.04.04  - V1, 0, 0, 6 - CAOWEI : 增加用户文件宏 增加用户文件相关函数(文件的创建,写入,读取,删除)
//---------------------------------------------------------------------------

#ifndef	__BJCAKEY_H
#define	__BJCAKEY_H

//-----------------------------------------------------------------------------
//宏定义
//-----------------------------------------------------------------------------
#define IN 			//输入
#define OUT			//输出

//管理员/用户口令 类型
#define TYPE_SO				1	//SO pin.
#define TYPE_USER			2	//User pin.
#define TYPE_PIN_MINLEN		4	//Min Pin Len
#define TYPE_PIN_MAXLEN		16	//Max Pin Len

//密钥/证书类型
#define TYPE_SIGN			2	//签名类型
#define TYPE_ENCRYPT		1	//加密类型

//容器宏定义
#define TYPE_CONTAINER_NUMBER		10		//最大个数10个
#define TYPE_CONTAINER_NAME_MAXLEN	64		//最大容器名称长度

//卷标
#define TYPE_LABEL_NAME_MINLEN		5		//最小卷标名称长度
#define TYPE_LABEL_NAME_MAXLEN		16		//最大卷标名称长度

//对称密钥
#define TYPE_SYMKEY_DES				1		//DES
#define TYPE_SYMKEY_3DES			2		//3DES
#define TYPE_SYMKEY_SSF33			3		//SSF33

//其他宏

//
//ekey信息设备宏定义
//
#define EP_LABEL						0x00000001 	//(M)Ekey label.
#define EP_FREE_SIZE 					0x00000002	//(M)Ekey free sizes.
#define EP_SERIAL_NUMBER				0x00000003	//(M)Ekey serial number.
#define EP_MANUFACTURER_ID  			0x00000004	//(M)Ekey manufacturer ID.
#define EP_ATR							0x00000005 	//(M)Ekey ATR(answer to request).
#define EP_STATE						0x00000006 	//(M)Ekey states(see below).
#define EP_MAX_CONTAINER_NUM			0x00000007	//(M)Maximums cert number in Ekey.
#define EP_MAX_RETRY_TIMES				0x00000008	//获取到当前验证 用户pin口令的最多重试次数

//用户文件宏
#define EP_PUBLIC						0x00000001		//公有区 读取数据不受pin保护
#define EP_PRIVATE 						0x00000002		//私有区 读取数据受pin保护
#define EP_FILENAME_MAXLEN				20				//用户文件名称的最大长度
#define EP_FILE_MAX_NUM_PUB				10				//存储用户公有文件的最大数量
#define EP_FILE_MAX_NUM_PRI				10				//存储用户私有文件的最大数量
#define EP_FILE_MAX_NUM				 EP_FILE_MAX_NUM_PUB+EP_FILE_MAX_NUM_PRI	//存储用户文件的最大数量

//定义 FILEINFO 结构主要列举时使用
typedef struct 
{
	BYTE	pbFileName[EP_FILENAME_MAXLEN];	//文件名称
	DWORD	dwFileNameLen;					//文件名称长度
	DWORD	dwFileType;						//文件类型
	DWORD	dwFileLen;						//文件大小
}FILEINFO, *PFILEINFO;

//能存储的文件数量最大为20个,每个存储文件名称为20字节,另对应文件ID2个字节
//另+2字节文件的个数
//#define EP_SAVE_FILENAME_LEN     20*22+2	//存储用户文件的名称的文件的大小

//-----------------------------------------------------------------------------
//错误代码
//-----------------------------------------------------------------------------
#define USBKEY_SUCCESS					0x00000000	//操作成功
#define USBKEY_FAILED					0x20000001	//操作失败
#define USBKEY_KEY_REMOVED				0x20000002	//无KEY
#define USBKEY_KEY_INVALID				0x20000003	//连接Key失败/KEY无效
#define USBKEY_INVALID_PARAMETER  		0x20000004	//参数错误
#define USBKEY_VERIFIEDPIN_FAILED		0x20000005	//验证口令失败
#define USBKEY_USER_NOT_LOG_IN			0x20000006	//用户没有登陆,没有验证口令
#define USBKEY_BUFFER_TOO_SMALL        	0x20000007	//缓冲区太小
#define USBKEY_INVALID_PFXCERT       	0x20000008	//不合法的PFX证书文件
#define USBKEY_INVALID_RSAKEY        	0x20000009	//不合法的RSA密钥
#define USBKEY_CONTAINER_TOOMORE       	0x20000010	//容器个数已满,大于10个

#define USBKEY_ERR_NOTMWEKEY			0x20000011	//不是明华公司的eKey
#define USBKEY_ERR_GETEKEYPARAM			0x20000012	//取eKey信息失败
#define USBKEY_ERR_NOTXCOS				0x20000013	//不是PKXC型号的eKey
#define USBKEY_ERR_XCOSVERSION			0x20000014	//下载到eKey中的COS版本号错误
#define USBKEY_ERR_NOTBLANKEKEY			0x20000015	//该eKey已经被发行过!不是空白eKey,拒绝发行!
#define USBKEY_ERR_NOCONTAINERNAME		0x20000016	//指定容器不存在
#define USBKEY_ERR_PINLOCKED			0x20000017	//密码已经锁死

#define USBKEY_ERR_CREATEFILE			0x20000018	//创建文件错误
#define USBKEY_ERR_EXISTFILE			0x20000019	//文件已存在错误
#define USBKEY_ERR_OPENFILE				0x20000020	//打开文件错误
#define USBKEY_ERR_READFILE				0x20000021	//读文件错误
#define USBKEY_ERR_WRITEFILE			0x20000022	//写文件错误
#define USBKEY_ERR_NOFILE				0x20000023	//没有找到文件错误

#define USBKEY_PIN_RETRYNUM				0x20020000	//低字节表示密码重试次数
#define USBKEY_PIN_RETRYNUM_MASK		0x0000ffff	//mask bits for getting the pin retry number.

//其他错误,目前还没有想到,在做接口的时候可能会增加
//-----------------------------------------------------------------------------
//函数说明
//-----------------------------------------------------------------------------
#if defined(_MSC_VER) && defined(WIN32)
#define WINAPI  __stdcall
#else 
#define WINAPI
#endif

#ifdef __cplusplus
extern "C" {
#endif


	char* WINAPI GetLastErrorMsg();
	/*
	函数功能:取得eKey操作最近错误信息。
	参数参数:无
	返回值:最近错误信息
	*/

	DWORD WINAPI InitCard(IN const unsigned char*	pbSoPIN,
		      IN unsigned long			ulSoPINLen,
			  IN const unsigned char*	pbUserPIN,
			  IN unsigned long			ulUserPINLen,
			  IN const char*			szCardName);
	/*
			函数功能:	初始化USBKEY,建立文件结构
			参数说明:	pbSoPIN:		管理员口令
			ulSoPINLen:		管理员口令长度
			pbUserPIN:		用户口令
			ulUserPINLen:	用户口令长度
			szCardName:		USBKEY名称(卷标),卷标全部为可见字符,采用char方式即可			
			返回值:	USBKEY_SUCCESS:成功,其他见错误代码
			函数备注:	初始化一个USBKEY,建立文件结构
	*/
	//??建议增加密码重试次数宏定义方式,内部可以固定
	
	DWORD WINAPI OpenCard(IN OUT HANDLE* hKey);
	/*
			函数功能:	打开USBKEY,得到操作句柄
			参数说明:	hKey:		返回操作句柄			
			返回值:	USBKEY_SUCCESS:成功,其他见错误代码
			*/
			//??建议不用打开USBKEY的函数, 直接使用pbCardName判断,内部直接根据名称连接相应的设备
			//这样函数传入的卷标名称即可,这样比较好,不会引起其他的冲突
			//例如:校验口令函数可以改成这样,  内部可以根据名称操作
			/*DWORD WINAPI VerifyPIN(IN char	*szCardName,
			IN unsigned long			ulPINType);	
			IN const unsigned char*	pbPIN,
			IN unsigned long			ulPINLen); 
	*/
	
	DWORD WINAPI CloseCard(IN HANDLE hKey);
	/*
			函数功能:	关闭USBKEY
			参数说明:	hKey:		操作句柄			
			返回值:	USBKEY_SUCCESS:成功,其他见错误代码
	*/
	
	
	DWORD WINAPI VerifyPIN(IN HANDLE	hKey,
			IN unsigned long			ulPINType,	
			IN const unsigned char*		pbPIN,
			IN unsigned long			ulPINLen); 
	/*
			函数功能:	校验用户口令,类似用户LogIn
			参数说明:	hKey:		操作句柄
			ulPINType:	管理员/用户口令类型
			pbPIN:		管理员/用户口令
			ulPINLen:	管理员/用户口令长度
			返回值:	USBKEY_SUCCESS:成功,其他见错误代码
	*/
	
	
	DWORD WINAPI ResetPIN(IN HANDLE hKey); 
	/*
			函数功能:	复位口令,类似用户LogOut
			参数说明:	hKey:		操作句柄			
			返回值:	USBKEY_SUCCESS:成功,其他见错误代码
	*/
	
	DWORD WINAPI ChangePIN(IN HANDLE	hKey,   
			IN unsigned long	ulPINType,
			IN const unsigned char*	pbOldPIN,
			IN unsigned long		ulOldPINLen,
			IN const unsigned char*	pbNewPIN,
			IN unsigned long		ulNewPINLen);
	/*
			函数功能:	修改口令
			参数说明:	hKey:		操作句柄
			ulPINType:	管理员/用户口令类型
			pbOldPIN:		管理员/用户旧口令
			ulOldPINLen:	管理员/用户旧口令长度
			pbNewPIN:		管理员/用户新口令
			ulNewPINLen:	管理员/用户新口令长度
			返回值:	USBKEY_SUCCESS:成功,其他见错误代码
	*/
	
	
	DWORD WINAPI UnLock(IN HANDLE	hKey,
			IN const unsigned char*	 pbPIN,    //管理员口令
			IN unsigned long			ulPINLen,
			IN const unsigned char*	     pbNewPIN,  //新的用户口令
			IN unsigned long			ulNewPINLen);
	
	/*
			函数功能:	修改口令
			参数说明:	hKey:		操作句柄
			pbPIN:		管理员口令
			ulPINLen:	管理员口令长度
			pbNewPIN:		用户新口令
			ulNewPINLen:	用户新口令长度
			返回值:	USBKEY_SUCCESS:成功,其他见错误代码
	*/
	
	
	DWORD WINAPI IsUserPINVerified(IN HANDLE hKey);
	/*
			函数功能:	验证口令是否校验过
			参数说明:	hKey:		操作句柄			
			返回值:	USBKEY_SUCCESS:成功,其他见错误代码
			USBKEY_USER_NOT_LOG_IN:没有验证口令
	*/
	
	DWORD WINAPI ImportCertFromFile(IN HANDLE	hKey,			
			IN const unsigned char* pbCert,	        
			IN const unsigned long  pbCertLen,	 
			IN const char			*pbPassword,		//此处可以改为unsigned char*,如果修改需要传入长度
			IN const unsigned char*	    pbContainerName,
			IN unsigned long		ulContainerNameLen,	
			IN unsigned long	ulCertType);
	/*
			函数功能:	导入P12证书
			参数说明:	hKey:		操作句柄
			pbCert:		p12证书(der)
			pbCertLen:	p12证书(der)长度
			pbPassword:	证书的密码
			pbContainerName:		容器名称
			ulContainerNameLen:	容器名称长度
			ulCertType:		证书类型			
			返回值:	USBKEY_SUCCESS:成功,其他见错误代码
	*/
	
	DWORD WINAPI ExportPubKey(IN HANDLE		hKey,
			IN const unsigned char*	    pbContainerName,
			IN unsigned long		ulContainerNameLen,	
			IN unsigned long		ulKeyType,	
			OUT unsigned char*		pbPubKey,			//长度一定要放的下导出后der编码的公钥		
			OUT unsigned long*		ulPubKeyLen);       //为pbPubKey所指长度

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -