Index: net/tools/cert_verify_tool/verify_using_path_builder.cc |
diff --git a/net/tools/cert_verify_tool/verify_using_path_builder.cc b/net/tools/cert_verify_tool/verify_using_path_builder.cc |
index 206eb74b065f85b8f2c94504412b23d905b01d22..3e9d653bb05dce89de616a67e0d2bd69b4c063e1 100644 |
--- a/net/tools/cert_verify_tool/verify_using_path_builder.cc |
+++ b/net/tools/cert_verify_tool/verify_using_path_builder.cc |
@@ -9,8 +9,9 @@ |
#include "base/memory/ptr_util.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_util.h" |
+#include "base/threading/thread.h" |
#include "crypto/sha2.h" |
-#include "net/base/test_completion_callback.h" |
+#include "net/cert/cert_net_fetcher.h" |
#include "net/cert/internal/cert_issuer_source_aia.h" |
#include "net/cert/internal/cert_issuer_source_static.h" |
#include "net/cert/internal/parse_name.h" |
@@ -23,6 +24,7 @@ |
#include "net/tools/cert_verify_tool/cert_verify_tool_util.h" |
#include "net/url_request/url_request_context.h" |
#include "net/url_request/url_request_context_builder.h" |
+#include "net/url_request/url_request_context_getter.h" |
#if defined(USE_NSS_CERTS) |
#include "base/threading/thread_task_runner_handle.h" |
@@ -167,6 +169,57 @@ scoped_refptr<net::ParsedCertificate> ParseCertificate(const CertInput& input) { |
return cert; |
} |
+class URLRequestContextGetterForAia : public net::URLRequestContextGetter { |
+ public: |
+ URLRequestContextGetterForAia( |
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
+ : task_runner_(std::move(task_runner)) {} |
+ |
+ net::URLRequestContext* GetURLRequestContext() override { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ |
+ if (!context_) { |
+ // TODO(mattm): add command line flags to configure using |
+ // CertIssuerSourceAia |
+ // (similar to VERIFY_CERT_IO_ENABLED flag for CertVerifyProc). |
+ net::URLRequestContextBuilder url_request_context_builder; |
+ url_request_context_builder.set_user_agent(GetUserAgent()); |
+#if defined(OS_LINUX) |
+ // On Linux, use a fixed ProxyConfigService, since the default one |
+ // depends on glib. |
+ // |
+ // TODO(akalin): Remove this once http://crbug.com/146421 is fixed. |
+ url_request_context_builder.set_proxy_config_service( |
+ base::MakeUnique<net::ProxyConfigServiceFixed>(net::ProxyConfig())); |
+#endif |
+ context_ = url_request_context_builder.Build(); |
+ } |
+ |
+ return context_.get(); |
+ } |
+ |
+ void ShutDown() { |
+ GetNetworkTaskRunner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&URLRequestContextGetterForAia::ShutdownOnNetworkThread, |
+ this)); |
+ } |
+ |
+ scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner() |
+ const override { |
+ return task_runner_; |
+ } |
+ |
+ private: |
+ ~URLRequestContextGetterForAia() override { DCHECK(!context_); } |
+ |
+ void ShutdownOnNetworkThread() { context_.release(); } |
+ |
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
+ |
+ std::unique_ptr<net::URLRequestContext> context_; |
+}; |
+ |
} // namespace |
// Verifies |target_der_cert| using CertPathBuilder. |
@@ -183,7 +236,7 @@ bool VerifyUsingPathBuilder( |
net::TrustStoreCollection trust_store; |
net::TrustStoreInMemory trust_store_in_memory; |
- trust_store.AddTrustStoreSynchronousOnly(&trust_store_in_memory); |
+ trust_store.AddTrustStore(&trust_store_in_memory); |
for (const auto& der_cert : root_der_certs) { |
scoped_refptr<net::ParsedCertificate> cert = ParseCertificate(der_cert); |
if (cert) { |
@@ -193,9 +246,8 @@ bool VerifyUsingPathBuilder( |
} |
#if defined(USE_NSS_CERTS) |
- net::TrustStoreNSS trust_store_nss(trustSSL, |
- base::ThreadTaskRunnerHandle::Get()); |
- trust_store.SetPrimaryTrustStore(&trust_store_nss); |
+ net::TrustStoreNSS trust_store_nss(trustSSL); |
+ trust_store.AddTrustStore(&trust_store_nss); |
#else |
if (root_der_certs.empty()) { |
std::cerr << "NOTE: CertPathBuilder does not currently use OS trust " |
@@ -222,32 +274,24 @@ bool VerifyUsingPathBuilder( |
&signature_policy, time, &result); |
path_builder.AddCertIssuerSource(&intermediate_cert_issuer_source); |
- // TODO(mattm): add command line flags to configure using CertIssuerSourceAia |
- // (similar to VERIFY_CERT_IO_ENABLED flag for CertVerifyProc). |
- net::URLRequestContextBuilder url_request_context_builder; |
- url_request_context_builder.set_user_agent(GetUserAgent()); |
-#if defined(OS_LINUX) |
- // On Linux, use a fixed ProxyConfigService, since the default one |
- // depends on glib. |
- // |
- // TODO(akalin): Remove this once http://crbug.com/146421 is fixed. |
- url_request_context_builder.set_proxy_config_service( |
- base::MakeUnique<net::ProxyConfigServiceFixed>(net::ProxyConfig())); |
-#endif |
- std::unique_ptr<net::URLRequestContext> url_request_context = |
- url_request_context_builder.Build(); |
- net::CertNetFetcherImpl cert_net_fetcher(url_request_context.get()); |
- net::CertIssuerSourceAia aia_cert_issuer_source(&cert_net_fetcher); |
+ // Initialize an AIA fetcher, that uses a separate thread for running the |
+ // networking message loop. |
+ base::Thread::Options options(base::MessageLoop::TYPE_IO, 0); |
+ base::Thread thread("network_thread"); |
+ CHECK(thread.StartWithOptions(options)); |
+ scoped_refptr<URLRequestContextGetterForAia> url_request_context_getter( |
+ new URLRequestContextGetterForAia(thread.task_runner())); |
+ auto cert_net_fetcher = |
+ CreateCertNetFetcher(url_request_context_getter.get()); |
+ net::CertIssuerSourceAia aia_cert_issuer_source(cert_net_fetcher.get()); |
path_builder.AddCertIssuerSource(&aia_cert_issuer_source); |
- net::TestClosure callback; |
- net::CompletionStatus rv = path_builder.Run(callback.closure()); |
+ // Run the path builder. |
+ path_builder.Run(); |
- if (rv == net::CompletionStatus::ASYNC) { |
- DVLOG(1) << "waiting for async completion..."; |
- callback.WaitForResult(); |
- DVLOG(1) << "async completed."; |
- } |
+ // Stop the temporary network thread.. |
+ url_request_context_getter->ShutDown(); |
+ thread.Stop(); |
// TODO(crbug.com/634443): Display any errors/warnings associated with path |
// building that were not part of a particular |