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