Files
envi-code/SourceCode/Code2026/inc/DicPlus.h
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

1212 lines
49 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef __DIC_PLUS_H__
#define __DIC_PLUS_H__
// ====================================================================
// 1. 查找计算机上连接的加密锁设备
EXTERN_C int WINAPI DicPlus_Find();
// 返回:
// 如果返回值小于 0,表示返回的是一个错误编码,具体含义请看下面的错误编码。
// 如果返回值为 0,表示没有任何读卡器设备存在。
// 如果返回值大于 0,返回的是读卡器的个数(注意: 通常即使用户不插入设备,
// 因为驱动程序一直存在,驱动程序会报告读卡器存在,这时候需要通过 DicPlus_Open
// 命令进一步确认是否真的有设备存在),我们假设在同一台计算机上面最多有 32
// 个读卡器设备。
// ====================================================================
// 2. 打开指定的读卡器
EXTERN_C int WINAPI DicPlus_Open(int hic, char* reader_name);
// 输入:
// hic 设备的句柄
// 这是一个枚举值,是一个 0, 1, 2, ... DicPlus_Find() 返回值之内的值。
// 例如,DicPlus_Find() 返回 3,表示找到了 3 个读卡器设备,那么
// DicPlus_Open(0, reader_name) 表示的就是打开第 1 个找到的读卡器设备,
// 1 就表示第 2 个,依此类推。
// 如果 hic 的值为负值,DicPlus_Open 会尝试直接使用 reader_name 中的读卡
// 器名称去直接打开对应的读卡器。
// reader_name 读卡器的名称
// 这是一个输入输出值,当 hic 为负值的时候,用来输入读卡器的名称。
// 如果这个值不为空(NULL),那么在成功的打开读卡器后,会从这里返回读
// 卡器的名称。
// 另外,对于虚拟设备来说,这是要打开的路径文件名。
// 返回值:
// 大于等于0 表示成功,返回的就是 hic 的打开句柄
// 小于0 返回的是一个错误编码,具体含义请看下面的错误编码部分。
// ====================================================================
// 3. 关闭指定的读卡器
EXTERN_C int WINAPI DicPlus_Close(int hic);
// 输入:
// hic 设备的句柄,跟 DicPlus_Open 命令中的 hic 一致。
// 返回:
// 返回的是一个错误编码,具体含义请看下面的错误编码部分。
// ====================================================================
// 4. 创建虚拟 IC 卡文件(*虚拟卡专用指令)
EXTERN_C int WINAPI DicPlus_Create(char* filename, char* mfname, char* atr, WORD atrlen);
// 输入:
// filename 要创建的路径文件名
// mfname 主卷标的名字
// atrlen 开发商信息的长度
// atr 开发商信息
// 返回:
// 返回的是一个错误编码,具体含义请看下面的错误编码部分。
// ======================================================================
// 5. 获得此动态库的版本
EXTERN_C int WINAPI DicPlus_GetVersion(char* ver);
// 输入:
// ver 用来返回此动态库的版本号
// 返回:
// 在 ver 中返回的动态库版本内容如下:
// [V/R]xx.yy
// 例如: R01.10 表示这是 "真实卡动态库 1.10 版本"
// 例如: R03.02 表示这是 "虚拟卡动态库 3.02 版本"
// 返回的是一个错误编码,具体含义请看下面的错误编码部分。
// ======================================================================
// 6. 加密锁操作命令函数
EXTERN_C int WINAPI DicPlus_Command(int hic, int cmd, void* cmddata);
// 输入:
// hic 设备的句柄
// cmd 具体的命令
// cmddata 跟命令相关的数据
EXTERN_C int WINAPI DicPlus_FindByMgrCode(void * pMgrCode);
EXTERN_C int WINAPI EnterMultThreadMode();
// Command 定义
#define GET_CARD_INFO 0x02000000
#define GET_HARDWARE_INFO 0x00FF1C00
#define GET_MANAGER_CODE 0x00FF1A00
#define GET_CARD_PRIVILEGE 0x00FF2200
#define GET_REMOTE_INFO 0x00FF1e00
#define SET_REMOTE_INFO 0x00FF1003
#define CHECK_REMOTE_INFO 0x01FF1003
#define GET_CURRENT_DIR 0x00001800
#define SET_CURRENT_DIR 0x0000a400
#define GET_CURRENT_FILE 0x00001801
#define SET_CURRENT_FILE 0x0100a400
#define GET_PARENT_DIR 0x00001802
#define SET_PARENT_DIR 0x0000a402
#define LIST_DIR 0x0000b200
#define READ_FILE 0x0000b000
#define WRITE_FILE 0x0000d000
#define FORMAT_CARD 0x0000e000
#define CREATE_DIR 0x0000e001
#define CREATE_FILE 0x0100e001
#define REMOVE_DIR 0x0000ee00
#define REMOVE_FILE 0x0000ee01
#define RANDOM 0x00008400
#define RUN 0x03000000
#define CRYPTOTEXT_FILE 0x04000000
#define PLAINTEXT_FILE 0x05000000
#define DESENC 0x00005000
#define DESDEC 0x00005100
#define RSAGENKEY 0x00003300
#define RSAENC 0x00003400
#define RSADEC 0x00003500
#define GETFREESPACE 0X00003000
#define MODULE_GETFILEFLAG 0X00003600
#define MODULE_CRYPTOTEXT_MODFLAG 0x00003700
#define MODULE_PLAINTEXT_MODFLAG 0x00003800
#define MODULE_ENCRYPT_CONTENT 0x00003900
#define SETCOUNTER 0x00005700
#define STEPCOUNTER 0x00005800
#define CHECK_SUPER_PASS 0x00FF1002
#define SET_SUPER_PASS 0x00FFF402
#define GET_UPGRADE_REMOTE_PASS 0x00FF2000
// data 跟命令有关的参数
// GET_CARD_INFO 命令的 data 中的数据结构
typedef struct
{
char volume[16];
char atr[15];
} DicPlus_CardInfo;
// GET_HARDWARE_INFO 命令的 data 中的数据结构
typedef struct
{
DWORD FactoryTime;
DWORD HardSerial;
DWORD ShipTime;
DWORD COSVersion;
} DicPlus_HardInfo;
// GET_MANAGER_CODE 命令的 data 中的数据结构
typedef struct
{
WORD Zone;
WORD Agent;
WORD User1;
WORD User2;
} DicPlus_ManagerCode;
// GET_CARD_PRIVILEGE 命令的 data 中只有一个字节的数据
// 用位来表示当前密码验证的状态
#define DICPR_NOPASS 0
#define DICPR_SUPERPASS 4
#define DICPR_REMOTEPASS 8
// GET_REMOTE_INFO, SET_REMOTE_INFO, CHECK_REMOTE_INFO 命令的 data 中的数据结构
typedef struct
{
DWORD RemoteTag;
BYTE RemotePass[8];
} DicPlus_RemoteInfo;
// GET_UPGRADE_REMOTE_PASS 命令的 data 中的数据结构
typedef struct
{
DWORD RemoteTag;
DWORD HardSerial;
BYTE RemotePass[8];
} DicPlus_Upgrade_RemotePass;
// GET_CURRENT_DIR, SET_CURRENT_DIR, GET_PARENT_DIR, CREATE_DIR 命令的 data 中的数据结构
typedef struct
{
WORD dirid; // 目录 ID
BYTE dircla; // 目录类别
BYTE diratrpri; // 目录属性 & 目录安全级
WORD dirsize; // 没用
char dirname[16]; // 目录名
} DicPlus_Dir;
// GET_CURRENT_FILE, SET_CURRENT_FILE, CREATE_FILE 命令的 data 中的数据结构
typedef struct
{
WORD fileid; // 文件 ID
BYTE filecla; // 文件类别
BYTE fileatrpri; // 文件属性 & 文件安全级
WORD filesize; // 文件大小
char filename[17]; // 文件名
char filepath[128];
} DicPlus_File;
// 文件的属性定义
#define FILEATTR_NORMAL 0x00
#define FILEATTR_EXEC 0x10 // 表示可执行
#define FILEATTR_DIR 0x20 // 表示为目录文件
#define FILEATTR_UPIGNORE 0x40 // 表示如果当前安全级别已经高于可执行程序自身的级别,则不执行本程序
#define FILEATTR_INTERNAL 0x80 // 表示为内部应用程序自己使用的文件,不能从外部进行操作
// 如果一个可执行文件也设置内部属性,在列目录时就只有通过超级密码验证之后才能显示出来
// 注意: LIST_DIR 命令返回的结构既可能是 DicPlus_Dir 也可能是 DicPlus_File
// 具体是哪个,要通过判断 FILEATTR_DIR 来决定
// READ_FILE 命令的 data 需要数据结构
typedef struct
{
WORD offset;
WORD size;
} DicPlus_Before_Read_Data;
// READ_FILE 命令的 data 返回的数据结构
typedef struct
{
WORD readedsize;
char buffer[1]; // 大小为 readsize
} DicPlus_After_Read_Data;
// WRITE_FILE 命令的 data 中的数据结构
typedef struct
{
WORD offset;
WORD size;
char buffer[1]; // 大小为 size
} DicPlus_Write_Data;
// FORMAT_CARD 命令的 data 中的数据结构
typedef struct
{
char volume[16];
char atr[15];
BOOL isdes;
BOOL isfloat;
BOOL isExtend;
BYTE bModify;
} DicPlus_System_Info;
// RUN_DATA 所需要的 data 结构是:
typedef struct
{
WORD RunID;
WORD ParaSize;
BYTE Para[1]; // 大小为 ParaSize
} DicPlus_Before_Run_Data;
// RUN_DATA 返回参数的时候,data 结构是:
typedef struct
{
WORD ResultSize;
BYTE Result[1]; // 大小为 ResultSize
} DicPlus_After_Run_Data;
// SET_SUPER_PASS 命令的 data 中的数据结构
typedef struct
{
BYTE MaxTryTimes;
BYTE SuperPass[8];
} DicPlus_SuperPass_Data;
// CRYPTOTEXT_FILE 命令的 data 中的数据结构
typedef struct
{
WORD fileid; // 文件 ID
BYTE filecla; // 文件类别
BYTE fileatrpri; // 文件属性 & 文件安全级
WORD filesize; // 文件大小
char filename[16]; // 文件名
BYTE filedata[1]; // 文件的内容,大小为 filesize
} DicPlus_Before_CryptoFile_Data;
// CRYPTOTEXT_FILE 返回参数的时候,data 结构是:
typedef struct
{
WORD ResultSize;
BYTE Result[1]; // 大小为 ResultSize
} DicPlus_After_CryptoFile_Data;
// 三种加密和解密算法命令需要填充的结构体
typedef struct
{ //对加密来说 //对解密来说
WORD dataLength; //加密数据的长度 //解密数据的长度
WORD KeyFileid; //DES密钥文件的文件ID
BYTE KeyIndex; //本次加密使用的密钥在DES密钥文件中的标识,
//注意一个DES密钥文件包含多个DES加解密使用的密钥
//各次解密使用的密钥用KeyIndex来标识
char data[1]; //加密数据 //解密数据
} DicPlus_Des_Data;
typedef struct
{ //对加密来说 //对解密来说
WORD KeyFileid; //公钥文件的文件ID //私钥文件的文件ID
WORD dataLength; //加密数据的长度 //解密数据的长度
char data[1]; //加密数据 //解密数据
} DicPlus_Rsa_Data;
typedef struct
{
WORD pubKeyID; //公钥文件ID
WORD pubKeySize; //公钥大小 512/1024
WORD pivKeyID; //私钥文件ID
} DicPlus_Rsa_GenKey;
// 三种加密算法调用返回的数据结构
typedef struct
{ //对加密来说 //对解密来说
WORD dataLength; //加密后返回数据的长度 //解密后返回数据的长度
char data[1]; //加密后返回数据 //解密后返回数据
} DicPlus_After_EncDec_Data;
// 取得模块开通标识结构
typedef struct
{
BYTE NumFileID; //可执行文件ID序列的实际BYTE长度
WORD fileID[1]; //需要读取的可执行文件的ID的序列
}
DicPlus_Module_GetFLag;
typedef BYTE* FileFlag; //取得模块开通标识后的返回值
typedef struct
{
WORD fileID; //文件ID
BYTE flag; //文件开通标识
}
DicPlus_PlainText_OneMod;
typedef struct
{
BYTE dataLen;
DicPlus_PlainText_OneMod data[1];
}
DicPlus_PlainText_ModuleData;
typedef struct
{
BYTE numExe; //可执行文件的个数,最大为3
BYTE flag; //后面指定的几个可执行文件的开通标识
WORD exeFileID[3]; //可执行文件ID
}
DicPlus_CryptoText_OneMod;
typedef struct
{
BYTE nDataLen;
DicPlus_CryptoText_OneMod plaintextModuleData[1];
}
DicPlus_CryptoText_Encrypt;
typedef struct
{
BYTE dataLen;
BYTE data[1];
}
DicPlus_CryptoText_ModuleData;
// ====================================================================
// 7. 帮助用户从 DicPlus_Command 命令中的 data 中提取数据的函数
EXTERN_C int WINAPI DicPlus_Get(void* xdata, int p1, int p2, char* buffer);
// 输入:
// xdata 提取的目标缓冲区
// p1 模式/偏移,最高位为 1 表示这是模式操作,否则是用户自定义的偏移值
// p2 返回方式/尺寸,最高2位表示返回的方式,剩余的位表示操作的尺寸
// buffer 提取出数据的字符型缓冲区
// ====================================================================
// 8. 帮助用户向 DicPlus_Command 命令中的 data 中设置数据的函数
EXTERN_C int WINAPI DicPlus_Set(void* xdata, int p1, int p2, int p3, char* buffer);
// 输入:
// xdata 存储的目标缓冲区
// p1 模式/偏移,最高位为 1 表示这是模式操作,否则是用户自定义的偏移值
// p2 传入方式/尺寸,最高2位表示传入的方式,剩余的位表示操作的大小
// p3 通常是用户要传入的值。
// buffer 准备存储的字符型缓冲区
// ====================================================================
// 对于 DicPlus_Get, DicPlus_Set 的 p1 参数,我们预定义了一些模式操作
// 这些模式操作的最高位我们都设定为 1
#define FILL 0x80000000
#define ATR 0x80010000
#define VOLUME 0x80020000
#define FACTORY_TIME 0x80030000
#define HARD_SERIAL 0x80040000
#define SHIP_TIME 0x80050000
#define COS_VERSION 0x80060000
#define ZONE 0x80070000
#define AGENT 0x80080000
#define USER1 0x80090000
#define USER2 0x800A0000
#define DIR_ID 0x800B0000
#define DIR_CLASS 0x800C0000
#define DIR_ATTRIBUTE 0x800D0000
//#define DIR_PRIVILEGE 0x800E0000 目录没有安全级别
#define FILE_NO 0x800F0000
#define DIR_NAME 0x80100000
#define FILE_ID 0x80110000
#define FILE_CLASS 0x80120000
#define FILE_ATTRIBUTE 0x80130000
#define FILE_PRIVILEGE 0x80140000
#define FILE_SIZE 0x80150000
#define FILE_NAME 0x80160000
#define WRITE_DATA 0x80170000
#define READ_DATA 0x80180000
#define RUN_DATA 0x80190000
#define RANDOM_SIZE 0x801A0000
#define REMOTE_TAG 0x801B0000
#define REMOTE_PASS 0x801C0000
#define UPGRADE_HARD_SERIAL 0x801D0000
#define UPGRADE_REMOTE_TAG 0x801E0000
#define UPGRADE_REMOTE_PASS 0x801F0000
#define REMOTEPASS_STATUS 0x80200000
#define SUPERPASS_STATUS 0x80210000
#define SUPERPASS_DATA 0x80220000
#define FILE_DATA 0x80230000
#define RELOAD_FLOATLIBS 0x0000e002
#define RELOAD_RSADESLIBS 0x0000e003
#define ISLOADEDFLOATLIBS 0x0000e004
#define ISLOADEDRSADESLIBS 0x0000e005
#define RELOAD_EXTENDFLOATLIBS 0x0000e006
#define ISLOADEXTENDFLOATLIBS 0x0000e007
#define WRITE_HARDSERIAL 0x0000e008
//DicPlus_Des_Data //Used by DicPlus_Set
#define DES_KEYFILEID 0x80240000
#define DES_KEYINDEX 0x80250000
#define DES_DATA 0x80260000
//DicPlus_After_EncDec_Data //Used by DicPlus_Get
#define AFTER_ENCDEC_DATA 0x80270000
//DicPlus_Rsa_Data //Used by DicPlus_Set
#define RSA_KEYFILEID 0x80280000
#define RSA_DATA 0x80290000
//DicPlus_Rsa_GenKey //Used by DicPlus_Set
#define RSA_PUBKEYID 0x802A0000
#define RSA_PUBKEYSIZE 0x802B0000
#define RSA_PIVKEYID 0x802C0000
// ====================================================================
// 对于 DicPlus_Get, DicPlus_Set 的 p2 参数,最高 2 位表示数据的传入或返回方式
#define BY_VALUE 0x00000000
#define BY_DOUBLE 0x40000000
#define BY_ARRAY 0x80000000
#define BY_STRING 0xC0000000
// 对于 DicPlus_GetData 而言
// BY_VALUE 表示返回数据是通过返回值来返回的
// BY_DOUBLE 表示返回数据如果是浮点数的化,会被转换成字符串的方式放在 buffer 中返回
// BY_ARRAY 表示返回数据被放在 buffer 中来返回
// BY_STRING 表示返回数据如果是数字的化,会被转换成字符串的方式放在 buffer 中返回
// 对于 DicPlus_SetData 而言
// BY_VALUE 表示数据是通过 p3 来输入的
// BY_DOUBLE 表示数据是通过 buffer 输入,并且 buffer 中的数据是浮点数的字符串形式
// BY_ARRAY 表示数据是通过 buffer 来输入的
// BY_STRING 表示数据是通过 buffer 输入,并且 buffer 中的数据是字符串形式
// ====================================================================
// 错误编码 ===========================================================
#ifndef SCARD_S_SUCCESS
// 成功,没有错误
#define SCARD_S_SUCCESS ((DWORD)0x00000000L)
// 内部连接检查失败
#define SCARD_F_INTERNAL_ERROR ((DWORD)0x80100001L)
// 操作被用户中止
#define SCARD_E_CANCELLED ((DWORD)0x80100002L)
// 不正确的操作句柄
#define SCARD_E_INVALID_HANDLE ((DWORD)0x80100003L)
// 不正确的参数(p1, p2)
#define SCARD_E_INVALID_PARAMETER ((DWORD)0x80100004L)
// 注册的启动信息丢失或无效
#define SCARD_E_INVALID_TARGET ((DWORD)0x80100005L)
// 没有足够的内存用于完成命令
#define SCARD_E_NO_MEMORY ((DWORD)0x80100006L)
// 内部超时
#define SCARD_F_WAITED_TOO_LONG ((DWORD)0x80100007L)
// 用户给出的缓冲区太小,不足以放下全部的返回数据
#define SCARD_E_INSUFFICIENT_BUFFER ((DWORD)0x80100008L)
// 未知的读卡器
#define SCARD_E_UNKNOWN_READER ((DWORD)0x80100009L)
// 用户指定的时间超时
#define SCARD_E_TIMEOUT ((DWORD)0x8010000AL)
// 卡正在被其它连接占用
#define SCARD_E_SHARING_VIOLATION ((DWORD)0x8010000BL)
// 在读卡器里面没有卡
#define SCARD_E_NO_SMARTCARD ((DWORD)0x8010000CL)
// 未知的卡类型
#define SCARD_E_UNKNOWN_CARD ((DWORD)0x8010000DL)
// 读卡器无法完成退出卡操作
#define SCARD_E_CANT_DISPOSE ((DWORD)0x8010000EL)
// 当前的卡不支持用户指定的通讯协议
#define SCARD_E_PROTO_MISMATCH ((DWORD)0x8010000FL)
// 卡还没有准备好接收命令
#define SCARD_E_NOT_READY ((DWORD)0x80100010L)
// 某些变量的值不合适
#define SCARD_E_INVALID_VALUE ((DWORD)0x80100011L)
// 操作被系统中止,可能是重新登陆或关机
#define SCARD_E_SYSTEM_CANCELLED ((DWORD)0x80100012L)
// 内部通讯错误
#define SCARD_F_COMM_ERROR ((DWORD)0x80100013L)
// 内部未知错误
#define SCARD_F_UNKNOWN_ERROR ((DWORD)0x80100014L)
// 无效的 ATR 串
#define SCARD_E_INVALID_ATR ((DWORD)0x80100015L)
// 用户尝试结束某个不存在的处理
#define SCARD_E_NOT_TRANSACTED ((DWORD)0x80100016L)
// 指定的读卡器当前无法使用
#define SCARD_E_READER_UNAVAILABLE ((DWORD)0x80100017L)
// 操作被中止,允许服务程序退出
#define SCARD_P_SHUTDOWN ((DWORD)0x80100018L)
// PCI 的接收缓冲区太小
#define SCARD_E_PCI_TOO_SMALL ((DWORD)0x80100019L)
// 读卡器的驱动无法支持当前的读卡器
#define SCARD_E_READER_UNSUPPORTED ((DWORD)0x8010001AL)
// 读卡器的驱动程序无法建立唯一的名字,已经有相同名字的读卡器存在
#define SCARD_E_DUPLICATE_READER ((DWORD)0x8010001BL)
// 卡无法被当前的读卡器支持
#define SCARD_E_CARD_UNSUPPORTED ((DWORD)0x8010001CL)
// 智能卡服务没有开启
#define SCARD_E_NO_SERVICE ((DWORD)0x8010001DL)
// 智能卡服务已经被中止
#define SCARD_E_SERVICE_STOPPED ((DWORD)0x8010001EL)
// 某个意外的智能卡错误产生
#define SCARD_E_UNEXPECTED ((DWORD)0x8010001FL)
// 无法获知智能卡的提供者信息
#define SCARD_E_ICC_INSTALLATION ((DWORD)0x80100020L)
// 无法获知智能卡的生产者信息
#define SCARD_E_ICC_CREATEORDER ((DWORD)0x80100021L)
// 当前的智能卡无法支持用户要求的功能
#define SCARD_E_UNSUPPORTED_FEATURE ((DWORD)0x80100022L)
// 指定的目录不存在
#define SCARD_E_DIR_NOT_FOUND ((DWORD)0x80100023L)
// 指定的文件不存在
#define SCARD_E_FILE_NOT_FOUND ((DWORD)0x80100024L)
// 指定的目录不再是有效的目录
#define SCARD_E_NO_DIR ((DWORD)0x80100025L)
// 指定的文件不再是有效的文件,没有选择文件
#define SCARD_E_NO_FILE ((DWORD)0x80100026L)
// 此文件拒绝访问
#define SCARD_E_NO_ACCESS ((DWORD)0x80100027L)
// 卡的空间已满,无法再写入信息
#define SCARD_E_WRITE_TOO_MANY ((DWORD)0x80100028L)
// 设置文件指针错误
#define SCARD_E_BAD_SEEK ((DWORD)0x80100029L)
// PIN 码错误
#define SCARD_E_INVALID_CHV ((DWORD)0x8010002AL)
// 一个无法识别的错误码从智能卡服务返回
#define SCARD_E_UNKNOWN_RES_MNG ((DWORD)0x8010002BL)
// 请求的证书不存在
#define SCARD_E_NO_SUCH_CERTIFICATE ((DWORD)0x8010002CL)
// 请求的证书不允许获得
#define SCARD_E_CERTIFICATE_UNAVAILABLE ((DWORD)0x8010002DL)
// 找不到任何一个读卡器
#define SCARD_E_NO_READERS_AVAILABLE ((DWORD)0x8010002EL)
// 智能卡通讯过程中发生数据丢失,请再次尝试
#define SCARD_E_COMM_DATA_LOST ((DWORD)0x8010002FL)
// 请求的密钥文件不存在
#define SCARD_E_NO_KEY_CONTAINER ((DWORD)0x80100030L)
// 由于 ATR 配置冲突,读卡器无法跟卡通讯
#define SCARD_W_UNSUPPORTED_CARD ((DWORD)0x80100065L)
// 卡对复位没有响应
#define SCARD_W_UNRESPONSIVE_CARD ((DWORD)0x80100066L)
// 卡没有电
#define SCARD_W_UNPOWERED_CARD ((DWORD)0x80100067L)
// 卡被复位了,因此共享的信息无效了
#define SCARD_W_RESET_CARD ((DWORD)0x80100068L)
// 卡已经被移出了
#define SCARD_W_REMOVED_CARD ((DWORD)0x80100069L)
// 因为安全规则,访问被拒绝了
#define SCARD_W_SECURITY_VIOLATION ((DWORD)0x8010006AL)
// PIN 码没有被验证,访问被拒绝
#define SCARD_W_WRONG_CHV ((DWORD)0x8010006BL)
// 已经到达最大 PIN 码验证次数,访问被拒绝
#define SCARD_W_CHV_BLOCKED ((DWORD)0x8010006CL)
// 已经到达最后的智能卡文件,没有更多的文件可以访问了
#define SCARD_W_EOF ((DWORD)0x8010006DL)
// 操作被用户中止
#define SCARD_W_CANCELLED_BY_USER ((DWORD)0x8010006EL)
// 智能卡 PIN 没有设置
#define SCARD_W_CARD_NOT_AUTHENTICATED ((DWORD)0x8010006FL)
#endif // SCARD_S_SUCCESS
// 扩展错误码 =========================================================
// 文件已经存在
#define SCARD_E_FILE_EXISTS ((DWORD)0xA0100001L)
// 卡内存储器操作出错
#define SCARD_E_EPROM_ERROR ((DWORD)0xA0100002L)
// 用户给出了无效的 CLA
#define SCARD_E_INVALID_CLA ((DWORD)0xA0100003L)
// 用户给出了无效的 INS
#define SCARD_E_INVALID_INS ((DWORD)0xA0100004L)
// VM 地址超界/异常
#define SCARD_E_VM_ADDRESS_ERROR ((DWORD)0xA0100005L)
// 除 0 错
#define SCARD_E_ZERO_DIVIDE ((DWORD)0xA0100006L)
// 卡没有被插入到正确的位置
#define SCARD_E_WRONG_POSITION ((DWORD)0xA0100007L)
// 卡当前处于某种未知的状态
#define SCARD_E_UNKNOWN_STATE ((DWORD)0xA0100008L)
// 卡还没有被打开
#define SCARD_E_CARD_NOT_OPENED ((DWORD)0xA0100009L)
// 未知的命令
#define SCARD_E_UNKNOWN_COMMAND ((DWORD)0xA010000AL)
// 即将设定超级密码的重新设置次数是 0
#define SCARD_E_ZERO_TRYTIME ((DWORD)0xA010000BL)
// 打开了太多的设备
#define SCARD_E_TOO_MANY_DEVICE ((DWORD)0xA010000CL)
// 非法指令错
#define SCARD_E_INVALID_INSTRUCTION ((DWORD)0xA010000DL)
// 卡还有数据要返回
#define SCARD_W_RESPONSE ((DWORD)0xA01000FFL)
#define RETURN_LENGTH ((DWORD)0xA0100014)
// 虚拟设备专用错误码 =================================================
// 创建虚拟卡文件失败
#define SCARD_E_FILE_CREATE_FAILED ((DWORD)0xA0101001L)
// 打开虚拟卡文件失败
#define SCARD_E_FILE_OPEN_FAILED ((DWORD)0xA0101002L)
#define SCARD_E_FLOAT_NOT_FOUND ((DWORD)0x0000e00aL)
//查询RSA_DES库未发现
#define SCARD_E_RSADES_NOT_FOUND ((DWORD)0x0000e00bL)
#define SCARD_E_LIBS_ERROR ((DWORD)0x0000e00cL)
#define SCARD_E_FLOAT_NOT_FOUND ((DWORD)0x0000e00aL)
//查询RSA_DES库未发现
#define SCARD_E_RSADES_NOT_FOUND ((DWORD)0x0000e00bL)
#define SCARD_E_LIBS_ERROR ((DWORD)0x0000e00cL)
#define SCARD_E_EXTENDFLOAT_NOT_FOUND ((DWORD)0x0000e00dL)
//加密锁扩展错误代码
//找不到加密锁
#define ROCKEY_K_NOT_FOUND ((DWORD)0xF0100001L)
//查询加密锁失败
#define ROCKEY_K_QUERY_FAILED ((DWORD)0xF0100002L)
//写入数据失败
#define ROCKEY_K_WRITE_FAILED ((DWORD)0xF0100003L)
//读出数据失败
#define ROCKEY_K_READ_FAILED ((DWORD)0xF0100004L)
/***********************************************************************************************************************
下面为Rockey6Smart升级新增函数
***********************************************************************************************************************/
// 关于一些较难理解问题的说明:
// (1) 目录/文件 ID (2 字节)
// 在加密锁内部,每个文件与目录都有一个 ID,这是一个 16 位的数字。在同一目
// 录下的目录与文件的 ID 必须不同,作为文件和目录的唯一标识。
// 注意:
// 3F00 是根目录 ID
// 2F01 是 ATR 文件的 ID
// 3FFF 是当前目录的 ID(我们没有使用)
// 0000 系统保留
// 在创建文件和目录的时候,不能够选择以上的 ID
//
// (2) 目录/文件 类别编码 (1 字节)
// a) 每个文件和目录都拥有一个自身的类别描述字节,我们称其为类别码(FCLA),
// 表示一个文件所属的类别,类别编码相同的文件一般会被假定为同一产品的文
// 件。
// b) 加密锁内部的可执行文件受到类别码(FCLA)的限制,只能够读写和创建相同类
// 别码(FCLA)的数据文件。
// c) 每个文件的类别码(FCLA)在 IC 卡中占用 1 字节,表示范围是 0 - FF。
// d) 系统有一个字节用来记录当前的文件类别,我们称其为 "系统当前文件类别"
// (SYSFCLA)。
// e) 作为特例 FF(16 进制) 表示"无类别",FF 类别的数据文件可以被任何类别的
// 可执行文件访问。
// f) "系统当前文件类别" 在执行 "文件选择" 命令的时候或调用加密锁中的可执
// 行文件的时候,会产生切换 SYSFCLA = FCLA。
// g) 如果切换的目标文件是 "无类别" 文件,SYSFCLA 会保持原有类别不变。
// h) 当产生类别切换的时候,"系统当前文件权限" 会被重新置 0 (SYSPRI = 0)
// i) 加密锁复位后 SYSFCLA 缺省是 FF (无类别)。
// j) 系统根目录的类别是 "无类别"。
// k) 在加密锁中,相同类别的文件构成一个相对独立的子系统,"无类别" 数据文
// 件是公共数据,"无类别" 可执行文件是公共处理程序。
// l) 无类别的可执行文件只能访问无类别的数据文件。
// m) 类别编码更为重要的用途是在可执行的过滤器文件上,以后我们会详细说明。
//
// 对使用者的建议:
// a) 通常类别编码被应用在开发者的管理上,如果某个开发商开发了多个产品,或
// 多个开发商合作开发同一个产品,类别管理是很方便的做法。
// b) 如果某个加密锁只需要保护一套软件,建议类别码都设定为 FF。
// c) 在同一目录下的文件和子目录建议设定相同的类别,用 "文件权限" 来控制访
// 问。
//
// (3) 目录/文件 权限编码 (半字节)
// a) 除了类别以外,每个文件还有一个 "文件的访问权限"(FPRI) 来限制相同类别
// 文件的访问控制。
// b) 文件的访问权限(FPRI) 是针对相同类别文件设置的,也就是说 FPRI 是比
// FCLA 低一层的访问控制。
// c) 文件的访问权限在 IC 卡中占用半个字节,编码范围是 0-15,分为 16 个不
// 同的权限。0 是最低级,15 是最高级。
// d) 系统有一个字节用来记录当前的文件的访问权限 "系统当前文件访问权限"
// (SYSFPRI)
// e) "系统当前文件访问权限"(SYSFPRI) 必须由加密锁内部的可执行文件来提升,
// SYSFPRI = 可执行文件通过系统调用设定的权限,但可执行文件不能设定超过
// 自身设定的权限 SYSFPRI <= 可执行文件的 FPRI。
// f) 可执行文件只能操作低于或等于自身级别的数据文件(读、写、创建)。
// g) 可执行文件在退出的时候可以清除 "系统当前文件访问权限"(SYSFPRI = 0)
// i) 对加密锁内部的可执行文件而言,可以设定一个文件属性 FILEATTR_UPIGNORE,
// 这个属性告诉系统,如果 SYSFPRI >= 可执行文件的 FPRI,那么就不需要调
// 用这个可执行文件了。
//
// 对使用者的建议:
// a) 权限编码是更高一层次的文件管理功能,如果用户不需要这么复杂的管理功能,
// 把所有的文件权限编码都设定为 0 就好了。
// b) 注意权限编码跟类别编码不同,先分类再分级。
//
// (4) 目录/文件 属性 (半字节)
// 每个文件/目录都有一个属性描述(FATTR),每1位代表一种属性。
// NORMAL 0x00 // 普通文件 a)
// EXEC 0x10 // 可执行文件 b)
// DIR 0x20 // 这是一个目录,不是文件 c)
// UPIGNORE 0x40 // 高于忽略 d)
// INTERNAL 0x80 // 内部文件 e)
// a) 普通文件
// b) 可执行属性,表明这个文件是加密锁内部可执行文件,这种文件必须被放在加
// 密锁的根目录下,而且只有在超级密码验证通过后才能创建和删除。
// c) 目录属性,表示这是一个目录,如果这个属性被设置,其它属性位会被忽略。
// d) 高于忽略属性,只对加密锁内部的可执行文件有效的属性位,如果
// SYSFPRI >= FPRI,这个执行被忽略。
// e) 内部文件属性位,表示这个文件只能由可执行文件来访问,外部操作只有在超
// 级密码验证通过后可以删除,但不可以读写。没有超级密码验证通过的时候根
// 本不允许外部访问。
//
// (5) 文件的长文件名
// 在创建文件/目录的时候,可以给出一个不超过 16 个字符的长文件名,这个长文
// 件名是可选的。如果设定了长文件名,以后对这个文件的操作既可以通过文件 ID
// 也可以通过长文件名来访问。
// ==========================================================================
// (1) 格式化操作必须在通过超级密码验证的情况下才允许进行,在进行格式化操作的
// 时候,用户可以重新设定加密锁的卷标和厂商信息,这两个信息也只有在这个时
// 候才能够设定。
// (2) 创建目录的时候要给出 目录ID、类别、权限、长文件名等信息。
// (3) 列目录指令采用的是一种枚举的方式,一直到最后返回错误,表示当前目录下没
// 有更多的文件或目录了。
// (4) SET_CURRENT_DIR 类似于 DOS 命令 cd xxxx,这个命令只需要给出目录 ID 或
// 长文件名就可以,如果通过长文件名来设定,必须首先把 ID 添为 0。
// (5) 创建文件的时候也要给出全部的 文件ID、类别、权限、属性、文件大小、长文件
// 名等信息,如果没有长文件名,全部添 0 就可以。
// (6) 创建文件会自动把被创建的文件设定为当前文件,不需要调用 SET_CURRENT_FILE
#define NOT_SUPPORT_SIZE_DURING_GENERATE_RSA_KEY 0x90000001 //生成Rsa Key时给出了不支持的大小(只支持512位和1024位两种)
#define GET_3DES_KEY_FAILED 0x90000002 //获取3DES密钥失败
#define NO_PASSED 0 //密码没有验证通过
#define SUPER_PASSWORD_PASSED 4 //超级密码验证通过
#define REMOTE_PASSWORD_PASSED 8 //远程升级密码验证通过
#define SUPER_REMOTE_PASSWORD_PASSED 12 //超级密码和远程升级密码均验证通过
// BYTE gDesKey[128];
// BYTE gRsaPubKey[128];
//功能: 顺序表翻转
//内部使用
void plus_ReverseByte(BYTE* pBuf,DWORD len);
void plus_ReverseDword(DWORD* pBuf,DWORD len);
//下列函数中的hic参数均为加密锁的句柄
//功能: 获取卷标和开发商信息
//strVolume: 返回加密锁的卷标
//strManufactureInfo: 返回加密锁内的开发商信息
//这两个参数是开发商可以更改的,最终用户不可以更改
EXTERN_C int WINAPI DicPlus_GetCardInfo(int hic, char strVolume[], char strManufactureInfo[]);
//功能: 获取生产时间、序列号、销售时间、COS版本等信息
//pdwProduceTime: 返回加密锁的生产时间
//pdwSerial: 返回加密锁的序列号
//pdwSalesTime: 返回加密锁的销售时间
//pdwCOSVersion: 返回加密锁内的COS版本
//这四个参数出厂时由生产商设定,不可更改
EXTERN_C int WINAPI DicPlus_GetHardwareInfo(int hic,
DWORD *pdwProducedTime,
DWORD *pdwSerial,
DWORD *pdwSalesTime,
DWORD *pdwCOSVersion);
//功能: 获取区域编码、代理商编码和两个用户编码
//pwZoneCode: 返回区域编码
//pwAgentCode: 返回代理商编码
//pwUser1Code: 返回用户1的编码
//pwUser2Code: 返回用户2的编码
EXTERN_C int WINAPI DicPlus_GetManagerCode(int hic,
WORD *pwZoneCode,
WORD *pwAgentCode,
WORD *pwUser1Code,
WORD *pwUser2Code);
//功能: 取得密码验证状态,由枚举变量piState返回,返回值意义如下:
// NO_PASSED = 0, //密码没有验证通过
// SUPER_PASSWORD_PASSED = 4, //超级密码验证通过
// REMOTE_PASSWORD_PASSED = 8, //远程升级密码验证通过
// SUPER_REMOTE_PASSWORD_PASSED = 12 //超级密码和远程升级密码均验证通过
EXTERN_C int WINAPI DicPlus_GetPasswordVerifyState(int hic, int *piState);
//功能: 获取远程升级标志和升级密码
//pdwFlag: 返回远程升级标志
//abyPassword: 返回远程升级密码
EXTERN_C int WINAPI DicPlus_GetRemoteInfo(int hic, DWORD *pdwFlag, BYTE abyPassword[]);
//功能: 设置远程升级标志和升级密码
//dwFlag: 设置远程升级标志
//abyPassword: 设置远程升级密码
EXTERN_C int WINAPI DicPlus_SetRemoteInfo(int hic, DWORD dwFlag, const BYTE abyPassword[]);
//功能: 验证远程升级标志和升级密码是否正确
//dwFlag: 要验证的远程升级标志
//dwPassword: 要验证的远程升级密码
EXTERN_C int WINAPI DicPlus_CheckRemoteInfo(int hic, DWORD dwFlag, const BYTE byPassword[]);
//下面是关于文件和目录的一些操作,说明如下:
//文件和目录的类别是一个0x00 - 0xff之间的数
//文件和目录的属性:
//FILEATTR_NORMAL 一般的数据文件
//FILEATTR_EXEC 表示可执行
//FILEATTR_DIR 表示为目录
//FILEATTR_UPIGNORE 表示为高于忽略,如果当前系统安全级别高于或等于可执行程序的安全级别,则不执行该程序
//FILEATTR_INTERNAL 表示为内部应用程序自己使用的文件,不能从外部进行操作。如果一个文件被标志为内部文件,它就具有了隐含的属性,在列目录时,只有通过了超级密码验证才能看到这些隐含的文件
//文件的安全级别是一个0x00 - 0x0f之间的数
//功能: 获取当前目录ID、类别、属性、安全级别和目录名
//pwDirID: 返回当前目录ID
//pbyDirType: 返回当前目录类别
//pbyDirAttribute: 返回当前目录属性
//strDirName: 返回当前目录名
EXTERN_C int WINAPI DicPlus_GetCurrentDir(int hic,
WORD *pwDirID,
BYTE *pbyDirType,
BYTE *pbyDirAttribute,
char strDirName[]);
//功能: 设置当前目录为wDirID标识的目录
//wDirID: 目录ID
//strDirName: 目录名
//备注: 可以通过目录ID或目录名设置当前目录,传入其中一个值即可,
// 另一个值可以设为0或NULL,两个值都传入时这两个值应该代表同一个目录
EXTERN_C int WINAPI DicPlus_SetCurrentDir(int hic,
WORD wDirID,
char strDirName[]);
//功能: 获取当前文件ID、类别、属性、安全级别和文件名
//pwFileID: 返回当前文件ID
//pbyFileType: 返回当前文件类别
//pwFileSize: 返回当前文件大小
//pbyFileAttribute: 返回当前文件属性
//pbyFileSecurity: 返回当前文件安全级别
//strFileName: 返回当前文件名
EXTERN_C int WINAPI DicPlus_GetCurrentFile(int hic,
WORD *pwFileID,
BYTE *pbyFileType,
WORD *pwFileSize,
BYTE *pbyFileAttribute,
BYTE *pbyFileSecurity,
char strFileName[]);
//功能: 设置当前文件为wFileID标识的文件
//wFileID: 文件ID
//strFileName: 文件名
//备注: 可以通过文件ID或文件名设置当前目录,传入其中一个值即可,
// 另一个值可以设为0或NULL,两个值都传入时这两个值应该代表同一个文件
EXTERN_C int WINAPI DicPlus_SetCurrentFile(int hic,
WORD wFileID,
char strFileName[]);
//功能: 获取上级目录ID、类别、属性、安全级别和目录名
//pwDirID: 返回上级目录ID
//pbyDirType: 返回上级目录类别
//pbyDirAttribute: 返回上级目录属性
//strDirName: 返回上级目录名
EXTERN_C int WINAPI DicPlus_GetParentDir(int hic,
WORD *pwDirID,
BYTE *pbyDirType,
BYTE *pbyDirAttribute,
char strDirName[]);
//功能: 回到上级目录
EXTERN_C int WINAPI DicPlus_SetParentDir(int hic);
//功能: 列出当前目录下的所有目录和文件,与DicPlus_FindNextFileOrDir配合使用
//piPosition: 返回-1表示当前目录下没有目录或文件,其它表示还有目录或文件没有列出,
// 可以通过调用DicPlus_FindNextFileOrDir函数获取剩余目录或文件
//pwID: 返回当前目录下第1个目录或文件的ID
//pbyType: 返回当前目录下第1个目录或文件的类别
//pbyDirAttribute: 返回当前目录下第1个目录或文件的属性
//pbyDirSecurity: 返回当前目录下第1个文件的安全级别(查询目录时返回0)
//strName: 返回当前目录下第1个目录或文件的名称
EXTERN_C int WINAPI DicPlus_FindFirstFileOrDir(int hic,
int *piPosition,
WORD *pwID,
BYTE *pbyType,
BYTE *pbyAttribute,
BYTE *pbySecurity,
char strName[]);
//功能: 列出当前目录下的所有目录和文件,与DicPlus_FindFirstFileOrDir配合使用
//piPosition: 返回-1表示已经列出当前目录下的所有目录和文件,其它表示还有目录或文件没有列出,
// 可以通过继续调用DicPlus_FindNextFileOrDir函数获取剩余目录或文件
//pwID: 返回当前目录下piPosition后的下1个目录或文件的ID
//pbyType: 返回当前目录下piPosition后的下1个目录或文件的类别
//pbyDirAttribute: 返回当前目录下piPosition后的下1个目录或文件的属性
//pbyDirSecurity: 返回当前目录下piPosition后的下1个文件的安全级别(查询目录时返回0)
//strName: 返回当前目录下piPosition后的下1个目录或文件的名称
EXTERN_C int WINAPI DicPlus_FindNextFileOrDir( int hic,
int *piPosition,
WORD *pwID,
BYTE *pbyType,
BYTE *pbyAttribute,
BYTE *pbySecurity,
char strName[]);
//注意:读写文件时要首先将文件设置为当前文件,可通过DicPlus_SetCurrentFile设置,
//DicPlus_CreateFile会自动将创建的文件设置为当前文件
//功能: 读取当前文件
//wOffset: 当前文件偏移量
//pwRead: 传入要读取的数据大小,返回实际读取的数据大小
//pBuf: 接收数据的缓冲区
EXTERN_C int WINAPI DicPlus_ReadFile(int hic, WORD wOffset, WORD *pwRead, char *pBuf);
//功能: 写当前文件
//wOffset: 当前文件偏移量
//wWrite: 要写入的数据大小
//pBuf: 写入数据存放的缓冲区
EXTERN_C int WINAPI DicPlus_WriteFile(int hic, WORD wOffset, WORD wWrite, const char *pBuf);
//功能: 格式化
//strVolume: 卷标
//strManufactureInfo: 开发商信息
//注意: 格式化完毕后要关闭再打开才可生效
EXTERN_C int WINAPI DicPlus_FormatCard(int hic, char strVolume[], char strManufactureInfo[]);
//功能: 创建一个目录
//wDirID: 要创建的目录ID
//byDirType: 创建的目录类别
//byDirAttribute: 创建的目录属性
//strDirName: 创建的目录名
EXTERN_C int WINAPI DicPlus_CreateDir(int hic,
WORD wDirID,
BYTE byDirType,
BYTE byDirAttribute,
const char strDirName[]);
//功能: 创建一个文件
//wFileID: 要创建的文件ID
//byFileType: 创建的文件类别
//byFileAttribute: 创建的文件属性
//byFileSecurity: 创建的文件安全级别
//strFileName: 创建的文件名
EXTERN_C int WINAPI DicPlus_CreateFile(int hic,
WORD wFileID,
BYTE byFileType,
BYTE byFileAttribute,
WORD wFileSize,
BYTE byFileSecurity,
const char strFileName[]);
//功能: 删除当前目录
EXTERN_C int WINAPI DicPlus_DeleteDir(int hic);
//功能: 删除当前文件
EXTERN_C int WINAPI DicPlus_DeleteFile(int hic);
//功能: 取得一个随机数
//byRandomLength: 随机数长度,最大为16
//abyRandom: 存放随机数的数组
EXTERN_C int WINAPI DicPlus_Random(int hic, BYTE byRandomLength, BYTE abyRandom[]);
//功能: 运行一个可执行文件
//wRunFileNameID: 可执行文件的文件名表示的文件ID,注意不是可执行文件的文件ID,
// 可执行文件的文件名必须是如下形式“6AB3”、“032B”,即一个用字串表示的WORD值
// 例如可执行文件的文件名为“6AB3”,则该参数应传入0x6AB3
//wParamSize: 传入启动时的参数大小
//cpcParam: 传入启动参数
// 启动参数是将各个输入参数连接成的参数,例如输入参数为一个8字节的double和一个2字节的WORD
// 则cpcParam的前8个字节是这个输入的double值,后2个字节是输入的WORD值,wParamSize的大小为10
//pwRetDataLength: 执行后的返回数据的大小
//pcRetData: 执行后的返回数据(由于返回数据类型未知,所以需用户自己翻转成正常字节序)
// 这个参数由程序执行后的返回数据连接而成,例如如果返回数据包括一个4字节的float和一个4字节的DWORD
// 则该参数的前4个字节是这个返回的float值,后4个字节是DWORD值,*pwRetDataLength的大小为8
int WINAPI DicPlus_Run(int hic, WORD wRunFileNameID, WORD wParamSize, const char *cpcParam, WORD *pwRetDataLength, char *pcRetData);
//功能: 使用TEA算法生成一个密文文件存于pcEncData中,该算法要使用一个临时文件,该临时文件在这个函数执行完后可以调用DicPlus_DeleteFile删除
//wFileID: 临时文件ID
//byFileType: 临时文件类别
//byFileAttribute: 临时文件属性
//pwFileSize: 传入cpcFileData的大小,返回pcEncData的大小
//byFileSecurity: 临时文件的安全级别
//strFileName: 临时文件名
//cpcFileData: 要加密的文件数据指针
//pcEncData: 加密后的文件数据指针,该指针指向的*pwFileSize大小的加密后的数据可以通过网络等介质传到目的地,
// 在目的地做为DicPlus_TeaEncryptedFile2PlainFile函数的第2个参数传入,这两个函数配合实现远程升级
int WINAPI DicPlus_EncryptFileUseTea(int hic,
WORD wFileID,
BYTE byFileType,
BYTE byFileAttribute,
WORD *pwFileSize,
BYTE byFileSecurity,
const char strFileName[],
const char *cpcFileData,
char *pcEncData);
//功能: 与DicPlus_EncryptFileUseTea函数配合实现远程升级,将DicPlus_EncryptFileUseTea函数
// 的pcEncData参数返回的加密数据在锁内写成一个明文文件,文件的ID就是DicPlus_EncryptFileUseTea函数中指定的临时文件ID
//cmddata: DicPlus_EncryptFileUseTea函数的pcEncData参数返回的加密数据
int WINAPI DicPlus_TeaEncryptedFile2PlainFile(int hic, char *cmddata);
//功能: 验证超级密码
//abySuperPW: 超级密码,不能全为0,否则会被锁死
EXTERN_C int WINAPI DicPlus_CheckSuperPassword(int hic, BYTE abySuperPW[]);
//功能: 设置超级密码
//byTryTimesCeiling: 验证超级密码时最多可以尝试的次数
//abySuperPW: 超级密码,不能全为0,否则会被锁死
EXTERN_C int WINAPI DicPlus_SetSuperPassword(int hic, BYTE byTryTimesCeiling, BYTE abySuperPW[]);
//功能: 获取远程升级密码
//dwRemoteFlag: 本次远程升级标志
//dwHardSerial: 本次远程升级的硬件序列号
//abyRemotePW: 输入本次远程升级的密码,返回下一次远程升级的密码
EXTERN_C int WINAPI DicPlus_GetRemoteUpgradePassword(int hic, DWORD dwRemoteFlag, DWORD dwHardSerial, BYTE abyRemotePW[]);
// 对于DES算法,加解密数据的长度必须是密钥长度8个字节的倍数
//功能: 采用DES加密算法加密一段数据
//wKeyFileID: 密钥文件ID
//byKeyIndex: 密钥文件中的密钥索引,即密钥文件中的第多少个密钥
//wDataLength: 要加密的数据长度
//cpcDataSrc: 要加密的数据
//pcDataEnc: 加密后的数据
EXTERN_C int WINAPI DicPlus_DesEncrypt(int hic, WORD wKeyFileID, BYTE byKeyIndex, WORD wDataLength, const char *cpcDataSrc, char *pcDataEnc);
//功能: 采用DES加密算法解密
//wKeyFileID: 密钥文件ID
//byKeyIndex: 密钥文件中的密钥索引,见DicPlus_GenerateDesKeyFile函数说明中有关密钥索引的说明
//wDataLength: 要解密的数据长度
//cpcDataSrc: 要解密的数据
//pcDataDec: 解密后的数据
EXTERN_C int WINAPI DicPlus_DesDecrypt(int hic, WORD wKeyFileID, BYTE byKeyIndex, WORD wDataLength, const char *cpcDataSrc, char *pcDataDec);
//功能: 生成一个DES密钥文件,密钥长度只有8个字节和16个字节两种,如果是16个字节的密钥,加解密时会自动采用3DES算法
//wKeyFileID: 生成的密钥文件ID
//wKeyDataLength: 密钥数据的长度
//pcKeyData: 密钥数据
// 密钥数据是如下形式的数据:"\x03\x10\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\
//\x01\x08\x01\x02\x03\x04\x05\x06\x07\x08" 其中第一个\x03表示后面紧接的是索引为3的密钥,第二个\x10(16进制表示)表示这个密钥的长度是16个字节
// 紧接的16个字节是这个索引为3的密钥。接下来的第19个字节\x01表示后面紧接的是索引为1的密钥,\x08表示这个密钥的长度是8个字节
// 紧接的8个字节是这个索引为1的密钥。
// 用户也可以通过调用DicPlus_WriteFile函数往该密钥文件中继续写入密钥。
// 例如要先生成一个包含上述密钥数据的DES密钥文件,接着写入一条索引为2,长度为8个字节的密钥,代码如下:
// DicPlus_GenerateDesKeyFile(hic, 0x1003, 28, "\x03\x10\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\
//\x01\x08\x01\x02\x03\x04\x05\x06\x07\x08");
// DicPlus_SetCurrentFile(hic, 0x1003);
// DicPlus_WriteFile(hic, 28, 10, "\x02\x08\x01\x02\x03\x04\x05\x06\x07\x08");
EXTERN_C int WINAPI DicPlus_GenerateDesKeyFile(int hic, WORD wKeyFileID, WORD wKeyDataLength, char *pcKeyData);
//功能: 按指定的公私钥ID和公钥大小生成RSA公私钥文件,目前只支持512位和1024位两种密钥长度
//wPublicKeyFileID: 公钥文件ID
//wPublicKeySize: 公钥大小
//wPrivateKeyFileID: 私钥文件ID
EXTERN_C int WINAPI DicPlus_GenerateRsaKey(int hic, WORD wPublicKeyFileID, WORD wPublicKeySize, WORD wPrivateKeyFileID);
// 对于RSA算法,下面的知识是有必要了解的:即对一段明文先用私钥解密再用公钥加密=先用公钥加密再用私钥解密=明文,
// 加解密数据的长度必须是密钥长度512/8=64或1024/8=128字节的倍数
//功能: 采用RSA加密算法加密一段数据
//wPublicKeyFileID: 公钥文件ID
//wDataLength: 加密的数据长度
//cpcDataSrc: 加密的数据
//pcDataEnc: 加密后的数据
//bIsDataSrcFromOpenssl: 加密的数据是否来源于Openssl操作过的数据(因为Openssl的字节序需要在传入锁内前翻转)
EXTERN_C int WINAPI DicPlus_RsaEncrypt(int hic, WORD wPublicKeyFileID, WORD wDataLength, const char *cpcDataSrc, char *pcDataEnc, BOOL bIsDataSrcFromOpenssl);
//功能: 采用RSA解密算法解密一段数据
//wPrivateKeyFileID: 私钥文件ID
//wDataLength: 解密的数据长度
//cpcDataSrc: 解密的数据
//pcDataDec: 解密后的数据
//bIsDataSrcFromOpenssl: 解密的数据是否来源于Openssl操作过的数据(因为Openssl的字节序需要在传入锁内前翻转)
EXTERN_C int WINAPI DicPlus_RsaDecrypt(int hic, WORD wPrivateKeyFileID, WORD wDataLength, const char *cpcDataSrc, char *pcDataDec, BOOL bIsDataSrcFromOpenssl);
//功能: 获取加密锁的剩余空间大小
//pdwFreeSpace: 返回加密锁的剩余空间大小
EXTERN_C int WINAPI DicPlus_GetFreeSpace(int hic, DWORD *pdwFreeSpace);
//功能: 设置计数器初始值
//dwInit: 计数器初始值
EXTERN_C int WINAPI DicPlus_SetCounter(int hic, DWORD dwInit);
//功能: 使计数器值减1
EXTERN_C int WINAPI DicPlus_DecreaseCounter(int hic);
//功能: 使用Openssl生成一个公钥文件
//wPublicKeyFileID 公钥文件ID
//wPublicKeySize 公钥大小
//cpbyPublicKeyData 公钥数据,一般为用BN_bn2bin函数得到的RSA结构中的n
EXTERN_C int WINAPI DicPlus_GenerateRsaPublicKeyFile(int hic, WORD wPublicKeyFileID, WORD wPublicKeySize/*512/1024*/, const BYTE *cpbyPublicKeyData);
//功能: 使用Openssl生成一个私钥文件
//wPrivateKeyFileID 私钥文件ID
//wPrivateKeySize 私钥大小
//cpbyPrivateKeyDataD 私钥数据D,一般为用BN_bn2bin函数得到的RSA结构中的d
//cpbyPrivateKeyDataN 私钥数据N,一般为用BN_bn2bin函数得到的RSA结构中的n
EXTERN_C int WINAPI DicPlus_GenerateRsaPrivateKeyFile(int hic, WORD wPrivateKeyFileID, WORD wPrivateKeySize/*512/1024*/, const BYTE *cpbyPrivateKeyDataD, const BYTE *cpbyPrivateKeyDataN);
#endif //__DIC32_H__