diff options
Diffstat (limited to 'firmware/targets/f6/furi-hal/furi-hal-random.c')
-rw-r--r-- | firmware/targets/f6/furi-hal/furi-hal-random.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/firmware/targets/f6/furi-hal/furi-hal-random.c b/firmware/targets/f6/furi-hal/furi-hal-random.c new file mode 100644 index 00000000..a7bc3a31 --- /dev/null +++ b/firmware/targets/f6/furi-hal/furi-hal-random.c @@ -0,0 +1,56 @@ +#include "furi-hal-random.h" +#include <furi.h> +#include <furi-hal.h> + +#include <stm32wbxx_ll_rng.h> +#include <stm32wbxx_ll_hsem.h> + +#include <hw_conf.h> + +uint32_t furi_hal_random_get() { + + while( LL_HSEM_1StepLock(HSEM, CFG_HW_RNG_SEMID)); + LL_RNG_Enable(RNG); + + while (!LL_RNG_IsActiveFlag_DRDY(RNG)); + + if ((LL_RNG_IsActiveFlag_CECS(RNG)) || (LL_RNG_IsActiveFlag_SECS(RNG))) { + furi_crash("TRNG error"); + } + + uint32_t random_val = LL_RNG_ReadRandData32(RNG); + + LL_RNG_Disable(RNG); + LL_HSEM_ReleaseLock(HSEM, CFG_HW_RNG_SEMID, 0); + + return random_val; +} + +void furi_hal_random_fill_buf(uint8_t* buf, uint32_t len) { + + while( LL_HSEM_1StepLock(HSEM, CFG_HW_RNG_SEMID)); + LL_RNG_Enable(RNG); + + for (uint32_t i = 0; i < len; i+= 4) { + while (!LL_RNG_IsActiveFlag_DRDY(RNG)); + + if ((LL_RNG_IsActiveFlag_CECS(RNG)) || (LL_RNG_IsActiveFlag_SECS(RNG))) { + furi_crash("TRNG error"); + } + + uint32_t random_val = LL_RNG_ReadRandData32(RNG); + + uint8_t len_cur = ((i+4) < len) ? (4) : (len-i); + memcpy(&buf[i], &random_val, len_cur); + } + + LL_RNG_Disable(RNG); + LL_HSEM_ReleaseLock(HSEM, CFG_HW_RNG_SEMID, 0); +} + +void srand(unsigned seed) { +} + +int rand() { + return (furi_hal_random_get() & RAND_MAX); +} |