#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__