9 #include "sw/device/lib/testing/keymgr_testutils.h"
11 #include "sw/device/lib/testing/ret_sram_testutils.h"
12 #include "sw/device/lib/testing/rstmgr_testutils.h"
13 #include "sw/device/lib/testing/sram_ctrl_testutils.h"
15 #include "sw/device/silicon_creator/lib/drivers/retention_sram.h"
19 static dif_keymgr_t keymgr;
20 static dif_kmac_t kmac;
21 static dif_otbn_t otbn;
22 static dif_rstmgr_t rstmgr;
23 static dif_sram_ctrl_t sram_ctrl;
26 kKeymgrOutputSizeWords = 8,
27 kKeymgrOutputSizeBytes = 32,
29 kX2551PublicKeySizeBytes = 32,
36 4 * kRetSramTestutilsNumberOfCounters,
40 #ifndef DERIVE_ATTESTATION
60 uint32_t sideload_key[kX2551PublicKeySizeBytes];
69 static const otbn_addr_t kOtbnVarEncU =
71 static const otbn_addr_t kOtbnVarEncResult =
74 OTTF_DEFINE_TEST_CONFIG();
79 static void init_peripheral_handles(
void) {
81 CHECK_STATUS_OK(keymgr_testutils_initialize(&keymgr, &kmac));
87 .entropy_fast_process =
true,
92 CHECK_DIF_OK(dif_rstmgr_init(
94 CHECK_DIF_OK(dif_sram_ctrl_init(
110 uint32_t scratch[kKeymgrOutputSizeWords];
111 for (
int i = 0; i < kKeymgrOutputSizeWords; i++) {
121 scratch[i] = output_a->value[0][i] ^ output_b->value[0][i];
122 if ((scratch[i] ^ output_a->value[1][i] ^ output_b->value[1][i]) != 0x0) {
137 static void ret_sram_write_keys(
const cdi_outputs_t *outputs,
size_t *offset) {
141 sram_ctrl_testutils_write(
142 kRetSramBaseAddr + *offset,
155 static void ret_sram_read_keys(
cdi_outputs_t *outputs,
size_t *offset) {
156 memcpy(outputs, (uint8_t *)(kRetSramBaseAddr + *offset),
167 static void derive_identity(
const char *state_name,
169 CHECK_STATUS_OK(keymgr_testutils_generate_identity(
171 LOG_INFO(
"Keymgr generated identity at %s State", state_name);
184 uint32_t max_version;
185 CHECK_STATUS_OK(keymgr_testutils_max_key_version_get(&keymgr, &max_version));
192 CHECK_STATUS_OK(keymgr_testutils_generate_versioned_key(&keymgr, params));
193 LOG_INFO(
"Keymgr generated SW output at %s State", state_name);
197 #ifndef DERIVE_ATTESTATION
201 CHECK_STATUS_NOT_OK(keymgr_testutils_generate_versioned_key(&keymgr, params));
213 static void derive_sideload_otbn_key(
const char *state_name,
214 uint32_t key[kKeymgrOutputSizeWords]) {
215 uint32_t max_version;
216 CHECK_STATUS_OK(keymgr_testutils_max_key_version_get(&keymgr, &max_version));
222 CHECK_STATUS_OK(keymgr_testutils_generate_versioned_key(&keymgr, params));
223 LOG_INFO(
"Keymgr generated HW output for Otbn at %s State", state_name);
230 const uint32_t kEncodedU[8] = {
232 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
235 &kEncodedU, kOtbnVarEncU));
236 LOG_INFO(
"Starting OTBN program...");
241 kOtbnVarEncResult, key));
243 #ifndef DERIVE_ATTESTATION
247 CHECK_STATUS_NOT_OK(keymgr_testutils_generate_versioned_key(&keymgr, params));
265 static void derive_keys(
const char *state_name,
268 derive_identity(state_name, &next_outputs->identity);
269 derive_sw_key(state_name, &next_outputs->sw_key);
270 derive_sideload_otbn_key(state_name, next_outputs->sideload_key);
273 CHECK(!compare_outputs(&prev_outputs->identity, &next_outputs->identity));
274 CHECK(!compare_outputs(&prev_outputs->sw_key, &next_outputs->sw_key));
275 CHECK_ARRAYS_NE(prev_outputs->sideload_key, next_outputs->sideload_key,
276 kKeymgrOutputSizeWords);
280 ret_sram_write_keys(next_outputs, offset);
283 ret_sram_read_keys(&scratch, offset);
285 CHECK(compare_outputs(&scratch.identity, &next_outputs->identity));
286 CHECK(compare_outputs(&scratch.sw_key, &next_outputs->sw_key));
287 CHECK_ARRAYS_EQ(scratch.sideload_key, next_outputs->sideload_key,
288 kKeymgrOutputSizeWords);
352 static void test_derive_cdi(
size_t reset_counter) {
353 const char *state_name;
362 const bool write = reset_counter == 0;
364 switch (keymgr_state) {
367 CHECK_STATUS_OK(keymgr_testutils_state_string_get(&keymgr, &state_name));
368 LOG_INFO(
"Keymgr entered %s State", state_name);
370 derive_keys(state_name, NULL, &offset, write, &curr_outputs);
373 keymgr_testutils_advance_state(&keymgr, &kOwnerIntParams));
378 CHECK_STATUS_OK(keymgr_testutils_state_string_get(&keymgr, &state_name));
379 LOG_INFO(
"Keymgr entered %s State", state_name);
381 derive_keys(state_name,
388 &offset, write, &next_outputs);
392 keymgr_testutils_advance_state(&keymgr, &kOwnerRootKeyParams));
397 CHECK_STATUS_OK(keymgr_testutils_state_string_get(&keymgr, &state_name));
398 LOG_INFO(
"Keymgr entered %s State", state_name);
403 &offset, write, &next_outputs);
410 CHECK(0,
"unexpected key manager state %u", keymgr_state);
416 rstmgr_testutils_reason_get();
417 size_t reset_counter;
419 ret_sram_testutils_init();
423 CHECK_STATUS_OK(ret_sram_testutils_counter_clear(0));
425 CHECK_STATUS_OK(ret_sram_testutils_counter_get(0, &reset_counter));
427 init_peripheral_handles();
429 test_derive_cdi(reset_counter);
432 if (reset_counter == 0) {
433 CHECK_STATUS_OK(ret_sram_testutils_counter_increment(0));