5 #include "sw/device/silicon_creator/lib/boot_data.h"
10 #include "gtest/gtest.h"
11 #include "sw/device/silicon_creator/lib/drivers/mock_flash_ctrl.h"
12 #include "sw/device/silicon_creator/lib/drivers/mock_hmac.h"
13 #include "sw/device/silicon_creator/lib/drivers/mock_otp.h"
14 #include "sw/device/silicon_creator/testing/rom_test.h"
16 #include "flash_ctrl_regs.h"
18 #include "otp_ctrl_regs.h"
32 .
digest = {kBootDataIdentifier, kBootDataIdentifier, kBootDataIdentifier,
33 0x00000000, 0x11111111, 0x22222222, 0x33333333, 0x44444444},
34 .is_valid = kBootDataValidEntry,
35 .identifier = kBootDataIdentifier,
36 .version = kBootDataVersion2,
37 .counter = kBootDataDefaultCounterVal,
38 .min_security_version_rom_ext = 0,
39 .min_security_version_bl0 = 0,
40 .primary_bl0_slot = kBootSlotA,
47 .
digest = {kBootDataIdentifier, kBootDataIdentifier, kBootDataIdentifier,
48 0x44444444, 0x33333333, 0x22222222, 0x11111111, 0x00000000},
49 .is_valid = kBootDataValidEntry,
50 .identifier = kBootDataIdentifier,
51 .version = kBootDataVersion2,
52 .counter = kBootDataDefaultCounterVal + 1,
53 .min_security_version_rom_ext = 0,
54 .min_security_version_bl0 = 0,
55 .primary_bl0_slot = kBootSlotA,
62 .
digest = {kBootDataIdentifier, kBootDataIdentifier, kBootDataIdentifier,
63 0x00000000, 0x11111111, 0x22222222, 0x33333333, 0x44444444},
64 .is_valid = kBootDataValidEntry,
65 .identifier = kBootDataIdentifier,
66 .version = kBootDataVersion1,
67 .counter = kBootDataDefaultCounterVal,
68 .min_security_version_rom_ext = 0,
69 .min_security_version_bl0 = 0,
76 .
digest = {kBootDataIdentifier, kBootDataIdentifier, kBootDataIdentifier,
77 0xcc761df1, 0xff42f0f2, 0x3f1955ee, 0x9465b3e7, 0x81ce0fdb},
78 .is_valid = kBootDataValidEntry,
79 .identifier = kBootDataIdentifier,
80 .version = kBootDataVersion2,
81 .counter = kBootDataDefaultCounterVal,
82 .min_security_version_rom_ext = 0x01234567,
83 .min_security_version_bl0 = 0x89abcdef,
84 .primary_bl0_slot = kBootSlotA,
87 namespace boot_data_unittest {
90 using ::testing::DoAll;
91 using ::testing::Return;
92 using ::testing::SetArgPointee;
96 rom_test::MockFlashCtrl flash_ctrl_;
97 rom_test::MockHmac hmac_;
98 rom_test::MockOtp otp_;
101 std::array<uint32_t, kBootDataNumWords> erased_entry_ = {};
103 std::array<uint32_t, kBootDataNumWords> non_erased_entry_ = {};
105 std::array<uint32_t, kBootDataNumWords> part_erased_entry_ = {};
108 std::fill_n(erased_entry_.begin(), kBootDataNumWords, kFlashCtrlErasedWord);
109 std::fill_n(non_erased_entry_.begin(), kBootDataNumWords, 0x01234567);
110 std::fill_n(part_erased_entry_.begin(), kBootDataNumWords, 0x01234567);
111 std::fill_n(part_erased_entry_.begin(), 3, kFlashCtrlErasedWord);
129 std::array<uint32_t, kBootDataNumWords> data,
139 EXPECT_CALL(flash_ctrl_, InfoRead(page, offset, kBootDataNumWords, _))
140 .WillOnce([data, error](
auto,
auto,
auto,
void *out) {
141 uint32_t *out_words =
static_cast<uint32_t *
>(out);
142 std::copy_n(data.begin(), kBootDataNumWords, out_words);
158 std::array<uint32_t, N> data, rom_error_t error) {
159 static_assert(N > 3,
"Data must be at least three words for a sniff");
161 constexpr uint32_t kIsValidOffset = offsetof(
boot_data_t, is_valid);
162 size_t offset = index *
sizeof(
boot_data_t) + kIsValidOffset;
166 EXPECT_CALL(flash_ctrl_, InfoRead(page, offset, 3, _))
167 .WillOnce([data, error](
auto,
auto,
auto,
void *out) {
168 uint32_t *out_words =
static_cast<uint32_t *
>(out);
169 std::copy_n(data.begin(), 3, out_words);
182 constexpr
size_t kDigestRegionSize =
188 digest.digest[0] += 1;
192 EXPECT_CALL(hmac_, sha256(_, kDigestRegionSize, _))
193 .WillOnce(DoAll([
boot_data, kDigestRegionSize, digest](
194 const void *digest_region,
size_t size,
198 reinterpret_cast<const char *
>(&
boot_data) + kDigestRegionOffset,
200 EXPECT_EQ(digest_region_cmp, 0);
201 EXPECT_EQ(size, kDigestRegionSize);
218 .
read = read ? kMultiBitBool4True : kMultiBitBool4False,
219 .write = write ? kMultiBitBool4True : kMultiBitBool4False,
220 .erase = erase ? kMultiBitBool4True : kMultiBitBool4False,
222 EXPECT_CALL(flash_ctrl_, InfoPermsSet(page, perms));
239 ExpectPermsSet(page,
true,
false,
false);
241 ExpectPermsSet(page,
false,
false,
false);
255 static_assert(
sizeof(uint32_t) * kBootDataNumWords ==
sizeof(
boot_data_t),
256 "`kBootDataNumWords` must match size of `boot_data_t`");
259 std::array<uint32_t, kBootDataNumWords> boot_data_raw = {};
270 ExpectSniff(page, 0, non_erased_entry_, kErrorOk);
271 ExpectSniff(page, 1, boot_data_raw, kErrorOk);
272 ExpectSniff(page, 2, boot_data_raw, kErrorOk);
273 ExpectSniff(page, 3, part_erased_entry_, kErrorOk);
274 ExpectRead(page, 3, part_erased_entry_, kErrorOk);
275 ExpectSniff(page, 4, erased_entry_, kErrorOk);
276 ExpectRead(page, 4, erased_entry_, kErrorOk);
279 ExpectRead(page, 2, boot_data_raw, kErrorOk);
283 ExpectRead(page, 1, boot_data_raw, kErrorOk);
284 ExpectDigestCompute(
boot_data, valid_digest);
294 return [
this](
auto page) {
295 ExpectSniff(page, 0, erased_entry_, kErrorOk);
296 ExpectRead(page, 0, erased_entry_, kErrorOk);
310 OTP_CTRL_PARAM_CREATOR_SW_CFG_DEFAULT_BOOT_DATA_IN_PROD_EN_OFFSET))
321 otp_, read32(OTP_CTRL_PARAM_CREATOR_SW_CFG_MIN_SEC_VER_ROM_EXT_OFFSET))
324 read32(OTP_CTRL_PARAM_CREATOR_SW_CFG_MIN_SEC_VER_BL0_OFFSET))
327 ExpectDigestCompute(kDefaultEntry,
true);
335 ExpectPageScan(&kFlashCtrlInfoPageBootData0, EntryPage(kValidEntry0));
336 ExpectPageScan(&kFlashCtrlInfoPageBootData1, EntryPage(kValidEntry1));
339 EXPECT_EQ(boot_data_read(kLcStateTest, &
boot_data), kErrorOk);
344 TEST_F(BootDataReadTest, ReadBothValidTest2) {
346 ExpectPageScan(&kFlashCtrlInfoPageBootData0, EntryPage(kValidEntry1));
347 ExpectPageScan(&kFlashCtrlInfoPageBootData1, EntryPage(kValidEntry0));
350 EXPECT_EQ(boot_data_read(kLcStateTest, &
boot_data), kErrorOk);
355 TEST_F(BootDataReadTest, ReadOneEntryTest) {
357 ExpectPageScan(&kFlashCtrlInfoPageBootData0, EntryPage(kValidEntry0));
358 ExpectPageScan(&kFlashCtrlInfoPageBootData1, ErasedPage());
361 EXPECT_EQ(boot_data_read(kLcStateTest, &
boot_data), kErrorOk);
365 TEST_F(BootDataReadTest, ReadOneValidTest) {
367 ExpectPageScan(&kFlashCtrlInfoPageBootData0, EntryPage(kValidEntry0));
368 ExpectPageScan(&kFlashCtrlInfoPageBootData1, EntryPage(kValidEntry1,
false));
371 EXPECT_EQ(boot_data_read(kLcStateTest, &
boot_data), kErrorOk);
377 TEST_F(BootDataReadTest, ReadErasedDefaultTest) {
379 ExpectPageScan(&kFlashCtrlInfoPageBootData0, ErasedPage());
380 ExpectPageScan(&kFlashCtrlInfoPageBootData1, ErasedPage());
383 ExpectAllowedInProdCheck(
false);
384 ExpectDefaultEntryRead();
387 EXPECT_EQ(boot_data_read(kLcStateTest, &
boot_data), kErrorOk);
391 TEST_F(BootDataReadTest, ReadInvalidDefaultTest) {
393 ExpectPageScan(&kFlashCtrlInfoPageBootData0, EntryPage(kValidEntry0,
false));
394 ExpectPageScan(&kFlashCtrlInfoPageBootData1, EntryPage(kValidEntry1,
false));
397 ExpectAllowedInProdCheck(
false);
398 ExpectDefaultEntryRead();
401 EXPECT_EQ(boot_data_read(kLcStateTest, &
boot_data), kErrorOk);
405 TEST_F(BootDataReadTest, ReadDefaultAllowedInProdTest) {
407 ExpectPageScan(&kFlashCtrlInfoPageBootData0, ErasedPage());
408 ExpectPageScan(&kFlashCtrlInfoPageBootData1, ErasedPage());
411 ExpectAllowedInProdCheck(
true);
412 ExpectDefaultEntryRead();
415 EXPECT_EQ(boot_data_read(kLcStateProd, &
boot_data), kErrorOk);
419 TEST_F(BootDataReadTest, ReadDefaultNotAllowedInProdTest) {
421 ExpectPageScan(&kFlashCtrlInfoPageBootData0, ErasedPage());
422 ExpectPageScan(&kFlashCtrlInfoPageBootData1, ErasedPage());
425 ExpectAllowedInProdCheck(
false);
429 EXPECT_EQ(boot_data_read(kLcStateProd, &
boot_data), kErrorBootDataNotFound);
432 TEST_F(BootDataReadTest, ReadV1AsV2Test) {
434 ExpectPageScan(&kFlashCtrlInfoPageBootData0, EntryPage(kValidEntryV1));
435 ExpectPageScan(&kFlashCtrlInfoPageBootData1, ErasedPage());
438 ExpectDigestCompute(kValidEntry0,
true);
442 EXPECT_EQ(boot_data_read(kLcStateTest, &
boot_data), kErrorOk);