5 #include "sw/device/tests/penetrationtests/firmware/sca/hmac_sca.h"
8 #include "sw/device/lib/base/status.h"
9 #include "sw/device/lib/crypto/impl/keyblob.h"
13 #include "sw/device/lib/testing/test_framework/ottf_test_config.h"
14 #include "sw/device/lib/testing/test_framework/ujson_ottf.h"
15 #include "sw/device/lib/ujson/ujson.h"
17 #include "sw/device/tests/penetrationtests/firmware/lib/pentest_lib.h"
18 #include "sw/device/tests/penetrationtests/json/hmac_sca_commands.h"
26 kKeyLength = HMACSCA_CMD_MAX_KEY_BYTES,
30 kMessageLength = HMACSCA_CMD_MAX_MESSAGE_BYTES,
34 kTagLength = HMACSCA_CMD_MAX_TAG_BYTES,
38 kTagLengthWord = kTagLength /
sizeof(uint32_t),
42 kNumBatchOpsMax = 128,
45 static status_t trigger_hmac(uint8_t key_buf[], uint8_t mask_buf[],
46 uint8_t msg_buf[], uint32_t tag_buf[]) {
49 .version = kOtcryptoLibVersion1,
50 .key_mode = kOtcryptoKeyModeHmacSha256,
51 .key_length = kKeyLength,
53 .security_level = kOtcryptoKeySecurityLevelLow,
57 uint32_t keyblob[keyblob_num_words(config)];
60 TRY(keyblob_from_key_and_mask((uint32_t *)key_buf, (uint32_t *)mask_buf,
64 .keyblob_length =
sizeof(keyblob),
70 .len = kMessageLength,
76 .len = kTagLengthWord,
80 pentest_set_trigger_high();
82 pentest_set_trigger_low();
87 penetrationtest_cpuctrl_t uj_data;
88 TRY(ujson_deserialize_penetrationtest_cpuctrl_t(uj, &uj_data));
91 pentest_select_trigger_type(kPentestTriggerTypeSw);
94 pentest_init(kPentestTriggerSourceHmac,
95 kPentestPeripheralEntropy | kPentestPeripheralIoDiv4 |
96 kPentestPeripheralOtbn | kPentestPeripheralCsrng |
97 kPentestPeripheralEdn | kPentestPeripheralHmac);
100 penetrationtest_device_info_t uj_output;
101 TRY(pentest_configure_cpu(
102 uj_data.icache_disable, uj_data.dummy_instr_disable,
103 uj_data.enable_jittery_clock, uj_data.enable_sram_readback,
104 &uj_output.clock_jitter_locked, &uj_output.clock_jitter_en,
105 &uj_output.sram_main_readback_locked, &uj_output.sram_ret_readback_locked,
106 &uj_output.sram_main_readback_en, &uj_output.sram_ret_readback_en));
109 TRY(pentest_read_device_id(uj_output.device_id));
110 RESP_OK(ujson_serialize_penetrationtest_device_info_t, uj, &uj_output);
116 penetrationtest_hmac_sca_key_t uj_key;
117 penetrationtest_hmac_sca_num_it_t uj_it;
119 TRY(ujson_deserialize_penetrationtest_hmac_sca_key_t(uj, &uj_key));
120 TRY(ujson_deserialize_penetrationtest_hmac_sca_num_it_t(uj, &uj_it));
122 uint8_t batch_messages[kNumBatchOpsMax][kMessageLength];
123 uint8_t batch_keys[kNumBatchOpsMax][kKeyLength];
124 uint8_t batch_masks[kNumBatchOpsMax][kKeyLength];
130 bool sample_fixed =
true;
131 for (
size_t it = 0; it < uj_it.num_iterations; it++) {
133 memcpy(batch_keys[it], uj_key.key, kKeyLength);
134 memcpy(batch_masks[it], uj_key.mask, kKeyLength);
140 sample_fixed = batch_messages[it][0] & 0x1;
144 uint32_t tag_buf[kTagLengthWord];
145 for (
size_t it = 0; it < uj_it.num_iterations; it++) {
146 TRY(trigger_hmac(batch_keys[it], batch_masks[it], batch_messages[it],
151 penetrationtest_hmac_sca_tag_t uj_tag;
152 memcpy(uj_tag.tag, tag_buf, kTagLength);
153 RESP_OK(ujson_serialize_penetrationtest_hmac_sca_tag_t, uj, &uj_tag);
159 penetrationtest_hmac_sca_num_it_t uj_it;
161 TRY(ujson_deserialize_penetrationtest_hmac_sca_num_it_t(uj, &uj_it));
163 uint8_t batch_messages[kNumBatchOpsMax][kMessageLength];
164 uint8_t batch_keys[kNumBatchOpsMax][kKeyLength];
165 uint8_t batch_masks[kNumBatchOpsMax][kKeyLength];
168 for (
size_t it = 0; it < uj_it.num_iterations; it++) {
175 uint32_t tag_buf[kTagLengthWord];
176 for (
size_t it = 0; it < uj_it.num_iterations; it++) {
177 TRY(trigger_hmac(batch_keys[it], batch_masks[it], batch_messages[it],
182 penetrationtest_hmac_sca_tag_t uj_tag;
183 memcpy(uj_tag.tag, tag_buf, kTagLength);
184 RESP_OK(ujson_serialize_penetrationtest_hmac_sca_tag_t, uj, &uj_tag);
190 penetrationtest_hmac_sca_key_t uj_key;
191 penetrationtest_hmac_sca_message_t uj_message;
193 TRY(ujson_deserialize_penetrationtest_hmac_sca_key_t(uj, &uj_key));
194 TRY(ujson_deserialize_penetrationtest_hmac_sca_message_t(uj, &uj_message));
197 uint8_t key_buf[kKeyLength];
198 memcpy(key_buf, uj_key.key, kKeyLength);
199 uint8_t mask_buf[kKeyLength];
200 memcpy(mask_buf, uj_key.mask, kKeyLength);
201 uint8_t msg_buf[kMessageLength];
202 memcpy(msg_buf, uj_message.message, kMessageLength);
203 uint32_t tag_buf[kTagLengthWord];
206 TRY(trigger_hmac(key_buf, mask_buf, msg_buf, tag_buf));
209 penetrationtest_hmac_sca_tag_t uj_tag;
210 memcpy(uj_tag.tag, tag_buf, kTagLength);
213 RESP_OK(ujson_serialize_penetrationtest_hmac_sca_tag_t, uj, &uj_tag);
219 hmac_sca_subcommand_t cmd;
220 TRY(ujson_deserialize_hmac_sca_subcommand_t(uj, &cmd));
222 case kHmacScaSubcommandInit:
223 return handle_hmac_pentest_init(uj);
224 case kHmacScaSubcommandBatchFvsr:
225 return handle_hmac_sca_batch_fvsr(uj);
226 case kHmacScaSubcommandBatchRandom:
227 return handle_hmac_sca_batch_random(uj);
228 case kHmacScaSubcommandSingle:
229 return handle_hmac_sca_single(uj);
231 LOG_ERROR(
"Unrecognized HMAC SCA subcommand: %d", cmd);
232 return INVALID_ARGUMENT();