Software APIs
firmware_sca.c
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 #include <stdbool.h>
5 
6 #include "sw/device/lib/base/status.h"
7 #include "sw/device/lib/crypto/drivers/entropy.h"
8 #include "sw/device/lib/testing/test_framework/check.h"
10 #include "sw/device/lib/testing/test_framework/ujson_ottf.h"
11 #include "sw/device/lib/ujson/ujson.h"
12 
13 // Include commands
14 #include "sw/device/tests/penetrationtests/json/aes_sca_commands.h"
15 #include "sw/device/tests/penetrationtests/json/commands.h"
16 #include "sw/device/tests/penetrationtests/json/edn_sca_commands.h"
17 #include "sw/device/tests/penetrationtests/json/hmac_sca_commands.h"
18 #include "sw/device/tests/penetrationtests/json/ibex_sca_commands.h"
19 #include "sw/device/tests/penetrationtests/json/kmac_sca_commands.h"
20 #include "sw/device/tests/penetrationtests/json/otbn_sca_commands.h"
21 #include "sw/device/tests/penetrationtests/json/pentest_lib_commands.h"
22 #include "sw/device/tests/penetrationtests/json/prng_sca_commands.h"
23 #include "sw/device/tests/penetrationtests/json/sha3_sca_commands.h"
24 #include "sw/device/tests/penetrationtests/json/trigger_sca_commands.h"
25 
26 // Include handlers
27 #include "lib/extclk_sca_fi.h"
28 #include "lib/pentest_lib.h"
29 #include "sca/aes_sca.h"
30 #include "sca/edn_sca.h"
31 #include "sca/hmac_sca.h"
32 #include "sca/ibex_sca.h"
33 #include "sca/kmac_sca.h"
34 #include "sca/otbn_sca.h"
35 #include "sca/prng_sca.h"
36 #include "sca/sha3_sca.h"
37 #include "sca/trigger_sca.h"
38 
39 OTTF_DEFINE_TEST_CONFIG(.enable_uart_flow_control = true);
40 
41 status_t process_cmd(ujson_t *uj) {
42  while (true) {
43  penetrationtest_cmd_t cmd;
44  TRY(ujson_deserialize_penetrationtest_cmd_t(uj, &cmd));
45  switch (cmd) {
46  case kPenetrationtestCommandAesSca:
47  RESP_ERR(uj, handle_aes_sca(uj));
48  break;
49  case kPenetrationtestCommandAlertInfo:
50  RESP_ERR(uj, pentest_read_rstmgr_alert_info(uj));
51  break;
52  case kPenetrationtestCommandEdnSca:
53  RESP_ERR(uj, handle_edn_sca(uj));
54  break;
55  case kPenetrationtestCommandExtClkScaFi:
56  RESP_ERR(uj, handle_extclk_sca_fi(uj));
57  break;
58  case kPenetrationtestCommandHmacSca:
59  RESP_ERR(uj, handle_hmac_sca(uj));
60  break;
61  case kPenetrationtestCommandIbexSca:
62  RESP_ERR(uj, handle_ibex_sca(uj));
63  break;
64  case kPenetrationtestCommandKmacSca:
65  RESP_ERR(uj, handle_kmac_sca(uj));
66  break;
67  case kPenetrationtestCommandOtbnSca:
68  RESP_ERR(uj, handle_otbn_sca(uj));
69  break;
70  case kPenetrationtestCommandPrngSca:
71  RESP_ERR(uj, handle_prng_sca(uj));
72  break;
73  case kPenetrationtestCommandSha3Sca:
74  RESP_ERR(uj, handle_sha3_sca(uj));
75  break;
76  case kPenetrationtestCommandTriggerSca:
77  RESP_ERR(uj, handle_trigger_sca(uj));
78  break;
79  default:
80  LOG_ERROR("Unrecognized command: %d", cmd);
81  RESP_ERR(uj, INVALID_ARGUMENT());
82  }
83  }
84 
85  return OK_STATUS();
86 }
87 
88 bool test_main(void) {
89  CHECK_STATUS_OK(entropy_complex_init());
90  ujson_t uj = ujson_ottf_console();
91  return status_ok(process_cmd(&uj));
92 }