blob: ce5ae71beae46c5b34c22c2f08344d6c4d55e49e [file] [log] [blame]
/*
* 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_));
}
TEST_F(AvbAftlValidateTest, 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 */