5 #include "sw/device/tests/penetrationtests/firmware/fi/otp_fi.h"
8 #include "sw/device/lib/base/status.h"
11 #include "sw/device/lib/testing/otp_ctrl_testutils.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/otp_fi_commands.h"
18 #include "otp_ctrl_regs.h"
20 static dif_otp_ctrl_t otp;
23 otp_read32_result_vendor_test_comp[OTP_CTRL_PARAM_VENDOR_TEST_SIZE / 4];
24 uint32_t otp_read32_result_vendor_test_fi[OTP_CTRL_PARAM_VENDOR_TEST_SIZE / 4];
26 otp_read32_result_owner_sw_cfg_comp[OTP_CTRL_PARAM_OWNER_SW_CFG_SIZE / 4];
28 otp_read32_result_owner_sw_cfg_fi[OTP_CTRL_PARAM_OWNER_SW_CFG_SIZE / 4];
29 uint32_t otp_read32_result_hw_cfg_comp[OTP_CTRL_PARAM_HW_CFG0_SIZE / 4];
30 uint32_t otp_read32_result_hw_cfg_fi[OTP_CTRL_PARAM_HW_CFG0_SIZE / 4];
31 uint32_t otp_read32_result_life_cycle_comp[OTP_CTRL_PARAM_LIFE_CYCLE_SIZE / 4];
32 uint32_t otp_read32_result_life_cycle_fi[OTP_CTRL_PARAM_LIFE_CYCLE_SIZE / 4];
34 void init_otp_mem_dump_buffers(
void) {
35 for (uint32_t i = 0; i < OTP_CTRL_PARAM_VENDOR_TEST_SIZE / 4; i++) {
36 otp_read32_result_vendor_test_comp[i] = 0x00000001;
37 otp_read32_result_vendor_test_fi[i] = 0x00000001;
39 for (uint32_t i = 0; i < OTP_CTRL_PARAM_OWNER_SW_CFG_SIZE / 4; i++) {
40 otp_read32_result_owner_sw_cfg_comp[i] = 0x00000001;
41 otp_read32_result_owner_sw_cfg_fi[i] = 0x00000001;
43 for (uint32_t i = 0; i < OTP_CTRL_PARAM_HW_CFG0_SIZE / 4; i++) {
44 otp_read32_result_hw_cfg_comp[i] = 0x00000001;
45 otp_read32_result_hw_cfg_fi[i] = 0x00000001;
47 for (uint32_t i = 0; i < OTP_CTRL_PARAM_LIFE_CYCLE_SIZE / 4; i++) {
48 otp_read32_result_life_cycle_comp[i] = 0x00000001;
49 otp_read32_result_life_cycle_fi[i] = 0x00000001;
53 status_t otp_vendor_test_dump(uint32_t *buffer) {
57 OTP_CTRL_PARAM_VENDOR_TEST_SIZE / 4));
62 status_t otp_owner_sw_cfg_dump(uint32_t *buffer) {
64 TRY(otp_ctrl_testutils_dai_read32_array(
66 OTP_CTRL_PARAM_OWNER_SW_CFG_SIZE / 4));
71 status_t otp_hw_cfg_dump(uint32_t *buffer) {
75 OTP_CTRL_PARAM_HW_CFG0_SIZE / 4));
80 status_t otp_life_cycle_dump(uint32_t *buffer) {
84 OTP_CTRL_PARAM_LIFE_CYCLE_SIZE / 4));
93 pentest_clear_sensor_recov_alerts();
96 TRY(otp_hw_cfg_dump(otp_read32_result_hw_cfg_comp));
99 pentest_set_trigger_high();
102 asm volatile(NOP1000);
103 asm volatile(NOP1000);
104 asm volatile(NOP1000);
105 asm volatile(NOP1000);
107 pentest_set_trigger_low();
110 TRY(otp_hw_cfg_dump(otp_read32_result_hw_cfg_fi));
113 reg_alerts = pentest_get_triggered_alerts();
122 otp_fi_hwcfg_partition_t uj_output;
123 for (uint32_t i = 0; i < OTP_CTRL_PARAM_HW_CFG0_SIZE / 4; i++) {
124 uj_output.hw_cfg_comp[i] = otp_read32_result_hw_cfg_comp[i];
125 uj_output.hw_cfg_fi[i] = otp_read32_result_hw_cfg_fi[i];
127 uj_output.otp_status_codes =
status.codes;
128 memcpy(uj_output.otp_error_causes, (uint8_t *)
status.causes,
130 uj_output.alerts[0] = reg_alerts.alerts[0];
131 uj_output.alerts[1] = reg_alerts.alerts[1];
132 uj_output.alerts[2] = reg_alerts.alerts[2];
133 memcpy(uj_output.ast_alerts, sensor_alerts.alerts,
134 sizeof(sensor_alerts.alerts));
135 RESP_OK(ujson_serialize_otp_fi_hwcfg_partition_t, uj, &uj_output);
141 penetrationtest_cpuctrl_t uj_data;
142 TRY(ujson_deserialize_penetrationtest_cpuctrl_t(uj, &uj_data));
144 pentest_select_trigger_type(kPentestTriggerTypeSw);
148 pentest_init(kPentestTriggerSourceAes,
149 kPentestPeripheralIoDiv4 | kPentestPeripheralEdn |
150 kPentestPeripheralCsrng | kPentestPeripheralEntropy |
151 kPentestPeripheralAes | kPentestPeripheralHmac |
152 kPentestPeripheralKmac | kPentestPeripheralOtbn);
156 pentest_configure_alert_handler();
159 penetrationtest_device_info_t uj_output;
160 TRY(pentest_configure_cpu(
161 uj_data.icache_disable, uj_data.dummy_instr_disable,
162 uj_data.enable_jittery_clock, uj_data.enable_sram_readback,
163 &uj_output.clock_jitter_locked, &uj_output.clock_jitter_en,
164 &uj_output.sram_main_readback_locked, &uj_output.sram_ret_readback_locked,
165 &uj_output.sram_main_readback_en, &uj_output.sram_ret_readback_en));
167 TRY(dif_otp_ctrl_init(
170 init_otp_mem_dump_buffers();
173 TRY(pentest_read_device_id(uj_output.device_id));
174 RESP_OK(ujson_serialize_penetrationtest_device_info_t, uj, &uj_output);
183 pentest_clear_sensor_recov_alerts();
186 TRY(otp_life_cycle_dump(otp_read32_result_life_cycle_comp));
189 pentest_set_trigger_high();
192 asm volatile(NOP1000);
193 asm volatile(NOP1000);
194 asm volatile(NOP1000);
195 asm volatile(NOP1000);
197 pentest_set_trigger_low();
200 TRY(otp_life_cycle_dump(otp_read32_result_life_cycle_fi));
203 reg_alerts = pentest_get_triggered_alerts();
212 otp_fi_lifecycle_partition_t uj_output;
213 for (uint32_t i = 0; i < OTP_CTRL_PARAM_LIFE_CYCLE_SIZE / 4; i++) {
214 uj_output.life_cycle_comp[i] = otp_read32_result_life_cycle_comp[i];
215 uj_output.life_cycle_fi[i] = otp_read32_result_life_cycle_fi[i];
217 uj_output.otp_status_codes =
status.codes;
218 memcpy(uj_output.otp_error_causes, (uint8_t *)
status.causes,
220 uj_output.alerts[0] = reg_alerts.alerts[0];
221 uj_output.alerts[1] = reg_alerts.alerts[1];
222 uj_output.alerts[2] = reg_alerts.alerts[2];
223 memcpy(uj_output.ast_alerts, sensor_alerts.alerts,
224 sizeof(sensor_alerts.alerts));
225 RESP_OK(ujson_serialize_otp_fi_lifecycle_partition_t, uj, &uj_output);
234 pentest_clear_sensor_recov_alerts();
237 TRY(otp_owner_sw_cfg_dump(otp_read32_result_owner_sw_cfg_comp));
240 pentest_set_trigger_high();
243 asm volatile(NOP1000);
244 asm volatile(NOP1000);
245 asm volatile(NOP1000);
246 asm volatile(NOP1000);
248 pentest_set_trigger_low();
251 TRY(otp_owner_sw_cfg_dump(otp_read32_result_owner_sw_cfg_fi));
254 reg_alerts = pentest_get_triggered_alerts();
263 otp_fi_ownerswcfg_partition_t uj_output;
264 for (uint32_t i = 0; i < OTP_CTRL_PARAM_OWNER_SW_CFG_SIZE / 4; i++) {
265 uj_output.owner_sw_cfg_comp[i] = otp_read32_result_owner_sw_cfg_comp[i];
266 uj_output.owner_sw_cfg_fi[i] = otp_read32_result_owner_sw_cfg_fi[i];
268 uj_output.otp_status_codes =
status.codes;
269 memcpy(uj_output.otp_error_causes, (uint8_t *)
status.causes,
271 uj_output.alerts[0] = reg_alerts.alerts[0];
272 uj_output.alerts[1] = reg_alerts.alerts[1];
273 uj_output.alerts[2] = reg_alerts.alerts[2];
274 memcpy(uj_output.ast_alerts, sensor_alerts.alerts,
275 sizeof(sensor_alerts.alerts));
276 RESP_OK(ujson_serialize_otp_fi_ownerswcfg_partition_t, uj, &uj_output);
285 pentest_clear_sensor_recov_alerts();
288 TRY(otp_vendor_test_dump(otp_read32_result_vendor_test_comp));
291 pentest_set_trigger_high();
294 asm volatile(NOP1000);
295 asm volatile(NOP1000);
296 asm volatile(NOP1000);
297 asm volatile(NOP1000);
299 pentest_set_trigger_low();
302 TRY(otp_vendor_test_dump(otp_read32_result_vendor_test_fi));
305 reg_alerts = pentest_get_triggered_alerts();
314 otp_fi_vendortest_partition_t uj_output;
315 for (uint32_t i = 0; i < OTP_CTRL_PARAM_VENDOR_TEST_SIZE / 4; i++) {
316 uj_output.vendor_test_comp[i] = otp_read32_result_vendor_test_comp[i];
317 uj_output.vendor_test_fi[i] = otp_read32_result_vendor_test_fi[i];
319 uj_output.otp_status_codes =
status.codes;
320 memcpy(uj_output.otp_error_causes, (uint8_t *)
status.causes,
322 uj_output.alerts[0] = reg_alerts.alerts[0];
323 uj_output.alerts[1] = reg_alerts.alerts[1];
324 uj_output.alerts[2] = reg_alerts.alerts[2];
325 memcpy(uj_output.ast_alerts, sensor_alerts.alerts,
326 sizeof(sensor_alerts.alerts));
327 RESP_OK(ujson_serialize_otp_fi_vendortest_partition_t, uj, &uj_output);
333 otp_fi_subcommand_t cmd;
334 TRY(ujson_deserialize_otp_fi_subcommand_t(uj, &cmd));
336 case kOtpFiSubcommandInit:
337 return handle_otp_fi_init(uj);
338 case kOtpFiSubcommandVendorTest:
339 return handle_otp_fi_vendor_test(uj);
340 case kOtpFiSubcommandOwnerSwCfg:
341 return handle_otp_fi_owner_sw_cfg(uj);
342 case kOtpFiSubcommandHwCfg:
343 return handle_otp_fi_hw_cfg(uj);
344 case kOtpFiSubcommandLifeCycle:
345 return handle_otp_fi_life_cycle(uj);
347 LOG_ERROR(
"Unrecognized OTP FI subcommand: %d", cmd);
348 return INVALID_ARGUMENT();