11 #include "sw/device/lib/testing/keymgr_testutils.h"
12 #include "sw/device/lib/testing/kmac_testutils.h"
13 #include "sw/device/lib/testing/test_framework/check.h"
17 #include "keymgr_regs.h"
18 #include "kmac_regs.h"
20 static dif_kmac_t kmac;
21 static dif_keymgr_t keymgr;
23 OTTF_DEFINE_TEST_CONFIG();
35 const char *customization_string;
36 size_t customization_string_len;
38 const uint32_t digest[16];
40 bool digest_len_is_fixed;
51 .share0 = {0x43424140, 0x47464544, 0x4b4a4948, 0x4f4e4f4c,
52 0x53525150, 0x57565554, 0x5b5a5958, 0x5f5e5d5c},
57 "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
58 "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
59 "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
60 "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
61 "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
62 "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
63 "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
64 "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
65 "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
66 "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
67 "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
68 "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
69 "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7",
71 .customization_string =
"My Tagged Application",
72 .customization_string_len = 21,
73 .digest = {0x1c73bed5, 0x73d74e95, 0x59bb4628, 0xe3a8e3db, 0x7ae7830f,
74 0x5944ff4b, 0xb4c2f1f2, 0xceb8ebec, 0xc601ba67, 0x57b88a2e,
75 0x9b492d8d, 0x6727bbd1, 0x90117868, 0x6a300a02, 0x1d28de97,
78 .digest_len_is_fixed =
false,
88 TRY(keymgr_testutils_initialize(&keymgr, &kmac));
98 void poll_sha3_idle_bit(
const dif_kmac_t *kmac) {
101 reg = mmio_region_read32(kmac->base_addr, KMAC_STATUS_REG_OFFSET);
110 void poll_kmac_done_bit(
const dif_kmac_t *kmac) {
113 reg = mmio_region_read32(kmac->base_addr, KMAC_INTR_STATE_REG_OFFSET);
144 TRY_CHECK(error,
"No error was triggered.");
147 TRY_CHECK(err == exp_err,
"Unexpected error was triggered.");
157 poll_sha3_idle_bit(kmac);
161 poll_kmac_done_bit(kmac);
177 status_t test_err_wait_timer_expired(
void) {
178 LOG_INFO(
"Testing ErrWaitTimerExpired error.");
185 .entropy_wait_timer = 0x001,
186 .entropy_prescaler = 0x000,
188 .entropy_seed = {0xaa25b4bf, 0x48ce8fff, 0x5a78282a, 0x48465647,
200 kKmacTestVector.mode, 0, &kKmacTestVector.key,
203 TRY(
dif_kmac_absorb(&kmac, &kmac_operation_state, kKmacTestVector.message,
204 kKmacTestVector.message_len, NULL));
207 uint32_t digest[kKmacTestVector.digest_len];
209 kKmacTestVector.digest_len,
216 bool irq_err_pending;
217 TRY(dif_kmac_irq_is_pending(&kmac, kDifKmacIrqKmacErr, &irq_err_pending));
218 if (irq_err_pending) {
223 "Error other than EDN timeout occurred.");
226 LOG_INFO(
"EDN seed received before timeout.");
230 TRY_CHECK(irq_err_pending ==
true,
231 "EDN timeout expectation doesn't match observation.");
237 if (irq_err_pending) {
239 TRY(dif_kmac_irq_acknowledge_all(&kmac));
245 dif_kmac_irq_state_snapshot_t intr_snapshot;
246 TRY(dif_kmac_irq_get_state(&kmac, &intr_snapshot));
247 TRY_CHECK(intr_snapshot == 0,
248 "INTR_STATE is non-zero after timeout clean-up.");
252 TRY_CHECK(!is_kmac_locked,
"KMAC still locked after timeout clean-up.");
266 status_t test_err_incorrect_entropy_mode(
void) {
267 LOG_INFO(
"Testing ErrIncorrectEntropyMode error.");
273 uint32_t cfg_reg = 0;
277 KMAC_CFG_SHADOWED_ENTROPY_MODE_FIELD, 0xf);
291 mmio_region_write32_shadowed(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET,
307 status_t test_err_sw_hashing_without_entropy_ready(
void) {
308 LOG_INFO(
"Testing ErrSwHashingWithoutEntropyReady error.");
314 uint32_t entropy_period_reg = 0;
316 entropy_period_reg, KMAC_ENTROPY_PERIOD_WAIT_TIMER_FIELD, 0);
318 entropy_period_reg, KMAC_ENTROPY_PERIOD_PRESCALER_FIELD, 0);
319 mmio_region_write32(kmac.base_addr, KMAC_ENTROPY_PERIOD_REG_OFFSET,
323 uint32_t entropy_threshold_reg =
324 KMAC_ENTROPY_REFRESH_THRESHOLD_SHADOWED_REG_RESVAL;
326 entropy_threshold_reg,
327 KMAC_ENTROPY_REFRESH_THRESHOLD_SHADOWED_THRESHOLD_FIELD, 0);
328 mmio_region_write32_shadowed(
329 kmac.base_addr, KMAC_ENTROPY_REFRESH_THRESHOLD_SHADOWED_REG_OFFSET,
330 entropy_threshold_reg);
332 uint32_t cfg_reg = 0;
339 KMAC_CFG_SHADOWED_ENTROPY_MODE_VALUE_EDN_MODE);
346 mmio_region_write32_shadowed(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET,
349 mmio_region_write32(kmac.base_addr, KMAC_ENTROPY_SEED_REG_OFFSET, 0xaa25b4bf);
350 mmio_region_write32(kmac.base_addr, KMAC_ENTROPY_SEED_REG_OFFSET, 0x48ce8fff);
351 mmio_region_write32(kmac.base_addr, KMAC_ENTROPY_SEED_REG_OFFSET, 0x5a78282a);
352 mmio_region_write32(kmac.base_addr, KMAC_ENTROPY_SEED_REG_OFFSET, 0x48465647);
353 mmio_region_write32(kmac.base_addr, KMAC_ENTROPY_SEED_REG_OFFSET, 0x70410fef);
356 cfg_reg = mmio_region_read32(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET);
359 KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L256);
361 KMAC_CFG_SHADOWED_MODE_VALUE_CSHAKE);
362 mmio_region_write32_shadowed(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET,
366 uint32_t prefix_regs[11] = {
370 mmio_region_write32(kmac.base_addr, KMAC_PREFIX_0_REG_OFFSET, prefix_regs[0]);
371 mmio_region_write32(kmac.base_addr, KMAC_PREFIX_1_REG_OFFSET, prefix_regs[1]);
372 mmio_region_write32(kmac.base_addr, KMAC_PREFIX_2_REG_OFFSET, prefix_regs[2]);
373 mmio_region_write32(kmac.base_addr, KMAC_PREFIX_3_REG_OFFSET, prefix_regs[3]);
374 mmio_region_write32(kmac.base_addr, KMAC_PREFIX_4_REG_OFFSET, prefix_regs[4]);
375 mmio_region_write32(kmac.base_addr, KMAC_PREFIX_5_REG_OFFSET, prefix_regs[5]);
376 mmio_region_write32(kmac.base_addr, KMAC_PREFIX_6_REG_OFFSET, prefix_regs[6]);
377 mmio_region_write32(kmac.base_addr, KMAC_PREFIX_7_REG_OFFSET, prefix_regs[7]);
378 mmio_region_write32(kmac.base_addr, KMAC_PREFIX_8_REG_OFFSET, prefix_regs[8]);
379 mmio_region_write32(kmac.base_addr, KMAC_PREFIX_9_REG_OFFSET, prefix_regs[9]);
380 mmio_region_write32(kmac.base_addr, KMAC_PREFIX_10_REG_OFFSET,
386 mmio_region_write32(kmac.base_addr, KMAC_CMD_REG_OFFSET, cmd_reg);
389 return check_and_clear_error(
390 &kmac, kDifErrorSoftwareHashingWithoutEntropyReady,
false);
402 status_t test_err_incorrect_fnc_name(
void) {
403 LOG_INFO(
"Testing kDifErrorIncorrectFunctionName error.");
406 TRY(kmac_testutils_config(&kmac,
false));
410 mmio_region_read32(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET);
413 KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L256);
415 KMAC_CFG_SHADOWED_MODE_VALUE_CSHAKE);
416 mmio_region_write32_shadowed(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET,
421 uint32_t prefix_regs[11];
426 mmio_region_write32(base, KMAC_PREFIX_0_REG_OFFSET, prefix_regs[0]);
427 mmio_region_write32(base, KMAC_PREFIX_1_REG_OFFSET, prefix_regs[1]);
428 mmio_region_write32(base, KMAC_PREFIX_2_REG_OFFSET, prefix_regs[2]);
429 mmio_region_write32(base, KMAC_PREFIX_3_REG_OFFSET, prefix_regs[3]);
430 mmio_region_write32(base, KMAC_PREFIX_4_REG_OFFSET, prefix_regs[4]);
431 mmio_region_write32(base, KMAC_PREFIX_5_REG_OFFSET, prefix_regs[5]);
432 mmio_region_write32(base, KMAC_PREFIX_6_REG_OFFSET, prefix_regs[6]);
433 mmio_region_write32(base, KMAC_PREFIX_7_REG_OFFSET, prefix_regs[7]);
434 mmio_region_write32(base, KMAC_PREFIX_8_REG_OFFSET, prefix_regs[8]);
435 mmio_region_write32(base, KMAC_PREFIX_9_REG_OFFSET, prefix_regs[9]);
436 mmio_region_write32(base, KMAC_PREFIX_10_REG_OFFSET, prefix_regs[10]);
441 mmio_region_write32(kmac.base_addr, KMAC_CMD_REG_OFFSET, cmd_reg);
445 kmac_operation_state.
r = 34;
447 kmac_operation_state.
offset = 0;
448 kmac_operation_state.
d = 0;
449 kmac_operation_state.
append_d =
false;
450 TRY(
dif_kmac_absorb(&kmac, &kmac_operation_state, kKmacTestVector.message,
451 kKmacTestVector.message_len, NULL));
457 return check_and_clear_error(&kmac, kDifErrorIncorrectFunctionName,
true);
468 status_t test_err_key_not_valid(
void) {
469 LOG_INFO(
"Testing ErrKeyNotValid error.");
473 TRY(kmac_testutils_config(&kmac,
true));
479 kKmacTestVector.mode, 0, &kKmacTestVector.key,
495 status_t test_err_shadow_reg_update(
void) {
496 LOG_INFO(
"Testing shadow register update error.");
502 TRY(kmac_testutils_config(&kmac,
false));
505 mmio_region_read32(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET);
507 KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L256);
509 KMAC_CFG_SHADOWED_MODE_VALUE_CSHAKE);
512 mmio_region_write32(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET, cfg_reg);
515 mmio_region_write32(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET, cfg_reg);
519 uint32_t status_reg =
520 mmio_region_read32(kmac.base_addr, KMAC_STATUS_REG_OFFSET);
522 KMAC_STATUS_ALERT_RECOV_CTRL_UPDATE_ERR_BIT),
523 "No recoverable alert occured.");
543 status_t test_err_sw_cmd_sequence(
void) {
544 LOG_INFO(
"Testing kDifErrorSoftwareCommandSequence error.");
545 uint32_t cmds[3] = {KMAC_CMD_CMD_VALUE_PROCESS, KMAC_CMD_CMD_VALUE_RUN,
546 KMAC_CMD_CMD_VALUE_DONE};
548 for (
int it = 0; it <
ARRAYSIZE(cmds); it++) {
553 TRY(kmac_testutils_config(&kmac,
false));
557 mmio_region_write32(kmac.base_addr, KMAC_CMD_REG_OFFSET, cmd_reg);
560 check_and_clear_error(&kmac, kDifErrorSoftwareCommandSequence,
true);
575 status_t test_err_unexpected_mode_strength(
void) {
576 LOG_INFO(
"Testing ErrUnexpectedModeStrength error.");
578 uint32_t misconfigured_strength[2] = {KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L128,
579 KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L224};
580 uint32_t mode[2] = {KMAC_CFG_SHADOWED_MODE_VALUE_SHA3,
581 KMAC_CFG_SHADOWED_MODE_VALUE_SHAKE};
583 for (
int it = 0; it <
ARRAYSIZE(mode); it++) {
587 TRY(kmac_testutils_config(&kmac,
false));
590 mmio_region_read32(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET);
593 misconfigured_strength[it]);
596 mmio_region_write32_shadowed(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET,
602 mmio_region_write32(kmac.base_addr, KMAC_CMD_REG_OFFSET, cmd_reg);
605 check_and_clear_error(&kmac, kDifErrorUnexpectedModeStrength,
false);
621 status_t test_err_sw_issued_cmd_in_app(
void) {
622 LOG_INFO(
"Testing ErrSwIssuedCmdInAppActive error.");
626 mmio_region_read32(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET);
628 KMAC_CFG_SHADOWED_KSTRENGTH_VALUE_L224);
630 KMAC_CFG_SHADOWED_MODE_VALUE_SHA3);
631 mmio_region_write32_shadowed(kmac.base_addr, KMAC_CFG_SHADOWED_REG_OFFSET,
635 uint32_t reg_control =
637 KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_KMAC);
639 reg_control, KEYMGR_CONTROL_SHADOWED_OPERATION_FIELD,
640 KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_GENERATE_HW_OUTPUT);
641 mmio_region_write32_shadowed(keymgr.base_addr,
642 KEYMGR_CONTROL_SHADOWED_REG_OFFSET, reg_control);
649 mmio_region_write32(keymgr.base_addr, KEYMGR_START_REG_OFFSET,
650 1 << KEYMGR_START_EN_BIT);
653 mmio_region_write32(kmac.base_addr, KMAC_CMD_REG_OFFSET, cmd_start);
656 return check_and_clear_error(
669 status_t test_err_sw_pushed_msg_fifo(
void) {
670 LOG_INFO(
"Testing ErrSwPushedMsgFifo error.");
673 uint32_t reg_control =
675 KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_KMAC);
677 reg_control, KEYMGR_CONTROL_SHADOWED_OPERATION_FIELD,
678 KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_GENERATE_HW_OUTPUT);
679 mmio_region_write32_shadowed(keymgr.base_addr,
680 KEYMGR_CONTROL_SHADOWED_REG_OFFSET, reg_control);
683 mmio_region_write32(keymgr.base_addr, KEYMGR_START_REG_OFFSET,
684 1 << KEYMGR_START_EN_BIT);
686 mmio_region_write8(kmac.base_addr, KMAC_MSG_FIFO_REG_OFFSET, 0xff);
695 test_err_wait_timer_expired();
696 test_err_incorrect_entropy_mode();
697 test_err_sw_hashing_without_entropy_ready();
700 test_err_incorrect_fnc_name();
701 test_err_key_not_valid();
702 test_err_shadow_reg_update();
703 test_err_sw_cmd_sequence();
704 test_err_unexpected_mode_strength();
709 test_err_sw_issued_cmd_in_app();
710 test_err_sw_pushed_msg_fifo();