1
#pragma once
2

            
3
#include "envoy/extensions/transport_sockets/quic/v3/quic_transport.pb.h"
4
#include "envoy/network/transport_socket.h"
5
#include "envoy/server/transport_socket_config.h"
6
#include "envoy/ssl/context_config.h"
7
#include "envoy/ssl/handshaker.h"
8

            
9
#include "source/common/common/assert.h"
10
#include "source/common/network/transport_socket_options_impl.h"
11
#include "source/common/quic/quic_transport_socket_factory.h"
12
#include "source/common/tls/server_ssl_socket.h"
13

            
14
namespace Envoy {
15
namespace Quic {
16

            
17
// TODO(danzh): when implement ProofSource, examine of it's necessary to
18
// differentiate server and client side context config.
19
class QuicServerTransportSocketFactory : public Network::DownstreamTransportSocketFactory,
20
                                         public QuicTransportSocketFactoryBase {
21
public:
22
  static absl::StatusOr<std::unique_ptr<QuicServerTransportSocketFactory>>
23
  create(bool enable_early_data, Stats::Scope& store, Ssl::ServerContextConfigPtr config,
24
         Envoy::Ssl::ContextManager& manager);
25
  ~QuicServerTransportSocketFactory() override;
26

            
27
  // Network::DownstreamTransportSocketFactory
28
  Network::TransportSocketPtr createDownstreamTransportSocket() const override {
29
    PANIC("not implemented");
30
  }
31
2
  bool implementsSecureTransport() const override { return true; }
32

            
33
  void initialize() override;
34

            
35
  std::pair<quiche::QuicheReferenceCountedPointer<quic::ProofSource::Chain>,
36
            std::shared_ptr<quic::CertificatePrivateKey>>
37
  getTlsCertificateAndKey(absl::string_view sni, bool* cert_matched_sni) const;
38

            
39
2973
  bool earlyDataEnabled() const { return enable_early_data_; }
40

            
41
protected:
42
  QuicServerTransportSocketFactory(bool enable_early_data, Stats::Scope& store,
43
                                   Ssl::ServerContextConfigPtr config,
44
                                   Envoy::Ssl::ContextManager& manager,
45
                                   absl::Status& creation_status);
46

            
47
  absl::Status onSecretUpdated() override;
48

            
49
private:
50
  absl::StatusOr<Envoy::Ssl::ServerContextSharedPtr> createSslServerContext() const;
51

            
52
  Envoy::Ssl::ContextManager& manager_;
53
  Stats::Scope& stats_scope_;
54
  Ssl::ServerContextConfigPtr config_;
55
  mutable absl::Mutex ssl_ctx_mu_;
56
  Envoy::Ssl::ServerContextSharedPtr ssl_ctx_ ABSL_GUARDED_BY(ssl_ctx_mu_);
57
  bool enable_early_data_;
58
};
59

            
60
class QuicServerTransportSocketConfigFactory
61
    : public QuicTransportSocketConfigFactory,
62
      public Server::Configuration::DownstreamTransportSocketConfigFactory {
63
public:
64
  // Server::Configuration::DownstreamTransportSocketConfigFactory
65
  absl::StatusOr<Network::DownstreamTransportSocketFactoryPtr>
66
  createTransportSocketFactory(const Protobuf::Message& config,
67
                               Server::Configuration::TransportSocketFactoryContext& context,
68
                               const std::vector<std::string>& server_names) override;
69

            
70
  // Server::Configuration::TransportSocketConfigFactory
71
  ProtobufTypes::MessagePtr createEmptyConfigProto() override;
72
};
73

            
74
DECLARE_FACTORY(QuicServerTransportSocketConfigFactory);
75

            
76
} // namespace Quic
77
} // namespace Envoy