From 8189deaa8b2c1caa2ab5c04d468107e837e9fc3d Mon Sep 17 00:00:00 2001 From: Yosuke Shimizu Date: Thu, 29 Oct 2026 15:12:18 +0900 Subject: [PATCH] settings.h, random.c: warn when MICRIUM seeds from Math_Rand - settings.h no longer defaults CUSTOM_RAND_GENERATE to Math_Rand for MICRIUM. - random.c gains a MICRIUM wc_GenerateSeed arm that fills the seed from Math_Rand() and emits a #warning (#pragma message on MSVC and TASKING) naming CUSTOM_RAND_GENERATE_SEED. - The Micrium sample user_settings.h and README show how to supply a hardware seed source. Issue: F-16887 --- IDE/ECLIPSE/MICRIUM/README.md | 9 +++++++++ IDE/ECLIPSE/MICRIUM/user_settings.h | 3 +++ wolfcrypt/src/random.c | 28 ++++++++++++++++++++++++++++ wolfssl/wolfcrypt/settings.h | 5 ----- 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/IDE/ECLIPSE/MICRIUM/README.md b/IDE/ECLIPSE/MICRIUM/README.md index 2949681b5a1..80e475e4c52 100644 --- a/IDE/ECLIPSE/MICRIUM/README.md +++ b/IDE/ECLIPSE/MICRIUM/README.md @@ -68,6 +68,15 @@ static void App_TaskStart (void *p_arg) 10. Now you are ready to download and debug your image on the board. +## Random seed + +Micrium provides no entropy source. Unless you configure one, wolfSSL seeds its DRBG from uC/LIB `Math_Rand()` and the build emits a warning saying so. Keys and nonces generated this way are predictable. Before production, supply a hardware RNG in `user_settings.h`: + +``` +extern int my_trng_seed(unsigned char* output, unsigned int sz); /* return 0 on success */ +#define CUSTOM_RAND_GENERATE_SEED my_trng_seed +``` + The test results below were collected from the NXP Kinetis K70 (Freescale TWR-K70F120M MCU) tower system board with the following software and tool chains: - IAR Embedded Workbench IDE - ARM 8.32.1 (IAR ELF Linker V8.32.1.169/W32 for ARM) diff --git a/IDE/ECLIPSE/MICRIUM/user_settings.h b/IDE/ECLIPSE/MICRIUM/user_settings.h index 91862df7c54..9478d4dc612 100644 --- a/IDE/ECLIPSE/MICRIUM/user_settings.h +++ b/IDE/ECLIPSE/MICRIUM/user_settings.h @@ -28,6 +28,9 @@ #define MICRIUM +/* Supply a hardware RNG seed via CUSTOM_RAND_GENERATE_SEED for production + * use. See IDE/ECLIPSE/MICRIUM/README.md */ + /* You can select one or all of the following tests */ #define WOLFSSL_WOLFCRYPT_TEST #define WOLFSSL_BENCHMARK_TEST diff --git a/wolfcrypt/src/random.c b/wolfcrypt/src/random.c index a30111f04a2..904a69f71e8 100644 --- a/wolfcrypt/src/random.c +++ b/wolfcrypt/src/random.c @@ -10598,6 +10598,34 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) } } + return 0; + } +#elif defined(MICRIUM) && !defined(CUSTOM_RAND_GENERATE_BLOCK) + #if !defined(_MSC_VER) && !defined(__TASKING__) + #warning "MICRIUM: seeding the DRBG from Math_Rand(), not an entropy source. Define CUSTOM_RAND_GENERATE_SEED to a hardware RNG." + #else + #pragma message("Warning: MICRIUM: seeding the DRBG from Math_Rand(), not an entropy source. Define CUSTOM_RAND_GENERATE_SEED to a hardware RNG.") + #endif + int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) + { + word32 i = 0; + word32 len; + RAND_NBR rnd; + + (void)os; + + if (output == NULL) + return BAD_FUNC_ARG; + + while (i < sz) { + rnd = Math_Rand(); + len = sz - i; + if (len > (word32)sizeof(rnd)) + len = (word32)sizeof(rnd); + XMEMCPY(&output[i], &rnd, len); + i += len; + } + return 0; } #elif defined(WOLFSSL_VXWORKS) diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 0400501fcb6..4d22819a692 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -2969,11 +2969,6 @@ #define NO_WOLFSSL_DIR #define NO_WRITEV - #if !defined(WOLFSSL_SILABS_SE_ACCEL) && !defined(STM32_RNG) && \ - !defined(CUSTOM_RAND_GENERATE) - #define CUSTOM_RAND_TYPE RAND_NBR - #define CUSTOM_RAND_GENERATE Math_Rand - #endif #define STRING_USER #define XSTRCASECMP(s1,s2) strcasecmp((s1),(s2)) #define XSTRCMP(s1,s2) strcmp((s1),(s2))