5 #include "sw/device/silicon_creator/lib/ownership/owner_block.h"
9 #include "gmock/gmock.h"
10 #include "gtest/gtest.h"
12 #include "sw/device/lib/testing/binary_blob.h"
13 #include "sw/device/silicon_creator/lib/boot_data.h"
14 #include "sw/device/silicon_creator/lib/drivers/mock_flash_ctrl.h"
15 #include "sw/device/silicon_creator/lib/error.h"
16 #include "sw/device/silicon_creator/lib/ownership/datatypes.h"
17 #include "sw/device/silicon_creator/testing/rom_test.h"
20 #include "sw/device/silicon_creator/lib/ownership/testdata/basic_owner_testdata.h"
22 using rom_test::FlashCfg;
23 using rom_test::FlashPerms;
24 using rom_test::MockFlashCtrl;
26 using ::testing::Return;
27 using ::testutil::BinaryBlob;
31 MockFlashCtrl flash_ctrl_;
34 .ecc = kMultiBitBool4False,
35 .he = kMultiBitBool4False,
38 void SetUp()
override {
39 ON_CALL(flash_ctrl_, DataDefaultCfgGet)
40 .WillByDefault(Return(default_config));
46 #define FLASH_ACCESS(index, read, program, erase, pwp, lock) ( \
48 bitfield_field32_write(0, FLASH_CONFIG_READ, read ? kMultiBitBool4True : kMultiBitBool4False) | \
49 bitfield_field32_write(0, FLASH_CONFIG_PROGRAM, program ? kMultiBitBool4True : kMultiBitBool4False) | \
50 bitfield_field32_write(0, FLASH_CONFIG_ERASE, erase ? kMultiBitBool4True : kMultiBitBool4False) | \
51 bitfield_field32_write(0, FLASH_CONFIG_PROTECT_WHEN_PRIMARY, pwp ? kMultiBitBool4True : kMultiBitBool4False) | \
52 bitfield_field32_write(0, FLASH_CONFIG_LOCK, lock ? kMultiBitBool4True : kMultiBitBool4False) \
53 ) ^ (0x11111111 * index) \
57 #define FLASH_PROP(index, scramble, ecc, he) ( \
59 bitfield_field32_write(0, FLASH_CONFIG_SCRAMBLE, scramble ? kMultiBitBool4True : kMultiBitBool4False) | \
60 bitfield_field32_write(0, FLASH_CONFIG_ECC, ecc ? kMultiBitBool4True : kMultiBitBool4False) | \
61 bitfield_field32_write(0, FLASH_CONFIG_HIGH_ENDURANCE, he ? kMultiBitBool4True : kMultiBitBool4False) \
62 ) ^ (0x11111111 * index) \
69 .tag = kTlvTagFlashConfig,
79 .access = FLASH_ACCESS(
86 .properties = FLASH_PROP(
97 .access = FLASH_ACCESS(
104 .properties = FLASH_PROP(
115 .access = FLASH_ACCESS(
122 .properties = FLASH_PROP(
133 .access = FLASH_ACCESS(
140 .properties = FLASH_PROP(
150 .access = FLASH_ACCESS(
157 .properties = FLASH_PROP(
167 .access = FLASH_ACCESS(
174 .properties = FLASH_PROP(
186 .tag = kTlvTagFlashConfig,
195 .tag = kTlvTagInfoConfig,
205 .access = FLASH_ACCESS(
212 .properties = FLASH_PROP(
223 .access = FLASH_ACCESS(
230 .properties = FLASH_PROP(
240 TEST_F(OwnerBlockTest, FlashConfigApplyBad) {
241 rom_error_t error = owner_block_flash_apply(&bad_flash_config, kBootSlotA, 0);
242 EXPECT_EQ(error, kErrorOwnershipFlashConfigLenth);
246 TEST_F(OwnerBlockTest, FlashConfigApplySideA) {
249 DataRegionProtect(0, 0, 32,
250 FlashPerms(kMultiBitBool4True, kMultiBitBool4True,
252 FlashCfg(kMultiBitBool4False, kMultiBitBool4False,
253 kMultiBitBool4False),
259 FlashPerms(kMultiBitBool4True, kMultiBitBool4True,
261 FlashCfg(kMultiBitBool4True, kMultiBitBool4True, kMultiBitBool4False),
265 DataRegionProtect(2, 224, 32,
266 FlashPerms(kMultiBitBool4True, kMultiBitBool4True,
268 FlashCfg(kMultiBitBool4False, kMultiBitBool4False,
273 owner_block_flash_apply(&simple_flash_config, kBootSlotA, 0);
274 EXPECT_EQ(error, kErrorOk);
280 TEST_F(OwnerBlockTest, FlashConfigApplySideAPrimary) {
283 DataRegionProtect(0, 0, 32,
284 FlashPerms(kMultiBitBool4True, kMultiBitBool4False,
285 kMultiBitBool4False),
286 FlashCfg(kMultiBitBool4False, kMultiBitBool4False,
287 kMultiBitBool4False),
293 FlashPerms(kMultiBitBool4True, kMultiBitBool4False,
294 kMultiBitBool4False),
295 FlashCfg(kMultiBitBool4True, kMultiBitBool4True, kMultiBitBool4False),
299 DataRegionProtect(2, 224, 32,
300 FlashPerms(kMultiBitBool4True, kMultiBitBool4True,
302 FlashCfg(kMultiBitBool4False, kMultiBitBool4False,
307 owner_block_flash_apply(&simple_flash_config, kBootSlotA, kBootSlotA);
308 EXPECT_EQ(error, kErrorOk);
312 TEST_F(OwnerBlockTest, FlashConfigApplySideB) {
315 DataRegionProtect(3, 256 + 0, 32,
316 FlashPerms(kMultiBitBool4True, kMultiBitBool4True,
318 FlashCfg(kMultiBitBool4False, kMultiBitBool4False,
319 kMultiBitBool4False),
325 FlashPerms(kMultiBitBool4True, kMultiBitBool4True,
327 FlashCfg(kMultiBitBool4True, kMultiBitBool4True, kMultiBitBool4False),
331 DataRegionProtect(5, 256 + 224, 32,
332 FlashPerms(kMultiBitBool4True, kMultiBitBool4True,
334 FlashCfg(kMultiBitBool4False, kMultiBitBool4False,
339 owner_block_flash_apply(&simple_flash_config, kBootSlotB, 0);
340 EXPECT_EQ(error, kErrorOk);
343 TEST_F(OwnerBlockTest, FlashInfoApply) {
344 EXPECT_CALL(flash_ctrl_,
345 InfoCfgSet(_, FlashCfg(kMultiBitBool4False, kMultiBitBool4False,
346 kMultiBitBool4True)));
347 EXPECT_CALL(flash_ctrl_,
348 InfoPermsSet(_, FlashPerms(kMultiBitBool4True, kMultiBitBool4True,
349 kMultiBitBool4True)));
351 rom_error_t error = owner_block_info_apply(&info_config);
352 EXPECT_EQ(error, kErrorOk);
355 TEST_F(OwnerBlockTest, ParseBlock) {
356 BinaryBlob<owner_block_t> block(basic_owner,
sizeof(basic_owner));
360 EXPECT_CALL(flash_ctrl_, DataDefaultCfgGet)
361 .WillRepeatedly(Return(default_config));
362 rom_error_t error = owner_block_parse(block.get(), &config, &keyring);
363 EXPECT_EQ(error, kErrorOk);
364 EXPECT_EQ(config.
sram_exec, kOwnerSramExecModeDisabledLocked);
365 EXPECT_EQ(config.
flash->
header.tag, kTlvTagFlashConfig);
366 EXPECT_EQ(config.
info->
header.tag, kTlvTagInfoConfig);
367 EXPECT_EQ(config.
rescue->
header.tag, kTlvTagRescueConfig);
368 EXPECT_EQ(keyring.
length, 1);
369 EXPECT_EQ(keyring.
key[0]->
header.tag, kTlvTagApplicationKey);
372 TEST_F(OwnerBlockTest, ParseBlockBadHeaderLength) {
373 BinaryBlob<owner_block_t> block(basic_owner,
sizeof(basic_owner));
375 block.Seek(offsetof(
owner_block_t, header.length)).Write(12345);
378 rom_error_t error = owner_block_parse(block.get(), &config, &keyring);
379 EXPECT_EQ(error, kErrorOwnershipInvalidTagLength);
382 TEST_F(OwnerBlockTest, ParseBlockBadHeaderTag) {
383 BinaryBlob<owner_block_t> block(basic_owner,
sizeof(basic_owner));
385 block.Seek(offsetof(
owner_block_t, header.tag)).Write(0x41414141);
388 rom_error_t error = owner_block_parse(block.get(), &config, &keyring);
389 EXPECT_EQ(error, kErrorOwnershipInvalidTag);
392 TEST_F(OwnerBlockTest, ParseBlockUnknownTag) {
393 EXPECT_CALL(flash_ctrl_, DataDefaultCfgGet)
394 .WillRepeatedly(Return(default_config));
395 BinaryBlob<owner_block_t> block(basic_owner,
sizeof(basic_owner));
404 rom_error_t error = owner_block_parse(block.get(), &config, &keyring);
405 EXPECT_EQ(error, kErrorOwnershipInvalidTag);
408 TEST_F(OwnerBlockTest, ParseBlockBadLength) {
409 BinaryBlob<owner_block_t> block(basic_owner,
sizeof(basic_owner));
412 EXPECT_CALL(flash_ctrl_, DataDefaultCfgGet)
413 .WillRepeatedly(Return(default_config));
416 block.Find(kTlvTagRescueConfig)
418 .Write(uint16_t(0x600));
419 rom_error_t error = owner_block_parse(block.get(), &config, &keyring);
420 EXPECT_EQ(error, kErrorOwnershipInvalidTagLength);
424 .Find(kTlvTagRescueConfig)
426 .Write(uint16_t(0x4));
427 error = owner_block_parse(block.get(), &config, &keyring);
428 EXPECT_EQ(error, kErrorOwnershipInvalidTagLength);
432 .Find(kTlvTagRescueConfig)
434 .Write(uint16_t(0x21));
435 error = owner_block_parse(block.get(), &config, &keyring);
436 EXPECT_EQ(error, kErrorOwnershipInvalidTagLength);
439 TEST_F(OwnerBlockTest, ParseBlockDupFlash) {
440 EXPECT_CALL(flash_ctrl_, DataDefaultCfgGet)
441 .WillRepeatedly(Return(default_config));
442 BinaryBlob<owner_block_t> block(basic_owner,
sizeof(basic_owner));
444 block.Find(kTlvTagRescueConfig).Write(kTlvTagFlashConfig);
447 rom_error_t error = owner_block_parse(block.get(), &config, &keyring);
448 EXPECT_EQ(error, kErrorOwnershipDuplicateItem);
451 TEST_F(OwnerBlockTest, ParseBlockDupInfo) {
452 EXPECT_CALL(flash_ctrl_, DataDefaultCfgGet)
453 .WillRepeatedly(Return(default_config));
454 BinaryBlob<owner_block_t> block(basic_owner,
sizeof(basic_owner));
456 block.Find(kTlvTagRescueConfig).Write(kTlvTagInfoConfig);
459 rom_error_t error = owner_block_parse(block.get(), &config, &keyring);
460 EXPECT_EQ(error, kErrorOwnershipDuplicateItem);
463 TEST_F(OwnerBlockTest, ParseBlockDupRescue) {
464 BinaryBlob<owner_block_t> block(basic_owner,
sizeof(basic_owner));
466 block.Find(kTlvTagFlashConfig).Write(kTlvTagRescueConfig);
469 rom_error_t error = owner_block_parse(block.get(), &config, &keyring);
470 EXPECT_EQ(error, kErrorOwnershipDuplicateItem);
479 public testing::WithParamInterface<TagError> {};
482 EXPECT_CALL(flash_ctrl_, DataDefaultCfgGet)
483 .WillRepeatedly(Return(default_config));
484 BinaryBlob<owner_block_t> block(basic_owner,
sizeof(basic_owner));
488 block.Find(param.tag)
493 rom_error_t error = owner_block_parse(block.get(), &config, &keyring);
494 EXPECT_EQ(error, param.expect);
497 INSTANTIATE_TEST_SUITE_P(
498 AllCases, OwnerBlockPerTagTest,
499 testing::Values(TagError{kTlvTagOwner, kErrorOwnershipOWNRVersion},
500 TagError{kTlvTagApplicationKey, kErrorOwnershipAPPKVersion},
501 TagError{kTlvTagFlashConfig, kErrorOwnershipFLSHVersion},
502 TagError{kTlvTagInfoConfig, kErrorOwnershipINFOVersion},
503 TagError{kTlvTagRescueConfig, kErrorOwnershipRESQVersion}));
509 .tag = kTlvTagFlashConfig,
519 .access = FLASH_ACCESS(
526 .properties = FLASH_PROP(
539 .tag = kTlvTagFlashConfig,
549 .access = FLASH_ACCESS(
556 .properties = FLASH_PROP(
569 .tag = kTlvTagFlashConfig,
579 .access = FLASH_ACCESS(
586 .properties = FLASH_PROP(
596 .access = FLASH_ACCESS(
603 .properties = FLASH_PROP(
616 .tag = kTlvTagFlashConfig,
626 .access = FLASH_ACCESS(
633 .properties = FLASH_PROP(
643 .access = FLASH_ACCESS(
650 .properties = FLASH_PROP(
663 .tag = kTlvTagFlashConfig,
673 .access = FLASH_ACCESS(
680 .properties = FLASH_PROP(
690 .access = FLASH_ACCESS(
697 .properties = FLASH_PROP(
709 public testing::WithParamInterface<const owner_flash_config_t *> {};
713 EXPECT_CALL(flash_ctrl_, DataDefaultCfgGet)
714 .WillRepeatedly(Return(default_config));
716 rom_error_t error = owner_block_flash_check(param);
717 EXPECT_EQ(error, kErrorOwnershipFlashConfigRomExt);
720 INSTANTIATE_TEST_SUITE_P(AllCases, RomExtFlashConfigTest,
721 testing::Values(&invalid_flash_0, &invalid_flash_1,
722 &invalid_flash_2, &invalid_flash_3,