13 #include "sw/device/tests/penetrationtests/firmware/lib/pentest_lib.h"
22 #define IGNORE_RESULT(expr) \
30 kSimpleSerialProtocolVersion = 1,
31 kUartMaxRxPacketSize = 128,
45 static const dif_uart_t *uart;
47 static bool simple_serial_is_valid_command(uint8_t cmd) {
48 return cmd >=
'a' && cmd <=
'z';
61 if (hex >=
'0' && hex <=
'9') {
63 }
else if (hex >=
'A' && hex <=
'F') {
64 *val = hex -
'A' + 10;
65 }
else if (hex >=
'a' && hex <=
'f') {
66 *val = hex -
'a' + 10;
68 return kSimpleSerialError;
70 return kSimpleSerialOk;
86 static void simple_serial_receive_packet(uint8_t *cmd, uint8_t *data,
100 if (hex_byte[0] ==
'\n') {
103 if (simple_serial_hex_to_bin(hex_byte[0], &hex_byte[0]) !=
108 if (simple_serial_hex_to_bin(hex_byte[1], &hex_byte[1]) !=
112 if (*data_len == data_buf_len) {
115 data[*data_len] = (uint8_t)(hex_byte[0] << 4) | hex_byte[1];
130 static size_t simple_serial_get_handler_index(uint8_t cmd) {
131 if (simple_serial_is_valid_command(cmd)) {
148 static void simple_serial_version(
const uint8_t *data,
size_t data_len) {
160 static void simple_serial_seed_prng(
const uint8_t *seed,
size_t seed_len) {
161 SS_CHECK(seed_len ==
sizeof(uint32_t));
173 static void simple_serial_select_trigger_type(
const uint8_t *trigger,
174 size_t trigger_len) {
176 pentest_select_trigger_type((pentest_trigger_type_t)trigger[0]);
187 static void simple_serial_unknown_command(
const uint8_t *data,
195 for (
size_t i = 0; i <
ARRAYSIZE(handlers); ++i) {
196 handlers[i] = simple_serial_unknown_command;
198 handlers[simple_serial_get_handler_index(
's')] = simple_serial_seed_prng;
199 handlers[simple_serial_get_handler_index(
't')] =
200 simple_serial_select_trigger_type;
201 handlers[simple_serial_get_handler_index(
'v')] = simple_serial_version;
206 if (!simple_serial_is_valid_command(cmd)) {
207 return kSimpleSerialError;
208 }
else if (cmd ==
's' || cmd ==
't' || cmd ==
'v') {
210 return kSimpleSerialError;
212 handlers[simple_serial_get_handler_index(cmd)] = handler;
213 return kSimpleSerialOk;
219 uint8_t data[kUartMaxRxPacketSize];
221 simple_serial_receive_packet(&cmd, data,
ARRAYSIZE(data), &data_len);
222 handlers[simple_serial_get_handler_index(cmd)](data, data_len);
228 base_snprintf(&buf, 1,
"%c", cmd);
231 base_snprintf(&buf, 1,
"\n");
241 for (
size_t i = 0; i < data_len; ++i) {
242 base_snprintf(&buf[0], 2,
"%02x", data[i]);