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 26 /* Define to prevent recursive inclusion */ 27 #ifndef __APM32F4XX_CRYP_H 28 #define __APM32F4XX_CRYP_H 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 /* Includes */ 35 #include "apm32f4xx.h" 36 37 /** @addtogroup APM32F4xx_StdPeriphDriver 38 @{ 39 */ 40 41 /** @addtogroup CRYP_Driver 42 @{ 43 */ 44 45 /** @defgroup CRYP_Enumerations 46 @{ 47 */ 48 49 /** 50 * @brief CRYP Algorithm Direction 51 */ 52 typedef enum 53 { 54 CRYP_ALGODIR_ENCRYPT, /*!< Encryption */ 55 CRYP_ALGODIR_DECRYPT /*!< Decryption */ 56 } CRYP_ALGODIR_T; 57 58 /** 59 * @brief CRYP Algorithm Mode 60 */ 61 typedef enum 62 { 63 CRYP_ALGOMODE_TDES_ECB = 0x00, /*!< TDES ECB Mode */ 64 CRYP_ALGOMODE_TDES_CBC = 0x01, /*!< TDES CBC Mode */ 65 CRYP_ALGOMODE_DES_ECB = 0x02, /*!< DES ECB Mode */ 66 CRYP_ALGOMODE_DES_CBC = 0x03, /*!< DES CBC Mode */ 67 CRYP_ALGOMODE_AES_ECB = 0x04, /*!< AES ECB Mode */ 68 CRYP_ALGOMODE_AES_CBC = 0x05, /*!< AES CBC Mode */ 69 CRYP_ALGOMODE_AES_CTR = 0x06, /*!< AES CTR Mode */ 70 CRYP_ALGOMODE_AES_KEY = 0x07 /*!< AES KEY Mode */ 71 } CRYP_ALGOMODE_T; 72 73 /** 74 * @brief CRYP Data Type 75 */ 76 typedef enum 77 { 78 CRYP_DATATYPE_32B, /*!< 32-bit data */ 79 CRYP_DATATYPE_16B, /*!< 16-bit or half-word data */ 80 CRYP_DATATYPE_8B, /*!< 8-bit or byte data */ 81 CRYP_DATATYPE_1B /*!< bit or bits */ 82 } CRYP_DATATYPE_T; 83 84 /** 85 * @brief CRYP Key Size (only AES) 86 */ 87 typedef enum 88 { 89 CRYP_KEYSIZE_128B, /*!< 128-bit key size */ 90 CRYP_KEYSIZE_192B, /*!< 192-bit key size */ 91 CRYP_KEYSIZE_256B /*!< 256-bit key size */ 92 } CRYP_KEYSIZE_T; 93 94 /** 95 * @brief CRYP flag 96 */ 97 typedef enum 98 { 99 CRYP_FLAG_IFEMPT = 0x01, /*!< Input FIFO Empty */ 100 CRYP_FLAG_IFFULL = 0x02, /*!< Input FIFO not Full */ 101 CRYP_FLAG_OFEMPT = 0x04, /*!< Output FIFO not Empty */ 102 CRYP_FLAG_OFFULL = 0x08, /*!< Output FIFO Full */ 103 CRYP_FLAG_BUSY = 0x10, /*!< Busy Bit */ 104 CRYP_FLAG_INISTS = 0x21, /*!< Input FIFO Service Raw Interrupt Status */ 105 CRYP_FLAG_OUTISTS = 0x22 /*!< Output FIFO Service Raw Interrupt Status */ 106 } CRYP_FLAG_T; 107 108 /** 109 * @brief CRYP interrupt 110 */ 111 typedef enum 112 { 113 CRYP_INT_IN = 0x01, /*!< Input FIFO interrupt */ 114 CRYP_INT_OUT = 0x02 /*!< Output FIFO interrupt */ 115 } CRYP_INT_T; 116 117 /** 118 * @brief CRYP Encryption/Decryption_mode 119 */ 120 typedef enum 121 { 122 CRYP_MODE_DECRYPT = 0x00, /*!< Encryption */ 123 CRYP_MODE_ENCRYPT = 0x01 /*!< Decryption */ 124 } CRYP_MODE_T; 125 126 /** 127 * @brief CRYP DMA transfer request 128 */ 129 typedef enum 130 { 131 CRYP_DMAREQ_DATAIN = 0x01, /*!< DMA Input Enable */ 132 CRYP_DMAREQ_DATAOUT = 0x02 /*!< DMA Output Enable */ 133 } CRYP_DMAREQ_T; 134 135 /**@} end of group CRYP_Enumerations*/ 136 137 /** @addtogroup CRYP_Structure Data Structure 138 @{ 139 */ 140 141 /** 142 * @brief CRYP Config structure definition 143 */ 144 typedef struct 145 { 146 CRYP_ALGODIR_T algoDir; /*!< Algorithm Direction Select */ 147 CRYP_ALGOMODE_T algoMode; /*!< Algorithm Mode Select */ 148 CRYP_DATATYPE_T dataType; /*!< Data Type Select */ 149 CRYP_KEYSIZE_T keySize; /*!< Key Size Select */ 150 } CRYP_Config_T; 151 152 /** 153 * @brief CRYP KeyConfig structure definition 154 */ 155 typedef struct 156 { 157 uint32_t key0Left; /*!< key0 left */ 158 uint32_t key0Right; /*!< key0 right */ 159 uint32_t key1Left; /*!< key1 left */ 160 uint32_t key1Right; /*!< key1 right */ 161 uint32_t key2Left; /*!< key2 left */ 162 uint32_t key2Right; /*!< key2 right */ 163 uint32_t key3Left; /*!< key3 left */ 164 uint32_t key3Right; /*!< key3 right */ 165 } CRYP_KeyConfig_T; 166 167 /** 168 * @brief CRYP Initialization Vectors (IV) structure definition 169 */ 170 typedef struct 171 { 172 uint32_t IV0Left; /*!< Initialization Vector0 left */ 173 uint32_t IV0Right; /*!< Initialization Vector0 right */ 174 uint32_t IV1Left; /*!< Initialization Vector1 left */ 175 uint32_t IV1Right; /*!< Initialization Vector1 right */ 176 } CRYP_IVConfig_T; 177 178 /** 179 * @brief CRYP context swapping structure definition 180 */ 181 typedef struct 182 { 183 /* Current Configuration */ 184 uint32_t curCTRL; /*!< Current Configuration */ 185 /* IV */ 186 uint32_t IV0L; /*!< Initialization Vector0 left */ 187 uint32_t IV0R; /*!< Initialization Vector0 right */ 188 uint32_t IV1L; /*!< Initialization Vector1 left */ 189 uint32_t IV1R; /*!< Initialization Vector1 right */ 190 /* KEY */ 191 uint32_t K0L; /*!< key0 left */ 192 uint32_t K0R; /*!< key0 right */ 193 uint32_t K1L; /*!< key1 left */ 194 uint32_t K1R; /*!< key1 right */ 195 uint32_t K2L; /*!< key2 left */ 196 uint32_t K2R; /*!< key2 right */ 197 uint32_t K3L; /*!< key3 left */ 198 uint32_t K3R; /*!< key3 right */ 199 } CRYP_Context_T; 200 201 /**@} end of group CRYP_Structure*/ 202 203 /** @defgroup CRYP_Functions 204 @{ 205 */ 206 207 /* CRYP Configuration */ 208 void CRYP_Reset(void); 209 void CRYP_Config(CRYP_Config_T* crypConfig); 210 void CRYP_ConfigStructInit(CRYP_Config_T* crypConfig); 211 void CRYP_ConfigKey(CRYP_KeyConfig_T* keyConfig); 212 void CRYP_ConfigKeyStructInit(CRYP_KeyConfig_T* keyConfig); 213 void CRYP_ConfigIV(CRYP_IVConfig_T* IVConfig); 214 void CRYP_ConfigIVStructInit(CRYP_IVConfig_T* IVConfig); 215 void CRYP_Enable(void); 216 void CRYP_Disable(void); 217 void CRYP_FlushFIFO(void); 218 219 /* CRYP Data processing */ 220 void CRYP_InData(uint32_t Data); 221 uint32_t CRYP_OutData(void); 222 223 /* CRYP Context swapping */ 224 uint32_t CRYP_SaveContext(CRYP_Context_T* context, CRYP_KeyConfig_T* keyConfig); 225 void CRYP_RestoreContext(CRYP_Context_T* context); 226 227 /* CRYP DMA */ 228 void CRYP_EnableDMA(CRYP_DMAREQ_T dmaReq); 229 void CRYP_DisableDMA(CRYP_DMAREQ_T dmaReq); 230 231 /* CRYP Interrupt and flag */ 232 void CRYP_EnableInterrupt(uint8_t interrupt); 233 void CRYP_DisableInterrupt(uint8_t interrupt); 234 uint8_t CRYP_ReadIntFlag(CRYP_INT_T flag); 235 uint8_t CRYP_ReadStatusFlag(CRYP_FLAG_T flag); 236 uint8_t CRYP_ReadCmdStatus(void); 237 238 /* High Level AES */ 239 uint8_t CRYP_AES_ECB(CRYP_MODE_T mode, uint8_t *key, uint16_t keysize, 240 uint8_t *input, uint32_t length, uint8_t *output); 241 242 uint8_t CRYP_AES_CBC(CRYP_MODE_T mode, uint8_t *key, uint16_t keysize, 243 uint8_t IV[16], uint8_t *input, 244 uint32_t length, uint8_t *output); 245 246 uint8_t CRYP_AES_CTR(CRYP_MODE_T mode, uint8_t *key, uint16_t keysize, 247 uint8_t IV[16], uint8_t *input, 248 uint32_t length, uint8_t *output); 249 250 /* High Level DES */ 251 uint8_t CRYP_DES_ECB(CRYP_MODE_T mode, uint8_t key[8], uint8_t *input, 252 uint32_t length, uint8_t *output); 253 254 uint8_t CRYP_DES_CBC(CRYP_MODE_T mode, uint8_t key[8], uint8_t *input, 255 uint8_t IV[8], uint32_t length, uint8_t *output); 256 257 /* High Level TDES */ 258 uint8_t CRYP_TDES_ECB(CRYP_MODE_T mode, uint8_t key[24], uint8_t *input, 259 uint32_t length, uint8_t *output); 260 261 uint8_t CRYP_TDES_CBC(CRYP_MODE_T mode,uint8_t key[24], uint8_t *input, 262 uint8_t IV[8], uint32_t length, uint8_t *output); 263 264 #ifdef __cplusplus 265 } 266 #endif 267 268 #endif /* __APM32F4XX_CRYP_H */ 269 270 /**@} end of group CRYP_Enumerations */ 271 /**@} end of group CRYP_Driver */ 272 /**@} end of group APM32F4xx_StdPeriphDriver */ 273