1
#pragma once
2

            
3
#include <string>
4

            
5
#include "envoy/api/api.h"
6
#include "envoy/extensions/transport_sockets/tls/v3/cert.pb.h"
7
#include "envoy/extensions/transport_sockets/tls/v3/common.pb.h"
8
#include "envoy/ssl/certificate_validation_context_config.h"
9
#include "envoy/type/matcher/v3/string.pb.h"
10

            
11
#include "absl/status/statusor.h"
12

            
13
namespace Envoy {
14
namespace Ssl {
15

            
16
class CertificateValidationContextConfigImpl : public CertificateValidationContextConfig {
17
public:
18
  // Create a CertificateValidationContextConfigImpl or return an error status.
19
  static absl::StatusOr<std::unique_ptr<CertificateValidationContextConfigImpl>>
20
  create(const envoy::extensions::transport_sockets::tls::v3::CertificateValidationContext& context,
21
         bool auto_sni_san_match, Api::Api& api, const std::string& ca_cert_name);
22

            
23
  absl::Status initialize();
24

            
25
26225
  const std::string& caCert() const override { return ca_cert_; }
26
5916
  const std::string& caCertPath() const override { return ca_cert_path_; }
27
5972
  const std::string& caCertName() const override { return ca_cert_name_; }
28
8769
  const std::string& certificateRevocationList() const override {
29
8769
    return certificate_revocation_list_;
30
8769
  }
31
6
  const std::string& certificateRevocationListPath() const final {
32
6
    return certificate_revocation_list_path_;
33
6
  }
34
  const std::vector<envoy::extensions::transport_sockets::tls::v3::SubjectAltNameMatcher>&
35
10356
  subjectAltNameMatchers() const override {
36
10356
    return subject_alt_name_matchers_;
37
10356
  }
38
7352
  const std::vector<std::string>& verifyCertificateHashList() const override {
39
7352
    return verify_certificate_hash_list_;
40
7352
  }
41
5981
  const std::vector<std::string>& verifyCertificateSpkiList() const override {
42
5981
    return verify_certificate_spki_list_;
43
5981
  }
44
8750
  bool allowExpiredCertificate() const override { return allow_expired_certificate_; }
45
  envoy::extensions::transport_sockets::tls::v3::CertificateValidationContext::
46
      TrustChainVerification
47
16420
      trustChainVerification() const override {
48
16420
    return trust_chain_verification_;
49
16420
  }
50

            
51
  const absl::optional<envoy::config::core::v3::TypedExtensionConfig>&
52
6043
  customValidatorConfig() const override {
53
6043
    return custom_validator_config_;
54
6043
  }
55

            
56
28
  Api::Api& api() const override { return api_; }
57

            
58
2798
  bool onlyVerifyLeafCertificateCrl() const override { return only_verify_leaf_cert_crl_; }
59

            
60
5579
  absl::optional<uint32_t> maxVerifyDepth() const override { return max_verify_depth_; }
61

            
62
14671
  bool autoSniSanMatch() const override { return auto_sni_san_match_; }
63

            
64
protected:
65
  CertificateValidationContextConfigImpl(
66
      std::string ca_cert, std::string certificate_revocation_list,
67
      const envoy::extensions::transport_sockets::tls::v3::CertificateValidationContext& config,
68
      bool auto_sni_san_match, Api::Api& api, const std::string& name);
69

            
70
private:
71
  static std::vector<envoy::extensions::transport_sockets::tls::v3::SubjectAltNameMatcher>
72
  getSubjectAltNameMatchers(
73
      const envoy::extensions::transport_sockets::tls::v3::CertificateValidationContext& config);
74
  const std::string ca_cert_;
75
  const std::string ca_cert_path_;
76
  const std::string ca_cert_name_;
77
  const std::string certificate_revocation_list_;
78
  const std::string certificate_revocation_list_path_;
79
  const std::vector<envoy::extensions::transport_sockets::tls::v3::SubjectAltNameMatcher>
80
      subject_alt_name_matchers_;
81
  const std::vector<std::string> verify_certificate_hash_list_;
82
  const std::vector<std::string> verify_certificate_spki_list_;
83
  const bool allow_expired_certificate_;
84
  const envoy::extensions::transport_sockets::tls::v3::CertificateValidationContext::
85
      TrustChainVerification trust_chain_verification_;
86
  const absl::optional<envoy::config::core::v3::TypedExtensionConfig> custom_validator_config_;
87
  Api::Api& api_;
88
  const bool only_verify_leaf_cert_crl_;
89
  absl::optional<uint32_t> max_verify_depth_;
90
  const bool auto_sni_san_match_;
91
};
92

            
93
} // namespace Ssl
94
} // namespace Envoy