9#if defined(OPENTITAN_IS_DARJEELING)
11#include "sw/device/lib/testing/keymgr_dpe_testutils.h"
13#include "hw/top/dt/keymgr_dpe.h"
14#include "hw/top/dt/otp_ctrl.h"
15#include "hw/top/dt/rstmgr.h"
21#include "sw/device/lib/testing/otp_ctrl_testutils.h"
22#include "sw/device/lib/testing/rstmgr_testutils.h"
23#include "sw/device/lib/testing/test_framework/check.h"
27 uint32_t slot_dst_sel) {
31 TRY(dif_rstmgr_init_from_dt(
kDtRstmgr, &rstmgr));
32 info = rstmgr_testutils_reason_get();
37 "Powered up for the first time, lock SECRET2 and SECRET3 partitions");
39 TRY(dif_otp_ctrl_init_from_dt(
kDtOtpCtrl, &otp));
42 TRY(otp_ctrl_testutils_lock_partition(&otp, kDifOtpCtrlPartitionSecret3,
46 rstmgr_testutils_reason_clear();
47 LOG_INFO(
"Triggering software reset");
48 TRY(dif_rstmgr_software_device_reset(&rstmgr));
57 "Powered up for the second time, actuate keymgr_dpe and perform test.");
60 TRY(dif_keymgr_dpe_init_from_dt(
kDtKeymgrDpe, keymgr_dpe));
63 TRY(keymgr_dpe_testutils_check_state(keymgr_dpe, kDifKeymgrDpeStateReset));
64 TRY(dif_keymgr_dpe_initialize(keymgr_dpe, slot_dst_sel));
65 TRY(keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe));
66 TRY(keymgr_dpe_testutils_check_state(keymgr_dpe,
67 kDifKeymgrDpeStateAvailable));
73status_t keymgr_dpe_testutils_advance_state(
76 TRY(dif_keymgr_dpe_advance_state(keymgr_dpe, params));
77 return keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe);
80status_t keymgr_dpe_testutils_erase_slot(
83 TRY(dif_keymgr_dpe_erase_slot(keymgr_dpe, params));
84 return keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe);
87status_t keymgr_dpe_testutils_generate(
91 TRY(dif_keymgr_dpe_generate(keymgr_dpe, params));
92 TRY(keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe));
93 TRY(dif_keymgr_dpe_read_output(keymgr_dpe, key));
97status_t keymgr_dpe_testutils_check_state(
101 TRY(dif_keymgr_dpe_get_state(keymgr_dpe, &act_state));
102 TRY_CHECK(act_state == exp_state,
103 "KeymgrDPE in unexpected state: %x, expected to be %x", act_state,
108status_t keymgr_dpe_testutils_wait_for_operation_done(
112 TRY(dif_keymgr_dpe_get_status_codes(keymgr_dpe, &
status));
119#elif defined(OPENTITAN_IS_EARLGREY) || defined(OPENTITAN_IS_ENGLISHBREAKFAST)
120#include "hw/top/dt/otp_ctrl.h"
126#include "sw/device/lib/testing/entropy_testutils.h"
127#include "sw/device/lib/testing/keymgr_dpe_testutils.h"
128#include "sw/device/lib/testing/kmac_testutils.h"
129#include "sw/device/lib/testing/nvm_testutils.h"
130#include "sw/device/lib/testing/otp_ctrl_testutils.h"
131#include "sw/device/lib/testing/rstmgr_testutils.h"
132#include "sw/device/lib/testing/test_framework/check.h"
134#include "sw/device/silicon_creator/lib/drivers/retention_sram.h"
138#define MODULE_ID MAKE_MODULE_ID('k', 'm', 'd')
140const static char *kKeymgrStageNames[] = {
141 [kDifKeymgrDpeStateReset] =
"Reset",
142 [kDifKeymgrDpeStateAvailable] =
"Available",
143 [kDifKeymgrDpeStateDisabled] =
"Disabled",
144 [kDifKeymgrDpeStateInvalid] =
"Invalid"};
146status_t keymgr_dpe_testutils_nvm_init(
147 const keymgr_dpe_testutils_secret_t *creator_secret,
148 const keymgr_dpe_testutils_secret_t *owner_secret) {
150 if (creator_secret) {
151 TRY(nvm_testutils_info_page_setup(kNvmInfoPageCreatorSecret, kPageReadWrite,
153 TRY(nvm_testutils_write_info_page(kNvmInfoPageCreatorSecret,
154 0, creator_secret->value,
159 TRY(nvm_testutils_info_page_setup(kNvmInfoPageOwnerSecret, kPageReadWrite,
161 return nvm_testutils_write_info_page(kNvmInfoPageOwnerSecret,
162 0, owner_secret->value,
168static status_t check_lock_otp_partition(
void) {
170 TRY(dif_otp_ctrl_init_from_dt(
kDtOtpCtrl, &otp));
178 LOG_INFO(
"OTP partition locked. Digest: %x-%x", ((uint32_t *)&digest)[0],
179 ((uint32_t *)&digest)[1]);
194 TRY(kmac_testutils_config(kmac,
true));
197 TRY(dif_keymgr_dpe_init(
205status_t keymgr_dpe_testutils_erase_slot(
208 TRY(dif_keymgr_dpe_erase_slot(keymgr_dpe, params));
209 return keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe);
215 TRY(keymgr_dpe_testutils_startup(keymgr_dpe, kmac));
216 LOG_INFO(
"Keymgr DPE generated the CreatorRootKey in slot %d",
217 kCreatorRootKeyParams.slot_dst_sel);
220 TRY(keymgr_dpe_testutils_generate_key(keymgr_dpe, &kKeyVersionedParams));
221 LOG_INFO(
"Keymgr DPE generated key at CreatorRootKey State");
225 TRY(keymgr_dpe_testutils_advance_state(keymgr_dpe, &kOwnerIntKeyParams));
226 LOG_INFO(
"Keymgr DPE generated the OwnerIntKey in slot %d",
227 kOwnerIntKeyParams.slot_dst_sel);
236 TRY(keymgr_dpe_testutils_try_startup(keymgr_dpe, kmac, &keymgr_dpe_state));
239 TRY(keymgr_dpe_testutils_advance_state(keymgr_dpe, &kOwnerIntKeyParams));
242 TRY(keymgr_dpe_testutils_advance_state(keymgr_dpe, &kOwnerKeyParams));
244 return keymgr_dpe_testutils_check_state(keymgr_dpe,
245 kDifKeymgrDpeStateAvailable);
251 return keymgr_dpe_initialize_sival(keymgr_dpe, kmac);
254 return keymgr_dpe_initialize_sim_dv(keymgr_dpe, kmac);
257status_t keymgr_dpe_testutils_try_startup(
260 TRY(dif_init(keymgr_dpe, kmac));
264 TRY(dif_keymgr_dpe_get_state(keymgr_dpe, keymgr_dpe_state));
266 TRY_CHECK(*keymgr_dpe_state != kDifKeymgrDpeStateInvalid &&
267 *keymgr_dpe_state != kDifKeymgrDpeStateDisabled,
268 "Unexpected keymgr dpe state: 0x%x", *keymgr_dpe_state);
270 if (*keymgr_dpe_state == kDifKeymgrDpeStateReset) {
271 TRY(keymgr_dpe_testutils_startup(keymgr_dpe, kmac));
272 TRY(dif_keymgr_dpe_get_state(keymgr_dpe, keymgr_dpe_state));
278status_t keymgr_dpe_testutils_init_nvm_then_reset(
void) {
285 rstmgr_testutils_reason_get();
289 LOG_INFO(
"Powered up for the first time, program flash");
291 TRY(dif_otp_ctrl_init(
295 bool secret2_computed =
false;
301 const keymgr_dpe_testutils_secret_t *creator_secret = NULL;
302 if (!secret2_computed) {
303 creator_secret = &kCreatorSecret;
305 TRY(keymgr_dpe_testutils_nvm_init(creator_secret, &kOwnerSecret));
307 TRY(check_lock_otp_partition());
311 "Requesting a reset to make OTP partitions accessible to keymgr DPE");
312 rstmgr_testutils_reason_clear();
313 TRY(dif_rstmgr_software_device_reset(&rstmgr));
316 wait_for_interrupt();
334 bool is_using_test_rom =
337 .reserved[
ARRAYSIZE((retention_sram_t){0}.creator.reserved) - 1] ==
342 if (is_using_test_rom) {
343 TRY(keymgr_dpe_testutils_init_nvm_then_reset());
353 LOG_INFO(
"Initializing entropy complex in Auto mode");
355 TRY(entropy_testutils_auto_mode_init());
357 TRY(dif_init(keymgr_dpe, kmac));
360 if (is_using_test_rom) {
362 LOG_INFO(
"Using test_rom, setting inputs and advancing state...");
363 TRY(keymgr_dpe_testutils_check_state(keymgr_dpe, kDifKeymgrDpeStateReset));
364 TRY(keymgr_dpe_testutils_initial_load_uds(keymgr_dpe, &kInitialParams));
365 TRY(keymgr_dpe_testutils_check_state(keymgr_dpe,
366 kDifKeymgrDpeStateAvailable));
368 LOG_INFO(
"Keymgr DPE loaded the UDS and entered Available state.");
371 TRY(keymgr_dpe_testutils_advance_state(keymgr_dpe, &kCreatorRootKeyParams));
372 LOG_INFO(
"Keymgr DPE testutils derived the CreatorRootKey");
376 "The Keymgr DPE should already contain the derived CreatorRootKey");
382 TRY(keymgr_dpe_testutils_generate_key(keymgr_dpe, &kKeyVersionedParams));
383 LOG_INFO(
"Keymgr DPE generated sw key from the CreatorRootKey");
399status_t keymgr_dpe_testutils_initial_load_uds(
402 TRY(dif_keymgr_dpe_initialize(keymgr_dpe, params->
slot_dst_sel));
403 return keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe);
406status_t keymgr_dpe_testutils_advance_state(
409 TRY(dif_keymgr_dpe_advance_state(keymgr_dpe, params));
410 return keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe);
413status_t keymgr_dpe_testutils_check_state(
417 TRY(dif_keymgr_dpe_get_state(keymgr_dpe, &act_state));
418 TRY_CHECK(act_state == exp_state,
419 "Keymgr DPE in unexpected state: %x, expected to be %x", act_state,
424status_t keymgr_dpe_testutils_generate_key(
427 TRY(dif_keymgr_dpe_generate(keymgr_dpe, params));
428 return keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe);
432 TRY(dif_keymgr_dpe_disable(keymgr_dpe));
433 TRY(keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe));
434 return keymgr_dpe_testutils_check_state(keymgr_dpe,
435 kDifKeymgrDpeStateDisabled);
438status_t keymgr_dpe_testutils_wait_for_operation_done(
442 TRY(dif_keymgr_dpe_get_status_codes(keymgr_dpe, &
status));
451status_t keymgr_dpe_testutils_state_string_get(
454 TRY(dif_keymgr_dpe_get_state(keymgr_dpe, &state));
456 if (state >=
ARRAYSIZE(kKeymgrStageNames)) {
461 *stage_name = kKeymgrStageNames[state];
465status_t keymgr_dpe_testutils_clear_sideload_key(
468 TRY(dif_keymgr_dpe_clear_sideload_key(keymgr_dpe, clear_dest));
472#error "[Keymgr_dpe, testutils] None of the supported tops defined!"