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