Skip to content

Commit 29dc0f5

Browse files
authored
Merge pull request wolfSSL#8223 from LinuxJedi/STM32MP1
Initial support for STM32MP13 HAL
2 parents ea8c7c8 + 5d0ee8c commit 29dc0f5

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)