105 #if defined (STM32F756xx) || defined (STM32F777xx) || defined (STM32F779xx) 112 #ifdef HAL_CRYP_MODULE_ENABLED 119 #define CRYPEx_TIMEOUT_VALUE 1 130 static void CRYPEx_GCMCCM_SetInitVector(CRYP_HandleTypeDef *hcryp, uint8_t *InitVector);
131 static void CRYPEx_GCMCCM_SetKey(CRYP_HandleTypeDef *hcryp, uint8_t *Key, uint32_t KeySize);
132 static HAL_StatusTypeDef CRYPEx_GCMCCM_ProcessData(CRYP_HandleTypeDef *hcryp, uint8_t *Input, uint16_t Ilength, uint8_t *Output, uint32_t Timeout);
133 static HAL_StatusTypeDef CRYPEx_GCMCCM_SetHeaderPhase(CRYP_HandleTypeDef *hcryp, uint8_t* Input, uint16_t Ilength, uint32_t Timeout);
137 static void CRYPEx_GCMCCM_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputaddr, uint16_t Size, uint32_t outputaddr);
154 CRYP_HandleTypeDef* hcryp = ( CRYP_HandleTypeDef* )((
DMA_HandleTypeDef* )hdma)->Parent;
161 HAL_CRYP_InCpltCallback(hcryp);
171 CRYP_HandleTypeDef* hcryp = ( CRYP_HandleTypeDef* )((
DMA_HandleTypeDef* )hdma)->Parent;
178 __HAL_CRYP_DISABLE(hcryp);
181 hcryp->State = HAL_CRYP_STATE_READY;
184 HAL_CRYP_OutCpltCallback(hcryp);
194 CRYP_HandleTypeDef* hcryp = ( CRYP_HandleTypeDef* )((
DMA_HandleTypeDef* )hdma)->Parent;
195 hcryp->State= HAL_CRYP_STATE_READY;
196 HAL_CRYP_ErrorCallback(hcryp);
207 static void CRYPEx_GCMCCM_SetKey(CRYP_HandleTypeDef *hcryp, uint8_t *Key, uint32_t KeySize)
209 uint32_t keyaddr = (uint32_t)Key;
213 case CRYP_KEYSIZE_256B:
215 hcryp->Instance->K0LR =
__REV(*(uint32_t*)(keyaddr));
217 hcryp->Instance->K0RR =
__REV(*(uint32_t*)(keyaddr));
219 hcryp->Instance->K1LR =
__REV(*(uint32_t*)(keyaddr));
221 hcryp->Instance->K1RR =
__REV(*(uint32_t*)(keyaddr));
223 hcryp->Instance->K2LR =
__REV(*(uint32_t*)(keyaddr));
225 hcryp->Instance->K2RR =
__REV(*(uint32_t*)(keyaddr));
227 hcryp->Instance->K3LR =
__REV(*(uint32_t*)(keyaddr));
229 hcryp->Instance->K3RR =
__REV(*(uint32_t*)(keyaddr));
231 case CRYP_KEYSIZE_192B:
232 hcryp->Instance->K1LR =
__REV(*(uint32_t*)(keyaddr));
234 hcryp->Instance->K1RR =
__REV(*(uint32_t*)(keyaddr));
236 hcryp->Instance->K2LR =
__REV(*(uint32_t*)(keyaddr));
238 hcryp->Instance->K2RR =
__REV(*(uint32_t*)(keyaddr));
240 hcryp->Instance->K3LR =
__REV(*(uint32_t*)(keyaddr));
242 hcryp->Instance->K3RR =
__REV(*(uint32_t*)(keyaddr));
244 case CRYP_KEYSIZE_128B:
245 hcryp->Instance->K2LR =
__REV(*(uint32_t*)(keyaddr));
247 hcryp->Instance->K2RR =
__REV(*(uint32_t*)(keyaddr));
249 hcryp->Instance->K3LR =
__REV(*(uint32_t*)(keyaddr));
251 hcryp->Instance->K3RR =
__REV(*(uint32_t*)(keyaddr));
265 static void CRYPEx_GCMCCM_SetInitVector(CRYP_HandleTypeDef *hcryp, uint8_t *InitVector)
267 uint32_t ivaddr = (uint32_t)InitVector;
269 hcryp->Instance->IV0LR =
__REV(*(uint32_t*)(ivaddr));
271 hcryp->Instance->IV0RR =
__REV(*(uint32_t*)(ivaddr));
273 hcryp->Instance->IV1LR =
__REV(*(uint32_t*)(ivaddr));
275 hcryp->Instance->IV1RR =
__REV(*(uint32_t*)(ivaddr));
288 static HAL_StatusTypeDef CRYPEx_GCMCCM_ProcessData(CRYP_HandleTypeDef *hcryp, uint8_t *Input, uint16_t Ilength, uint8_t *Output, uint32_t Timeout)
290 uint32_t tickstart = 0;
292 uint32_t inputaddr = (uint32_t)Input;
293 uint32_t outputaddr = (uint32_t)Output;
295 for(i=0; (i < Ilength); i+=16)
298 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
300 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
302 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
304 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
315 if((
HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
318 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
328 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
330 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
332 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
334 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
350 static HAL_StatusTypeDef CRYPEx_GCMCCM_SetHeaderPhase(CRYP_HandleTypeDef *hcryp, uint8_t* Input, uint16_t Ilength, uint32_t Timeout)
352 uint32_t tickstart = 0;
353 uint32_t loopcounter = 0;
354 uint32_t headeraddr = (uint32_t)Input;
357 if(hcryp->Init.HeaderSize != 0)
360 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
362 __HAL_CRYP_ENABLE(hcryp);
364 for(loopcounter = 0; (loopcounter < hcryp->Init.HeaderSize); loopcounter+=16)
374 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
377 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
387 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
389 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
391 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
393 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
402 while((hcryp->Instance->SR & CRYP_FLAG_BUSY) == CRYP_FLAG_BUSY)
407 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
410 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
433 static void CRYPEx_GCMCCM_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputaddr, uint16_t Size, uint32_t outputaddr)
436 hcryp->hdmain->XferCpltCallback = CRYPEx_GCMCCM_DMAInCplt;
438 hcryp->hdmain->XferErrorCallback = CRYPEx_GCMCCM_DMAError;
441 hcryp->hdmaout->XferCpltCallback = CRYPEx_GCMCCM_DMAOutCplt;
443 hcryp->hdmaout->XferErrorCallback = CRYPEx_GCMCCM_DMAError;
446 __HAL_CRYP_ENABLE(hcryp);
449 HAL_DMA_Start_IT(hcryp->hdmain, inputaddr, (uint32_t)&hcryp->Instance->DR, Size/4);
455 HAL_DMA_Start_IT(hcryp->hdmaout, (uint32_t)&hcryp->Instance->DOUT, outputaddr, Size/4);
502 HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout)
504 uint32_t tickstart = 0;
505 uint32_t headersize = hcryp->Init.HeaderSize;
506 uint32_t headeraddr = (uint32_t)hcryp->Init.Header;
507 uint32_t loopcounter = 0;
508 uint32_t bufferidx = 0;
509 uint8_t blockb0[16] = {0};
510 uint8_t ctr[16] = {0};
511 uint32_t b0addr = (uint32_t)blockb0;
517 hcryp->State = HAL_CRYP_STATE_BUSY;
520 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
526 if(headersize < 65280)
528 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFF);
529 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFF);
535 hcryp->Init.pScratch[bufferidx++] = 0xFF;
536 hcryp->Init.pScratch[bufferidx++] = 0xFE;
537 hcryp->Init.pScratch[bufferidx++] = headersize & 0xff000000U;
538 hcryp->Init.pScratch[bufferidx++] = headersize & 0x00ff0000U;
539 hcryp->Init.pScratch[bufferidx++] = headersize & 0x0000ff00U;
540 hcryp->Init.pScratch[bufferidx++] = headersize & 0x000000ffU;
544 for(loopcounter = 0; loopcounter < headersize; loopcounter++)
546 hcryp->Init.pScratch[bufferidx++] = hcryp->Init.Header[loopcounter];
549 if ((headersize % 16) != 0)
552 for(loopcounter = headersize; loopcounter <= ((headersize/16) + 1) * 16; loopcounter++)
554 hcryp->Init.pScratch[loopcounter] = 0;
557 headersize = ((headersize/16) + 1) * 16;
560 headeraddr = (uint32_t)hcryp->Init.pScratch;
569 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2))) >> 1) & (uint8_t)0x07 ) << 3);
570 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15) - hcryp->Init.IVSize) - (uint8_t)1) & (uint8_t)0x07);
572 for (loopcounter = 0; loopcounter < hcryp->Init.IVSize; loopcounter++)
574 blockb0[loopcounter+1] = hcryp->Init.pInitVect[loopcounter];
576 for ( ; loopcounter < 13; loopcounter++)
578 blockb0[loopcounter+1] = 0;
581 blockb0[14] = (Size >> 8);
582 blockb0[15] = (Size & 0xFF);
591 ctr[0] = blockb0[0] & 0x07;
593 for(loopcounter = 1; loopcounter < hcryp->Init.IVSize + 1; loopcounter++)
595 ctr[loopcounter] = blockb0[loopcounter];
601 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
604 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CCM_ENCRYPT);
607 CRYPEx_GCMCCM_SetInitVector(hcryp, ctr);
610 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
612 b0addr = (uint32_t)blockb0;
614 hcryp->Instance->DR = *(uint32_t*)(b0addr);
616 hcryp->Instance->DR = *(uint32_t*)(b0addr);
618 hcryp->Instance->DR = *(uint32_t*)(b0addr);
620 hcryp->Instance->DR = *(uint32_t*)(b0addr);
623 __HAL_CRYP_ENABLE(hcryp);
633 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
636 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
649 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
652 __HAL_CRYP_ENABLE(hcryp);
654 for(loopcounter = 0; (loopcounter < headersize); loopcounter+=16)
665 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
668 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
679 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
681 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
683 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
685 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
692 while((hcryp->Instance->SR & CRYP_FLAG_BUSY) == CRYP_FLAG_BUSY)
697 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
700 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
711 for(loopcounter = 0; (loopcounter < 16); loopcounter++)
713 hcryp->Init.pScratch[loopcounter] = ctr[loopcounter];
716 hcryp->Init.pScratch[15] &= 0xfe;
719 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
722 __HAL_CRYP_FIFO_FLUSH(hcryp);
725 __HAL_CRYP_ENABLE(hcryp);
728 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
732 if(CRYPEx_GCMCCM_ProcessData(hcryp,pPlainData, Size, pCypherData, Timeout) !=
HAL_OK)
738 hcryp->State = HAL_CRYP_STATE_READY;
758 HAL_StatusTypeDef HAL_CRYPEx_AESGCM_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout)
760 uint32_t tickstart = 0;
766 hcryp->State = HAL_CRYP_STATE_BUSY;
769 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
772 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
775 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_GCM_ENCRYPT);
778 CRYPEx_GCMCCM_SetInitVector(hcryp, hcryp->Init.pInitVect);
781 __HAL_CRYP_FIFO_FLUSH(hcryp);
784 __HAL_CRYP_ENABLE(hcryp);
794 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
797 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
808 if(CRYPEx_GCMCCM_SetHeaderPhase(hcryp, hcryp->Init.Header, hcryp->Init.HeaderSize, Timeout) !=
HAL_OK)
814 __HAL_CRYP_DISABLE(hcryp);
817 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
820 __HAL_CRYP_FIFO_FLUSH(hcryp);
823 __HAL_CRYP_ENABLE(hcryp);
826 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
830 if(CRYPEx_GCMCCM_ProcessData(hcryp, pPlainData, Size, pCypherData, Timeout) !=
HAL_OK)
836 hcryp->State = HAL_CRYP_STATE_READY;
856 HAL_StatusTypeDef HAL_CRYPEx_AESGCM_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData, uint32_t Timeout)
858 uint32_t tickstart = 0;
864 hcryp->State = HAL_CRYP_STATE_BUSY;
867 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
870 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
873 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_GCM_DECRYPT);
876 CRYPEx_GCMCCM_SetInitVector(hcryp, hcryp->Init.pInitVect);
879 __HAL_CRYP_FIFO_FLUSH(hcryp);
882 __HAL_CRYP_ENABLE(hcryp);
892 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
895 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
906 if(CRYPEx_GCMCCM_SetHeaderPhase(hcryp, hcryp->Init.Header, hcryp->Init.HeaderSize, Timeout) !=
HAL_OK)
911 __HAL_CRYP_DISABLE(hcryp);
914 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
917 __HAL_CRYP_ENABLE(hcryp);
920 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
924 if(CRYPEx_GCMCCM_ProcessData(hcryp, pCypherData, Size, pPlainData, Timeout) !=
HAL_OK)
930 hcryp->State = HAL_CRYP_STATE_READY;
948 HAL_StatusTypeDef HAL_CRYPEx_AESGCM_Finish(CRYP_HandleTypeDef *hcryp, uint32_t Size, uint8_t *AuthTag, uint32_t Timeout)
950 uint32_t tickstart = 0;
951 uint64_t headerlength = hcryp->Init.HeaderSize * 8;
952 uint64_t inputlength = Size * 8;
953 uint32_t tagaddr = (uint32_t)AuthTag;
959 hcryp->State = HAL_CRYP_STATE_BUSY;
962 if(hcryp->Phase == HAL_CRYP_PHASE_PROCESS)
965 hcryp->Phase = HAL_CRYP_PHASE_FINAL;
968 __HAL_CRYP_DISABLE(hcryp);
971 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_FINAL);
974 __HAL_CRYP_ENABLE(hcryp);
978 if(hcryp->Init.DataType == CRYP_DATATYPE_1B)
980 hcryp->Instance->DR = __RBIT(headerlength >> 32);
981 hcryp->Instance->DR = __RBIT(headerlength);
982 hcryp->Instance->DR = __RBIT(inputlength >> 32);
983 hcryp->Instance->DR = __RBIT(inputlength);
985 else if(hcryp->Init.DataType == CRYP_DATATYPE_8B)
987 hcryp->Instance->DR =
__REV(headerlength >> 32);
988 hcryp->Instance->DR =
__REV(headerlength);
989 hcryp->Instance->DR =
__REV(inputlength >> 32);
990 hcryp->Instance->DR =
__REV(inputlength);
992 else if(hcryp->Init.DataType == CRYP_DATATYPE_16B)
994 hcryp->Instance->DR =
__ROR((uint32_t)(headerlength >> 32), 16);
995 hcryp->Instance->DR =
__ROR((uint32_t)headerlength, 16);
996 hcryp->Instance->DR =
__ROR((uint32_t)(inputlength >> 32), 16);
997 hcryp->Instance->DR =
__ROR((uint32_t)inputlength, 16);
999 else if(hcryp->Init.DataType == CRYP_DATATYPE_32B)
1001 hcryp->Instance->DR = (uint32_t)(headerlength >> 32);
1002 hcryp->Instance->DR = (uint32_t)(headerlength);
1003 hcryp->Instance->DR = (uint32_t)(inputlength >> 32);
1004 hcryp->Instance->DR = (uint32_t)(inputlength);
1014 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
1017 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
1028 *(uint32_t*)(tagaddr) = hcryp->Instance->DOUT;
1030 *(uint32_t*)(tagaddr) = hcryp->Instance->DOUT;
1032 *(uint32_t*)(tagaddr) = hcryp->Instance->DOUT;
1034 *(uint32_t*)(tagaddr) = hcryp->Instance->DOUT;
1038 hcryp->State = HAL_CRYP_STATE_READY;
1056 HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Finish(CRYP_HandleTypeDef *hcryp, uint8_t *AuthTag, uint32_t Timeout)
1058 uint32_t tickstart = 0;
1059 uint32_t tagaddr = (uint32_t)AuthTag;
1060 uint32_t ctraddr = (uint32_t)hcryp->Init.pScratch;
1061 uint32_t temptag[4] = {0};
1062 uint32_t loopcounter;
1068 hcryp->State = HAL_CRYP_STATE_BUSY;
1071 if(hcryp->Phase == HAL_CRYP_PHASE_PROCESS)
1074 hcryp->Phase = HAL_CRYP_PHASE_FINAL;
1077 __HAL_CRYP_DISABLE(hcryp);
1080 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_FINAL);
1083 __HAL_CRYP_ENABLE(hcryp);
1086 hcryp->Instance->DR = *(uint32_t*)ctraddr;
1088 hcryp->Instance->DR = *(uint32_t*)ctraddr;
1090 hcryp->Instance->DR = *(uint32_t*)ctraddr;
1092 hcryp->Instance->DR = *(uint32_t*)ctraddr;
1102 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
1105 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
1116 temptag[0] = hcryp->Instance->DOUT;
1117 temptag[1] = hcryp->Instance->DOUT;
1118 temptag[2] = hcryp->Instance->DOUT;
1119 temptag[3] = hcryp->Instance->DOUT;
1123 for(loopcounter = 0; loopcounter < hcryp->Init.TagSize ; loopcounter++)
1126 *((uint8_t*)tagaddr+loopcounter) = *((uint8_t*)temptag+loopcounter);
1130 hcryp->State = HAL_CRYP_STATE_READY;
1150 HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData, uint32_t Timeout)
1152 uint32_t tickstart = 0;
1153 uint32_t headersize = hcryp->Init.HeaderSize;
1154 uint32_t headeraddr = (uint32_t)hcryp->Init.Header;
1155 uint32_t loopcounter = 0;
1156 uint32_t bufferidx = 0;
1157 uint8_t blockb0[16] = {0};
1158 uint8_t ctr[16] = {0};
1159 uint32_t b0addr = (uint32_t)blockb0;
1165 hcryp->State = HAL_CRYP_STATE_BUSY;
1168 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
1174 if(headersize < 65280)
1176 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFFU);
1177 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFFU);
1183 hcryp->Init.pScratch[bufferidx++] = 0xFFU;
1184 hcryp->Init.pScratch[bufferidx++] = 0xFEU;
1185 hcryp->Init.pScratch[bufferidx++] = headersize & 0xff000000U;
1186 hcryp->Init.pScratch[bufferidx++] = headersize & 0x00ff0000U;
1187 hcryp->Init.pScratch[bufferidx++] = headersize & 0x0000ff00U;
1188 hcryp->Init.pScratch[bufferidx++] = headersize & 0x000000ffU;
1192 for(loopcounter = 0; loopcounter < headersize; loopcounter++)
1194 hcryp->Init.pScratch[bufferidx++] = hcryp->Init.Header[loopcounter];
1197 if ((headersize % 16) != 0)
1200 for(loopcounter = headersize; loopcounter <= ((headersize/16) + 1) * 16; loopcounter++)
1202 hcryp->Init.pScratch[loopcounter] = 0;
1205 headersize = ((headersize/16) + 1) * 16;
1208 headeraddr = (uint32_t)hcryp->Init.pScratch;
1217 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2))) >> 1) & (uint8_t)0x07 ) << 3);
1218 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15) - hcryp->Init.IVSize) - (uint8_t)1) & (uint8_t)0x07);
1220 for (loopcounter = 0; loopcounter < hcryp->Init.IVSize; loopcounter++)
1222 blockb0[loopcounter+1] = hcryp->Init.pInitVect[loopcounter];
1224 for ( ; loopcounter < 13; loopcounter++)
1226 blockb0[loopcounter+1] = 0;
1229 blockb0[14] = (Size >> 8);
1230 blockb0[15] = (Size & 0xFF);
1239 ctr[0] = blockb0[0] & 0x07;
1241 for(loopcounter = 1; loopcounter < hcryp->Init.IVSize + 1; loopcounter++)
1243 ctr[loopcounter] = blockb0[loopcounter];
1249 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
1252 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CCM_DECRYPT);
1255 CRYPEx_GCMCCM_SetInitVector(hcryp, ctr);
1258 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
1260 b0addr = (uint32_t)blockb0;
1262 hcryp->Instance->DR = *(uint32_t*)(b0addr);
1264 hcryp->Instance->DR = *(uint32_t*)(b0addr);
1266 hcryp->Instance->DR = *(uint32_t*)(b0addr);
1268 hcryp->Instance->DR = *(uint32_t*)(b0addr);
1271 __HAL_CRYP_ENABLE(hcryp);
1281 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
1284 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
1297 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
1300 __HAL_CRYP_ENABLE(hcryp);
1302 for(loopcounter = 0; (loopcounter < headersize); loopcounter+=16)
1312 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
1315 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
1325 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
1327 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
1329 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
1331 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
1338 while((hcryp->Instance->SR & CRYP_FLAG_BUSY) == CRYP_FLAG_BUSY)
1343 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
1346 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
1357 for(loopcounter = 0; (loopcounter < 16); loopcounter++)
1359 hcryp->Init.pScratch[loopcounter] = ctr[loopcounter];
1362 hcryp->Init.pScratch[15] &= 0xfe;
1364 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
1367 __HAL_CRYP_FIFO_FLUSH(hcryp);
1370 __HAL_CRYP_ENABLE(hcryp);
1373 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
1377 if(CRYPEx_GCMCCM_ProcessData(hcryp, pCypherData, Size, pPlainData, Timeout) !=
HAL_OK)
1383 hcryp->State = HAL_CRYP_STATE_READY;
1401 HAL_StatusTypeDef HAL_CRYPEx_AESGCM_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData)
1403 uint32_t tickstart = 0;
1405 uint32_t outputaddr;
1407 if(hcryp->State == HAL_CRYP_STATE_READY)
1413 hcryp->CrypInCount = Size;
1414 hcryp->pCrypInBuffPtr = pPlainData;
1415 hcryp->pCrypOutBuffPtr = pCypherData;
1416 hcryp->CrypOutCount = Size;
1419 hcryp->State = HAL_CRYP_STATE_BUSY;
1422 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
1425 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
1428 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_GCM_ENCRYPT);
1431 CRYPEx_GCMCCM_SetInitVector(hcryp, hcryp->Init.pInitVect);
1434 __HAL_CRYP_FIFO_FLUSH(hcryp);
1437 __HAL_CRYP_ENABLE(hcryp);
1446 if((
HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
1449 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
1460 if(CRYPEx_GCMCCM_SetHeaderPhase(hcryp, hcryp->Init.Header, hcryp->Init.HeaderSize, 1) !=
HAL_OK)
1465 __HAL_CRYP_DISABLE(hcryp);
1468 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
1471 __HAL_CRYP_FIFO_FLUSH(hcryp);
1474 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
1480 __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI);
1482 __HAL_CRYP_ENABLE(hcryp);
1489 hcryp->State = HAL_CRYP_STATE_READY;
1494 else if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI))
1496 inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
1498 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
1500 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
1502 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
1504 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
1505 hcryp->pCrypInBuffPtr += 16;
1506 hcryp->CrypInCount -= 16;
1507 if(hcryp->CrypInCount == 0)
1509 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI);
1511 HAL_CRYP_InCpltCallback(hcryp);
1514 else if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI))
1516 outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr;
1518 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
1520 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
1522 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
1524 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
1525 hcryp->pCrypOutBuffPtr += 16;
1526 hcryp->CrypOutCount -= 16;
1527 if(hcryp->CrypOutCount == 0)
1529 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI);
1533 hcryp->State = HAL_CRYP_STATE_READY;
1535 HAL_CRYP_OutCpltCallback(hcryp);
1552 HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData)
1554 uint32_t tickstart = 0;
1556 uint32_t outputaddr;
1558 uint32_t headersize = hcryp->Init.HeaderSize;
1559 uint32_t headeraddr = (uint32_t)hcryp->Init.Header;
1560 uint32_t loopcounter = 0;
1561 uint32_t bufferidx = 0;
1562 uint8_t blockb0[16] = {0};
1563 uint8_t ctr[16] = {0};
1564 uint32_t b0addr = (uint32_t)blockb0;
1566 if(hcryp->State == HAL_CRYP_STATE_READY)
1571 hcryp->CrypInCount = Size;
1572 hcryp->pCrypInBuffPtr = pPlainData;
1573 hcryp->pCrypOutBuffPtr = pCypherData;
1574 hcryp->CrypOutCount = Size;
1577 hcryp->State = HAL_CRYP_STATE_BUSY;
1580 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
1586 if(headersize < 65280)
1588 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFFU);
1589 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFFU);
1595 hcryp->Init.pScratch[bufferidx++] = 0xFFU;
1596 hcryp->Init.pScratch[bufferidx++] = 0xFEU;
1597 hcryp->Init.pScratch[bufferidx++] = headersize & 0xff000000U;
1598 hcryp->Init.pScratch[bufferidx++] = headersize & 0x00ff0000U;
1599 hcryp->Init.pScratch[bufferidx++] = headersize & 0x0000ff00U;
1600 hcryp->Init.pScratch[bufferidx++] = headersize & 0x000000ffU;
1604 for(loopcounter = 0; loopcounter < headersize; loopcounter++)
1606 hcryp->Init.pScratch[bufferidx++] = hcryp->Init.Header[loopcounter];
1609 if ((headersize % 16) != 0)
1612 for(loopcounter = headersize; loopcounter <= ((headersize/16) + 1) * 16; loopcounter++)
1614 hcryp->Init.pScratch[loopcounter] = 0;
1617 headersize = ((headersize/16) + 1) * 16;
1620 headeraddr = (uint32_t)hcryp->Init.pScratch;
1629 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2))) >> 1) & (uint8_t)0x07 ) << 3);
1630 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15) - hcryp->Init.IVSize) - (uint8_t)1) & (uint8_t)0x07);
1632 for (loopcounter = 0; loopcounter < hcryp->Init.IVSize; loopcounter++)
1634 blockb0[loopcounter+1] = hcryp->Init.pInitVect[loopcounter];
1636 for ( ; loopcounter < 13; loopcounter++)
1638 blockb0[loopcounter+1] = 0;
1641 blockb0[14] = (Size >> 8);
1642 blockb0[15] = (Size & 0xFF);
1651 ctr[0] = blockb0[0] & 0x07;
1653 for(loopcounter = 1; loopcounter < hcryp->Init.IVSize + 1; loopcounter++)
1655 ctr[loopcounter] = blockb0[loopcounter];
1661 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
1664 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CCM_ENCRYPT);
1667 CRYPEx_GCMCCM_SetInitVector(hcryp, ctr);
1670 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
1672 b0addr = (uint32_t)blockb0;
1674 hcryp->Instance->DR = *(uint32_t*)(b0addr);
1676 hcryp->Instance->DR = *(uint32_t*)(b0addr);
1678 hcryp->Instance->DR = *(uint32_t*)(b0addr);
1680 hcryp->Instance->DR = *(uint32_t*)(b0addr);
1683 __HAL_CRYP_ENABLE(hcryp);
1691 if((
HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
1694 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
1706 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
1709 __HAL_CRYP_ENABLE(hcryp);
1711 for(loopcounter = 0; (loopcounter < headersize); loopcounter+=16)
1719 if((
HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
1722 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
1731 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
1733 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
1735 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
1737 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
1744 while((hcryp->Instance->SR & CRYP_FLAG_BUSY) == CRYP_FLAG_BUSY)
1747 if((
HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
1750 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
1760 for(loopcounter = 0; (loopcounter < 16); loopcounter++)
1762 hcryp->Init.pScratch[loopcounter] = ctr[loopcounter];
1765 hcryp->Init.pScratch[15] &= 0xfe;
1768 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
1771 __HAL_CRYP_FIFO_FLUSH(hcryp);
1774 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
1780 __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI);
1782 __HAL_CRYP_ENABLE(hcryp);
1787 hcryp->State = HAL_CRYP_STATE_READY;
1793 else if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI))
1795 inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
1797 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
1799 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
1801 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
1803 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
1804 hcryp->pCrypInBuffPtr += 16;
1805 hcryp->CrypInCount -= 16;
1806 if(hcryp->CrypInCount == 0)
1808 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI);
1810 HAL_CRYP_InCpltCallback(hcryp);
1813 else if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI))
1815 outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr;
1817 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
1819 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
1821 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
1823 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
1824 hcryp->pCrypOutBuffPtr += 16;
1825 hcryp->CrypOutCount -= 16;
1826 if(hcryp->CrypOutCount == 0)
1828 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI);
1832 hcryp->State = HAL_CRYP_STATE_READY;
1834 HAL_CRYP_OutCpltCallback(hcryp);
1851 HAL_StatusTypeDef HAL_CRYPEx_AESGCM_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData)
1853 uint32_t tickstart = 0;
1855 uint32_t outputaddr;
1857 if(hcryp->State == HAL_CRYP_STATE_READY)
1863 hcryp->CrypInCount = Size;
1864 hcryp->pCrypInBuffPtr = pCypherData;
1865 hcryp->pCrypOutBuffPtr = pPlainData;
1866 hcryp->CrypOutCount = Size;
1869 hcryp->State = HAL_CRYP_STATE_BUSY;
1872 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
1875 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
1878 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_GCM_DECRYPT);
1881 CRYPEx_GCMCCM_SetInitVector(hcryp, hcryp->Init.pInitVect);
1884 __HAL_CRYP_FIFO_FLUSH(hcryp);
1887 __HAL_CRYP_ENABLE(hcryp);
1895 if((
HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
1898 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
1908 if(CRYPEx_GCMCCM_SetHeaderPhase(hcryp, hcryp->Init.Header, hcryp->Init.HeaderSize, 1) !=
HAL_OK)
1913 __HAL_CRYP_DISABLE(hcryp);
1916 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
1919 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
1925 __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI);
1927 __HAL_CRYP_ENABLE(hcryp);
1934 hcryp->State = HAL_CRYP_STATE_READY;
1940 else if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI))
1942 inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
1944 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
1946 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
1948 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
1950 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
1951 hcryp->pCrypInBuffPtr += 16;
1952 hcryp->CrypInCount -= 16;
1953 if(hcryp->CrypInCount == 0)
1955 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI);
1957 HAL_CRYP_InCpltCallback(hcryp);
1960 else if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI))
1962 outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr;
1964 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
1966 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
1968 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
1970 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
1971 hcryp->pCrypOutBuffPtr += 16;
1972 hcryp->CrypOutCount -= 16;
1973 if(hcryp->CrypOutCount == 0)
1975 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI);
1979 hcryp->State = HAL_CRYP_STATE_READY;
1981 HAL_CRYP_OutCpltCallback(hcryp);
1999 HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData)
2002 uint32_t outputaddr;
2003 uint32_t tickstart = 0;
2004 uint32_t headersize = hcryp->Init.HeaderSize;
2005 uint32_t headeraddr = (uint32_t)hcryp->Init.Header;
2006 uint32_t loopcounter = 0;
2007 uint32_t bufferidx = 0;
2008 uint8_t blockb0[16] = {0};
2009 uint8_t ctr[16] = {0};
2010 uint32_t b0addr = (uint32_t)blockb0;
2012 if(hcryp->State == HAL_CRYP_STATE_READY)
2017 hcryp->CrypInCount = Size;
2018 hcryp->pCrypInBuffPtr = pCypherData;
2019 hcryp->pCrypOutBuffPtr = pPlainData;
2020 hcryp->CrypOutCount = Size;
2023 hcryp->State = HAL_CRYP_STATE_BUSY;
2026 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
2032 if(headersize < 65280)
2034 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFFU);
2035 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFFU);
2041 hcryp->Init.pScratch[bufferidx++] = 0xFFU;
2042 hcryp->Init.pScratch[bufferidx++] = 0xFEU;
2043 hcryp->Init.pScratch[bufferidx++] = headersize & 0xff000000U;
2044 hcryp->Init.pScratch[bufferidx++] = headersize & 0x00ff0000U;
2045 hcryp->Init.pScratch[bufferidx++] = headersize & 0x0000ff00U;
2046 hcryp->Init.pScratch[bufferidx++] = headersize & 0x000000ffU;
2050 for(loopcounter = 0; loopcounter < headersize; loopcounter++)
2052 hcryp->Init.pScratch[bufferidx++] = hcryp->Init.Header[loopcounter];
2055 if ((headersize % 16) != 0)
2058 for(loopcounter = headersize; loopcounter <= ((headersize/16) + 1) * 16; loopcounter++)
2060 hcryp->Init.pScratch[loopcounter] = 0;
2063 headersize = ((headersize/16) + 1) * 16;
2066 headeraddr = (uint32_t)hcryp->Init.pScratch;
2075 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2))) >> 1) & (uint8_t)0x07 ) << 3);
2076 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15) - hcryp->Init.IVSize) - (uint8_t)1) & (uint8_t)0x07);
2078 for (loopcounter = 0; loopcounter < hcryp->Init.IVSize; loopcounter++)
2080 blockb0[loopcounter+1] = hcryp->Init.pInitVect[loopcounter];
2082 for ( ; loopcounter < 13; loopcounter++)
2084 blockb0[loopcounter+1] = 0;
2087 blockb0[14] = (Size >> 8);
2088 blockb0[15] = (Size & 0xFF);
2097 ctr[0] = blockb0[0] & 0x07;
2099 for(loopcounter = 1; loopcounter < hcryp->Init.IVSize + 1; loopcounter++)
2101 ctr[loopcounter] = blockb0[loopcounter];
2107 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
2110 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CCM_DECRYPT);
2113 CRYPEx_GCMCCM_SetInitVector(hcryp, ctr);
2116 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
2118 b0addr = (uint32_t)blockb0;
2120 hcryp->Instance->DR = *(uint32_t*)(b0addr);
2122 hcryp->Instance->DR = *(uint32_t*)(b0addr);
2124 hcryp->Instance->DR = *(uint32_t*)(b0addr);
2126 hcryp->Instance->DR = *(uint32_t*)(b0addr);
2129 __HAL_CRYP_ENABLE(hcryp);
2137 if((
HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
2140 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
2152 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
2155 __HAL_CRYP_ENABLE(hcryp);
2157 for(loopcounter = 0; (loopcounter < headersize); loopcounter+=16)
2165 if((
HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
2168 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
2177 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
2179 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
2181 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
2183 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
2190 while((hcryp->Instance->SR & CRYP_FLAG_BUSY) == CRYP_FLAG_BUSY)
2193 if((
HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
2196 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
2206 for(loopcounter = 0; (loopcounter < 16); loopcounter++)
2208 hcryp->Init.pScratch[loopcounter] = ctr[loopcounter];
2211 hcryp->Init.pScratch[15] &= 0xfe;
2213 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
2216 __HAL_CRYP_FIFO_FLUSH(hcryp);
2219 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
2223 __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI);
2226 __HAL_CRYP_ENABLE(hcryp);
2231 else if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI))
2233 inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
2235 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
2237 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
2239 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
2241 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
2242 hcryp->pCrypInBuffPtr += 16;
2243 hcryp->CrypInCount -= 16;
2244 if(hcryp->CrypInCount == 0)
2246 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI);
2248 HAL_CRYP_InCpltCallback(hcryp);
2251 else if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI))
2253 outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr;
2255 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
2257 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
2259 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
2261 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
2262 hcryp->pCrypOutBuffPtr += 16;
2263 hcryp->CrypOutCount -= 16;
2264 if(hcryp->CrypOutCount == 0)
2266 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI);
2270 hcryp->State = HAL_CRYP_STATE_READY;
2272 HAL_CRYP_OutCpltCallback(hcryp);
2289 HAL_StatusTypeDef HAL_CRYPEx_AESGCM_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData)
2291 uint32_t tickstart = 0;
2293 uint32_t outputaddr;
2295 if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS))
2300 inputaddr = (uint32_t)pPlainData;
2301 outputaddr = (uint32_t)pCypherData;
2304 hcryp->State = HAL_CRYP_STATE_BUSY;
2307 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
2310 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
2313 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_GCM_ENCRYPT);
2316 CRYPEx_GCMCCM_SetInitVector(hcryp, hcryp->Init.pInitVect);
2319 __HAL_CRYP_FIFO_FLUSH(hcryp);
2322 __HAL_CRYP_ENABLE(hcryp);
2330 if((
HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
2333 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
2342 __HAL_CRYP_FIFO_FLUSH(hcryp);
2345 if(CRYPEx_GCMCCM_SetHeaderPhase(hcryp, hcryp->Init.Header, hcryp->Init.HeaderSize, 1) !=
HAL_OK)
2350 __HAL_CRYP_DISABLE(hcryp);
2353 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
2356 __HAL_CRYP_FIFO_FLUSH(hcryp);
2359 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
2363 CRYPEx_GCMCCM_SetDMAConfig(hcryp, inputaddr, Size, outputaddr);
2386 HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData)
2388 uint32_t tickstart = 0;
2390 uint32_t outputaddr;
2391 uint32_t headersize;
2392 uint32_t headeraddr;
2393 uint32_t loopcounter = 0;
2394 uint32_t bufferidx = 0;
2395 uint8_t blockb0[16] = {0};
2396 uint8_t ctr[16] = {0};
2397 uint32_t b0addr = (uint32_t)blockb0;
2399 if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS))
2404 inputaddr = (uint32_t)pPlainData;
2405 outputaddr = (uint32_t)pCypherData;
2407 headersize = hcryp->Init.HeaderSize;
2408 headeraddr = (uint32_t)hcryp->Init.Header;
2410 hcryp->CrypInCount = Size;
2411 hcryp->pCrypInBuffPtr = pPlainData;
2412 hcryp->pCrypOutBuffPtr = pCypherData;
2413 hcryp->CrypOutCount = Size;
2416 hcryp->State = HAL_CRYP_STATE_BUSY;
2419 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
2425 if(headersize < 65280)
2427 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFFU);
2428 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFFU);
2434 hcryp->Init.pScratch[bufferidx++] = 0xFFU;
2435 hcryp->Init.pScratch[bufferidx++] = 0xFEU;
2436 hcryp->Init.pScratch[bufferidx++] = headersize & 0xff000000U;
2437 hcryp->Init.pScratch[bufferidx++] = headersize & 0x00ff0000U;
2438 hcryp->Init.pScratch[bufferidx++] = headersize & 0x0000ff00U;
2439 hcryp->Init.pScratch[bufferidx++] = headersize & 0x000000ffU;
2443 for(loopcounter = 0; loopcounter < headersize; loopcounter++)
2445 hcryp->Init.pScratch[bufferidx++] = hcryp->Init.Header[loopcounter];
2448 if ((headersize % 16) != 0)
2451 for(loopcounter = headersize; loopcounter <= ((headersize/16) + 1) * 16; loopcounter++)
2453 hcryp->Init.pScratch[loopcounter] = 0;
2456 headersize = ((headersize/16) + 1) * 16;
2459 headeraddr = (uint32_t)hcryp->Init.pScratch;
2468 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2))) >> 1) & (uint8_t)0x07 ) << 3);
2469 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15) - hcryp->Init.IVSize) - (uint8_t)1) & (uint8_t)0x07);
2471 for (loopcounter = 0; loopcounter < hcryp->Init.IVSize; loopcounter++)
2473 blockb0[loopcounter+1] = hcryp->Init.pInitVect[loopcounter];
2475 for ( ; loopcounter < 13; loopcounter++)
2477 blockb0[loopcounter+1] = 0;
2480 blockb0[14] = (Size >> 8);
2481 blockb0[15] = (Size & 0xFF);
2490 ctr[0] = blockb0[0] & 0x07;
2492 for(loopcounter = 1; loopcounter < hcryp->Init.IVSize + 1; loopcounter++)
2494 ctr[loopcounter] = blockb0[loopcounter];
2500 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
2503 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CCM_ENCRYPT);
2506 CRYPEx_GCMCCM_SetInitVector(hcryp, ctr);
2509 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
2511 b0addr = (uint32_t)blockb0;
2513 hcryp->Instance->DR = *(uint32_t*)(b0addr);
2515 hcryp->Instance->DR = *(uint32_t*)(b0addr);
2517 hcryp->Instance->DR = *(uint32_t*)(b0addr);
2519 hcryp->Instance->DR = *(uint32_t*)(b0addr);
2522 __HAL_CRYP_ENABLE(hcryp);
2530 if((
HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
2533 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
2545 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
2548 __HAL_CRYP_ENABLE(hcryp);
2550 for(loopcounter = 0; (loopcounter < headersize); loopcounter+=16)
2558 if((
HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
2561 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
2570 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
2572 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
2574 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
2576 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
2583 while((hcryp->Instance->SR & CRYP_FLAG_BUSY) == CRYP_FLAG_BUSY)
2586 if((
HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
2589 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
2599 for(loopcounter = 0; (loopcounter < 16); loopcounter++)
2601 hcryp->Init.pScratch[loopcounter] = ctr[loopcounter];
2604 hcryp->Init.pScratch[15] &= 0xfe;
2607 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
2610 __HAL_CRYP_FIFO_FLUSH(hcryp);
2613 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
2617 CRYPEx_GCMCCM_SetDMAConfig(hcryp, inputaddr, Size, outputaddr);
2640 HAL_StatusTypeDef HAL_CRYPEx_AESGCM_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData)
2642 uint32_t tickstart = 0;
2644 uint32_t outputaddr;
2646 if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS))
2651 inputaddr = (uint32_t)pCypherData;
2652 outputaddr = (uint32_t)pPlainData;
2655 hcryp->State = HAL_CRYP_STATE_BUSY;
2658 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
2661 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
2664 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_GCM_DECRYPT);
2667 CRYPEx_GCMCCM_SetInitVector(hcryp, hcryp->Init.pInitVect);
2670 __HAL_CRYP_ENABLE(hcryp);
2678 if((
HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
2681 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
2691 if(CRYPEx_GCMCCM_SetHeaderPhase(hcryp, hcryp->Init.Header, hcryp->Init.HeaderSize, 1) !=
HAL_OK)
2696 __HAL_CRYP_DISABLE(hcryp);
2699 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
2702 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
2706 CRYPEx_GCMCCM_SetDMAConfig(hcryp, inputaddr, Size, outputaddr);
2730 HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData)
2732 uint32_t tickstart = 0;
2734 uint32_t outputaddr;
2735 uint32_t headersize;
2736 uint32_t headeraddr;
2737 uint32_t loopcounter = 0;
2738 uint32_t bufferidx = 0;
2739 uint8_t blockb0[16] = {0};
2740 uint8_t ctr[16] = {0};
2741 uint32_t b0addr = (uint32_t)blockb0;
2743 if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS))
2748 inputaddr = (uint32_t)pCypherData;
2749 outputaddr = (uint32_t)pPlainData;
2751 headersize = hcryp->Init.HeaderSize;
2752 headeraddr = (uint32_t)hcryp->Init.Header;
2754 hcryp->CrypInCount = Size;
2755 hcryp->pCrypInBuffPtr = pCypherData;
2756 hcryp->pCrypOutBuffPtr = pPlainData;
2757 hcryp->CrypOutCount = Size;
2760 hcryp->State = HAL_CRYP_STATE_BUSY;
2763 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
2769 if(headersize < 65280)
2771 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFFU);
2772 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFFU);
2778 hcryp->Init.pScratch[bufferidx++] = 0xFFU;
2779 hcryp->Init.pScratch[bufferidx++] = 0xFEU;
2780 hcryp->Init.pScratch[bufferidx++] = headersize & 0xff000000U;
2781 hcryp->Init.pScratch[bufferidx++] = headersize & 0x00ff0000U;
2782 hcryp->Init.pScratch[bufferidx++] = headersize & 0x0000ff00U;
2783 hcryp->Init.pScratch[bufferidx++] = headersize & 0x000000ffU;
2787 for(loopcounter = 0; loopcounter < headersize; loopcounter++)
2789 hcryp->Init.pScratch[bufferidx++] = hcryp->Init.Header[loopcounter];
2792 if ((headersize % 16) != 0)
2795 for(loopcounter = headersize; loopcounter <= ((headersize/16) + 1) * 16; loopcounter++)
2797 hcryp->Init.pScratch[loopcounter] = 0;
2800 headersize = ((headersize/16) + 1) * 16;
2803 headeraddr = (uint32_t)hcryp->Init.pScratch;
2812 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2))) >> 1) & (uint8_t)0x07 ) << 3);
2813 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15) - hcryp->Init.IVSize) - (uint8_t)1) & (uint8_t)0x07);
2815 for (loopcounter = 0; loopcounter < hcryp->Init.IVSize; loopcounter++)
2817 blockb0[loopcounter+1] = hcryp->Init.pInitVect[loopcounter];
2819 for ( ; loopcounter < 13; loopcounter++)
2821 blockb0[loopcounter+1] = 0;
2824 blockb0[14] = (Size >> 8);
2825 blockb0[15] = (Size & 0xFF);
2834 ctr[0] = blockb0[0] & 0x07;
2836 for(loopcounter = 1; loopcounter < hcryp->Init.IVSize + 1; loopcounter++)
2838 ctr[loopcounter] = blockb0[loopcounter];
2844 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
2847 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CCM_DECRYPT);
2850 CRYPEx_GCMCCM_SetInitVector(hcryp, ctr);
2853 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
2855 b0addr = (uint32_t)blockb0;
2857 hcryp->Instance->DR = *(uint32_t*)(b0addr);
2859 hcryp->Instance->DR = *(uint32_t*)(b0addr);
2861 hcryp->Instance->DR = *(uint32_t*)(b0addr);
2863 hcryp->Instance->DR = *(uint32_t*)(b0addr);
2866 __HAL_CRYP_ENABLE(hcryp);
2875 if((
HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
2878 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
2891 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
2894 __HAL_CRYP_ENABLE(hcryp);
2896 for(loopcounter = 0; (loopcounter < headersize); loopcounter+=16)
2904 if((
HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
2907 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
2916 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
2918 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
2920 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
2922 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
2929 while((hcryp->Instance->SR & CRYP_FLAG_BUSY) == CRYP_FLAG_BUSY)
2932 if((
HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
2935 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
2945 for(loopcounter = 0; (loopcounter < 16); loopcounter++)
2947 hcryp->Init.pScratch[loopcounter] = ctr[loopcounter];
2950 hcryp->Init.pScratch[15] &= 0xfe;
2952 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
2955 __HAL_CRYP_FIFO_FLUSH(hcryp);
2958 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
2961 CRYPEx_GCMCCM_SetDMAConfig(hcryp, inputaddr, Size, outputaddr);
2998 void HAL_CRYPEx_GCMCCM_IRQHandler(CRYP_HandleTypeDef *hcryp)
3000 switch(
CRYP->CR & CRYP_CR_ALGOMODE_DIRECTION)
3002 case CRYP_CR_ALGOMODE_AES_GCM_ENCRYPT:
3003 HAL_CRYPEx_AESGCM_Encrypt_IT(hcryp,
NULL, 0,
NULL);
3006 case CRYP_CR_ALGOMODE_AES_GCM_DECRYPT:
3007 HAL_CRYPEx_AESGCM_Decrypt_IT(hcryp,
NULL, 0,
NULL);
3010 case CRYP_CR_ALGOMODE_AES_CCM_ENCRYPT:
3011 HAL_CRYPEx_AESCCM_Encrypt_IT(hcryp,
NULL, 0,
NULL);
3014 case CRYP_CR_ALGOMODE_AES_CCM_DECRYPT:
3015 HAL_CRYPEx_AESCCM_Decrypt_IT(hcryp,
NULL, 0,
NULL);
#define __HAL_UNLOCK(__HANDLE__)
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
#define __HAL_LOCK(__HANDLE__)
This file contains all the functions prototypes for the HAL module driver.
#define HAL_IS_BIT_CLR(REG, BIT)
#define __ROR
Rotate Right in unsigned value (32 bit)
DMA handle Structure definition.
#define __REV
Reverse byte order (32 bit)
HAL_StatusTypeDef
HAL Status structures definition.
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.