11 #include "sw/device/lib/testing/keymgr_testutils.h"
12 #include "sw/device/lib/testing/kmac_testutils.h"
13 #include "sw/device/lib/testing/ret_sram_testutils.h"
14 #include "sw/device/lib/testing/rstmgr_testutils.h"
15 #include "sw/device/lib/testing/sram_ctrl_testutils.h"
16 #include "sw/device/lib/testing/test_framework/check.h"
18 #include "sw/device/silicon_creator/lib/drivers/retention_sram.h"
30 .share0 = {0x43424140, 0x47464544, 0x4B4A4948, 0x4F4E4D4C, 0x53525150,
31 0x57565554, 0x5B5A5958, 0x5F5E5D5C},
37 static const size_t kKmacOutputLen = 8;
38 static const char *kCustomString = NULL;
39 static const size_t kCustomStringLen = 0;
40 static const char kKmacMessage[] =
"\x00\x01\x02\x03";
41 static const size_t kKmacMessageLen = 4;
54 static dif_keymgr_t keymgr;
55 static dif_kmac_t kmac;
56 static dif_sram_ctrl_t ret_sram;
57 static dif_rstmgr_t rstmgr;
59 OTTF_DEFINE_TEST_CONFIG();
64 static void init_peripheral_handles(
void) {
67 CHECK_DIF_OK(dif_keymgr_init(
69 CHECK_DIF_OK(dif_rstmgr_init(
71 CHECK_DIF_OK(dif_sram_ctrl_init(
97 static void test_kmac_key_sideload(dif_keymgr_t *keymgr, dif_kmac_t *kmac,
100 CHECK_STATUS_OK(kmac_testutils_config(kmac,
true));
107 uint32_t max_key_version;
109 keymgr_testutils_max_key_version_get(keymgr, &max_key_version));
111 if (sideload_params.
version > max_key_version) {
112 LOG_INFO(
"Key version %d is greater than the maximum key version %d",
113 sideload_params.
version, max_key_version);
114 LOG_INFO(
"Setting key version to the maximum key version %d",
116 sideload_params.
version = max_key_version;
120 keymgr_testutils_generate_versioned_key(keymgr, sideload_params));
121 LOG_INFO(
"Keymgr generated HW output for Kmac");
122 uint32_t output_sideload[
ARRAYSIZE(kKmacModes)][kKmacOutputLen];
124 for (
size_t it = 0; it <
ARRAYSIZE(kKmacModes); it++) {
125 CHECK_STATUS_OK(kmac_testutils_kmac(
126 kmac, kKmacModes[it], &kSoftwareKey, kCustomString, kCustomStringLen,
127 kKmacMessage, kKmacMessageLen, kKmacOutputLen, output_sideload[it],
130 LOG_INFO(
"Computed KMAC output for sideloaded key.");
134 for (
size_t it = 0; it <
ARRAYSIZE(kKmacModes); it++) {
136 sram_ctrl_testutils_write(
137 kRetSramOwnerAddr + 4 + 4 * it * kKmacOutputLen,
139 .len = kKmacOutputLen});
142 LOG_INFO(
"Clearing the sideloaded key.");
156 sideload_params.
salt[0] = ~sideload_params.
salt[0];
158 keymgr_testutils_generate_versioned_key(keymgr, sideload_params));
159 LOG_INFO(
"Keymgr generated new HW output for Kmac.");
161 uint32_t output_sideload_after_clear[kKmacOutputLen];
163 kmac_testutils_kmac(kmac, kKmacModes[0], &kSoftwareKey, kCustomString,
164 kCustomStringLen, kKmacMessage, kKmacMessageLen,
165 kKmacOutputLen, output_sideload_after_clear,
168 "Ran KMAC with an another sideload key and checked that the output is "
169 "not identical to before.");
171 CHECK_ARRAYS_NE(output_sideload_after_clear, output_sideload[0],
177 for (
size_t it = 0; it <
ARRAYSIZE(kKmacModes); it++) {
178 uint32_t prev_digest[kKmacOutputLen];
180 (uint8_t *)(kRetSramOwnerAddr + 4 + 4 * it * kKmacOutputLen),
181 sizeof(prev_digest));
182 CHECK_ARRAYS_EQ(output_sideload[it], prev_digest, kKmacOutputLen);
184 LOG_INFO(
"Checked current and previous KMAC digest.");
191 rstmgr_testutils_reason_get();
192 size_t test_phase_cnt;
194 ret_sram_testutils_init();
198 CHECK_STATUS_OK(ret_sram_testutils_counter_clear(0));
200 CHECK_STATUS_OK(ret_sram_testutils_counter_get(0, &test_phase_cnt));
203 init_peripheral_handles();
204 CHECK_STATUS_OK(keymgr_testutils_initialize(&keymgr, &kmac));
206 LOG_INFO(
"Starting test phase %d", test_phase_cnt);
207 test_kmac_key_sideload(&keymgr, &kmac, test_phase_cnt);
208 LOG_INFO(
"Finished test phase %x", test_phase_cnt);
211 if (test_phase_cnt == 0) {
212 CHECK_STATUS_OK(ret_sram_testutils_counter_increment(0));