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 #define NOP1 "addi x0, x0, 0\n"
23 #define NOP10 NOP1 NOP1 NOP1 NOP1 NOP1 NOP1 NOP1 NOP1 NOP1 NOP1
24 #define NOP30 NOP10 NOP10 NOP10
27 kEdnKatTimeout = (10 * 1000 * 1000),
29 kEdnKatOutputLen = 16,
30 kEdnKatWordsPerBlock = 4,
34 kNumBatchOpsMax = 128,
37 static dif_rv_core_ibex_t rv_core_ibex;
54 static status_t read_rnd_data_reg(uint32_t ibex_rnd_data[4]) {
56 for (
size_t it = 0; it < 4; it++) {
57 TRY(dif_rv_core_ibex_read_rnd_data(&rv_core_ibex, &ibex_rnd_data[0]));
59 memset(ibex_rnd_data, 0, 4 *
sizeof(uint32_t));
61 bool rnd_data_valid = rv_core_ibex_testutils_is_rnd_data_valid(&rv_core_ibex);
62 while (!rnd_data_valid) {
63 rnd_data_valid = rv_core_ibex_testutils_is_rnd_data_valid(&rv_core_ibex);
70 pentest_set_trigger_high();
72 asm volatile(
"li t0, %0"
76 asm volatile(
"lw t1, %0(t0)"
78 :
"i"(RV_CORE_IBEX_RND_DATA_REG_OFFSET)
82 pentest_set_trigger_low();
85 TRY(dif_rv_core_ibex_read_rnd_data(&rv_core_ibex, &ibex_rnd_data[3]));
92 edn_sca_batch_t uj_data;
93 uint32_t max_iterations = 128;
94 TRY(ujson_deserialize_edn_sca_batch_t(uj, &uj_data));
95 CHECK(uj_data.num_iterations <= max_iterations);
98 uint32_t rand_data[max_iterations][4];
99 for (
size_t it = 0; it < uj_data.num_iterations; it++) {
100 TRY(read_rnd_data_reg(rand_data[it]));
104 for (
size_t it = 0; it < uj_data.num_iterations; it++) {
105 edn_sca_result_t uj_output;
106 memcpy(&uj_output.rnd_data, rand_data[it], 4 *
sizeof(uint32_t));
107 RESP_OK(ujson_serialize_edn_sca_result_t, uj, &uj_output);
114 edn_sca_result_t uj_output;
116 TRY(read_rnd_data_reg(uj_output.rnd_data));
119 RESP_OK(ujson_serialize_edn_sca_result_t, uj, &uj_output);
124 penetrationtest_cpuctrl_t uj_data;
125 TRY(ujson_deserialize_penetrationtest_cpuctrl_t(uj, &uj_data));
127 pentest_select_trigger_type(kPentestTriggerTypeSw);
131 pentest_init(kPentestTriggerSourceAes,
132 kPentestPeripheralIoDiv4 | kPentestPeripheralEntropy |
133 kPentestPeripheralCsrng | kPentestPeripheralEdn);
136 penetrationtest_device_info_t uj_output;
137 TRY(pentest_configure_cpu(
138 uj_data.icache_disable, uj_data.dummy_instr_disable,
139 uj_data.enable_jittery_clock, uj_data.enable_sram_readback,
140 &uj_output.clock_jitter_locked, &uj_output.clock_jitter_en,
141 &uj_output.sram_main_readback_locked, &uj_output.sram_ret_readback_locked,
142 &uj_output.sram_main_readback_en, &uj_output.sram_ret_readback_en));
145 TRY(dif_rv_core_ibex_init(
151 TRY(pentest_configure_entropy_source_max_reseed_interval());
154 TRY(pentest_read_device_id(uj_output.device_id));
155 RESP_OK(ujson_serialize_penetrationtest_device_info_t, uj, &uj_output);
161 edn_sca_subcommand_t cmd;
162 TRY(ujson_deserialize_edn_sca_subcommand_t(uj, &cmd));
164 case kEdnScaSubcommandInit:
165 return handle_edn_sca_init(uj);
166 case kEdnScaSubcommandBusData:
167 return handle_edn_sca_bus_data(uj);
168 case kEdnScaSubcommandBusDataBatch:
169 return handle_edn_sca_bus_data_batch(uj);
171 LOG_ERROR(
"Unrecognized EDN SCA subcommand: %d", cmd);
172 return INVALID_ARGUMENT();