Skip to content

Commit 5d0ee8c

Browse files
committed
Initial support for STM32MP13 HAL
This adds support for the STM32MP13 HAL, tested on the STM32MP135F MPU. Using the HAL this modifies our previous RNG, AES-CBC, AES-GCM, HASH, ECDSA and DES3 ST HAL acceleration to work with the MPU. It also works around bugs found in the AES-GCM code of the HAL. The HAL does not appear to have support for MD5 HASH at the moment, so this has been given a flag to disable it on this MPU.
1 parent 40154e1 commit 5d0ee8c

11 files changed

Lines changed: 334 additions & 22 deletions

File tree

.wolfssl_known_macro_extras

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,7 @@ __ARCH_STRNCPY_NO_REDIRECT
869869
__ARCH_STRSTR_NO_REDIRECT
870870
__ARM_ARCH_7M__
871871
__ARM_FEATURE_CRYPTO
872+
__ASSEMBLER__
872873
__ATOMIC_RELAXED
873874
__AVR__
874875
__BCPLUSPLUS__

wolfcrypt/src/aes.c

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8161,8 +8161,18 @@ static WARN_UNUSED_RESULT int wc_AesGcmEncrypt_STM32(
81618161

81628162
/* Authentication buffer - must be 4-byte multiple zero padded */
81638163
authPadSz = authInSz % sizeof(word32);
8164+
#ifdef WOLFSSL_STM32MP13
8165+
/* STM32MP13 HAL at least v1.2 and lower has a bug with which it needs a
8166+
* minimum of 16 bytes for the auth
8167+
*/
8168+
if ((authInSz > 0) && (authInSz < 16)) {
8169+
authPadSz = 16 - authInSz;
8170+
}
8171+
#endif
81648172
if (authPadSz != 0) {
8165-
authPadSz = authInSz + sizeof(word32) - authPadSz;
8173+
if (authPadSz < authInSz + sizeof(word32)) {
8174+
authPadSz = authInSz + sizeof(word32) - authPadSz;
8175+
}
81668176
if (authPadSz <= sizeof(authhdr)) {
81678177
authInPadded = (byte*)authhdr;
81688178
}
@@ -8185,11 +8195,12 @@ static WARN_UNUSED_RESULT int wc_AesGcmEncrypt_STM32(
81858195
/* for cases where hardware cannot be used for authTag calculate it */
81868196
/* if IV is not 12 calculate GHASH using software */
81878197
if (ivSz != GCM_NONCE_MID_SZ
8188-
#ifndef CRYP_HEADERWIDTHUNIT_BYTE
8198+
#if !defined(CRYP_HEADERWIDTHUNIT_BYTE) || defined(WOLFSSL_STM32MP13)
81898199
/* or hardware that does not support partial block */
81908200
|| sz == 0 || partial != 0
81918201
#endif
8192-
#if !defined(CRYP_HEADERWIDTHUNIT_BYTE) && !defined(STM32_AESGCM_PARTIAL)
8202+
#if (!defined(CRYP_HEADERWIDTHUNIT_BYTE) || defined(WOLFSSL_STM32MP13)) \
8203+
&& !defined(STM32_AESGCM_PARTIAL)
81938204
/* or authIn is not a multiple of 4 */
81948205
|| authPadSz != authInSz
81958206
#endif
@@ -8204,13 +8215,14 @@ static WARN_UNUSED_RESULT int wc_AesGcmEncrypt_STM32(
82048215
if (ret != 0) {
82058216
return ret;
82068217
}
8218+
82078219
#ifdef WOLFSSL_STM32_CUBEMX
82088220
hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)ctr;
82098221
hcryp.Init.Header = (STM_CRYPT_TYPE*)authInPadded;
82108222

82118223
#if defined(STM32_HAL_V2)
82128224
hcryp.Init.Algorithm = CRYP_AES_GCM;
8213-
#ifdef CRYP_HEADERWIDTHUNIT_BYTE
8225+
#if defined(CRYP_HEADERWIDTHUNIT_BYTE) && !defined(WOLFSSL_STM32MP13)
82148226
/* V2 with CRYP_HEADERWIDTHUNIT_BYTE uses byte size for header */
82158227
hcryp.Init.HeaderSize = authInSz;
82168228
#else
@@ -8693,14 +8705,24 @@ static WARN_UNUSED_RESULT int wc_AesGcmDecrypt_STM32(
86938705
authPadSz = authInSz;
86948706
}
86958707

8708+
#ifdef WOLFSSL_STM32MP13
8709+
/* STM32MP13 HAL at least v1.2 and lower has a bug with which it needs a
8710+
* minimum of 16 bytes for the auth
8711+
*/
8712+
if ((authInSz > 0) && (authInSz < 16)) {
8713+
authPadSz = 16 - authInSz;
8714+
}
8715+
#endif
8716+
86968717
/* for cases where hardware cannot be used for authTag calculate it */
86978718
/* if IV is not 12 calculate GHASH using software */
86988719
if (ivSz != GCM_NONCE_MID_SZ
8699-
#ifndef CRYP_HEADERWIDTHUNIT_BYTE
8720+
#if !defined(CRYP_HEADERWIDTHUNIT_BYTE) || defined(WOLFSSL_STM32MP13)
87008721
/* or hardware that does not support partial block */
87018722
|| sz == 0 || partial != 0
87028723
#endif
8703-
#if !defined(CRYP_HEADERWIDTHUNIT_BYTE) && !defined(STM32_AESGCM_PARTIAL)
8724+
#if (!defined(CRYP_HEADERWIDTHUNIT_BYTE) || defined(WOLFSSL_STM32MP13)) \
8725+
&& !defined(STM32_AESGCM_PARTIAL)
87048726
/* or authIn is not a multiple of 4 */
87058727
|| authPadSz != authInSz
87068728
#endif
@@ -8746,7 +8768,7 @@ static WARN_UNUSED_RESULT int wc_AesGcmDecrypt_STM32(
87468768

87478769
#if defined(STM32_HAL_V2)
87488770
hcryp.Init.Algorithm = CRYP_AES_GCM;
8749-
#ifdef CRYP_HEADERWIDTHUNIT_BYTE
8771+
#if defined(CRYP_HEADERWIDTHUNIT_BYTE) && !defined(WOLFSSL_STM32MP13)
87508772
/* V2 with CRYP_HEADERWIDTHUNIT_BYTE uses byte size for header */
87518773
hcryp.Init.HeaderSize = authInSz;
87528774
#else

wolfcrypt/src/des3.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,13 @@
163163
STM32_HAL_TIMEOUT);
164164
}
165165
/* save off IV */
166-
des->reg[0] = hcryp.Instance->IV0LR;
167-
des->reg[1] = hcryp.Instance->IV0RR;
166+
#ifdef WOLFSSL_STM32MP13
167+
des->reg[0] = ((CRYP_TypeDef *)(hcryp.Instance))->IV0LR;
168+
des->reg[1] = ((CRYP_TypeDef *)(hcryp.Instance))->IV0RR;
169+
#else
170+
des->reg[0] = hcryp.Instance->IV0LR;
171+
des->reg[1] = hcryp.Instance->IV0RR;
172+
#endif
168173
#else
169174
while (sz > 0) {
170175
/* if input and output same will overwrite input iv */
@@ -324,8 +329,13 @@
324329
STM32_HAL_TIMEOUT);
325330
}
326331
/* save off IV */
327-
des->reg[0] = hcryp.Instance->IV0LR;
328-
des->reg[1] = hcryp.Instance->IV0RR;
332+
#ifdef WOLFSSL_STM32MP13
333+
des->reg[0] = ((CRYP_TypeDef *)(hcryp.Instance))->IV0LR;
334+
des->reg[1] = ((CRYP_TypeDef *)(hcryp.Instance))->IV0RR;
335+
#else
336+
des->reg[0] = hcryp.Instance->IV0LR;
337+
des->reg[1] = hcryp.Instance->IV0RR;
338+
#endif
329339
#else
330340
while (sz > 0) {
331341
if (dir == DES_ENCRYPTION) {

wolfcrypt/src/include.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ EXTRA_DIST += wolfcrypt/src/port/ti/ti-aes.c \
103103
wolfcrypt/src/port/st/stm32.c \
104104
wolfcrypt/src/port/st/stsafe.c \
105105
wolfcrypt/src/port/st/README.md \
106+
wolfcrypt/src/port/st/STM32MP13.md \
106107
wolfcrypt/src/port/af_alg/afalg_aes.c \
107108
wolfcrypt/src/port/af_alg/afalg_hash.c \
108109
wolfcrypt/src/port/kcapi/kcapi_aes.c \

wolfcrypt/src/md5.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848

4949

5050
/* Hardware Acceleration */
51-
#if defined(STM32_HASH)
51+
#if defined(STM32_HASH) && !defined(STM32_NOMD5)
5252

5353
/* Supports CubeMX HAL or Standard Peripheral Library */
5454
#define HAVE_MD5_CUST_API

wolfcrypt/src/port/st/README.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
# ST Ports
22

3-
Support for the STM32 L4, F1, F2, F4 and F7 on-board crypto hardware acceleration:
3+
Support for the STM32 L4, F1, F2, F4, F7 and MP13 on-board crypto hardware
4+
acceleration:
45
- symmetric AES (ECB/CBC/CTR/GCM)
5-
- MD5/SHA1/SHA224/SHA256
6+
- MD5/SHA1/SHA224/SHA256 (MP13 does not have MD5 acceleration)
67

7-
Support for the STM32 PKA on WB55, H7 and other devices with on-board public-key acceleration:
8+
Support for the STM32 PKA on WB55, H7, MP13 and other devices with on-board
9+
public-key acceleration:
810
- ECC192/ECC224/ECC256/ECC384
911

1012
Support for the STSAFE-A100 crypto hardware accelerator co-processor via I2C for ECC supporting NIST or Brainpool 256-bit and 384-bit curves. It requires the ST-Safe SDK including wolf stsafe_interface.c/.h files. Please contact ST for these.

0 commit comments

Comments
 (0)