Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
1254cc7
[stm32wba_aes, stm32n6_cryp] Split WBA AES from WB, fix CRYP AAD flow…
AlexLanzano Oct 5, 2026
853473b
[stm32wb_pka] Abort the PKA on timeout before wiping operands
AlexLanzano Oct 5, 2026
6a56a5d
[flash, test] Guard flash unlock, check status errors, test write-whi…
AlexLanzano Oct 6, 2026
0b0037b
[flash, stm32wb, stm32c0, stm32wba, stm32h5, stm32u5, stm32f4] Fix wr…
AlexLanzano Oct 6, 2026
1a1aafb
[flash, pic32cz, stm32f411, test] Bound PIC32CZ flash ops, fix error …
AlexLanzano Oct 6, 2026
603b9d7
[eth, stm32h5, stm32n6, lan8742a] Bound Ethernet RX, add DMA barriers…
AlexLanzano Oct 6, 2026
a2accc5
[uart, dma, stm32wb, stm32wba, stm32f4, stm32l1, stm32u5, stm32n6] Fi…
AlexLanzano Oct 6, 2026
506a155
[i2c, gpio, stm32wb, stm32l1, stm32wb0, spi, reg] Scale I2C timing to…
AlexLanzano Oct 6, 2026
086d506
[timer, watchdog, pwm, irq, systick, stm32wb, stm32f0] Fix SysTick re…
AlexLanzano Oct 6, 2026
244b921
[rng, stm32wb, stm32wba, stm32u5, stm32n6, stm32h5, stm32wb0] Check l…
AlexLanzano Oct 6, 2026
e6acddb
[flash, block, spi_nor, sdhc_spi] Bound SPI-NOR 3-byte ranges, preser…
AlexLanzano Oct 6, 2026
72d3ba8
[spi, watchdog, uart, stm32wba, stm32n6] Forward direct-mapping flags…
AlexLanzano Oct 6, 2026
3797ed9
[crypto, aes, cryp, hash, stm32wb, stm32wba, stm32u5, stm32n6] CCM lo…
AlexLanzano Oct 6, 2026
8c12172
[flash, i2c, dma, uart, timer, crypto, pic32cz, stm32] Overflow-safe …
AlexLanzano Oct 7, 2026
b85fa56
[uart, flash, stm32f4, stm32l1, test] Skip TC wait on zero-length F4 …
AlexLanzano Oct 7, 2026
b9f990e
[i2c, stm32, test] Reject I2C frequencies above 1 MHz, test little-en…
AlexLanzano Oct 7, 2026
abe4a0f
[rng, stm32] Use AN4230 NIST configuration A on the STM32 RNGs
AlexLanzano Oct 8, 2026
271354c
[crypto, test] Add AES-128 ECB and CBC known-answer tests
AlexLanzano Oct 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions boards/pic32cz_curiosity_ultra/wolfHAL_board.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,11 @@ extern whal_Timeout g_whalTimeout;

extern volatile uint32_t g_tick;

#define BOARD_LED_PIN 0
#define BOARD_FLASH_TEST_ADDR 0x0C000000
#define BOARD_FLASH_SECTOR_SZ 0x1000
#define BOARD_LED_PIN 0
#define BOARD_FLASH_START_ADDR 0x0C000000
#define BOARD_FLASH_SIZE 0x00800000
#define BOARD_FLASH_TEST_ADDR 0x0C000000
#define BOARD_FLASH_SECTOR_SZ 0x1000

