Home | History | Annotate | Download | only in test
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Permission is hereby granted, free of charge, to any person
      5  * obtaining a copy of this software and associated documentation
      6  * files (the "Software"), to deal in the Software without
      7  * restriction, including without limitation the rights to use, copy,
      8  * modify, merge, publish, distribute, sublicense, and/or sell copies
      9  * of the Software, and to permit persons to whom the Software is
     10  * furnished to do so, subject to the following conditions:
     11  *
     12  * The above copyright notice and this permission notice shall be
     13  * included in all copies or substantial portions of the Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     18  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
     19  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
     20  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     22  * SOFTWARE.
     23  */
     24 
     25 #include <iostream>
     26 
     27 #include <endian.h>
     28 #include <inttypes.h>
     29 #include <string.h>
     30 
     31 #include <base/files/file_util.h>
     32 #include <base/strings/string_util.h>
     33 #include <base/strings/stringprintf.h>
     34 
     35 #include <libavb/libavb.h>
     36 
     37 #include "avb_unittest_util.h"
     38 
     39 namespace avb {
     40 
     41 class VerifyTest : public BaseAvbToolTest {
     42  public:
     43   VerifyTest() {}
     44 
     45  protected:
     46   // Helper function for ModificationDetection test. Modifies
     47   // boot_image_ in a number of places in the sub-array at |offset| of
     48   // size |length| and checks that avb_vbmeta_image_verify() returns
     49   // |expected_result|.
     50   bool test_modification(AvbVBMetaVerifyResult expected_result,
     51                          size_t offset,
     52                          size_t length);
     53 };
     54 
     55 TEST_F(VerifyTest, BootImageStructSize) {
     56   EXPECT_EQ(256UL, sizeof(AvbVBMetaImageHeader));
     57 }
     58 
     59 TEST_F(VerifyTest, CheckSHA256RSA2048) {
     60   GenerateVBMetaImage("vbmeta.img",
     61                       "SHA256_RSA2048",
     62                       0,
     63                       base::FilePath("test/data/testkey_rsa2048.pem"));
     64   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_OK,
     65             avb_vbmeta_image_verify(
     66                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
     67 }
     68 
     69 TEST_F(VerifyTest, CheckSHA256RSA4096) {
     70   GenerateVBMetaImage("vbmeta.img",
     71                       "SHA256_RSA4096",
     72                       0,
     73                       base::FilePath("test/data/testkey_rsa4096.pem"));
     74   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_OK,
     75             avb_vbmeta_image_verify(
     76                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
     77 }
     78 
     79 TEST_F(VerifyTest, CheckSHA256RSA8192) {
     80   GenerateVBMetaImage("vbmeta.img",
     81                       "SHA256_RSA8192",
     82                       0,
     83                       base::FilePath("test/data/testkey_rsa8192.pem"));
     84   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_OK,
     85             avb_vbmeta_image_verify(
     86                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
     87 }
     88 
     89 TEST_F(VerifyTest, CheckSHA512RSA2048) {
     90   GenerateVBMetaImage("vbmeta.img",
     91                       "SHA512_RSA2048",
     92                       0,
     93                       base::FilePath("test/data/testkey_rsa2048.pem"));
     94   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_OK,
     95             avb_vbmeta_image_verify(
     96                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
     97 }
     98 
     99 TEST_F(VerifyTest, CheckSHA512RSA4096) {
    100   GenerateVBMetaImage("vbmeta.img",
    101                       "SHA512_RSA4096",
    102                       0,
    103                       base::FilePath("test/data/testkey_rsa4096.pem"));
    104   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_OK,
    105             avb_vbmeta_image_verify(
    106                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    107 }
    108 
    109 TEST_F(VerifyTest, CheckSHA512RSA8192) {
    110   GenerateVBMetaImage("vbmeta.img",
    111                       "SHA512_RSA8192",
    112                       0,
    113                       base::FilePath("test/data/testkey_rsa8192.pem"));
    114   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_OK,
    115             avb_vbmeta_image_verify(
    116                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    117 }
    118 
    119 TEST_F(VerifyTest, CheckUnsigned) {
    120   GenerateVBMetaImage("vbmeta.img", "", 0, base::FilePath(""));
    121   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_OK_NOT_SIGNED,
    122             avb_vbmeta_image_verify(
    123                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    124 }
    125 
    126 TEST_F(VerifyTest, CheckBiggerLength) {
    127   GenerateVBMetaImage("vbmeta.img",
    128                       "SHA256_RSA2048",
    129                       0,
    130                       base::FilePath("test/data/testkey_rsa2048.pem"));
    131   // Check that it's OK if we pass a bigger length than what the
    132   // header indicates.
    133   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_OK,
    134             avb_vbmeta_image_verify(
    135                 vbmeta_image_.data(), vbmeta_image_.size() + 8192, NULL, NULL));
    136 }
    137 
    138 TEST_F(VerifyTest, BadMagic) {
    139   GenerateVBMetaImage("vbmeta.img",
    140                       "SHA256_RSA2048",
    141                       0,
    142                       base::FilePath("test/data/testkey_rsa2048.pem"));
    143   vbmeta_image_[0] = 'Z';
    144   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    145             avb_vbmeta_image_verify(
    146                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    147 }
    148 
    149 TEST_F(VerifyTest, MajorVersionCheck) {
    150   GenerateVBMetaImage("vbmeta.img",
    151                       "SHA256_RSA2048",
    152                       0,
    153                       base::FilePath("test/data/testkey_rsa2048.pem"));
    154 
    155   // Bail if it's a different major version.
    156   AvbVBMetaImageHeader* h =
    157       reinterpret_cast<AvbVBMetaImageHeader*>(vbmeta_image_.data());
    158   h->required_libavb_version_major = htobe32(1 + AVB_VERSION_MAJOR);
    159   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_UNSUPPORTED_VERSION,
    160             avb_vbmeta_image_verify(
    161                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    162 }
    163 
    164 TEST_F(VerifyTest, MinorVersionCheck) {
    165   GenerateVBMetaImage("vbmeta.img", "", 0, base::FilePath(""));
    166 
    167   // Bail if required_libavb_version_minor exceeds our libavb version.
    168   AvbVBMetaImageHeader* h =
    169       reinterpret_cast<AvbVBMetaImageHeader*>(vbmeta_image_.data());
    170   h->required_libavb_version_minor = htobe32(1 + AVB_VERSION_MINOR);
    171   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_UNSUPPORTED_VERSION,
    172             avb_vbmeta_image_verify(
    173                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    174 }
    175 
    176 TEST_F(VerifyTest, NulTerminatedReleaseString) {
    177   GenerateVBMetaImage("vbmeta.img", "", 0, base::FilePath(""));
    178 
    179   // Bail if |release_string| isn't NUL-terminated.
    180   AvbVBMetaImageHeader* h =
    181       reinterpret_cast<AvbVBMetaImageHeader*>(vbmeta_image_.data());
    182   for (size_t n = 0; n < AVB_RELEASE_STRING_SIZE; n++) {
    183     h->release_string[n] = 'a';
    184   }
    185   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    186             avb_vbmeta_image_verify(
    187                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    188 }
    189 
    190 TEST_F(VerifyTest, BlockSizesAddUpToLessThanLength) {
    191   GenerateVBMetaImage("vbmeta.img",
    192                       "SHA256_RSA2048",
    193                       0,
    194                       base::FilePath("test/data/testkey_rsa2048.pem"));
    195 
    196   AvbVBMetaImageHeader* h =
    197       reinterpret_cast<AvbVBMetaImageHeader*>(vbmeta_image_.data());
    198   AvbVBMetaImageHeader backup = *h;
    199 
    200   // Check that the sum of the two block lengths is less than passed
    201   // in size. Use a size that's a multiple of 64 to avoid failure on
    202   // earlier check.
    203   uint64_t size = vbmeta_image_.size() & (~0x3f);
    204 
    205   h->authentication_data_block_size = htobe64(size);
    206   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    207             avb_vbmeta_image_verify(
    208                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    209   *h = backup;
    210 
    211   h->auxiliary_data_block_size = htobe64(size);
    212   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    213             avb_vbmeta_image_verify(
    214                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    215   *h = backup;
    216 
    217   // Overflow checks - choose overflow candidate so it's a multiple of
    218   // 64 otherwise we'll fail on an earlier check.
    219   size = 0xffffffffffffffc0UL;
    220 
    221   h->authentication_data_block_size = htobe64(size);
    222   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    223             avb_vbmeta_image_verify(
    224                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    225   *h = backup;
    226 
    227   h->auxiliary_data_block_size = htobe64(size);
    228   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    229             avb_vbmeta_image_verify(
    230                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    231   *h = backup;
    232 
    233   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_OK,
    234             avb_vbmeta_image_verify(
    235                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    236 }
    237 
    238 TEST_F(VerifyTest, BlockSizesMultipleOf64) {
    239   GenerateVBMetaImage("vbmeta.img",
    240                       "SHA256_RSA2048",
    241                       0,
    242                       base::FilePath("test/data/testkey_rsa2048.pem"));
    243 
    244   AvbVBMetaImageHeader* h =
    245       reinterpret_cast<AvbVBMetaImageHeader*>(vbmeta_image_.data());
    246   AvbVBMetaImageHeader backup = *h;
    247 
    248   h->authentication_data_block_size =
    249       htobe32(be32toh(h->authentication_data_block_size) - 32);
    250   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    251             avb_vbmeta_image_verify(
    252                 vbmeta_image_.data(), vbmeta_image_.size() - 32, NULL, NULL));
    253   *h = backup;
    254 
    255   h->auxiliary_data_block_size =
    256       htobe32(be32toh(h->auxiliary_data_block_size) - 32);
    257   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    258             avb_vbmeta_image_verify(
    259                 vbmeta_image_.data(), vbmeta_image_.size() - 32, NULL, NULL));
    260   *h = backup;
    261 
    262   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_OK,
    263             avb_vbmeta_image_verify(
    264                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    265 }
    266 
    267 TEST_F(VerifyTest, HashOutOfBounds) {
    268   GenerateVBMetaImage("vbmeta.img",
    269                       "SHA256_RSA2048",
    270                       0,
    271                       base::FilePath("test/data/testkey_rsa2048.pem"));
    272 
    273   AvbVBMetaImageHeader* h =
    274       reinterpret_cast<AvbVBMetaImageHeader*>(vbmeta_image_.data());
    275 
    276   // Check we catch when hash data goes out of bounds.
    277   h->hash_offset = htobe64(4);
    278   h->hash_size = htobe64(be64toh(h->authentication_data_block_size));
    279   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    280             avb_vbmeta_image_verify(
    281                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    282 
    283   // Overflow checks.
    284   h->hash_offset = htobe64(4);
    285   h->hash_size = htobe64(0xfffffffffffffffeUL);
    286   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    287             avb_vbmeta_image_verify(
    288                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    289 }
    290 
    291 TEST_F(VerifyTest, SignatureOutOfBounds) {
    292   GenerateVBMetaImage("vbmeta.img",
    293                       "SHA256_RSA2048",
    294                       0,
    295                       base::FilePath("test/data/testkey_rsa2048.pem"));
    296 
    297   AvbVBMetaImageHeader* h =
    298       reinterpret_cast<AvbVBMetaImageHeader*>(vbmeta_image_.data());
    299 
    300   // Check we catch when signature data goes out of bounds.
    301   h->signature_offset = htobe64(4);
    302   h->signature_size = htobe64(be64toh(h->authentication_data_block_size));
    303   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    304             avb_vbmeta_image_verify(
    305                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    306 
    307   // Overflow checks.
    308   h->signature_offset = htobe64(4);
    309   h->signature_size = htobe64(0xfffffffffffffffeUL);
    310   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    311             avb_vbmeta_image_verify(
    312                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    313 }
    314 
    315 TEST_F(VerifyTest, PublicKeyOutOfBounds) {
    316   GenerateVBMetaImage("vbmeta.img",
    317                       "SHA256_RSA2048",
    318                       0,
    319                       base::FilePath("test/data/testkey_rsa2048.pem"));
    320 
    321   AvbVBMetaImageHeader* h =
    322       reinterpret_cast<AvbVBMetaImageHeader*>(vbmeta_image_.data());
    323 
    324   // Check we catch when public key data goes out of bounds.
    325   h->public_key_offset = htobe64(4);
    326   h->public_key_size = htobe64(be64toh(h->auxiliary_data_block_size));
    327   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    328             avb_vbmeta_image_verify(
    329                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    330 
    331   // Overflow checks.
    332   h->public_key_offset = htobe64(4);
    333   h->public_key_size = htobe64(0xfffffffffffffffeUL);
    334   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    335             avb_vbmeta_image_verify(
    336                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    337 }
    338 
    339 TEST_F(VerifyTest, PublicKeyMetadataOutOfBounds) {
    340   GenerateVBMetaImage("vbmeta.img",
    341                       "SHA256_RSA2048",
    342                       0,
    343                       base::FilePath("test/data/testkey_rsa2048.pem"));
    344 
    345   AvbVBMetaImageHeader* h =
    346       reinterpret_cast<AvbVBMetaImageHeader*>(vbmeta_image_.data());
    347 
    348   // Check we catch when public key metadata data goes out of bounds.
    349   h->public_key_metadata_offset = htobe64(4);
    350   h->public_key_metadata_size = htobe64(be64toh(h->auxiliary_data_block_size));
    351   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    352             avb_vbmeta_image_verify(
    353                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    354 
    355   // Overflow checks.
    356   h->public_key_metadata_offset = htobe64(4);
    357   h->public_key_metadata_size = htobe64(0xfffffffffffffffeUL);
    358   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    359             avb_vbmeta_image_verify(
    360                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    361 }
    362 
    363 TEST_F(VerifyTest, InvalidAlgorithmField) {
    364   GenerateVBMetaImage("vbmeta.img",
    365                       "SHA256_RSA2048",
    366                       0,
    367                       base::FilePath("test/data/testkey_rsa2048.pem"));
    368 
    369   AvbVBMetaImageHeader* h =
    370       reinterpret_cast<AvbVBMetaImageHeader*>(vbmeta_image_.data());
    371   AvbVBMetaImageHeader backup = *h;
    372 
    373   // Check we bail on unknown algorithm.
    374   h->algorithm_type = htobe32(_AVB_ALGORITHM_NUM_TYPES);
    375   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    376             avb_vbmeta_image_verify(
    377                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    378   *h = backup;
    379   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_OK,
    380             avb_vbmeta_image_verify(
    381                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    382 }
    383 
    384 TEST_F(VerifyTest, PublicKeyBlockTooSmall) {
    385   GenerateVBMetaImage("vbmeta.img",
    386                       "SHA256_RSA2048",
    387                       0,
    388                       base::FilePath("test/data/testkey_rsa2048.pem"));
    389 
    390   AvbVBMetaImageHeader* h =
    391       reinterpret_cast<AvbVBMetaImageHeader*>(vbmeta_image_.data());
    392   AvbVBMetaImageHeader backup = *h;
    393 
    394   // Check we bail if the auxiliary data block is too small.
    395   uint64_t change = be64toh(h->auxiliary_data_block_size) - 64;
    396   h->auxiliary_data_block_size = htobe64(change);
    397   EXPECT_EQ(
    398       AVB_VBMETA_VERIFY_RESULT_INVALID_VBMETA_HEADER,
    399       avb_vbmeta_image_verify(
    400           vbmeta_image_.data(), vbmeta_image_.size() - change, NULL, NULL));
    401   *h = backup;
    402   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_OK,
    403             avb_vbmeta_image_verify(
    404                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    405 }
    406 
    407 bool VerifyTest::test_modification(AvbVBMetaVerifyResult expected_result,
    408                                    size_t offset,
    409                                    size_t length) {
    410   uint8_t* d = reinterpret_cast<uint8_t*>(vbmeta_image_.data());
    411   const int kNumCheckpoints = 16;
    412 
    413   // Test |kNumCheckpoints| modifications in the start, middle, and
    414   // end of given sub-array.
    415   for (int n = 0; n <= kNumCheckpoints; n++) {
    416     size_t o = std::min(length * n / kNumCheckpoints, length - 1) + offset;
    417     d[o] ^= 0x80;
    418     AvbVBMetaVerifyResult result = avb_vbmeta_image_verify(
    419         vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL);
    420     d[o] ^= 0x80;
    421     if (result != expected_result) {
    422       return false;
    423     }
    424   }
    425 
    426   return true;
    427 }
    428 
    429 TEST_F(VerifyTest, ModificationDetection) {
    430   GenerateVBMetaImage("vbmeta.img",
    431                       "SHA256_RSA2048",
    432                       0,
    433                       base::FilePath("test/data/testkey_rsa2048.pem"));
    434 
    435   EXPECT_EQ(AVB_VBMETA_VERIFY_RESULT_OK,
    436             avb_vbmeta_image_verify(
    437                 vbmeta_image_.data(), vbmeta_image_.size(), NULL, NULL));
    438 
    439   AvbVBMetaImageHeader h;
    440   avb_vbmeta_image_header_to_host_byte_order(
    441       reinterpret_cast<AvbVBMetaImageHeader*>(vbmeta_image_.data()), &h);
    442 
    443   size_t header_block_offset = 0;
    444   size_t authentication_block_offset =
    445       header_block_offset + sizeof(AvbVBMetaImageHeader);
    446   size_t auxiliary_block_offset =
    447       authentication_block_offset + h.authentication_data_block_size;
    448 
    449   // Ensure we detect modification of the header data block. Do this
    450   // in a field that's not validated so INVALID_VBMETA_HEADER
    451   // isn't returned.
    452   EXPECT_TRUE(test_modification(
    453       AVB_VBMETA_VERIFY_RESULT_HASH_MISMATCH,
    454       offsetof(AvbVBMetaImageHeader, reserved),
    455       sizeof(AvbVBMetaImageHeader) - offsetof(AvbVBMetaImageHeader, reserved)));
    456   // Also check the |reserved| field.
    457   EXPECT_TRUE(test_modification(AVB_VBMETA_VERIFY_RESULT_HASH_MISMATCH,
    458                                 offsetof(AvbVBMetaImageHeader, reserved),
    459                                 sizeof(AvbVBMetaImageHeader().reserved)));
    460 
    461   // Ensure we detect modifications in the auxiliary data block.
    462   EXPECT_TRUE(test_modification(AVB_VBMETA_VERIFY_RESULT_HASH_MISMATCH,
    463                                 auxiliary_block_offset,
    464                                 h.auxiliary_data_block_size));
    465 
    466   // Modifications in the hash part of the Authentication data block
    467   // should also yield HASH_MISMATCH. This is because the hash check
    468   // compares the calculated hash against the stored hash.
    469   EXPECT_TRUE(test_modification(AVB_VBMETA_VERIFY_RESULT_HASH_MISMATCH,
    470                                 authentication_block_offset + h.hash_offset,
    471                                 h.hash_size));
    472 
    473   // Modifications in the signature part of the Authentication data
    474   // block, should not cause a hash mismatch ... but will cause a
    475   // signature mismatch.
    476   EXPECT_TRUE(
    477       test_modification(AVB_VBMETA_VERIFY_RESULT_SIGNATURE_MISMATCH,
    478                         authentication_block_offset + h.signature_offset,
    479                         h.signature_size));
    480 
    481   // Mofications outside the hash and signature parts of the
    482   // Authentication data block are not detected. This is because it's
    483   // not part of the hash calculation.
    484   uint64_t offset = h.signature_offset + h.signature_size;
    485   ASSERT_LT(h.hash_offset, h.signature_offset);
    486   ASSERT_LT(offset + 1, h.authentication_data_block_size);
    487   EXPECT_TRUE(test_modification(AVB_VBMETA_VERIFY_RESULT_OK,
    488                                 authentication_block_offset + offset,
    489                                 h.authentication_data_block_size - offset));
    490 }
    491 
    492 TEST_F(VerifyTest, VBMetaHeaderByteswap) {
    493   AvbVBMetaImageHeader h;
    494   AvbVBMetaImageHeader s;
    495   uint32_t n32;
    496   uint64_t n64;
    497 
    498   n32 = 0x11223344;
    499   n64 = 0x1122334455667788;
    500 
    501   h.required_libavb_version_major = htobe32(n32);
    502   n32++;
    503   h.required_libavb_version_minor = htobe32(n32);
    504   n32++;
    505   h.authentication_data_block_size = htobe64(n64);
    506   n64++;
    507   h.auxiliary_data_block_size = htobe64(n64);
    508   n64++;
    509   h.algorithm_type = htobe32(n32);
    510   n32++;
    511   h.hash_offset = htobe64(n64);
    512   n64++;
    513   h.hash_size = htobe64(n64);
    514   n64++;
    515   h.signature_offset = htobe64(n64);
    516   n64++;
    517   h.signature_size = htobe64(n64);
    518   n64++;
    519   h.public_key_offset = htobe64(n64);
    520   n64++;
    521   h.public_key_size = htobe64(n64);
    522   n64++;
    523   h.public_key_metadata_offset = htobe64(n64);
    524   n64++;
    525   h.public_key_metadata_size = htobe64(n64);
    526   n64++;
    527   h.descriptors_offset = htobe64(n64);
    528   n64++;
    529   h.descriptors_size = htobe64(n64);
    530   n64++;
    531   h.rollback_index = htobe64(n64);
    532   n64++;
    533   h.flags = htobe32(n32);
    534   n32++;
    535 
    536   avb_vbmeta_image_header_to_host_byte_order(&h, &s);
    537 
    538   n32 = 0x11223344;
    539   n64 = 0x1122334455667788;
    540 
    541   EXPECT_EQ(n32, s.required_libavb_version_major);
    542   n32++;
    543   EXPECT_EQ(n32, s.required_libavb_version_minor);
    544   n32++;
    545   EXPECT_EQ(n64, s.authentication_data_block_size);
    546   n64++;
    547   EXPECT_EQ(n64, s.auxiliary_data_block_size);
    548   n64++;
    549   EXPECT_EQ(n32, s.algorithm_type);
    550   n32++;
    551   EXPECT_EQ(n64, s.hash_offset);
    552   n64++;
    553   EXPECT_EQ(n64, s.hash_size);
    554   n64++;
    555   EXPECT_EQ(n64, s.signature_offset);
    556   n64++;
    557   EXPECT_EQ(n64, s.signature_size);
    558   n64++;
    559   EXPECT_EQ(n64, s.public_key_offset);
    560   n64++;
    561   EXPECT_EQ(n64, s.public_key_size);
    562   n64++;
    563   EXPECT_EQ(n64, s.public_key_metadata_offset);
    564   n64++;
    565   EXPECT_EQ(n64, s.public_key_metadata_size);
    566   n64++;
    567   EXPECT_EQ(n64, s.descriptors_offset);
    568   n64++;
    569   EXPECT_EQ(n64, s.descriptors_size);
    570   n64++;
    571   EXPECT_EQ(n64, s.rollback_index);
    572   n64++;
    573   EXPECT_EQ(n32, s.flags);
    574   n32++;
    575 
    576   // If new fields are added, the following will fail. This is to
    577   // remind that byteswapping code (in avb_util.c) and unittests for
    578   // this should be updated.
    579   static_assert(offsetof(AvbVBMetaImageHeader, reserved) == 176,
    580                 "Remember to unittest byteswapping of newly added fields");
    581 }
    582 
    583 }  // namespace avb
    584