5#include "sw/device/lib/testing/keymgr_testutils.h"
7#include "hw/top/dt/otp_ctrl.h"
13#include "sw/device/lib/testing/entropy_testutils.h"
14#include "sw/device/lib/testing/kmac_testutils.h"
15#include "sw/device/lib/testing/nvm_testutils.h"
16#include "sw/device/lib/testing/otp_ctrl_testutils.h"
17#include "sw/device/lib/testing/rstmgr_testutils.h"
18#include "sw/device/lib/testing/test_framework/check.h"
20#include "sw/device/silicon_creator/lib/drivers/retention_sram.h"
24#define MODULE_ID MAKE_MODULE_ID('k', 'm', 't')
26const static char *kKeymgrStageNames[] = {
36status_t keymgr_testutils_nvm_init(
37 const keymgr_testutils_secret_t *creator_secret,
38 const keymgr_testutils_secret_t *owner_secret) {
40 TRY(nvm_testutils_info_page_setup(kNvmInfoPageCreatorSecret, kPageReadWrite,
42 TRY(nvm_testutils_write_info_page(kNvmInfoPageCreatorSecret,
43 0, creator_secret->value,
48 TRY(nvm_testutils_info_page_setup(kNvmInfoPageOwnerSecret, kPageReadWrite,
50 TRY(nvm_testutils_write_info_page(kNvmInfoPageOwnerSecret,
51 0, owner_secret->value,
58static status_t check_lock_otp_partition(
void) {
60 TRY(dif_otp_ctrl_init_from_dt(
kDtOtpCtrl, &otp));
68 LOG_INFO(
"OTP partition locked. Digest: %x-%x", ((uint32_t *)&digest)[0],
69 ((uint32_t *)&digest)[1]);
84 TRY(kmac_testutils_config(kmac,
true));
94 TRY(keymgr_testutils_startup(keymgr, kmac));
95 LOG_INFO(
"Keymgr entered CreatorRootKey State");
98 TRY(keymgr_testutils_generate_identity(
101 LOG_INFO(
"Keymgr generated identity at CreatorRootKey State");
105 TRY(keymgr_testutils_advance_state(keymgr, &kOwnerIntParams));
106 TRY(keymgr_testutils_check_state(keymgr,
108 LOG_INFO(
"Keymgr entered OwnerIntKey State");
114 TRY(keymgr_testutils_try_startup(keymgr, kmac, &keymgr_state));
117 TRY(keymgr_testutils_advance_state(keymgr, &kOwnerIntParams));
118 TRY(dif_keymgr_get_state(keymgr, &keymgr_state));
122 TRY(keymgr_testutils_advance_state(keymgr, &kOwnerRootKeyParams));
130 return keymgr_initialize_sival(keymgr, kmac);
133 return keymgr_initialize_sim_dv(keymgr, kmac);
138 TRY(dif_init(keymgr, kmac));
142 TRY(dif_keymgr_get_state(keymgr, keymgr_state));
146 LOG_INFO(
"Unexpected keymgr state: 0x%x", *keymgr_state);
151 TRY(keymgr_testutils_startup(keymgr, kmac));
152 TRY(dif_keymgr_get_state(keymgr, keymgr_state));
158status_t keymgr_testutils_init_nvm_then_reset(
void) {
165 rstmgr_testutils_reason_get();
169 LOG_INFO(
"Powered up for the first time, program flash");
171 TRY(dif_otp_ctrl_init(
175 bool secret2_computed =
false;
182 const keymgr_testutils_secret_t *creator_secret = NULL;
183 if (!secret2_computed) {
184 creator_secret = &kCreatorSecret;
186 TRY(keymgr_testutils_nvm_init(creator_secret, &kOwnerSecret));
188 TRY(check_lock_otp_partition());
191 LOG_INFO(
"Requesting a reset to make OTP partitions accessible to keymgr");
192 rstmgr_testutils_reason_clear();
193 TRY(dif_rstmgr_software_device_reset(&rstmgr));
196 wait_for_interrupt();
213 bool is_using_test_rom =
216 .reserved[
ARRAYSIZE((retention_sram_t){0}.creator.reserved) - 1] ==
219 TRY(keymgr_testutils_init_nvm_then_reset());
228 LOG_INFO(
"Initializing entropy complex in Auto mode");
230 TRY(entropy_testutils_auto_mode_init());
232 LOG_INFO(
"Powered up for the second time, actuate keymgr and perform test.");
234 TRY(dif_init(keymgr, kmac));
238 TRY(keymgr_testutils_advance_state(keymgr, NULL));
240 LOG_INFO(
"Keymgr entered Init State");
243 if (is_using_test_rom) {
244 LOG_INFO(
"Using test_rom, setting inputs and advancing state...");
245 TRY(keymgr_testutils_advance_state(keymgr, &kCreatorParams));
247 LOG_INFO(
"Using rom, only advancing state...");
248 TRY(dif_keymgr_advance_state_raw(keymgr));
249 TRY(keymgr_testutils_wait_for_operation_done(keymgr));
252 LOG_INFO(
"Keymgr entered CreatorRootKey State");
257 TRY(keymgr_testutils_generate_identity(
260 LOG_INFO(
"Keymgr generated identity at CreatorRootKey State");
265status_t keymgr_testutils_advance_state(
267 TRY(dif_keymgr_advance_state(keymgr, params));
268 return keymgr_testutils_wait_for_operation_done(keymgr);
271status_t keymgr_testutils_check_state(
const dif_keymgr_t *keymgr,
274 TRY(dif_keymgr_get_state(keymgr, &act_state));
275 TRY_CHECK(act_state == exp_state,
276 "Keymgr in unexpected state: %x, expected to be %x", act_state,
281status_t keymgr_testutils_generate_identity(
284 TRY(dif_keymgr_generate_identity_seed(keymgr, params));
285 return keymgr_testutils_wait_for_operation_done(keymgr);
288status_t keymgr_testutils_generate_versioned_key(
291 TRY(dif_keymgr_generate_versioned_key(keymgr, params));
292 return keymgr_testutils_wait_for_operation_done(keymgr);
295status_t keymgr_testutils_disable(
const dif_keymgr_t *keymgr) {
296 TRY(dif_keymgr_disable(keymgr));
297 return keymgr_testutils_wait_for_operation_done(keymgr);
300status_t keymgr_testutils_wait_for_operation_done(
const dif_keymgr_t *keymgr) {
303 TRY(dif_keymgr_get_status_codes(keymgr, &
status));
310status_t keymgr_testutils_max_key_version_get(
const dif_keymgr_t *keymgr,
311 uint32_t *max_key_version) {
313 TRY(dif_keymgr_get_state(keymgr, &keymgr_state));
318 LOG_INFO(
"Unexpected keymgr state: 0x%x", keymgr_state);
322 dif_keymgr_max_key_version_t versions;
323 TRY(dif_keymgr_read_max_key_version(keymgr, &versions));
325 switch (keymgr_state) {
342status_t keymgr_testutils_state_string_get(
const dif_keymgr_t *keymgr,
343 const char **stage_name) {
345 CHECK_DIF_OK(dif_keymgr_get_state(keymgr, &state));
347 if (state >=
ARRAYSIZE(kKeymgrStageNames)) {
352 *stage_name = kKeymgrStageNames[state];