| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988 |
- /*
- ARM 加密锁 API 接口库
- */
- #ifndef __DONGLE_HEADER_H
- #define __DONGLE_HEADER_H
- #include "winscard.h"
- #pragma comment (lib, "winscard.lib")
- #ifdef __cplusplus
- extern "C" {
- #endif
- #ifndef IN
- #define IN
- #endif
- #ifndef OUT
- #define OUT
- #endif
- /************************************************************************/
- /* 定义 */
- /************************************************************************/
- //加密锁句柄定义
- typedef void * DONGLE_HANDLE;
- //默认的PIN码重试次数为无限制
- //根据种子码初始化锁时会同时初始化PID和ADMINPIN (PID不可更改, ADMINPIN可更改)
- #define CONST_PID 0xFFFFFFFF //出厂时默认的PID
- #define CONST_USERPIN "12345678" //出厂时默认的USERPIN
- #define CONST_ADMINPIN "FFFFFFFFFFFFFFFF" //出厂时默认的ADMINPIN
- //通讯协议类型定义
- #define PROTOCOL_HID 0 //hid协议
- #define PROTOCOL_CCID 1 //ccid协议
- //文件类型定义
- #define FILE_DATA 1 //普通数据文件
- #define FILE_PRIKEY_RSA 2 //RSA私钥文件
- #define FILE_PRIKEY_ECCSM2 3 //ECC或者SM2私钥文件(SM2私钥文件和ECC私钥文件结构相同,属相同文件类型)
- #define FILE_KEY 4 //SM4和3DES密钥文件
- #define FILE_EXE 5 //可执行文件
- //LED灯状态定义
- #define LED_OFF 0 //灯灭
- #define LED_ON 1 //灯亮
- #define LED_BLINK 2 //灯闪
- //PIN码类型
- #define FLAG_USERPIN 0 //用户PIN
- #define FLAG_ADMINPIN 1 //开发商PIN
- //加解密标志
- #define FLAG_ENCODE 0 //加密
- #define FLAG_DECODE 1 //解密
- //HASH算法类型
- #define FLAG_HASH_MD5 0 //MD5 运算结果16字节
- #define FLAG_HASH_SHA1 1 //SHA1 运算结果20字节
- #define FLAG_HASH_SM3 2 //SM3 运算结果32字节
- //远程升级的功能号
- #define UPDATE_FUNC_CreateFile 1 //创建文件
- #define UPDATE_FUNC_WriteFile 2 //写文件
- #define UPDATE_FUNC_DeleteFile 3 //删除文件
- #define UPDATE_FUNC_FileLic 4 //设置文件授权
- #define UPDATE_FUNC_SeedCount 5 //设置种子码可运算次数
- #define UPDATE_FUNC_DownloadExe 6 //升级可执行文件
- #define UPDATE_FUNC_UnlockUserPin 7 //解锁用户PIN
- #define UPDATE_FUNC_Deadline 8 //时钟锁升级使用期限
- /************************************************************************/
- /* 结构 */
- /************************************************************************/
- //RSA公钥格式(兼容1024,2048)
- typedef struct {
- unsigned int bits; // length in bits of modulus
- unsigned int modulus; // modulus
- unsigned char exponent[256]; // public exponent
- } RSA_PUBLIC_KEY;
- //RSA私钥格式(兼容1024,2048)
- typedef struct {
- unsigned int bits; // length in bits of modulus
- unsigned int modulus; // modulus
- unsigned char publicExponent[256]; // public exponent
- unsigned char exponent[256]; // private exponent
- } RSA_PRIVATE_KEY;
- //外部ECCSM2公钥格式 ECC(支持bits为192或256)和SM2的(bits为固定值0x8100)公钥格式
- typedef struct{
- unsigned int bits; // length in bits of modulus
- unsigned int XCoordinate[8]; // 曲线上点的X坐标
- unsigned int YCoordinate[8]; // 曲线上点的Y坐标
- } ECCSM2_PUBLIC_KEY;
- //外部ECCSM2私钥格式 ECC(支持bits为192或256)和SM2的(bits为固定值0x8100)私钥格式
- typedef struct{
- unsigned int bits; // length in bits of modulus
- unsigned int PrivateKey[8]; // 私钥
- } ECCSM2_PRIVATE_KEY;
- //加密锁信息
- typedef struct
- {
- unsigned short m_Ver; //COS版本,比如:0x0201,表示2.01版
- unsigned short m_Type; //产品类型: 0xFF表示标准版, 0x00为标准时钟锁,0x02为标准U盘锁
- unsigned char m_BirthDay[8]; //出厂日期
- unsigned long m_Agent; //代理商编号,比如:默认的0xFFFFFFFF
- unsigned long m_PID; //产品ID
- unsigned long m_UserID; //用户ID
- unsigned char m_HID[8]; //8字节的硬件ID
- unsigned long m_IsMother; //母锁标志: 0x01表示是母锁, 0x00表示不是母锁
- unsigned long m_DevType; //设备类型(PROTOCOL_HID或者PROTOCOL_CCID)
- } DONGLE_INFO;
- /**
- * 锁内文件说明
- * 1.RSA私钥文件允许创建的最大数量为8个
- * 2.ECCSM2私钥文件允许创建的最大数量为16个
- * 3.3DES/SM4密钥文件允许创建的最大数量为32个
- * 4.可执行文件允许创建的最大数量为64个,总大小不能超过64K
- * 5.数据文件创建个数受锁内空间大小和文件系统其他因素的影响,最大个数不超过54个。
- * 6.文件ID取值范围为0x0000~0xFFFF之间,其中ID:0x0000、0xFFFF、0x3F00被锁内系统占用,用户不能使用。
- */
- /*************************文件授权结构***********************************/
- //数据文件授权结构
- typedef struct
- {
- unsigned short m_Read_Priv; //读权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
- unsigned short m_Write_Priv; //写权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
- } DATA_LIC;
- //私钥文件授权结构
- typedef struct
- {
- long m_Count; //可调次数: 0xFFFFFFFF表示不限制, 递减到0表示已不可调用
- unsigned char m_Priv; //调用权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
- unsigned char m_IsDecOnRAM; //是否是在内存中递减: 1为在内存中递减,0为在FLASH中递减
- unsigned char m_IsReset; //用户态调用后是否自动回到匿名态: TRUE为调后回到匿名态 (开发商态不受此限制)
- unsigned char m_Reserve; //保留,用于4字节对齐
- } PRIKEY_LIC;
- //对称加密算法(SM4/TDES)密钥文件授权结构
- typedef struct
- {
- unsigned long m_Priv_Enc; //加密时的调用权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
- } KEY_LIC;
- //可执行文件授权结构
- typedef struct
- {
- unsigned short m_Priv_Exe; //运行的权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
-
- } EXE_LIC;
- /****************************文件属性结构********************************/
- //数据文件属性数据结构
- typedef struct
- {
- unsigned long m_Size; //数据文件长度,该值最大为4096
- DATA_LIC m_Lic; //授权
-
- } DATA_FILE_ATTR;
- //ECCSM2/RSA私钥文件属性数据结构
- typedef struct
- {
- unsigned short m_Type; //数据类型:ECCSM2私钥 或 RSA私钥
- unsigned short m_Size; //数据长度:RSA该值为1024或2048, ECC该值为192或256, SM2该值为0x8100
- PRIKEY_LIC m_Lic; //授权
- } PRIKEY_FILE_ATTR;
- //对称加密算法(SM4/TDES)密钥文件属性数据结构
- typedef struct
- {
- unsigned long m_Size; //密钥数据长度=16
- KEY_LIC m_Lic; //授权
- } KEY_FILE_ATTR;
- //可执行文件属性数据结构
- typedef struct
- {
- EXE_LIC m_Lic; //授权
- unsigned short m_Len; //文件长度
- } EXE_FILE_ATTR;
- /*************************文件列表结构***********************************/
- //获取私钥文件列表时返回的数据结构
- typedef struct
- {
- unsigned short m_FILEID; //文件ID
- unsigned short m_Reserve; //保留,用于4字节对齐
- PRIKEY_FILE_ATTR m_attr; //文件属性
- }PRIKEY_FILE_LIST;
- //获取SM4及TDES密钥文件列表时返回的数据结构
- typedef struct
- {
- unsigned short m_FILEID; //文件ID
- unsigned short m_Reserve; //保留,用于4字节对齐
- KEY_FILE_ATTR m_attr; //文件属性
- }KEY_FILE_LIST;
- //获取数据文件列表时返回的数据结构
- typedef struct
- {
- unsigned short m_FILEID; //文件ID
- unsigned short m_Reserve; //保留,用于4字节对齐
- DATA_FILE_ATTR m_attr; //文件属性
- }DATA_FILE_LIST;
- //获取可执行文件列表时返回的数据结构
- typedef struct
- {
- unsigned short m_FILEID; //文件ID
- EXE_FILE_ATTR m_attr;
- unsigned short m_Reserve; //保留,用于4字节对齐
-
- }EXE_FILE_LIST;
- //下载和列可执行文件时填充的数据结构
- typedef struct
- {
- unsigned short m_dwSize; //可执行文件大小
- unsigned short m_wFileID; //可执行文件ID
- unsigned char m_Priv; //调用权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
- unsigned char *m_pData; //可执行文件数据
- }EXE_FILE_INFO;
- //需要发给空锁的初始化数据
- typedef struct
- {
- int m_SeedLen; //种子码长度
- BYTE m_SeedForPID[256]; //产生产品ID和开发商密码的种子码 (最长250个字节)
- char m_UserPIN[18]; //用户密码(16个字符的0终止字符串)
- BYTE m_UserTryCount; //用户密码允许的最大错误重试次数
- BYTE m_AdminTryCount; //开发商密码允许的最大错误重试次数
- RSA_PRIVATE_KEY m_UpdatePriKey; //远程升级私钥
- DWORD m_UserID_Start; //起始用户ID
- } SON_DATA;
- //母锁数据
- typedef struct
- {
- SON_DATA m_Son; //子锁初始化数据
- long m_Count; //可产生子锁初始化数据的次数 (-1表示不限制次数, 递减到0时会受限)
- } MOTHER_DATA;
- /**************************************************************************/
- /* API */
- /**************************************************************************/
- /**
- * @brief 枚举加密锁。本函数最多会枚举出32个hid设备和32个ccid设备。
- *
- * @param pDongleInfo [out] 设备信息的数组。当此参数为NULL时, pCount返回找到的设备的数目。
- * @param pCount [out] 设备数目。该函数最多可以同时枚举出32个HID设备和32个CCID设备。
- *
- * @return DONGLE_SUCCESS 执行成功。
- */
- DWORD WINAPI Dongle_Enum(DONGLE_INFO * pDongleInfo, int * pCount);
- /**
- * @brief 打开指定的加密锁。
- *
- * @param phDongle [out] 句柄指针。如果打开成功,会被填充。
- * @param nIndex [in] 基于0的索引值。指示打开找到的第几把加密锁。
- *
- * @return DONGLE_SUCCESS 打开成功。
- */
- DWORD WINAPI Dongle_Open(DONGLE_HANDLE * phDongle, int nIndex);
- /**
- * @brief 清除PIN码验证状态。将加密锁状态变为匿名。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- *
- * @return DONGLE_SUCCESS 执行成功。
- */
- DWORD WINAPI Dongle_ResetState(DONGLE_HANDLE hDongle);
- /**
- * @brief 关闭打开的加密锁。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- *
- * @return DONGLE_SUCCESS 关闭成功。
- */
- DWORD WINAPI Dongle_Close(DONGLE_HANDLE hDongle);
- /**
- * @brief 产生随机数。匿名权限即可操作。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param nLen [in] 要产生的随机数的长度。nLen的取值范围为 1~128。
- * @param pRandom [out] 随机数缓冲区。
- *
- * @return DONGLE_SUCCESS 获取随机数成功。
- */
- DWORD WINAPI Dongle_GenRandom(DONGLE_HANDLE hDongle, int nLen, BYTE * pRandom);
- /**
- * @brief LED灯的控制操作。匿名权限即可操作。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param nFlag [in] 控制类型。例如:nFlag = LED_ON,表示控制LED为亮的状态;
- * nFlag = LED_OFF,表示控制LED为灭的状态;nFlag = LED_BLINK,
- * 表示控制LED为闪烁的状态。
- *
- * @return DONGLE_SUCCESS 命令执行成功。
- */
- DWORD WINAPI Dongle_LEDControl(DONGLE_HANDLE hDongle, int nFlag);
- /**
- * @brief 切换通讯协议。调用执行成功后加密锁会自动重启,打开的句柄hDongle会无效,接下来执行关闭操作会返回
- * 0xF0000002的错误码,这属正常。如需继续操作,请重新枚举并打开锁。该操作必须要验证开发商PIN码之
- * 后方可使用。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param nFlag [in] 协议类型。例如:nFlag值为PROTOCOL_HID,表示将加密锁切换为HID设备;
- * nFlag值为PROTOCOL_CCID,表示将加密锁切换为CCID设备
- *
- * @return DONGLE_SUCCESS 执行成功。
- */
- DWORD WINAPI Dongle_SwitchProtocol(DONGLE_HANDLE hDongle, int nFlag);
- /**
- * @brief 一键恢复。即返回出厂状态,加密锁的PID、用户PIN码、开发商PIN码等,全部恢复到出厂状态所有写入的
- * 数据都将被清空。另外,调用执行成功后加密锁会自动重启,打开的句柄hDongle会无效,接下来执行关闭操
- * 做会返回0xF0000002的错误码,这属正常。如需继续操作,请重新枚举并打开锁。该操作需要开发商权限。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- *
- * @return DONGLE_SUCCESS 执行成功。
- */
- DWORD WINAPI Dongle_RFS(DONGLE_HANDLE hDongle);
- /**
- * @brief 创建文件。该函数不支持可执行文件的创建。该操作需要开发商权限。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param nFileType [in] 文件类型。
- * nFileType = FILE_DATA,表示创建数据文件;对数据文件有以下说明:
- * 1.文件大小设为252字节时,最多可创建54个文件,即占用空间13608字节
- * 2.文件大小设为1024字节时,最多可创建31个文件,即占用空间31744字节
- * 3.文件大小设为4096字节时,最多可创建9个文件,即占用空间36864字节
- * nFileType = FILE_PRIKEY_RSA,表示创建RSA私钥文件;
- * nFileType = FILE_PRIKEY_ECCSM2,表示创建ECCSM2私钥文件;
- * nFileType = FILE_KEY,表示创建SM4和3DES密钥文件;
- * 不支持nFileType = FILE_EXE的文件类型。
- * @param wFileID [in] 文件ID。
- * @param pFileAttr [in] 文件的属性。参数的结构为:DATA_FILE_ATTR、PRIKEY_FILE_ATTR或KEY_FILE_ATTR。
- *
- * @return DONGLE_SUCCESS 创建文件成功。
- */
- DWORD WINAPI Dongle_CreateFile(DONGLE_HANDLE hDongle, int nFileType, WORD wFileID, void * pFileAttr);
- /**
- * @brief 写文件。该函数不支持可执行文件的写入操作,且该操作需要开发商权限。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param nFileType [in] 文件类型。例如,
- * nFileType = FILE_DATA,表示创建数据文件;
- * nFileType = FILE_PRIKEY_RSA,表示创建RSA私钥文件;
- * nFileType = FILE_PRIKEY_ECCSM2,表示创建ECCSM2私钥文件;
- * nFileType = FILE_KEY,表示创建SM4和3DES密钥文件;
- * 不支持nFileType = FILE_EXE的文件类型。
- * @param wFileID [in] 文件ID。
- * @param wOffset [in] 文件偏移。文件写入的起始偏移量。
- * @param pInData [in] 准备写入的数据。
- * @param nDataLen [in] 参数pInData的大小。
- *
- * @return DONGLE_SUCCESS 写入文件成功。
- */
- DWORD WINAPI Dongle_WriteFile(DONGLE_HANDLE hDongle, int nFileType, WORD wFileID, WORD wOffset, BYTE * pInData, int nDataLen);
- /**
- * @brief 读取加密锁内的数据文件。数据文件的读取权限取决于创建时的设定。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param wFileID [in] 文件ID。
- * @param wOffset [in] 文件偏移量。
- * @param pOutData [in] 数据缓冲区。
- * @param nDataLen [out] 参数pOutData的长度。
- *
- * @return DONGLE_SUCCESS 读取数据文件成功
- */
- DWORD WINAPI Dongle_ReadFile(DONGLE_HANDLE hDongle, WORD wFileID, WORD wOffset, BYTE * pOutData, int nDataLen);
- /**
- * @brief 批量下载可执行文件。锁内可执行文件的数量不能超过64个,可执行文件的总大小不能超过64K,
- * 该操作需要验证管理员权限
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param pExeFileInfo [in] 可执行文件信息的数组。
- * @param nCount [in] 即可执行文件的数量。
- *
- * @return DONGLE_SUCCESS 批量下载可执行文件成功。
- */
- DWORD WINAPI Dongle_DownloadExeFile(DONGLE_HANDLE hDongle, EXE_FILE_INFO * pExeFileInfo, int nCount);
- /**
- * @brief 运行指定的锁内可执行程序。运行可执行文件的权限,取决于批量下载时,每个可执行文件的设置,
- * 即,EXE_FILE_INFO中的m_Priv参数。输入输出数据的最大长度不能超过1024字节,输入输出数据缓
- * 冲区pInOutBuf对应锁内的InOutBuf。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param wFileID [in] 可执行文件的文件ID。
- * @param pInOutBuf [in,out] 输入输出数据缓冲区。
- * @param wInOutBufLen [in] 输入输出数据缓冲区pInOutBuf的大小。
- * @param pMainRet [out] 锁内可执行程序main函数的返回值,可以为NULL。
- *
- * @return DONGLE_SUCCESS 运行指定的可执行文件成功。
- */
- DWORD WINAPI Dongle_RunExeFile(DONGLE_HANDLE hDongle, WORD wFileID, BYTE * pInOutBuf, WORD wInOutBufLen, int * pMainRet);
- /**
- * @brief 删除文件。需要开发商权限。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param nFileType [in] 文件类型。
- * @param wFileID [in] 文件ID。
- *
- * @return DONGLE_SUCCESS 删除文件成功
- */
- DWORD WINAPI Dongle_DeleteFile(DONGLE_HANDLE hDongle, int nFileType, WORD wFileID);
- /**
- * @brief 列文件。需要开发商权限。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param nFileType [in] 指示文件类型。例如,FILE_DATA等。
- * @param pFileList [in] pList:输出文件的列表 (此参数为NULL时, pLen中返回所需的缓冲区长度)
- * 当nFileType = FILE_DATA时, pFileList指向DATA_FILE_LIST结构;
- * 当nFileType = FILE_PRIKEY_RSA时, pFileList指向PRIKEY_FILE_LIST结构;
- * 当nFileType = FILE_PRIKEY_ECCSM2时, pFileList指向PRIKEY_FILE_LIST结构
- * 当nFileType = FILE_KEY时, pFileList指向KEY_FILE_LIST结构;
- * 当nFileType = FILE_EXE时, pFileList指向EXE_FILE_LIST结构。
- * @param pDataLen [in,out] 参数pFileList的输入长度,执行成功返回pFileList的字节长度。
- *
- * @return DONGLE_SUCCESS 列文件成功。
- */
- DWORD WINAPI Dongle_ListFile(DONGLE_HANDLE hDongle, int nFileType, void* pFileList, int * pDataLen);
- /**
- * @brief 唯一化锁。输入种子码产生PID和开发商PIN码,需要开发商权限,执行成功后加密锁自动回到匿名态。
- * 产生开发商PIN码的目的是为了使密码肯定不是弱密码,产生的开发商PIN可以借助Dongle_ChangePIN
- * 进行更改。另外,种子码一定要牢记,否则任何人永远无法得知开发商PIN码。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param nSeedLen [in] 参数pSeed的缓冲区长度。
- * @param pSeed [in] 种子码的缓冲区。
- * @param pPIDStr [out] 函数执行成功返回PID。该缓冲区大小至少应该为8字节,返回一个
- * 8字节的以0终止的ansi字符串。
- * @param pAdminPINstr [out] 函数执行成功返回开发商PIN码。该缓冲区大小至少应该为16字节,
- * 返回字符串长度为16字节的以0终止的ansi字符串。
- *
- * @return DONGLE_SUCCESS 唯一化锁成功。
- */
- DWORD WINAPI Dongle_GenUniqueKey(DONGLE_HANDLE hDongle,int nSeedLen, BYTE * pSeed, char * pPIDstr, char * pAdminPINstr);
- /**
- * @brief 校验密码
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param nFlags [in] PIN码类型。参数取值为FLAG_USERPIN或者FLAG_ADMINPIN。
- * @param pPIN [in] PIN码,0终止的ansi字符串。
- * @param pRemainCount [out] 剩余重试次数。返回0表示已锁死;1~253表示剩余次数;255表示不限制重试次数。
- *
- * @return DONGLE_SUCCESS 校验成功。如果校验失败,函数的返回值中也含有剩余的重试次数,
- * (错误码 & 0xFFFFFF00) == DONGLE_INCORRECT_PIN,即后两位表示剩余次数。
- */
- DWORD WINAPI Dongle_VerifyPIN(DONGLE_HANDLE hDongle, int nFlags, char * pPIN, int * pRemainCount);
- /**
- * @brief 更改密码
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param nFlags [in] PIN码类型。参数取值为FLAG_USERPIN或者FLAG_ADMINPIN。
- * @param pOldPIN [in] 旧的PIN码缓冲区。必须是一个字符串长度为16字节的0终止的ansi字符串,且可以是中文。
- * @param pNewPIN [in] 新的PIN码缓冲区。必须是一个字符串长度为16字节的0终止的ansi字符串。
- * @param nTryCount [in] 重试次数。该参数的取值范围为1~255,其中255表示不限制重试次数。
- *
- * @return DONGLE_SUCCESS 修改密码成功。
- */
- DWORD WINAPI Dongle_ChangePIN(DONGLE_HANDLE hDongle, int nFlags, char * pOldPIN, char * pNewPIN, int nTryCount);
- /**
- * @brief 重置用户PIN码。空锁(即PID=FFFFFFFF)不能重置密码。执行成功后用户密码恢复为出厂默认 CONST_USERPIN
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param pAdminPIN [in] 开发商PIN码缓冲区。长度为16字节的0终止的ansi字符串
- *
- * @return DONGLE_SUCCESS 重置用户PIN码成功。
- */
- DWORD WINAPI Dongle_ResetUserPIN(DONGLE_HANDLE hDongle, char * pAdminPIN);
- /**
- * @brief 设置用户ID。需要开发商权限。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param dwUserID [in] 用户ID。
- *
- * @return DONGLE_SUCCESS 重置用户PIN码成功。
- */
- DWORD WINAPI Dongle_SetUserID(DONGLE_HANDLE hDongle, DWORD dwUserID);
- /**
- * @brief 获取加密锁到期时间。匿名权限获取。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param pdwTime [out] 获取的到期UTC时间值。
- * 若*pdwTime = 0XFFFFFFFF,表示不限制到期时间
- * 若(*pdwTime & 0XFFFF0000) == 0,值表示还剩余几小时
- * 若(*pdwTime & 0XFFFF0000) != 0,值表示到期的UTC的时间,可以通过gmtime等将该值进行转换。
- *
- * @return DONGLE_SUCCESS 获取加密锁到期时间成功。
- */
- DWORD WINAPI Dongle_GetDeadline(DONGLE_HANDLE hDongle, DWORD * pdwTime);
- /**
- * @brief 设置加密锁的到期时间。该操作需要管理员权限。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param dwTime [in] 时间值。说明:
- * 1.设置可用小时数,范围在1~65535,例如dwTime = 24。这种情况在校验了用户PIN码后开始计时。
- * 2.设置到期的年与日时分秒。可通过函数time或者mktime 取得即时的utc时间值(utc值都大于65535);
- * 3.取消到期时间限制,此时dwTime的值只能为0xFFFFFFFF。
- *
- * @return DONGLE_SUCCESS 设置加密锁到期时间成功。
- */
- DWORD WINAPI Dongle_SetDeadline(DONGLE_HANDLE hDongle, DWORD dwTime);
- /**
- * @brief 获取加密锁的UTC时间。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param pdwUTCTime [out] UTC时间值指针。
- *
- * @return DONGLE_SUCCESS 设置加密锁到期时间成功。
- */
- DWORD WINAPI Dongle_GetUTCTime(DONGLE_HANDLE hDongle, DWORD * pdwUTCTime);
- /**
- * @brief 读取锁内数据区数据。数据区大小共8k,前4k(0~4095)的读写没有权限限制,后4k(4096~8191)任意权限可读,
- * 但是只有开发商权限可写。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param nOffset [in] 起始偏移。范围在0~8191
- * @param pData [out] 读取的数据缓冲区。
- * @param nDataLen [in] 参数pData的缓冲区大小。
- *
- * @return DONGLE_SUCCESS 读取数据区数据成功。
- */
- DWORD WINAPI Dongle_ReadData(DONGLE_HANDLE hDongle, int nOffset, BYTE* pData, int nDataLen);
- /**
- * @brief 写入锁内数据区数据。数据区大小共8k,前4k(0~4095)的读写没有权限限制,后4k(4096~8191)任意权限可读,
- * 但是只有开发商权限可写。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param nOffset [in] 起始偏移。范围在0~8191
- * @param pData [in] 写入的数据缓冲区。
- * @param nDataLen [in] 参数pData的缓冲区大小。
- *
- * @return DONGLE_SUCCESS 写入数据区数据成功。
- */
- DWORD WINAPI Dongle_WriteData(DONGLE_HANDLE hDongle, int nOffset, BYTE * pData, int nDataLen);
- /**
- * @brief 获取共享内存数据。共享内存总大小为32字节。没有权限限制,掉电后数据自动擦除。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param pData [out] 输出的数据。输出共享内存的数据,固定为32个字节。
- *
- * @return DONGLE_SUCCESS 获取共享内存数据成功。
- */
- DWORD WINAPI Dongle_ReadShareMemory(DONGLE_HANDLE hDongle, BYTE * pData);
- /**
- * @brief 设置共享内存数据。没有权限限制,掉电后数据自动擦除。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param pData [in] 输入数据。
- * @param nDataLen [in] 参数pData的缓冲区大小。长度不能超过32。
- *
- * @return DONGLE_SUCCESS 设置共享内存数据成功。
- */
- DWORD WINAPI Dongle_WriteShareMemory(DONGLE_HANDLE hDongle, BYTE * pData, int nDataLen);
- /**
- * @brief 产生RSA公钥和私钥。使用该函数之前需要先创建一个RSA私钥文件。需要开发商权限。成功后注意保存RSA公私钥数据。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param wPriFileID [in] RSA私钥文件ID。
- * @param pPubBakup [out] RSA公钥数据。
- * @param pPriBakup [out] RSA私钥数据。
- *
- * @return DONGLE_SUCCESS 产生RSA公私钥成功。
- */
- DWORD WINAPI Dongle_RsaGenPubPriKey(DONGLE_HANDLE hDongle, WORD wPriFileID, RSA_PUBLIC_KEY * pPubBakup, RSA_PRIVATE_KEY * pPriBakup);
- /**
- * @brief RSA私钥运算。函数的使用权限取决于锁内RSA私钥文件的权限,在RSA私钥文件创建时设定。说明:
- * 1.对于加密运算,输入数据长度必须小于私钥ID为wPriFileID的密钥长度除以8再减去11,以便在函数内部进行padding
- * 2.对于解密运算,输入数据长度必须与wPriFileID中指示的密钥长度相一致(比如1024位密钥时为128,2048时为256)
- * 3.加密时内部padding方式为:PKCS1_TYPE_1 (即第二个字节为0x01,空数据填充0XFF)
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param wPriFileID [in] RSA私钥文件ID。
- * @param nFlag [in] 运算类型。例如,FLAG_ENCODE表示加密运算;FLAG_DECODE表示解密运算。
- * @param pInData [in] 输入数据。
- * @param nInDataLen [in] 参数pInData的大小
- * @param pOutData [out] 输出数据缓冲区。
- * @param pOutDataLen [in,out] 参数pOutData的大小和返回的数据大小。
- *
- * @return DONGLE_SUCCESS RSA私钥运算成功。
- */
- DWORD WINAPI Dongle_RsaPri(DONGLE_HANDLE hDongle, WORD wPriFileID, int nFlag, BYTE * pInData, int nInDataLen, BYTE * pOutData, int * pOutDataLen);
- /**
- * @brief RSA公钥运算。匿名权限可调用。说明:
- * 1.对于加密运算,输入数据长度必须小于pPubKey中指示的密钥长度除以8再减去11,以便在函数内部进行padding
- * 2.对于解密运算,输入数据长度必须与pPubKey中指示的密钥长度相一致(比如1024位密钥时为128,2048时为256)
- * 3.加密时内部padding方式为:PKCS1_TYPE_2 (即第二个字节为0x02,空数据填充随机数)
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param nFlag [in] 运算类型。例如,FLAG_ENCODE表示加密运算;FLAG_DECODE表示解密运算。
- * @param pPubKey [in] RSA公钥数据。该数据来源于生成RSA公私钥时的公钥数据。
- * @param pInData [in] 输入数据。
- * @param nInDataLen [in] 参数pInData的大小。
- * @param pOutData [out] 输出数据缓冲区。
- * @param pOutDataLen [in,out] 参数pOutData的大小和返回的数据大小。
- *
- * @return DONGLE_SUCCESS RSA公钥运算成功。
- */
- DWORD WINAPI Dongle_RsaPub(DONGLE_HANDLE hDongle, int nFlag, RSA_PUBLIC_KEY * pPubKey, BYTE * pInData, int nInDataLen, BYTE * pOutData, int * pOutDataLen);
- /**
- * @brief 产生ECC公钥和私钥。使用该函数之前需要先创建一个ECC私钥文件。需要开发商权限。成功后注意保存ECC公私钥数据。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param wPriFileID [in] ECC私钥文件ID。
- * @param pPubBakup [out] ECC公钥数据。
- * @param pPriBakup [out] ECC私钥数据。
- *
- * @return DONGLE_SUCCESS 产生ECC公私钥成功。
- */
- DWORD WINAPI Dongle_EccGenPubPriKey(DONGLE_HANDLE hDongle, WORD wPriFileID, ECCSM2_PUBLIC_KEY * pPubBakup, ECCSM2_PRIVATE_KEY * pPriBakup);
- /**
- * @brief ECC私钥签名。函数的使用权限取决于锁内ECC私钥文件的权限,在ECC私钥文件创建时设定。说明:
- * 1.锁内签名算法为: ECDSA_Sign
- * 2.输入的Hash值的长度与ECC私钥的密钥长度有关(如果密钥是192位的,则hash值长度不能超过24(192/8 = 24)字节)
- * (如果密钥是256位的,则hash值长度不能超过32(256/8 = 32)字节)
- * 3.曲线参数为:EC_NIST_PRIME_192及EC_NIST_PRIME_256
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param wPriFileID [in] ECC私钥文件ID。
- * @param pHashData [in] Hash数据。
- * @param nHashDataLen [in] 参数pHashData的大小。
- * @param pOutData [out] 签名数据。大小固定为64字节(256位ECC时是正好,192位ECC时的位会补0)
- *
- * @return DONGLE_SUCCESS 表示签名成功。
- */
- DWORD WINAPI Dongle_EccSign(DONGLE_HANDLE hDongle, WORD wPriFileID, BYTE * pHashData, int nHashDataLen, BYTE * pOutData);
- /**
- * @brief ECC公钥验签。函数的使用权限取决于锁内ECC私钥文件的权限,在ECC私钥文件创建时设定。说明:
- * 1.锁内签名算法为: ECDSA_Verify
- * 2.输入的Hash值的长度与ECC私钥的密钥长度有关(如果密钥是192位的,则hash值长度不能超过24(192/8 = 24)字节)
- * (如果密钥是256位的,则hash值长度不能超过32(256/8 = 32)字节)
- * 3.曲线参数为:EC_NIST_PRIME_192及EC_NIST_PRIME_256
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param pPubKey [in] ECC公钥数据。
- * @param pHashData [in] Hash数据。
- * @param nHashDataLen [in] 参数pHashData的大小。
- * @param pSign [in] 签名数据。大小固定为64字节,为Dongle_EccSign函数返回的pOutData数据。
- *
- * @return DONGLE_SUCCESS 表示验签成功,否则表示验签失败。
- */
- DWORD WINAPI Dongle_EccVerify(DONGLE_HANDLE hDongle, ECCSM2_PUBLIC_KEY * pPubKey, BYTE * pHashData, int nHashDataLen, BYTE * pSign);
- /**
- * @brief 产生SM2公钥和私钥。使用该函数之前需要先创建一个SM2私钥文件。需要开发商权限。成功后注意保存ECC公私钥数据。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param wPriFileID [in] SM2私钥文件ID。
- * @param pPubBakup [out] SM2公钥数据。
- * @param pPriBakup [out] SM2私钥数据。
- *
- * @return DONGLE_SUCCESS 产生ECC公私钥成功。
- */
- DWORD WINAPI Dongle_SM2GenPubPriKey(DONGLE_HANDLE hDongle, WORD wPriFileID, ECCSM2_PUBLIC_KEY * pPubBakup, ECCSM2_PRIVATE_KEY * pPriBakup);
- /**
- * @brief SM2私钥签名。函数的使用权限取决于锁内SM2私钥文件的权限,在SM2私钥文件创建时设定。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param wPriFileID [in] SM2私钥文件ID。
- * @param pHashData [in] Hash数据。
- * @param nHashDataLen [in] 参数pHashData的大小。数据长度必须小于32个字节。
- * @param pOutData [out] 签名数据。大小固定为64字节。
- *
- * @return DONGLE_SUCCESS 表示签名成功。
- */
- DWORD WINAPI Dongle_SM2Sign(DONGLE_HANDLE hDongle, WORD wPriFileID, BYTE * pHashData, int nHashDataLen, BYTE * pOutData);
- /**
- * @brief SM2公钥验签。函数的使用权限取决于锁内SM2私钥文件的权限,在SM2私钥文件创建时设定。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param wPriFileID [in] SM2公钥数据。
- * @param pHashData [in] Hash数据。
- * @param nHashDataLen [in] 参数pHashData的大小。
- * @param pSign [in] 签名数据。大小固定为64字节,为Dongle_EccSign函数返回的pOutData数据。
- *
- * @return DONGLE_SUCCESS 表示验签成功,否则表示验签失败。
- */
- DWORD WINAPI Dongle_SM2Verify(DONGLE_HANDLE hDongle, ECCSM2_PUBLIC_KEY * pPubKey, BYTE * pHashData, int nHashDataLen, BYTE * pSign);
- /**
- * @brief 3DES加解密。解密运算匿名权限即可, 加密运算的权限取决于密钥文件的权限。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param wKeyFileID [in] 密钥文件ID。
- * @param nFlag [in] 运算类型。例如,FLAG_ENCODE表示加密运算;FLAG_DECODE表示解密运算。
- * @param pInData [in] 输入数据缓冲区。
- * @param pOutData [out] 输出数据缓冲区。大小至少要和输入数据缓冲区相同,输入和输出数据缓冲区可以为同一个。
- * @param nDataLen [in] 参数pInData的数据大小。数据长度必须是16的整数倍,允许的最大值是1024。
- *
- * @return DONGLE_SUCCESS 3DES加密或解密运算成功。
- */
- DWORD WINAPI Dongle_TDES(DONGLE_HANDLE hDongle, WORD wKeyFileID, int nFlag, BYTE * pInData, BYTE * pOutData, int nDataLen);
- /**
- * @brief SM4加解密。解密运算匿名权限即可, 加密运算的权限取决于密钥文件的权限。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param wKeyFileID [in] 密钥文件ID。
- * @param nFlag [in] 运算类型。例如,FLAG_ENCODE表示加密运算;FLAG_DECODE表示解密运算。
- * @param pInData [in] 输入数据缓冲区。
- * @param pOutData [out] 输出数据缓冲区。大小至少要和输入数据缓冲区相同,输入和输出数据缓冲区可以为同一个。
- * @param nDataLen [in] 参数pInData的数据大小。数据长度必须是16的整数倍,允许的最大值是1024。
- *
- * @return DONGLE_SUCCESS SM4加密或解密运算成功。
- */
- DWORD WINAPI Dongle_SM4(DONGLE_HANDLE hDongle, WORD wKeyFileID, int nFlag, BYTE * pInData, BYTE * pOutData, int nDataLen);
- /**
- * @brief HASH运算。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param nFlag [in] Hash运算算法类型。
- * nFlag = FLAG_HASH_MD5,表示MD5运算,此时pHash的缓冲区大小为16字节。
- * nFlag = FLAG_HASH_SHA1,表示SHA1运算,此时pHash的缓冲区大小为20字节。
- * nFlag = FLAG_HASH_SM3,表示国密SM3运算,此时pHash的缓冲区大小为32字节。
- * @param pInData [in] 输入数据缓冲区。
- * @param nDataLen [in] 参数pInData的数据大小。SHA1、MD5为锁外运算,长度不限制;SM3为锁内运算,
- * 最大不超过1024字节。
- * @param pHash [out] 输出的Hash值。
- *
- * @return DONGLE_SUCCESS HASH运算成功。
- */
- DWORD WINAPI Dongle_HASH(DONGLE_HANDLE hDongle, int nFlag, BYTE * pInData, int nDataLen, BYTE * pHash);
- /**
- * @brief 种子码算法。匿名权限可使用, 开发商可设置可运算次数。
- * 1.种子码算法与PID有关,空锁(即PID=FFFFFFFF)不能进行种子码运算。
- * 2.如果内部种子码可运算次数不为-1,当其递减到0后此函数将不能使用。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param pSeed [in] 输入的种子码数据。
- * @param nSeedLen [in] 种子码长度。取值范围为1~250字节。
- * @param pOutData [out] 输出数据缓冲区。输出的大小固定为16字节。
- *
- * @return DONGLE_SUCCESS 种子码运算成功。
- */
- DWORD WINAPI Dongle_Seed(DONGLE_HANDLE hDongle, BYTE * pSeed, int nSeedLen, BYTE * pOutData);
- /**
- * @brief 设置种子码算法可运算次数。需要开发商权限。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param nCount [in] 可运算次数。如果此值设置为-1,表示不限制运算次数。
- *
- * @return DONGLE_SUCCESS 设置成功。
- */
- DWORD WINAPI Dongle_LimitSeedCount(DONGLE_HANDLE hDongle, int nCount);
- /**
- * @brief 制作一把母锁。子母锁的方式是是一种可选的初始化锁方式,安全又快速,推荐使用。需要开发商权限。
- * 1.空锁(即PID=FFFFFFFF)不能写入母锁数据。
- * 2.出于安全考虑,MOTHER_DATA中的远程升级私钥不允许和母锁自身的远程升级私钥相同,否则会操作失败。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param pInData [in] 输入数据。用于初始化母锁的结构为MOTHER_DATA的数据。
- *
- * @return DONGLE_SUCCESS 制作母锁成功。
- */
- DWORD WINAPI Dongle_GenMotherKey(DONGLE_HANDLE hDongle, MOTHER_DATA * pInData);
- /**
- * @brief 从空锁获取生产请求。此函数只对PID为FFFFFFFF的空锁有效。需要开发商权限。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param pRequest [out] 输出数据。返回该数据的有效长度为16字节,因此需要至少16字节的空间。
- *
- * @return DONGLE_SUCCESS 获取生产请求数据成功。
- */
- DWORD WINAPI Dongle_RequestInit(DONGLE_HANDLE hDongle, BYTE * pRequest);
- /**
- * @brief 从母锁获取用于初始化子锁的数据,该函数只对母锁有效。匿名权限可使用。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param pRequest [in] 请求数据。通过Dongle_RequestInit获取的请求数据。
- * @param pInitData [out] 输出数据。函数执行成功返回用于初始化子锁的数据。
- * @param pDataLen [int,out] 参数pInitData的有效长度。表示pInitData的缓冲区长度,函数执行成功
- * 返回pInitData的有效长度。
- *
- * @return DONGLE_SUCCESS 从母锁获取生产数据成功。
- */
- DWORD WINAPI Dongle_GetInitDataFromMother(DONGLE_HANDLE hDongle, BYTE * pRequest, BYTE * pInitData, int * pDataLen);
- /*
- * @brief 生产子锁。用子母锁的方式制作子锁,匿名权限即可调用。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param pInitData [in] 输入数据。函数Dongle_GetInitDataFromMother返回的用于初始化子锁的数据。
- * @param nDataLen [in] 参数pInitData数据缓冲区的有效长度。
- *
- * @return DONGLE_SUCCESS 生产子锁成功。
- */
- DWORD WINAPI Dongle_InitSon(DONGLE_HANDLE hDongle, BYTE * pInitData, int nDataLen);
- /**
- * @brief 向锁内设置远程升级私钥。私钥长度为1024的RSA私钥。需要开发商权限。
- * 出于安全考虑,如果锁是母锁的话,远程升级私钥不允许和母锁数据区中的子锁远程升级私钥相同,否则会操作失败。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param pPriKey [in] RSA私钥。
- *
- * @return DONGLE_SUCCESS 设置远程升级私钥成功。
- */
- DWORD WINAPI Dongle_SetUpdatePriKey(DONGLE_HANDLE hDongle, RSA_PRIVATE_KEY * pPriKey);
- /**
- * @brief 制作远程升级数据包。匿名权限即可调用。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param pHID [in] 硬件序列号。如果不需要绑定该参数可以为NULL。
- * @param nFunc [in] 升级包类型。
- * nFunc = UPDATE_FUNC_CreateFile,表示创建文件。
- * nFunc = UPDATE_FUNC_WriteFile,写文件。只有锁内已有的文件才可升级写文件操作。
- * nFunc = UPDATE_FUNC_DeleteFile,删除文件。
- * nFunc = UPDATE_FUNC_FileLic,设置文件授权,不支持可执行文件授权升级。
- * nFunc = UPDATE_FUNC_SeedCount,设置种子码可运算次数。
- * nFunc = UPDATE_FUNC_DownloadExe,升级可执行文件。
- * nFunc = UPDATE_FUNC_UnlockUserPin,解锁用户PIN。出于安全考虑解锁用户PIN码必须绑定HID,
- * 即pHID不能为空,只有这样才能升级成功。升级成功后用户PIN码恢复为"12345678"。
- * nFunc = UPDATE_FUNC_Deadline,时钟锁升级使用期限。
- *
- * @param nFileType [in] 文件类型。升级有关文件操作时的文件类型。其他升级类型该参数无效。
- * @param wFileID [in] 文件ID。升级有关文件操作时的文件ID。其他升级类型该参数无效。
- * 当wFileID=0xFFFF时,表示升级锁内数据区的数据。
- * @param nOffset [in] 偏移量。升级有关文件操作时的文件偏移量。其他升级类型该参数无效。
- * @param pBuffer [in] 输入数据。
- * 当nFunc = UPDATE_FUNC_CreateFile时, pBuffer指向要文件的属性结构,例如KEY_FILE_ATTR。
- * 当nFunc = UPDATE_FUNC_WriteFile时, pBuffer指向要写入的数据。
- * 当nFunc = UPDATE_FUNC_FileLic时, pBuffer指向文件权限的数据结构,例如:DATA_LIC。
- * 当nFunc = UPDATE_FUNC_SeedCount时, pBuffer指向long值,表示种子码可运算次数。
- * 当nFunc = UPDATE_FUNC_DownloadExe时, pBuffer指向EXE_FILE_INFO结构,与Dongle_DownloadExeFile函数用法类似。
- * 当nFunc = UPDATE_FUNC_Deadline时, pBuffer指向DWORD值,表示到期的时间。
- * @param nBufferLen [in] 参数pBuffer的缓冲区大小。
- * @param pUPubKey [in] 制作升级包的RSA公钥。与设置到锁内的远程升级私钥相对应。该值无论何种升级类型都必须填写。
- * @param pOutData [out] 输出数据。制作的升级包数据。
- * @param pOutDataLen [in,out] 参数pOutData输入大小,返回升级包的有效长度。
- *
- * @return DONGLE_SUCCESS 制作升级包成功。
- */
- DWORD WINAPI Dongle_MakeUpdatePacket(DONGLE_HANDLE hDongle, char * pHID, int nFunc, int nFileType, WORD wFileID, int nOffset, BYTE * pBuffer, int nBufferLen, RSA_PUBLIC_KEY * pUPubKey, BYTE * pOutData, int * pOutDataLen);
- /**
- * @brief 制作远程升级数据包。该函数采用母锁方式制作,与Dongle_MakeUpdatePacket相比少了远程升级公钥,其他相同。匿名权限即可调用。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param pHID [in] 硬件序列号。如果不需要绑定该参数可以为NULL。
- * @param nFunc [in] 升级包类型。
- * nFunc = UPDATE_FUNC_CreateFile,表示创建文件。
- * nFunc = UPDATE_FUNC_WriteFile,写文件。只有锁内已有的文件才可升级写文件操作。
- * nFunc = UPDATE_FUNC_DeleteFile,删除文件。
- * nFunc = UPDATE_FUNC_FileLic,设置文件授权,不支持可执行文件授权升级。
- * nFunc = UPDATE_FUNC_SeedCount,设置种子码可运算次数。
- * nFunc = UPDATE_FUNC_DownloadExe,升级可执行文件。
- * nFunc = UPDATE_FUNC_UnlockUserPin,解锁用户PIN。出于安全考虑解锁用户PIN码必须绑定HID,
- * 即pHID不能为空,只有这样才能升级成功。升级成功后用户PIN码恢复为"12345678"。
- * nFunc = UPDATE_FUNC_Deadline,时钟锁升级使用期限。
- *
- * @param nFileType [in] 文件类型。升级有关文件操作时的文件类型。其他升级类型该参数无效。
- * @param wFileID [in] 文件ID。升级有关文件操作时的文件ID。其他升级类型该参数无效。
- * 当wFileID=0xFFFF时,表示升级锁内数据区的数据。
- * @param nOffset [in] 偏移量。升级有关文件操作时的文件偏移量。其他升级类型该参数无效。
- * @param pBuffer [in] 输入数据。
- * 当nFunc = UPDATE_FUNC_CreateFile时, pBuffer指向要文件的属性结构,例如KEY_FILE_ATTR。
- * 当nFunc = UPDATE_FUNC_WriteFile时, pBuffer指向要写入的数据。
- * 当nFunc = UPDATE_FUNC_FileLic时, pBuffer指向文件权限的数据结构,例如:DATA_LIC。
- * 当nFunc = UPDATE_FUNC_SeedCount时, pBuffer指向long值,表示种子码可运算次数。
- * 当nFunc = UPDATE_FUNC_DownloadExe时, pBuffer指向EXE_FILE_INFO结构,与Dongle_DownloadExeFile函数用法类似。
- * 当nFunc = UPDATE_FUNC_Deadline时, pBuffer指向DWORD值,表示到期的时间。
- * @param nBufferLen [in] 参数pBuffer的缓冲区大小。
- * @param pOutData [out] 输出数据。制作的升级包数据。
- * @param pOutDataLen [in,out] 参数pOutData输入大小,返回升级包的有效长度。
- *
- * @return DONGLE_SUCCESS 制作升级包成功。
- */
- DWORD WINAPI Dongle_MakeUpdatePacketFromMother(DONGLE_HANDLE hDongle, char * pHID, int nFunc, int nFileType, WORD wFileID, int nOffset, BYTE * pBuffer, int nBufferLen, BYTE * pOutData, int * pOutDataLen);
- /**
- * @brief 远程升级子锁中的数据。匿名权限即可。升级数据pUpdateData对一把锁只能使用一次。
- * 1.本函数内部是按1024字节的分块机制发送,如遇返回值不是DONGLE_SUCCESS会立即中断发送并返回。
- * 2.如果需要进行流程控制,可由调用方来分块(每块1024字节)发送,并保证数据块的顺序不被打乱,根据返回的错误码来控制流程。
- *
- * @param hDongle [in] 打开的加密锁句柄。
- * @param pUpdateData [in] 输入数据。升级数据,由Dongle_MakeUpdatePacket或者Dongle_MakeUpdatePacketFromMother产生
- * @param nDataLen [in] 参数pUpdateData的大小。必须为1024的整数倍。
- *
- * @return DONGLE_SUCCESS 升级成功。
- */
- DWORD WINAPI Dongle_Update(DONGLE_HANDLE hDongle, BYTE * pUpdateData, int nDataLen);
- //错误码
- #define DONGLE_SUCCESS 0x00000000 // 操作成功
- #define DONGLE_NOT_FOUND 0xF0000001 // 未找到指定的设备
- #define DONGLE_INVALID_HANDLE 0xF0000002 // 无效的句柄
- #define DONGLE_INVALID_PARAMETER 0xF0000003 // 参数错误
- #define DONGLE_COMM_ERROR 0xF0000004 // 通讯错误
- #define DONGLE_INSUFFICIENT_BUFFER 0xF0000005 // 缓冲区空间不足
- #define DONGLE_NOT_INITIALIZED 0xF0000006 // 产品尚未初始化 (即没设置PID)
- #define DONGLE_ALREADY_INITIALIZED 0xF0000007 // 产品已经初始化 (即已设置PID)
- #define DONGLE_ADMINPIN_NOT_CHECK 0xF0000008 // 开发商密码没有验证
- #define DONGLE_USERPIN_NOT_CHECK 0xF0000009 // 用户密码没有验证
- #define DONGLE_INCORRECT_PIN 0xF000FF00 // 密码不正确 (后2位指示剩余次数)
- #define DONGLE_PIN_BLOCKED 0xF000000A // PIN码已锁死
- #define DONGLE_ACCESS_DENIED 0xF000000B // 访问被拒绝
- #define DONGLE_FILE_EXIST 0xF000000E // 文件已存在
- #define DONGLE_FILE_NOT_FOUND 0xF000000F // 未找到指定的文件
- #define DONGLE_READ_ERROR 0xF0000010 // 读取数据错误
- #define DONGLE_WRITE_ERROR 0xF0000011 // 写入数据错误
- #define DONGLE_FILE_CREATE_ERROR 0xF0000012 // 创建文件错误
- #define DONGLE_FILE_READ_ERROR 0xF0000013 // 读取文件错误
- #define DONGLE_FILE_WRITE_ERROR 0xF0000014 // 写入文件错误
- #define DONGLE_FILE_DEL_ERROR 0xF0000015 // 删除文件错误
- #define DONGLE_FAILED 0xF0000016 // 操作失败
- #define DONGLE_CLOCK_EXPIRE 0xF0000017 // 加密锁时钟到期
- #define DONGLE_ERROR_UNKNOWN 0xFFFFFFFF // 未知的错误
- #ifdef __cplusplus
- }
- #endif
- #endif
|