From d841d250d8c0a3408904fd04ec5d5be115ded3ac Mon Sep 17 00:00:00 2001 From: Tom Pittenger Date: Mon, 3 Jul 2023 18:18:21 -0700 Subject: [PATCH] AP_HAL_ChibiOS: allow HW without HW_RNG to SW-based create psuedo-random --- libraries/AP_HAL_ChibiOS/Util.cpp | 16 +++++++++++----- .../AP_HAL_ChibiOS/hwdef/common/stm32_util.h | 3 +++ libraries/AP_HAL_ChibiOS/system.cpp | 7 +++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/libraries/AP_HAL_ChibiOS/Util.cpp b/libraries/AP_HAL_ChibiOS/Util.cpp index c49d882bfe..a27d4ad86a 100644 --- a/libraries/AP_HAL_ChibiOS/Util.cpp +++ b/libraries/AP_HAL_ChibiOS/Util.cpp @@ -705,9 +705,7 @@ bool Util::get_random_vals(uint8_t* data, size_t size) { #if HAL_USE_HW_RNG && defined(RNG) size_t true_random_vals = stm32_rand_generate_nonblocking(data, size); - if (true_random_vals == size) { - return true; - } else { + if (true_random_vals != size) { if (!(true_random_vals % 2)) { data[true_random_vals] = (uint8_t)(get_random16() & 0xFF); true_random_vals++; @@ -718,10 +716,18 @@ bool Util::get_random_vals(uint8_t* data, size_t size) true_random_vals+=sizeof(uint16_t); } } - return true; #else - return false; + size_t true_random_vals = 0; + while(true_random_vals < size) { + uint16_t val = get_random16(); + memcpy(&data[true_random_vals], &val, sizeof(uint16_t)); + true_random_vals+=sizeof(uint16_t); + } + if (size % 2) { + data[size-1] = get_random16() & 0xFF; + } #endif + return true; } /** diff --git a/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.h b/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.h index a91c972596..73afbfa930 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.h +++ b/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.h @@ -177,6 +177,9 @@ bool stm32_rand_generate_blocking(unsigned char* output, unsigned int sz, uint32 unsigned int stm32_rand_generate_nonblocking(unsigned char* output, unsigned int sz); #endif +// To be defined in HAL code +extern uint32_t chibios_rand_generate(void); + void stm32_flash_protect_flash(bool bootloader, bool protect); void stm32_flash_unprotect_flash(void); diff --git a/libraries/AP_HAL_ChibiOS/system.cpp b/libraries/AP_HAL_ChibiOS/system.cpp index 82b948fce3..9a827d518d 100644 --- a/libraries/AP_HAL_ChibiOS/system.cpp +++ b/libraries/AP_HAL_ChibiOS/system.cpp @@ -304,6 +304,13 @@ void __entry_hook() } #endif +uint32_t chibios_rand_generate() +{ + uint32_t val; + hal.util->get_random_vals((uint8_t*)&val, sizeof(val)); + return val; +} + } namespace AP_HAL {