/* BOARD_*_DEV: how this board reaches each peripheral. */
#define BOARD_GPIO_DEV WHAL_INTERNAL_DEV
Expand Down
3 changes: 3 additions & 0 deletions boards/stm32f411_blackpill/wolfHAL_board.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ enum {

#define BOARD_LED_PIN 0

#define BOARD_FLASH_START_ADDR 0x08000000
#define BOARD_FLASH_SIZE 0x80000

/* Flash test address: last sector (sector 7, 128KB at 0x08060000) */
#define BOARD_FLASH_TEST_ADDR 0x08060000
#define BOARD_FLASH_SECTOR_SZ 0x20000
Expand Down
4 changes: 4 additions & 0 deletions boards/stm32h563zi_nucleo/wolfHAL_board.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,9 +153,13 @@ enum {
}

/* RNG dev initializer — singleton defined in stm32h5_rng.c. */
/* RNG cr/htcr/nscr: AN4230 Table 3, STM32H563/573/562 */
#define WHAL_CFG_STM32H5_RNG_DEV { \
.base = WHAL_STM32H563_RNG_BASE, \
.cfg = (void *)&(const whal_Stm32h5_Rng_Cfg){ \
.cr = 0x00F01E00UL, \
.htcr = 0x00006A91UL, \
.nscr = 0x0003AF66UL, \
.timeout = &g_whalTimeout, \
}, \
}
Expand Down
4 changes: 4 additions & 0 deletions boards/stm32n657a0_nucleo/wolfHAL_board.h
Original file line number Diff line number Diff line change
Expand Up @@ -217,9 +217,13 @@ enum {

/* RNG dev initializer — singleton defined in stm32wba_rng.c (stm32n6 is
* an include alias). */
/* RNG cr/htcr/nscr: AN4230 Table 3, STM32N6; NSCR "default" is the reset value */
#define WHAL_CFG_STM32N6_RNG_DEV { \
.base = WHAL_STM32N657_RNG_BASE, \
.cfg = (void *)&(const whal_Stm32n6_Rng_Cfg){ \
.cr = 0x08F00D00UL, \
.htcr = 0x00006A93UL, \
.nscr = 0x0003FFFFUL, \
.timeout = &g_whalTimeout, \
}, \
}
Expand Down
14 changes: 9 additions & 5 deletions boards/stm32u5a5zj_nucleo/wolfHAL_board.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,9 @@ enum {
}, \
}

/* AES + mode dev initializers — singletons defined in stm32wb_aes.c
* (stm32u5 alias points at stm32wb leaf). Mutable GCM/CCM state buffers
* (g_stm32wbAesGcm/CcmDevState) are static in the driver TU. */
/* AES + mode dev initializers — singletons defined in stm32wba_aes.c
* (stm32u5 alias points at stm32wba leaf). Mutable GCM/CCM state buffers
* (g_stm32wbaAesGcm/CcmDevState) are static in the driver TU. */
#define WHAL_CFG_STM32U5_AES_DEV { \
.base = WHAL_STM32U5A5_AES_BASE, \
.cfg = (void *)&(const whal_Stm32u5_Aes_Cfg){ \
Expand All @@ -104,7 +104,7 @@ enum {

#define WHAL_CFG_STM32U5_AES_GCM_DEV { \
.crypto = (whal_Crypto *)&whal_Stm32u5_Aes_Dev, \
.state = &g_stm32wbAesGcmDevState, \
.state = &g_stm32wbaAesGcmDevState, \
}

#define WHAL_CFG_STM32U5_AES_GMAC_DEV { \
Expand All @@ -113,13 +113,17 @@ enum {

#define WHAL_CFG_STM32U5_AES_CCM_DEV { \
.crypto = (whal_Crypto *)&whal_Stm32u5_Aes_Dev, \
.state = &g_stm32wbAesCcmDevState, \
.state = &g_stm32wbaAesCcmDevState, \
}

/* RNG dev initializer — singleton defined in stm32wba_rng.c (alias). */
/* RNG cr/htcr/nscr: AN4230 Table 3, STM32U59x/5Ax */
#define WHAL_CFG_STM32U5_RNG_DEV { \
.base = WHAL_STM32U5A5_RNG_BASE, \
.cfg = (void *)&(const whal_Stm32u5_Rng_Cfg){ \
.cr = 0x00F11F00UL, \
.htcr = 0x000092F3UL, \
.nscr = 0x00001609UL, \
.timeout = &g_whalTimeout, \
}, \
}
Expand Down
26 changes: 15 additions & 11 deletions boards/stm32wba55cg_nucleo/wolfHAL_board.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,9 @@ enum {
}, \
}

/* AES + mode dev initializers — singletons defined in stm32wb_aes.c
* (stm32wba is an include alias). Mutable GCM/CCM state buffers
* (g_stm32wbAesGcm/CcmDevState) are static in the driver TU. */
/* AES + mode dev initializers — singletons defined in stm32wba_aes.c.
* Mutable GCM/CCM state buffers (g_stm32wbaAesGcm/CcmDevState) are static
* in the driver TU. */
#define WHAL_CFG_STM32WBA_AES_DEV { \
.base = WHAL_STM32WBA55_AES_BASE, \
.cfg = (void *)&(const whal_Stm32wba_Aes_Cfg){ \
Expand All @@ -92,35 +92,39 @@ enum {
}

#define WHAL_CFG_STM32WBA_AES_ECB_DEV { \
.crypto = (whal_Crypto *)&whal_Stm32wb_Aes_Dev, \
.crypto = (whal_Crypto *)&whal_Stm32wba_Aes_Dev, \
}

