libhsm.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. /*******************************************************************************
  2. * File Name : libhsm.h
  3. * Author : Sim
  4. * Date First Issued : 10/05/2024
  5. * Description : This file contains all the functions prototypes for the
  6. * HSM library.
  7. ********************************************************************************
  8. * History:
  9. * 10/05/2024: V0.1
  10. *******************************************************************************/
  11. /* Define to prevent recursive inclusion -------------------------------------*/
  12. #ifndef _LIBHSM_H
  13. #define _LIBHSM_H
  14. #include "amt630hv160_lib.h"
  15. /* Includes ------------------------------------------------------------------*/
  16. /* Exported macro ------------------------------------------------------------*/
  17. #define HSM_OK ( 0)
  18. #define HSM_FAILED ( -1)
  19. #define HSM_INPROGRESS ( -2)
  20. #define HSM_INVALID_HANDLE ( -3)
  21. #define HSM_INVALID_CONTEXT ( -4)
  22. #define HSM_INVALID_SIZE ( -5)
  23. #define HSM_NOT_INITIALIZED ( -6)
  24. #define HSM_NO_MEM ( -7)
  25. #define HSM_INVALID_ALG ( -8)
  26. #define HSM_INVALID_KEY_SIZE ( -9)
  27. #define HSM_INVALID_ARGUMENT ( -10)
  28. #define HSM_MODULE_DISABLED ( -11)
  29. #define HSM_NOT_IMPLEMENTED ( -12)
  30. #define HSM_INVALID_BLOCK_ALIGNMENT ( -13)
  31. #define HSM_INVALID_MODE ( -14)
  32. #define HSM_INVALID_KEY ( -15)
  33. #define HSM_AUTHENTICATION_FAILED ( -16)
  34. #define HSM_INVALID_IV_SIZE ( -17)
  35. #define HSM_MEMORY_ERROR ( -18)
  36. #define HSM_COMMON_ERROR_MAX (-100)
  37. #define HSM_FIFO_FULL (-101)
  38. #define HSM_CMD_FIFO_INACTIVE (-102)
  39. /* Hash Types */
  40. #define HSM_MODE_HASH_MD5 0
  41. #define HSM_MODE_HMAC_MD5 1
  42. #define HSM_MODE_HASH_SHA1 2
  43. #define HSM_MODE_HMAC_SHA1 3
  44. #define HSM_MODE_HASH_SHA224 4
  45. #define HSM_MODE_HMAC_SHA224 5
  46. #define HSM_MODE_HASH_SHA512_224 6
  47. #define HSM_MODE_HMAC_SHA512_224 7
  48. #define HSM_MODE_HASH_SHA3_224 8
  49. #define HSM_MODE_HASH_SHA256 9
  50. #define HSM_MODE_HMAC_SHA256 10
  51. #define HSM_MODE_HASH_SHA512_256 11
  52. #define HSM_MODE_HMAC_SHA512_256 12
  53. #define HSM_MODE_HASH_SHA3_256 13
  54. #define HSM_MODE_HASH_SHA384 14
  55. #define HSM_MODE_HMAC_SHA384 15
  56. #define HSM_MODE_HASH_SHA3_384 16
  57. #define HSM_MODE_HASH_SHA512 17
  58. #define HSM_MODE_HMAC_SHA512 18
  59. #define HSM_MODE_HASH_SHA3_512 19
  60. #define HSM_MODE_HASH_CRC32 20
  61. #define HSM_MODE_HASH_SM3 21
  62. #define HSM_MODE_HMAC_SM3 22
  63. /* Cipher Types */
  64. #define HSM_MODE_AES_ECB 23
  65. #define HSM_MODE_AES_CBC 24
  66. #define HSM_MODE_AES_CTR 25
  67. #define HSM_MODE_AES_CCM 26
  68. #define HSM_MODE_AES_GCM 27
  69. #define HSM_MODE_AES_F8 28
  70. #define HSM_MODE_AES_XTS 29
  71. #define HSM_MODE_AES_CFB 30
  72. #define HSM_MODE_AES_OFB 31
  73. #define HSM_MODE_AES_CS1 32
  74. #define HSM_MODE_AES_CS2 33
  75. #define HSM_MODE_AES_CS3 34
  76. #define HSM_MODE_MULTI2_ECB 35
  77. #define HSM_MODE_MULTI2_CBC 36
  78. #define HSM_MODE_MULTI2_OFB 37
  79. #define HSM_MODE_MULTI2_CFB 38
  80. #define HSM_MODE_3DES_CBC 39
  81. #define HSM_MODE_3DES_ECB 40
  82. #define HSM_MODE_DES_CBC 41
  83. #define HSM_MODE_DES_ECB 42
  84. #define HSM_MODE_KASUMI_ECB 43
  85. #define HSM_MODE_CHACHA20_STREAM 44
  86. #define HSM_MODE_SM4_ECB 45
  87. #define HSM_MODE_SM4_CBC 46
  88. #define HSM_MODE_SM4_CFB 47
  89. #define HSM_MODE_SM4_OFB 48
  90. #define HSM_MODE_SM4_CTR 49
  91. #define HSM_MODE_SM4_CCM 50
  92. #define HSM_MODE_SM4_GCM 51
  93. #define HSM_MODE_SM4_F8 52
  94. #define HSM_MODE_SM4_XTS 53
  95. #define HSM_MODE_SM4_CS1 54
  96. #define HSM_MODE_SM4_CS2 55
  97. #define HSM_MODE_SM4_CS3 56
  98. #define HSM_MODE_CHACHA20_POLY1305 57
  99. #define HSM_MODE_HASH_SHAKE128 58
  100. #define HSM_MODE_HASH_SHAKE256 59
  101. #define HSM_MODE_KASUMI_F8 60
  102. #define HSM_MODE_MAC_CMAC 61
  103. #define HSM_MODE_MAC_KASUMI_F9 62
  104. #define HSM_MODE_MAC_KMAC128 63
  105. #define HSM_MODE_MAC_KMAC256 64
  106. #define HSM_MODE_MAC_KMACXOF128 65
  107. #define HSM_MODE_MAC_KMACXOF256 66
  108. #define HSM_MODE_MAC_POLY1305 67
  109. #define HSM_MODE_MAC_SM4_CMAC 68
  110. #define HSM_MODE_MAC_SM4_XCBC 69
  111. #define HSM_MODE_MAC_SNOW3G_UIA2 70
  112. #define HSM_MODE_MAC_XCBC 71
  113. #define HSM_MODE_MAC_ZUC_UIA3 72
  114. #define HSM_MODE_SNOW3G_UEA2 73
  115. #define HSM_MODE_ZUC_UEA3 74
  116. #define HSM_MODE_HMAC_SHA3_224 75
  117. #define HSM_MODE_HMAC_SHA3_256 76
  118. #define HSM_MODE_HMAC_SHA3_384 77
  119. #define HSM_MODE_HMAC_SHA3_512 78
  120. /* Exported types ------------------------------------------------------------*/
  121. struct pka_rsa_mod {
  122. uint8_t *m; //modulus
  123. uint8_t *r_sqr; //Montgomery r2 mod m Precalculation
  124. uint8_t *mp; //Montgomery m' Precalculation
  125. };
  126. struct pka_rsa_key {
  127. uint16_t mod_size; //modulus bits
  128. struct pka_rsa_mod n;
  129. uint8_t *exp; //Exponentiation
  130. };
  131. struct ecc_point {
  132. uint8_t *x;
  133. uint8_t *y;
  134. };
  135. /* Exported enums ------------------------------------------------------------*/
  136. enum hashType{
  137. PKA_HASH_SHA224 = 0,
  138. PKA_HASH_SHA256,
  139. PKA_HASH_SHA384,
  140. PKA_HASH_SHA512
  141. };
  142. /* Exported functions ------------------------------------------------------- */
  143. /* HSM --------------------------------------------------------------------- */
  144. /*
  145. * HSM打开/关闭调试输出
  146. * param [in] debug_on 1:打开调试 0:关闭调试
  147. * return
  148. * - none
  149. */
  150. void HSM_Logout(int debug_on);
  151. /* Exported functions ------------------------------------------------------- */
  152. /* EHSE --------------------------------------------------------------------- */
  153. /*
  154. * EHSE模块初始化
  155. * return 出错返回HSM_FAILED,成功返回HSM_OK
  156. */
  157. int EHSE_Init(void);
  158. /*
  159. * EHSE模块DDT初始化
  160. * param [in] pddt DDT表地址,要求8字节对齐
  161. * param [in] size DDT表大小,整个pddt内存不能跨越512K地址
  162. * return
  163. * - HSM_XXX
  164. */
  165. int EHSE_DDT_Init(void *pddt, uint32_t size);
  166. /*
  167. * HASH计算
  168. * param [in] in 输入数据
  169. * param [in] inlen 输入数据长度
  170. * param [out] out 输出数据
  171. * param [inout] outlen 输出数据长度
  172. * param [in] hash_type hash类型,比如HSM_MODE_HASH_SHA256
  173. * return
  174. * - HSM_XXX
  175. */
  176. int EHSE_Hash(uint8_t *in, uint32_t inlen, uint8_t *out, uint32_t *outlen, int hash_type);
  177. /*
  178. * HMAC计算
  179. * param [in] in 输入数据
  180. * param [in] inlen 输入数据长度
  181. * param [in] key 密钥
  182. * param [in] keysz 密钥长度
  183. * param [out] out 输出数据
  184. * param [inout] outlen 输出数据长度
  185. * param [in] hmac_type hmac类型,比如HSM_MODE_HMAC_SHA256
  186. * return
  187. * - HSM_XXX
  188. */
  189. int EHSE_Hmac(uint8_t *in, uint32_t inlen, void *key, uint32_t keysz,
  190. uint8_t *out, uint32_t *outlen, int hmac_type);
  191. /*
  192. * 对称加密
  193. * param [in] in 原始数据
  194. * param [out] out 加密后的数据
  195. * param [in] len 数据长度
  196. * param [in] key 密钥
  197. * param [in] keysz 密钥长度
  198. * param [in] iv 初始化向量
  199. * param [in] ivsz 初始化向量长度
  200. * param [in] ciper_type 加密类型,比如HSM_MODE_AES_CTR
  201. * return
  202. * - HSM_XXX
  203. */
  204. int EHSE_CiperEncrypt(uint8_t *in, uint8_t *out, uint32_t len,
  205. uint8_t *key, uint32_t keysz,
  206. uint8_t *iv, uint32_t ivsz,
  207. int ciper_type);
  208. /*
  209. * 对称解密
  210. * param [in] in 加密后的数据
  211. * param [out] out 原始数据
  212. * param [in] len 数据长度
  213. * param [in] key 密钥
  214. * param [in] keysz 密钥长度
  215. * param [in] iv 初始化向量
  216. * param [in] ivsz 初始化向量长度
  217. * param [in] ciper_type 加密类型,比如HSM_MODE_AES_CTR
  218. * return
  219. * - HSM_XXX
  220. */
  221. int EHSE_CiperDecrypt(uint8_t *in, uint8_t *out, uint32_t len,
  222. uint8_t *key, uint32_t keysz,
  223. uint8_t *iv, uint32_t ivsz,
  224. int ciper_type);
  225. /*
  226. * 对称认证加密
  227. * param [in] in 原始数据
  228. * param [out] out 加密后的数据
  229. * param [in] len 数据长度
  230. * param [in] aad 填充数据
  231. * param [in] aadlen 填充数据长度
  232. * param [out] tag 生成的标签数据
  233. * param [in] taglen 接收标签数据缓存大小
  234. * param [in] key 密钥
  235. * param [in] keysz 密钥长度
  236. * param [in] iv 初始化向量
  237. * param [in] ivsz 初始化向量长度
  238. * param [in] ciper_type 加密类型,比如HSM_MODE_AES_GCM
  239. * return
  240. * - HSM_XXX
  241. */
  242. int EHSE_CiperAuthEncrypt(uint8_t *in, uint8_t *out, uint32_t len,
  243. uint8_t *aad, uint32_t aadlen,
  244. uint8_t *tag, uint8_t taglen,
  245. uint8_t *key, uint32_t keysz,
  246. uint8_t *iv, uint32_t ivsz,
  247. int ciper_type);
  248. /*
  249. * 对称认证解密
  250. * param [in] in 加密后的数据
  251. * param [out] out 原始数据
  252. * param [in] len 数据长度
  253. * param [in] aad 填充数据
  254. * param [in] aadlen 填充数据长度
  255. * param [in] tag 标签数据
  256. * param [in] taglen 标签数据大小
  257. * param [in] key 密钥
  258. * param [in] keysz 密钥长度
  259. * param [in] iv 初始化向量
  260. * param [in] ivsz 初始化向量长度
  261. * param [in] ciper_type 加密类型,比如HSM_MODE_AES_GCM
  262. * return
  263. * - HSM_XXX
  264. */
  265. int EHSE_CiperAuthDecrypt(uint8_t *in, uint8_t *out, uint32_t len,
  266. uint8_t *aad, uint32_t aadlen,
  267. uint8_t *tag, uint8_t taglen,
  268. uint8_t *key, uint32_t keysz,
  269. uint8_t *iv, uint32_t ivsz,
  270. int ciper_type);
  271. /* PKA --------------------------------------------------------------------- */
  272. /*
  273. * PKA模块初始化
  274. * return 出错返回HSM_FAILED,成功返回HSM_OK
  275. */
  276. int PKA_Init(void);
  277. /*
  278. * RSA预计算
  279. * param [inout] mod 根据输入的模数m计算r_sqr和mp
  280. * param [in] modlen 模数m的bit数
  281. * return
  282. * - HSM_XXX
  283. */
  284. int PKA_RsaPrecomp(struct pka_rsa_mod *mod, uint16_t modlen);
  285. /*
  286. * RSA PKCS1-v1_5 签名
  287. * param [in] key 私钥,exp指向私钥数据
  288. * param [in] hash 要签名的hash数据
  289. * param [in] htype hash数据类型
  290. * param [out] signature 签名后的数据
  291. * return
  292. * - HSM_XXX
  293. */
  294. int PKA_RsaSign(struct pka_rsa_key *key, uint8_t *hash, enum hashType htype, uint8_t *signature);
  295. /*
  296. * RSA PKCS1-v1_5 认证
  297. * param [in] key 公钥,exp指向公钥数据
  298. * param [in] hash 要签名的hash数据
  299. * param [in] htype hash数据类型
  300. * param [out] signature 签名后的数据
  301. * return
  302. * - HSM_XXX
  303. */
  304. int PKA_RsaVerify(struct pka_rsa_key *key, uint8_t *hash,
  305. enum hashType htype, uint8_t *signature);
  306. /*
  307. * RSA PKCS1-v1_5 加密
  308. * param [in] key 私钥,exp指向私钥数据
  309. * param [in] m 要加密的消息
  310. * param [in] mlen 消息长度
  311. * param [in] rng 填充数据
  312. * param [in] rnglen 填充数据长度
  313. * param [out] ct 加密后的数据
  314. * return
  315. * - HSM_XXX
  316. */
  317. int PKA_RsaEncrypt(struct pka_rsa_key *key , uint8_t *m, uint32_t mlen,
  318. uint8_t *rng, uint16_t rnglen, uint8_t *ct);
  319. /*
  320. * RSA PKCS1-v1_5 解密
  321. * param [in] key 公钥,exp指向公钥数据
  322. * param [in] ct 加密后的数据
  323. * param [out] msg 被加密的消息
  324. * param [in] msglen 被加密的消息长度
  325. * return
  326. * - HSM_XXX
  327. */
  328. int PKA_RsaDecrypt(struct pka_rsa_key *key, uint8_t *ct, uint8_t *msg, uint32_t msglen);
  329. /*
  330. * PKA 生成伪随机数
  331. * param [out] data 生成伪随机数
  332. * param [in] size 需要生成的随机数长度
  333. * return
  334. * - HSM_XXX
  335. */
  336. int PKA_Random(uint8_t *data, uint32_t size);
  337. /*
  338. * PKA 根据私钥计算公钥
  339. * param [in] keypriv 私钥
  340. * param [out] keypub 生成的公钥
  341. * return
  342. * - HSM_XXX
  343. */
  344. int PKA_Sm2KeyGenerate(uint8_t *keypriv, struct ecc_point keypub);
  345. /*
  346. * PKA SM2 签名
  347. * param [in] keypriv 私钥
  348. * param [in] k 随机数k
  349. * param [in] hash 要签名的数据e = SM3_HASH(ZA || M)
  350. * param [in] hlen 要签名的数据长度
  351. * param [out] r 生成的签名数据r
  352. * param [out] s 生成的签名数据s
  353. * return
  354. * - HSM_XXX
  355. */
  356. int PKA_Sm2Sign(uint8_t *keypriv, uint8_t *k, uint8_t *hash, uint32_t hlen,
  357. uint8_t *r, uint8_t *s);
  358. /*
  359. * PKA SM2 认证
  360. * param [in] keypub 公钥
  361. * param [in] hash 要签名的数据e = SM3_HASH(ZA || M)
  362. * param [in] hlen 要签名的数据长度
  363. * param [in] r 生成的签名数据r
  364. * param [in] s 生成的签名数据s
  365. * return
  366. * - HSM_XXX
  367. */
  368. int PKA_Sm2Verify(struct ecc_point keypub, uint8_t *hash, uint32_t hlen,
  369. uint8_t *r, uint8_t *s);
  370. /*
  371. * SM2 计算Za(SHA256, 不支持SM3)
  372. * Za = SHA256_HASH(ENTLa || IDa || a || b || xg || yg || xa || Ya )
  373. * param [in] keypub 公钥
  374. * param [in] ida 用户IDa标识符
  375. * param [in] idalen ida数据长度
  376. * param [out] za 生成的Za数据
  377. * return
  378. * - HSM_XXX
  379. */
  380. int SM2_ComputeZa(struct ecc_point keypub, uint8_t *ida, uint32_t idalen, uint8_t *za);
  381. /* TRNG --------------------------------------------------------------------- */
  382. /*
  383. * TRNG模块初始化
  384. * return 出错返回HSM_FAILED,成功返回HSM_OK
  385. */
  386. int TRNG_Init(void);
  387. /*
  388. * 产生一个随机数
  389. * return
  390. * - HSM_OK
  391. * - HSM_FAILED
  392. */
  393. int TRNG_GenRandom(void);
  394. /*
  395. * 获取随机数
  396. * param [out] out 接收随机数的缓存,最少16个字节
  397. * return
  398. * - 写到out缓存的字节数,16个字节
  399. */
  400. int TRNG_GetRandom(uint8_t *out);
  401. /*
  402. * 重设种子
  403. * param [in] nonce 种子数据,空指针使用随机种子,否则指向32个字节的缓存
  404. * return
  405. * - HSM_XXX
  406. */
  407. int TRNG_Reseed(const uint8_t *nonce);
  408. /*
  409. * 设置请求随机数多少次后提醒重设种子,如果同时设置了Age,只会触发更快触发的提醒
  410. * param [in] val 请求随机数16*val次后提醒重设种子
  411. * return
  412. * - HSM_XXX
  413. */
  414. int TRNG_SetReqReminder(uint32_t val);
  415. /*
  416. * 设置多长时间后提醒重设种子,如果同时设置了Req,只会触发更快触发的提醒
  417. * param [in] sec 每隔sec秒提醒重设种子
  418. * return
  419. * - HSM_XXX
  420. */
  421. int TRNG_SetAgeReminder(uint32_t sec);
  422. /*
  423. * 注册随机数请求超次数重设种子提醒回调函数,该回调函数执行在中断上下文,
  424. * 函数内不能调用TRNG_GenRandom, TRNG_Reseed这些会阻塞的函数
  425. */
  426. void TRNG_RegisterReqCallback(void (*func)(void));
  427. /*
  428. * 注销随机数请求超次数重设种子提醒回调函数
  429. */
  430. void TRNG_UnregisterReqCallback();
  431. /*
  432. * 注册超时重设种子提醒回调函数,该回调函数执行在中断上下文,
  433. * 函数内不能调用TRNG_GenRandom, TRNG_Reseed这些会阻塞的函数
  434. */
  435. void TRNG_RegisterAgeCallback(void (*func)(void));
  436. /*
  437. * 注销超时重设种子提醒回调函数
  438. */
  439. void TRNG_UnregisterAgeCallback();
  440. #endif /* _LIBHSM_H */