#include "furi-hal-random.h" #include #include #include #include #include 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); }