📄 bjcakey.h
字号:
//===========================================================================
//
// 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 + -