/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use, copy,
 * modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

#include <gtest/gtest.h>

#include <libavb_aftl/libavb_aftl.h>

#include "avb_unittest_util.h"
#include "libavb_aftl/avb_aftl_types.h"
#include "libavb_aftl/avb_aftl_util.h"
#include "libavb_aftl/avb_aftl_validate.h"

namespace {

const char kAftlKeyBytesPath[] = "test/data/aftl_key_bytes.bin";
const char kAftlLogSigPath[] = "test/data/aftl_log_sig.bin";

} /* namespace */

namespace avb {

/* Extend BaseAvbToolTest to take advantage of common checks and tooling. */
class AvbAftlValidateTest : public BaseAvbToolTest {
 public:
  AvbAftlValidateTest() {}
  ~AvbAftlValidateTest() {}
  void SetUp() override {
    uint8_t kAftlJsonData[] =
        "{\"timestamp\":{\"seconds\":1581533076,\"nanos\":884246745},\"Value\":"
        "{\"FwInfo\":{\"info\":{\"info\":{\"vbmeta_hash\":"
        "\"mS461dkWuKtPENmqaVQpg/"
        "xoHUPNsqRvnrh1uLUkKCQ=\",\"version_incremental\":\"1\",\"manufacturer_"
        "key_hash\":\"JkjCeRzSiHsHxxiVVieHNEvd9bsehav59qmB4BRvYGs=\"},\"info_"
        "signature\":{\"hash_algorithm\":4,\"signature_algorithm\":1,"
        "\"signature\":\"YqMyK9rOly4dG+"
        "QX3qXwkCedZK8w8iXHX90i0OXV4reCNS8xP51scQoh/"
        "SINWjJQ3hDjIfveQ0SRtY748GeNfrajCDslRAce8f48M3B9Jf5RezbY/MA4ZE/"
        "IfgTQp6sFLPp2xM+RoPd/GMHtEP0zc98+0/7hsDC7wZeGip7HoxGGiaWqpy+zkp/"
        "NpD4aSEIz5gtvBisPI/blQbyPoH6cfNT9rJLvzfHIa6Cp/xpZoY7e2EUH/"
        "XoG6cJGDC3ddPxuLISITQ6ddZkpyhTcA5+xSN8zJxjei1EQOk02Oo9Bqs4srIuO1o/"
        "b91bTteykCK6ScCMt/rSsfxW6N9o/KvNSOr/"
        "csXyIBkeHQZ952MaD8vGNX3NkE+FdOEXBr6AWdAwIuHsjVK1uSp+nR/"
        "kQ2NuXnALXTsM1nB70rnUYdD0cC8OIHvJs9JvV4ATJ/"
        "SQAoGIDdk1up7w6y7+QOtXC+Dd2Y6aul96xiqDRrdza0ZyEzOBPIssNq34dVR+k7+"
        "jofkMsDD/"
        "VT3Ngec17SeZUFfKj1Uv1z6bt6fusfv6Veb84ch0Yx5elLXNfnvvguF0z5qZp+"
        "AjlkUEbhI5sRKrE9v1wV/IFiwYuHNMX3NBuKpx+8e7SXwZodXRBeocpSlA/"
        "Qf8dtomxAALZrB30HSOzYavMs/4=\"}}}}}";
    BaseAvbToolTest::SetUp();

    /* Read in test data from the key and log_sig binaries. */
    base::GetFileSize(base::FilePath(kAftlKeyBytesPath), &key_size_);
    if (key_size_ != AVB_AFTL_PUB_KEY_SIZE) return;
    key_bytes_ = (uint8_t*)avb_malloc(key_size_);
    if (!key_bytes_) return;
    base::ReadFile(
        base::FilePath(kAftlKeyBytesPath), (char*)key_bytes_, key_size_);
    base::GetFileSize(base::FilePath(kAftlLogSigPath), &log_sig_size_);
    if (log_sig_size_ != AVB_AFTL_SIGNATURE_SIZE) return;
    log_sig_bytes_ = (uint8_t*)avb_malloc(log_sig_size_);
    if (!log_sig_bytes_) return;
    base::ReadFile(
        base::FilePath(kAftlLogSigPath), (char*)log_sig_bytes_, log_sig_size_);
    icp_entry_ =
        (AftlIcpEntry*)avb_malloc(sizeof(AftlIcpEntry) + AVB_AFTL_HASH_SIZE);
    if (!icp_entry_) return;
    icp_entry_->log_root_descriptor.version = 1;
    icp_entry_->log_root_descriptor.tree_size = 3;
    icp_entry_->log_root_descriptor.root_hash_size = AVB_AFTL_HASH_SIZE;
    icp_entry_->log_root_descriptor.timestamp = 322325503;
    icp_entry_->log_root_descriptor.revision = 0;
    icp_entry_->log_root_descriptor.metadata_size = 0;
    icp_entry_->log_root_descriptor.metadata = NULL;
    icp_entry_->log_root_descriptor_size =
        icp_entry_->log_root_descriptor.root_hash_size +
        icp_entry_->log_root_descriptor.metadata_size + 29;

    icp_entry_->fw_info_leaf_size = sizeof(kAftlJsonData);
    icp_entry_->fw_info_leaf.vbmeta_hash_size = AVB_AFTL_HASH_SIZE;
    icp_entry_->fw_info_leaf.vbmeta_hash =
        (uint8_t*)avb_malloc(AVB_AFTL_HASH_SIZE);
    if (!icp_entry_->fw_info_leaf.vbmeta_hash) {
      return;
    }
    memcpy(icp_entry_->fw_info_leaf.vbmeta_hash,
           "\x65\xec\x58\x83\x43\x62\x8e\x81\x4d\xc7\x75\xa8\xcb\x77\x1f\x46"
           "\x81\xcc\x79\x6f\xba\x32\xf0\x68\xc7\x17\xce\x2e\xe2\x14\x4d\x39",
           AVB_AFTL_HASH_SIZE);
    icp_entry_->fw_info_leaf.json_data =
        (uint8_t*)avb_calloc(icp_entry_->fw_info_leaf_size);
    if (icp_entry_->fw_info_leaf.json_data == NULL) {
      avb_free(icp_entry_->fw_info_leaf.vbmeta_hash);
      return;
    }
    memcpy(icp_entry_->fw_info_leaf.json_data,
           kAftlJsonData,
           icp_entry_->fw_info_leaf_size);
    icp_entry_->leaf_index = 2;

    memcpy(icp_entry_->proofs[0],
           "\xfa\xc5\x42\x03\xe7\xcc\x69\x6c\xf0\xdf\xcb\x42\xc9\x2a\x1d\x9d"
           "\xba\xf7\x0a\xd9\xe6\x21\xf4\xbd\x8d\x98\x66\x2f\x00\xe3\xc1\x25",
           AVB_AFTL_HASH_SIZE);
    icp_entry_->proof_hash_count = 1;
    icp_entry_->log_root_descriptor.root_hash =
        (uint8_t*)avb_malloc(AVB_AFTL_HASH_SIZE);
    if (!icp_entry_->log_root_descriptor.root_hash) return;
    memcpy(icp_entry_->log_root_descriptor.root_hash,
           "\x5a\xb3\x43\x21\x8f\x54\x4d\x05\x46\x34\x62\x86\x2f\xa8\xf8\x6e"
           "\x3b\xa3\x19\x2d\xe9\x9c\xb2\xab\x8e\x09\xd8\x55\xc3\xde\x34\xd6",
           AVB_AFTL_HASH_SIZE);
  }

