6 #include "sw/device/lib/base/status.h"
7 #include "sw/device/lib/dif/dif_rv_core_ibex.h"
10 #include "sw/device/lib/testing/rv_core_ibex_testutils.h"
11 #include "sw/device/lib/testing/test_framework/check.h"
12 #include "sw/device/lib/testing/test_framework/ujson_ottf.h"
13 #include "sw/device/lib/ujson/ujson.h"
14 #include "sw/device/tests/penetrationtests/firmware/lib/pentest_lib.h"
15 #include "sw/device/tests/penetrationtests/json/edn_sca_commands.h"
19 #include "rv_core_ibex_regs.h"
22 kEdnKatTimeout = (10 * 1000 * 1000),
24 kEdnKatOutputLen = 16,
25 kEdnKatWordsPerBlock = 4,
29 kNumBatchOpsMax = 128,
32 static dif_rv_core_ibex_t rv_core_ibex;
49 static status_t read_rnd_data_reg(uint32_t ibex_rnd_data[4]) {
51 for (
size_t it = 0; it < 4; it++) {
52 TRY(dif_rv_core_ibex_read_rnd_data(&rv_core_ibex, &ibex_rnd_data[0]));
54 memset(ibex_rnd_data, 0, 4 *
sizeof(uint32_t));
56 bool rnd_data_valid = rv_core_ibex_testutils_is_rnd_data_valid(&rv_core_ibex);
57 while (!rnd_data_valid) {
58 rnd_data_valid = rv_core_ibex_testutils_is_rnd_data_valid(&rv_core_ibex);
65 pentest_set_trigger_high();
67 asm volatile(
"li t0, %0"
71 asm volatile(
"lw t1, %0(t0)"
73 :
"i"(RV_CORE_IBEX_RND_DATA_REG_OFFSET)
77 pentest_set_trigger_low();
80 TRY(dif_rv_core_ibex_read_rnd_data(&rv_core_ibex, &ibex_rnd_data[3]));
87 edn_sca_batch_t uj_data;
88 uint32_t max_iterations = 128;
89 TRY(ujson_deserialize_edn_sca_batch_t(uj, &uj_data));
90 CHECK(uj_data.num_iterations <= max_iterations);
93 uint32_t rand_data[max_iterations][4];
94 for (
size_t it = 0; it < uj_data.num_iterations; it++) {
95 TRY(read_rnd_data_reg(rand_data[it]));
99 for (
size_t it = 0; it < uj_data.num_iterations; it++) {
100 edn_sca_result_t uj_output;
101 memcpy(&uj_output.rnd_data, rand_data[it], 4 *
sizeof(uint32_t));
102 RESP_OK(ujson_serialize_edn_sca_result_t, uj, &uj_output);
109 edn_sca_result_t uj_output;
111 TRY(read_rnd_data_reg(uj_output.rnd_data));
114 RESP_OK(ujson_serialize_edn_sca_result_t, uj, &uj_output);
119 penetrationtest_cpuctrl_t uj_data;
120 TRY(ujson_deserialize_penetrationtest_cpuctrl_t(uj, &uj_data));
122 pentest_select_trigger_type(kPentestTriggerTypeSw);
126 pentest_init(kPentestTriggerSourceAes,
127 kPentestPeripheralIoDiv4 | kPentestPeripheralEntropy |
128 kPentestPeripheralCsrng | kPentestPeripheralEdn);
131 penetrationtest_device_info_t uj_output;
132 TRY(pentest_configure_cpu(
133 uj_data.icache_disable, uj_data.dummy_instr_disable,
134 uj_data.enable_jittery_clock, uj_data.enable_sram_readback,
135 &uj_output.clock_jitter_locked, &uj_output.clock_jitter_en,
136 &uj_output.sram_main_readback_locked, &uj_output.sram_ret_readback_locked,
137 &uj_output.sram_main_readback_en, &uj_output.sram_ret_readback_en));
140 TRY(dif_rv_core_ibex_init(
146 TRY(pentest_configure_entropy_source_max_reseed_interval());
149 TRY(pentest_read_device_id(uj_output.device_id));
150 RESP_OK(ujson_serialize_penetrationtest_device_info_t, uj, &uj_output);
156 edn_sca_subcommand_t cmd;
157 TRY(ujson_deserialize_edn_sca_subcommand_t(uj, &cmd));
159 case kEdnScaSubcommandInit:
160 return handle_edn_sca_init(uj);
161 case kEdnScaSubcommandBusData:
162 return handle_edn_sca_bus_data(uj);
163 case kEdnScaSubcommandBusDataBatch:
164 return handle_edn_sca_bus_data_batch(uj);
166 LOG_ERROR(
"Unrecognized EDN SCA subcommand: %d", cmd);
167 return INVALID_ARGUMENT();