4 #include "sw/device/silicon_creator/lib/ownership/ownership.h"
11 #include "sw/device/silicon_creator/lib/boot_data.h"
12 #include "sw/device/silicon_creator/lib/dbg_print.h"
13 #include "sw/device/silicon_creator/lib/drivers/flash_ctrl.h"
14 #include "sw/device/silicon_creator/lib/drivers/hmac.h"
15 #include "sw/device/silicon_creator/lib/drivers/lifecycle.h"
16 #include "sw/device/silicon_creator/lib/error.h"
17 #include "sw/device/silicon_creator/lib/ownership/ecdsa.h"
18 #include "sw/device/silicon_creator/lib/ownership/owner_block.h"
19 #include "sw/device/silicon_creator/lib/ownership/ownership.h"
20 #include "sw/device/silicon_creator/lib/ownership/ownership_activate.h"
21 #include "sw/device/silicon_creator/lib/ownership/ownership_key.h"
23 static owner_page_status_t owner_page_validity_check(
size_t page) {
25 (uintptr_t)&owner_page[0].signature - (uintptr_t)&owner_page[0];
33 memset(owner_page[page].device_id, 0,
sizeof(owner_page[page].device_id));
35 lifecycle_device_id_get(&
id);
36 for (uint32_t i = 0; i <
ARRAYSIZE(owner_page[0].device_id); ++i) {
37 if (owner_page[page].lock_constraint & (1u << i)) {
38 owner_page[page].
device_id[i] =
id.device_id[i];
40 owner_page[page].
device_id[i] = kLockConstraintNone;
44 rom_error_t sealed = ownership_seal_check(page);
45 if (sealed == kErrorOk) {
47 return kOwnerPageStatusSealed;
50 hardened_bool_t result = ownership_key_validate(page, kOwnershipKeyOwner,
51 &owner_page[page].signature,
52 &owner_page[page], sig_len);
55 memset(&owner_page[page], 0x5a,
sizeof(owner_page[0]));
56 return kOwnerPageStatusInvalid;
58 return kOwnerPageStatusSigned;
67 static rom_error_t locked_owner_init(
boot_data_t *bootdata,
70 if (owner_page_valid[0] == kOwnerPageStatusSealed &&
71 owner_page_valid[1] == kOwnerPageStatusSigned &&
73 owner_page[1].config_version > owner_page[0].config_version &&
79 if (error == kErrorOk) {
84 owner_page_valid[0] = kOwnerPageStatusInvalid;
85 owner_page_valid[1] = kOwnerPageStatusSealed;
93 if (owner_page_valid[0] == kOwnerPageStatusSealed &&
94 owner_page_valid[1] == kOwnerPageStatusSealed) {
96 }
else if (owner_page_valid[0] != kOwnerPageStatusSealed &&
97 owner_page_valid[1] == kOwnerPageStatusSealed) {
99 memcpy(&owner_page[0], &owner_page[1],
sizeof(owner_page[0]));
100 HARDENED_RETURN_IF_ERROR(flash_ctrl_info_erase(
101 &kFlashCtrlInfoPageOwnerSlot0, kFlashCtrlEraseTypePage));
102 HARDENED_RETURN_IF_ERROR(flash_ctrl_info_write(
103 &kFlashCtrlInfoPageOwnerSlot0, 0,
104 sizeof(owner_page[0]) /
sizeof(uint32_t), &owner_page[0]));
105 owner_page_valid[0] = owner_page_valid[1];
107 }
else if (owner_page_valid[1] != kOwnerPageStatusSealed &&
108 owner_page_valid[0] == kOwnerPageStatusSealed) {
110 memcpy(&owner_page[1], &owner_page[0],
sizeof(owner_page[0]));
111 HARDENED_RETURN_IF_ERROR(flash_ctrl_info_erase(
112 &kFlashCtrlInfoPageOwnerSlot1, kFlashCtrlEraseTypePage));
113 HARDENED_RETURN_IF_ERROR(flash_ctrl_info_write(
114 &kFlashCtrlInfoPageOwnerSlot1, 0,
115 sizeof(owner_page[1]) /
sizeof(uint32_t), &owner_page[1]));
116 owner_page_valid[1] = owner_page_valid[0];
119 dbg_printf(
"error: both owner pages invalid.\r\n");
121 nonce_new(&bootdata->
nonce);
122 HARDENED_RETURN_IF_ERROR(boot_data_write(bootdata));
123 return kErrorOwnershipBadInfoPage;
125 HARDENED_RETURN_IF_ERROR(owner_block_parse(&owner_page[0], config, keyring));
126 HARDENED_RETURN_IF_ERROR(
127 owner_block_flash_apply(config->
flash, kBootSlotA,
129 HARDENED_RETURN_IF_ERROR(
130 owner_block_flash_apply(config->
flash, kBootSlotB,
132 HARDENED_RETURN_IF_ERROR(owner_block_info_apply(config->
info));
141 owner_page_valid[0] != kOwnerPageStatusSealed) {
145 nonce_new(&bootdata->
nonce);
146 HARDENED_RETURN_IF_ERROR(boot_data_write(bootdata));
147 return kErrorOwnershipBadInfoPage;
150 if (owner_page_valid[0] == kOwnerPageStatusSealed) {
152 HARDENED_RETURN_IF_ERROR(
153 owner_block_parse(&owner_page[0], config, keyring));
154 HARDENED_RETURN_IF_ERROR(
163 rom_error_t result = owner_block_parse(&owner_page[1], &testcfg, &testring);
164 if (result == kErrorOk) {
166 HARDENED_RETURN_IF_ERROR(
167 owner_block_parse(&owner_page[1], config, keyring));
169 dbg_printf(
"error: owner page 1 invalid.\r\n");
172 HARDENED_RETURN_IF_ERROR(
173 owner_block_flash_apply(config->
flash, secondary,
175 HARDENED_RETURN_IF_ERROR(owner_block_info_apply(config->
info));
182 .
read = kMultiBitBool4True,
183 .write = kMultiBitBool4True,
184 .erase = kMultiBitBool4True,
187 .scrambling = kMultiBitBool4True,
188 .ecc = kMultiBitBool4True,
189 .he = kMultiBitBool4False,
191 flash_ctrl_info_perms_set(&kFlashCtrlInfoPageOwnerSlot0, perm);
192 flash_ctrl_info_cfg_set(&kFlashCtrlInfoPageOwnerSlot0, cfg);
193 flash_ctrl_info_perms_set(&kFlashCtrlInfoPageOwnerSlot1, perm);
194 flash_ctrl_info_cfg_set(&kFlashCtrlInfoPageOwnerSlot1, cfg);
197 flash_ctrl_info_cfg_set(&kFlashCtrlInfoPageOwnerSecret, cfg);
201 if (flash_ctrl_info_read(&kFlashCtrlInfoPageOwnerSlot0, 0,
202 sizeof(owner_page[0]) /
sizeof(uint32_t),
203 &owner_page[0]) == kErrorOk) {
204 owner_page_valid[0] = owner_page_validity_check(0);
206 owner_page_valid[0] = kOwnerPageStatusInvalid;
207 memset(&owner_page[0], 0xff,
sizeof(owner_page[0]));
209 if (flash_ctrl_info_read(&kFlashCtrlInfoPageOwnerSlot1, 0,
210 sizeof(owner_page[1]) /
sizeof(uint32_t),
211 &owner_page[1]) == kErrorOk) {
212 owner_page_valid[1] = owner_page_validity_check(1);
214 owner_page_valid[1] = kOwnerPageStatusInvalid;
215 memset(&owner_page[1], 0xff,
sizeof(owner_page[1]));
240 owner_config_default(config);
252 HARDENED_RETURN_IF_ERROR(sku_creator_owner_init(bootdata, config, keyring));
254 rom_error_t error = kErrorOwnershipNoOwner;
257 case kOwnershipStateLockedOwner:
258 error = locked_owner_init(bootdata, config, keyring);
260 case kOwnershipStateUnlockedSelf:
262 case kOwnershipStateUnlockedAny:
264 case kOwnershipStateUnlockedEndorsed:
265 error = unlocked_init(bootdata, config, keyring);
273 rom_error_t ownership_flash_lockdown(
boot_data_t *bootdata,
274 uint32_t active_slot,
277 HARDENED_RETURN_IF_ERROR(owner_block_flash_apply(config->
flash, kBootSlotA,
279 HARDENED_RETURN_IF_ERROR(owner_block_flash_apply(config->
flash, kBootSlotB,
282 HARDENED_CHECK_NE(bootdata->
ownership_state, kOwnershipStateLockedOwner);
288 #ifdef ROM_EXT_KLOBBER_ALLOWED
301 .
read = kMultiBitBool4True,
302 .write = kMultiBitBool4False,
303 .erase = kMultiBitBool4False,
306 .scrambling = kMultiBitBool4True,
307 .ecc = kMultiBitBool4True,
308 .he = kMultiBitBool4False,
311 flash_ctrl_info_perms_set(&kFlashCtrlInfoPageOwnerSlot0, perm);
312 flash_ctrl_info_cfg_set(&kFlashCtrlInfoPageOwnerSlot0, cfg);
313 flash_ctrl_info_lock(&kFlashCtrlInfoPageOwnerSlot0);
324 flash_ctrl_info_perms_set(&kFlashCtrlInfoPageOwnerSlot1, perm);
325 flash_ctrl_info_cfg_set(&kFlashCtrlInfoPageOwnerSlot1, cfg);
330 flash_ctrl_info_lock(&kFlashCtrlInfoPageOwnerSlot1);