Skip to content

Commit cc1e4f0

Browse files
author
Cruz Monrreal
authored
Merge pull request #7205 from bcostm/fix_hash_data_alignment
STM32: Fix data alignment issue in HASH function for F2, F7, L4
2 parents e8005f6 + b5a8dc5 commit cc1e4f0

File tree

4 files changed

+37
-20
lines changed

4 files changed

+37
-20
lines changed

targets/TARGET_STM/TARGET_STM32F2/device/stm32f2xx_hal_hash.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,12 +225,14 @@ static void HASH_DMAError(DMA_HandleTypeDef *hdma)
225225
static void HASH_WriteData(uint8_t *pInBuffer, uint32_t Size)
226226
{
227227
uint32_t buffercounter;
228-
uint32_t inputaddr = (uint32_t) pInBuffer;
229228

230229
for(buffercounter = 0U; buffercounter < Size; buffercounter+=4U)
231230
{
232-
HASH->DIN = *(uint32_t*)inputaddr;
233-
inputaddr+=4U;
231+
uint32_t data = (uint32_t) *pInBuffer++;
232+
data |= (uint32_t) *pInBuffer++ << 8;
233+
data |= (uint32_t) *pInBuffer++ << 16;
234+
data |= (uint32_t) *pInBuffer++ << 24;
235+
HASH->DIN = data;
234236
}
235237
}
236238

targets/TARGET_STM/TARGET_STM32F7/device/stm32f7xx_hal_hash.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,12 +222,14 @@ static void HASH_DMAError(DMA_HandleTypeDef *hdma)
222222
static void HASH_WriteData(uint8_t *pInBuffer, uint32_t Size)
223223
{
224224
uint32_t buffercounter;
225-
uint32_t inputaddr = (uint32_t) pInBuffer;
226225

227226
for(buffercounter = 0; buffercounter < Size; buffercounter+=4)
228227
{
229-
HASH->DIN = *(uint32_t*)inputaddr;
230-
inputaddr+=4;
228+
uint32_t data = (uint32_t) *pInBuffer++;
229+
data |= (uint32_t) *pInBuffer++ << 8;
230+
data |= (uint32_t) *pInBuffer++ << 16;
231+
data |= (uint32_t) *pInBuffer++ << 24;
232+
HASH->DIN = data;
231233
}
232234
}
233235

targets/TARGET_STM/TARGET_STM32F7/device/stm32f7xx_hal_hash_ex.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,14 @@ static void HASHEx_DMAError(DMA_HandleTypeDef *hdma);
136136
static void HASHEx_WriteData(uint8_t *pInBuffer, uint32_t Size)
137137
{
138138
uint32_t buffercounter;
139-
uint32_t inputaddr = (uint32_t) pInBuffer;
140139

141140
for(buffercounter = 0; buffercounter < Size; buffercounter+=4)
142141
{
143-
HASH->DIN = *(uint32_t*)inputaddr;
144-
inputaddr+=4;
142+
uint32_t data = (uint32_t) *pInBuffer++;
143+
data |= (uint32_t) *pInBuffer++ << 8;
144+
data |= (uint32_t) *pInBuffer++ << 16;
145+
data |= (uint32_t) *pInBuffer++ << 24;
146+
HASH->DIN = data;
145147
}
146148
}
147149

targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_hash.c

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1349,13 +1349,15 @@ static void HASH_DMAError(DMA_HandleTypeDef *hdma)
13491349
static HAL_StatusTypeDef HASH_WriteData(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
13501350
{
13511351
uint32_t buffercounter;
1352-
__IO uint32_t inputaddr = (uint32_t) pInBuffer;
13531352

13541353
for(buffercounter = 0; buffercounter < Size; buffercounter+=4)
13551354
{
13561355
/* Write input data 4 bytes at a time */
1357-
HASH->DIN = *(uint32_t*)inputaddr;
1358-
inputaddr+=4;
1356+
uint32_t data = (uint32_t) *pInBuffer++;
1357+
data |= (uint32_t) *pInBuffer++ << 8;
1358+
data |= (uint32_t) *pInBuffer++ << 16;
1359+
data |= (uint32_t) *pInBuffer++ << 24;
1360+
HASH->DIN = data;
13591361

13601362
/* If the suspension flag has been raised and if the processing is not about
13611363
to end, suspend processing */
@@ -1373,14 +1375,14 @@ static HAL_StatusTypeDef HASH_WriteData(HASH_HandleTypeDef *hhash, uint8_t *pInB
13731375
if ((hhash->Phase == HAL_HASH_PHASE_PROCESS) || (hhash->Phase == HAL_HASH_PHASE_HMAC_STEP_2))
13741376
{
13751377
/* Save current reading and writing locations of Input and Output buffers */
1376-
hhash->pHashInBuffPtr = (uint8_t *)inputaddr;
1378+
hhash->pHashInBuffPtr = pInBuffer;
13771379
/* Save the number of bytes that remain to be processed at this point */
13781380
hhash->HashInCount = Size - (buffercounter + 4);
13791381
}
13801382
else if ((hhash->Phase == HAL_HASH_PHASE_HMAC_STEP_1) || (hhash->Phase == HAL_HASH_PHASE_HMAC_STEP_3))
13811383
{
13821384
/* Save current reading and writing locations of Input and Output buffers */
1383-
hhash->pHashKeyBuffPtr = (uint8_t *)inputaddr;
1385+
hhash->pHashKeyBuffPtr = pInBuffer;
13841386
/* Save the number of bytes that remain to be processed at this point */
13851387
hhash->HashKeyCount = Size - (buffercounter + 4);
13861388
}
@@ -1686,15 +1688,21 @@ static uint32_t HASH_Write_Block_Data(HASH_HandleTypeDef *hhash)
16861688
(16 32-bit words, or 64 bytes are entered) */
16871689
for(buffercounter = 0; buffercounter < 64; buffercounter+=4)
16881690
{
1689-
HASH->DIN = *(uint32_t*)inputaddr;
1690-
inputaddr+=4;
1691+
uint32_t data = (uint32_t) *(uint8_t *)inputaddr++;
1692+
data |= (uint32_t) *(uint8_t *)inputaddr++ << 8;
1693+
data |= (uint32_t) *(uint8_t *)inputaddr++ << 16;
1694+
data |= (uint32_t) *(uint8_t *)inputaddr++ << 24;
1695+
HASH->DIN = data;
16911696
}
16921697
/* If this is the start of input data entering, an additional word
16931698
must be entered to start up the HASH processing */
16941699
if(hhash->HashITCounter == 2)
16951700
{
1696-
HASH->DIN = *(uint32_t*)inputaddr;
1697-
inputaddr+=4;
1701+
uint32_t data = (uint32_t) *(uint8_t *)inputaddr++;
1702+
data |= (uint32_t) *(uint8_t *)inputaddr++ << 8;
1703+
data |= (uint32_t) *(uint8_t *)inputaddr++ << 16;
1704+
data |= (uint32_t) *(uint8_t *)inputaddr++ << 24;
1705+
HASH->DIN = data;
16981706
if(hhash->HashInCount >= 68)
16991707
{
17001708
/* There are still data waiting to be entered in the IP.
@@ -1733,8 +1741,11 @@ static uint32_t HASH_Write_Block_Data(HASH_HandleTypeDef *hhash)
17331741
/* Write the Input block in the Data IN register */
17341742
for(buffercounter = 0; buffercounter < (inputcounter+3)/4; buffercounter++)
17351743
{
1736-
HASH->DIN = *(uint32_t*)inputaddr;
1737-
inputaddr+=4;
1744+
uint32_t data = (uint32_t) *(uint8_t *)inputaddr++;
1745+
data |= (uint32_t) *(uint8_t *)inputaddr++ << 8;
1746+
data |= (uint32_t) *(uint8_t *)inputaddr++ << 16;
1747+
data |= (uint32_t) *(uint8_t *)inputaddr++ << 24;
1748+
HASH->DIN = data;
17381749
}
17391750
/* Start the Digest calculation */
17401751
__HAL_HASH_START_DIGEST();

0 commit comments

Comments
 (0)