7 #include "sw/device/lib/dif/dif_csrng_shared.h"
9 #include "sw/device/lib/dif/dif_rv_core_ibex.h"
12 #include "sw/device/lib/testing/edn_testutils.h"
13 #include "sw/device/lib/testing/entropy_testutils.h"
14 #include "sw/device/lib/testing/rv_core_ibex_testutils.h"
15 #include "sw/device/lib/testing/test_framework/check.h"
22 kEdnKatTimeout = (10 * 1000 * 1000),
24 kEdnKatOutputLen = 16,
25 kEdnKatWordsPerBlock = 4,
28 static dif_csrng_t csrng;
29 static dif_edn_t edn0;
30 static dif_edn_t edn1;
31 static dif_rv_core_ibex_t rv_core_ibex;
64 .
len = kEdnKatMaxClen,
65 .data = {0x73bec010, 0x9262474c, 0x16a30f76, 0x531b51de, 0x2ee494e5,
66 0xdfec9db3, 0xcb7a879d, 0x5600419c, 0xca79b0b0, 0xdda33b5c,
67 0xa468649e, 0xdf5d73fa},
71 .
len = kEdnKatMaxClen,
72 .data = {0x73bec010, 0x9262474c, 0x16a30f76, 0x531b51de, 0x2ee494e5,
73 0xdfec9db3, 0xcb7a879d, 0x5600419c, 0xca79b0b0, 0xdda33b5c,
74 0xa468649e, 0xdf5d73fa},
81 const uint32_t kExpectedOutput[kEdnKatOutputLen] = {
82 0xe48bb8cb, 0x1012c84c, 0x5af8a7f1, 0xd1c07cd9, 0xdf82ab22, 0x771c619b,
83 0xd40fccb1, 0x87189e99, 0x510494b3, 0x64f7ac0c, 0x2581f391, 0x80b1dc2f,
84 0x793e01c5, 0x87b107ae, 0xdb17514c, 0xa43c41b7,
101 .
len = kEdnKatMaxClen,
102 .data = {0xf0405279, 0x50a4261f, 0xf5ace1cf, 0xfff7b7d1, 0xa6ee8307,
103 0x1f57dfc8, 0x59757d79, 0xdeb6522e, 0xc8c67d84, 0xa16abefa,
104 0xc34030be, 0x530e88f8},
109 .
len = kEdnKatMaxClen,
110 .data = {0x5f6fb665, 0x21ca8e3f, 0x5ba3dba1, 0x2c10a9ec, 0x03b8cd4b,
111 0x8264aaea, 0x371e6305, 0x8fb186e1, 0xf622bc3e, 0x98e5d247,
112 0x73040c38, 0x6596739e},
115 OTTF_DEFINE_TEST_CONFIG();
118 static void init_peripherals(
void) {
119 CHECK_DIF_OK(dif_csrng_init(
125 CHECK_DIF_OK(dif_rv_core_ibex_init(
134 .
cmd = csrng_cmd_header_build(
136 alert_test ? kEdnAlertTestSeedMaterialInstantiate.
len
137 : kEdnKatSeedMaterialInstantiate.
len,
139 .seed_material = alert_test ? kEdnAlertTestSeedMaterialInstantiate
140 : kEdnKatSeedMaterialInstantiate,
144 .cmd = csrng_cmd_header_build(
146 alert_test ? kEdnAlertTestSeedMaterialReseed.
len
147 : kEdnKatSeedMaterialReseed.
len,
149 .seed_material = alert_test ? kEdnAlertTestSeedMaterialReseed
150 : kEdnKatSeedMaterialReseed,
154 .cmd = csrng_cmd_header_build(
156 kEdnKatSeedMaterialGenerate.
len,
158 alert_test ? 1 : kEdnKatOutputLen / kEdnKatWordsPerBlock),
159 .seed_material = kEdnKatSeedMaterialGenerate,
161 .reseed_interval = alert_test ? 1 : 32,
165 static uint32_t ibex_get_rnd_data(
void) {
166 uint32_t ibex_rnd_data;
167 CHECK_STATUS_OK(rv_core_ibex_testutils_get_rnd_data(
168 &rv_core_ibex, kEdnKatTimeout, &ibex_rnd_data));
169 return ibex_rnd_data;
173 static void entropy_config(
bool alert_test) {
175 edn_testutils_auto_params_build(
true, 0, 0);
177 CHECK_STATUS_OK(entropy_testutils_stop_all());
179 CHECK_STATUS_OK(entropy_testutils_entropy_src_init());
188 static bool execute_kat(
void) {
189 uint32_t ibex_rnd_data_got;
190 unsigned int next_val_pos = 0;
191 unsigned int hits = 0;
200 while (next_val_pos < kEdnKatOutputLen) {
202 ibex_rnd_data_got = ibex_get_rnd_data();
204 for (
unsigned int i = next_val_pos; i < kEdnKatOutputLen; ++i) {
206 if (ibex_rnd_data_got == kExpectedOutput[i]) {
207 next_val_pos = i + 1;
214 next_val_pos = i + 1;
220 LOG_INFO(
"%d/%d expected random words have been hit.", hits,
222 CHECK(hits >= kEdnKatOutputLen / 2);
226 static void execute_alert_test(
void) {
228 for (
int i = 0; i <= 2 * kEdnKatWordsPerBlock; ++i) {
240 entropy_config(
false);
244 entropy_config(
true);
245 execute_alert_test();