  void TearDown() override {
    if (icp_entry_ != NULL) {
      if (icp_entry_->fw_info_leaf.json_data != NULL)
        avb_free(icp_entry_->fw_info_leaf.json_data);
      if (icp_entry_->fw_info_leaf.vbmeta_hash != NULL)
        avb_free(icp_entry_->fw_info_leaf.vbmeta_hash);
      if (icp_entry_->log_root_descriptor.root_hash != NULL)
        avb_free(icp_entry_->log_root_descriptor.root_hash);
      avb_free(icp_entry_);
    }
    avb_free(key_bytes_);
    avb_free(log_sig_bytes_);
    BaseAvbToolTest::TearDown();
  }

 protected:
  AftlIcpEntry* icp_entry_;
  uint8_t* key_bytes_;
  uint8_t* log_sig_bytes_;
  int64_t key_size_;
  int64_t log_sig_size_;
};

TEST_F(AvbAftlValidateTest, AvbAftlVerifySignature) {
  icp_entry_->log_root_sig_size = AVB_AFTL_SIGNATURE_SIZE;
  icp_entry_->log_root_signature =
      (uint8_t*)avb_malloc(AVB_AFTL_SIGNATURE_SIZE);
  memcpy(
      icp_entry_->log_root_signature, log_sig_bytes_, AVB_AFTL_SIGNATURE_SIZE);
  EXPECT_EQ(true,
            avb_aftl_verify_entry_signature(key_bytes_, key_size_, icp_entry_));
  avb_free(icp_entry_->log_root_signature);
}

TEST_F(AvbAftlValidateTest, AvbAftlHashLogRootDescriptor) {
  uint8_t hash[AVB_AFTL_HASH_SIZE];

  /* Initialize the icp_entry components used with the test. */

  avb_aftl_hash_log_root_descriptor(icp_entry_, hash);
  EXPECT_EQ("4f932f328f4b1c9b16500d6d09005c46abebf5c4dc761bbd1e8602378789edac",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE));
}

