Merge pull request #10733 from mattia-moffa/20260617-max32666-sha-streaming-old

MAX32666 fixes for old SDK
This commit is contained in:
David Garske
2026-07-07 14:54:34 -07:00
committed by GitHub
3 changed files with 55 additions and 18 deletions
+50 -7
View File
@@ -50,7 +50,8 @@
#error MXC Not Compatible with Fast Math or Heap Math
#include <wolfssl/wolfcrypt/tfm.h>
#define MXC_WORD_SIZE DIGIT_BIT
#elif defined(WOLFSSL_SP_MATH_ALL)
#elif defined(WOLFSSL_SP_MATH_ALL) || \
(defined(WOLFSSL_SP_MATH) && !defined(MAX3266X_MATH))
#include <wolfssl/wolfcrypt/sp_int.h>
#define MXC_WORD_SIZE SP_WORD_SIZE
#else
@@ -625,7 +626,11 @@ int wc_MXC_TRNG_Random(unsigned char* output, unsigned int sz)
if (status != 0) {
return status;
}
#if defined(WOLFSSL_MAX3266X_OLD)
status = TRNG_Init(NULL);
#else
status = MXC_TPU_Init(MXC_SYS_PERIPH_CLOCK_TRNG);
#endif
if (status == 0) {
/* void return function */
MXC_TPU_TRNG_Read(MXC_TRNG, output, sz);
@@ -638,6 +643,38 @@ int wc_MXC_TRNG_Random(unsigned char* output, unsigned int sz)
wolfSSL_HwRngMutexUnLock(); /* Unlock Mutex no matter status value */
return status;
}
#if defined(WOLFSSL_MAX3266X_OLD)
/* Implements TRNG on-demand health test (the older SDK does not provide one) */
int wc_MXC_TRNG_HealthTest(void)
{
if (TRNG_Init(NULL) != 0) {
MAX3266X_MSG("TRNG Device did not initialize");
return RNG_FAILURE_E;
}
while ((MXC_TRNG->st & MXC_F_TRNG_ST_RND_RDY) == 0) {}
/* Clear on-going test if necessary */
if (MXC_TRNG->cn & MXC_F_TRNG_CN_ODHT) {
MXC_TRNG->cn &= ~MXC_F_TRNG_CN_ODHT;
while (MXC_TRNG->st & MXC_F_TRNG_ST_ODHTS) {}
}
/* Start on-demand health test */
MXC_TRNG->cn |= MXC_F_TRNG_CN_ODHT;
/* Wait for the test to finish */
while (MXC_TRNG->st & MXC_F_TRNG_ST_ODHTS) {}
/* Check results of test */
if (MXC_TRNG->st & MXC_F_TRNG_ST_HTS) {
MAX3266X_MSG("TRNG HW Health Test Failed");
return WC_HW_E;
}
return 0;
}
#endif /* WOLFSSL_MAX3266X_OLD */
#endif /* MAX3266X_RNG */
#if defined(MAX3266X_AES)
@@ -1051,6 +1088,12 @@ int wc_MXC_TPU_SHA_Final(unsigned char** msg, unsigned int* used,
/* TPU hash helpers (bare-metal SHA accelerator) */
#if defined(WOLFSSL_MAX3266X_OLD)
#define MXC_TPU_DATA_IN din
#else
#define MXC_TPU_DATA_IN data_in
#endif
/* Reset TPU, select hash function, and restore intermediate state into
* the HASH_DIGEST registers. */
void wc_MXC_TPU_Hash_Setup(MXC_TPU_HASH_TYPE algo,
@@ -1089,7 +1132,7 @@ void wc_MXC_TPU_Hash_Feed_Block(const unsigned char* data,
for (word = 0; word < blockSz; word += 4) {
while (!(MXC_TPU->ctrl & MXC_F_TPU_CTRL_RDY)) {}
MXC_TPU->data_in[0] = (unsigned int)data[word]
MXC_TPU->MXC_TPU_DATA_IN[0] = (unsigned int)data[word]
| ((unsigned int)data[word + 1] << 8)
| ((unsigned int)data[word + 2] << 16)
| ((unsigned int)data[word + 3] << 24);
@@ -1117,26 +1160,26 @@ void wc_MXC_TPU_Hash_Feed_Last(const unsigned char* data,
* trigger processing of the padding-only block. */
if (totalLenLo == 0 && totalLenHi == 0) {
while (!(MXC_TPU->ctrl & MXC_F_TPU_CTRL_RDY)) {}
MXC_TPU->data_in[0] = 0;
MXC_TPU->MXC_TPU_DATA_IN[0] = 0;
}
for (word = 0; word < dataLen; word += 4) {
while (!(MXC_TPU->ctrl & MXC_F_TPU_CTRL_RDY)) {}
if (dataLen >= (word + 4)) {
MXC_TPU->data_in[0] = (unsigned int)data[word]
MXC_TPU->MXC_TPU_DATA_IN[0] = (unsigned int)data[word]
| ((unsigned int)data[word + 1] << 8)
| ((unsigned int)data[word + 2] << 16)
| ((unsigned int)data[word + 3] << 24);
}
else if ((dataLen & 3) == 1) {
MXC_TPU->data_in[0] = (unsigned int)data[word];
MXC_TPU->MXC_TPU_DATA_IN[0] = (unsigned int)data[word];
}
else if ((dataLen & 3) == 2) {
MXC_TPU->data_in[0] = (unsigned int)data[word]
MXC_TPU->MXC_TPU_DATA_IN[0] = (unsigned int)data[word]
| ((unsigned int)data[word + 1] << 8);
}
else if ((dataLen & 3) == 3) {
MXC_TPU->data_in[0] = (unsigned int)data[word]
MXC_TPU->MXC_TPU_DATA_IN[0] = (unsigned int)data[word]
| ((unsigned int)data[word + 1] << 8)
| ((unsigned int)data[word + 2] << 16);
}
-8
View File
@@ -5213,30 +5213,22 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz)
#elif defined(MAX3266X_RNG)
int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz)
{
#ifdef WOLFSSL_MAX3266X
int status;
#endif /* WOLFSSL_MAX3266X */
static int initDone = 0;
(void)os;
if (initDone == 0) {
#ifdef WOLFSSL_MAX3266X
status = wolfSSL_HwRngMutexLock();
if (status != 0) {
return status;
}
#endif /* WOLFSSL_MAX3266X */
if(MXC_TRNG_HealthTest() != 0) {
#ifdef DEBUG_WOLFSSL
WOLFSSL_MSG("TRNG HW Health Test Failed");
#endif /* DEBUG_WOLFSSL */
#ifdef WOLFSSL_MAX3266X
wolfSSL_HwRngMutexUnLock();
#endif /* WOLFSSL_MAX3266X */
return WC_HW_E;
}
#ifdef WOLFSSL_MAX3266X
wolfSSL_HwRngMutexUnLock();
#endif /* WOLFSSL_MAX3266X */
initDone = 1;
}
return wc_MXC_TRNG_Random(output, sz);
+5 -3
View File
@@ -93,8 +93,7 @@
#if defined(MAX3266X_RNG)
#include "trng.h" /* Provides TRNG Drivers */
#define MXC_TPU_TRNG_Read TRNG_Read
#warning "TRNG Health Test not available in older Maxim SDK"
#define MXC_TRNG_HealthTest(...) 0
#define MXC_TRNG_HealthTest wc_MXC_TRNG_HealthTest
#endif
#if defined(MAX3266X_AES)
#include "cipher.h" /* Provides Drivers for AES */
@@ -152,7 +151,7 @@
#endif
/* TPU Functions */
#define MXC_TPU_Init SYS_TPU_Init
#define MXC_TPU_Init(clock) SYS_TPU_Init(NULL)
#define MXC_TPU_Shutdown SYS_TPU_Shutdown
#define MXC_SYS_PERIPH_CLOCK_TPU SYS_PERIPH_CLOCK_TPU
@@ -228,6 +227,9 @@
#ifdef MAX3266X_RNG
WOLFSSL_LOCAL int wc_MXC_TRNG_Random(unsigned char* output,
unsigned int sz);
#if defined(WOLFSSL_MAX3266X_OLD)
WOLFSSL_LOCAL int wc_MXC_TRNG_HealthTest(void);
#endif /* WOLFSSL_MAX3266X_OLD */
#endif
#ifdef MAX3266X_AES