1
#pragma once
2

            
3
#include <string>
4

            
5
#include "envoy/network/filter.h"
6

            
7
#include "source/common/common/assert.h"
8
#include "source/common/common/logger.h"
9

            
10
#include "absl/strings/str_cat.h"
11
#include "openssl/ssl.h"
12
#include "quiche/quic/core/crypto/crypto_protocol.h"
13
#include "quiche/quic/core/crypto/proof_source.h"
14
#include "quiche/quic/core/quic_versions.h"
15
#include "quiche/quic/platform/api/quic_socket_address.h"
16

            
17
namespace Envoy {
18
namespace Quic {
19

            
20
// A ProofSource::Detail implementation which retains filter chain.
21
class EnvoyQuicProofSourceDetails : public quic::ProofSource::Details {
22
public:
23
  explicit EnvoyQuicProofSourceDetails(const Network::FilterChain& filter_chain)
24
1867
      : filter_chain_(filter_chain) {}
25

            
26
1
  const Network::FilterChain& filterChain() const { return filter_chain_; }
27

            
28
private:
29
  const Network::FilterChain& filter_chain_;
30
};
31

            
32
// A partial implementation of quic::ProofSource which chooses a cipher suite according to the leaf
33
// cert to sign in GetProof().
34
class EnvoyQuicProofSourceBase : public quic::ProofSource,
35
                                 protected Logger::Loggable<Logger::Id::quic> {
36
public:
37
2256
  ~EnvoyQuicProofSourceBase() override = default;
38

            
39
  // quic::ProofSource
40
  void GetProof(const quic::QuicSocketAddress& server_address,
41
                const quic::QuicSocketAddress& client_address, const std::string& hostname,
42
                const std::string& server_config, quic::QuicTransportVersion /*transport_version*/,
43
                absl::string_view chlo_hash,
44
                std::unique_ptr<quic::ProofSource::Callback> callback) override;
45

            
46
2238
  TicketCrypter* GetTicketCrypter() override { return nullptr; }
47

            
48
  void ComputeTlsSignature(const quic::QuicSocketAddress& server_address,
49
                           const quic::QuicSocketAddress& client_address,
50
                           const std::string& hostname, uint16_t signature_algorithm,
51
                           absl::string_view in,
52
                           std::unique_ptr<quic::ProofSource::SignatureCallback> callback) override;
53
  absl::InlinedVector<uint16_t, 8> SupportedTlsSignatureAlgorithms() const override;
54

            
55
protected:
56
  virtual void signPayload(const quic::QuicSocketAddress& server_address,
57
                           const quic::QuicSocketAddress& client_address,
58
                           const std::string& hostname, uint16_t signature_algorithm,
59
                           absl::string_view in,
60
                           std::unique_ptr<quic::ProofSource::SignatureCallback> callback) PURE;
61
};
62

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