TEST_F(AvbAftlValidateTest, AvbAftlVerifyIcpRootHash) {
  /* Initialize the icp_entry components used with the test. */
  EXPECT_EQ(true, avb_aftl_verify_icp_root_hash(icp_entry_));
}

// TODO(b/154115873): reenable this test
TEST_F(AvbAftlValidateTest, DISABLED_AftlVerifyVbmetaHash) {
  GenerateVBMetaImage("vbmeta.img",
                      "SHA256_RSA4096",
                      0,
                      base::FilePath("test/data/testkey_rsa4096.pem"));

  EXPECT_EQ(true,
            avb_aftl_verify_vbmeta_hash(
                vbmeta_image_.data(), vbmeta_image_.size(), icp_entry_));
}

TEST_F(AvbAftlValidateTest, AvbAftlRootFromIcp) {
  /* Tests from trillian root_from_icp functionality:
     https://github.com/google/trillian/blob/master/merkle/log_verifier_test.go
  */
  uint64_t leaf_index;
  uint64_t tree_size;
  uint8_t proof[3][AVB_AFTL_HASH_SIZE];
  uint8_t leaf_hash[AVB_AFTL_HASH_SIZE];
  uint8_t hash[AVB_AFTL_HASH_SIZE];

  leaf_index = 0;
  tree_size = 8;
  avb_aftl_rfc6962_hash_leaf((uint8_t*)"", 0, leaf_hash);
  memcpy(proof[0],
         "\x96\xa2\x96\xd2\x24\xf2\x85\xc6\x7b\xee\x93\xc3\x0f\x8a\x30\x91"
         "\x57\xf0\xda\xa3\x5d\xc5\xb8\x7e\x41\x0b\x78\x63\x0a\x09\xcf\xc7",
         AVB_AFTL_HASH_SIZE);
  memcpy(proof[1],
         "\x5f\x08\x3f\x0a\x1a\x33\xca\x07\x6a\x95\x27\x98\x32\x58\x0d\xb3"
         "\xe0\xef\x45\x84\xbd\xff\x1f\x54\xc8\xa3\x60\xf5\x0d\xe3\x03\x1e",
         AVB_AFTL_HASH_SIZE);
  memcpy(proof[2],
         "\x6b\x47\xaa\xf2\x9e\xe3\xc2\xaf\x9a\xf8\x89\xbc\x1f\xb9\x25\x4d"
         "\xab\xd3\x11\x77\xf1\x62\x32\xdd\x6a\xab\x03\x5c\xa3\x9b\xf6\xe4",
         AVB_AFTL_HASH_SIZE);
  avb_aftl_root_from_icp(
      leaf_index, tree_size, proof, 3, leaf_hash, AVB_AFTL_HASH_SIZE, hash);
  EXPECT_EQ("5dc9da79a70659a9ad559cb701ded9a2ab9d823aad2f4960cfe370eff4604328",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE))
      << "Failed on test #1";

  leaf_index = 5;
  tree_size = 8;
  avb_aftl_rfc6962_hash_leaf((uint8_t*)"@ABC", 4, leaf_hash);
  memcpy(proof[0],
         "\xbc\x1a\x06\x43\xb1\x2e\x4d\x2d\x7c\x77\x91\x8f\x44\xe0\xf4\xf7"
         "\x9a\x83\x8b\x6c\xf9\xec\x5b\x5c\x28\x3e\x1f\x4d\x88\x59\x9e\x6b",
         AVB_AFTL_HASH_SIZE);
  memcpy(proof[1],
         "\xca\x85\x4e\xa1\x28\xed\x05\x0b\x41\xb3\x5f\xfc\x1b\x87\xb8\xeb"
         "\x2b\xde\x46\x1e\x9e\x3b\x55\x96\xec\xe6\xb9\xd5\x97\x5a\x0a\xe0",
         AVB_AFTL_HASH_SIZE);
  memcpy(proof[2],
         "\xd3\x7e\xe4\x18\x97\x6d\xd9\x57\x53\xc1\xc7\x38\x62\xb9\x39\x8f"
         "\xa2\xa2\xcf\x9b\x4f\xf0\xfd\xfe\x8b\x30\xcd\x95\x20\x96\x14\xb7",
         AVB_AFTL_HASH_SIZE);
  avb_aftl_root_from_icp(
      leaf_index, tree_size, proof, 3, leaf_hash, AVB_AFTL_HASH_SIZE, hash);
  EXPECT_EQ("5dc9da79a70659a9ad559cb701ded9a2ab9d823aad2f4960cfe370eff4604328",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE))
      << "Failed on test #2";

  leaf_index = 2;
  tree_size = 3;
  avb_aftl_rfc6962_hash_leaf((uint8_t*)"\x10", 1, leaf_hash);
  memcpy(proof[0],
         "\xfa\xc5\x42\x03\xe7\xcc\x69\x6c\xf0\xdf\xcb\x42\xc9\x2a\x1d\x9d"
         "\xba\xf7\x0a\xd9\xe6\x21\xf4\xbd\x8d\x98\x66\x2f\x00\xe3\xc1\x25",
         AVB_AFTL_HASH_SIZE);
  avb_aftl_root_from_icp(
      leaf_index, tree_size, proof, 1, leaf_hash, AVB_AFTL_HASH_SIZE, hash);
  EXPECT_EQ("aeb6bcfe274b70a14fb067a5e5578264db0fa9b51af5e0ba159158f329e06e77",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE))
      << "Failed on test #3";

  leaf_index = 1;
  tree_size = 5;
  avb_aftl_rfc6962_hash_leaf((uint8_t*)"\x00", 1, leaf_hash);
  memcpy(proof[0],
         "\x6e\x34\x0b\x9c\xff\xb3\x7a\x98\x9c\xa5\x44\xe6\xbb\x78\x0a\x2c"
         "\x78\x90\x1d\x3f\xb3\x37\x38\x76\x85\x11\xa3\x06\x17\xaf\xa0\x1d",
         AVB_AFTL_HASH_SIZE);
  memcpy(proof[1],
         "\x5f\x08\x3f\x0a\x1a\x33\xca\x07\x6a\x95\x27\x98\x32\x58\x0d\xb3"
         "\xe0\xef\x45\x84\xbd\xff\x1f\x54\xc8\xa3\x60\xf5\x0d\xe3\x03\x1e",
         AVB_AFTL_HASH_SIZE);
  memcpy(proof[2],
         "\xbc\x1a\x06\x43\xb1\x2e\x4d\x2d\x7c\x77\x91\x8f\x44\xe0\xf4\xf7"
         "\x9a\x83\x8b\x6c\xf9\xec\x5b\x5c\x28\x3e\x1f\x4d\x88\x59\x9e\x6b",
         AVB_AFTL_HASH_SIZE);
  avb_aftl_root_from_icp(
      leaf_index, tree_size, proof, 3, leaf_hash, AVB_AFTL_HASH_SIZE, hash);
  EXPECT_EQ("4e3bbb1f7b478dcfe71fb631631519a3bca12c9aefca1612bfce4c13a86264d4",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE))
      << "Failed on test #4";
}

