5#include "sw/device/lib/testing/keymgr_testutils.h"
7#include "hw/top/dt/otp_ctrl.h"
14#include "sw/device/lib/testing/entropy_testutils.h"
15#include "sw/device/lib/testing/flash_ctrl_testutils.h"
16#include "sw/device/lib/testing/kmac_testutils.h"
17#include "sw/device/lib/testing/otp_ctrl_testutils.h"
18#include "sw/device/lib/testing/rstmgr_testutils.h"
19#include "sw/device/lib/testing/test_framework/check.h"
21#include "sw/device/silicon_creator/lib/drivers/retention_sram.h"
25#define MODULE_ID MAKE_MODULE_ID('k', 'm', 't')
29 kFlashInfoPartitionId = 0,
35 kFlashInfoPageIdCreatorSecret = 1,
38 kFlashInfoPageIdOwnerSecret = 2,
41const static char *kKeymgrStageNames[] = {
52 const keymgr_testutils_secret_t *data,
56 TRY(flash_ctrl_testutils_info_region_scrambled_setup(
57 flash, page_id, kFlashInfoBankId, kFlashInfoPartitionId, &address));
59 TRY(flash_ctrl_testutils_info_region_setup(
60 flash, page_id, kFlashInfoBankId, kFlashInfoPartitionId, &address));
63 TRY(flash_ctrl_testutils_erase_and_write_page(
64 flash, address, kFlashInfoPartitionId, data->value,
65 kDifFlashCtrlPartitionTypeInfo,
ARRAYSIZE(data->value)));
67 keymgr_testutils_secret_t readback_data;
68 TRY(flash_ctrl_testutils_read(
69 flash, address, kFlashInfoPartitionId, readback_data.value,
70 kDifFlashCtrlPartitionTypeInfo,
ARRAYSIZE(readback_data.value), 0));
71 TRY_CHECK(memcmp(data->value, readback_data.value,
sizeof(data->value)) == 0);
75status_t keymgr_testutils_flash_init(
77 const keymgr_testutils_secret_t *creator_secret,
78 const keymgr_testutils_secret_t *owner_secret) {
81 write_info_page(flash, kFlashInfoPageIdCreatorSecret, creator_secret,
84 write_info_page(flash, kFlashInfoPageIdOwnerSecret, owner_secret,
89static status_t check_lock_otp_partition(
void) {
91 TRY(dif_otp_ctrl_init_from_dt(
kDtOtpCtrl, &otp));
94 TRY(dif_otp_ctrl_is_digest_computed(&otp, kOtpPartitionSecret2,
98 TRY(dif_otp_ctrl_get_digest(&otp, kOtpPartitionSecret2, &digest));
99 LOG_INFO(
"OTP partition locked. Digest: %x-%x", ((uint32_t *)&digest)[0],
100 ((uint32_t *)&digest)[1]);
104 TRY(otp_ctrl_testutils_lock_partition(&otp, kOtpPartitionSecret2, 0));
115 TRY(kmac_testutils_config(kmac,
true));
125 TRY(keymgr_testutils_startup(keymgr, kmac));
126 LOG_INFO(
"Keymgr entered CreatorRootKey State");
129 TRY(keymgr_testutils_generate_identity(
132 LOG_INFO(
"Keymgr generated identity at CreatorRootKey State");
136 TRY(keymgr_testutils_advance_state(keymgr, &kOwnerIntParams));
137 TRY(keymgr_testutils_check_state(keymgr,
139 LOG_INFO(
"Keymgr entered OwnerIntKey State");
145 TRY(keymgr_testutils_try_startup(keymgr, kmac, &keymgr_state));
148 TRY(keymgr_testutils_advance_state(keymgr, &kOwnerIntParams));
149 TRY(dif_keymgr_get_state(keymgr, &keymgr_state));
153 TRY(keymgr_testutils_advance_state(keymgr, &kOwnerRootKeyParams));
161 return keymgr_initialize_sival(keymgr, kmac);
164 return keymgr_initialize_sim_dv(keymgr, kmac);
169 TRY(dif_init(keymgr, kmac));
173 TRY(dif_keymgr_get_state(keymgr, keymgr_state));
177 LOG_INFO(
"Unexpected keymgr state: 0x%x", keymgr_state);
182 TRY(keymgr_testutils_startup(keymgr, kmac));
183 TRY(dif_keymgr_get_state(keymgr, keymgr_state));
189status_t keymgr_testutils_init_nvm_then_reset(
void) {
197 rstmgr_testutils_reason_get();
201 LOG_INFO(
"Powered up for the first time, program flash");
203 TRY(dif_flash_ctrl_init_state(
205 TRY(dif_otp_ctrl_init_from_dt(
kDtOtpCtrl, &otp_ctrl));
207 bool secret2_computed =
false;
208 TRY(dif_otp_ctrl_is_digest_computed(&otp_ctrl, kOtpPartitionSecret2,
214 const keymgr_testutils_secret_t *creator_secret = NULL;
215 if (!secret2_computed) {
216 creator_secret = &kCreatorSecret;
218 TRY(keymgr_testutils_flash_init(&flash, creator_secret, &kOwnerSecret));
220 TRY(check_lock_otp_partition());
223 LOG_INFO(
"Requesting a reset to make OTP partitions accessible to keymgr");
224 rstmgr_testutils_reason_clear();
225 TRY(dif_rstmgr_software_device_reset(&rstmgr));
228 wait_for_interrupt();
245 bool is_using_test_rom =
248 .reserved[
ARRAYSIZE((retention_sram_t){0}.creator.reserved) - 1] ==
251 TRY(keymgr_testutils_init_nvm_then_reset());
260 LOG_INFO(
"Initializing entropy complex in Auto mode");
262 TRY(entropy_testutils_auto_mode_init());
264 LOG_INFO(
"Powered up for the second time, actuate keymgr and perform test.");
266 TRY(dif_init(keymgr, kmac));
270 TRY(keymgr_testutils_advance_state(keymgr, NULL));
272 LOG_INFO(
"Keymgr entered Init State");
275 if (is_using_test_rom) {
276 LOG_INFO(
"Using test_rom, setting inputs and advancing state...");
277 TRY(keymgr_testutils_advance_state(keymgr, &kCreatorParams));
279 LOG_INFO(
"Using rom, only advancing state...");
280 TRY(dif_keymgr_advance_state_raw(keymgr));
281 TRY(keymgr_testutils_wait_for_operation_done(keymgr));
284 LOG_INFO(
"Keymgr entered CreatorRootKey State");
289 TRY(keymgr_testutils_generate_identity(
292 LOG_INFO(
"Keymgr generated identity at CreatorRootKey State");
297status_t keymgr_testutils_advance_state(
299 TRY(dif_keymgr_advance_state(keymgr, params));
300 return keymgr_testutils_wait_for_operation_done(keymgr);
303status_t keymgr_testutils_check_state(
const dif_keymgr_t *keymgr,
306 TRY(dif_keymgr_get_state(keymgr, &act_state));
307 TRY_CHECK(act_state == exp_state,
308 "Keymgr in unexpected state: %x, expected to be %x", act_state,
313status_t keymgr_testutils_generate_identity(
316 TRY(dif_keymgr_generate_identity_seed(keymgr, params));
317 return keymgr_testutils_wait_for_operation_done(keymgr);
320status_t keymgr_testutils_generate_versioned_key(
323 TRY(dif_keymgr_generate_versioned_key(keymgr, params));
324 return keymgr_testutils_wait_for_operation_done(keymgr);
327status_t keymgr_testutils_disable(
const dif_keymgr_t *keymgr) {
328 TRY(dif_keymgr_disable(keymgr));
329 return keymgr_testutils_wait_for_operation_done(keymgr);
332status_t keymgr_testutils_wait_for_operation_done(
const dif_keymgr_t *keymgr) {
335 TRY(dif_keymgr_get_status_codes(keymgr, &
status));
342status_t keymgr_testutils_max_key_version_get(
const dif_keymgr_t *keymgr,
343 uint32_t *max_key_version) {
345 TRY(dif_keymgr_get_state(keymgr, &keymgr_state));
350 LOG_INFO(
"Unexpected keymgr state: 0x%x", keymgr_state);
354 dif_keymgr_max_key_version_t versions;
355 TRY(dif_keymgr_read_max_key_version(keymgr, &versions));
357 switch (keymgr_state) {
374status_t keymgr_testutils_state_string_get(
const dif_keymgr_t *keymgr,
375 const char **stage_name) {
377 CHECK_DIF_OK(dif_keymgr_get_state(keymgr, &state));
379 if (state >=
ARRAYSIZE(kKeymgrStageNames)) {
384 *stage_name = kKeymgrStageNames[state];