9e62f08e4d
* U2F implementation prototype * U2F data encryption and store, user confirmation request * remove debug prints * fix notification bug in chrome * split u2f_alloc into u2f_init and u2f_alloc * typo fix, furi-hal-trng -> furi-hal-random * rand/srand redefinition * SubGhz: a little bit of Dante. * u2f_data naming fix Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
57 lines
1.3 KiB
C
57 lines
1.3 KiB
C
#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);
|
|
}
|