]> git.sur5r.net Git - freertos/blob
ffde399de04c06860be70f3b981b5a1a151dde97
[freertos] /
1 /**\r
2   ******************************************************************************\r
3   * @file    stm32l1xx_aes.c\r
4   * @author  MCD Application Team\r
5   * @version V1.1.1\r
6   * @date    05-March-2012\r
7   * @brief   This file provides firmware functions to manage the following \r
8   *          functionalities of the AES peripheral:           \r
9   *           + Configuration\r
10   *           + Read/Write operations\r
11   *           + DMA transfers management  \r
12   *           + Interrupts and flags management\r
13   * \r
14   *  @verbatim\r
15  ===============================================================================\r
16                         ##### AES Peripheral features #####\r
17  ===============================================================================\r
18 ....[..]\r
19    (#) The Advanced Encryption Standard hardware accelerator (AES) can be used\r
20        to both encipher and decipher data using AES algorithm.\r
21    (#) The AES supports 4 operation modes:\r
22        (++) Encryption: It consumes 214 clock cycle when processing one 128-bit block\r
23        (++) Decryption: It consumes 214 clock cycle when processing one 128-bit block\r
24        (++) Key derivation for decryption: It consumes 80 clock cycle when processing one 128-bit block\r
25        (++) Key Derivation and decryption: It consumes 288 clock cycle when processing one 128-bit blobk\r
26    (#) Moreover 3 chaining modes are supported:\r
27        (++) Electronic codebook (ECB): Each plain text is encrypted/decrypted separately\r
28        (++) Cipher block chaining (CBC): Each block is XORed with the previous block\r
29        (++) Counter mode (CTR): A 128-bit counter is encrypted and then XORed with the\r
30           plain text to give the cipher text\r
31   (#) The AES peripheral supports data swapping: 1-bit, 8-bit, 16-bit and 32-bit.\r
32   (#) The AES peripheral supports write/read error handling with interrupt capability.\r
33   (#) Automatic data flow control with support of direct memory access (DMA) using\r
34       2 channels, one for incoming data (DMA2 Channel5), and one for outcoming data\r
35       (DMA2 Channel3).\r
36 \r
37                       ##### How to use this driver #####\r
38  ===============================================================================\r
39     [..]\r
40         (#) AES AHB clock must be enabled to get write access to AES registers \r
41             using RCC_AHBPeriphClockCmd(RCC_AHBPeriph_AES, ENABLE).\r
42         (#) Initialize the key using AES_KeyInit().\r
43         (#) Configure the AES operation mode using AES_Init().\r
44         (#) If required, enable interrupt source using AES_ITConfig() and\r
45             enable the AES interrupt vector using NVIC_Init().\r
46         (#) If required, when using the DMA mode.\r
47             (##) Configure the DMA using DMA_Init().\r
48             (##) Enable DMA requests using AES_DMAConfig().\r
49         (#) Enable the AES peripheral using AES_Cmd().\r
50     @endverbatim\r
51   \r
52   ******************************************************************************\r
53   * @attention\r
54   *\r
55   * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>\r
56   *\r
57   * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
58   * You may not use this file except in compliance with the License.\r
59   * You may obtain a copy of the License at:\r
60   *\r
61   *        http://www.st.com/software_license_agreement_liberty_v2\r
62   *\r
63   * Unless required by applicable law or agreed to in writing, software \r
64   * distributed under the License is distributed on an "AS IS" BASIS, \r
65   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
66   * See the License for the specific language governing permissions and\r
67   * limitations under the License.\r
68   *\r
69   ******************************************************************************\r
70   */\r
71 \r
72 /* Includes ------------------------------------------------------------------*/\r
73 #include "stm32l1xx_aes.h"\r
74 #include "stm32l1xx_rcc.h"\r
75 \r
76 /** @addtogroup STM32L1xx_StdPeriph_Driver\r
77   * @{\r
78   */\r
79 \r
80 /** @defgroup AES \r
81   * @brief AES driver modules\r
82   * @{\r
83   */ \r
84 \r
85 /* Private typedef -----------------------------------------------------------*/\r
86 /* Private define ------------------------------------------------------------*/\r
87 #define CR_CLEAR_MASK  ((uint32_t)0xFFFFFF81)\r
88 \r
89 /* Private macro -------------------------------------------------------------*/\r
90 /* Private variables ---------------------------------------------------------*/\r
91 /* Private function prototypes -----------------------------------------------*/\r
92 /* Private functions ---------------------------------------------------------*/\r
93 \r
94 /** @defgroup AES_Private_Functions\r
95   * @{\r
96   */\r
97 \r
98 /** @defgroup AES_Group1 Initialization and configuration\r
99  *  @brief   Initialization and configuration.\r
100  *\r
101 @verbatim\r
102  ===============================================================================\r
103                 ##### Initialization and configuration #####\r
104  ===============================================================================\r
105 \r
106 @endverbatim\r
107   * @{\r
108   */  \r
109 \r
110   /**\r
111   * @brief  Deinitializes AES peripheral registers to their default reset values.\r
112   * @param  None\r
113   * @retval None\r
114   */\r
115 void AES_DeInit(void)\r
116 {\r
117   /* Enable AES reset state */\r
118   RCC_AHBPeriphResetCmd(RCC_AHBPeriph_AES, ENABLE);\r
119   /* Release AES from reset state */\r
120   RCC_AHBPeriphResetCmd(RCC_AHBPeriph_AES, DISABLE);\r
121 }\r
122 \r
123 /**\r
124   * @brief  Initializes the AES peripheral according to the specified parameters\r
125   *         in the AES_InitStruct:\r
126   *           - AES_Operation: specifies the operation mode (encryption, decryption...).\r
127   *           - AES_Chaining: specifies the chaining mode (ECB, CBC or CTR).\r
128   *           - AES_DataType: specifies the data swapping type: 32-bit, 16-bit, 8-bit or 1-bit.\r
129   * @note   If AES is already enabled, use AES_Cmd(DISABLE) before setting the new \r
130   *         configuration (When AES is enabled, setting configuration is forbidden).\r
131   * @param  AES_InitStruct: pointer to an AES_InitTypeDef structure that contains \r
132   *         the configuration information for AES peripheral.\r
133   * @retval None\r
134   */\r
135 void AES_Init(AES_InitTypeDef* AES_InitStruct)\r
136 {\r
137   uint32_t tmpreg = 0;\r
138   \r
139   /* Check the parameters */\r
140   assert_param(IS_AES_MODE(AES_InitStruct->AES_Operation));\r
141   assert_param(IS_AES_CHAINING(AES_InitStruct->AES_Chaining));\r
142   assert_param(IS_AES_DATATYPE(AES_InitStruct->AES_DataType));\r
143 \r
144   /* Get AES CR register value */\r
145   tmpreg = AES->CR;\r
146   \r
147   /* Clear DATATYPE[1:0], MODE[1:0] and CHMOD[1:0] bits */\r
148   tmpreg &= (uint32_t)CR_CLEAR_MASK;\r
149   \r
150   tmpreg |= (AES_InitStruct->AES_Operation | AES_InitStruct->AES_Chaining | AES_InitStruct->AES_DataType);\r
151 \r
152   AES->CR = (uint32_t) tmpreg;\r
153 }\r
154 \r
155 /**\r
156   * @brief  Initializes the AES Keys according to the specified parameters in the AES_KeyInitStruct.\r
157   * @param  AES_KeyInitStruct: pointer to an AES_KeyInitTypeDef structure that\r
158   *         contains the configuration information for the specified AES Keys.\r
159   * @note   This function must be called while the AES is disabled.\r
160   * @note   In encryption, key derivation and key derivation + decryption modes,\r
161   *         AES_KeyInitStruct must contain the encryption key.\r
162   *         In decryption mode, AES_KeyInitStruct must contain the decryption key.\r
163   * @retval None\r
164   */\r
165 void AES_KeyInit(AES_KeyInitTypeDef* AES_KeyInitStruct)\r
166 {\r
167   AES->KEYR0 = AES_KeyInitStruct->AES_Key0;\r
168   AES->KEYR1 = AES_KeyInitStruct->AES_Key1;\r
169   AES->KEYR2 = AES_KeyInitStruct->AES_Key2;\r
170   AES->KEYR3 = AES_KeyInitStruct->AES_Key3;\r
171 }\r
172 \r
173 /**\r
174   * @brief  Initializes the AES Initialization Vector IV according to \r
175   *         the specified parameters in the AES_IVInitStruct.\r
176   * @param  AES_KeyInitStruct: pointer to an AES_IVInitTypeDef structure that\r
177   *         contains the configuration information for the specified AES IV.\r
178   * @note   When ECB chaining mode is selected, Initialization Vector IV has no\r
179   *         meaning.\r
180   *         When CTR chaining mode is selected, AES_IV0 contains the CTR value.\r
181   *         AES_IV1, AES_IV2 and AES_IV3 contains nonce value.\r
182   * @retval None\r
183   */\r
184 void AES_IVInit(AES_IVInitTypeDef* AES_IVInitStruct)\r
185 {\r
186   AES->IVR0 = AES_IVInitStruct->AES_IV0;\r
187   AES->IVR1 = AES_IVInitStruct->AES_IV1;\r
188   AES->IVR2 = AES_IVInitStruct->AES_IV2;\r
189   AES->IVR3 = AES_IVInitStruct->AES_IV3;\r
190 }\r
191 \r
192 /**\r
193   * @brief  Enable or disable the AES peripheral.\r
194   * @param  NewState: new state of the AES peripheral.\r
195   *         This parameter can be: ENABLE or DISABLE.\r
196   * @note   The key must be written while AES is disabled.\r
197   * @retval None\r
198   */\r
199 void AES_Cmd(FunctionalState NewState)\r
200 {\r
201   /* Check the parameter */\r
202   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
203 \r
204   if (NewState != DISABLE)\r
205   {\r
206     /* Enable the AES peripheral */\r
207     AES->CR |= (uint32_t) AES_CR_EN;   /**< AES Enable */\r
208   }\r
209   else\r
210   {\r
211     /* Disable the AES peripheral */\r
212     AES->CR &= (uint32_t)(~AES_CR_EN);  /**< AES Disable */\r
213   }\r
214 }\r
215 \r
216 /**\r
217   * @}\r
218   */\r
219 \r
220 /** @defgroup AES_Group2 Structures initialization functions\r
221  *  @brief   Structures initialization.\r
222  *\r
223 @verbatim\r
224  ===============================================================================\r
225               ##### Structures initialization functions #####\r
226  ===============================================================================\r
227 \r
228 @endverbatim\r
229   * @{\r
230   */\r
231 \r
232 /**\r
233   * @brief  Fills each AES_InitStruct member with its default value.\r
234   * @param  AES_InitStruct: pointer to an AES_InitTypeDef structure which will \r
235   *         be initialized.\r
236   * @retval None\r
237   */\r
238 void AES_StructInit(AES_InitTypeDef* AES_InitStruct)\r
239 {\r
240   AES_InitStruct->AES_Operation = AES_Operation_Encryp;\r
241   AES_InitStruct->AES_Chaining = AES_Chaining_ECB;\r
242   AES_InitStruct->AES_DataType = AES_DataType_32b;\r
243 }\r
244 \r
245 /**\r
246   * @brief  Fills each AES_KeyInitStruct member with its default value.\r
247   * @param  AES_KeyInitStruct: pointer to an AES_KeyInitStruct structure which \r
248   *         will be initialized.\r
249   * @retval None\r
250   */\r
251 void AES_KeyStructInit(AES_KeyInitTypeDef* AES_KeyInitStruct)\r
252 {\r
253   AES_KeyInitStruct->AES_Key0 = 0x00000000;\r
254   AES_KeyInitStruct->AES_Key1 = 0x00000000;\r
255   AES_KeyInitStruct->AES_Key2 = 0x00000000;\r
256   AES_KeyInitStruct->AES_Key3 = 0x00000000;\r
257 }\r
258 \r
259 /**\r
260   * @brief  Fills each AES_IVInitStruct member with its default value.\r
261   * @param  AES_IVInitStruct: pointer to an AES_IVInitTypeDef structure which\r
262   *         will be initialized.\r
263   * @retval None\r
264   */\r
265 void AES_IVStructInit(AES_IVInitTypeDef* AES_IVInitStruct)\r
266 {\r
267   AES_IVInitStruct->AES_IV0 = 0x00000000;\r
268   AES_IVInitStruct->AES_IV1 = 0x00000000;\r
269   AES_IVInitStruct->AES_IV2 = 0x00000000;\r
270   AES_IVInitStruct->AES_IV3 = 0x00000000;\r
271 }\r
272 \r
273 /**\r
274   * @}\r
275   */\r
276 \r
277 /** @defgroup AES_Group3 AES Read and Write\r
278  *  @brief   AES Read and Write.\r
279  *\r
280 @verbatim\r
281  ===============================================================================\r
282                   ##### AES Read and Write functions #####\r
283  ===============================================================================\r
284 \r
285 @endverbatim\r
286   * @{\r
287   */\r
288 \r
289 /**\r
290   * @brief  Write data in DINR register to be processed by AES peripheral.\r
291   * @note   To process 128-bit data (4 * 32-bit), this function must be called\r
292   *         four times to write the 128-bit data in the 32-bit register DINR.\r
293   * @note   When an unexpected write to DOUTR register is detected, WRERR flag is\r
294   *         set.\r
295   * @param  Data: The data to be processed.\r
296   * @retval None\r
297   */\r
298 void AES_WriteSubData(uint32_t Data)\r
299 {\r
300   /* Write Data */\r
301   AES->DINR = Data;\r
302 }\r
303 \r
304 /**\r
305   * @brief  Returns the data in DOUTR register processed by AES peripheral.\r
306   * @note   This function must be called four times to get the 128-bit data.\r
307   * @note   When an unexpected read of DINR register is detected, RDERR flag is\r
308   *         set.\r
309   * @retval The processed data.\r
310   */\r
311 uint32_t AES_ReadSubData(void)\r
312 {\r
313   /* Read Data */\r
314   return AES->DOUTR;\r
315 }\r
316 \r
317 /**\r
318   * @brief  Read the Key value.\r
319   * @param  AES_KeyInitStruct: pointer to an AES_KeyInitTypeDef structure which\r
320   *         will contain the key.\r
321   * @note   When the key derivation mode is selected, AES must be disabled\r
322   *         (AES_Cmd(DISABLE)) before reading the decryption key.\r
323   *         Reading the key while the AES is enabled will return unpredictable\r
324   *         value.\r
325   * @retval None\r
326   */\r
327 void AES_ReadKey(AES_KeyInitTypeDef* AES_KeyInitStruct)\r
328 {\r
329   AES_KeyInitStruct->AES_Key0 = AES->KEYR0;\r
330   AES_KeyInitStruct->AES_Key1 = AES->KEYR1;\r
331   AES_KeyInitStruct->AES_Key2 = AES->KEYR2;\r
332   AES_KeyInitStruct->AES_Key3 = AES->KEYR3;\r
333 }\r
334 \r
335 /**\r
336   * @brief  Read the Initialization Vector IV value.\r
337   * @param  AES_IVInitStruct: pointer to an AES_IVInitTypeDef structure which\r
338   *         will contain the Initialization Vector IV.\r
339   * @note   When the AES is enabled Reading the Initialization Vector IV value\r
340   *         will return 0. The AES must be disabled using AES_Cmd(DISABLE)\r
341   *         to get the right value.\r
342   * @note   When ECB chaining mode is selected, Initialization Vector IV has no\r
343   *         meaning.\r
344   *         When CTR chaining mode is selected, AES_IV0 contains 32-bit Counter value.\r
345   *         AES_IV1, AES_IV2 and AES_IV3 contains nonce value.\r
346   * @retval None\r
347   */\r
348 void AES_ReadIV(AES_IVInitTypeDef* AES_IVInitStruct)\r
349 {\r
350   AES_IVInitStruct->AES_IV0 = AES->IVR0;\r
351   AES_IVInitStruct->AES_IV1 = AES->IVR1;\r
352   AES_IVInitStruct->AES_IV2 = AES->IVR2;\r
353   AES_IVInitStruct->AES_IV3 = AES->IVR3;\r
354 }\r
355 \r
356 /**\r
357   * @}\r
358   */\r
359 \r
360 /** @defgroup AES_Group4 DMA transfers management functions\r
361  *  @brief   DMA transfers management function.\r
362  *\r
363 @verbatim\r
364  ===============================================================================\r
365                ##### DMA transfers management functions #####\r
366  ===============================================================================\r
367 \r
368 @endverbatim\r
369   * @{\r
370   */\r
371 \r
372 /**\r
373   * @brief  Configures the AES DMA interface.\r
374   * @param  AES_DMATransfer: Specifies the AES DMA transfer.\r
375   *   This parameter can be one of the following values:\r
376   *     @arg AES_DMATransfer_In: When selected, DMA manages the data input phase.\r
377   *     @arg AES_DMATransfer_Out: When selected, DMA manages the data output phase.\r
378   *     @arg AES_DMATransfer_InOut: When selected, DMA manages both the data input/output phases.\r
379   * @param  NewState Indicates the new state of the AES DMA interface.\r
380   *           This parameter can be: ENABLE or DISABLE.\r
381   * @note   The DMA has no action in key derivation mode.\r
382   * @retval None\r
383   */\r
384 void AES_DMAConfig(uint32_t AES_DMATransfer, FunctionalState NewState)\r
385 {\r
386   /* Check the parameter */\r
387   assert_param(IS_AES_DMA_TRANSFER(AES_DMATransfer));\r
388 \r
389   if (NewState != DISABLE)\r
390   {\r
391     /* Enable the DMA transfer */\r
392     AES->CR |= (uint32_t) AES_DMATransfer;\r
393   }\r
394   else\r
395   {\r
396     /* Disable the DMA transfer */\r
397     AES->CR &= (uint32_t)(~AES_DMATransfer);\r
398   }\r
399 }\r
400 \r
401 /**\r
402   * @}\r
403   */\r
404 \r
405 /** @defgroup AES_Group5 Interrupts and flags management functions\r
406  *  @brief   Interrupts and flags management functions.\r
407  *\r
408 @verbatim\r
409 \r
410  ===============================================================================\r
411            ##### Interrupts and flags management functions #####\r
412  ===============================================================================\r
413 @endverbatim\r
414   * @{\r
415   */\r
416 \r
417 /**\r
418   * @brief  Enables or disables the specified AES interrupt.\r
419   * @param  AES_IT: Specifies the AES interrupt source to enable/disable.\r
420   *     This parameter can be any combinations of the following values:\r
421   *     @arg AES_IT_CC: Computation Complete Interrupt. If enabled, once CCF \r
422   *                     flag is set an interrupt is generated.\r
423   *     @arg AES_IT_ERR: Error Interrupt. If enabled, once a read error\r
424   *                      flags (RDERR) or write error flag (WRERR) is set,\r
425   *                      an interrupt is generated.\r
426   * @param  NewState: The new state of the AES interrupt source.\r
427   *                   This parameter can be: ENABLE or DISABLE.\r
428   * @retval None\r
429   */\r
430 void AES_ITConfig(uint32_t AES_IT, FunctionalState NewState)\r
431 {\r
432   /* Check the parameters */\r
433   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
434   assert_param(IS_AES_IT(AES_IT));\r
435 \r
436   if (NewState != DISABLE)\r
437   {\r
438     AES->CR |= (uint32_t) AES_IT;    /**< AES_IT Enable */\r
439   }\r
440   else\r
441   {\r
442     AES->CR &= (uint32_t)(~AES_IT);  /**< AES_IT Disable */\r
443   }\r
444 }\r
445 \r
446 /**\r
447   * @brief  Checks whether the specified AES flag is set or not.\r
448   * @param  AES_FLAG specifies the flag to check.\r
449   *   This parameter can be one of the following values:\r
450   *     @arg AES_FLAG_CCF: Computation Complete Flag is set by hardware when\r
451   *                        he computation phase is completed.\r
452   *     @arg AES_FLAG_RDERR: Read Error Flag is set when an unexpected read\r
453   *                          operation of DOUTR register is detected.\r
454   *     @arg AES_FLAG_WRERR: Write Error Flag  is set when an unexpected write\r
455   *                          operation in DINR is detected.\r
456   * @retval FlagStatus (SET or RESET)\r
457   */\r
458 FlagStatus AES_GetFlagStatus(uint32_t AES_FLAG)\r
459 {\r
460   FlagStatus bitstatus = RESET;\r
461 \r
462   /* Check parameters */\r
463   assert_param(IS_AES_FLAG(AES_FLAG));\r
464 \r
465   if ((AES->SR & AES_FLAG) != (uint32_t)RESET)\r
466   {\r
467     bitstatus = SET;\r
468   }\r
469   else\r
470   {\r
471     bitstatus = RESET;\r
472   }\r
473     \r
474   /* Return the AES_FLAG status */\r
475   return  bitstatus;\r
476 }\r
477 \r
478 /**\r
479   * @brief  Clears the AES flags.\r
480   * @param  AES_FLAG: specifies the flag to clear.\r
481   *         This parameter can be:\r
482   *     @arg AES_FLAG_CCF: Computation Complete Flag is cleared by setting CCFC\r
483   *                        bit in CR register.\r
484   *     @arg AES_FLAG_RDERR: Read Error is cleared by setting ERRC bit in \r
485   *                          CR register.\r
486   *     @arg AES_FLAG_WRERR: Write Error is cleared by setting ERRC bit in\r
487   *                          CR register.\r
488   * @retval None\r
489   */\r
490 void AES_ClearFlag(uint32_t AES_FLAG)\r
491 {\r
492   /* Check the parameters */\r
493   assert_param(IS_AES_FLAG(AES_FLAG));\r
494 \r
495   /* Check if AES_FLAG is AES_FLAG_CCF */\r
496   if (AES_FLAG == AES_FLAG_CCF)\r
497   {\r
498     /* Clear CCF flag by setting CCFC bit */\r
499     AES->CR |= (uint32_t) AES_CR_CCFC;\r
500   }\r
501   else /* AES_FLAG is AES_FLAG_RDERR or AES_FLAG_WRERR */\r
502   {\r
503     /* Clear RDERR and WRERR flags by setting ERRC bit */\r
504     AES->CR |= (uint32_t) AES_CR_ERRC;\r
505   }\r
506 }\r
507 \r
508 /**\r
509   * @brief  Checks whether the specified AES interrupt has occurred or not.\r
510   * @param  AES_IT: Specifies the AES interrupt pending bit to check.\r
511   *         This parameter can be:\r
512   *     @arg AES_IT_CC: Computation Complete Interrupt.\r
513   *     @arg AES_IT_ERR: Error Interrupt.\r
514   * @retval ITStatus The new state of AES_IT (SET or RESET).\r
515   */\r
516 ITStatus AES_GetITStatus(uint32_t AES_IT)\r
517 {\r
518   ITStatus itstatus = RESET;\r
519   uint32_t cciebitstatus = RESET, ccfbitstatus = RESET;\r
520 \r
521   /* Check parameters */\r
522   assert_param(IS_AES_GET_IT(AES_IT));\r
523 \r
524   cciebitstatus = AES->CR & AES_CR_CCIE;\r
525   ccfbitstatus =  AES->SR & AES_SR_CCF;\r
526 \r
527   /* Check if AES_IT is AES_IT_CC */\r
528   if (AES_IT == AES_IT_CC)\r
529   {\r
530     /* Check the status of the specified AES interrupt */\r
531     if (((cciebitstatus) != (uint32_t)RESET) && ((ccfbitstatus) != (uint32_t)RESET))\r
532     {\r
533       /* Interrupt occurred */\r
534       itstatus = SET;\r
535     }\r
536     else\r
537     {\r
538       /* Interrupt didn't occur */\r
539       itstatus = RESET;\r
540     }\r
541   }\r
542   else /* AES_IT is AES_IT_ERR */\r
543   {\r
544     /* Check the status of the specified AES interrupt */\r
545     if ((AES->CR & AES_CR_ERRIE) != RESET)\r
546     {\r
547       /* Check if WRERR or RDERR flags are set */\r
548       if ((AES->SR & (uint32_t)(AES_SR_WRERR | AES_SR_RDERR)) != (uint16_t)RESET)\r
549       {\r
550         /* Interrupt occurred */\r
551         itstatus = SET;\r
552       }\r
553       else\r
554       {\r
555         /* Interrupt didn't occur */\r
556         itstatus = RESET;\r
557       }\r
558     }\r
559     else\r
560     {\r
561       /* Interrupt didn't occur */\r
562       itstatus = (ITStatus) RESET;\r
563     }\r
564   }\r
565 \r
566   /* Return the AES_IT status */\r
567   return itstatus;\r
568 }\r
569 \r
570 /**\r
571   * @brief  Clears the AES's interrupt pending bits.\r
572   * @param  AES_IT: specifies the interrupt pending bit to clear.\r
573   *   This parameter can be any combinations of the following values:\r
574   *     @arg AES_IT_CC: Computation Complete Interrupt.\r
575   *     @arg AES_IT_ERR: Error Interrupt.\r
576   * @retval None\r
577   */\r
578 void AES_ClearITPendingBit(uint32_t AES_IT)\r
579 {\r
580   /* Check the parameters */\r
581   assert_param(IS_AES_IT(AES_IT));\r
582 \r
583   /* Clear the interrupt pending bit */\r
584   AES->CR |= (uint32_t) (AES_IT >> (uint32_t) 0x00000002);\r
585 }\r
586 \r
587 /**\r
588   * @}\r
589   */\r
590 \r
591 /**\r
592   * @}\r
593   */\r
594 \r
595 /**\r
596   * @}\r
597   */\r
598 \r
599 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r