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"
22static const uint32_t kLfsrPolynomialCoefficients = 0x80000057;
27static const uint32_t kEntropyFetchTimeoutMicros = 100000;
30 CHECK(rv_core_ibex != NULL);
34 rand_testutils_rng_t ctx = (rand_testutils_rng_t){
35 .rv_core_ibex = rv_core_ibex,
36 .entropy_fetch_timeout_usec = kEntropyFetchTimeoutMicros,
38 .polynomial_coefficients = kLfsrPolynomialCoefficients,
39 .reseed_frequency = 256,
40 .op_counter = UINT32_MAX};
49static inline void reseed_lfsr(
void) {
50 CHECK_STATUS_OK(rv_core_ibex_testutils_get_rnd_data(
51 rand_testutils_rng_ctx.rv_core_ibex,
52 rand_testutils_rng_ctx.entropy_fetch_timeout_usec,
53 &rand_testutils_rng_ctx.lfsr));
54 rand_testutils_rng_ctx.op_counter = 0;
57static 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 ^=
62 rand_testutils_rng_ctx.polynomial_coefficients;
64 rand_testutils_rng_ctx.op_counter++;
67extern void rand_testutils_reseed(
void);
69uint32_t rand_testutils_gen32(
void) {
70 if (rand_testutils_rng_ctx.op_counter >=
71 rand_testutils_rng_ctx.reseed_frequency) {
76 return rand_testutils_rng_ctx.lfsr;
79uint32_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);
90void rand_testutils_shuffle(
void *array,
size_t size,
size_t length) {
94 unsigned char temp[size];
95 unsigned char *array8 = array;
96 uint32_t reseed_frequency = rand_testutils_rng_ctx.reseed_frequency;
97 rand_testutils_rng_ctx.reseed_frequency = UINT32_MAX;
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);
104 rand_testutils_rng_ctx.reseed_frequency = reseed_frequency;