42#if defined (AES) || defined (CRYP)
43#if defined (CRYP_CR_ALGOMODE_AES_GCM)|| defined (AES)
50#ifdef HAL_CRYP_MODULE_ENABLED
58#define CRYP_PHASE_INIT 0x00000000U
59#define CRYP_PHASE_HEADER AES_CR_GCMPH_0
60#define CRYP_PHASE_PAYLOAD AES_CR_GCMPH_1
61#define CRYP_PHASE_FINAL AES_CR_GCMPH
63#define CRYP_OPERATINGMODE_ENCRYPT 0x00000000U
64#define CRYP_OPERATINGMODE_KEYDERIVATION AES_CR_MODE_0
65#define CRYP_OPERATINGMODE_DECRYPT AES_CR_MODE_1
66#define CRYP_OPERATINGMODE_KEYDERIVATION_DECRYPT AES_CR_MODE
70#define CRYP_PHASE_INIT 0x00000000U
71#define CRYP_PHASE_HEADER CRYP_CR_GCM_CCMPH_0
72#define CRYP_PHASE_PAYLOAD CRYP_CR_GCM_CCMPH_1
73#define CRYP_PHASE_FINAL CRYP_CR_GCM_CCMPH
75#define CRYP_OPERATINGMODE_ENCRYPT 0x00000000U
76#define CRYP_OPERATINGMODE_DECRYPT CRYP_CR_ALGODIR
79#define CRYPEx_PHASE_PROCESS 0x02U
80#define CRYPEx_PHASE_FINAL 0x03U
83#define CRYP_CCM_CTR0_0 0x07FFFFFFU
84#define CRYP_CCM_CTR0_3 0xFFFFFF00U
127HAL_StatusTypeDef HAL_CRYPEx_AESGCM_GenerateAuthTAG(CRYP_HandleTypeDef *hcryp, uint32_t *AuthTag, uint32_t Timeout)
131 uint64_t headerlength = (uint64_t)(hcryp->Init.HeaderSize) * 32U;
132 uint64_t inputlength = (uint64_t)hcryp->SizesSum * 8U;
133 uint32_t tagaddr = (uint32_t)AuthTag;
136 if (hcryp->Init.HeaderWidthUnit == CRYP_HEADERWIDTHUNIT_BYTE)
141 if (hcryp->State == HAL_CRYP_STATE_READY)
147 hcryp->State = HAL_CRYP_STATE_BUSY;
150 if (hcryp->Phase == CRYPEx_PHASE_PROCESS)
153 hcryp->Phase = CRYPEx_PHASE_FINAL;
158 __HAL_CRYP_DISABLE(hcryp);
161 hcryp->ErrorCode |= HAL_CRYP_ERROR_AUTH_TAG_SEQUENCE;
164 hcryp->State = HAL_CRYP_STATE_READY;
174 __HAL_CRYP_DISABLE(hcryp);
177 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_GCM_CCMPH, CRYP_PHASE_FINAL);
180 hcryp->Instance->CR &= ~CRYP_CR_ALGODIR;
183 __HAL_CRYP_ENABLE(hcryp);
187 if (hcryp->Init.DataType == CRYP_DATATYPE_1B)
189 hcryp->Instance->DIN = 0U;
190 hcryp->Instance->DIN = __RBIT((uint32_t)(headerlength));
191 hcryp->Instance->DIN = 0U;
192 hcryp->Instance->DIN = __RBIT((uint32_t)(inputlength));
194 else if (hcryp->Init.DataType == CRYP_DATATYPE_8B)
196 hcryp->Instance->DIN = 0U;
197 hcryp->Instance->DIN = __REV((uint32_t)(headerlength));
198 hcryp->Instance->DIN = 0U;
199 hcryp->Instance->DIN = __REV((uint32_t)(inputlength));
201 else if (hcryp->Init.DataType == CRYP_DATATYPE_16B)
203 hcryp->Instance->DIN = 0U;
204 hcryp->Instance->DIN = __ROR((uint32_t)headerlength, 16U);
205 hcryp->Instance->DIN = 0U;
206 hcryp->Instance->DIN = __ROR((uint32_t)inputlength, 16U);
208 else if (hcryp->Init.DataType == CRYP_DATATYPE_32B)
210 hcryp->Instance->DIN = 0U;
211 hcryp->Instance->DIN = (uint32_t)(headerlength);
212 hcryp->Instance->DIN = 0U;
213 hcryp->Instance->DIN = (uint32_t)(inputlength);
227 if (((
HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
230 __HAL_CRYP_DISABLE(hcryp);
233 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
234 hcryp->State = HAL_CRYP_STATE_READY;
244 *(uint32_t *)(tagaddr) = hcryp->Instance->DOUT;
246 *(uint32_t *)(tagaddr) = hcryp->Instance->DOUT;
248 *(uint32_t *)(tagaddr) = hcryp->Instance->DOUT;
250 *(uint32_t *)(tagaddr) = hcryp->Instance->DOUT;
255 MODIFY_REG(hcryp->Instance->CR, AES_CR_GCMPH, CRYP_PHASE_FINAL);
259 if (hcryp->Init.DataType == CRYP_DATATYPE_1B)
261 hcryp->Instance->DINR = 0U;
262 hcryp->Instance->DINR = __RBIT((uint32_t)(headerlength));
263 hcryp->Instance->DINR = 0U;
264 hcryp->Instance->DINR = __RBIT((uint32_t)(inputlength));
266 else if (hcryp->Init.DataType == CRYP_DATATYPE_8B)
268 hcryp->Instance->DINR = 0U;
269 hcryp->Instance->DINR = __REV((uint32_t)(headerlength));
270 hcryp->Instance->DINR = 0U;
271 hcryp->Instance->DINR = __REV((uint32_t)(inputlength));
273 else if (hcryp->Init.DataType == CRYP_DATATYPE_16B)
275 hcryp->Instance->DINR = 0U;
276 hcryp->Instance->DINR = __ROR((uint32_t)headerlength, 16U);
277 hcryp->Instance->DINR = 0U;
278 hcryp->Instance->DINR = __ROR((uint32_t)inputlength, 16U);
280 else if (hcryp->Init.DataType == CRYP_DATATYPE_32B)
282 hcryp->Instance->DINR = 0U;
283 hcryp->Instance->DINR = (uint32_t)(headerlength);
284 hcryp->Instance->DINR = 0U;
285 hcryp->Instance->DINR = (uint32_t)(inputlength);
298 if (((
HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
301 __HAL_CRYP_DISABLE(hcryp);
304 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
305 hcryp->State = HAL_CRYP_STATE_READY;
315 *(uint32_t *)(tagaddr) = hcryp->Instance->DOUTR;
317 *(uint32_t *)(tagaddr) = hcryp->Instance->DOUTR;
319 *(uint32_t *)(tagaddr) = hcryp->Instance->DOUTR;
321 *(uint32_t *)(tagaddr) = hcryp->Instance->DOUTR;
324 __HAL_CRYP_CLEAR_FLAG(hcryp, CRYP_CCF_CLEAR);
329 __HAL_CRYP_DISABLE(hcryp);
332 hcryp->State = HAL_CRYP_STATE_READY;
340 hcryp->ErrorCode |= HAL_CRYP_ERROR_BUSY;
355HAL_StatusTypeDef HAL_CRYPEx_AESCCM_GenerateAuthTAG(CRYP_HandleTypeDef *hcryp, uint32_t *AuthTag, uint32_t Timeout)
357 uint32_t tagaddr = (uint32_t)AuthTag;
358 uint32_t ctr0 [4] = {0};
359 uint32_t ctr0addr = (uint32_t)ctr0;
362 if (hcryp->State == HAL_CRYP_STATE_READY)
368 hcryp->State = HAL_CRYP_STATE_BUSY;
371 if (hcryp->Phase == CRYPEx_PHASE_PROCESS)
374 hcryp->Phase = CRYPEx_PHASE_FINAL;
379 __HAL_CRYP_DISABLE(hcryp);
382 hcryp->ErrorCode |= HAL_CRYP_ERROR_AUTH_TAG_SEQUENCE;
385 hcryp->State = HAL_CRYP_STATE_READY;
395 __HAL_CRYP_DISABLE(hcryp);
398 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_GCM_CCMPH | CRYP_CR_ALGODIR, CRYP_PHASE_FINAL | CRYP_OPERATINGMODE_ENCRYPT);
401 __HAL_CRYP_ENABLE(hcryp);
405 ctr0[0] = (hcryp->Init.B0[0]) & CRYP_CCM_CTR0_0;
406 ctr0[1] = hcryp->Init.B0[1];
407 ctr0[2] = hcryp->Init.B0[2];
408 ctr0[3] = hcryp->Init.B0[3] & CRYP_CCM_CTR0_3;
410 if (hcryp->Init.DataType == CRYP_DATATYPE_8B)
412 hcryp->Instance->DIN = __REV(*(uint32_t *)(ctr0addr));
414 hcryp->Instance->DIN = __REV(*(uint32_t *)(ctr0addr));
416 hcryp->Instance->DIN = __REV(*(uint32_t *)(ctr0addr));
418 hcryp->Instance->DIN = __REV(*(uint32_t *)(ctr0addr));
420 else if (hcryp->Init.DataType == CRYP_DATATYPE_16B)
422 hcryp->Instance->DIN = __ROR(*(uint32_t *)(ctr0addr), 16U);
424 hcryp->Instance->DIN = __ROR(*(uint32_t *)(ctr0addr), 16U);
426 hcryp->Instance->DIN = __ROR(*(uint32_t *)(ctr0addr), 16U);
428 hcryp->Instance->DIN = __ROR(*(uint32_t *)(ctr0addr), 16U);
430 else if (hcryp->Init.DataType == CRYP_DATATYPE_1B)
432 hcryp->Instance->DIN = __RBIT(*(uint32_t *)(ctr0addr));
434 hcryp->Instance->DIN = __RBIT(*(uint32_t *)(ctr0addr));
436 hcryp->Instance->DIN = __RBIT(*(uint32_t *)(ctr0addr));
438 hcryp->Instance->DIN = __RBIT(*(uint32_t *)(ctr0addr));
442 hcryp->Instance->DIN = *(uint32_t *)(ctr0addr);
444 hcryp->Instance->DIN = *(uint32_t *)(ctr0addr);
446 hcryp->Instance->DIN = *(uint32_t *)(ctr0addr);
448 hcryp->Instance->DIN = *(uint32_t *)(ctr0addr);
457 if (((
HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
460 __HAL_CRYP_DISABLE(hcryp);
463 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
464 hcryp->State = HAL_CRYP_STATE_READY;
474 *(uint32_t *)(tagaddr) = hcryp->Instance->DOUT;
476 *(uint32_t *)(tagaddr) = hcryp->Instance->DOUT;
478 *(uint32_t *)(tagaddr) = hcryp->Instance->DOUT;
480 *(uint32_t *)(tagaddr) = hcryp->Instance->DOUT;
485 MODIFY_REG(hcryp->Instance->CR, AES_CR_GCMPH, CRYP_PHASE_FINAL);
489 if (hcryp->Init.DataType == CRYP_DATATYPE_8B)
491 ctr0[0] = (__REV(hcryp->Init.B0[0]) & CRYP_CCM_CTR0_0);
492 ctr0[1] = __REV(hcryp->Init.B0[1]);
493 ctr0[2] = __REV(hcryp->Init.B0[2]);
494 ctr0[3] = (__REV(hcryp->Init.B0[3])& CRYP_CCM_CTR0_3);
496 hcryp->Instance->DINR = __REV(*(uint32_t *)(ctr0addr));
498 hcryp->Instance->DINR = __REV(*(uint32_t *)(ctr0addr));
500 hcryp->Instance->DINR = __REV(*(uint32_t *)(ctr0addr));
502 hcryp->Instance->DINR = __REV(*(uint32_t *)(ctr0addr));
504 else if (hcryp->Init.DataType == CRYP_DATATYPE_16B)
506 ctr0[0] = (__ROR((hcryp->Init.B0[0]), 16U)& CRYP_CCM_CTR0_0);
507 ctr0[1] = __ROR((hcryp->Init.B0[1]), 16U);
508 ctr0[2] = __ROR((hcryp->Init.B0[2]), 16U);
509 ctr0[3] = (__ROR((hcryp->Init.B0[3]), 16U)& CRYP_CCM_CTR0_3);
511 hcryp->Instance->DINR = __ROR(*(uint32_t *)(ctr0addr), 16U);
513 hcryp->Instance->DINR = __ROR(*(uint32_t *)(ctr0addr), 16U);
515 hcryp->Instance->DINR = __ROR(*(uint32_t *)(ctr0addr), 16U);
517 hcryp->Instance->DINR = __ROR(*(uint32_t *)(ctr0addr), 16U);
519 else if (hcryp->Init.DataType == CRYP_DATATYPE_1B)
521 ctr0[0] = (__RBIT(hcryp->Init.B0[0])& CRYP_CCM_CTR0_0);
522 ctr0[1] = __RBIT(hcryp->Init.B0[1]);
523 ctr0[2] = __RBIT(hcryp->Init.B0[2]);
524 ctr0[3] = (__RBIT(hcryp->Init.B0[3])& CRYP_CCM_CTR0_3);
526 hcryp->Instance->DINR = __RBIT(*(uint32_t *)(ctr0addr));
528 hcryp->Instance->DINR = __RBIT(*(uint32_t *)(ctr0addr));
530 hcryp->Instance->DINR = __RBIT(*(uint32_t *)(ctr0addr));
532 hcryp->Instance->DINR = __RBIT(*(uint32_t *)(ctr0addr));
536 ctr0[0] = (hcryp->Init.B0[0]) & CRYP_CCM_CTR0_0;
537 ctr0[1] = hcryp->Init.B0[1];
538 ctr0[2] = hcryp->Init.B0[2];
539 ctr0[3] = hcryp->Init.B0[3] & CRYP_CCM_CTR0_3;
541 hcryp->Instance->DINR = *(uint32_t *)(ctr0addr);
543 hcryp->Instance->DINR = *(uint32_t *)(ctr0addr);
545 hcryp->Instance->DINR = *(uint32_t *)(ctr0addr);
547 hcryp->Instance->DINR = *(uint32_t *)(ctr0addr);
557 if (((
HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
560 __HAL_CRYP_DISABLE(hcryp);
563 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
564 hcryp->State = HAL_CRYP_STATE_READY;
574 *(uint32_t *)(tagaddr) = hcryp->Instance->DOUTR;
576 *(uint32_t *)(tagaddr) = hcryp->Instance->DOUTR;
578 *(uint32_t *)(tagaddr) = hcryp->Instance->DOUTR;
580 *(uint32_t *)(tagaddr) = hcryp->Instance->DOUTR;
583 __HAL_CRYP_CLEAR_FLAG(hcryp, CRYP_CCF_CLEAR);
588 hcryp->State = HAL_CRYP_STATE_READY;
594 __HAL_CRYP_DISABLE(hcryp);
599 hcryp->ErrorCode = HAL_CRYP_ERROR_BUSY;
631void HAL_CRYPEx_EnableAutoKeyDerivation(CRYP_HandleTypeDef *hcryp)
633 if (hcryp->State == HAL_CRYP_STATE_READY)
635 hcryp->AutoKeyDerivation = ENABLE;
640 hcryp->ErrorCode = HAL_CRYP_ERROR_BUSY;
648void HAL_CRYPEx_DisableAutoKeyDerivation(CRYP_HandleTypeDef *hcryp)
650 if (hcryp->State == HAL_CRYP_STATE_READY)
652 hcryp->AutoKeyDerivation = DISABLE;
657 hcryp->ErrorCode = HAL_CRYP_ERROR_BUSY;
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition.
#define __HAL_UNLOCK(__HANDLE__)
#define HAL_IS_BIT_CLR(REG, BIT)
#define __HAL_LOCK(__HANDLE__)