merkle_tree_leaf_unittest.cc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/cert/merkle_tree_leaf.h"
  5. #include <string.h>
  6. #include <string>
  7. #include "base/strings/string_number_conversions.h"
  8. #include "net/cert/x509_certificate.h"
  9. #include "net/test/cert_test_util.h"
  10. #include "net/test/ct_test_util.h"
  11. #include "net/test/test_data_directory.h"
  12. #include "testing/gmock/include/gmock/gmock.h"
  13. #include "testing/gtest/include/gtest/gtest.h"
  14. namespace net::ct {
  15. namespace {
  16. MATCHER_P(HexEq, hexStr, "") {
  17. std::vector<uint8_t> bytes;
  18. if (!base::HexStringToBytes(hexStr, &bytes)) {
  19. *result_listener << "expected value was not a valid hex string";
  20. return false;
  21. }
  22. if (bytes.size() != arg.size()) {
  23. *result_listener << "expected and actual are different lengths";
  24. return false;
  25. }
  26. // Make sure we don't pass nullptrs to memcmp
  27. if (arg.empty())
  28. return true;
  29. // Print hex string (easier to read than default GTest representation)
  30. *result_listener << "a.k.a. 0x" << base::HexEncode(arg.data(), arg.size());
  31. return memcmp(arg.data(), bytes.data(), bytes.size()) == 0;
  32. }
  33. class MerkleTreeLeafTest : public ::testing::Test {
  34. public:
  35. void SetUp() override {
  36. std::string der_test_cert(ct::GetDerEncodedX509Cert());
  37. test_cert_ = X509Certificate::CreateFromBytes(
  38. base::as_bytes(base::make_span(der_test_cert)));
  39. ASSERT_TRUE(test_cert_);
  40. GetX509CertSCT(&x509_sct_);
  41. x509_sct_->origin = SignedCertificateTimestamp::SCT_FROM_OCSP_RESPONSE;
  42. test_precert_ = CreateCertificateChainFromFile(
  43. GetTestCertsDirectory(), "ct-test-embedded-cert.pem",
  44. X509Certificate::FORMAT_AUTO);
  45. ASSERT_TRUE(test_precert_);
  46. ASSERT_EQ(1u, test_precert_->intermediate_buffers().size());
  47. GetPrecertSCT(&precert_sct_);
  48. precert_sct_->origin = SignedCertificateTimestamp::SCT_EMBEDDED;
  49. }
  50. protected:
  51. scoped_refptr<SignedCertificateTimestamp> x509_sct_;
  52. scoped_refptr<SignedCertificateTimestamp> precert_sct_;
  53. scoped_refptr<X509Certificate> test_cert_;
  54. scoped_refptr<X509Certificate> test_precert_;
  55. };
  56. TEST_F(MerkleTreeLeafTest, CreatesForX509Cert) {
  57. MerkleTreeLeaf leaf;
  58. ASSERT_TRUE(GetMerkleTreeLeaf(test_cert_.get(), x509_sct_.get(), &leaf));
  59. EXPECT_EQ(SignedEntryData::LOG_ENTRY_TYPE_X509, leaf.signed_entry.type);
  60. EXPECT_FALSE(leaf.signed_entry.leaf_certificate.empty());
  61. EXPECT_TRUE(leaf.signed_entry.tbs_certificate.empty());
  62. EXPECT_EQ(x509_sct_->timestamp, leaf.timestamp);
  63. EXPECT_EQ(x509_sct_->extensions, leaf.extensions);
  64. }
  65. TEST_F(MerkleTreeLeafTest, CreatesForPrecert) {
  66. MerkleTreeLeaf leaf;
  67. ASSERT_TRUE(
  68. GetMerkleTreeLeaf(test_precert_.get(), precert_sct_.get(), &leaf));
  69. EXPECT_EQ(SignedEntryData::LOG_ENTRY_TYPE_PRECERT, leaf.signed_entry.type);
  70. EXPECT_FALSE(leaf.signed_entry.tbs_certificate.empty());
  71. EXPECT_TRUE(leaf.signed_entry.leaf_certificate.empty());
  72. EXPECT_EQ(precert_sct_->timestamp, leaf.timestamp);
  73. EXPECT_EQ(precert_sct_->extensions, leaf.extensions);
  74. }
  75. TEST_F(MerkleTreeLeafTest, DoesNotCreateForEmbeddedSCTButNotPrecert) {
  76. MerkleTreeLeaf leaf;
  77. ASSERT_FALSE(GetMerkleTreeLeaf(test_cert_.get(), precert_sct_.get(), &leaf));
  78. }
  79. // Expected hashes calculated by:
  80. // 1. Writing the serialized tree leaves from
  81. // CtSerialization::EncodesLogEntryFor{X509Cert,Precert} to files.
  82. // 2. Prepending a zero byte to both files.
  83. // 3. Passing each file through the sha256sum tool.
  84. TEST_F(MerkleTreeLeafTest, HashForX509Cert) {
  85. MerkleTreeLeaf leaf;
  86. ct::GetX509CertTreeLeaf(&leaf);
  87. std::string hash;
  88. ASSERT_TRUE(HashMerkleTreeLeaf(leaf, &hash));
  89. EXPECT_THAT(hash, HexEq("452da788b3b8d15872ff0bb0777354b2a7f1c1887b5633201e76"
  90. "2ba5a4b143fc"));
  91. }
  92. TEST_F(MerkleTreeLeafTest, HashForPrecert) {
  93. MerkleTreeLeaf leaf;
  94. ct::GetPrecertTreeLeaf(&leaf);
  95. std::string hash;
  96. ASSERT_TRUE(HashMerkleTreeLeaf(leaf, &hash));
  97. EXPECT_THAT(hash, HexEq("257ae85f08810445511e35e33f7aee99ee19407971e35e95822b"
  98. "bf42a74be223"));
  99. }
  100. } // namespace
  101. } // namespace net::ct