1 /**************************************************************************//**
\r
4 * @brief Cryptographic Accelerator driver header file
\r
6 * @copyright (C) 2017 Nuvoton Technology Corp. All rights reserved.
\r
7 ******************************************************************************/
\r
16 /** @addtogroup Standard_Driver Standard Driver
\r
20 /** @addtogroup CRYPTO_Driver CRYPTO Driver
\r
25 /** @addtogroup CRYPTO_EXPORTED_CONSTANTS CRYPTO Exported Constants
\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
34 #define PRNG_SEED_CONT 0UL /*!< PRNG using current seed \hideinitializer */
\r
35 #define PRNG_SEED_RELOAD 1UL /*!< PRNG reload new seed \hideinitializer */
\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
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
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
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
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
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
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
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
115 typedef struct e_curve_t
\r
117 E_ECC_CURVE curve_id;
\r
128 int32_t irreducible_k1;
\r
129 int32_t irreducible_k2;
\r
130 int32_t irreducible_k3;
\r
136 /*@}*/ /* end of group CRYPTO_EXPORTED_CONSTANTS */
\r
139 /** @addtogroup CRYPTO_EXPORTED_MACROS CRYPTO Exported Macros
\r
143 /*----------------------------------------------------------------------------------------------*/
\r
145 /*----------------------------------------------------------------------------------------------*/
\r
148 * @brief This macro enables PRNG interrupt.
\r
149 * @param crpt Specified cripto module
\r
153 #define PRNG_ENABLE_INT(crpt) ((crpt)->INTEN |= CRPT_INTEN_PRNGIEN_Msk)
\r
156 * @brief This macro disables PRNG interrupt.
\r
157 * @param crpt Specified cripto module
\r
161 #define PRNG_DISABLE_INT(crpt) ((crpt)->INTEN &= ~CRPT_INTEN_PRNGIEN_Msk)
\r
164 * @brief This macro gets PRNG interrupt flag.
\r
165 * @param crpt Specified cripto module
\r
166 * @return PRNG interrupt flag.
\r
169 #define PRNG_GET_INT_FLAG(crpt) ((crpt)->INTSTS & CRPT_INTSTS_PRNGIF_Msk)
\r
172 * @brief This macro clears PRNG interrupt flag.
\r
173 * @param crpt Specified cripto module
\r
177 #define PRNG_CLR_INT_FLAG(crpt) ((crpt)->INTSTS = CRPT_INTSTS_PRNGIF_Msk)
\r
180 * @brief This macro enables AES interrupt.
\r
181 * @param crpt Specified cripto module
\r
185 #define AES_ENABLE_INT(crpt) ((crpt)->INTEN |= (CRPT_INTEN_AESIEN_Msk|CRPT_INTEN_AESEIEN_Msk))
\r
188 * @brief This macro disables AES interrupt.
\r
189 * @param crpt Specified cripto module
\r
193 #define AES_DISABLE_INT(crpt) ((crpt)->INTEN &= ~(CRPT_INTEN_AESIEN_Msk|CRPT_INTEN_AESEIEN_Msk))
\r
196 * @brief This macro gets AES interrupt flag.
\r
197 * @param crpt Specified cripto module
\r
198 * @return AES interrupt flag.
\r
201 #define AES_GET_INT_FLAG(crpt) ((crpt)->INTSTS & (CRPT_INTSTS_AESIF_Msk|CRPT_INTSTS_AESEIF_Msk))
\r
204 * @brief This macro clears AES interrupt flag.
\r
205 * @param crpt Specified cripto module
\r
209 #define AES_CLR_INT_FLAG(crpt) ((crpt)->INTSTS = (CRPT_INTSTS_AESIF_Msk|CRPT_INTSTS_AESEIF_Msk))
\r
212 * @brief This macro enables AES key protection.
\r
213 * @param crpt Specified cripto module
\r
217 #define AES_ENABLE_KEY_PROTECT(crpt) ((crpt)->AES_CTL |= CRPT_AES_CTL_KEYPRT_Msk)
\r
220 * @brief This macro disables AES key protection.
\r
221 * @param crpt Specified cripto module
\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
229 * @brief This macro enables TDES interrupt.
\r
230 * @param crpt Specified cripto module
\r
234 #define TDES_ENABLE_INT(crpt) ((crpt)->INTEN |= (CRPT_INTEN_TDESIEN_Msk|CRPT_INTEN_TDESEIEN_Msk))
\r
237 * @brief This macro disables TDES interrupt.
\r
238 * @param crpt Specified cripto module
\r
242 #define TDES_DISABLE_INT(crpt) ((crpt)->INTEN &= ~(CRPT_INTEN_TDESIEN_Msk|CRPT_INTEN_TDESEIEN_Msk))
\r
245 * @brief This macro gets TDES interrupt flag.
\r
246 * @param crpt Specified cripto module
\r
247 * @return TDES interrupt flag.
\r
250 #define TDES_GET_INT_FLAG(crpt) ((crpt)->INTSTS & (CRPT_INTSTS_TDESIF_Msk|CRPT_INTSTS_TDESEIF_Msk))
\r
253 * @brief This macro clears TDES interrupt flag.
\r
254 * @param crpt Specified cripto module
\r
258 #define TDES_CLR_INT_FLAG(crpt) ((crpt)->INTSTS = (CRPT_INTSTS_TDESIF_Msk|CRPT_INTSTS_TDESEIF_Msk))
\r
261 * @brief This macro enables TDES key protection.
\r
262 * @param crpt Specified cripto module
\r
266 #define TDES_ENABLE_KEY_PROTECT(crpt) ((crpt)->TDES_CTL |= CRPT_TDES_CTL_KEYPRT_Msk)
\r
269 * @brief This macro disables TDES key protection.
\r
270 * @param crpt Specified cripto module
\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
278 * @brief This macro enables SHA interrupt.
\r
279 * @param crpt Specified cripto module
\r
283 #define SHA_ENABLE_INT(crpt) ((crpt)->INTEN |= (CRPT_INTEN_HMACIEN_Msk|CRPT_INTEN_HMACEIEN_Msk))
\r
286 * @brief This macro disables SHA interrupt.
\r
287 * @param crpt Specified cripto module
\r
291 #define SHA_DISABLE_INT(crpt) ((crpt)->INTEN &= ~(CRPT_INTEN_HMACIEN_Msk|CRPT_INTEN_HMACEIEN_Msk))
\r
294 * @brief This macro gets SHA interrupt flag.
\r
295 * @param crpt Specified cripto module
\r
296 * @return SHA interrupt flag.
\r
299 #define SHA_GET_INT_FLAG(crpt) ((crpt)->INTSTS & (CRPT_INTSTS_HMACIF_Msk|CRPT_INTSTS_HMACEIF_Msk))
\r
302 * @brief This macro clears SHA interrupt flag.
\r
303 * @param crpt Specified cripto module
\r
307 #define SHA_CLR_INT_FLAG(crpt) ((crpt)->INTSTS = (CRPT_INTSTS_HMACIF_Msk|CRPT_INTSTS_HMACEIF_Msk))
\r
310 * @brief This macro enables ECC interrupt.
\r
311 * @param crpt Specified cripto module
\r
315 #define ECC_ENABLE_INT(crpt) ((crpt)->INTEN |= (CRPT_INTEN_ECCIEN_Msk|CRPT_INTEN_ECCEIEN_Msk))
\r
318 * @brief This macro disables ECC interrupt.
\r
319 * @param crpt Specified cripto module
\r
323 #define ECC_DISABLE_INT(crpt) ((crpt)->INTEN &= ~(CRPT_INTEN_ECCIEN_Msk|CRPT_INTEN_ECCEIEN_Msk))
\r
326 * @brief This macro gets ECC interrupt flag.
\r
327 * @param crpt Specified cripto module
\r
328 * @return ECC interrupt flag.
\r
331 #define ECC_GET_INT_FLAG(crpt) ((crpt)->INTSTS & (CRPT_INTSTS_ECCIF_Msk|CRPT_INTSTS_ECCEIF_Msk))
\r
334 * @brief This macro clears ECC interrupt flag.
\r
335 * @param crpt Specified cripto module
\r
339 #define ECC_CLR_INT_FLAG(crpt) ((crpt)->INTSTS = (CRPT_INTSTS_ECCIF_Msk|CRPT_INTSTS_ECCEIF_Msk))
\r
342 /*@}*/ /* end of group CRYPTO_EXPORTED_MACROS */
\r
346 /** @addtogroup CRYPTO_EXPORTED_FUNCTIONS CRYPTO Exported Functions
\r
350 /*---------------------------------------------------------------------------------------------------------*/
\r
352 /*---------------------------------------------------------------------------------------------------------*/
\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
379 /*@}*/ /* end of group CRYPTO_EXPORTED_FUNCTIONS */
\r
381 /*@}*/ /* end of group CRYPTO_Driver */
\r
383 /*@}*/ /* end of group Standard_Driver */
\r
389 #endif /* __CRYPTO_H__ */
\r
391 /*** (C) COPYRIGHT 2017 Nuvoton Technology Corp. ***/
\r