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