| OLD | NEW |
| (Empty) |
| 1 // Copyright 2013 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 | |
| 5 #include "net/cert/ct_objects_extractor.h" | |
| 6 | |
| 7 #include "base/files/file_path.h" | |
| 8 #include "net/base/test_data_directory.h" | |
| 9 #include "net/cert/ct_log_verifier.h" | |
| 10 #include "net/cert/ct_serialization.h" | |
| 11 #include "net/cert/signed_certificate_timestamp.h" | |
| 12 #include "net/cert/x509_certificate.h" | |
| 13 #include "net/test/cert_test_util.h" | |
| 14 #include "net/test/ct_test_util.h" | |
| 15 #include "testing/gtest/include/gtest/gtest.h" | |
| 16 | |
| 17 namespace net { | |
| 18 | |
| 19 namespace ct { | |
| 20 | |
| 21 class CTObjectsExtractorTest : public ::testing::Test { | |
| 22 public: | |
| 23 void SetUp() override { | |
| 24 precert_chain_ = | |
| 25 CreateCertificateListFromFile(GetTestCertsDirectory(), | |
| 26 "ct-test-embedded-cert.pem", | |
| 27 X509Certificate::FORMAT_AUTO); | |
| 28 ASSERT_EQ(2u, precert_chain_.size()); | |
| 29 | |
| 30 std::string der_test_cert(ct::GetDerEncodedX509Cert()); | |
| 31 test_cert_ = X509Certificate::CreateFromBytes(der_test_cert.data(), | |
| 32 der_test_cert.length()); | |
| 33 | |
| 34 log_ = CTLogVerifier::Create(ct::GetTestPublicKey(), "testlog").Pass(); | |
| 35 ASSERT_TRUE(log_); | |
| 36 } | |
| 37 | |
| 38 void ExtractEmbeddedSCT(scoped_refptr<X509Certificate> cert, | |
| 39 scoped_refptr<SignedCertificateTimestamp>* sct) { | |
| 40 std::string sct_list; | |
| 41 EXPECT_TRUE(ExtractEmbeddedSCTList(cert->os_cert_handle(), &sct_list)); | |
| 42 | |
| 43 std::vector<base::StringPiece> parsed_scts; | |
| 44 base::StringPiece sct_list_sp(sct_list); | |
| 45 // Make sure the SCT list can be decoded properly | |
| 46 EXPECT_TRUE(DecodeSCTList(&sct_list_sp, &parsed_scts)); | |
| 47 | |
| 48 EXPECT_TRUE(DecodeSignedCertificateTimestamp(&parsed_scts[0], sct)); | |
| 49 } | |
| 50 | |
| 51 protected: | |
| 52 CertificateList precert_chain_; | |
| 53 scoped_refptr<X509Certificate> test_cert_; | |
| 54 scoped_ptr<CTLogVerifier> log_; | |
| 55 }; | |
| 56 | |
| 57 // Test that an SCT can be extracted and the extracted SCT contains the | |
| 58 // expected data. | |
| 59 TEST_F(CTObjectsExtractorTest, ExtractEmbeddedSCT) { | |
| 60 scoped_refptr<ct::SignedCertificateTimestamp> sct( | |
| 61 new ct::SignedCertificateTimestamp()); | |
| 62 ExtractEmbeddedSCT(precert_chain_[0], &sct); | |
| 63 | |
| 64 EXPECT_EQ(sct->version, SignedCertificateTimestamp::SCT_VERSION_1); | |
| 65 EXPECT_EQ(ct::GetTestPublicKeyId(), sct->log_id); | |
| 66 | |
| 67 base::Time expected_timestamp = | |
| 68 base::Time::UnixEpoch() + | |
| 69 base::TimeDelta::FromMilliseconds(1365181456275); | |
| 70 EXPECT_EQ(expected_timestamp, sct->timestamp); | |
| 71 } | |
| 72 | |
| 73 TEST_F(CTObjectsExtractorTest, ExtractPrecert) { | |
| 74 LogEntry entry; | |
| 75 ASSERT_TRUE(GetPrecertLogEntry(precert_chain_[0]->os_cert_handle(), | |
| 76 precert_chain_[1]->os_cert_handle(), | |
| 77 &entry)); | |
| 78 | |
| 79 ASSERT_EQ(ct::LogEntry::LOG_ENTRY_TYPE_PRECERT, entry.type); | |
| 80 // Should have empty leaf cert for this log entry type. | |
| 81 ASSERT_TRUE(entry.leaf_certificate.empty()); | |
| 82 // Compare hash values of issuer spki. | |
| 83 SHA256HashValue expected_issuer_key_hash; | |
| 84 memcpy(expected_issuer_key_hash.data, GetDefaultIssuerKeyHash().data(), 32); | |
| 85 ASSERT_TRUE(expected_issuer_key_hash.Equals(entry.issuer_key_hash)); | |
| 86 } | |
| 87 | |
| 88 TEST_F(CTObjectsExtractorTest, ExtractOrdinaryX509Cert) { | |
| 89 LogEntry entry; | |
| 90 ASSERT_TRUE(GetX509LogEntry(test_cert_->os_cert_handle(), &entry)); | |
| 91 | |
| 92 ASSERT_EQ(ct::LogEntry::LOG_ENTRY_TYPE_X509, entry.type); | |
| 93 // Should have empty tbs_certificate for this log entry type. | |
| 94 ASSERT_TRUE(entry.tbs_certificate.empty()); | |
| 95 // Length of leaf_certificate should be 718, see the CT Serialization tests. | |
| 96 ASSERT_EQ(718U, entry.leaf_certificate.size()); | |
| 97 } | |
| 98 | |
| 99 // Test that the embedded SCT verifies | |
| 100 TEST_F(CTObjectsExtractorTest, ExtractedSCTVerifies) { | |
| 101 scoped_refptr<ct::SignedCertificateTimestamp> sct( | |
| 102 new ct::SignedCertificateTimestamp()); | |
| 103 ExtractEmbeddedSCT(precert_chain_[0], &sct); | |
| 104 | |
| 105 LogEntry entry; | |
| 106 ASSERT_TRUE(GetPrecertLogEntry(precert_chain_[0]->os_cert_handle(), | |
| 107 precert_chain_[1]->os_cert_handle(), | |
| 108 &entry)); | |
| 109 | |
| 110 EXPECT_TRUE(log_->Verify(entry, *sct.get())); | |
| 111 } | |
| 112 | |
| 113 // Test that an externally-provided SCT verifies over the LogEntry | |
| 114 // of a regular X.509 Certificate | |
| 115 TEST_F(CTObjectsExtractorTest, ComplementarySCTVerifies) { | |
| 116 scoped_refptr<ct::SignedCertificateTimestamp> sct( | |
| 117 new ct::SignedCertificateTimestamp()); | |
| 118 GetX509CertSCT(&sct); | |
| 119 | |
| 120 LogEntry entry; | |
| 121 ASSERT_TRUE(GetX509LogEntry(test_cert_->os_cert_handle(), &entry)); | |
| 122 | |
| 123 EXPECT_TRUE(log_->Verify(entry, *sct.get())); | |
| 124 } | |
| 125 | |
| 126 // Test that the extractor can parse OCSP responses. | |
| 127 TEST_F(CTObjectsExtractorTest, ExtractSCTListFromOCSPResponse) { | |
| 128 std::string der_subject_cert(ct::GetDerEncodedFakeOCSPResponseCert()); | |
| 129 scoped_refptr<X509Certificate> subject_cert = | |
| 130 X509Certificate::CreateFromBytes(der_subject_cert.data(), | |
| 131 der_subject_cert.length()); | |
| 132 std::string der_issuer_cert(ct::GetDerEncodedFakeOCSPResponseIssuerCert()); | |
| 133 scoped_refptr<X509Certificate> issuer_cert = | |
| 134 X509Certificate::CreateFromBytes(der_issuer_cert.data(), | |
| 135 der_issuer_cert.length()); | |
| 136 | |
| 137 std::string fake_sct_list = ct::GetFakeOCSPExtensionValue(); | |
| 138 ASSERT_FALSE(fake_sct_list.empty()); | |
| 139 std::string ocsp_response = ct::GetDerEncodedFakeOCSPResponse(); | |
| 140 | |
| 141 std::string extracted_sct_list; | |
| 142 EXPECT_TRUE(ct::ExtractSCTListFromOCSPResponse( | |
| 143 issuer_cert->os_cert_handle(), subject_cert->serial_number(), | |
| 144 ocsp_response, &extracted_sct_list)); | |
| 145 EXPECT_EQ(extracted_sct_list, fake_sct_list); | |
| 146 } | |
| 147 | |
| 148 // Test that the extractor honours serial number. | |
| 149 TEST_F(CTObjectsExtractorTest, ExtractSCTListFromOCSPResponseMatchesSerial) { | |
| 150 std::string der_issuer_cert(ct::GetDerEncodedFakeOCSPResponseIssuerCert()); | |
| 151 scoped_refptr<X509Certificate> issuer_cert = | |
| 152 X509Certificate::CreateFromBytes(der_issuer_cert.data(), | |
| 153 der_issuer_cert.length()); | |
| 154 | |
| 155 std::string ocsp_response = ct::GetDerEncodedFakeOCSPResponse(); | |
| 156 | |
| 157 std::string extracted_sct_list; | |
| 158 EXPECT_FALSE(ct::ExtractSCTListFromOCSPResponse( | |
| 159 issuer_cert->os_cert_handle(), test_cert_->serial_number(), | |
| 160 ocsp_response, &extracted_sct_list)); | |
| 161 } | |
| 162 | |
| 163 // Test that the extractor honours issuer ID. | |
| 164 TEST_F(CTObjectsExtractorTest, ExtractSCTListFromOCSPResponseMatchesIssuer) { | |
| 165 std::string der_subject_cert(ct::GetDerEncodedFakeOCSPResponseCert()); | |
| 166 scoped_refptr<X509Certificate> subject_cert = | |
| 167 X509Certificate::CreateFromBytes(der_subject_cert.data(), | |
| 168 der_subject_cert.length()); | |
| 169 | |
| 170 std::string ocsp_response = ct::GetDerEncodedFakeOCSPResponse(); | |
| 171 | |
| 172 std::string extracted_sct_list; | |
| 173 // Use test_cert_ for issuer - it is not the correct issuer of |subject_cert|. | |
| 174 EXPECT_FALSE(ct::ExtractSCTListFromOCSPResponse( | |
| 175 test_cert_->os_cert_handle(), subject_cert->serial_number(), | |
| 176 ocsp_response, &extracted_sct_list)); | |
| 177 } | |
| 178 | |
| 179 } // namespace ct | |
| 180 | |
| 181 } // namespace net | |
| OLD | NEW |