TEST_F(AvbAftlValidateTest, AvbAftlChainInner) {
  uint8_t hash[AVB_AFTL_HASH_SIZE];
  uint8_t seed[AVB_AFTL_HASH_SIZE];
  uint8_t proof[4][AVB_AFTL_HASH_SIZE];
  uint64_t i;

  for (i = 0; i < AVB_AFTL_HASH_SIZE; i++) {
    hash[i] = 0;
  }

  memcpy(seed, "1234567890abcdefghijklmnopqrstuv", AVB_AFTL_HASH_SIZE);
  memcpy(proof[0], "abcdefghijklmnopqrstuvwxyz123456", AVB_AFTL_HASH_SIZE);
  avb_aftl_chain_inner(seed, AVB_AFTL_HASH_SIZE, (uint8_t*)proof, 1, 0, hash);
  EXPECT_EQ("9cb6af81b146b6a81d911d26f4c0d467265a3385d6caf926d5515e58efd161a3",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE))
      << "Failed with seed: "
      << "\"1234567890abcdefghijklmnopqrstuv\", proof ["
      << "\"abcdefghijklmnopqrstuvwxyz123456\"], and leaf_index 0";
  memcpy(proof[1], "7890abcdefghijklmnopqrstuvwxyz12", AVB_AFTL_HASH_SIZE);
  avb_aftl_chain_inner(seed, AVB_AFTL_HASH_SIZE, (uint8_t*)proof, 2, 0, hash);
  EXPECT_EQ("368d8213cd7d62335a84b3a3d75c8a0302c0d63c93cbbd22c5396dc4c75ba019",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE))
      << "Failed with seed: "
      << "\"1234567890abcdefghijklmnopqrstuv\", proof ["
      << "\"abcdefghijklmnopqrstuvwxyz123456\", "
         "\"7890abcdefghijklmnopqrstuvwxyz12\"],"
      << " and leaf_index 0";
  avb_aftl_chain_inner(seed, AVB_AFTL_HASH_SIZE, (uint8_t*)proof, 2, 1, hash);
  EXPECT_EQ("78418158eb5943c50ec581b41f105ba9aecc1b9e7aba3ea2e93021cbd5bd166e",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE))
      << "Failed with seed: "
      << "\"1234567890abcdefghijklmnopqrstuv\", proof ["
      << "\"abcdefghijklmnopqrstuvwxyz123456\", "
         "\"7890abcdefghijklmnopqrstuvwxyz12\"],"
      << " and leaf_index 1";
  memcpy(proof[2], "abcdefghijklmn0pqrstuvwxyz123456", AVB_AFTL_HASH_SIZE);
  memcpy(proof[3], "7890abcdefgh1jklmnopqrstuvwxyz12", AVB_AFTL_HASH_SIZE);
  avb_aftl_chain_inner(seed, AVB_AFTL_HASH_SIZE, (uint8_t*)proof, 4, 1, hash);
  EXPECT_EQ("83309c48fb92707f5788b6dd4c9a89042dff20856ad9529b7fb8e5cdf47c04f8",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE))
      << "Failed with seed: "
      << "\"1234567890abcdefghijklmnopqrstuv\", proof ["
      << "\"abcdefghijklmnopqrstuvwxyz123456\", "
         "\"7890abcdefghijklmnopqrstuvwxyz12\","
      << "\"abcdefghijklmnopqrstuvwxyz123456\", "
         "\"7890abcdefghijklmnopqrstuvwxyz12\"]"
      << " and leaf_index 1";
  avb_aftl_chain_inner(seed, AVB_AFTL_HASH_SIZE, (uint8_t*)proof, 4, 3, hash);
  EXPECT_EQ("13e5f7e441dc4dbea659acbc989ac33222f4447546e3dac36b0e0c9977d52b97",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE))
      << "Failed with seed: "
      << "\"1234567890abcdefghijklmnopqrstuv\", proof ["
      << "\"abcdefghijklmnopqrstuvwxyz123456\", "
         "\"7890abcdefghijklmnopqrstuvwxyz12\","
      << "\"abcdefghijklmnopqrstuvwxyz123456\", "
         "\"7890abcdefghijklmnopqrstuvwxyz12\"]"
      << " and leaf_index 3";
}

