Dongle_API.h 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988
  1. /*
  2. ARM 加密锁 API 接口库
  3. */
  4. #ifndef __DONGLE_HEADER_H
  5. #define __DONGLE_HEADER_H
  6. #include "winscard.h"
  7. #pragma comment (lib, "winscard.lib")
  8. #ifdef __cplusplus
  9. extern "C" {
  10. #endif
  11. #ifndef IN
  12. #define IN
  13. #endif
  14. #ifndef OUT
  15. #define OUT
  16. #endif
  17. /************************************************************************/
  18. /* 定义 */
  19. /************************************************************************/
  20. //加密锁句柄定义
  21. typedef void * DONGLE_HANDLE;
  22. //默认的PIN码重试次数为无限制
  23. //根据种子码初始化锁时会同时初始化PID和ADMINPIN (PID不可更改, ADMINPIN可更改)
  24. #define CONST_PID 0xFFFFFFFF //出厂时默认的PID
  25. #define CONST_USERPIN "12345678" //出厂时默认的USERPIN
  26. #define CONST_ADMINPIN "FFFFFFFFFFFFFFFF" //出厂时默认的ADMINPIN
  27. //通讯协议类型定义
  28. #define PROTOCOL_HID 0 //hid协议
  29. #define PROTOCOL_CCID 1 //ccid协议
  30. //文件类型定义
  31. #define FILE_DATA 1 //普通数据文件
  32. #define FILE_PRIKEY_RSA 2 //RSA私钥文件
  33. #define FILE_PRIKEY_ECCSM2 3 //ECC或者SM2私钥文件(SM2私钥文件和ECC私钥文件结构相同,属相同文件类型)
  34. #define FILE_KEY 4 //SM4和3DES密钥文件
  35. #define FILE_EXE 5 //可执行文件
  36. //LED灯状态定义
  37. #define LED_OFF 0 //灯灭
  38. #define LED_ON 1 //灯亮
  39. #define LED_BLINK 2 //灯闪
  40. //PIN码类型
  41. #define FLAG_USERPIN 0 //用户PIN
  42. #define FLAG_ADMINPIN 1 //开发商PIN
  43. //加解密标志
  44. #define FLAG_ENCODE 0 //加密
  45. #define FLAG_DECODE 1 //解密
  46. //HASH算法类型
  47. #define FLAG_HASH_MD5 0 //MD5 运算结果16字节
  48. #define FLAG_HASH_SHA1 1 //SHA1 运算结果20字节
  49. #define FLAG_HASH_SM3 2 //SM3 运算结果32字节
  50. //远程升级的功能号
  51. #define UPDATE_FUNC_CreateFile 1 //创建文件
  52. #define UPDATE_FUNC_WriteFile 2 //写文件
  53. #define UPDATE_FUNC_DeleteFile 3 //删除文件
  54. #define UPDATE_FUNC_FileLic 4 //设置文件授权
  55. #define UPDATE_FUNC_SeedCount 5 //设置种子码可运算次数
  56. #define UPDATE_FUNC_DownloadExe 6 //升级可执行文件
  57. #define UPDATE_FUNC_UnlockUserPin 7 //解锁用户PIN
  58. #define UPDATE_FUNC_Deadline 8 //时钟锁升级使用期限
  59. /************************************************************************/
  60. /* 结构 */
  61. /************************************************************************/
  62. //RSA公钥格式(兼容1024,2048)
  63. typedef struct {
  64. unsigned int bits; // length in bits of modulus
  65. unsigned int modulus; // modulus
  66. unsigned char exponent[256]; // public exponent
  67. } RSA_PUBLIC_KEY;
  68. //RSA私钥格式(兼容1024,2048)
  69. typedef struct {
  70. unsigned int bits; // length in bits of modulus
  71. unsigned int modulus; // modulus
  72. unsigned char publicExponent[256]; // public exponent
  73. unsigned char exponent[256]; // private exponent
  74. } RSA_PRIVATE_KEY;
  75. //外部ECCSM2公钥格式 ECC(支持bits为192或256)和SM2的(bits为固定值0x8100)公钥格式
  76. typedef struct{
  77. unsigned int bits; // length in bits of modulus
  78. unsigned int XCoordinate[8]; // 曲线上点的X坐标
  79. unsigned int YCoordinate[8]; // 曲线上点的Y坐标
  80. } ECCSM2_PUBLIC_KEY;
  81. //外部ECCSM2私钥格式 ECC(支持bits为192或256)和SM2的(bits为固定值0x8100)私钥格式
  82. typedef struct{
  83. unsigned int bits; // length in bits of modulus
  84. unsigned int PrivateKey[8]; // 私钥
  85. } ECCSM2_PRIVATE_KEY;
  86. //加密锁信息
  87. typedef struct
  88. {
  89. unsigned short m_Ver; //COS版本,比如:0x0201,表示2.01版
  90. unsigned short m_Type; //产品类型: 0xFF表示标准版, 0x00为标准时钟锁,0x02为标准U盘锁
  91. unsigned char m_BirthDay[8]; //出厂日期
  92. unsigned long m_Agent; //代理商编号,比如:默认的0xFFFFFFFF
  93. unsigned long m_PID; //产品ID
  94. unsigned long m_UserID; //用户ID
  95. unsigned char m_HID[8]; //8字节的硬件ID
  96. unsigned long m_IsMother; //母锁标志: 0x01表示是母锁, 0x00表示不是母锁
  97. unsigned long m_DevType; //设备类型(PROTOCOL_HID或者PROTOCOL_CCID)
  98. } DONGLE_INFO;
  99. /**
  100. * 锁内文件说明
  101. * 1.RSA私钥文件允许创建的最大数量为8个
  102. * 2.ECCSM2私钥文件允许创建的最大数量为16个
  103. * 3.3DES/SM4密钥文件允许创建的最大数量为32个
  104. * 4.可执行文件允许创建的最大数量为64个,总大小不能超过64K
  105. * 5.数据文件创建个数受锁内空间大小和文件系统其他因素的影响,最大个数不超过54个。
  106. * 6.文件ID取值范围为0x0000~0xFFFF之间,其中ID:0x0000、0xFFFF、0x3F00被锁内系统占用,用户不能使用。
  107. */
  108. /*************************文件授权结构***********************************/
  109. //数据文件授权结构
  110. typedef struct
  111. {
  112. unsigned short m_Read_Priv; //读权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
  113. unsigned short m_Write_Priv; //写权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
  114. } DATA_LIC;
  115. //私钥文件授权结构
  116. typedef struct
  117. {
  118. long m_Count; //可调次数: 0xFFFFFFFF表示不限制, 递减到0表示已不可调用
  119. unsigned char m_Priv; //调用权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
  120. unsigned char m_IsDecOnRAM; //是否是在内存中递减: 1为在内存中递减,0为在FLASH中递减
  121. unsigned char m_IsReset; //用户态调用后是否自动回到匿名态: TRUE为调后回到匿名态 (开发商态不受此限制)
  122. unsigned char m_Reserve; //保留,用于4字节对齐
  123. } PRIKEY_LIC;
  124. //对称加密算法(SM4/TDES)密钥文件授权结构
  125. typedef struct
  126. {
  127. unsigned long m_Priv_Enc; //加密时的调用权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
  128. } KEY_LIC;
  129. //可执行文件授权结构
  130. typedef struct
  131. {
  132. unsigned short m_Priv_Exe; //运行的权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
  133. } EXE_LIC;
  134. /****************************文件属性结构********************************/
  135. //数据文件属性数据结构
  136. typedef struct
  137. {
  138. unsigned long m_Size; //数据文件长度,该值最大为4096
  139. DATA_LIC m_Lic; //授权
  140. } DATA_FILE_ATTR;
  141. //ECCSM2/RSA私钥文件属性数据结构
  142. typedef struct
  143. {
  144. unsigned short m_Type; //数据类型:ECCSM2私钥 或 RSA私钥
  145. unsigned short m_Size; //数据长度:RSA该值为1024或2048, ECC该值为192或256, SM2该值为0x8100
  146. PRIKEY_LIC m_Lic; //授权
  147. } PRIKEY_FILE_ATTR;
  148. //对称加密算法(SM4/TDES)密钥文件属性数据结构
  149. typedef struct
  150. {
  151. unsigned long m_Size; //密钥数据长度=16
  152. KEY_LIC m_Lic; //授权
  153. } KEY_FILE_ATTR;
  154. //可执行文件属性数据结构
  155. typedef struct
  156. {
  157. EXE_LIC m_Lic; //授权
  158. unsigned short m_Len; //文件长度
  159. } EXE_FILE_ATTR;
  160. /*************************文件列表结构***********************************/
  161. //获取私钥文件列表时返回的数据结构
  162. typedef struct
  163. {
  164. unsigned short m_FILEID; //文件ID
  165. unsigned short m_Reserve; //保留,用于4字节对齐
  166. PRIKEY_FILE_ATTR m_attr; //文件属性
  167. }PRIKEY_FILE_LIST;
  168. //获取SM4及TDES密钥文件列表时返回的数据结构
  169. typedef struct
  170. {
  171. unsigned short m_FILEID; //文件ID
  172. unsigned short m_Reserve; //保留,用于4字节对齐
  173. KEY_FILE_ATTR m_attr; //文件属性
  174. }KEY_FILE_LIST;
  175. //获取数据文件列表时返回的数据结构
  176. typedef struct
  177. {
  178. unsigned short m_FILEID; //文件ID
  179. unsigned short m_Reserve; //保留,用于4字节对齐
  180. DATA_FILE_ATTR m_attr; //文件属性
  181. }DATA_FILE_LIST;
  182. //获取可执行文件列表时返回的数据结构
  183. typedef struct
  184. {
  185. unsigned short m_FILEID; //文件ID
  186. EXE_FILE_ATTR m_attr;
  187. unsigned short m_Reserve; //保留,用于4字节对齐
  188. }EXE_FILE_LIST;
  189. //下载和列可执行文件时填充的数据结构
  190. typedef struct
  191. {
  192. unsigned short m_dwSize; //可执行文件大小
  193. unsigned short m_wFileID; //可执行文件ID
  194. unsigned char m_Priv; //调用权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
  195. unsigned char *m_pData; //可执行文件数据
  196. }EXE_FILE_INFO;
  197. //需要发给空锁的初始化数据
  198. typedef struct
  199. {
  200. int m_SeedLen; //种子码长度
  201. BYTE m_SeedForPID[256]; //产生产品ID和开发商密码的种子码 (最长250个字节)
  202. char m_UserPIN[18]; //用户密码(16个字符的0终止字符串)
  203. BYTE m_UserTryCount; //用户密码允许的最大错误重试次数
  204. BYTE m_AdminTryCount; //开发商密码允许的最大错误重试次数
  205. RSA_PRIVATE_KEY m_UpdatePriKey; //远程升级私钥
  206. DWORD m_UserID_Start; //起始用户ID
  207. } SON_DATA;
  208. //母锁数据
  209. typedef struct
  210. {
  211. SON_DATA m_Son; //子锁初始化数据
  212. long m_Count; //可产生子锁初始化数据的次数 (-1表示不限制次数, 递减到0时会受限)
  213. } MOTHER_DATA;
  214. /**************************************************************************/
  215. /* API */
  216. /**************************************************************************/
  217. /**
  218. * @brief 枚举加密锁。本函数最多会枚举出32个hid设备和32个ccid设备。
  219. *
  220. * @param pDongleInfo [out] 设备信息的数组。当此参数为NULL时, pCount返回找到的设备的数目。
  221. * @param pCount [out] 设备数目。该函数最多可以同时枚举出32个HID设备和32个CCID设备。
  222. *
  223. * @return DONGLE_SUCCESS 执行成功。
  224. */
  225. DWORD WINAPI Dongle_Enum(DONGLE_INFO * pDongleInfo, int * pCount);
  226. /**
  227. * @brief 打开指定的加密锁。
  228. *
  229. * @param phDongle [out] 句柄指针。如果打开成功,会被填充。
  230. * @param nIndex [in] 基于0的索引值。指示打开找到的第几把加密锁。
  231. *
  232. * @return DONGLE_SUCCESS 打开成功。
  233. */
  234. DWORD WINAPI Dongle_Open(DONGLE_HANDLE * phDongle, int nIndex);
  235. /**
  236. * @brief 清除PIN码验证状态。将加密锁状态变为匿名。
  237. *
  238. * @param hDongle [in] 打开的加密锁句柄。
  239. *
  240. * @return DONGLE_SUCCESS 执行成功。
  241. */
  242. DWORD WINAPI Dongle_ResetState(DONGLE_HANDLE hDongle);
  243. /**
  244. * @brief 关闭打开的加密锁。
  245. *
  246. * @param hDongle [in] 打开的加密锁句柄。
  247. *
  248. * @return DONGLE_SUCCESS 关闭成功。
  249. */
  250. DWORD WINAPI Dongle_Close(DONGLE_HANDLE hDongle);
  251. /**
  252. * @brief 产生随机数。匿名权限即可操作。
  253. *
  254. * @param hDongle [in] 打开的加密锁句柄。
  255. * @param nLen [in] 要产生的随机数的长度。nLen的取值范围为 1~128。
  256. * @param pRandom [out] 随机数缓冲区。
  257. *
  258. * @return DONGLE_SUCCESS 获取随机数成功。
  259. */
  260. DWORD WINAPI Dongle_GenRandom(DONGLE_HANDLE hDongle, int nLen, BYTE * pRandom);
  261. /**
  262. * @brief LED灯的控制操作。匿名权限即可操作。
  263. *
  264. * @param hDongle [in] 打开的加密锁句柄。
  265. * @param nFlag [in] 控制类型。例如:nFlag = LED_ON,表示控制LED为亮的状态;
  266. * nFlag = LED_OFF,表示控制LED为灭的状态;nFlag = LED_BLINK,
  267. * 表示控制LED为闪烁的状态。
  268. *
  269. * @return DONGLE_SUCCESS 命令执行成功。
  270. */
  271. DWORD WINAPI Dongle_LEDControl(DONGLE_HANDLE hDongle, int nFlag);
  272. /**
  273. * @brief 切换通讯协议。调用执行成功后加密锁会自动重启,打开的句柄hDongle会无效,接下来执行关闭操作会返回
  274. * 0xF0000002的错误码,这属正常。如需继续操作,请重新枚举并打开锁。该操作必须要验证开发商PIN码之
  275. * 后方可使用。
  276. *
  277. * @param hDongle [in] 打开的加密锁句柄。
  278. * @param nFlag [in] 协议类型。例如:nFlag值为PROTOCOL_HID,表示将加密锁切换为HID设备;
  279. * nFlag值为PROTOCOL_CCID,表示将加密锁切换为CCID设备
  280. *
  281. * @return DONGLE_SUCCESS 执行成功。
  282. */
  283. DWORD WINAPI Dongle_SwitchProtocol(DONGLE_HANDLE hDongle, int nFlag);
  284. /**
  285. * @brief 一键恢复。即返回出厂状态,加密锁的PID、用户PIN码、开发商PIN码等,全部恢复到出厂状态所有写入的
  286. * 数据都将被清空。另外,调用执行成功后加密锁会自动重启,打开的句柄hDongle会无效,接下来执行关闭操
  287. * 做会返回0xF0000002的错误码,这属正常。如需继续操作,请重新枚举并打开锁。该操作需要开发商权限。
  288. *
  289. * @param hDongle [in] 打开的加密锁句柄。
  290. *
  291. * @return DONGLE_SUCCESS 执行成功。
  292. */
  293. DWORD WINAPI Dongle_RFS(DONGLE_HANDLE hDongle);
  294. /**
  295. * @brief 创建文件。该函数不支持可执行文件的创建。该操作需要开发商权限。
  296. *
  297. * @param hDongle [in] 打开的加密锁句柄。
  298. * @param nFileType [in] 文件类型。
  299. * nFileType = FILE_DATA,表示创建数据文件;对数据文件有以下说明:
  300. * 1.文件大小设为252字节时,最多可创建54个文件,即占用空间13608字节
  301. * 2.文件大小设为1024字节时,最多可创建31个文件,即占用空间31744字节
  302. * 3.文件大小设为4096字节时,最多可创建9个文件,即占用空间36864字节
  303. * nFileType = FILE_PRIKEY_RSA,表示创建RSA私钥文件;
  304. * nFileType = FILE_PRIKEY_ECCSM2,表示创建ECCSM2私钥文件;
  305. * nFileType = FILE_KEY,表示创建SM4和3DES密钥文件;
  306. * 不支持nFileType = FILE_EXE的文件类型。
  307. * @param wFileID [in] 文件ID。
  308. * @param pFileAttr [in] 文件的属性。参数的结构为:DATA_FILE_ATTR、PRIKEY_FILE_ATTR或KEY_FILE_ATTR。
  309. *
  310. * @return DONGLE_SUCCESS 创建文件成功。
  311. */
  312. DWORD WINAPI Dongle_CreateFile(DONGLE_HANDLE hDongle, int nFileType, WORD wFileID, void * pFileAttr);
  313. /**
  314. * @brief 写文件。该函数不支持可执行文件的写入操作,且该操作需要开发商权限。
  315. *
  316. * @param hDongle [in] 打开的加密锁句柄。
  317. * @param nFileType [in] 文件类型。例如,
  318. * nFileType = FILE_DATA,表示创建数据文件;
  319. * nFileType = FILE_PRIKEY_RSA,表示创建RSA私钥文件;
  320. * nFileType = FILE_PRIKEY_ECCSM2,表示创建ECCSM2私钥文件;
  321. * nFileType = FILE_KEY,表示创建SM4和3DES密钥文件;
  322. * 不支持nFileType = FILE_EXE的文件类型。
  323. * @param wFileID [in] 文件ID。
  324. * @param wOffset [in] 文件偏移。文件写入的起始偏移量。
  325. * @param pInData [in] 准备写入的数据。
  326. * @param nDataLen [in] 参数pInData的大小。
  327. *
  328. * @return DONGLE_SUCCESS 写入文件成功。
  329. */
  330. DWORD WINAPI Dongle_WriteFile(DONGLE_HANDLE hDongle, int nFileType, WORD wFileID, WORD wOffset, BYTE * pInData, int nDataLen);
  331. /**
  332. * @brief 读取加密锁内的数据文件。数据文件的读取权限取决于创建时的设定。
  333. *
  334. * @param hDongle [in] 打开的加密锁句柄。
  335. * @param wFileID [in] 文件ID。
  336. * @param wOffset [in] 文件偏移量。
  337. * @param pOutData [in] 数据缓冲区。
  338. * @param nDataLen [out] 参数pOutData的长度。
  339. *
  340. * @return DONGLE_SUCCESS 读取数据文件成功
  341. */
  342. DWORD WINAPI Dongle_ReadFile(DONGLE_HANDLE hDongle, WORD wFileID, WORD wOffset, BYTE * pOutData, int nDataLen);
  343. /**
  344. * @brief 批量下载可执行文件。锁内可执行文件的数量不能超过64个,可执行文件的总大小不能超过64K,
  345. * 该操作需要验证管理员权限
  346. *
  347. * @param hDongle [in] 打开的加密锁句柄。
  348. * @param pExeFileInfo [in] 可执行文件信息的数组。
  349. * @param nCount [in] 即可执行文件的数量。
  350. *
  351. * @return DONGLE_SUCCESS 批量下载可执行文件成功。
  352. */
  353. DWORD WINAPI Dongle_DownloadExeFile(DONGLE_HANDLE hDongle, EXE_FILE_INFO * pExeFileInfo, int nCount);
  354. /**
  355. * @brief 运行指定的锁内可执行程序。运行可执行文件的权限,取决于批量下载时,每个可执行文件的设置,
  356. * 即,EXE_FILE_INFO中的m_Priv参数。输入输出数据的最大长度不能超过1024字节,输入输出数据缓
  357. * 冲区pInOutBuf对应锁内的InOutBuf。
  358. *
  359. * @param hDongle [in] 打开的加密锁句柄。
  360. * @param wFileID [in] 可执行文件的文件ID。
  361. * @param pInOutBuf [in,out] 输入输出数据缓冲区。
  362. * @param wInOutBufLen [in] 输入输出数据缓冲区pInOutBuf的大小。
  363. * @param pMainRet [out] 锁内可执行程序main函数的返回值,可以为NULL。
  364. *
  365. * @return DONGLE_SUCCESS 运行指定的可执行文件成功。
  366. */
  367. DWORD WINAPI Dongle_RunExeFile(DONGLE_HANDLE hDongle, WORD wFileID, BYTE * pInOutBuf, WORD wInOutBufLen, int * pMainRet);
  368. /**
  369. * @brief 删除文件。需要开发商权限。
  370. *
  371. * @param hDongle [in] 打开的加密锁句柄。
  372. * @param nFileType [in] 文件类型。
  373. * @param wFileID [in] 文件ID。
  374. *
  375. * @return DONGLE_SUCCESS 删除文件成功
  376. */
  377. DWORD WINAPI Dongle_DeleteFile(DONGLE_HANDLE hDongle, int nFileType, WORD wFileID);
  378. /**
  379. * @brief 列文件。需要开发商权限。
  380. *
  381. * @param hDongle [in] 打开的加密锁句柄。
  382. * @param nFileType [in] 指示文件类型。例如,FILE_DATA等。
  383. * @param pFileList [in] pList:输出文件的列表 (此参数为NULL时, pLen中返回所需的缓冲区长度)
  384. * 当nFileType = FILE_DATA时, pFileList指向DATA_FILE_LIST结构;
  385. * 当nFileType = FILE_PRIKEY_RSA时, pFileList指向PRIKEY_FILE_LIST结构;
  386. * 当nFileType = FILE_PRIKEY_ECCSM2时, pFileList指向PRIKEY_FILE_LIST结构
  387. * 当nFileType = FILE_KEY时, pFileList指向KEY_FILE_LIST结构;
  388. * 当nFileType = FILE_EXE时, pFileList指向EXE_FILE_LIST结构。
  389. * @param pDataLen [in,out] 参数pFileList的输入长度,执行成功返回pFileList的字节长度。
  390. *
  391. * @return DONGLE_SUCCESS 列文件成功。
  392. */
  393. DWORD WINAPI Dongle_ListFile(DONGLE_HANDLE hDongle, int nFileType, void* pFileList, int * pDataLen);
  394. /**
  395. * @brief 唯一化锁。输入种子码产生PID和开发商PIN码,需要开发商权限,执行成功后加密锁自动回到匿名态。
  396. * 产生开发商PIN码的目的是为了使密码肯定不是弱密码,产生的开发商PIN可以借助Dongle_ChangePIN
  397. * 进行更改。另外,种子码一定要牢记,否则任何人永远无法得知开发商PIN码。
  398. *
  399. * @param hDongle [in] 打开的加密锁句柄。
  400. * @param nSeedLen [in] 参数pSeed的缓冲区长度。
  401. * @param pSeed [in] 种子码的缓冲区。
  402. * @param pPIDStr [out] 函数执行成功返回PID。该缓冲区大小至少应该为8字节,返回一个
  403. * 8字节的以0终止的ansi字符串。
  404. * @param pAdminPINstr [out] 函数执行成功返回开发商PIN码。该缓冲区大小至少应该为16字节,
  405. * 返回字符串长度为16字节的以0终止的ansi字符串。
  406. *
  407. * @return DONGLE_SUCCESS 唯一化锁成功。
  408. */
  409. DWORD WINAPI Dongle_GenUniqueKey(DONGLE_HANDLE hDongle,int nSeedLen, BYTE * pSeed, char * pPIDstr, char * pAdminPINstr);
  410. /**
  411. * @brief 校验密码
  412. *
  413. * @param hDongle [in] 打开的加密锁句柄。
  414. * @param nFlags [in] PIN码类型。参数取值为FLAG_USERPIN或者FLAG_ADMINPIN。
  415. * @param pPIN [in] PIN码,0终止的ansi字符串。
  416. * @param pRemainCount [out] 剩余重试次数。返回0表示已锁死;1~253表示剩余次数;255表示不限制重试次数。
  417. *
  418. * @return DONGLE_SUCCESS 校验成功。如果校验失败,函数的返回值中也含有剩余的重试次数,
  419. * (错误码 & 0xFFFFFF00) == DONGLE_INCORRECT_PIN,即后两位表示剩余次数。
  420. */
  421. DWORD WINAPI Dongle_VerifyPIN(DONGLE_HANDLE hDongle, int nFlags, char * pPIN, int * pRemainCount);
  422. /**
  423. * @brief 更改密码
  424. *
  425. * @param hDongle [in] 打开的加密锁句柄。
  426. * @param nFlags [in] PIN码类型。参数取值为FLAG_USERPIN或者FLAG_ADMINPIN。
  427. * @param pOldPIN [in] 旧的PIN码缓冲区。必须是一个字符串长度为16字节的0终止的ansi字符串,且可以是中文。
  428. * @param pNewPIN [in] 新的PIN码缓冲区。必须是一个字符串长度为16字节的0终止的ansi字符串。
  429. * @param nTryCount [in] 重试次数。该参数的取值范围为1~255,其中255表示不限制重试次数。
  430. *
  431. * @return DONGLE_SUCCESS 修改密码成功。
  432. */
  433. DWORD WINAPI Dongle_ChangePIN(DONGLE_HANDLE hDongle, int nFlags, char * pOldPIN, char * pNewPIN, int nTryCount);
  434. /**
  435. * @brief 重置用户PIN码。空锁(即PID=FFFFFFFF)不能重置密码。执行成功后用户密码恢复为出厂默认 CONST_USERPIN
  436. *
  437. * @param hDongle [in] 打开的加密锁句柄。
  438. * @param pAdminPIN [in] 开发商PIN码缓冲区。长度为16字节的0终止的ansi字符串
  439. *
  440. * @return DONGLE_SUCCESS 重置用户PIN码成功。
  441. */
  442. DWORD WINAPI Dongle_ResetUserPIN(DONGLE_HANDLE hDongle, char * pAdminPIN);
  443. /**
  444. * @brief 设置用户ID。需要开发商权限。
  445. *
  446. * @param hDongle [in] 打开的加密锁句柄。
  447. * @param dwUserID [in] 用户ID。
  448. *
  449. * @return DONGLE_SUCCESS 重置用户PIN码成功。
  450. */
  451. DWORD WINAPI Dongle_SetUserID(DONGLE_HANDLE hDongle, DWORD dwUserID);
  452. /**
  453. * @brief 获取加密锁到期时间。匿名权限获取。
  454. *
  455. * @param hDongle [in] 打开的加密锁句柄。
  456. * @param pdwTime [out] 获取的到期UTC时间值。
  457. * 若*pdwTime = 0XFFFFFFFF,表示不限制到期时间
  458. * 若(*pdwTime & 0XFFFF0000) == 0,值表示还剩余几小时
  459. * 若(*pdwTime & 0XFFFF0000) != 0,值表示到期的UTC的时间,可以通过gmtime等将该值进行转换。
  460. *
  461. * @return DONGLE_SUCCESS 获取加密锁到期时间成功。
  462. */
  463. DWORD WINAPI Dongle_GetDeadline(DONGLE_HANDLE hDongle, DWORD * pdwTime);
  464. /**
  465. * @brief 设置加密锁的到期时间。该操作需要管理员权限。
  466. *
  467. * @param hDongle [in] 打开的加密锁句柄。
  468. * @param dwTime [in] 时间值。说明:
  469. * 1.设置可用小时数,范围在1~65535,例如dwTime = 24。这种情况在校验了用户PIN码后开始计时。
  470. * 2.设置到期的年与日时分秒。可通过函数time或者mktime 取得即时的utc时间值(utc值都大于65535);
  471. * 3.取消到期时间限制,此时dwTime的值只能为0xFFFFFFFF。
  472. *
  473. * @return DONGLE_SUCCESS 设置加密锁到期时间成功。
  474. */
  475. DWORD WINAPI Dongle_SetDeadline(DONGLE_HANDLE hDongle, DWORD dwTime);
  476. /**
  477. * @brief 获取加密锁的UTC时间。
  478. *
  479. * @param hDongle [in] 打开的加密锁句柄。
  480. * @param pdwUTCTime [out] UTC时间值指针。
  481. *
  482. * @return DONGLE_SUCCESS 设置加密锁到期时间成功。
  483. */
  484. DWORD WINAPI Dongle_GetUTCTime(DONGLE_HANDLE hDongle, DWORD * pdwUTCTime);
  485. /**
  486. * @brief 读取锁内数据区数据。数据区大小共8k,前4k(0~4095)的读写没有权限限制,后4k(4096~8191)任意权限可读,
  487. * 但是只有开发商权限可写。
  488. *
  489. * @param hDongle [in] 打开的加密锁句柄。
  490. * @param nOffset [in] 起始偏移。范围在0~8191
  491. * @param pData [out] 读取的数据缓冲区。
  492. * @param nDataLen [in] 参数pData的缓冲区大小。
  493. *
  494. * @return DONGLE_SUCCESS 读取数据区数据成功。
  495. */
  496. DWORD WINAPI Dongle_ReadData(DONGLE_HANDLE hDongle, int nOffset, BYTE* pData, int nDataLen);
  497. /**
  498. * @brief 写入锁内数据区数据。数据区大小共8k,前4k(0~4095)的读写没有权限限制,后4k(4096~8191)任意权限可读,
  499. * 但是只有开发商权限可写。
  500. *
  501. * @param hDongle [in] 打开的加密锁句柄。
  502. * @param nOffset [in] 起始偏移。范围在0~8191
  503. * @param pData [in] 写入的数据缓冲区。
  504. * @param nDataLen [in] 参数pData的缓冲区大小。
  505. *
  506. * @return DONGLE_SUCCESS 写入数据区数据成功。
  507. */
  508. DWORD WINAPI Dongle_WriteData(DONGLE_HANDLE hDongle, int nOffset, BYTE * pData, int nDataLen);
  509. /**
  510. * @brief 获取共享内存数据。共享内存总大小为32字节。没有权限限制,掉电后数据自动擦除。
  511. *
  512. * @param hDongle [in] 打开的加密锁句柄。
  513. * @param pData [out] 输出的数据。输出共享内存的数据,固定为32个字节。
  514. *
  515. * @return DONGLE_SUCCESS 获取共享内存数据成功。
  516. */
  517. DWORD WINAPI Dongle_ReadShareMemory(DONGLE_HANDLE hDongle, BYTE * pData);
  518. /**
  519. * @brief 设置共享内存数据。没有权限限制,掉电后数据自动擦除。
  520. *
  521. * @param hDongle [in] 打开的加密锁句柄。
  522. * @param pData [in] 输入数据。
  523. * @param nDataLen [in] 参数pData的缓冲区大小。长度不能超过32。
  524. *
  525. * @return DONGLE_SUCCESS 设置共享内存数据成功。
  526. */
  527. DWORD WINAPI Dongle_WriteShareMemory(DONGLE_HANDLE hDongle, BYTE * pData, int nDataLen);
  528. /**
  529. * @brief 产生RSA公钥和私钥。使用该函数之前需要先创建一个RSA私钥文件。需要开发商权限。成功后注意保存RSA公私钥数据。
  530. *
  531. * @param hDongle [in] 打开的加密锁句柄。
  532. * @param wPriFileID [in] RSA私钥文件ID。
  533. * @param pPubBakup [out] RSA公钥数据。
  534. * @param pPriBakup [out] RSA私钥数据。
  535. *
  536. * @return DONGLE_SUCCESS 产生RSA公私钥成功。
  537. */
  538. DWORD WINAPI Dongle_RsaGenPubPriKey(DONGLE_HANDLE hDongle, WORD wPriFileID, RSA_PUBLIC_KEY * pPubBakup, RSA_PRIVATE_KEY * pPriBakup);
  539. /**
  540. * @brief RSA私钥运算。函数的使用权限取决于锁内RSA私钥文件的权限,在RSA私钥文件创建时设定。说明:
  541. * 1.对于加密运算,输入数据长度必须小于私钥ID为wPriFileID的密钥长度除以8再减去11,以便在函数内部进行padding
  542. * 2.对于解密运算,输入数据长度必须与wPriFileID中指示的密钥长度相一致(比如1024位密钥时为128,2048时为256)
  543. * 3.加密时内部padding方式为:PKCS1_TYPE_1 (即第二个字节为0x01,空数据填充0XFF)
  544. *
  545. * @param hDongle [in] 打开的加密锁句柄。
  546. * @param wPriFileID [in] RSA私钥文件ID。
  547. * @param nFlag [in] 运算类型。例如,FLAG_ENCODE表示加密运算;FLAG_DECODE表示解密运算。
  548. * @param pInData [in] 输入数据。
  549. * @param nInDataLen [in] 参数pInData的大小
  550. * @param pOutData [out] 输出数据缓冲区。
  551. * @param pOutDataLen [in,out] 参数pOutData的大小和返回的数据大小。
  552. *
  553. * @return DONGLE_SUCCESS RSA私钥运算成功。
  554. */
  555. DWORD WINAPI Dongle_RsaPri(DONGLE_HANDLE hDongle, WORD wPriFileID, int nFlag, BYTE * pInData, int nInDataLen, BYTE * pOutData, int * pOutDataLen);
  556. /**
  557. * @brief RSA公钥运算。匿名权限可调用。说明:
  558. * 1.对于加密运算,输入数据长度必须小于pPubKey中指示的密钥长度除以8再减去11,以便在函数内部进行padding
  559. * 2.对于解密运算,输入数据长度必须与pPubKey中指示的密钥长度相一致(比如1024位密钥时为128,2048时为256)
  560. * 3.加密时内部padding方式为:PKCS1_TYPE_2 (即第二个字节为0x02,空数据填充随机数)
  561. *
  562. * @param hDongle [in] 打开的加密锁句柄。
  563. * @param nFlag [in] 运算类型。例如,FLAG_ENCODE表示加密运算;FLAG_DECODE表示解密运算。
  564. * @param pPubKey [in] RSA公钥数据。该数据来源于生成RSA公私钥时的公钥数据。
  565. * @param pInData [in] 输入数据。
  566. * @param nInDataLen [in] 参数pInData的大小。
  567. * @param pOutData [out] 输出数据缓冲区。
  568. * @param pOutDataLen [in,out] 参数pOutData的大小和返回的数据大小。
  569. *
  570. * @return DONGLE_SUCCESS RSA公钥运算成功。
  571. */
  572. DWORD WINAPI Dongle_RsaPub(DONGLE_HANDLE hDongle, int nFlag, RSA_PUBLIC_KEY * pPubKey, BYTE * pInData, int nInDataLen, BYTE * pOutData, int * pOutDataLen);
  573. /**
  574. * @brief 产生ECC公钥和私钥。使用该函数之前需要先创建一个ECC私钥文件。需要开发商权限。成功后注意保存ECC公私钥数据。
  575. *
  576. * @param hDongle [in] 打开的加密锁句柄。
  577. * @param wPriFileID [in] ECC私钥文件ID。
  578. * @param pPubBakup [out] ECC公钥数据。
  579. * @param pPriBakup [out] ECC私钥数据。
  580. *
  581. * @return DONGLE_SUCCESS 产生ECC公私钥成功。
  582. */
  583. DWORD WINAPI Dongle_EccGenPubPriKey(DONGLE_HANDLE hDongle, WORD wPriFileID, ECCSM2_PUBLIC_KEY * pPubBakup, ECCSM2_PRIVATE_KEY * pPriBakup);
  584. /**
  585. * @brief ECC私钥签名。函数的使用权限取决于锁内ECC私钥文件的权限,在ECC私钥文件创建时设定。说明:
  586. * 1.锁内签名算法为: ECDSA_Sign
  587. * 2.输入的Hash值的长度与ECC私钥的密钥长度有关(如果密钥是192位的,则hash值长度不能超过24(192/8 = 24)字节)
  588. * (如果密钥是256位的,则hash值长度不能超过32(256/8 = 32)字节)
  589. * 3.曲线参数为:EC_NIST_PRIME_192及EC_NIST_PRIME_256
  590. *
  591. * @param hDongle [in] 打开的加密锁句柄。
  592. * @param wPriFileID [in] ECC私钥文件ID。
  593. * @param pHashData [in] Hash数据。
  594. * @param nHashDataLen [in] 参数pHashData的大小。
  595. * @param pOutData [out] 签名数据。大小固定为64字节(256位ECC时是正好,192位ECC时的位会补0)
  596. *
  597. * @return DONGLE_SUCCESS 表示签名成功。
  598. */
  599. DWORD WINAPI Dongle_EccSign(DONGLE_HANDLE hDongle, WORD wPriFileID, BYTE * pHashData, int nHashDataLen, BYTE * pOutData);
  600. /**
  601. * @brief ECC公钥验签。函数的使用权限取决于锁内ECC私钥文件的权限,在ECC私钥文件创建时设定。说明:
  602. * 1.锁内签名算法为: ECDSA_Verify
  603. * 2.输入的Hash值的长度与ECC私钥的密钥长度有关(如果密钥是192位的,则hash值长度不能超过24(192/8 = 24)字节)
  604. * (如果密钥是256位的,则hash值长度不能超过32(256/8 = 32)字节)
  605. * 3.曲线参数为:EC_NIST_PRIME_192及EC_NIST_PRIME_256
  606. *
  607. * @param hDongle [in] 打开的加密锁句柄。
  608. * @param pPubKey [in] ECC公钥数据。
  609. * @param pHashData [in] Hash数据。
  610. * @param nHashDataLen [in] 参数pHashData的大小。
  611. * @param pSign [in] 签名数据。大小固定为64字节,为Dongle_EccSign函数返回的pOutData数据。
  612. *
  613. * @return DONGLE_SUCCESS 表示验签成功,否则表示验签失败。
  614. */
  615. DWORD WINAPI Dongle_EccVerify(DONGLE_HANDLE hDongle, ECCSM2_PUBLIC_KEY * pPubKey, BYTE * pHashData, int nHashDataLen, BYTE * pSign);
  616. /**
  617. * @brief 产生SM2公钥和私钥。使用该函数之前需要先创建一个SM2私钥文件。需要开发商权限。成功后注意保存ECC公私钥数据。
  618. *
  619. * @param hDongle [in] 打开的加密锁句柄。
  620. * @param wPriFileID [in] SM2私钥文件ID。
  621. * @param pPubBakup [out] SM2公钥数据。
  622. * @param pPriBakup [out] SM2私钥数据。
  623. *
  624. * @return DONGLE_SUCCESS 产生ECC公私钥成功。
  625. */
  626. DWORD WINAPI Dongle_SM2GenPubPriKey(DONGLE_HANDLE hDongle, WORD wPriFileID, ECCSM2_PUBLIC_KEY * pPubBakup, ECCSM2_PRIVATE_KEY * pPriBakup);
  627. /**
  628. * @brief SM2私钥签名。函数的使用权限取决于锁内SM2私钥文件的权限,在SM2私钥文件创建时设定。
  629. *
  630. * @param hDongle [in] 打开的加密锁句柄。
  631. * @param wPriFileID [in] SM2私钥文件ID。
  632. * @param pHashData [in] Hash数据。
  633. * @param nHashDataLen [in] 参数pHashData的大小。数据长度必须小于32个字节。
  634. * @param pOutData [out] 签名数据。大小固定为64字节。
  635. *
  636. * @return DONGLE_SUCCESS 表示签名成功。
  637. */
  638. DWORD WINAPI Dongle_SM2Sign(DONGLE_HANDLE hDongle, WORD wPriFileID, BYTE * pHashData, int nHashDataLen, BYTE * pOutData);
  639. /**
  640. * @brief SM2公钥验签。函数的使用权限取决于锁内SM2私钥文件的权限,在SM2私钥文件创建时设定。
  641. *
  642. * @param hDongle [in] 打开的加密锁句柄。
  643. * @param wPriFileID [in] SM2公钥数据。
  644. * @param pHashData [in] Hash数据。
  645. * @param nHashDataLen [in] 参数pHashData的大小。
  646. * @param pSign [in] 签名数据。大小固定为64字节,为Dongle_EccSign函数返回的pOutData数据。
  647. *
  648. * @return DONGLE_SUCCESS 表示验签成功,否则表示验签失败。
  649. */
  650. DWORD WINAPI Dongle_SM2Verify(DONGLE_HANDLE hDongle, ECCSM2_PUBLIC_KEY * pPubKey, BYTE * pHashData, int nHashDataLen, BYTE * pSign);
  651. /**
  652. * @brief 3DES加解密。解密运算匿名权限即可, 加密运算的权限取决于密钥文件的权限。
  653. *
  654. * @param hDongle [in] 打开的加密锁句柄。
  655. * @param wKeyFileID [in] 密钥文件ID。
  656. * @param nFlag [in] 运算类型。例如,FLAG_ENCODE表示加密运算;FLAG_DECODE表示解密运算。
  657. * @param pInData [in] 输入数据缓冲区。
  658. * @param pOutData [out] 输出数据缓冲区。大小至少要和输入数据缓冲区相同,输入和输出数据缓冲区可以为同一个。
  659. * @param nDataLen [in] 参数pInData的数据大小。数据长度必须是16的整数倍,允许的最大值是1024。
  660. *
  661. * @return DONGLE_SUCCESS 3DES加密或解密运算成功。
  662. */
  663. DWORD WINAPI Dongle_TDES(DONGLE_HANDLE hDongle, WORD wKeyFileID, int nFlag, BYTE * pInData, BYTE * pOutData, int nDataLen);
  664. /**
  665. * @brief SM4加解密。解密运算匿名权限即可, 加密运算的权限取决于密钥文件的权限。
  666. *
  667. * @param hDongle [in] 打开的加密锁句柄。
  668. * @param wKeyFileID [in] 密钥文件ID。
  669. * @param nFlag [in] 运算类型。例如,FLAG_ENCODE表示加密运算;FLAG_DECODE表示解密运算。
  670. * @param pInData [in] 输入数据缓冲区。
  671. * @param pOutData [out] 输出数据缓冲区。大小至少要和输入数据缓冲区相同,输入和输出数据缓冲区可以为同一个。
  672. * @param nDataLen [in] 参数pInData的数据大小。数据长度必须是16的整数倍,允许的最大值是1024。
  673. *
  674. * @return DONGLE_SUCCESS SM4加密或解密运算成功。
  675. */
  676. DWORD WINAPI Dongle_SM4(DONGLE_HANDLE hDongle, WORD wKeyFileID, int nFlag, BYTE * pInData, BYTE * pOutData, int nDataLen);
  677. /**
  678. * @brief HASH运算。
  679. *
  680. * @param hDongle [in] 打开的加密锁句柄。
  681. * @param nFlag [in] Hash运算算法类型。
  682. * nFlag = FLAG_HASH_MD5,表示MD5运算,此时pHash的缓冲区大小为16字节。
  683. * nFlag = FLAG_HASH_SHA1,表示SHA1运算,此时pHash的缓冲区大小为20字节。
  684. * nFlag = FLAG_HASH_SM3,表示国密SM3运算,此时pHash的缓冲区大小为32字节。
  685. * @param pInData [in] 输入数据缓冲区。
  686. * @param nDataLen [in] 参数pInData的数据大小。SHA1、MD5为锁外运算,长度不限制;SM3为锁内运算,
  687. * 最大不超过1024字节。
  688. * @param pHash [out] 输出的Hash值。
  689. *
  690. * @return DONGLE_SUCCESS HASH运算成功。
  691. */
  692. DWORD WINAPI Dongle_HASH(DONGLE_HANDLE hDongle, int nFlag, BYTE * pInData, int nDataLen, BYTE * pHash);
  693. /**
  694. * @brief 种子码算法。匿名权限可使用, 开发商可设置可运算次数。
  695. * 1.种子码算法与PID有关,空锁(即PID=FFFFFFFF)不能进行种子码运算。
  696. * 2.如果内部种子码可运算次数不为-1,当其递减到0后此函数将不能使用。
  697. *
  698. * @param hDongle [in] 打开的加密锁句柄。
  699. * @param pSeed [in] 输入的种子码数据。
  700. * @param nSeedLen [in] 种子码长度。取值范围为1~250字节。
  701. * @param pOutData [out] 输出数据缓冲区。输出的大小固定为16字节。
  702. *
  703. * @return DONGLE_SUCCESS 种子码运算成功。
  704. */
  705. DWORD WINAPI Dongle_Seed(DONGLE_HANDLE hDongle, BYTE * pSeed, int nSeedLen, BYTE * pOutData);
  706. /**
  707. * @brief 设置种子码算法可运算次数。需要开发商权限。
  708. *
  709. * @param hDongle [in] 打开的加密锁句柄。
  710. * @param nCount [in] 可运算次数。如果此值设置为-1,表示不限制运算次数。
  711. *
  712. * @return DONGLE_SUCCESS 设置成功。
  713. */
  714. DWORD WINAPI Dongle_LimitSeedCount(DONGLE_HANDLE hDongle, int nCount);
  715. /**
  716. * @brief 制作一把母锁。子母锁的方式是是一种可选的初始化锁方式,安全又快速,推荐使用。需要开发商权限。
  717. * 1.空锁(即PID=FFFFFFFF)不能写入母锁数据。
  718. * 2.出于安全考虑,MOTHER_DATA中的远程升级私钥不允许和母锁自身的远程升级私钥相同,否则会操作失败。
  719. *
  720. * @param hDongle [in] 打开的加密锁句柄。
  721. * @param pInData [in] 输入数据。用于初始化母锁的结构为MOTHER_DATA的数据。
  722. *
  723. * @return DONGLE_SUCCESS 制作母锁成功。
  724. */
  725. DWORD WINAPI Dongle_GenMotherKey(DONGLE_HANDLE hDongle, MOTHER_DATA * pInData);
  726. /**
  727. * @brief 从空锁获取生产请求。此函数只对PID为FFFFFFFF的空锁有效。需要开发商权限。
  728. *
  729. * @param hDongle [in] 打开的加密锁句柄。
  730. * @param pRequest [out] 输出数据。返回该数据的有效长度为16字节,因此需要至少16字节的空间。
  731. *
  732. * @return DONGLE_SUCCESS 获取生产请求数据成功。
  733. */
  734. DWORD WINAPI Dongle_RequestInit(DONGLE_HANDLE hDongle, BYTE * pRequest);
  735. /**
  736. * @brief 从母锁获取用于初始化子锁的数据,该函数只对母锁有效。匿名权限可使用。
  737. *
  738. * @param hDongle [in] 打开的加密锁句柄。
  739. * @param pRequest [in] 请求数据。通过Dongle_RequestInit获取的请求数据。
  740. * @param pInitData [out] 输出数据。函数执行成功返回用于初始化子锁的数据。
  741. * @param pDataLen [int,out] 参数pInitData的有效长度。表示pInitData的缓冲区长度,函数执行成功
  742. * 返回pInitData的有效长度。
  743. *
  744. * @return DONGLE_SUCCESS 从母锁获取生产数据成功。
  745. */
  746. DWORD WINAPI Dongle_GetInitDataFromMother(DONGLE_HANDLE hDongle, BYTE * pRequest, BYTE * pInitData, int * pDataLen);
  747. /*
  748. * @brief 生产子锁。用子母锁的方式制作子锁,匿名权限即可调用。
  749. *
  750. * @param hDongle [in] 打开的加密锁句柄。
  751. * @param pInitData [in] 输入数据。函数Dongle_GetInitDataFromMother返回的用于初始化子锁的数据。
  752. * @param nDataLen [in] 参数pInitData数据缓冲区的有效长度。
  753. *
  754. * @return DONGLE_SUCCESS 生产子锁成功。
  755. */
  756. DWORD WINAPI Dongle_InitSon(DONGLE_HANDLE hDongle, BYTE * pInitData, int nDataLen);
  757. /**
  758. * @brief 向锁内设置远程升级私钥。私钥长度为1024的RSA私钥。需要开发商权限。
  759. * 出于安全考虑,如果锁是母锁的话,远程升级私钥不允许和母锁数据区中的子锁远程升级私钥相同,否则会操作失败。
  760. *
  761. * @param hDongle [in] 打开的加密锁句柄。
  762. * @param pPriKey [in] RSA私钥。
  763. *
  764. * @return DONGLE_SUCCESS 设置远程升级私钥成功。
  765. */
  766. DWORD WINAPI Dongle_SetUpdatePriKey(DONGLE_HANDLE hDongle, RSA_PRIVATE_KEY * pPriKey);
  767. /**
  768. * @brief 制作远程升级数据包。匿名权限即可调用。
  769. *
  770. * @param hDongle [in] 打开的加密锁句柄。
  771. * @param pHID [in] 硬件序列号。如果不需要绑定该参数可以为NULL。
  772. * @param nFunc [in] 升级包类型。
  773. * nFunc = UPDATE_FUNC_CreateFile,表示创建文件。
  774. * nFunc = UPDATE_FUNC_WriteFile,写文件。只有锁内已有的文件才可升级写文件操作。
  775. * nFunc = UPDATE_FUNC_DeleteFile,删除文件。
  776. * nFunc = UPDATE_FUNC_FileLic,设置文件授权,不支持可执行文件授权升级。
  777. * nFunc = UPDATE_FUNC_SeedCount,设置种子码可运算次数。
  778. * nFunc = UPDATE_FUNC_DownloadExe,升级可执行文件。
  779. * nFunc = UPDATE_FUNC_UnlockUserPin,解锁用户PIN。出于安全考虑解锁用户PIN码必须绑定HID,
  780. * 即pHID不能为空,只有这样才能升级成功。升级成功后用户PIN码恢复为"12345678"。
  781. * nFunc = UPDATE_FUNC_Deadline,时钟锁升级使用期限。
  782. *
  783. * @param nFileType [in] 文件类型。升级有关文件操作时的文件类型。其他升级类型该参数无效。
  784. * @param wFileID [in] 文件ID。升级有关文件操作时的文件ID。其他升级类型该参数无效。
  785. * 当wFileID=0xFFFF时,表示升级锁内数据区的数据。
  786. * @param nOffset [in] 偏移量。升级有关文件操作时的文件偏移量。其他升级类型该参数无效。
  787. * @param pBuffer [in] 输入数据。
  788. * 当nFunc = UPDATE_FUNC_CreateFile时, pBuffer指向要文件的属性结构,例如KEY_FILE_ATTR。
  789. * 当nFunc = UPDATE_FUNC_WriteFile时, pBuffer指向要写入的数据。
  790. * 当nFunc = UPDATE_FUNC_FileLic时, pBuffer指向文件权限的数据结构,例如:DATA_LIC。
  791. * 当nFunc = UPDATE_FUNC_SeedCount时, pBuffer指向long值,表示种子码可运算次数。
  792. * 当nFunc = UPDATE_FUNC_DownloadExe时, pBuffer指向EXE_FILE_INFO结构,与Dongle_DownloadExeFile函数用法类似。
  793. * 当nFunc = UPDATE_FUNC_Deadline时, pBuffer指向DWORD值,表示到期的时间。
  794. * @param nBufferLen [in] 参数pBuffer的缓冲区大小。
  795. * @param pUPubKey [in] 制作升级包的RSA公钥。与设置到锁内的远程升级私钥相对应。该值无论何种升级类型都必须填写。
  796. * @param pOutData [out] 输出数据。制作的升级包数据。
  797. * @param pOutDataLen [in,out] 参数pOutData输入大小,返回升级包的有效长度。
  798. *
  799. * @return DONGLE_SUCCESS 制作升级包成功。
  800. */
  801. 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);
  802. /**
  803. * @brief 制作远程升级数据包。该函数采用母锁方式制作,与Dongle_MakeUpdatePacket相比少了远程升级公钥,其他相同。匿名权限即可调用。
  804. *
  805. * @param hDongle [in] 打开的加密锁句柄。
  806. * @param pHID [in] 硬件序列号。如果不需要绑定该参数可以为NULL。
  807. * @param nFunc [in] 升级包类型。
  808. * nFunc = UPDATE_FUNC_CreateFile,表示创建文件。
  809. * nFunc = UPDATE_FUNC_WriteFile,写文件。只有锁内已有的文件才可升级写文件操作。
  810. * nFunc = UPDATE_FUNC_DeleteFile,删除文件。
  811. * nFunc = UPDATE_FUNC_FileLic,设置文件授权,不支持可执行文件授权升级。
  812. * nFunc = UPDATE_FUNC_SeedCount,设置种子码可运算次数。
  813. * nFunc = UPDATE_FUNC_DownloadExe,升级可执行文件。
  814. * nFunc = UPDATE_FUNC_UnlockUserPin,解锁用户PIN。出于安全考虑解锁用户PIN码必须绑定HID,
  815. * 即pHID不能为空,只有这样才能升级成功。升级成功后用户PIN码恢复为"12345678"。
  816. * nFunc = UPDATE_FUNC_Deadline,时钟锁升级使用期限。
  817. *
  818. * @param nFileType [in] 文件类型。升级有关文件操作时的文件类型。其他升级类型该参数无效。
  819. * @param wFileID [in] 文件ID。升级有关文件操作时的文件ID。其他升级类型该参数无效。
  820. * 当wFileID=0xFFFF时,表示升级锁内数据区的数据。
  821. * @param nOffset [in] 偏移量。升级有关文件操作时的文件偏移量。其他升级类型该参数无效。
  822. * @param pBuffer [in] 输入数据。
  823. * 当nFunc = UPDATE_FUNC_CreateFile时, pBuffer指向要文件的属性结构,例如KEY_FILE_ATTR。
  824. * 当nFunc = UPDATE_FUNC_WriteFile时, pBuffer指向要写入的数据。
  825. * 当nFunc = UPDATE_FUNC_FileLic时, pBuffer指向文件权限的数据结构,例如:DATA_LIC。
  826. * 当nFunc = UPDATE_FUNC_SeedCount时, pBuffer指向long值,表示种子码可运算次数。
  827. * 当nFunc = UPDATE_FUNC_DownloadExe时, pBuffer指向EXE_FILE_INFO结构,与Dongle_DownloadExeFile函数用法类似。
  828. * 当nFunc = UPDATE_FUNC_Deadline时, pBuffer指向DWORD值,表示到期的时间。
  829. * @param nBufferLen [in] 参数pBuffer的缓冲区大小。
  830. * @param pOutData [out] 输出数据。制作的升级包数据。
  831. * @param pOutDataLen [in,out] 参数pOutData输入大小,返回升级包的有效长度。
  832. *
  833. * @return DONGLE_SUCCESS 制作升级包成功。
  834. */
  835. 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);
  836. /**
  837. * @brief 远程升级子锁中的数据。匿名权限即可。升级数据pUpdateData对一把锁只能使用一次。
  838. * 1.本函数内部是按1024字节的分块机制发送,如遇返回值不是DONGLE_SUCCESS会立即中断发送并返回。
  839. * 2.如果需要进行流程控制,可由调用方来分块(每块1024字节)发送,并保证数据块的顺序不被打乱,根据返回的错误码来控制流程。
  840. *
  841. * @param hDongle [in] 打开的加密锁句柄。
  842. * @param pUpdateData [in] 输入数据。升级数据,由Dongle_MakeUpdatePacket或者Dongle_MakeUpdatePacketFromMother产生
  843. * @param nDataLen [in] 参数pUpdateData的大小。必须为1024的整数倍。
  844. *
  845. * @return DONGLE_SUCCESS 升级成功。
  846. */
  847. DWORD WINAPI Dongle_Update(DONGLE_HANDLE hDongle, BYTE * pUpdateData, int nDataLen);
  848. //错误码
  849. #define DONGLE_SUCCESS 0x00000000 // 操作成功
  850. #define DONGLE_NOT_FOUND 0xF0000001 // 未找到指定的设备
  851. #define DONGLE_INVALID_HANDLE 0xF0000002 // 无效的句柄
  852. #define DONGLE_INVALID_PARAMETER 0xF0000003 // 参数错误
  853. #define DONGLE_COMM_ERROR 0xF0000004 // 通讯错误
  854. #define DONGLE_INSUFFICIENT_BUFFER 0xF0000005 // 缓冲区空间不足
  855. #define DONGLE_NOT_INITIALIZED 0xF0000006 // 产品尚未初始化 (即没设置PID)
  856. #define DONGLE_ALREADY_INITIALIZED 0xF0000007 // 产品已经初始化 (即已设置PID)
  857. #define DONGLE_ADMINPIN_NOT_CHECK 0xF0000008 // 开发商密码没有验证
  858. #define DONGLE_USERPIN_NOT_CHECK 0xF0000009 // 用户密码没有验证
  859. #define DONGLE_INCORRECT_PIN 0xF000FF00 // 密码不正确 (后2位指示剩余次数)
  860. #define DONGLE_PIN_BLOCKED 0xF000000A // PIN码已锁死
  861. #define DONGLE_ACCESS_DENIED 0xF000000B // 访问被拒绝
  862. #define DONGLE_FILE_EXIST 0xF000000E // 文件已存在
  863. #define DONGLE_FILE_NOT_FOUND 0xF000000F // 未找到指定的文件
  864. #define DONGLE_READ_ERROR 0xF0000010 // 读取数据错误
  865. #define DONGLE_WRITE_ERROR 0xF0000011 // 写入数据错误
  866. #define DONGLE_FILE_CREATE_ERROR 0xF0000012 // 创建文件错误
  867. #define DONGLE_FILE_READ_ERROR 0xF0000013 // 读取文件错误
  868. #define DONGLE_FILE_WRITE_ERROR 0xF0000014 // 写入文件错误
  869. #define DONGLE_FILE_DEL_ERROR 0xF0000015 // 删除文件错误
  870. #define DONGLE_FAILED 0xF0000016 // 操作失败
  871. #define DONGLE_CLOCK_EXPIRE 0xF0000017 // 加密锁时钟到期
  872. #define DONGLE_ERROR_UNKNOWN 0xFFFFFFFF // 未知的错误
  873. #ifdef __cplusplus
  874. }
  875. #endif
  876. #endif