From fbf7ac127fd7f28bebf853657e9cf8555dedca4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vlastimil=20Slint=C3=A1k?= Date: Wed, 9 Jul 2025 11:52:51 +0200 Subject: [PATCH] Use TRNG for random numbers instead of analog input pin. --- NPR_14/source/config_flash.cpp | 40 +++++++++++++++++++++------------- NPR_14/source/config_flash.h | 4 ++-- NPR_14/source/main.cpp | 6 +---- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/NPR_14/source/config_flash.cpp b/NPR_14/source/config_flash.cpp index 292b4b9..9db34a2 100644 --- a/NPR_14/source/config_flash.cpp +++ b/NPR_14/source/config_flash.cpp @@ -21,6 +21,7 @@ #include "Eth_IPv4.h" #include "HMI_telnet.h" #include "TDMA.h" +#include "trng_api.h" static unsigned char raw_config_data[260]; static unsigned int config_index; @@ -103,17 +104,21 @@ void virt_EEPROM_errase_all(void) { // higher level functions -void NFPR_config_read(AnalogIn* analog_pin) { +void NFPR_config_read(void) { int i; unsigned char default_config[260] = NFPR_default_config; + uint8_t random[2]; + config_index = virt_EEPROM_read(raw_config_data); if (config_index == 0) { //no previous config found for (i=0; i<256; i++) { raw_config_data[i] = default_config[i]; } + //MAC random 2 LSB values - raw_config_data[58] = NFPR_random_generator(analog_pin); - raw_config_data[59] = NFPR_random_generator(analog_pin); + NFPR_random_generator(random, sizeof(random)); + raw_config_data[58] = random[0]; + raw_config_data[59] = random[1]; raw_config_data[5] = raw_config_data[58];//callsign 1st char raw_config_data[6] = raw_config_data[59];//callsign 2nd char config_index = virt_EEPROM_write (raw_config_data, config_index);//save the MAC @@ -127,19 +132,24 @@ void NFPR_config_read(AnalogIn* analog_pin) { } } -unsigned char NFPR_random_generator(AnalogIn* analog_pin) { - unsigned short interm_random; - unsigned char random_8; - int i; - random_8 = 0; - for (i=0; i<8; i++) { - interm_random = analog_pin->read_u16(); - interm_random = (interm_random & 0x10)>>4; - interm_random = (interm_random << i); - random_8 = random_8 + interm_random; - wait_ms(4); +/** + * Generate and save random `size` bytes into the `rnd` array. + * This code uses the STM32 TRNG HW. + * Returns `true` if the resulting data are random. + */ +bool NFPR_random_generator(uint8_t *rnd, size_t size) { + trng_t trng_obj; + size_t random_length = 0; + + trng_init(&trng_obj); + trng_get_bytes(&trng_obj, rnd, size, &random_length); + trng_free(&trng_obj); + + if(random_length == size) { + return true; } - return random_8; + + return false; } unsigned int NFPR_config_save(void) { diff --git a/NPR_14/source/config_flash.h b/NPR_14/source/config_flash.h index 3ad191c..0a94727 100644 --- a/NPR_14/source/config_flash.h +++ b/NPR_14/source/config_flash.h @@ -65,7 +65,7 @@ unsigned int virt_EEPROM_read(unsigned char* data); -unsigned char NFPR_random_generator(AnalogIn* analog_pin); +bool NFPR_random_generator(uint8_t *rnd, size_t size); unsigned int virt_EEPROM_write(unsigned char* in_data, unsigned int previous_index); @@ -77,7 +77,7 @@ void apply_config_from_raw_string(unsigned char* data_r); void write_config_to_raw_string (unsigned char* data_r); -void NFPR_config_read(AnalogIn* analog_pin); +void NFPR_config_read(void); unsigned int NFPR_config_save(void); diff --git a/NPR_14/source/main.cpp b/NPR_14/source/main.cpp index 4fa8744..f66611d 100644 --- a/NPR_14/source/main.cpp +++ b/NPR_14/source/main.cpp @@ -41,10 +41,6 @@ DigitalOut PTT_PA_pin(PA_0);//GPIO_10 DigitalOut SI4463_SDN(PA_10); -// TODO: Get random seed from somewhere else. -// TODO: Random PIN is not present on the new PCB. -AnalogIn Random_pin(PA_0); - DigitalOut LED_RX_loc(PB_7); DigitalOut LED_connected(PA_4); @@ -162,7 +158,7 @@ int main() } wait_ms(100); - NFPR_config_read(&Random_pin); + NFPR_config_read(); //SI4463_print_version(G_SI4463);//!!!! SI4463_get_state(G_SI4463);