12 #include "sw/device/lib/testing/test_framework/ottf_test_config.h"
15 #include "sw/device/tests/penetrationtests/firmware/lib/pentest_lib.h"
18 #include "kmac_regs.h"
36 OTTF_DEFINE_TEST_CONFIG();
61 kIbexSha3SleepCycles = 1060,
65 kNumBatchOpsMax = 128,
71 static dif_kmac_t kmac;
79 .entropy_seed = {0xb153e3fe, 0x09596819, 0x3e85a6e8, 0xb6dcdaba, 0x50dc409c,
98 uint8_t message_fixed[kMessageLength];
106 static bool run_fixed =
false;
111 uint8_t batch_keys[kNumBatchOpsMax][kKeyLength];
116 uint8_t batch_messages[kNumBatchOpsMax][kMessageLength];
121 static void kmac_block_until_idle(
void) {
125 reg = mmio_region_read32(kmac.base_addr, KMAC_STATUS_REG_OFFSET);
132 static void kmac_reset(
void) {
135 kmac.base_addr, KMAC_CMD_REG_OFFSET,
137 kmac_block_until_idle();
148 static bool is_state_idle(
void) {
149 uint32_t reg = mmio_region_read32(kmac.base_addr, KMAC_STATUS_REG_OFFSET);
159 static uint32_t calculate_rate_bits(uint32_t security_level) {
165 return 1600 - 2 * security_level;
182 kstrength = KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L224;
183 kmac_operation_state.
offset = 0;
184 kmac_operation_state.
r = calculate_rate_bits(224) / 32;
185 kmac_operation_state.
d = 224 / 32;
188 kstrength = KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L256;
189 kmac_operation_state.
offset = 0;
190 kmac_operation_state.
r = calculate_rate_bits(256) / 32;
191 kmac_operation_state.
d = 256 / 32;
194 kstrength = KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L384;
195 kmac_operation_state.
offset = 0;
196 kmac_operation_state.
r = calculate_rate_bits(384) / 32;
197 kmac_operation_state.
d = 384 / 32;
200 kstrength = KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L512;
201 kmac_operation_state.
offset = 0;
202 kmac_operation_state.
r = calculate_rate_bits(512) / 32;
203 kmac_operation_state.
d = 512 / 32;
210 if (!is_state_idle()) {
215 kmac_operation_state.
append_d =
false;
219 mmio_region_read32(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET);
223 KMAC_CFG_SHADOWED_MODE_VALUE_SHA3);
224 mmio_region_write32(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET, cfg_reg);
225 mmio_region_write32(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET, cfg_reg);
240 static dif_result_t sha3_msg_write(
const void *msg,
size_t msg_len,
243 if (processed != NULL) {
247 if (msg == NULL && msg_len != 0) {
252 if (kmac_operation_state.
r == 0) {
260 for (
size_t i = 0; i < msg_len; ++i) {
261 mmio_region_write8(kmac.base_addr, KMAC_MSG_FIFO_REG_OFFSET,
262 ((
const uint8_t *)msg)[i]);
265 if (processed != NULL) {
266 *processed = msg_len;
278 static void kmac_msg_proc(
void) {
282 mmio_region_write32(kmac.base_addr, KMAC_CMD_REG_OFFSET, cmd_reg);
287 mmio_region_write32(kmac.base_addr, KMAC_CMD_REG_OFFSET, cmd_reg);
296 static void kmac_msg_done(
void) {
300 reg = mmio_region_read32(kmac.base_addr, KMAC_STATUS_REG_OFFSET);
313 static dif_result_t sha3_get_digest(uint32_t *out,
size_t len) {
314 if (out == NULL && len != 0) {
320 size_t remaining = kmac_operation_state.
r - kmac_operation_state.
offset;
321 if (kmac_operation_state.
d != 0 &&
322 kmac_operation_state.
d < kmac_operation_state.
r) {
323 remaining = kmac_operation_state.
d - kmac_operation_state.
offset;
336 KMAC_STATE_REG_OFFSET +
337 (ptrdiff_t)kmac_operation_state.
offset * (ptrdiff_t)
sizeof(uint32_t);
338 for (
size_t i = 0; i < n; ++i) {
340 uint32_t share0 = mmio_region_read32(kmac.base_addr, offset);
343 *out++ = share0 ^ share1;
344 offset +=
sizeof(uint32_t);
346 kmac_operation_state.
offset += n;
357 static void kmac_init(
void) {
363 kmac_block_until_idle();
371 static void kmac_disable_masking(
const uint8_t *masks_off,
size_t off_len) {
379 LOG_INFO(
"Initializing the KMAC peripheral with masking disabled.");
383 LOG_INFO(
"Initializing the KMAC peripheral with masking enabled.");
387 kmac_block_until_idle();
398 static void sha3_serial_absorb(
const uint8_t *msg,
size_t msg_len) {
408 pentest_call_and_sleep(kmac_msg_proc, kIbexSha3SleepCycles,
true,
false);
420 static void sha3_serial_single_absorb(
const uint8_t *msg,
size_t msg_len) {
421 SS_CHECK(msg_len == kMessageLength);
424 sha3_serial_absorb(msg, msg_len);
430 uint32_t out[kDigestLength];
439 static void sha3_serial_fixed_message_set(
const uint8_t *message,
440 size_t message_len) {
441 SS_CHECK(message_len == kMessageLength);
442 memcpy(message_fixed, message, message_len);
445 static void sha3_serial_batch(
const uint8_t *data,
size_t data_len) {
446 uint32_t num_hashes = 0;
447 uint32_t out[kDigestLength];
448 uint32_t batch_digest[kDigestLength];
449 uint8_t dummy_message[kMessageLength];
450 SS_CHECK(data_len ==
sizeof(num_hashes));
453 for (uint32_t j = 0; j < kDigestLength; ++j) {
457 for (uint32_t i = 0; i < num_hashes; ++i) {
459 memcpy(batch_messages[i], message_fixed, kMessageLength);
464 run_fixed = dummy_message[0] & 0x1;
467 for (uint32_t i = 0; i < num_hashes; ++i) {
470 sha3_serial_absorb(batch_messages[i], kMessageLength);
478 for (uint32_t j = 0; j < kDigestLength; ++j) {
479 batch_digest[j] ^= out[j];
496 static void sha3_serial_seed_lfsr(
const uint8_t *seed,
size_t seed_len) {
497 SS_CHECK(seed_len ==
sizeof(uint32_t));
498 pentest_seed_lfsr(
read_32(seed), kPentestLfsrMasking);
508 pentest_init(kPentestTriggerSourceKmac,
509 kPentestPeripheralIoDiv4 | kPentestPeripheralKmac);
513 LOG_INFO(
"Initializing simple serial interface to capture board.");
521 LOG_INFO(
"Initializing the KMAC peripheral with masks enabled.");
524 LOG_INFO(
"Starting simple serial packet handling.");