5 #include "sw/device/silicon_creator/lib/ownership/ownership_activate.h"
9 #include "sw/device/silicon_creator/lib/boot_data.h"
10 #include "sw/device/silicon_creator/lib/boot_svc/boot_svc_msg.h"
11 #include "sw/device/silicon_creator/lib/drivers/flash_ctrl.h"
12 #include "sw/device/silicon_creator/lib/drivers/lifecycle.h"
13 #include "sw/device/silicon_creator/lib/error.h"
14 #include "sw/device/silicon_creator/lib/ownership/owner_block.h"
15 #include "sw/device/silicon_creator/lib/ownership/ownership_key.h"
17 rom_error_t ownership_activate(
boot_data_t *bootdata,
22 HARDENED_RETURN_IF_ERROR(
23 owner_block_parse(&owner_page[1], &config, &keyring));
26 ownership_seal_page(1);
29 if (owner_page[1].min_security_version_bl0 != UINT32_MAX) {
37 HARDENED_RETURN_IF_ERROR(flash_ctrl_info_erase(&kFlashCtrlInfoPageOwnerSlot1,
38 kFlashCtrlEraseTypePage));
39 HARDENED_RETURN_IF_ERROR(flash_ctrl_info_write(
40 &kFlashCtrlInfoPageOwnerSlot1, 0,
41 sizeof(owner_page[1]) /
sizeof(uint32_t), &owner_page[1]));
45 HARDENED_RETURN_IF_ERROR(flash_ctrl_info_erase(
46 &kFlashCtrlInfoPageOwnerSlot0, kFlashCtrlEraseTypePage));
47 HARDENED_RETURN_IF_ERROR(flash_ctrl_info_write(
48 &kFlashCtrlInfoPageOwnerSlot0, 0,
49 sizeof(owner_page[1]) /
sizeof(uint32_t), &owner_page[1]));
62 return kErrorOwnershipInvalidInfoPage;
66 size_t len = (uintptr_t)&msg->ownership_activate_req.signature -
67 (uintptr_t)&msg->ownership_activate_req.primary_bl0_slot;
68 if (ownership_key_validate(1, kOwnershipKeyActivate,
69 &msg->ownership_activate_req.signature,
70 &msg->ownership_activate_req.primary_bl0_slot,
72 return kErrorOwnershipInvalidSignature;
74 if (!nonce_equal(&msg->ownership_activate_req.nonce, &bootdata->
nonce)) {
75 return kErrorOwnershipInvalidNonce;
80 lifecycle_device_id_get(&device_id);
81 if (lifecycle_din_eq(&device_id, msg->ownership_activate_req.din) !=
83 return kErrorOwnershipInvalidDin;
86 HARDENED_RETURN_IF_ERROR(
91 if (msg->ownership_activate_req.primary_bl0_slot == kBootSlotB) {
104 HARDENED_RETURN_IF_ERROR(ownership_secret_new());
109 nonce_new(&bootdata->
nonce);
112 return kErrorWriteBootdataThenReboot;
117 rom_error_t error = kErrorOwnershipInvalidState;
119 case kOwnershipStateUnlockedSelf:
120 case kOwnershipStateUnlockedAny:
121 case kOwnershipStateUnlockedEndorsed:
122 error = activate_handler(msg, bootdata);
127 boot_svc_ownership_activate_res_init(
128 error == kErrorWriteBootdataThenReboot ? kErrorOk : error,
129 &msg->ownership_activate_res);