5 #include "sw/device/silicon_creator/lib/ownership/owner_block.h"
13 #include "sw/device/silicon_creator/lib/boot_data.h"
14 #include "sw/device/silicon_creator/lib/drivers/flash_ctrl.h"
15 #include "sw/device/silicon_creator/lib/error.h"
17 #include "flash_ctrl_regs.h"
21 owner_page_status_t owner_page_valid[2];
24 kFlashBankSize = FLASH_CTRL_PARAM_REG_PAGES_PER_BANK,
25 kFlashPageSize = FLASH_CTRL_PARAM_BYTES_PER_PAGE,
29 if (owner_page_valid[0] == kOwnerPageStatusSealed &&
30 (owner_page[0].update_mode == kOwnershipUpdateModeNewVersion ||
31 owner_page[0].update_mode == kOwnershipUpdateModeSelfVersion)) {
39 owner_page_valid[1] == kOwnerPageStatusSealed) {
42 if (owner_page_valid[1] == kOwnerPageStatusSigned) {
45 case kOwnershipStateUnlockedAny:
48 case kOwnershipStateUnlockedSelf:
52 owner_page[0].
owner_key.
raw, owner_page[1].owner_key.raw,
57 case kOwnershipStateUnlockedEndorsed:
61 sizeof(owner_page[1].owner_key.raw), &digest);
79 config->
sram_exec = kOwnerSramExecModeDisabledLocked;
85 owner_config_default(config);
86 if (block->
header.tag != kTlvTagOwner)
87 return kErrorOwnershipInvalidTag;
89 return kErrorOwnershipInvalidTagLength;
90 if (block->
header.version.major != 0)
91 return kErrorOwnershipOWNRVersion;
95 uint32_t remain =
sizeof(block->
data);
99 if (item->tag == kTlvTagNotPresent) {
102 if (item->length < 8 || item->length > remain || item->length % 4 != 0) {
103 return kErrorOwnershipInvalidTagLength;
105 remain -= item->length;
106 offset += item->length;
107 uint32_t tag = item->tag;
108 switch (launder32(item->tag)) {
109 case kTlvTagApplicationKey:
111 if (item->version.major != 0)
112 return kErrorOwnershipAPPKVersion;
119 case kTlvTagFlashConfig:
121 if (item->version.major != 0)
122 return kErrorOwnershipFLSHVersion;
124 return kErrorOwnershipDuplicateItem;
125 HARDENED_RETURN_IF_ERROR(
129 case kTlvTagInfoConfig:
131 if (item->version.major != 0)
132 return kErrorOwnershipINFOVersion;
134 return kErrorOwnershipDuplicateItem;
137 case kTlvTagRescueConfig:
139 if (item->version.major != 0)
140 return kErrorOwnershipRESQVersion;
142 return kErrorOwnershipDuplicateItem;
146 return kErrorOwnershipInvalidTag;
156 return kErrorOwnershipFlashConfigLenth;
159 const uint32_t kRomExtAStart = 0 / kFlashPageSize;
160 const uint32_t kRomExtAEnd = CHIP_ROM_EXT_SIZE_MAX / kFlashPageSize;
161 const uint32_t kRomExtBStart = kFlashBankSize + kRomExtAStart;
162 const uint32_t kRomExtBEnd = kFlashBankSize + kRomExtAEnd;
166 for (
size_t i = 0; i < len; ++i, ++config, crypt += 0x11111111) {
167 uint32_t start = config->
start;
168 uint32_t end = start + config->size;
169 if ((kRomExtAStart >= start && kRomExtAStart < end) ||
170 (kRomExtAEnd > start && kRomExtAEnd <= end) ||
171 (kRomExtBStart >= start && kRomExtBStart < end) ||
172 (kRomExtBEnd > start && kRomExtBEnd <= end)) {
173 uint32_t val = config->properties ^ crypt;
181 if (dfl.
ecc != kMultiBitBool4True)
182 dfl.
ecc = kMultiBitBool4False;
186 if (cfg.ecc != dfl.
ecc || cfg.scrambling != dfl.
scrambling) {
189 return kErrorOwnershipFlashConfigRomExt;
197 uint32_t config_side, uint32_t lockdown) {
202 uint32_t start = config_side == kBootSlotA ? 0
203 : config_side == kBootSlotB ? kFlashBankSize
205 uint32_t end = config_side == kBootSlotA ? kFlashBankSize
206 : config_side == kBootSlotB ? 2 * kFlashBankSize
211 return kErrorOwnershipFlashConfigLenth;
216 for (
size_t i = 0; i < len; ++i, ++config, crypt += 0x11111111) {
217 if (config->start >= start && config->start + config->size <= end) {
224 val = config->access ^ crypt;
231 if (lockdown == config_side) {
233 kMultiBitBool4False) {
234 perm.
write = kMultiBitBool4False;
235 perm.
erase = kMultiBitBool4False;
242 kMultiBitBool4False) {
246 flash_ctrl_data_region_protect(i, config->start, config->size, perm, cfg,
254 if (config->
bank == 0) {
255 if (config->
page >= 6 && config->
page <= 9) {
271 for (
size_t i = 0; i < len; ++i, ++config, crypt += 0x11111111) {
274 .
base_addr = config->bank * FLASH_CTRL_PARAM_BYTES_PER_BANK +
275 config->page * FLASH_CTRL_PARAM_BYTES_PER_PAGE,
277 config->page *
sizeof(uint32_t) +
278 (config->bank == 0 ? FLASH_CTRL_BANK0_INFO0_REGWEN_0_REG_OFFSET
279 : FLASH_CTRL_BANK1_INFO0_REGWEN_0_REG_OFFSET),
280 .cfg_offset = config->page *
sizeof(uint32_t) +
282 ? FLASH_CTRL_BANK0_INFO0_PAGE_CFG_0_REG_OFFSET
283 : FLASH_CTRL_BANK1_INFO0_PAGE_CFG_0_REG_OFFSET),
286 uint32_t val = config->properties ^ crypt;
292 flash_ctrl_info_cfg_set(&page, cfg);
294 val = config->access ^ crypt;
300 flash_ctrl_info_perms_set(&page, perm);
307 uint32_t key_alg, uint32_t key_id,
309 for (
size_t i = 0; i < keyring->
length; ++i) {
311 keyring->
key[i]->
data.id == key_id) {
316 return kErrorOwnershipKeyNotFound;
322 HARDENED_CHECK_GT((uintptr_t)key, (uintptr_t)&owner_page[0]);
323 HARDENED_CHECK_LT((uintptr_t)key,
324 (uintptr_t)&owner_page[
ARRAYSIZE(owner_page)]);
325 return (uintptr_t)key < (uintptr_t)&owner_page[1] ? 0 : 1;
336 size_t length = (rescue->
header.length -
sizeof(*rescue)) /
sizeof(uint32_t);
337 for (
size_t i = 0; i < length; ++i) {
345 void owner_block_measurement(
size_t page,
hmac_digest_t *measurement) {
346 HARDENED_CHECK_LT(page,
ARRAYSIZE(owner_page));
350 hmac_sha256(&owner_page[page], len, measurement);