5 #include "sw/device/lib/testing/rand_testutils.h"
12 #include "sw/device/lib/dif/dif_rv_core_ibex.h"
14 #include "sw/device/lib/testing/rv_core_ibex_testutils.h"
15 #include "sw/device/lib/testing/test_framework/check.h"
22 static const uint32_t kLfsrPolynomialCoefficients = 0x80000057;
27 static const uint32_t kEntropyFetchTimeoutMicros = 100000;
30 CHECK(rv_core_ibex != NULL);
36 .entropy_fetch_timeout_usec = kEntropyFetchTimeoutMicros,
38 .polynomial_coefficients = kLfsrPolynomialCoefficients,
39 .reseed_frequency = 256,
40 .op_counter = UINT32_MAX};
49 static inline void reseed_lfsr(
void) {
50 CHECK_STATUS_OK(rv_core_ibex_testutils_get_rnd_data(
53 &rand_testutils_rng_ctx.
lfsr));
57 static inline void advance_lfsr(
void) {
58 bool lsb = rand_testutils_rng_ctx.
lfsr & 0x1u;
59 rand_testutils_rng_ctx.
lfsr >>= 1;
61 rand_testutils_rng_ctx.
lfsr ^=
67 extern void rand_testutils_reseed(
void);
69 uint32_t rand_testutils_gen32(
void) {
76 return rand_testutils_rng_ctx.
lfsr;
79 uint32_t rand_testutils_gen32_range(uint32_t min, uint32_t max) {
81 uint32_t range = max - min;
85 uint32_t result = min + (rand_testutils_gen32() % (range + 1));
86 CHECK(result >= min && result <= max);
90 void rand_testutils_shuffle(
void *array,
size_t size,
size_t length) {
94 unsigned char temp[size];
95 unsigned char *array8 = array;
98 for (
size_t i = length - 2; i > 0; i--) {
99 size_t j = rand_testutils_gen32_range(0, i + 1);
100 memcpy(temp, array8 + j * size, size);
101 memcpy(array8 + j * size, array8 + i * size, size);
102 memcpy(array8 + i * size, temp, size);