]> git.sur5r.net Git - freertos/blob
d85c7e8b2b6dd8d4198e2818f5e401288a3b09de
[freertos] /
1 /***************************************************************************//**\r
2  * @file em_aes.h\r
3  * @brief Advanced encryption standard (AES) accelerator peripheral API for\r
4  *   EFM32.\r
5  * @version 4.0.0\r
6  *******************************************************************************\r
7  * @section License\r
8  * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>\r
9  *******************************************************************************\r
10  *\r
11  * Permission is granted to anyone to use this software for any purpose,\r
12  * including commercial applications, and to alter it and redistribute it\r
13  * freely, subject to the following restrictions:\r
14  *\r
15  * 1. The origin of this software must not be misrepresented; you must not\r
16  *    claim that you wrote the original software.\r
17  * 2. Altered source versions must be plainly marked as such, and must not be\r
18  *    misrepresented as being the original software.\r
19  * 3. This notice may not be removed or altered from any source distribution.\r
20  *\r
21  * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no\r
22  * obligation to support this Software. Silicon Labs is providing the\r
23  * Software "AS IS", with no express or implied warranties of any kind,\r
24  * including, but not limited to, any implied warranties of merchantability\r
25  * or fitness for any particular purpose or warranties against infringement\r
26  * of any proprietary rights of a third party.\r
27  *\r
28  * Silicon Labs will not be liable for any consequential, incidental, or\r
29  * special damages, or any other relief, or for any claim by any third party,\r
30  * arising from your use of this Software.\r
31  *\r
32  ******************************************************************************/\r
33 \r
34 \r
35 #ifndef __SILICON_LABS_EM_AES_H_\r
36 #define __SILICON_LABS_EM_AES_H_\r
37 \r
38 #include "em_device.h"\r
39 #if defined(AES_COUNT) && (AES_COUNT > 0)\r
40 \r
41 #include <stdbool.h>\r
42 \r
43 #ifdef __cplusplus\r
44 extern "C" {\r
45 #endif\r
46 \r
47 /***************************************************************************//**\r
48  * @addtogroup EM_Library\r
49  * @{\r
50  ******************************************************************************/\r
51 \r
52 /***************************************************************************//**\r
53  * @addtogroup AES\r
54  * @{\r
55  ******************************************************************************/\r
56 \r
57 /*******************************************************************************\r
58  ******************************   TYPEDEFS   ***********************************\r
59  ******************************************************************************/\r
60 \r
61 /**\r
62  * @brief\r
63  *   AES counter modification function pointer.\r
64  * @details\r
65  *   Parameters:\r
66  *   @li ctr - Ptr to byte array (16 bytes) holding counter to be modified.\r
67  */\r
68 typedef void (*AES_CtrFuncPtr_TypeDef)(uint8_t *ctr);\r
69 \r
70 /*******************************************************************************\r
71  *****************************   PROTOTYPES   **********************************\r
72  ******************************************************************************/\r
73 \r
74 void AES_CBC128(uint8_t *out,\r
75                 const uint8_t *in,\r
76                 unsigned int len,\r
77                 const uint8_t *key,\r
78                 const uint8_t *iv,\r
79                 bool encrypt);\r
80 \r
81 #if defined( AES_CTRL_AES256 )\r
82 void AES_CBC256(uint8_t *out,\r
83                 const uint8_t *in,\r
84                 unsigned int len,\r
85                 const uint8_t *key,\r
86                 const uint8_t *iv,\r
87                 bool encrypt);\r
88 #endif\r
89 \r
90 void AES_CFB128(uint8_t *out,\r
91                 const uint8_t *in,\r
92                 unsigned int len,\r
93                 const uint8_t *key,\r
94                 const uint8_t *iv,\r
95                 bool encrypt);\r
96 \r
97 #if defined( AES_CTRL_AES256 )\r
98 void AES_CFB256(uint8_t *out,\r
99                 const uint8_t *in,\r
100                 unsigned int len,\r
101                 const uint8_t *key,\r
102                 const uint8_t *iv,\r
103                 bool encrypt);\r
104 #endif\r
105 \r
106 void AES_CTR128(uint8_t *out,\r
107                 const uint8_t *in,\r
108                 unsigned int len,\r
109                 const uint8_t *key,\r
110                 uint8_t *ctr,\r
111                 AES_CtrFuncPtr_TypeDef ctrFunc);\r
112 \r
113 #if defined( AES_CTRL_AES256 )\r
114 void AES_CTR256(uint8_t *out,\r
115                 const uint8_t *in,\r
116                 unsigned int len,\r
117                 const uint8_t *key,\r
118                 uint8_t *ctr,\r
119                 AES_CtrFuncPtr_TypeDef ctrFunc);\r
120 #endif\r
121 \r
122 void AES_CTRUpdate32Bit(uint8_t *ctr);\r
123 \r
124 void AES_DecryptKey128(uint8_t *out, const uint8_t *in);\r
125 \r
126 #if defined( AES_CTRL_AES256 )\r
127 void AES_DecryptKey256(uint8_t *out, const uint8_t *in);\r
128 #endif\r
129 \r
130 void AES_ECB128(uint8_t *out,\r
131                 const uint8_t *in,\r
132                 unsigned int len,\r
133                 const uint8_t *key,\r
134                 bool encrypt);\r
135 \r
136 #if defined( AES_CTRL_AES256 )\r
137 void AES_ECB256(uint8_t *out,\r
138                 const uint8_t *in,\r
139                 unsigned int len,\r
140                 const uint8_t *key,\r
141                 bool encrypt);\r
142 #endif\r
143 \r
144 /***************************************************************************//**\r
145  * @brief\r
146  *   Clear one or more pending AES interrupts.\r
147  *\r
148  * @param[in] flags\r
149  *   Pending AES interrupt source to clear. Use a bitwise logic OR combination of\r
150  *   valid interrupt flags for the AES module (AES_IF_nnn).\r
151  ******************************************************************************/\r
152 __STATIC_INLINE void AES_IntClear(uint32_t flags)\r
153 {\r
154   AES->IFC = flags;\r
155 }\r
156 \r
157 \r
158 /***************************************************************************//**\r
159  * @brief\r
160  *   Disable one or more AES interrupts.\r
161  *\r
162  * @param[in] flags\r
163  *   AES interrupt sources to disable. Use a bitwise logic OR combination of\r
164  *   valid interrupt flags for the AES module (AES_IF_nnn).\r
165  ******************************************************************************/\r
166 __STATIC_INLINE void AES_IntDisable(uint32_t flags)\r
167 {\r
168   AES->IEN &= ~(flags);\r
169 }\r
170 \r
171 \r
172 /***************************************************************************//**\r
173  * @brief\r
174  *   Enable one or more AES interrupts.\r
175  *\r
176  * @note\r
177  *   Depending on the use, a pending interrupt may already be set prior to\r
178  *   enabling the interrupt. Consider using AES_IntClear() prior to enabling\r
179  *   if such a pending interrupt should be ignored.\r
180  *\r
181  * @param[in] flags\r
182  *   AES interrupt sources to enable. Use a bitwise logic OR combination of\r
183  *   valid interrupt flags for the AES module (AES_IF_nnn).\r
184  ******************************************************************************/\r
185 __STATIC_INLINE void AES_IntEnable(uint32_t flags)\r
186 {\r
187   AES->IEN |= flags;\r
188 }\r
189 \r
190 \r
191 /***************************************************************************//**\r
192  * @brief\r
193  *   Get pending AES interrupt flags.\r
194  *\r
195  * @note\r
196  *   The event bits are not cleared by the use of this function.\r
197  *\r
198  * @return\r
199  *   AES interrupt sources pending. A bitwise logic OR combination of valid\r
200  *   interrupt flags for the AES module (AES_IF_nnn).\r
201  ******************************************************************************/\r
202 __STATIC_INLINE uint32_t AES_IntGet(void)\r
203 {\r
204   return(AES->IF);\r
205 }\r
206 \r
207 \r
208 /***************************************************************************//**\r
209  * @brief\r
210  *   Set one or more pending AES interrupts from SW.\r
211  *\r
212  * @param[in] flags\r
213  *   AES interrupt sources to set to pending. Use a bitwise logic OR combination\r
214  *   of valid interrupt flags for the AES module (AES_IF_nnn).\r
215  ******************************************************************************/\r
216 __STATIC_INLINE void AES_IntSet(uint32_t flags)\r
217 {\r
218   AES->IFS = flags;\r
219 }\r
220 \r
221 \r
222 void AES_OFB128(uint8_t *out,\r
223                 const uint8_t *in,\r
224                 unsigned int len,\r
225                 const uint8_t *key,\r
226                 const uint8_t *iv);\r
227 \r
228 #if defined( AES_CTRL_AES256 )\r
229 void AES_OFB256(uint8_t *out,\r
230                 const uint8_t *in,\r
231                 unsigned int len,\r
232                 const uint8_t *key,\r
233                 const uint8_t *iv);\r
234 #endif\r
235 \r
236 \r
237 /** @} (end addtogroup AES) */\r
238 /** @} (end addtogroup EM_Library) */\r
239 \r
240 #ifdef __cplusplus\r
241 }\r
242 #endif\r
243 \r
244 #endif /* defined(AES_COUNT) && (AES_COUNT > 0) */\r
245 #endif /* __SILICON_LABS_EM_AES_H_ */\r
246 \r
247 \r