1
#pragma once
2

            
3
#include "source/common/quic/envoy_quic_proof_source_base.h"
4
#include "source/common/quic/quic_server_transport_socket_factory.h"
5
#include "source/server/listener_stats.h"
6

            
7
namespace Envoy {
8
namespace Quic {
9

            
10
// A ProofSource implementation which supplies a proof instance with certs from filter chain.
11
class EnvoyQuicProofSource : public EnvoyQuicProofSourceBase {
12
public:
13
  EnvoyQuicProofSource(Network::Socket& listen_socket,
14
                       Network::FilterChainManager& filter_chain_manager,
15
                       Server::ListenerStats& listener_stats, TimeSource& time_source)
16
2197
      : listen_socket_(listen_socket), filter_chain_manager_(&filter_chain_manager),
17
2197
        listener_stats_(listener_stats), time_source_(time_source) {}
18

            
19
2197
  ~EnvoyQuicProofSource() override = default;
20

            
21
  // quic::ProofSource
22
  void OnNewSslCtx(SSL_CTX* ssl_ctx) override;
23
  quiche::QuicheReferenceCountedPointer<quic::ProofSource::Chain>
24
  GetCertChain(const quic::QuicSocketAddress& server_address,
25
               const quic::QuicSocketAddress& client_address, const std::string& hostname,
26
               bool* cert_matched_sni) override;
27

            
28
  void updateFilterChainManager(Network::FilterChainManager& filter_chain_manager);
29

            
30
protected:
31
  // quic::ProofSource
32
  void signPayload(const quic::QuicSocketAddress& server_address,
33
                   const quic::QuicSocketAddress& client_address, const std::string& hostname,
34
                   uint16_t signature_algorithm, absl::string_view in,
35
                   std::unique_ptr<quic::ProofSource::SignatureCallback> callback) override;
36

            
37
private:
38
  struct TransportSocketFactoryWithFilterChain {
39
    const QuicServerTransportSocketFactory& transport_socket_factory_;
40
    const Network::FilterChain& filter_chain_;
41
  };
42

            
43
  struct CertWithFilterChain {
44
    quiche::QuicheReferenceCountedPointer<quic::ProofSource::Chain> cert_;
45
    std::shared_ptr<quic::CertificatePrivateKey> private_key_;
46
    absl::optional<std::reference_wrapper<const Network::FilterChain>> filter_chain_;
47
  };
48

            
49
  CertWithFilterChain getTlsCertAndFilterChain(const TransportSocketFactoryWithFilterChain& data,
50
                                               const std::string& hostname, bool* cert_matched_sni);
51

            
52
  absl::optional<TransportSocketFactoryWithFilterChain>
53
  getTransportSocketAndFilterChain(const quic::QuicSocketAddress& server_address,
54
                                   const quic::QuicSocketAddress& client_address,
55
                                   const std::string& hostname);
56

            
57
  Network::Socket& listen_socket_;
58
  Network::FilterChainManager* filter_chain_manager_{nullptr};
59
  Server::ListenerStats& listener_stats_;
60
  TimeSource& time_source_;
61
};
62

            
63
} // namespace Quic
64
} // namespace Envoy