13 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
14 #include "sw/device/lib/testing/test_framework/check.h"
20 static dif_keymgr_t keymgr;
21 static dif_kmac_t kmac;
22 static dif_lc_ctrl_t lc;
23 static dif_otp_ctrl_t otp;
25 OTTF_DEFINE_TEST_CONFIG();
28 kFlashInfoPageIdCreatorSecret = 1,
29 kFlashInfoPageIdOwnerSecret = 2,
30 kFlashInfoPageIdIsoPart = 3,
38 const uint32_t kCreatorSecret[kPartSize] = {
39 0xb295d21b, 0xecdfbdcd, 0x67e7ab2d, 0x6f660b08, 0x273bf65c, 0xe80f1695,
40 0x586b80db, 0xc3dba27e, 0xdc124c5d, 0xb01ccd52, 0x815713e1, 0x31a141b2,
41 0x2124be3b, 0x299a6f2a, 0x1f2a4741, 0x1a073cc0,
44 const uint32_t kOwnerSecret[kPartSize] = {
45 0x69e705a0, 0x65c2ec6b, 0x04b0b634, 0x59313526, 0x1858aee1, 0xd49f3ba9,
46 0x230bcd38, 0xc1eb6b3e, 0x68c15e3b, 0x024d02a9, 0x0b062ae4, 0x334dd155,
47 0x53fdbf8a, 0x3792f1e2, 0xee317161, 0x33b19bf3,
50 const uint32_t kIsoPartData[kPartSize] = {
51 0x2b78dbf5, 0x3e6e5a00, 0xbf82c6d5, 0x68d8e33f, 0x9c524bbc, 0xac5beeef,
52 0x1287ca5a, 0x12b61419, 0x872e709f, 0xf91b7c0c, 0x18312a1f, 0x325cef9a,
53 0x19fefa95, 0x4ceb421b, 0xa57d74c4, 0xaf1d723d,
56 typedef enum check_id {
58 kCheckIdUnprovisionedCreatorSeed = 0,
59 kCheckIdUnprovisonedOwnerSeed,
60 kCheckIdLcDevIsoPartAccess,
63 kCheckIdProvisionedCreatorSeed,
64 kCheckIdProvisionedOwnerSeed,
65 kCheckIdLcProdIsoPartAccess,
95 [kCheckIdUnprovisionedCreatorSeed] =
97 .check_id = kCheckIdUnprovisionedCreatorSeed,
98 .page_id = kFlashInfoPageIdCreatorSecret,
99 .data = kCreatorSecret,
102 .expect_write_ok =
true,
104 .expect_read_ok =
true,
106 [kCheckIdUnprovisonedOwnerSeed] =
108 .check_id = kCheckIdUnprovisonedOwnerSeed,
109 .page_id = kFlashInfoPageIdOwnerSecret,
110 .data = kOwnerSecret,
113 .expect_write_ok =
true,
115 .expect_read_ok =
true,
117 [kCheckIdLcDevIsoPartAccess] =
119 .check_id = kCheckIdLcDevIsoPartAccess,
120 .page_id = kFlashInfoPageIdIsoPart,
121 .data = kIsoPartData,
124 .expect_write_ok =
true,
126 .expect_read_ok =
false,
128 [kCheckIdProvisionedCreatorSeed] =
130 .check_id = kCheckIdProvisionedCreatorSeed,
131 .page_id = kFlashInfoPageIdCreatorSecret,
132 .data = kCreatorSecret,
135 .expect_write_ok =
false,
137 .expect_read_ok =
false,
139 [kCheckIdProvisionedOwnerSeed] =
141 .check_id = kCheckIdProvisionedOwnerSeed,
142 .page_id = kFlashInfoPageIdOwnerSecret,
143 .data = kOwnerSecret,
146 .expect_write_ok =
true,
148 .expect_read_ok =
true,
150 [kCheckIdLcProdIsoPartAccess] =
152 .check_id = kCheckIdLcProdIsoPartAccess,
153 .page_id = kFlashInfoPageIdIsoPart,
154 .data = kIsoPartData,
157 .expect_write_ok =
false,
159 .expect_read_ok =
true,
166 static void init_peripheral_handles(
void) {
167 CHECK_DIF_OK(dif_keymgr_init(
169 CHECK_DIF_OK(dif_otp_ctrl_init(
173 CHECK_DIF_OK(dif_lc_ctrl_init(
180 uint32_t address = 0;
181 CHECK_STATUS_OK(flash_ctrl_testutils_info_region_setup(
182 &flash, cfg.page_id, kBankId, kPartitionId, &address));
185 status_t result = flash_ctrl_testutils_erase_and_write_page(
186 &flash, address, kPartitionId, cfg.data, kDifFlashCtrlPartitionTypeInfo,
189 if (cfg.expect_write_ok) {
190 CHECK_STATUS_OK(result);
192 CHECK_STATUS_NOT_OK(result);
197 uint32_t readback_data[cfg.size];
199 flash_ctrl_testutils_read(&flash, address, kPartitionId, readback_data,
200 kDifFlashCtrlPartitionTypeInfo, cfg.size, 0);
202 if (cfg.expect_read_ok) {
203 CHECK_STATUS_OK(result);
204 CHECK_ARRAYS_EQ(cfg.data, readback_data, cfg.size);
206 CHECK_STATUS_NOT_OK(result);
207 CHECK_ARRAYS_NE(cfg.data, readback_data, cfg.size);
213 static void keymgr_advance_state(dif_keymgr_t *keymgr,
224 LOG_INFO(
"Keymgr state: 0x%x", keymgr_state);
225 CHECK(keymgr_state == expected_state,
226 "Expected keymgr state not reached. got: %d, expected: %d",
227 keymgr_state, expected_state);
233 static void dut_provision_creator_secrets(
void) {
243 init_peripheral_handles();
247 .entropy_reseed_interval = 0xFFFF,
253 .entropy_mode = kDifKmacEntropyModeSoftware,
269 partition_check(kTest[kCheckIdUnprovisionedCreatorSeed]);
270 partition_check(kTest[kCheckIdUnprovisonedOwnerSeed]);
271 partition_check(kTest[kCheckIdLcDevIsoPartAccess]);
275 dut_provision_creator_secrets();
277 partition_check(kTest[kCheckIdProvisionedCreatorSeed]);
278 partition_check(kTest[kCheckIdProvisionedOwnerSeed]);
279 partition_check(kTest[kCheckIdLcProdIsoPartAccess]);
283 .
binding_value = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
284 .max_key_version = 0xFFFFFFFF};
288 test_status_set(kTestStatusInWfi);