10 #include "sw/device/lib/testing/test_framework/ottf_test_config.h"
13 #include "sw/device/tests/penetrationtests/firmware/lib/pentest_lib.h"
16 #include "kmac_regs.h"
34 OTTF_DEFINE_TEST_CONFIG();
59 kIbexSha3SleepCycles = 1180,
63 kNumBatchOpsMax = 128,
69 static dif_kmac_t kmac;
90 uint8_t key_fixed[kKeyLength];
98 static bool run_fixed =
false;
103 uint8_t batch_keys[kNumBatchOpsMax][kKeyLength];
108 uint8_t batch_messages[kNumBatchOpsMax][kMessageLength];
113 static void kmac_block_until_idle(
void) {
117 reg = mmio_region_read32(kmac.base_addr, KMAC_STATUS_REG_OFFSET);
124 static void kmac_reset(
void) {
127 kmac.base_addr, KMAC_CMD_REG_OFFSET,
129 kmac_block_until_idle();
140 static bool is_state_idle(
void) {
141 uint32_t reg = mmio_region_read32(kmac.base_addr, KMAC_STATUS_REG_OFFSET);
151 static uint32_t calculate_rate_bits(uint32_t security_level) {
157 return 1600 - 2 * security_level;
180 kstrength = KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L128;
181 kmac_operation_state.
r = calculate_rate_bits(128) / 32;
184 kstrength = KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L256;
185 kmac_operation_state.
r = calculate_rate_bits(256) / 32;
190 kmac_operation_state.
offset = 0;
191 kmac_operation_state.
d = l;
192 kmac_operation_state.
append_d =
true;
197 key_len = KMAC_KEY_LEN_LEN_VALUE_KEY128;
200 key_len = KMAC_KEY_LEN_LEN_VALUE_KEY192;
203 key_len = KMAC_KEY_LEN_LEN_VALUE_KEY256;
206 key_len = KMAC_KEY_LEN_LEN_VALUE_KEY384;
209 key_len = KMAC_KEY_LEN_LEN_VALUE_KEY512;
216 if (!is_state_idle()) {
222 mmio_region_write32(kmac.base_addr, KMAC_KEY_LEN_REG_OFFSET, key_len);
223 for (
int i = 0; i <
ARRAYSIZE(k->share0); ++i) {
225 const uint32_t a = pentest_next_lfsr(32, kPentestLfsrMasking);
226 mmio_region_write32(kmac.base_addr,
227 KMAC_KEY_SHARE0_0_REG_OFFSET +
228 (ptrdiff_t)i * (ptrdiff_t)
sizeof(uint32_t),
230 mmio_region_write32(kmac.base_addr,
231 KMAC_KEY_SHARE1_0_REG_OFFSET +
232 (ptrdiff_t)i * (ptrdiff_t)
sizeof(uint32_t),
238 mmio_region_read32(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET);
243 KMAC_CFG_SHADOWED_MODE_VALUE_CSHAKE);
244 mmio_region_write32(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET, cfg_reg);
245 mmio_region_write32(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET, cfg_reg);
250 uint32_t prefix_regs[11] = {
257 if (s != NULL && s->
length >= 3) {
259 prefix_regs[1] &= 0xFFFF;
260 prefix_regs[1] |= (uint32_t)((uint8_t)s->
buffer[0]) << 16;
261 prefix_regs[1] |= (uint32_t)((uint8_t)s->
buffer[1]) << 24;
267 mmio_region_write32(base, KMAC_PREFIX_0_REG_OFFSET, prefix_regs[0]);
268 mmio_region_write32(base, KMAC_PREFIX_1_REG_OFFSET, prefix_regs[1]);
269 mmio_region_write32(base, KMAC_PREFIX_2_REG_OFFSET, prefix_regs[2]);
270 mmio_region_write32(base, KMAC_PREFIX_3_REG_OFFSET, prefix_regs[3]);
271 mmio_region_write32(base, KMAC_PREFIX_4_REG_OFFSET, prefix_regs[4]);
272 mmio_region_write32(base, KMAC_PREFIX_5_REG_OFFSET, prefix_regs[5]);
273 mmio_region_write32(base, KMAC_PREFIX_6_REG_OFFSET, prefix_regs[6]);
274 mmio_region_write32(base, KMAC_PREFIX_7_REG_OFFSET, prefix_regs[7]);
275 mmio_region_write32(base, KMAC_PREFIX_8_REG_OFFSET, prefix_regs[8]);
276 mmio_region_write32(base, KMAC_PREFIX_9_REG_OFFSET, prefix_regs[9]);
277 mmio_region_write32(base, KMAC_PREFIX_10_REG_OFFSET, prefix_regs[10]);
292 static dif_result_t kmac_msg_write(
const void *msg,
size_t msg_len,
295 if (processed != NULL) {
299 if (msg == NULL && msg_len != 0) {
304 if (kmac_operation_state.
r == 0) {
312 for (
size_t i = 0; i < msg_len; ++i) {
313 mmio_region_write8(kmac.base_addr, KMAC_MSG_FIFO_REG_OFFSET,
314 ((
const uint8_t *)msg)[i]);
317 if (processed != NULL) {
318 *processed = msg_len;
326 uint32_t d = kmac_operation_state.
d * 32;
327 int out_len = 1 + (d > 0xFF) + (d > 0xFFFF) + (d > 0xFFFFFF);
328 int shift = (out_len - 1) * 8;
330 mmio_region_write8(kmac.base_addr, KMAC_MSG_FIFO_REG_OFFSET,
331 (uint8_t)(d >> shift));
334 mmio_region_write8(kmac.base_addr, KMAC_MSG_FIFO_REG_OFFSET, (uint8_t)d);
335 mmio_region_write8(kmac.base_addr, KMAC_MSG_FIFO_REG_OFFSET,
347 static void kmac_msg_proc(
void) {
351 mmio_region_write32(kmac.base_addr, KMAC_CMD_REG_OFFSET, cmd_reg);
356 mmio_region_write32(kmac.base_addr, KMAC_CMD_REG_OFFSET, cmd_reg);
365 static void kmac_msg_done(
void) {
369 reg = mmio_region_read32(kmac.base_addr, KMAC_STATUS_REG_OFFSET);
382 static dif_result_t kmac_get_digest(uint32_t *out,
size_t len) {
383 if (out == NULL && len != 0) {
389 size_t remaining = kmac_operation_state.
r - kmac_operation_state.
offset;
390 if (kmac_operation_state.
d != 0 &&
391 kmac_operation_state.
d < kmac_operation_state.
r) {
392 remaining = kmac_operation_state.
d - kmac_operation_state.
offset;
405 KMAC_STATE_REG_OFFSET +
406 (ptrdiff_t)kmac_operation_state.
offset * (ptrdiff_t)
sizeof(uint32_t);
407 for (
size_t i = 0; i < n; ++i) {
409 uint32_t share0 = mmio_region_read32(kmac.base_addr, offset);
412 *out++ = share0 ^ share1;
413 offset +=
sizeof(uint32_t);
415 kmac_operation_state.
offset += n;
426 static void kmac_init(
void) {
433 .entropy_seed = {0xb153e3fe, 0x09596819, 0x3e85a6e8, 0xb6dcdaba,
434 0x50dc409c, 0x11e1ebd1},
442 kmac_block_until_idle();
457 static void sha3_serial_set_key(
const uint8_t *key,
size_t key_len) {
463 memcpy(kmac_key.share0, key, kKeyLength);
472 static void sha3_serial_absorb(
const uint8_t *msg,
size_t msg_len) {
483 pentest_call_and_sleep(kmac_msg_proc, kIbexSha3SleepCycles,
false,
false);
496 static void sha3_serial_single_absorb(
const uint8_t *msg,
size_t msg_len) {
497 SS_CHECK(msg_len == kMessageLength);
500 pentest_set_trigger_high();
501 sha3_serial_absorb(msg, msg_len);
502 pentest_set_trigger_low();
508 uint32_t out[kDigestLength];
517 static void sha3_serial_fixed_key_set(
const uint8_t *key,
size_t key_len) {
519 memcpy(key_fixed, key, key_len);
522 static void sha3_serial_batch(
const uint8_t *data,
size_t data_len) {
523 uint32_t num_encryptions = 0;
524 uint32_t out[kDigestLength];
525 uint32_t batch_digest[kDigestLength];
526 SS_CHECK(data_len ==
sizeof(num_encryptions));
527 num_encryptions =
read_32(data);
529 for (uint32_t j = 0; j < kDigestLength; ++j) {
533 for (uint32_t i = 0; i < num_encryptions; ++i) {
535 memcpy(batch_keys[i], key_fixed, kKeyLength);
540 run_fixed = batch_messages[i][0] & 0x1;
543 for (uint32_t i = 0; i < num_encryptions; ++i) {
545 memcpy(kmac_key.share0, batch_keys[i], kKeyLength);
547 pentest_set_trigger_high();
548 sha3_serial_absorb(batch_messages[i], kMessageLength);
549 pentest_set_trigger_low();
557 for (uint32_t j = 0; j < kDigestLength; ++j) {
558 batch_digest[j] ^= out[j];
572 static void sha3_serial_seed_lfsr(
const uint8_t *seed,
size_t seed_len) {
573 SS_CHECK(seed_len ==
sizeof(uint32_t));
574 pentest_seed_lfsr(
read_32(seed), kPentestLfsrMasking);
584 pentest_init(kPentestTriggerSourceKmac,
585 kPentestPeripheralIoDiv4 | kPentestPeripheralKmac);
589 LOG_INFO(
"Initializing simple serial interface to capture board.");
597 LOG_INFO(
"Initializing the KMAC peripheral.");
600 LOG_INFO(
"Starting simple serial packet handling.");