17 #include "sw/device/lib/testing/keymgr_testutils.h"
18 #include "sw/device/lib/testing/otp_ctrl_testutils.h"
19 #include "sw/device/lib/testing/pwrmgr_testutils.h"
20 #include "sw/device/lib/testing/rstmgr_testutils.h"
21 #include "sw/device/lib/testing/test_framework/check.h"
25 #include "sw/device/silicon_creator/lib/drivers/keymgr.h"
26 #include "sw/device/silicon_creator/lib/drivers/kmac.h"
27 #include "sw/device/silicon_creator/lib/drivers/lifecycle.h"
28 #include "sw/device/silicon_creator/lib/drivers/retention_sram.h"
29 #include "sw/device/silicon_creator/lib/error.h"
30 #include "sw/device/silicon_creator/lib/keymgr_binding_value.h"
33 #include "keymgr_regs.h"
34 #include "kmac_regs.h"
36 #define ASSERT_OK(expr_) \
38 rom_error_t local_error_ = expr_; \
39 if (local_error_ != kErrorOk) { \
40 LOG_ERROR("Error at line: %d", __LINE__); \
41 return local_error_; \
45 #define ASSERT_EQZ(x) CHECK((x) == 0)
49 kFlashInfoPartitionId = 0,
55 kFlashInfoPageIdCreatorSecret = 1,
58 kFlashInfoPageIdOwnerSecret = 2,
71 .data = {0x7c9b2405, 0x1841a738, 0xdb24005d, 0x4dbd6a17, 0x362f1673,
72 0x1d8ede70, 0x0104d346, 0x1a0806c2},
79 .data = {0xdc96c23d, 0xaf36e268, 0xcb68ff71, 0xe92f76e2, 0xb8a8379d,
80 0x426dc745, 0x19f5cff7, 0x4ec9c6d6},
87 .data = {0xe4987b39, 0x3f83d390, 0xc2f3bbaf, 0x3195dbfa, 0x23fb480c,
88 0xb012ae5e, 0xf1394d28, 0x1940ceeb},
94 const uint32_t kKmacPrefix[kKmacPrefixSize] = {
95 0x4d4b2001, 0x00014341, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
99 const uint32_t kMaxVerRom = 1;
102 const uint32_t kMaxVerRomExt = 2;
105 const uint32_t kMaxVerBl0 = 3;
107 OTTF_DEFINE_TEST_CONFIG();
109 static void init_flash(
void) {
117 keymgr_testutils_flash_init(&flash, &kCreatorSecret, &kOwnerSecret));
120 static void check_lock_otp_partition(
const dif_otp_ctrl_t *otp) {
128 LOG_INFO(
"OTP partition locked. Digest: %x-%x", ((uint32_t *)&digest)[0],
129 ((uint32_t *)&digest)[1]);
137 rom_error_t keymgr_rom_test(
void) {
138 ASSERT_OK(sc_keymgr_state_check(kScKeymgrStateReset));
139 if (retention_sram_get()
144 sc_keymgr_sw_binding_set(&kBindingValueRom, &kBindingValueRom);
145 sc_keymgr_creator_max_ver_set(kMaxVerRom);
147 kScKeymgrSecMmioCreatorMaxVerSet);
151 KEYMGR_SW_BINDING_REGWEN_REG_OFFSET) == 0,
152 "Keymgr SW binding should be locked in Reset state.");
154 const uint16_t kEntropyReseedInterval = 0x1234;
155 sc_keymgr_entropy_reseed_interval_set(kEntropyReseedInterval);
160 sc_keymgr_advance_state();
161 ASSERT_OK(sc_keymgr_state_check(kScKeymgrStateInit));
164 KEYMGR_SW_BINDING_REGWEN_REG_OFFSET) == 0,
165 "Keymgr SW binding should be locked in Initialized state.");
166 if (retention_sram_get()
171 KEYMGR_ATTEST_SW_BINDING_0_REG_OFFSET) ==
172 kBindingValueRom.data[0],
173 "Keymgr Attestation SW Binding value should be value set by ROM "
174 "during Initialized state.");
176 KEYMGR_ATTEST_SW_BINDING_7_REG_OFFSET) ==
177 kBindingValueRom.data[7],
178 "Keymgr Attestation SW Binding value should be value set by ROM "
179 "during Initialized state.");
181 KEYMGR_SEALING_SW_BINDING_0_REG_OFFSET) ==
182 kBindingValueRom.data[0],
183 "Keymgr Sealing SW Binding value should be value set by ROM "
184 "during Initialized state.");
186 KEYMGR_SEALING_SW_BINDING_7_REG_OFFSET) ==
187 kBindingValueRom.data[7],
188 "Keymgr Sealing SW Binding value should be value set by ROM "
189 "during Initialized state.");
193 sc_keymgr_advance_state();
194 ASSERT_OK(sc_keymgr_state_check(kScKeymgrStateCreatorRootKey));
195 LOG_INFO(
"Keymgr State: CreatorRootKey");
197 KEYMGR_SW_BINDING_REGWEN_REG_OFFSET) == 1,
198 "Keymgr SW binding should be unlocked after transitioning to "
199 "CreatorRootKey state.");
204 sc_keymgr_sw_binding_unlock_wait();
208 sc_keymgr_sw_binding_set(&kBindingValueRomExt, &kBindingValueRomExt);
209 sc_keymgr_owner_int_max_ver_set(kMaxVerRomExt);
211 kScKeymgrSecMmioOwnerIntMaxVerSet);
214 KEYMGR_SW_BINDING_REGWEN_REG_OFFSET) == 0,
215 "Keymgr SW binding should be locked before transitioning to "
216 "OwnerIntermediateKey state.");
217 sc_keymgr_advance_state();
218 ASSERT_OK(sc_keymgr_state_check(kScKeymgrStateOwnerIntermediateKey));
219 LOG_INFO(
"Keymgr State: OwnerIntermediateKey");
221 KEYMGR_SW_BINDING_REGWEN_REG_OFFSET) == 1,
222 "Keymgr SW binding should be unlocked after transitioning to "
223 "OwnerIntermediateKey state.");
230 rom_error_t keymgr_rom_ext_test(
void) {
234 sc_keymgr_sw_binding_unlock_wait();
238 sc_keymgr_sw_binding_set(&kBindingValueBl0, &kBindingValueBl0);
240 KEYMGR_SW_BINDING_REGWEN_REG_OFFSET) == 0,
241 "Keymgr SW binding should be locked before transitioning to "
243 sc_keymgr_owner_max_ver_set(kMaxVerBl0);
245 kScKeymgrSecMmioOwnerMaxVerSet);
247 sc_keymgr_advance_state();
248 ASSERT_OK(sc_keymgr_state_check(kScKeymgrStateOwnerKey));
251 KEYMGR_SW_BINDING_REGWEN_REG_OFFSET) == 1,
252 "Keymgr SW binding should be unlocked after transitioning to "
264 lifecycle_state_t lc_state = lifecycle_state_get();
265 CHECK(lc_state == kLcStateRma || lc_state == kLcStateDev ||
266 lc_state == kLcStateProd || lc_state == kLcStateProdEnd,
267 "The test is configured to run in RMA mode.");
269 CHECK_DIF_OK(dif_rstmgr_init(
271 info = rstmgr_testutils_reason_get();
274 CHECK_DIF_OK(dif_otp_ctrl_init(
278 LOG_INFO(
"Powered up for the first time, program flash");
283 check_lock_otp_partition(&otp);
286 rstmgr_testutils_reason_clear();
290 LOG_INFO(
"Powered up for the second time, actuate keymgr");
292 check_lock_otp_partition(&otp);
294 kmac_keymgr_configure();
298 return status_ok(result);
300 LOG_FATAL(
"Unexpected reset reason unexpected: %08x", info);