nu_crypto.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. /**************************************************************************//**
  2. * @file nu_crypto.h
  3. * @version V1.10
  4. * @brief Cryptographic Accelerator driver header file
  5. *
  6. * SPDX-License-Identifier: Apache-2.0
  7. * @copyright (C) 2016-2020 Nuvoton Technology Corp. All rights reserved.
  8. ******************************************************************************/
  9. #ifndef __NU_CRYPTO_H__
  10. #define __NU_CRYPTO_H__
  11. #ifdef __cplusplus
  12. extern "C"
  13. {
  14. #endif
  15. /** @addtogroup Standard_Driver Standard Driver
  16. @{
  17. */
  18. /** @addtogroup CRYPTO_Driver CRYPTO Driver
  19. @{
  20. */
  21. /** @addtogroup CRYPTO_EXPORTED_CONSTANTS CRYPTO Exported Constants
  22. @{
  23. */
  24. #define PRNG_KEY_SIZE_64 0UL /*!< Select to generate 64-bit random key \hideinitializer */
  25. #define PRNG_KEY_SIZE_128 1UL /*!< Select to generate 128-bit random key \hideinitializer */
  26. #define PRNG_KEY_SIZE_192 2UL /*!< Select to generate 192-bit random key \hideinitializer */
  27. #define PRNG_KEY_SIZE_256 3UL /*!< Select to generate 256-bit random key \hideinitializer */
  28. #define PRNG_SEED_CONT 0UL /*!< PRNG using current seed \hideinitializer */
  29. #define PRNG_SEED_RELOAD 1UL /*!< PRNG reload new seed \hideinitializer */
  30. #define AES_KEY_SIZE_128 0UL /*!< AES select 128-bit key length \hideinitializer */
  31. #define AES_KEY_SIZE_192 1UL /*!< AES select 192-bit key length \hideinitializer */
  32. #define AES_KEY_SIZE_256 2UL /*!< AES select 256-bit key length \hideinitializer */
  33. #define AES_MODE_ECB 0UL /*!< AES select ECB mode \hideinitializer */
  34. #define AES_MODE_CBC 1UL /*!< AES select CBC mode \hideinitializer */
  35. #define AES_MODE_CFB 2UL /*!< AES select CFB mode \hideinitializer */
  36. #define AES_MODE_OFB 3UL /*!< AES select OFB mode \hideinitializer */
  37. #define AES_MODE_CTR 4UL /*!< AES select CTR mode \hideinitializer */
  38. #define AES_MODE_CBC_CS1 0x10UL /*!< AES select CBC CS1 mode \hideinitializer */
  39. #define AES_MODE_CBC_CS2 0x11UL /*!< AES select CBC CS2 mode \hideinitializer */
  40. #define AES_MODE_CBC_CS3 0x12UL /*!< AES select CBC CS3 mode \hideinitializer */
  41. #define AES_NO_SWAP 0UL /*!< AES do not swap input and output data \hideinitializer */
  42. #define AES_OUT_SWAP 1UL /*!< AES swap output data \hideinitializer */
  43. #define AES_IN_SWAP 2UL /*!< AES swap input data \hideinitializer */
  44. #define AES_IN_OUT_SWAP 3UL /*!< AES swap both input and output data \hideinitializer */
  45. #define DES_MODE_ECB 0x000UL /*!< DES select ECB mode \hideinitializer */
  46. #define DES_MODE_CBC 0x100UL /*!< DES select CBC mode \hideinitializer */
  47. #define DES_MODE_CFB 0x200UL /*!< DES select CFB mode \hideinitializer */
  48. #define DES_MODE_OFB 0x300UL /*!< DES select OFB mode \hideinitializer */
  49. #define DES_MODE_CTR 0x400UL /*!< DES select CTR mode \hideinitializer */
  50. #define TDES_MODE_ECB 0x004UL /*!< TDES select ECB mode \hideinitializer */
  51. #define TDES_MODE_CBC 0x104UL /*!< TDES select CBC mode \hideinitializer */
  52. #define TDES_MODE_CFB 0x204UL /*!< TDES select CFB mode \hideinitializer */
  53. #define TDES_MODE_OFB 0x304UL /*!< TDES select OFB mode \hideinitializer */
  54. #define TDES_MODE_CTR 0x404UL /*!< TDES select CTR mode \hideinitializer */
  55. #define TDES_NO_SWAP 0UL /*!< TDES do not swap data \hideinitializer */
  56. #define TDES_WHL_SWAP 1UL /*!< TDES swap high-low word \hideinitializer */
  57. #define TDES_OUT_SWAP 2UL /*!< TDES swap output data \hideinitializer */
  58. #define TDES_OUT_WHL_SWAP 3UL /*!< TDES swap output data and high-low word \hideinitializer */
  59. #define TDES_IN_SWAP 4UL /*!< TDES swap input data \hideinitializer */
  60. #define TDES_IN_WHL_SWAP 5UL /*!< TDES swap input data and high-low word \hideinitializer */
  61. #define TDES_IN_OUT_SWAP 6UL /*!< TDES swap both input and output data \hideinitializer */
  62. #define TDES_IN_OUT_WHL_SWAP 7UL /*!< TDES swap input, output and high-low word \hideinitializer */
  63. #define SHA_MODE_SHA1 0UL /*!< SHA select SHA-1 160-bit \hideinitializer */
  64. #define SHA_MODE_SHA224 5UL /*!< SHA select SHA-224 224-bit \hideinitializer */
  65. #define SHA_MODE_SHA256 4UL /*!< SHA select SHA-256 256-bit \hideinitializer */
  66. #define SHA_MODE_SHA384 7UL /*!< SHA select SHA-384 384-bit \hideinitializer */
  67. #define SHA_MODE_SHA512 6UL /*!< SHA select SHA-512 512-bit \hideinitializer */
  68. #define SHA_NO_SWAP 0UL /*!< SHA do not swap input and output data \hideinitializer */
  69. #define SHA_OUT_SWAP 1UL /*!< SHA swap output data \hideinitializer */
  70. #define SHA_IN_SWAP 2UL /*!< SHA swap input data \hideinitializer */
  71. #define SHA_IN_OUT_SWAP 3UL /*!< SHA swap both input and output data \hideinitializer */
  72. #define CRYPTO_DMA_FIRST 0x4UL /*!< Do first encrypt/decrypt in DMA cascade \hideinitializer */
  73. #define CRYPTO_DMA_ONE_SHOT 0x5UL /*!< Do one shot encrypt/decrypt with DMA \hideinitializer */
  74. #define CRYPTO_DMA_CONTINUE 0x6UL /*!< Do continuous encrypt/decrypt in DMA cascade \hideinitializer */
  75. #define CRYPTO_DMA_LAST 0x7UL /*!< Do last encrypt/decrypt in DMA cascade \hideinitializer */
  76. typedef enum
  77. {
  78. /*!< ECC curve \hideinitializer */
  79. CURVE_P_192, /*!< ECC curve P-192 \hideinitializer */
  80. CURVE_P_224, /*!< ECC curve P-224 \hideinitializer */
  81. CURVE_P_256, /*!< ECC curve P-256 \hideinitializer */
  82. CURVE_P_384, /*!< ECC curve P-384 \hideinitializer */
  83. CURVE_P_521, /*!< ECC curve P-521 \hideinitializer */
  84. CURVE_K_163, /*!< ECC curve K-163 \hideinitializer */
  85. CURVE_K_233, /*!< ECC curve K-233 \hideinitializer */
  86. CURVE_K_283, /*!< ECC curve K-283 \hideinitializer */
  87. CURVE_K_409, /*!< ECC curve K-409 \hideinitializer */
  88. CURVE_K_571, /*!< ECC curve K-571 \hideinitializer */
  89. CURVE_B_163, /*!< ECC curve B-163 \hideinitializer */
  90. CURVE_B_233, /*!< ECC curve B-233 \hideinitializer */
  91. CURVE_B_283, /*!< ECC curve B-283 \hideinitializer */
  92. CURVE_B_409, /*!< ECC curve B-409 \hideinitializer */
  93. CURVE_B_571, /*!< ECC curve K-571 \hideinitializer */
  94. CURVE_KO_192, /*!< ECC 192-bits "Koblitz" curve \hideinitializer */
  95. CURVE_KO_224, /*!< ECC 224-bits "Koblitz" curve \hideinitializer */
  96. CURVE_KO_256, /*!< ECC 256-bits "Koblitz" curve \hideinitializer */
  97. CURVE_BP_256, /*!< ECC Brainpool 256-bits curve \hideinitializer */
  98. CURVE_BP_384, /*!< ECC Brainpool 256-bits curve \hideinitializer */
  99. CURVE_BP_512, /*!< ECC Brainpool 256-bits curve \hideinitializer */
  100. CURVE_UNDEF, /*!< Invalid curve \hideinitializer */
  101. }
  102. E_ECC_CURVE; /*!< ECC curve \hideinitializer */
  103. /*@}*/ /* end of group CRYPTO_EXPORTED_CONSTANTS */
  104. /** @addtogroup M480_CRYPTO_EXPORTED_MACROS CRYPTO Exported Macros
  105. @{
  106. */
  107. /*----------------------------------------------------------------------------------------------*/
  108. /* Macros */
  109. /*----------------------------------------------------------------------------------------------*/
  110. /**
  111. * @brief This macro enables PRNG interrupt.
  112. * @param crpt Specified cripto module
  113. * @return None
  114. * \hideinitializer
  115. */
  116. #define PRNG_ENABLE_INT(crpt) ((crpt)->INTEN |= CRPT_INTEN_PRNGIEN_Msk)
  117. /**
  118. * @brief This macro disables PRNG interrupt.
  119. * @param crpt Specified cripto module
  120. * @return None
  121. * \hideinitializer
  122. */
  123. #define PRNG_DISABLE_INT(crpt) ((crpt)->INTEN &= ~CRPT_INTEN_PRNGIEN_Msk)
  124. /**
  125. * @brief This macro gets PRNG interrupt flag.
  126. * @param crpt Specified cripto module
  127. * @return PRNG interrupt flag.
  128. * \hideinitializer
  129. */
  130. #define PRNG_GET_INT_FLAG(crpt) ((crpt)->INTSTS & CRPT_INTSTS_PRNGIF_Msk)
  131. /**
  132. * @brief This macro clears PRNG interrupt flag.
  133. * @param crpt Specified cripto module
  134. * @return None
  135. * \hideinitializer
  136. */
  137. #define PRNG_CLR_INT_FLAG(crpt) ((crpt)->INTSTS = CRPT_INTSTS_PRNGIF_Msk)
  138. /**
  139. * @brief This macro enables AES interrupt.
  140. * @param crpt Specified cripto module
  141. * @return None
  142. * \hideinitializer
  143. */
  144. #define AES_ENABLE_INT(crpt) ((crpt)->INTEN |= (CRPT_INTEN_AESIEN_Msk|CRPT_INTEN_AESEIEN_Msk))
  145. /**
  146. * @brief This macro disables AES interrupt.
  147. * @param crpt Specified cripto module
  148. * @return None
  149. * \hideinitializer
  150. */
  151. #define AES_DISABLE_INT(crpt) ((crpt)->INTEN &= ~(CRPT_INTEN_AESIEN_Msk|CRPT_INTEN_AESEIEN_Msk))
  152. /**
  153. * @brief This macro gets AES interrupt flag.
  154. * @param crpt Specified cripto module
  155. * @return AES interrupt flag.
  156. * \hideinitializer
  157. */
  158. #define AES_GET_INT_FLAG(crpt) ((crpt)->INTSTS & (CRPT_INTSTS_AESIF_Msk|CRPT_INTSTS_AESEIF_Msk))
  159. /**
  160. * @brief This macro clears AES interrupt flag.
  161. * @param crpt Specified cripto module
  162. * @return None
  163. * \hideinitializer
  164. */
  165. #define AES_CLR_INT_FLAG(crpt) ((crpt)->INTSTS = (CRPT_INTSTS_AESIF_Msk|CRPT_INTSTS_AESEIF_Msk))
  166. /**
  167. * @brief This macro enables AES key protection.
  168. * @param crpt Specified cripto module
  169. * @return None
  170. * \hideinitializer
  171. */
  172. #define AES_ENABLE_KEY_PROTECT(crpt) ((crpt)->AES_CTL |= CRPT_AES_CTL_KEYPRT_Msk)
  173. /**
  174. * @brief This macro disables AES key protection.
  175. * @param crpt Specified cripto module
  176. * @return None
  177. * \hideinitializer
  178. */
  179. #define AES_DISABLE_KEY_PROTECT(crpt) ((crpt)->AES_CTL = ((crpt)->AES_CTL & ~CRPT_AES_CTL_KEYPRT_Msk) | (0x16UL<<CRPT_AES_CTL_KEYUNPRT_Pos)); \
  180. ((crpt)->AES_CTL &= ~CRPT_AES_CTL_KEYPRT_Msk)
  181. /**
  182. * @brief This macro enables TDES interrupt.
  183. * @param crpt Specified cripto module
  184. * @return None
  185. * \hideinitializer
  186. */
  187. #define TDES_ENABLE_INT(crpt) ((crpt)->INTEN |= (CRPT_INTEN_TDESIEN_Msk|CRPT_INTEN_TDESEIEN_Msk))
  188. /**
  189. * @brief This macro disables TDES interrupt.
  190. * @param crpt Specified cripto module
  191. * @return None
  192. * \hideinitializer
  193. */
  194. #define TDES_DISABLE_INT(crpt) ((crpt)->INTEN &= ~(CRPT_INTEN_TDESIEN_Msk|CRPT_INTEN_TDESEIEN_Msk))
  195. /**
  196. * @brief This macro gets TDES interrupt flag.
  197. * @param crpt Specified cripto module
  198. * @return TDES interrupt flag.
  199. * \hideinitializer
  200. */
  201. #define TDES_GET_INT_FLAG(crpt) ((crpt)->INTSTS & (CRPT_INTSTS_TDESIF_Msk|CRPT_INTSTS_TDESEIF_Msk))
  202. /**
  203. * @brief This macro clears TDES interrupt flag.
  204. * @param crpt Specified cripto module
  205. * @return None
  206. * \hideinitializer
  207. */
  208. #define TDES_CLR_INT_FLAG(crpt) ((crpt)->INTSTS = (CRPT_INTSTS_TDESIF_Msk|CRPT_INTSTS_TDESEIF_Msk))
  209. /**
  210. * @brief This macro enables TDES key protection.
  211. * @param crpt Specified cripto module
  212. * @return None
  213. * \hideinitializer
  214. */
  215. #define TDES_ENABLE_KEY_PROTECT(crpt) ((crpt)->TDES_CTL |= CRPT_TDES_CTL_KEYPRT_Msk)
  216. /**
  217. * @brief This macro disables TDES key protection.
  218. * @param crpt Specified cripto module
  219. * @return None
  220. * \hideinitializer
  221. */
  222. #define TDES_DISABLE_KEY_PROTECT(crpt) ((crpt)->TDES_CTL = ((crpt)->TDES_CTL & ~CRPT_TDES_CTL_KEYPRT_Msk) | (0x16UL<<CRPT_TDES_CTL_KEYUNPRT_Pos)); \
  223. ((crpt)->TDES_CTL &= ~CRPT_TDES_CTL_KEYPRT_Msk)
  224. /**
  225. * @brief This macro enables SHA interrupt.
  226. * @param crpt Specified cripto module
  227. * @return None
  228. * \hideinitializer
  229. */
  230. #define SHA_ENABLE_INT(crpt) ((crpt)->INTEN |= (CRPT_INTEN_HMACIEN_Msk|CRPT_INTEN_HMACEIEN_Msk))
  231. /**
  232. * @brief This macro disables SHA interrupt.
  233. * @param crpt Specified cripto module
  234. * @return None
  235. * \hideinitializer
  236. */
  237. #define SHA_DISABLE_INT(crpt) ((crpt)->INTEN &= ~(CRPT_INTEN_HMACIEN_Msk|CRPT_INTEN_HMACEIEN_Msk))
  238. /**
  239. * @brief This macro gets SHA interrupt flag.
  240. * @param crpt Specified cripto module
  241. * @return SHA interrupt flag.
  242. * \hideinitializer
  243. */
  244. #define SHA_GET_INT_FLAG(crpt) ((crpt)->INTSTS & (CRPT_INTSTS_HMACIF_Msk|CRPT_INTSTS_HMACEIF_Msk))
  245. /**
  246. * @brief This macro clears SHA interrupt flag.
  247. * @param crpt Specified cripto module
  248. * @return None
  249. * \hideinitializer
  250. */
  251. #define SHA_CLR_INT_FLAG(crpt) ((crpt)->INTSTS = (CRPT_INTSTS_HMACIF_Msk|CRPT_INTSTS_HMACEIF_Msk))
  252. /**
  253. * @brief This macro enables ECC interrupt.
  254. * @param crpt Specified cripto module
  255. * @return None
  256. * \hideinitializer
  257. */
  258. #define ECC_ENABLE_INT(crpt) ((crpt)->INTEN |= (CRPT_INTEN_ECCIEN_Msk|CRPT_INTEN_ECCEIEN_Msk))
  259. /**
  260. * @brief This macro disables ECC interrupt.
  261. * @param crpt Specified cripto module
  262. * @return None
  263. * \hideinitializer
  264. */
  265. #define ECC_DISABLE_INT(crpt) ((crpt)->INTEN &= ~(CRPT_INTEN_ECCIEN_Msk|CRPT_INTEN_ECCEIEN_Msk))
  266. /**
  267. * @brief This macro gets ECC interrupt flag.
  268. * @param crpt Specified cripto module
  269. * @return ECC interrupt flag.
  270. * \hideinitializer
  271. */
  272. #define ECC_GET_INT_FLAG(crpt) ((crpt)->INTSTS & (CRPT_INTSTS_ECCIF_Msk|CRPT_INTSTS_ECCEIF_Msk))
  273. /**
  274. * @brief This macro clears ECC interrupt flag.
  275. * @param crpt Specified cripto module
  276. * @return None
  277. * \hideinitializer
  278. */
  279. #define ECC_CLR_INT_FLAG(crpt) ((crpt)->INTSTS = (CRPT_INTSTS_ECCIF_Msk|CRPT_INTSTS_ECCEIF_Msk))
  280. /*@}*/ /* end of group M480_CRYPTO_EXPORTED_MACROS */
  281. /** @addtogroup CRYPTO_EXPORTED_FUNCTIONS CRYPTO Exported Functions
  282. @{
  283. */
  284. /*---------------------------------------------------------------------------------------------------------*/
  285. /* Functions */
  286. /*---------------------------------------------------------------------------------------------------------*/
  287. void PRNG_Open(CRPT_T *crpt, uint32_t u32KeySize, uint32_t u32SeedReload, uint32_t u32Seed);
  288. void PRNG_Start(CRPT_T *crpt);
  289. void PRNG_Read(CRPT_T *crpt, uint32_t u32RandKey[]);
  290. void AES_Open(CRPT_T *crpt, uint32_t u32Channel, uint32_t u32EncDec, uint32_t u32OpMode, uint32_t u32KeySize, uint32_t u32SwapType);
  291. void AES_Start(CRPT_T *crpt, uint32_t u32Channel, uint32_t u32DMAMode);
  292. void AES_SetKey(CRPT_T *crpt, uint32_t u32Channel, uint32_t au32Keys[], uint32_t u32KeySize);
  293. void AES_SetInitVect(CRPT_T *crpt, uint32_t u32Channel, uint32_t au32IV[]);
  294. void AES_SetDMATransfer(CRPT_T *crpt, uint32_t u32Channel, uint32_t u32SrcAddr, uint32_t u32DstAddr, uint32_t u32TransCnt);
  295. void TDES_Open(CRPT_T *crpt, uint32_t u32Channel, uint32_t u32EncDec, int32_t Is3DES, int32_t Is3Key, uint32_t u32OpMode, uint32_t u32SwapType);
  296. void TDES_Start(CRPT_T *crpt, int32_t u32Channel, uint32_t u32DMAMode);
  297. void TDES_SetKey(CRPT_T *crpt, uint32_t u32Channel, uint32_t au32Keys[3][2]);
  298. void TDES_SetInitVect(CRPT_T *crpt, uint32_t u32Channel, uint32_t u32IVH, uint32_t u32IVL);
  299. void TDES_SetDMATransfer(CRPT_T *crpt, uint32_t u32Channel, uint32_t u32SrcAddr, uint32_t u32DstAddr, uint32_t u32TransCnt);
  300. void SHA_Open(CRPT_T *crpt, uint32_t u32OpMode, uint32_t u32SwapType, uint32_t hmac_key_len);
  301. void SHA_Start(CRPT_T *crpt, uint32_t u32DMAMode);
  302. void SHA_SetDMATransfer(CRPT_T *crpt, uint32_t u32SrcAddr, uint32_t u32TransCnt);
  303. void SHA_Read(CRPT_T *crpt, uint32_t u32Digest[]);
  304. void ECC_Complete(CRPT_T *crpt);
  305. int ECC_IsPrivateKeyValid(CRPT_T *crpt, E_ECC_CURVE ecc_curve, char private_k[]);
  306. int32_t ECC_GeneratePublicKey(CRPT_T *crpt, E_ECC_CURVE ecc_curve, char *private_k, char public_k1[], char public_k2[]);
  307. int32_t ECC_Mutiply(CRPT_T *crpt, E_ECC_CURVE ecc_curve, char x1[], char y1[], char *k, char x2[], char y2[]);
  308. int32_t ECC_GenerateSecretZ(CRPT_T *crpt, E_ECC_CURVE ecc_curve, char *private_k, char public_k1[], char public_k2[], char secret_z[]);
  309. int32_t ECC_GenerateSignature(CRPT_T *crpt, E_ECC_CURVE ecc_curve, char *message, char *d, char *k, char *R, char *S);
  310. int32_t ECC_VerifySignature(CRPT_T *crpt, E_ECC_CURVE ecc_curve, char *message, char *public_k1, char *public_k2, char *R, char *S);
  311. /*@}*/ /* end of group CRYPTO_EXPORTED_FUNCTIONS */
  312. /*@}*/ /* end of group CRYPTO_Driver */
  313. /*@}*/ /* end of group Standard_Driver */
  314. #ifdef __cplusplus
  315. }
  316. #endif
  317. #endif /* __NU_CRYPTO_H__ */
  318. /*** (C) COPYRIGHT 2017 Nuvoton Technology Corp. ***/