|  | // Copyright 2013 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 <utility> | 
|  |  | 
|  | #include "base/callback_helpers.h" | 
|  | #include "base/logging.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/memory/ref_counted.h" | 
|  | #include "base/stl_util.h" | 
|  | #include "base/strings/stringprintf.h" | 
|  | #include "net/base/net_errors.h" | 
|  | #include "net/base/test_completion_callback.h" | 
|  | #include "net/cert/cert_status_flags.h" | 
|  | #include "net/cert/cert_verifier.h" | 
|  | #include "net/cert/cert_verify_result.h" | 
|  | #include "net/cert/ct_policy_enforcer.h" | 
|  | #include "net/cert/ct_verifier.h" | 
|  | #include "net/cert/mock_cert_verifier.h" | 
|  | #include "net/cert/multi_log_ct_verifier.h" | 
|  | #include "net/cert/test_root_certs.h" | 
|  | #include "net/cert/x509_certificate.h" | 
|  | #include "net/cert/x509_util.h" | 
|  | #include "net/http/transport_security_state.h" | 
|  | #include "net/log/net_log_with_source.h" | 
|  | #include "net/quic/crypto/proof_source_chromium.h" | 
|  | #include "net/quic/crypto/proof_verifier_chromium.h" | 
|  | #include "net/ssl/ssl_config_service.h" | 
|  | #include "net/test/cert_test_util.h" | 
|  | #include "net/test/test_data_directory.h" | 
|  | #include "net/third_party/quic/core/crypto/crypto_utils.h" | 
|  | #include "net/third_party/quic/test_tools/crypto_test_utils.h" | 
|  |  | 
|  | using std::string; | 
|  |  | 
|  | namespace net { | 
|  |  | 
|  | namespace test { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | class TestProofVerifierChromium : public ProofVerifierChromium { | 
|  | public: | 
|  | TestProofVerifierChromium( | 
|  | std::unique_ptr<CertVerifier> cert_verifier, | 
|  | std::unique_ptr<TransportSecurityState> transport_security_state, | 
|  | std::unique_ptr<CTVerifier> cert_transparency_verifier, | 
|  | std::unique_ptr<CTPolicyEnforcer> ct_policy_enforcer, | 
|  | const std::string& cert_file) | 
|  | : ProofVerifierChromium(cert_verifier.get(), | 
|  | ct_policy_enforcer.get(), | 
|  | transport_security_state.get(), | 
|  | cert_transparency_verifier.get()), | 
|  | cert_verifier_(std::move(cert_verifier)), | 
|  | transport_security_state_(std::move(transport_security_state)), | 
|  | cert_transparency_verifier_(std::move(cert_transparency_verifier)), | 
|  | ct_policy_enforcer_(std::move(ct_policy_enforcer)) { | 
|  | // Load and install the root for the validated chain. | 
|  | scoped_refptr<X509Certificate> root_cert = | 
|  | ImportCertFromFile(GetTestCertsDirectory(), cert_file); | 
|  | scoped_root_.Reset(root_cert.get()); | 
|  | } | 
|  |  | 
|  | ~TestProofVerifierChromium() override {} | 
|  |  | 
|  | CertVerifier* cert_verifier() { return cert_verifier_.get(); } | 
|  |  | 
|  | private: | 
|  | ScopedTestRoot scoped_root_; | 
|  | std::unique_ptr<CertVerifier> cert_verifier_; | 
|  | std::unique_ptr<TransportSecurityState> transport_security_state_; | 
|  | std::unique_ptr<CTVerifier> cert_transparency_verifier_; | 
|  | std::unique_ptr<CTPolicyEnforcer> ct_policy_enforcer_; | 
|  | }; | 
|  |  | 
|  | }  // namespace | 
|  | }  // namespace test | 
|  | }  // namespace net | 
|  |  | 
|  | namespace quic { | 
|  | namespace test { | 
|  | namespace crypto_test_utils { | 
|  |  | 
|  | std::unique_ptr<quic::ProofSource> ProofSourceForTesting() { | 
|  | std::unique_ptr<net::ProofSourceChromium> source( | 
|  | new net::ProofSourceChromium()); | 
|  | base::FilePath certs_dir = net::GetTestCertsDirectory(); | 
|  | CHECK(source->Initialize(certs_dir.AppendASCII("quic-chain.pem"), | 
|  | certs_dir.AppendASCII("quic-leaf-cert.key"), | 
|  | certs_dir.AppendASCII("quic-leaf-cert.key.sct"))); | 
|  | return std::move(source); | 
|  | } | 
|  |  | 
|  | std::unique_ptr<quic::ProofVerifier> ProofVerifierForTesting() { | 
|  | // TODO(rch): use a real cert verifier? | 
|  | std::unique_ptr<net::MockCertVerifier> cert_verifier( | 
|  | new net::MockCertVerifier()); | 
|  | net::CertVerifyResult verify_result; | 
|  | verify_result.verified_cert = | 
|  | net::ImportCertFromFile(net::GetTestCertsDirectory(), "quic-chain.pem"); | 
|  | cert_verifier->AddResultForCertAndHost(verify_result.verified_cert.get(), | 
|  | "test.example.com", verify_result, | 
|  | net::OK); | 
|  | return std::make_unique<net::test::TestProofVerifierChromium>( | 
|  | std::move(cert_verifier), std::make_unique<net::TransportSecurityState>(), | 
|  | std::make_unique<net::MultiLogCTVerifier>(), | 
|  | std::make_unique<net::DefaultCTPolicyEnforcer>(), "quic-root.pem"); | 
|  | } | 
|  |  | 
|  | std::unique_ptr<quic::ProofVerifyContext> ProofVerifyContextForTesting() { | 
|  | return std::make_unique<net::ProofVerifyContextChromium>( | 
|  | /*cert_verify_flags=*/0, net::NetLogWithSource()); | 
|  | } | 
|  |  | 
|  | }  // namespace crypto_test_utils | 
|  |  | 
|  | }  // namespace test | 
|  |  | 
|  | }  // namespace quic |