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);