TEST_F(AvbAftlValidateTest, AvbAftlChainBorderRight) {
  uint8_t hash[AVB_AFTL_HASH_SIZE];
  uint8_t seed[AVB_AFTL_HASH_SIZE];
  uint8_t proof[2][AVB_AFTL_HASH_SIZE];
  uint64_t i;

  for (i = 0; i < AVB_AFTL_HASH_SIZE; i++) {
    hash[i] = 0;
  }

  memcpy(seed, "1234567890abcdefghijklmnopqrstuv", AVB_AFTL_HASH_SIZE);
  memcpy(proof[0], "abcdefghijklmnopqrstuvwxyz123456", AVB_AFTL_HASH_SIZE);
  avb_aftl_chain_border_right(
      seed, AVB_AFTL_HASH_SIZE, (uint8_t*)proof, 1, hash);
  EXPECT_EQ("363aa8a62b784be38392ab69ade1aac2562f8989ce8986bec685d2957d657310",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE))
      << "Failed with seed: "
      << "\"1234567890abcdefghijklmnopqrstuv\" and proof "
         "[\"abcdefghijklmnopqrstuvwxyz123456\"]";
  memcpy(proof[1], "7890abcdefghijklmnopqrstuvwxyz12", AVB_AFTL_HASH_SIZE);
  avb_aftl_chain_border_right(
      seed, AVB_AFTL_HASH_SIZE, (uint8_t*)proof, 2, hash);
  EXPECT_EQ("618fc58c45faea808e0bbe0f82afbe7687f4db2608824120e8ade507cbce221f",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE))
      << "Failed with seed: "
      << "\"1234567890abcdefghijklmnopqrstuv\" and proof ["
      << "\"abcdefghijklmnopqrstuvwxyz123456\", "
         "\"7890abcdefghijklmnopqrstuvwxyz12\"]";
}