#define WHAL_CFG_STM32WBA_AES_CBC_DEV { \
.crypto = (whal_Crypto *)&whal_Stm32wb_Aes_Dev, \
.crypto = (whal_Crypto *)&whal_Stm32wba_Aes_Dev, \
}

#define WHAL_CFG_STM32WBA_AES_CTR_DEV { \
.crypto = (whal_Crypto *)&whal_Stm32wb_Aes_Dev, \
.crypto = (whal_Crypto *)&whal_Stm32wba_Aes_Dev, \
}

#define WHAL_CFG_STM32WBA_AES_GCM_DEV { \
.crypto = (whal_Crypto *)&whal_Stm32wb_Aes_Dev, \
.state = &g_stm32wbAesGcmDevState, \
.crypto = (whal_Crypto *)&whal_Stm32wba_Aes_Dev, \
.state = &g_stm32wbaAesGcmDevState, \
}

#define WHAL_CFG_STM32WBA_AES_GMAC_DEV { \
.crypto = (whal_Crypto *)&whal_Stm32wb_Aes_Dev, \
.crypto = (whal_Crypto *)&whal_Stm32wba_Aes_Dev, \
}

#define WHAL_CFG_STM32WBA_AES_CCM_DEV { \
.crypto = (whal_Crypto *)&whal_Stm32wb_Aes_Dev, \
.state = &g_stm32wbAesCcmDevState, \
.crypto = (whal_Crypto *)&whal_Stm32wba_Aes_Dev, \
.state = &g_stm32wbaAesCcmDevState, \
}

/* RNG dev initializer — singleton defined in stm32wba_rng.c. */
/* RNG cr/htcr/nscr: AN4230 Table 3, STM32WBA5x */
#define WHAL_CFG_STM32WBA_RNG_DEV { \
.base = WHAL_STM32WBA55_RNG_BASE, \
.cfg = (void *)&(const whal_Stm32wba_Rng_Cfg){ \
.cr = 0x08F01F00UL, \
.htcr = 0x00006688UL, \
.nscr = 0x00000FFFUL, \
.timeout = &g_whalTimeout, \
}, \
}
Expand Down
35 changes: 26 additions & 9 deletions src/block/sdhc_spi_block.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,10 @@ static whal_Error SdhcSpi_CsAssert(whal_SdhcSpi_Cfg *cfg)
return err;

/* Dummy byte gives card time to recognize CS transition */
return whal_Spi_SendRecv(cfg->spiDev, &dummy, 1, NULL, 0);
err = whal_Spi_SendRecv(cfg->spiDev, &dummy, 1, NULL, 0);
if (err)
whal_Gpio_Set(cfg->gpioDev, cfg->csPin, 1);
return err;
}

static whal_Error SdhcSpi_CsDeassert(whal_SdhcSpi_Cfg *cfg)
Expand Down Expand Up @@ -378,12 +381,20 @@ whal_Error whal_SdhcSpi_Read(whal_Block *blockDev, uint32_t block,
break;
}

/* Stop multi-block read */
/* Stop multi-block read. A stuff byte can precede R1 after CMD12, so
* only transport errors and the busy wait are reported. */
if (blockCount > 1) {
SdhcSpi_SendCmd(cfg, CMD12, 0x00000000, 0x01);
SdhcSpi_RecvResp(cfg, &r1);
whal_Spi_SendRecv(cfg->spiDev, &dummy, 1, NULL, 0);
SdhcSpi_WaitReady(cfg);
whal_Error stopErr;

stopErr = SdhcSpi_SendCmd(cfg, CMD12, 0x00000000, 0x01);
if (!stopErr)
stopErr = SdhcSpi_RecvResp(cfg, &r1);
if (!stopErr)
stopErr = whal_Spi_SendRecv(cfg->spiDev, &dummy, 1, NULL, 0);
if (!stopErr)
stopErr = SdhcSpi_WaitReady(cfg);
if (!err)
err = stopErr;
}

