|  | // Copyright 2016 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "net/cert/cert_verifier.h" | 
|  |  | 
|  | #include "base/files/file_path.h" | 
|  | #include "base/memory/ref_counted.h" | 
|  | #include "net/cert/x509_certificate.h" | 
|  | #include "net/cert/x509_util.h" | 
|  | #include "net/test/cert_test_util.h" | 
|  | #include "net/test/test_data_directory.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | namespace net { | 
|  |  | 
|  | TEST(CertVerifierTest, RequestParamsComparators) { | 
|  | const scoped_refptr<X509Certificate> ok_cert = | 
|  | ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"); | 
|  | ASSERT_TRUE(ok_cert.get()); | 
|  |  | 
|  | const scoped_refptr<X509Certificate> expired_cert = | 
|  | ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem"); | 
|  | ASSERT_TRUE(expired_cert.get()); | 
|  |  | 
|  | const scoped_refptr<X509Certificate> root_cert = | 
|  | ImportCertFromFile(GetTestCertsDirectory(), "root_ca_cert.pem"); | 
|  | ASSERT_TRUE(root_cert.get()); | 
|  |  | 
|  | // Create a certificate that contains both a leaf and an | 
|  | // intermediate/root. | 
|  | std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> chain; | 
|  | chain.push_back(bssl::UpRef(root_cert->cert_buffer())); | 
|  | const scoped_refptr<X509Certificate> combined_cert = | 
|  | X509Certificate::CreateFromBuffer(bssl::UpRef(ok_cert->cert_buffer()), | 
|  | std::move(chain)); | 
|  | ASSERT_TRUE(combined_cert.get()); | 
|  |  | 
|  | struct { | 
|  | // Keys to test | 
|  | CertVerifier::RequestParams key1; | 
|  | CertVerifier::RequestParams key2; | 
|  |  | 
|  | // Whether or not |key1| and |key2| are expected to be equal. | 
|  | bool equal; | 
|  | } tests[] = { | 
|  | { | 
|  | // Test for basic equivalence. | 
|  | CertVerifier::RequestParams(ok_cert, "www.example.test", 0, | 
|  | std::string()), | 
|  | CertVerifier::RequestParams(ok_cert, "www.example.test", 0, | 
|  | std::string()), | 
|  | true, | 
|  | }, | 
|  | { | 
|  | // Test that different certificates but with the same CA and for | 
|  | // the same host are different validation keys. | 
|  | CertVerifier::RequestParams(ok_cert, "www.example.test", 0, | 
|  | std::string()), | 
|  | CertVerifier::RequestParams(expired_cert, "www.example.test", 0, | 
|  | std::string()), | 
|  | false, | 
|  | }, | 
|  | { | 
|  | // Test that the same EE certificate for the same host, but with | 
|  | // different chains are different validation keys. | 
|  | CertVerifier::RequestParams(ok_cert, "www.example.test", 0, | 
|  | std::string()), | 
|  | CertVerifier::RequestParams(combined_cert, "www.example.test", 0, | 
|  | std::string()), | 
|  | false, | 
|  | }, | 
|  | { | 
|  | // The same certificate, with the same chain, but for different | 
|  | // hosts are different validation keys. | 
|  | CertVerifier::RequestParams(ok_cert, "www1.example.test", 0, | 
|  | std::string()), | 
|  | CertVerifier::RequestParams(ok_cert, "www2.example.test", 0, | 
|  | std::string()), | 
|  | false, | 
|  | }, | 
|  | { | 
|  | // The same certificate, chain, and host, but with different flags | 
|  | // are different validation keys. | 
|  | CertVerifier::RequestParams( | 
|  | ok_cert, "www.example.test", | 
|  | CertVerifier::VERIFY_DISABLE_NETWORK_FETCHES, std::string()), | 
|  | CertVerifier::RequestParams(ok_cert, "www.example.test", 0, | 
|  | std::string()), | 
|  | false, | 
|  | }, | 
|  | { | 
|  | // Different OCSP responses. | 
|  | CertVerifier::RequestParams(ok_cert, "www.example.test", 0, | 
|  | "ocsp response"), | 
|  | CertVerifier::RequestParams(ok_cert, "www.example.test", 0, | 
|  | std::string()), | 
|  | false, | 
|  | }, | 
|  | }; | 
|  | for (const auto& test : tests) { | 
|  | const CertVerifier::RequestParams& key1 = test.key1; | 
|  | const CertVerifier::RequestParams& key2 = test.key2; | 
|  |  | 
|  | // Ensure that the keys are equivalent to themselves. | 
|  | EXPECT_FALSE(key1 < key1); | 
|  | EXPECT_FALSE(key2 < key2); | 
|  |  | 
|  | if (test.equal) { | 
|  | EXPECT_TRUE(!(key1 < key2) && !(key2 < key1)); | 
|  | } else { | 
|  | EXPECT_TRUE((key1 < key2) || (key2 < key1)); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | }  // namespace net |