TEST_F(AvbAftlValidateTest, AvbAftlRFC6962HashChildren) {
  uint8_t hash[AVB_AFTL_HASH_SIZE];

  avb_aftl_rfc6962_hash_children((uint8_t*)"", 0, (uint8_t*)"", 0, hash);
  EXPECT_EQ("4bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE))
      << "Failed on inputs \"\" and \"\"";

  avb_aftl_rfc6962_hash_children((uint8_t*)"abcd", 4, (uint8_t*)"", 0, hash);
  EXPECT_EQ("b75eb7b06e69c1c49597fba37398e0f5ba319c7164ed67bb19b41e9d576313b9",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE))
      << "Failed on inputs \"abcd\" and \"\"";

  avb_aftl_rfc6962_hash_children((uint8_t*)"", 0, (uint8_t*)"efgh", 4, hash);
  EXPECT_EQ("8d65f3e92e3853cee633345caca3e035f01c2e44815371985baed2c45c10ca40",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE))
      << "Failed on inputs \"\" and \"efgh\"";

  avb_aftl_rfc6962_hash_children(
      (uint8_t*)"abcd", 4, (uint8_t*)"efgh", 4, hash);
  EXPECT_EQ("41561b1297f692dad705e28ece8bf47060fba1abeeebda0aa67c43570a36bf79",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE))
      << "Failed on inputs \"abcd\" and \"efgh\"";
}

TEST_F(AvbAftlValidateTest, AvbAftlRFC6962HashLeaf) {
  uint8_t hash[AVB_AFTL_HASH_SIZE];
  avb_aftl_rfc6962_hash_leaf((uint8_t*)"", 0, hash);
  EXPECT_EQ("6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE))
      << "Failed on input \"\"";
  avb_aftl_rfc6962_hash_leaf((uint8_t*)"abcdefg", 7, hash);
  EXPECT_EQ("6b43f785b72386e132b275bc918c25dbc687ab8427836bef6ce4509b64f4f54d",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE))
      << "Failed on input \"abcdefg\"";
}

TEST_F(AvbAftlValidateTest, AvbAftlSha256) {
  /* Computed with:
   *
   * $ echo -n foobar |sha256sum
   * c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2
   */
  uint8_t hash[AVB_AFTL_HASH_SIZE];
  avb_aftl_sha256(NULL, 0, hash);
  EXPECT_EQ("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE));
  avb_aftl_sha256((uint8_t*)"foobar", 6, hash);
  EXPECT_EQ("c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2",
            mem_to_hexstring(hash, AVB_AFTL_HASH_SIZE));
}

TEST_F(AvbAftlValidateTest, AvbAftlCountLeadingZeros) {
  /* Spot checks to ensure aftl_count_leading_zeros is correct. */
  EXPECT_EQ(52ull, avb_aftl_count_leading_zeros(4095))
      << "Failed on input 4095";
  EXPECT_EQ(12ull, avb_aftl_count_leading_zeros(0xfffffffffffff))
      << "Failed on input 0xfffffffffffff";
  EXPECT_EQ(64ull, avb_aftl_count_leading_zeros(0)) << "Failed on input 0";
  EXPECT_EQ(0ull, avb_aftl_count_leading_zeros(0xffffffffffffffff))
      << "Failed on input 0xffffffffffffffff";
}

} /* namespace avb */
