apm32f4xx_cryp.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. /*!
  2. * @file apm32f4xx_cryp.h
  3. *
  4. * @brief This file contains all the functions prototypes for the CRYP firmware library
  5. *
  6. * @version V1.0.2
  7. *
  8. * @date 2022-06-23
  9. *
  10. * @attention
  11. *
  12. * Copyright (C) 2021-2022 Geehy Semiconductor
  13. *
  14. * You may not use this file except in compliance with the
  15. * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE).
  16. *
  17. * The program is only for reference, which is distributed in the hope
  18. * that it will be usefull and instructional for customers to develop
  19. * their software. Unless required by applicable law or agreed to in
  20. * writing, the program is distributed on an "AS IS" BASIS, WITHOUT
  21. * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied.
  22. * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions
  23. * and limitations under the License.
  24. */
  25. /* Define to prevent recursive inclusion */
  26. #ifndef __APM32F4XX_CRYP_H
  27. #define __APM32F4XX_CRYP_H
  28. #ifdef __cplusplus
  29. extern "C" {
  30. #endif
  31. /* Includes */
  32. #include "apm32f4xx.h"
  33. /** @addtogroup APM32F4xx_StdPeriphDriver
  34. @{
  35. */
  36. /** @addtogroup CRYP_Driver
  37. @{
  38. */
  39. /** @defgroup CRYP_Enumerations
  40. @{
  41. */
  42. /**
  43. * @brief CRYP Algorithm Direction
  44. */
  45. typedef enum
  46. {
  47. CRYP_ALGODIR_ENCRYPT, /*!< Encryption */
  48. CRYP_ALGODIR_DECRYPT /*!< Decryption */
  49. } CRYP_ALGODIR_T;
  50. /**
  51. * @brief CRYP Algorithm Mode
  52. */
  53. typedef enum
  54. {
  55. CRYP_ALGOMODE_TDES_ECB = 0x00, /*!< TDES ECB Mode */
  56. CRYP_ALGOMODE_TDES_CBC = 0x01, /*!< TDES CBC Mode */
  57. CRYP_ALGOMODE_DES_ECB = 0x02, /*!< DES ECB Mode */
  58. CRYP_ALGOMODE_DES_CBC = 0x03, /*!< DES CBC Mode */
  59. CRYP_ALGOMODE_AES_ECB = 0x04, /*!< AES ECB Mode */
  60. CRYP_ALGOMODE_AES_CBC = 0x05, /*!< AES CBC Mode */
  61. CRYP_ALGOMODE_AES_CTR = 0x06, /*!< AES CTR Mode */
  62. CRYP_ALGOMODE_AES_KEY = 0x07 /*!< AES KEY Mode */
  63. } CRYP_ALGOMODE_T;
  64. /**
  65. * @brief CRYP Data Type
  66. */
  67. typedef enum
  68. {
  69. CRYP_DATATYPE_32B, /*!< 32-bit data */
  70. CRYP_DATATYPE_16B, /*!< 16-bit or half-word data */
  71. CRYP_DATATYPE_8B, /*!< 8-bit or byte data */
  72. CRYP_DATATYPE_1B /*!< bit or bits */
  73. } CRYP_DATATYPE_T;
  74. /**
  75. * @brief CRYP Key Size (only AES)
  76. */
  77. typedef enum
  78. {
  79. CRYP_KEYSIZE_128B, /*!< 128-bit key size */
  80. CRYP_KEYSIZE_192B, /*!< 192-bit key size */
  81. CRYP_KEYSIZE_256B /*!< 256-bit key size */
  82. } CRYP_KEYSIZE_T;
  83. /**
  84. * @brief CRYP flag
  85. */
  86. typedef enum
  87. {
  88. CRYP_FLAG_IFEMPT = 0x01, /*!< Input FIFO Empty */
  89. CRYP_FLAG_IFFULL = 0x02, /*!< Input FIFO not Full */
  90. CRYP_FLAG_OFEMPT = 0x04, /*!< Output FIFO not Empty */
  91. CRYP_FLAG_OFFULL = 0x08, /*!< Output FIFO Full */
  92. CRYP_FLAG_BUSY = 0x10, /*!< Busy Bit */
  93. CRYP_FLAG_INISTS = 0x21, /*!< Input FIFO Service Raw Interrupt Status */
  94. CRYP_FLAG_OUTISTS = 0x22 /*!< Output FIFO Service Raw Interrupt Status */
  95. } CRYP_FLAG_T;
  96. /**
  97. * @brief CRYP interrupt
  98. */
  99. typedef enum
  100. {
  101. CRYP_INT_IN = 0x01, /*!< Input FIFO interrupt */
  102. CRYP_INT_OUT = 0x02 /*!< Output FIFO interrupt */
  103. } CRYP_INT_T;
  104. /**
  105. * @brief CRYP Encryption/Decryption_mode
  106. */
  107. typedef enum
  108. {
  109. CRYP_MODE_DECRYPT = 0x00, /*!< Encryption */
  110. CRYP_MODE_ENCRYPT = 0x01 /*!< Decryption */
  111. } CRYP_MODE_T;
  112. /**
  113. * @brief CRYP DMA transfer request
  114. */
  115. typedef enum
  116. {
  117. CRYP_DMAREQ_DATAIN = 0x01, /*!< DMA Input Enable */
  118. CRYP_DMAREQ_DATAOUT = 0x02 /*!< DMA Output Enable */
  119. } CRYP_DMAREQ_T;
  120. /**@} end of group CRYP_Enumerations*/
  121. /** @addtogroup CRYP_Structure Data Structure
  122. @{
  123. */
  124. /**
  125. * @brief CRYP Config structure definition
  126. */
  127. typedef struct
  128. {
  129. CRYP_ALGODIR_T algoDir; /*!< Algorithm Direction Select */
  130. CRYP_ALGOMODE_T algoMode; /*!< Algorithm Mode Select */
  131. CRYP_DATATYPE_T dataType; /*!< Data Type Select */
  132. CRYP_KEYSIZE_T keySize; /*!< Key Size Select */
  133. } CRYP_Config_T;
  134. /**
  135. * @brief CRYP KeyConfig structure definition
  136. */
  137. typedef struct
  138. {
  139. uint32_t key0Left; /*!< key0 left */
  140. uint32_t key0Right; /*!< key0 right */
  141. uint32_t key1Left; /*!< key1 left */
  142. uint32_t key1Right; /*!< key1 right */
  143. uint32_t key2Left; /*!< key2 left */
  144. uint32_t key2Right; /*!< key2 right */
  145. uint32_t key3Left; /*!< key3 left */
  146. uint32_t key3Right; /*!< key3 right */
  147. } CRYP_KeyConfig_T;
  148. /**
  149. * @brief CRYP Initialization Vectors (IV) structure definition
  150. */
  151. typedef struct
  152. {
  153. uint32_t IV0Left; /*!< Initialization Vector0 left */
  154. uint32_t IV0Right; /*!< Initialization Vector0 right */
  155. uint32_t IV1Left; /*!< Initialization Vector1 left */
  156. uint32_t IV1Right; /*!< Initialization Vector1 right */
  157. } CRYP_IVConfig_T;
  158. /**
  159. * @brief CRYP context swapping structure definition
  160. */
  161. typedef struct
  162. {
  163. /* Current Configuration */
  164. uint32_t curCTRL; /*!< Current Configuration */
  165. /* IV */
  166. uint32_t IV0L; /*!< Initialization Vector0 left */
  167. uint32_t IV0R; /*!< Initialization Vector0 right */
  168. uint32_t IV1L; /*!< Initialization Vector1 left */
  169. uint32_t IV1R; /*!< Initialization Vector1 right */
  170. /* KEY */
  171. uint32_t K0L; /*!< key0 left */
  172. uint32_t K0R; /*!< key0 right */
  173. uint32_t K1L; /*!< key1 left */
  174. uint32_t K1R; /*!< key1 right */
  175. uint32_t K2L; /*!< key2 left */
  176. uint32_t K2R; /*!< key2 right */
  177. uint32_t K3L; /*!< key3 left */
  178. uint32_t K3R; /*!< key3 right */
  179. } CRYP_Context_T;
  180. /**@} end of group CRYP_Structure*/
  181. /** @defgroup CRYP_Functions
  182. @{
  183. */
  184. /* CRYP Configuration */
  185. void CRYP_Reset(void);
  186. void CRYP_Config(CRYP_Config_T* crypConfig);
  187. void CRYP_ConfigStructInit(CRYP_Config_T* crypConfig);
  188. void CRYP_ConfigKey(CRYP_KeyConfig_T* keyConfig);
  189. void CRYP_ConfigKeyStructInit(CRYP_KeyConfig_T* keyConfig);
  190. void CRYP_ConfigIV(CRYP_IVConfig_T* IVConfig);
  191. void CRYP_ConfigIVStructInit(CRYP_IVConfig_T* IVConfig);
  192. void CRYP_Enable(void);
  193. void CRYP_Disable(void);
  194. void CRYP_FlushFIFO(void);
  195. /* CRYP Data processing */
  196. void CRYP_InData(uint32_t Data);
  197. uint32_t CRYP_OutData(void);
  198. /* CRYP Context swapping */
  199. uint32_t CRYP_SaveContext(CRYP_Context_T* context, CRYP_KeyConfig_T* keyConfig);
  200. void CRYP_RestoreContext(CRYP_Context_T* context);
  201. /* CRYP DMA */
  202. void CRYP_EnableDMA(CRYP_DMAREQ_T dmaReq);
  203. void CRYP_DisableDMA(CRYP_DMAREQ_T dmaReq);
  204. /* CRYP Interrupt and flag */
  205. void CRYP_EnableInterrupt(uint8_t interrupt);
  206. void CRYP_DisableInterrupt(uint8_t interrupt);
  207. uint8_t CRYP_ReadIntFlag(CRYP_INT_T flag);
  208. uint8_t CRYP_ReadStatusFlag(CRYP_FLAG_T flag);
  209. uint8_t CRYP_ReadCmdStatus(void);
  210. /* High Level AES */
  211. uint8_t CRYP_AES_ECB(CRYP_MODE_T mode, uint8_t *key, uint16_t keysize,
  212. uint8_t *input, uint32_t length, uint8_t *output);
  213. uint8_t CRYP_AES_CBC(CRYP_MODE_T mode, uint8_t *key, uint16_t keysize,
  214. uint8_t IV[16], uint8_t *input,
  215. uint32_t length, uint8_t *output);
  216. uint8_t CRYP_AES_CTR(CRYP_MODE_T mode, uint8_t *key, uint16_t keysize,
  217. uint8_t IV[16], uint8_t *input,
  218. uint32_t length, uint8_t *output);
  219. /* High Level DES */
  220. uint8_t CRYP_DES_ECB(CRYP_MODE_T mode, uint8_t key[8], uint8_t *input,
  221. uint32_t length, uint8_t *output);
  222. uint8_t CRYP_DES_CBC(CRYP_MODE_T mode, uint8_t key[8], uint8_t *input,
  223. uint8_t IV[8], uint32_t length, uint8_t *output);
  224. /* High Level TDES */
  225. uint8_t CRYP_TDES_ECB(CRYP_MODE_T mode, uint8_t key[24], uint8_t *input,
  226. uint32_t length, uint8_t *output);
  227. uint8_t CRYP_TDES_CBC(CRYP_MODE_T mode,uint8_t key[24], uint8_t *input,
  228. uint8_t IV[8], uint32_t length, uint8_t *output);
  229. #ifdef __cplusplus
  230. }
  231. #endif
  232. #endif /* __APM32F4XX_CRYP_H */
  233. /**@} end of group CRYP_Enumerations */
  234. /**@} end of group CRYP_Driver */
  235. /**@} end of group APM32F4xx_StdPeriphDriver */