blob: f6eae8e294987860413f848e7a1ec41dd850a29b [file] [log] [blame]
[email protected]2662ed562013-07-03 10:27:461// 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
Ryan Hamiltona3ee93a72018-08-01 22:03:085#ifndef NET_QUIC_CRYPTO_PROOF_VERIFIER_CHROMIUM_H_
6#define NET_QUIC_CRYPTO_PROOF_VERIFIER_CHROMIUM_H_
[email protected]2662ed562013-07-03 10:27:467
avib3635452016-10-21 18:33:538#include <map>
danakjad1777e2016-04-16 00:56:429#include <memory>
[email protected]2662ed562013-07-03 10:27:4610#include <string>
11#include <vector>
12
[email protected]2662ed562013-07-03 10:27:4613#include "base/compiler_specific.h"
Avi Drissman13fc8932015-12-20 04:40:4614#include "base/macros.h"
[email protected]2662ed562013-07-03 10:27:4615#include "net/base/net_export.h"
[email protected]2662ed562013-07-03 10:27:4616#include "net/cert/cert_verify_result.h"
rtenneti052774e2015-11-24 21:00:1217#include "net/cert/ct_verify_result.h"
[email protected]c817c672014-03-21 22:25:3418#include "net/cert/x509_certificate.h"
mikecironef22f9812016-10-04 03:40:1919#include "net/log/net_log_with_source.h"
Victor Vasiliev6bb59d22019-03-08 21:34:5120#include "net/third_party/quiche/src/quic/core/crypto/proof_verifier.h"
[email protected]2662ed562013-07-03 10:27:4621
22namespace net {
23
estark6f9b3d82016-01-12 21:37:0524class CTPolicyEnforcer;
[email protected]2662ed562013-07-03 10:27:4625class CertVerifier;
rtenneti052774e2015-11-24 21:00:1226class CTVerifier;
[email protected]080b77932014-08-04 01:22:4627class TransportSecurityState;
[email protected]2662ed562013-07-03 10:27:4628
[email protected]72e65992013-07-30 17:16:1429// ProofVerifyDetailsChromium is the implementation-specific information that a
30// ProofVerifierChromium returns about a certificate verification.
[email protected]92bc621d2014-07-29 21:42:1331class NET_EXPORT_PRIVATE ProofVerifyDetailsChromium
Ryan Hamilton8d9ee76e2018-05-29 23:52:5232 : public quic::ProofVerifyDetails {
[email protected]72e65992013-07-30 17:16:1433 public:
dadriandf302c42016-06-10 18:48:5934 ProofVerifyDetailsChromium();
35 ProofVerifyDetailsChromium(const ProofVerifyDetailsChromium&);
36 ~ProofVerifyDetailsChromium() override;
37
Ryan Hamilton8d9ee76e2018-05-29 23:52:5238 // quic::ProofVerifyDetails implementation
39 quic::ProofVerifyDetails* Clone() const override;
[email protected]92bc621d2014-07-29 21:42:1340
[email protected]72e65992013-07-30 17:16:1441 CertVerifyResult cert_verify_result;
rtenneti052774e2015-11-24 21:00:1242 ct::CTVerifyResult ct_verify_result;
[email protected]080b77932014-08-04 01:22:4643
44 // pinning_failure_log contains a message produced by
martijnc0d6b622015-06-30 19:14:4045 // TransportSecurityState::PKPState::CheckPublicKeyPins in the event of a
[email protected]080b77932014-08-04 01:22:4646 // pinning failure. It is a (somewhat) human-readable string.
47 std::string pinning_failure_log;
dadriandf302c42016-06-10 18:48:5948
49 // True if PKP was bypassed due to a local trust anchor.
50 bool pkp_bypassed;
Carlos IL81133382017-12-06 17:18:4551
52 // True if there was a certificate error which should be treated as fatal,
53 // and false otherwise.
54 bool is_fatal_cert_error;
[email protected]72e65992013-07-30 17:16:1455};
56
[email protected]c817c672014-03-21 22:25:3457// ProofVerifyContextChromium is the implementation-specific information that a
58// ProofVerifierChromium needs in order to log correctly.
Ryan Hamilton8d9ee76e2018-05-29 23:52:5259struct ProofVerifyContextChromium : public quic::ProofVerifyContext {
[email protected]c817c672014-03-21 22:25:3460 public:
tfarina428341112016-09-22 13:38:2061 ProofVerifyContextChromium(int cert_verify_flags,
62 const NetLogWithSource& net_log)
rtennetia75df622015-06-21 23:59:5063 : cert_verify_flags(cert_verify_flags), net_log(net_log) {}
[email protected]c817c672014-03-21 22:25:3464
rtennetia75df622015-06-21 23:59:5065 int cert_verify_flags;
tfarina428341112016-09-22 13:38:2066 NetLogWithSource net_log;
[email protected]c817c672014-03-21 22:25:3467};
68
Ryan Hamilton8d9ee76e2018-05-29 23:52:5269// ProofVerifierChromium implements the QUIC quic::ProofVerifier interface. It
70// is capable of handling multiple simultaneous requests.
71class NET_EXPORT_PRIVATE ProofVerifierChromium : public quic::ProofVerifier {
[email protected]2662ed562013-07-03 10:27:4672 public:
[email protected]080b77932014-08-04 01:22:4673 ProofVerifierChromium(CertVerifier* cert_verifier,
estark6f9b3d82016-01-12 21:37:0574 CTPolicyEnforcer* ct_policy_enforcer,
rtenneti052774e2015-11-24 21:00:1275 TransportSecurityState* transport_security_state,
Nick Harper3f3ae7b2019-08-22 20:33:3776 CTVerifier* cert_transparency_verifier,
77 std::set<std::string> hostnames_to_allow_unknown_roots);
dchengb03027d2014-10-21 12:00:2078 ~ProofVerifierChromium() override;
[email protected]2662ed562013-07-03 10:27:4679
Ryan Hamilton8d9ee76e2018-05-29 23:52:5280 // quic::ProofVerifier interface
81 quic::QuicAsyncStatus VerifyProof(
danakjad1777e2016-04-16 00:56:4282 const std::string& hostname,
83 const uint16_t port,
84 const std::string& server_config,
Ryan Hamilton8d9ee76e2018-05-29 23:52:5285 quic::QuicTransportVersion quic_version,
86 quic::QuicStringPiece chlo_hash,
danakjad1777e2016-04-16 00:56:4287 const std::vector<std::string>& certs,
88 const std::string& cert_sct,
89 const std::string& signature,
Ryan Hamilton8d9ee76e2018-05-29 23:52:5290 const quic::ProofVerifyContext* verify_context,
danakjad1777e2016-04-16 00:56:4291 std::string* error_details,
Ryan Hamilton8d9ee76e2018-05-29 23:52:5292 std::unique_ptr<quic::ProofVerifyDetails>* verify_details,
93 std::unique_ptr<quic::ProofVerifierCallback> callback) override;
94 quic::QuicAsyncStatus VerifyCertChain(
rtennetid073dd22016-08-04 01:58:3395 const std::string& hostname,
96 const std::vector<std::string>& certs,
Dan Zhang10042412019-05-09 18:31:0197 const std::string& ocsp_response,
98 const std::string& cert_sct,
Ryan Hamilton8d9ee76e2018-05-29 23:52:5299 const quic::ProofVerifyContext* verify_context,
rtennetid073dd22016-08-04 01:58:33100 std::string* error_details,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52101 std::unique_ptr<quic::ProofVerifyDetails>* verify_details,
102 std::unique_ptr<quic::ProofVerifierCallback> callback) override;
Ryan Hamilton8bb19a12018-07-23 20:29:24103 std::unique_ptr<quic::ProofVerifyContext> CreateDefaultContext() override;
[email protected]2662ed562013-07-03 10:27:46104
105 private:
[email protected]5c78ce62014-03-13 19:48:01106 class Job;
[email protected]2662ed562013-07-03 10:27:46107
[email protected]5c78ce62014-03-13 19:48:01108 void OnJobComplete(Job* job);
[email protected]2662ed562013-07-03 10:27:46109
[email protected]5c78ce62014-03-13 19:48:01110 // Set owning pointers to active jobs.
avib3635452016-10-21 18:33:53111 std::map<Job*, std::unique_ptr<Job>> active_jobs_;
[email protected]2662ed562013-07-03 10:27:46112
[email protected]5c78ce62014-03-13 19:48:01113 // Underlying verifier used to verify certificates.
[email protected]2662ed562013-07-03 10:27:46114 CertVerifier* const cert_verifier_;
estark6f9b3d82016-01-12 21:37:05115 CTPolicyEnforcer* const ct_policy_enforcer_;
[email protected]2662ed562013-07-03 10:27:46116
[email protected]2bfa5cf2014-08-21 01:24:51117 TransportSecurityState* const transport_security_state_;
rtenneti052774e2015-11-24 21:00:12118 CTVerifier* const cert_transparency_verifier_;
[email protected]080b77932014-08-04 01:22:46119
Nick Harper3f3ae7b2019-08-22 20:33:37120 std::set<std::string> hostnames_to_allow_unknown_roots_;
121
[email protected]2662ed562013-07-03 10:27:46122 DISALLOW_COPY_AND_ASSIGN(ProofVerifierChromium);
123};
124
125} // namespace net
126
Ryan Hamiltona3ee93a72018-08-01 22:03:08127#endif // NET_QUIC_CRYPTO_PROOF_VERIFIER_CHROMIUM_H_