101 #if defined(STM32F756xx) || defined(STM32F777xx) || defined(STM32F779xx) 108 #ifdef HAL_HASH_MODULE_ENABLED 119 static void HASHEx_WriteData(uint8_t *pInBuffer, uint32_t Size);
120 static void HASHEx_GetDigest(uint8_t *pMsgDigest, uint8_t Size);
138 static void HASHEx_WriteData(uint8_t *pInBuffer, uint32_t Size)
140 uint32_t buffercounter;
141 uint32_t inputaddr = (uint32_t) pInBuffer;
143 for(buffercounter = 0; buffercounter < Size; buffercounter+=4)
145 HASH->DIN = *(uint32_t*)inputaddr;
156 static void HASHEx_GetDigest(uint8_t *pMsgDigest, uint8_t Size)
158 uint32_t msgdigest = (uint32_t)pMsgDigest;
164 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[0]);
166 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[1]);
168 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[2]);
170 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[3]);
174 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[0]);
176 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[1]);
178 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[2]);
180 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[3]);
182 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[4]);
186 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[0]);
188 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[1]);
190 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[2]);
192 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[3]);
194 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[4]);
202 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[0]);
204 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[1]);
206 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[2]);
208 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[3]);
210 *(uint32_t*)(msgdigest) =
__REV(
HASH->HR[4]);
230 HASH_HandleTypeDef* hhash = ( HASH_HandleTypeDef* )((
DMA_HandleTypeDef* )hdma)->Parent;
231 uint32_t inputaddr = 0;
232 uint32_t buffersize = 0;
240 hhash->State = HAL_HASH_STATE_READY;
243 HAL_HASH_InCpltCallback(hhash);
248 hhash->HashInCount++;
252 if(hhash->HashInCount <= 2)
255 if(hhash->HashInCount == 1)
257 inputaddr = (uint32_t)hhash->pHashInBuffPtr;
258 buffersize = hhash->HashBuffSize;
261 else if(hhash->HashInCount == 2)
263 inputaddr = (uint32_t)hhash->Init.pKey;
264 buffersize = hhash->Init.KeySize;
270 hhash->hdmain->XferCpltCallback = HASHEx_DMAXferCplt;
273 HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&
HASH->DIN, (buffersize%4 ? (buffersize+3)/4:buffersize/4));
284 hhash->HashInCount = 0;
287 hhash->State = HAL_HASH_STATE_READY;
290 HAL_HASH_InCpltCallback(hhash);
302 HASH_HandleTypeDef* hhash = ( HASH_HandleTypeDef* )((
DMA_HandleTypeDef* )hdma)->Parent;
303 hhash->State= HAL_HASH_STATE_READY;
304 HAL_HASH_ErrorCallback(hhash);
344 HAL_StatusTypeDef HAL_HASHEx_SHA224_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout)
346 uint32_t tickstart = 0;
352 hhash->State = HAL_HASH_STATE_BUSY;
355 if(hhash->Phase == HAL_HASH_PHASE_READY)
363 hhash->Phase = HAL_HASH_PHASE_PROCESS;
366 __HAL_HASH_SET_NBVALIDBITS(Size);
369 HASHEx_WriteData(pInBuffer, Size);
372 __HAL_HASH_START_DIGEST();
377 while((
HASH->SR & HASH_FLAG_BUSY) == HASH_FLAG_BUSY)
382 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
385 hhash->State = HAL_HASH_STATE_TIMEOUT;
396 HASHEx_GetDigest(pOutBuffer, 28);
399 hhash->State = HAL_HASH_STATE_READY;
420 HAL_StatusTypeDef HAL_HASHEx_SHA256_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout)
422 uint32_t tickstart = 0;
428 hhash->State = HAL_HASH_STATE_BUSY;
431 if(hhash->Phase == HAL_HASH_PHASE_READY)
439 hhash->Phase = HAL_HASH_PHASE_PROCESS;
442 __HAL_HASH_SET_NBVALIDBITS(Size);
445 HASHEx_WriteData(pInBuffer, Size);
448 __HAL_HASH_START_DIGEST();
453 while((
HASH->SR & HASH_FLAG_BUSY) == HASH_FLAG_BUSY)
458 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
461 hhash->State = HAL_HASH_STATE_TIMEOUT;
472 HASHEx_GetDigest(pOutBuffer, 32);
475 hhash->State = HAL_HASH_STATE_READY;
495 HAL_StatusTypeDef HAL_HASHEx_SHA224_Accumulate(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
501 hhash->State = HAL_HASH_STATE_BUSY;
504 if(hhash->Phase == HAL_HASH_PHASE_READY)
512 hhash->Phase = HAL_HASH_PHASE_PROCESS;
515 __HAL_HASH_SET_NBVALIDBITS(Size);
518 HASHEx_WriteData(pInBuffer, Size);
521 hhash->State = HAL_HASH_STATE_READY;
541 HAL_StatusTypeDef HAL_HASHEx_SHA256_Accumulate(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
547 hhash->State = HAL_HASH_STATE_BUSY;
550 if(hhash->Phase == HAL_HASH_PHASE_READY)
558 hhash->Phase = HAL_HASH_PHASE_PROCESS;
561 __HAL_HASH_SET_NBVALIDBITS(Size);
564 HASHEx_WriteData(pInBuffer, Size);
567 hhash->State = HAL_HASH_STATE_READY;
609 HAL_StatusTypeDef HAL_HMACEx_SHA224_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout)
611 uint32_t tickstart = 0;
617 hhash->State = HAL_HASH_STATE_BUSY;
620 if(hhash->Phase == HAL_HASH_PHASE_READY)
623 if(hhash->Init.KeySize > 64)
626 HASH->CR |= (HASH_ALGOSELECTION_SHA224 | HASH_ALGOMODE_HMAC | HASH_HMAC_KEYTYPE_LONGKEY |
HASH_CR_INIT);
631 HASH->CR |= (HASH_ALGOSELECTION_SHA224 | HASH_ALGOMODE_HMAC |
HASH_CR_INIT);
636 hhash->Phase = HAL_HASH_PHASE_PROCESS;
640 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
643 HASHEx_WriteData(hhash->Init.pKey, hhash->Init.KeySize);
646 __HAL_HASH_START_DIGEST();
651 while((
HASH->SR & HASH_FLAG_BUSY) == HASH_FLAG_BUSY)
656 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
659 hhash->State = HAL_HASH_STATE_TIMEOUT;
670 __HAL_HASH_SET_NBVALIDBITS(Size);
673 HASHEx_WriteData(pInBuffer, Size);
676 __HAL_HASH_START_DIGEST();
681 while((
HASH->SR & HASH_FLAG_BUSY) == HASH_FLAG_BUSY)
689 hhash->State = HAL_HASH_STATE_TIMEOUT;
700 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
703 HASHEx_WriteData(hhash->Init.pKey, hhash->Init.KeySize);
706 __HAL_HASH_START_DIGEST();
711 while((
HASH->SR & HASH_FLAG_BUSY) == HASH_FLAG_BUSY)
719 hhash->State = HAL_HASH_STATE_TIMEOUT;
729 HASHEx_GetDigest(pOutBuffer, 28);
732 hhash->State = HAL_HASH_STATE_READY;
753 HAL_StatusTypeDef HAL_HMACEx_SHA256_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout)
755 uint32_t tickstart = 0;
761 hhash->State = HAL_HASH_STATE_BUSY;
764 if(hhash->Phase == HAL_HASH_PHASE_READY)
767 if(hhash->Init.KeySize > 64)
770 HASH->CR |= (HASH_ALGOSELECTION_SHA256 | HASH_ALGOMODE_HMAC | HASH_HMAC_KEYTYPE_LONGKEY);
775 HASH->CR |= (HASH_ALGOSELECTION_SHA256 | HASH_ALGOMODE_HMAC);
783 hhash->Phase = HAL_HASH_PHASE_PROCESS;
787 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
790 HASHEx_WriteData(hhash->Init.pKey, hhash->Init.KeySize);
793 __HAL_HASH_START_DIGEST();
798 while((
HASH->SR & HASH_FLAG_BUSY) == HASH_FLAG_BUSY)
803 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
806 hhash->State = HAL_HASH_STATE_TIMEOUT;
817 __HAL_HASH_SET_NBVALIDBITS(Size);
820 HASHEx_WriteData(pInBuffer, Size);
823 __HAL_HASH_START_DIGEST();
828 while((
HASH->SR & HASH_FLAG_BUSY) == HASH_FLAG_BUSY)
836 hhash->State = HAL_HASH_STATE_TIMEOUT;
847 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
850 HASHEx_WriteData(hhash->Init.pKey, hhash->Init.KeySize);
853 __HAL_HASH_START_DIGEST();
858 while((
HASH->SR & HASH_FLAG_BUSY) == HASH_FLAG_BUSY)
866 hhash->State = HAL_HASH_STATE_TIMEOUT;
876 HASHEx_GetDigest(pOutBuffer, 32);
879 hhash->State = HAL_HASH_STATE_READY;
919 HAL_StatusTypeDef HAL_HASHEx_SHA224_Start_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer)
922 uint32_t buffercounter;
923 uint32_t inputcounter;
928 if(hhash->State == HAL_HASH_STATE_READY)
931 hhash->State = HAL_HASH_STATE_BUSY;
933 hhash->HashInCount = Size;
934 hhash->pHashInBuffPtr = pInBuffer;
935 hhash->pHashOutBuffPtr = pOutBuffer;
938 if(hhash->Phase == HAL_HASH_PHASE_READY)
941 HASH->CR |= HASH_ALGOSELECTION_SHA224;
947 hhash->HashITCounter = 0;
949 hhash->Phase = HAL_HASH_PHASE_PROCESS;
955 HASH->IMR = (HASH_IT_DINI | HASH_IT_DCI);
960 if(__HAL_HASH_GET_FLAG(HASH_FLAG_DCIS))
963 HASHEx_GetDigest(hhash->pHashOutBuffPtr, 28);
964 if(hhash->HashInCount == 0)
969 hhash->State = HAL_HASH_STATE_READY;
971 HAL_HASH_DgstCpltCallback(hhash);
979 if(__HAL_HASH_GET_FLAG(HASH_FLAG_DINIS))
981 if(hhash->HashInCount >= 68)
983 inputaddr = (uint32_t)hhash->pHashInBuffPtr;
985 for(buffercounter = 0; buffercounter < 64; buffercounter+=4)
987 HASH->DIN = *(uint32_t*)inputaddr;
990 if(hhash->HashITCounter == 0)
992 HASH->DIN = *(uint32_t*)inputaddr;
993 if(hhash->HashInCount >= 68)
996 hhash->HashInCount -= 68;
997 hhash->pHashInBuffPtr+= 68;
1001 hhash->HashInCount = 0;
1002 hhash->pHashInBuffPtr+= hhash->HashInCount;
1005 hhash->HashITCounter = 1;
1010 hhash->HashInCount -= 64;
1011 hhash->pHashInBuffPtr+= 64;
1017 inputaddr = (uint32_t)hhash->pHashInBuffPtr;
1019 inputcounter = hhash->HashInCount;
1021 HASH->IMR &= ~(HASH_IT_DINI);
1023 __HAL_HASH_SET_NBVALIDBITS(inputcounter);
1025 if((inputcounter > 4) && (inputcounter%4))
1027 inputcounter = (inputcounter+4-inputcounter%4);
1029 else if ((inputcounter < 4) && (inputcounter != 0))
1034 for(buffercounter = 0; buffercounter < inputcounter/4; buffercounter++)
1036 HASH->DIN = *(uint32_t*)inputaddr;
1040 __HAL_HASH_START_DIGEST();
1042 hhash->HashInCount = 0;
1044 HAL_HASH_InCpltCallback(hhash);
1067 HAL_StatusTypeDef HAL_HASHEx_SHA256_Start_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer)
1070 uint32_t buffercounter;
1071 uint32_t inputcounter;
1076 if(hhash->State == HAL_HASH_STATE_READY)
1079 hhash->State = HAL_HASH_STATE_BUSY;
1081 hhash->HashInCount = Size;
1082 hhash->pHashInBuffPtr = pInBuffer;
1083 hhash->pHashOutBuffPtr = pOutBuffer;
1086 if(hhash->Phase == HAL_HASH_PHASE_READY)
1089 HASH->CR |= HASH_ALGOSELECTION_SHA256;
1096 hhash->HashITCounter = 0;
1099 hhash->Phase = HAL_HASH_PHASE_PROCESS;
1105 HASH->IMR = (HASH_IT_DINI | HASH_IT_DCI);
1110 if(__HAL_HASH_GET_FLAG(HASH_FLAG_DCIS))
1113 HASHEx_GetDigest(hhash->pHashOutBuffPtr, 32);
1114 if(hhash->HashInCount == 0)
1119 hhash->State = HAL_HASH_STATE_READY;
1121 HAL_HASH_DgstCpltCallback(hhash);
1130 if(__HAL_HASH_GET_FLAG(HASH_FLAG_DINIS))
1132 if(hhash->HashInCount >= 68)
1134 inputaddr = (uint32_t)hhash->pHashInBuffPtr;
1136 for(buffercounter = 0; buffercounter < 64; buffercounter+=4)
1138 HASH->DIN = *(uint32_t*)inputaddr;
1141 if(hhash->HashITCounter == 0)
1143 HASH->DIN = *(uint32_t*)inputaddr;
1145 if(hhash->HashInCount >= 68)
1148 hhash->HashInCount -= 68;
1149 hhash->pHashInBuffPtr+= 68;
1153 hhash->HashInCount = 0;
1154 hhash->pHashInBuffPtr+= hhash->HashInCount;
1157 hhash->HashITCounter = 1;
1162 hhash->HashInCount -= 64;
1163 hhash->pHashInBuffPtr+= 64;
1169 inputaddr = (uint32_t)hhash->pHashInBuffPtr;
1171 inputcounter = hhash->HashInCount;
1173 HASH->IMR &= ~(HASH_IT_DINI);
1175 __HAL_HASH_SET_NBVALIDBITS(inputcounter);
1177 if((inputcounter > 4) && (inputcounter%4))
1179 inputcounter = (inputcounter+4-inputcounter%4);
1181 else if ((inputcounter < 4) && (inputcounter != 0))
1187 for(buffercounter = 0; buffercounter < inputcounter/4; buffercounter++)
1189 HASH->DIN = *(uint32_t*)inputaddr;
1193 __HAL_HASH_START_DIGEST();
1195 hhash->HashInCount = 0;
1197 HAL_HASH_InCpltCallback(hhash);
1214 void HAL_HASHEx_IRQHandler(HASH_HandleTypeDef *hhash)
1219 case HASH_ALGOSELECTION_SHA224:
1220 HAL_HASHEx_SHA224_Start_IT(hhash,
NULL, 0,
NULL);
1223 case HASH_ALGOSELECTION_SHA256:
1224 HAL_HASHEx_SHA256_Start_IT(hhash,
NULL, 0,
NULL);
1263 HAL_StatusTypeDef HAL_HASHEx_SHA224_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
1265 uint32_t inputaddr = (uint32_t)pInBuffer;
1271 hhash->State = HAL_HASH_STATE_BUSY;
1274 if(hhash->Phase == HAL_HASH_PHASE_READY)
1282 __HAL_HASH_SET_NBVALIDBITS(Size);
1285 hhash->Phase = HAL_HASH_PHASE_PROCESS;
1288 hhash->hdmain->XferCpltCallback = HASHEx_DMAXferCplt;
1290 hhash->hdmain->XferErrorCallback = HASHEx_DMAError;
1293 HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&
HASH->DIN, (Size%4 ? (Size+3)/4:Size/4));
1313 HAL_StatusTypeDef HAL_HASHEx_SHA224_Finish(HASH_HandleTypeDef *hhash, uint8_t* pOutBuffer, uint32_t Timeout)
1315 uint32_t tickstart = 0;
1321 hhash->State = HAL_HASH_STATE_BUSY;
1331 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
1334 hhash->State = HAL_HASH_STATE_TIMEOUT;
1345 HASHEx_GetDigest(pOutBuffer, 28);
1348 hhash->State = HAL_HASH_STATE_READY;
1367 HAL_StatusTypeDef HAL_HASHEx_SHA256_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
1369 uint32_t inputaddr = (uint32_t)pInBuffer;
1375 hhash->State = HAL_HASH_STATE_BUSY;
1378 if(hhash->Phase == HAL_HASH_PHASE_READY)
1386 __HAL_HASH_SET_NBVALIDBITS(Size);
1389 hhash->Phase = HAL_HASH_PHASE_PROCESS;
1392 hhash->hdmain->XferCpltCallback = HASHEx_DMAXferCplt;
1394 hhash->hdmain->XferErrorCallback = HASHEx_DMAError;
1397 HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&
HASH->DIN, (Size%4 ? (Size+3)/4:Size/4));
1417 HAL_StatusTypeDef HAL_HASHEx_SHA256_Finish(HASH_HandleTypeDef *hhash, uint8_t* pOutBuffer, uint32_t Timeout)
1419 uint32_t tickstart = 0;
1425 hhash->State = HAL_HASH_STATE_BUSY;
1435 if((Timeout == 0)||((
HAL_GetTick() - tickstart ) > Timeout))
1438 hhash->State = HAL_HASH_STATE_TIMEOUT;
1449 HASHEx_GetDigest(pOutBuffer, 32);
1452 hhash->State = HAL_HASH_STATE_READY;
1491 HAL_StatusTypeDef HAL_HMACEx_SHA224_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
1499 hhash->State = HAL_HASH_STATE_BUSY;
1502 hhash->pHashInBuffPtr = pInBuffer;
1503 hhash->HashBuffSize = Size;
1504 hhash->HashInCount = 0;
1507 if(hhash->Phase == HAL_HASH_PHASE_READY)
1510 if(hhash->Init.KeySize > 64)
1513 HASH->CR |= (HASH_ALGOSELECTION_SHA224 | HASH_ALGOMODE_HMAC | HASH_HMAC_KEYTYPE_LONGKEY |
HASH_CR_INIT);
1518 HASH->CR |= (HASH_ALGOSELECTION_SHA224 | HASH_ALGOMODE_HMAC |
HASH_CR_INIT);
1523 hhash->Phase = HAL_HASH_PHASE_PROCESS;
1526 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
1529 inputaddr = (uint32_t)(hhash->Init.pKey);
1532 hhash->hdmain->XferCpltCallback = HASHEx_DMAXferCplt;
1534 hhash->hdmain->XferErrorCallback = HASHEx_DMAError;
1537 HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&
HASH->DIN, (hhash->Init.KeySize%4 ? (hhash->Init.KeySize+3)/4:hhash->Init.KeySize/4));
1558 HAL_StatusTypeDef HAL_HMACEx_SHA256_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
1566 hhash->State = HAL_HASH_STATE_BUSY;
1569 hhash->pHashInBuffPtr = pInBuffer;
1570 hhash->HashBuffSize = Size;
1571 hhash->HashInCount = 0;
1574 if(hhash->Phase == HAL_HASH_PHASE_READY)
1577 if(hhash->Init.KeySize > 64)
1580 HASH->CR |= (HASH_ALGOSELECTION_SHA256 | HASH_ALGOMODE_HMAC | HASH_HMAC_KEYTYPE_LONGKEY);
1585 HASH->CR |= (HASH_ALGOSELECTION_SHA256 | HASH_ALGOMODE_HMAC);
1593 hhash->Phase = HAL_HASH_PHASE_PROCESS;
1596 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
1599 inputaddr = (uint32_t)(hhash->Init.pKey);
1602 hhash->hdmain->XferCpltCallback = HASHEx_DMAXferCplt;
1604 hhash->hdmain->XferErrorCallback = HASHEx_DMAError;
1607 HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&
HASH->DIN, (hhash->Init.KeySize%4 ? (hhash->Init.KeySize+3)/4:hhash->Init.KeySize/4));
#define MODIFY_REG(REG, CLEARMASK, SETMASK)
#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)
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.