9 #include "sw/device/lib/dif/dif_csrng_shared.h"
12 #include "sw/device/lib/runtime/irq.h"
14 #include "sw/device/lib/testing/csrng_testutils.h"
15 #include "sw/device/lib/testing/edn_testutils.h"
16 #include "sw/device/lib/testing/entropy_testutils.h"
18 #include "sw/device/lib/testing/rand_testutils.h"
19 #include "sw/device/lib/testing/rv_plic_testutils.h"
20 #include "sw/device/lib/testing/test_framework/check.h"
21 #include "sw/device/lib/testing/test_framework/ottf_macros.h"
23 #include "sw/device/tests/otbn_randomness_impl.h"
26 #include "sw/device/lib/testing/autogen/isr_testutils.h"
28 static dif_csrng_t csrng;
29 static dif_edn_t edn0;
30 static dif_edn_t edn1;
31 static dif_entropy_src_t entropy_src;
32 static dif_otbn_t otbn;
33 static dif_rv_plic_t plic;
34 static dif_rv_core_ibex_t rv_core_ibex;
42 static uint32_t sw_num_reqs_between_reseeds;
48 kTestParamNumIterationsSim = 2,
49 kTestParamNumIterationsOther = 20,
53 kTestParamNumOtbnIterationsMax = 4,
54 kTestParamNumIbexIterationsMax = 16,
55 kTestParamNumAesIterationsMax = 32,
56 kTestParamNumCsrngIterationsMax = 8,
60 kEntropySrcEsFinalFifoDepth = 3,
67 kEsFinalFifoIterationTimeUs = 100,
68 kEsFinalFifoNumIterationsMax = 320
75 typedef enum test_state {
93 static volatile test_state_t execution_state;
95 static const char *kStatusNames[kTestStateCount] = {
"Setup",
"Run",
"TearDown"};
96 static_assert(
ARRAYSIZE(kStatusNames) == kTestStateCount,
97 "Unexpected kStatusNames array size.");
102 typedef enum task_id {
131 static volatile bool task_done[kTestTaskIdCount];
135 static volatile uint32_t task_iter_count_max[kTestTaskIdCount];
137 OTTF_DEFINE_TEST_CONFIG(.enable_concurrency =
true);
142 static void init_peripherals(
void) {
143 CHECK_DIF_OK(dif_csrng_init(
149 CHECK_DIF_OK(dif_entropy_src_init(
151 CHECK_DIF_OK(dif_rv_plic_init(
153 CHECK_DIF_OK(dif_rv_core_ibex_init(
170 static void task_done_set_and_yield(task_id_t task_id) {
171 task_done[task_id] =
true;
182 static void otbn_task(
void *task_parameters) {
184 if (execution_state == kTestStateTearDown) {
187 if (execution_state == kTestStateSetup || task_done[kTestTaskIdOtbn]) {
192 for (
size_t i = 0; i < task_iter_count_max[kTestTaskIdOtbn]; ++i) {
193 otbn_randomness_test_start(&otbn, 0);
198 }
while (
status != kDifOtbnStatusIdle &&
status != kDifOtbnStatusLocked);
199 CHECK(otbn_randomness_test_end(&otbn,
false));
202 task_done_set_and_yield(kTestTaskIdOtbn);
204 OTTF_TASK_DELETE_SELF_OR_DIE;
214 static void ibex_task(
void *task_parameters) {
216 if (execution_state == kTestStateTearDown) {
219 if (execution_state == kTestStateSetup || task_done[kTestTaskIdIbex]) {
224 uint32_t prev_data = 0;
225 for (
size_t i = 0; i < task_iter_count_max[kTestTaskIdIbex];) {
226 dif_rv_core_ibex_rnd_status_t
status;
227 CHECK_DIF_OK(dif_rv_core_ibex_get_rnd_status(&rv_core_ibex, &
status));
228 if ((
status & kDifRvCoreIbexRndStatusValid) == 0) {
234 CHECK_DIF_OK(dif_rv_core_ibex_read_rnd_data(&rv_core_ibex, &new_data));
239 CHECK(new_data != prev_data,
"Unexpected duplicate data");
240 CHECK(new_data != 0);
241 CHECK(new_data != UINT32_MAX);
242 prev_data = new_data;
245 task_done_set_and_yield(kTestTaskIdIbex);
247 OTTF_TASK_DELETE_SELF_OR_DIE;
258 static void aes_task(
void *task_parameters) {
260 if (execution_state == kTestStateTearDown) {
263 if (execution_state == kTestStateSetup || task_done[kTestTaskIdAes]) {
268 for (
size_t i = 0; i < task_iter_count_max[kTestTaskIdAes]; ++i) {
279 task_done_set_and_yield(kTestTaskIdAes);
281 OTTF_TASK_DELETE_SELF_OR_DIE;
292 static void csrng_task(
void *task_parameters) {
294 if (execution_state == kTestStateTearDown) {
297 if (execution_state == kTestStateSetup || task_done[kTestTaskIdCsrng]) {
308 for (
size_t i = 0; i < task_iter_count_max[kTestTaskIdCsrng]; ++i) {
310 for (uint32_t i_gen = 0; i_gen < sw_num_reqs_between_reseeds; ++i_gen) {
318 csrng_send_app_cmd(csrng.base_addr, kCsrngAppCmdTypeCsrng, sw_gen));
320 for (uint32_t i_block = 0; i_block < sw_gen.
generate_len; ++i_block) {
322 uint32_t output[kCsrngGenBitsBufferSize];
328 &csrng, output, (
size_t)kCsrngGenBitsBufferSize));
338 csrng_send_app_cmd(csrng.base_addr, kCsrngAppCmdTypeCsrng, sw_res));
341 task_done_set_and_yield(kTestTaskIdCsrng);
343 OTTF_TASK_DELETE_SELF_OR_DIE;
354 static void entropy_config(
void) {
355 LOG_INFO(
"Generating EDN and CSRNG params");
357 edn_testutils_auto_params_build(
false,
361 edn_testutils_auto_params_build(
false,
364 sw_ins = csrng_testutils_app_cmd_build(
366 kCsrngAppCmdInstantiate,
369 sw_gen = csrng_testutils_app_cmd_build(
371 kCsrngAppCmdGenerate,
374 sw_res = csrng_testutils_app_cmd_build(
379 sw_num_reqs_between_reseeds = rand_testutils_gen32_range(1, 10);
381 task_iter_count_max[kTestTaskIdOtbn] =
382 rand_testutils_gen32_range(1, kTestParamNumOtbnIterationsMax);
383 task_iter_count_max[kTestTaskIdIbex] =
384 rand_testutils_gen32_range(1, kTestParamNumIbexIterationsMax);
385 task_iter_count_max[kTestTaskIdAes] =
386 rand_testutils_gen32_range(1, kTestParamNumAesIterationsMax);
387 task_iter_count_max[kTestTaskIdCsrng] =
388 rand_testutils_gen32_range(1, kTestParamNumCsrngIterationsMax);
390 CHECK_STATUS_OK(entropy_testutils_stop_csrng_edn());
395 CHECK_STATUS_OK(csrng_testutils_cmd_ready_wait(&csrng));
397 CHECK_STATUS_OK(csrng_testutils_cmd_ready_wait(&csrng));
400 CHECK_STATUS_OK(csrng_testutils_cmd_ready_wait(&csrng));
413 uint32_t iter_count = 0;
416 if (++iter_count >= kEsFinalFifoNumIterationsMax) {
417 LOG_INFO(
"Continuing without esfinal FIFO being full");
429 static void execution_state_update(test_state_t next_state) {
430 CHECK(next_state < kTestStateCount);
431 LOG_INFO(
"Test state: %s", kStatusNames[next_state]);
432 execution_state = next_state;
442 static void main_task(
void *task_parameters) {
443 task_iter_count_max[kTestTaskIdMain] = kTestParamNumIterationsSim;
445 task_iter_count_max[kTestTaskIdMain] = kTestParamNumIterationsOther;
448 uint32_t iter_count = 0;
450 if (execution_state == kTestStateRun) {
452 for (
size_t i = 0; i < kTestTaskIdCount; ++i) {
453 count += task_done[i] ? 1 : 0;
455 if (count < kTestTaskIdCount) {
463 if (++iter_count >= task_iter_count_max[kTestTaskIdMain]) {
464 execution_state_update(kTestStateTearDown);
467 CHECK_STATUS_OK((csrng_testutils_recoverable_alerts_check(&csrng)));
468 CHECK_STATUS_OK(entropy_testutils_error_check(&csrng, &edn0, &edn1));
469 execution_state_update(kTestStateSetup);
474 for (
size_t i = 0; i < kTestTaskIdCount; ++i) {
475 task_done[i] =
false;
478 execution_state_update(kTestStateRun);
481 task_done_set_and_yield(kTestTaskIdMain);
483 OTTF_TASK_DELETE_SELF_OR_DIE;
488 CHECK_STATUS_OK(entropy_testutils_auto_mode_init());
491 execution_state_update(kTestStateSetup);