cert_verifier_with_trust_anchors.cc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // Copyright (c) 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. #include "services/network/cert_verifier_with_trust_anchors.h"
  5. #include <utility>
  6. #include "base/bind.h"
  7. #include "base/check_op.h"
  8. #include "net/base/net_errors.h"
  9. #include "net/cert/caching_cert_verifier.h"
  10. #include "net/cert/cert_verifier.h"
  11. #include "net/cert/cert_verify_proc.h"
  12. #include "net/cert/coalescing_cert_verifier.h"
  13. #include "net/cert/multi_threaded_cert_verifier.h"
  14. namespace network {
  15. namespace {
  16. void MaybeSignalAnchorUse(int error,
  17. const base::RepeatingClosure& anchor_used_callback,
  18. const net::CertVerifyResult& verify_result) {
  19. if (error != net::OK || !verify_result.is_issued_by_additional_trust_anchor ||
  20. anchor_used_callback.is_null()) {
  21. return;
  22. }
  23. anchor_used_callback.Run();
  24. }
  25. void CompleteAndSignalAnchorUse(
  26. const base::RepeatingClosure& anchor_used_callback,
  27. net::CompletionOnceCallback completion_callback,
  28. const net::CertVerifyResult* verify_result,
  29. int error) {
  30. MaybeSignalAnchorUse(error, anchor_used_callback, *verify_result);
  31. std::move(completion_callback).Run(error);
  32. }
  33. net::CertVerifier::Config ExtendTrustAnchorsAndTempCerts(
  34. const net::CertVerifier::Config& config,
  35. const net::CertificateList& trust_anchors,
  36. const net::CertificateList& untrusted_authorities) {
  37. net::CertVerifier::Config new_config = config;
  38. new_config.additional_trust_anchors.insert(
  39. new_config.additional_trust_anchors.begin(), trust_anchors.begin(),
  40. trust_anchors.end());
  41. new_config.additional_untrusted_authorities.insert(
  42. new_config.additional_untrusted_authorities.begin(),
  43. untrusted_authorities.begin(), untrusted_authorities.end());
  44. return new_config;
  45. }
  46. } // namespace
  47. CertVerifierWithTrustAnchors::CertVerifierWithTrustAnchors(
  48. const base::RepeatingClosure& anchor_used_callback)
  49. : anchor_used_callback_(anchor_used_callback) {
  50. DETACH_FROM_THREAD(thread_checker_);
  51. }
  52. CertVerifierWithTrustAnchors::~CertVerifierWithTrustAnchors() {
  53. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  54. }
  55. void CertVerifierWithTrustAnchors::InitializeOnIOThread(
  56. std::unique_ptr<net::CertVerifier> delegate) {
  57. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  58. delegate_ = std::move(delegate);
  59. delegate_->SetConfig(ExtendTrustAnchorsAndTempCerts(
  60. orig_config_, trust_anchors_, untrusted_authorities_));
  61. }
  62. void CertVerifierWithTrustAnchors::SetAdditionalCerts(
  63. const net::CertificateList& trust_anchors,
  64. const net::CertificateList& untrusted_authorities) {
  65. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  66. if (std::tie(trust_anchors, untrusted_authorities) ==
  67. std::tie(trust_anchors_, untrusted_authorities_))
  68. return;
  69. trust_anchors_ = trust_anchors;
  70. untrusted_authorities_ = untrusted_authorities;
  71. if (!delegate_)
  72. return;
  73. delegate_->SetConfig(ExtendTrustAnchorsAndTempCerts(
  74. orig_config_, trust_anchors_, untrusted_authorities_));
  75. }
  76. int CertVerifierWithTrustAnchors::Verify(
  77. const RequestParams& params,
  78. net::CertVerifyResult* verify_result,
  79. net::CompletionOnceCallback completion_callback,
  80. std::unique_ptr<Request>* out_req,
  81. const net::NetLogWithSource& net_log) {
  82. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  83. DCHECK(delegate_);
  84. DCHECK(completion_callback);
  85. net::CompletionOnceCallback wrapped_callback =
  86. base::BindOnce(&CompleteAndSignalAnchorUse, anchor_used_callback_,
  87. std::move(completion_callback), verify_result);
  88. int error = delegate_->Verify(params, verify_result,
  89. std::move(wrapped_callback), out_req, net_log);
  90. MaybeSignalAnchorUse(error, anchor_used_callback_, *verify_result);
  91. return error;
  92. }
  93. void CertVerifierWithTrustAnchors::SetConfig(const Config& config) {
  94. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  95. orig_config_ = config;
  96. delegate_->SetConfig(ExtendTrustAnchorsAndTempCerts(
  97. orig_config_, trust_anchors_, untrusted_authorities_));
  98. }
  99. } // namespace network