cleanup:
Expand Down Expand Up @@ -468,10 +479,16 @@ whal_Error whal_SdhcSpi_Write(whal_Block *blockDev, uint32_t block,

/* Stop multi-block write */
if (blockCount > 1) {
whal_Error stopErr;

token = TOKEN_STOP_TRAN;
whal_Spi_SendRecv(cfg->spiDev, &token, 1, NULL, 0);
whal_Spi_SendRecv(cfg->spiDev, &dummy, 1, NULL, 0);
SdhcSpi_WaitReady(cfg);
stopErr = whal_Spi_SendRecv(cfg->spiDev, &token, 1, NULL, 0);
if (!stopErr)
stopErr = whal_Spi_SendRecv(cfg->spiDev, &dummy, 1, NULL, 0);
if (!stopErr)
stopErr = SdhcSpi_WaitReady(cfg);
if (!err)
err = stopErr;
}

cleanup:
Expand Down
12 changes: 9 additions & 3 deletions src/crypto/aes_cbc.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ whal_Error whal_AesCbc_Oneshot(whal_AesCbc *dev, whal_Crypto_Dir dir,
const void *iv,
const void *in, void *out, size_t sz)
{
if (!dev || !dev->driver || !dev->driver->Oneshot)
if (!dev)
return WHAL_EINVAL;
if (!dev->driver || !dev->driver->Oneshot)
return WHAL_ENOTSUP;
return dev->driver->Oneshot(dev, dir, key, keySz, iv, in, out, sz);
}
Expand All @@ -35,15 +37,19 @@ whal_Error whal_AesCbc_Start(whal_AesCbc *dev, whal_Crypto_Dir dir,
const void *key, size_t keySz,
const void *iv)
{
if (!dev || !dev->driver || !dev->driver->Start)
if (!dev)
return WHAL_EINVAL;
if (!dev->driver || !dev->driver->Start)
return WHAL_ENOTSUP;
return dev->driver->Start(dev, dir, key, keySz, iv);
}

whal_Error whal_AesCbc_Process(whal_AesCbc *dev,
const void *in, void *out, size_t sz)
{
if (!dev || !dev->driver || !dev->driver->Process)
if (!dev)
return WHAL_EINVAL;
if (!dev->driver || !dev->driver->Process)
return WHAL_ENOTSUP;
return dev->driver->Process(dev, in, out, sz);
}
16 changes: 12 additions & 4 deletions src/crypto/aes_ccm.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ whal_Error whal_AesCcm_Oneshot(whal_AesCcm *dev, whal_Crypto_Dir dir,
const void *in, void *out, size_t sz,
void *tag, size_t tagSz)
{
if (!dev || !dev->driver || !dev->driver->Oneshot)
if (!dev)
return WHAL_EINVAL;
if (!dev->driver || !dev->driver->Oneshot)
return WHAL_ENOTSUP;
return dev->driver->Oneshot(dev, dir, key, keySz, nonce, nonceSz,
aad, aadSz, in, out, sz, tag, tagSz);
Expand All @@ -40,7 +42,9 @@ whal_Error whal_AesCcm_Start(whal_AesCcm *dev, whal_Crypto_Dir dir,
const void *aad, size_t aadSz,
size_t tagSz, size_t sz)
{
if (!dev || !dev->driver || !dev->driver->Start)
if (!dev)
return WHAL_EINVAL;
if (!dev->driver || !dev->driver->Start)
return WHAL_ENOTSUP;
return dev->driver->Start(dev, dir, key, keySz, nonce, nonceSz,
aad, aadSz, tagSz, sz);
Expand All @@ -49,15 +53,19 @@ whal_Error whal_AesCcm_Start(whal_AesCcm *dev, whal_Crypto_Dir dir,
whal_Error whal_AesCcm_Process(whal_AesCcm *dev,
const void *in, void *out, size_t sz)
{
if (!dev || !dev->driver || !dev->driver->Process)
if (!dev)
return WHAL_EINVAL;
if (!dev->driver || !dev->driver->Process)
return WHAL_ENOTSUP;
return dev->driver->Process(dev, in, out, sz);
}

whal_Error whal_AesCcm_Finalize(whal_AesCcm *dev,
void *tag, size_t tagSz)
{
if (!dev || !dev->driver || !dev->driver->Finalize)
if (!dev)
return WHAL_EINVAL;
if (!dev->driver || !dev->driver->Finalize)
return WHAL_ENOTSUP;
return dev->driver->Finalize(dev, tag, tagSz);
}
12 changes: 9 additions & 3 deletions src/crypto/aes_ctr.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ whal_Error whal_AesCtr_Oneshot(whal_AesCtr *dev, whal_Crypto_Dir dir,
const void *iv,
const void *in, void *out, size_t sz)
{
if (!dev || !dev->driver || !dev->driver->Oneshot)
if (!dev)
return WHAL_EINVAL;
if (!dev->driver || !dev->driver->Oneshot)
return WHAL_ENOTSUP;
return dev->driver->Oneshot(dev, dir, key, keySz, iv, in, out, sz);
}
Expand All @@ -35,15 +37,19 @@ whal_Error whal_AesCtr_Start(whal_AesCtr *dev, whal_Crypto_Dir dir,
const void *key, size_t keySz,
const void *iv)
{
if (!dev || !dev->driver || !dev->driver->Start)
if (!dev)
return WHAL_EINVAL;
if (!dev->driver || !dev->driver->Start)
return WHAL_ENOTSUP;
return dev->driver->Start(dev, dir, key, keySz, iv);
}

whal_Error whal_AesCtr_Process(whal_AesCtr *dev,
const void *in, void *out, size_t sz)
{
if (!dev || !dev->driver || !dev->driver->Process)
if (!dev)
return WHAL_EINVAL;
if (!dev->driver || !dev->driver->Process)
return WHAL_ENOTSUP;
return dev->driver->Process(dev, in, out, sz);
}
12 changes: 9 additions & 3 deletions src/crypto/aes_ecb.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,23 +25,29 @@ whal_Error whal_AesEcb_Oneshot(whal_AesEcb *dev, whal_Crypto_Dir dir,
const void *key, size_t keySz,
const void *in, void *out, size_t sz)
{
if (!dev || !dev->driver || !dev->driver->Oneshot)
if (!dev)
return WHAL_EINVAL;
if (!dev->driver || !dev->driver->Oneshot)
return WHAL_ENOTSUP;
return dev->driver->Oneshot(dev, dir, key, keySz, in, out, sz);
}

whal_Error whal_AesEcb_Start(whal_AesEcb *dev, whal_Crypto_Dir dir,
const void *key, size_t keySz)
{
if (!dev || !dev->driver || !dev->driver->Start)
if (!dev)
return WHAL_EINVAL;
if (!dev->driver || !dev->driver->Start)
return WHAL_ENOTSUP;
return dev->driver->Start(dev, dir, key, keySz);
}

whal_Error whal_AesEcb_Process(whal_AesEcb *dev,
const void *in, void *out, size_t sz)
{
if (!dev || !dev->driver || !dev->driver->Process)
if (!dev)
return WHAL_EINVAL;
if (!dev->driver || !dev->driver->Process)
return WHAL_ENOTSUP;
return dev->driver->Process(dev, in, out, sz);
}
16 changes: 12 additions & 4 deletions src/crypto/aes_gcm.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ whal_Error whal_AesGcm_Oneshot(whal_AesGcm *dev, whal_Crypto_Dir dir,
const void *in, void *out, size_t sz,
void *tag, size_t tagSz)
{
if (!dev || !dev->driver || !dev->driver->Oneshot)
if (!dev)
return WHAL_EINVAL;
if (!dev->driver || !dev->driver->Oneshot)
return WHAL_ENOTSUP;
return dev->driver->Oneshot(dev, dir, key, keySz, iv, ivSz,
aad, aadSz, in, out, sz, tag, tagSz);
Expand All @@ -39,23 +41,29 @@ whal_Error whal_AesGcm_Start(whal_AesGcm *dev, whal_Crypto_Dir dir,
const void *iv, size_t ivSz,
const void *aad, size_t aadSz)
{
if (!dev || !dev->driver || !dev->driver->Start)
if (!dev)
return WHAL_EINVAL;
if (!dev->driver || !dev->driver->Start)
return WHAL_ENOTSUP;
return dev->driver->Start(dev, dir, key, keySz, iv, ivSz, aad, aadSz);
}

whal_Error whal_AesGcm_Process(whal_AesGcm *dev,
const void *in, void *out, size_t sz)
{
if (!dev || !dev->driver || !dev->driver->Process)
if (!dev)
return WHAL_EINVAL;
if (!dev->driver || !dev->driver->Process)
return WHAL_ENOTSUP;
return dev->driver->Process(dev, in, out, sz);
}

whal_Error whal_AesGcm_Finalize(whal_AesGcm *dev,
void *tag, size_t tagSz)
{
if (!dev || !dev->driver || !dev->driver->Finalize)
if (!dev)
return WHAL_EINVAL;
if (!dev->driver || !dev->driver->Finalize)
return WHAL_ENOTSUP;
return dev->driver->Finalize(dev, tag, tagSz);
}
Loading
Loading