LCOV - code coverage report
Current view: top level - source/extensions/transport_sockets/tls - ssl_socket.h (source / functions) Hit Total Coverage
Test: coverage.dat Lines: 0 14 0.0 %
Date: 2024-01-05 06:35:25 Functions: 0 9 0.0 %

          Line data    Source code
       1             : #pragma once
       2             : 
       3             : #include <cstdint>
       4             : #include <string>
       5             : 
       6             : #include "envoy/network/connection.h"
       7             : #include "envoy/network/transport_socket.h"
       8             : #include "envoy/secret/secret_callbacks.h"
       9             : #include "envoy/ssl/handshaker.h"
      10             : #include "envoy/ssl/private_key/private_key_callbacks.h"
      11             : #include "envoy/ssl/ssl_socket_extended_info.h"
      12             : #include "envoy/ssl/ssl_socket_state.h"
      13             : #include "envoy/stats/scope.h"
      14             : #include "envoy/stats/stats_macros.h"
      15             : 
      16             : #include "source/common/common/logger.h"
      17             : #include "source/common/network/transport_socket_options_impl.h"
      18             : #include "source/extensions/transport_sockets/tls/context_impl.h"
      19             : #include "source/extensions/transport_sockets/tls/ssl_handshaker.h"
      20             : #include "source/extensions/transport_sockets/tls/utility.h"
      21             : 
      22             : #include "absl/container/node_hash_map.h"
      23             : #include "absl/synchronization/mutex.h"
      24             : #include "absl/types/optional.h"
      25             : #include "openssl/ssl.h"
      26             : 
      27             : namespace Envoy {
      28             : namespace Extensions {
      29             : namespace TransportSockets {
      30             : namespace Tls {
      31             : 
      32             : #define ALL_SSL_SOCKET_FACTORY_STATS(COUNTER)                                                      \
      33           0 :   COUNTER(ssl_context_update_by_sds)                                                               \
      34           0 :   COUNTER(upstream_context_secrets_not_ready)                                                      \
      35           0 :   COUNTER(downstream_context_secrets_not_ready)
      36             : 
      37             : /**
      38             :  * Wrapper struct for SSL socket factory stats. @see stats_macros.h
      39             :  */
      40             : struct SslSocketFactoryStats {
      41             :   ALL_SSL_SOCKET_FACTORY_STATS(GENERATE_COUNTER_STRUCT)
      42             : };
      43             : 
      44             : enum class InitialState { Client, Server };
      45             : 
      46             : class SslSocket : public Network::TransportSocket,
      47             :                   public Envoy::Ssl::PrivateKeyConnectionCallbacks,
      48             :                   public Ssl::HandshakeCallbacks,
      49             :                   protected Logger::Loggable<Logger::Id::connection> {
      50             : public:
      51             :   SslSocket(Envoy::Ssl::ContextSharedPtr ctx, InitialState state,
      52             :             const Network::TransportSocketOptionsConstSharedPtr& transport_socket_options,
      53             :             Ssl::HandshakerFactoryCb handshaker_factory_cb);
      54             : 
      55             :   // Network::TransportSocket
      56             :   void setTransportSocketCallbacks(Network::TransportSocketCallbacks& callbacks) override;
      57             :   std::string protocol() const override;
      58             :   absl::string_view failureReason() const override;
      59           0 :   bool canFlushClose() override { return info_->state() == Ssl::SocketState::HandshakeComplete; }
      60             :   void closeSocket(Network::ConnectionEvent close_type) override;
      61             :   Network::IoResult doRead(Buffer::Instance& read_buffer) override;
      62             :   Network::IoResult doWrite(Buffer::Instance& write_buffer, bool end_stream) override;
      63             :   void onConnected() override;
      64             :   Ssl::ConnectionInfoConstSharedPtr ssl() const override;
      65           0 :   bool startSecureTransport() override { return false; }
      66           0 :   void configureInitialCongestionWindow(uint64_t, std::chrono::microseconds) override {}
      67             :   // Ssl::PrivateKeyConnectionCallbacks
      68             :   void onPrivateKeyMethodComplete() override;
      69             :   // Ssl::HandshakeCallbacks
      70             :   Network::Connection& connection() const override;
      71             :   void onSuccess(SSL* ssl) override;
      72             :   void onFailure() override;
      73           0 :   Network::TransportSocketCallbacks* transportSocketCallbacks() override { return callbacks_; }
      74             :   void onAsynchronousCertValidationComplete() override;
      75             : 
      76           0 :   SSL* rawSslForTest() const { return rawSsl(); }
      77             : 
      78             : protected:
      79           0 :   SSL* rawSsl() const { return info_->ssl(); }
      80             : 
      81             : private:
      82             :   struct ReadResult {
      83             :     uint64_t bytes_read_{0};
      84             :     absl::optional<int> error_;
      85             :   };
      86             :   ReadResult sslReadIntoSlice(Buffer::RawSlice& slice);
      87             : 
      88             :   Network::PostIoAction doHandshake();
      89             :   void drainErrorQueue();
      90             :   void shutdownSsl();
      91             :   void shutdownBasic();
      92             :   void resumeHandshake();
      93             : 
      94             :   const Network::TransportSocketOptionsConstSharedPtr transport_socket_options_;
      95             :   Network::TransportSocketCallbacks* callbacks_{};
      96             :   ContextImplSharedPtr ctx_;
      97             :   uint64_t bytes_to_retry_{};
      98             :   std::string failure_reason_;
      99             : 
     100             :   SslHandshakerImplSharedPtr info_;
     101             : };
     102             : 
     103             : class ClientSslSocketFactory : public Network::CommonUpstreamTransportSocketFactory,
     104             :                                public Secret::SecretCallbacks,
     105             :                                Logger::Loggable<Logger::Id::config> {
     106             : public:
     107             :   ClientSslSocketFactory(Envoy::Ssl::ClientContextConfigPtr config,
     108             :                          Envoy::Ssl::ContextManager& manager, Stats::Scope& stats_scope);
     109             : 
     110             :   ~ClientSslSocketFactory() override;
     111             : 
     112             :   Network::TransportSocketPtr
     113             :   createTransportSocket(Network::TransportSocketOptionsConstSharedPtr options,
     114             :                         Upstream::HostDescriptionConstSharedPtr) const override;
     115             :   bool implementsSecureTransport() const override;
     116           0 :   absl::string_view defaultServerNameIndication() const override {
     117           0 :     return clientContextConfig()->serverNameIndication();
     118           0 :   }
     119           0 :   bool supportsAlpn() const override { return true; }
     120             : 
     121             :   // Secret::SecretCallbacks
     122             :   void onAddOrUpdateSecret() override;
     123             : 
     124           0 :   OptRef<const Ssl::ClientContextConfig> clientContextConfig() const override { return {*config_}; }
     125             : 
     126             :   Envoy::Ssl::ClientContextSharedPtr sslCtx() override;
     127             : 
     128             : private:
     129             :   Envoy::Ssl::ContextManager& manager_;
     130             :   Stats::Scope& stats_scope_;
     131             :   SslSocketFactoryStats stats_;
     132             :   Envoy::Ssl::ClientContextConfigPtr config_;
     133             :   mutable absl::Mutex ssl_ctx_mu_;
     134             :   Envoy::Ssl::ClientContextSharedPtr ssl_ctx_ ABSL_GUARDED_BY(ssl_ctx_mu_);
     135             : };
     136             : 
     137             : class ServerSslSocketFactory : public Network::DownstreamTransportSocketFactory,
     138             :                                public Secret::SecretCallbacks,
     139             :                                Logger::Loggable<Logger::Id::config> {
     140             : public:
     141             :   ServerSslSocketFactory(Envoy::Ssl::ServerContextConfigPtr config,
     142             :                          Envoy::Ssl::ContextManager& manager, Stats::Scope& stats_scope,
     143             :                          const std::vector<std::string>& server_names);
     144             : 
     145             :   ~ServerSslSocketFactory() override;
     146             : 
     147             :   Network::TransportSocketPtr createDownstreamTransportSocket() const override;
     148             :   bool implementsSecureTransport() const override;
     149             : 
     150             :   // Secret::SecretCallbacks
     151             :   void onAddOrUpdateSecret() override;
     152             : 
     153             : private:
     154             :   Ssl::ContextManager& manager_;
     155             :   Stats::Scope& stats_scope_;
     156             :   SslSocketFactoryStats stats_;
     157             :   Envoy::Ssl::ServerContextConfigPtr config_;
     158             :   const std::vector<std::string> server_names_;
     159             :   mutable absl::Mutex ssl_ctx_mu_;
     160             :   Envoy::Ssl::ServerContextSharedPtr ssl_ctx_ ABSL_GUARDED_BY(ssl_ctx_mu_);
     161             : };
     162             : 
     163             : } // namespace Tls
     164             : } // namespace TransportSockets
     165             : } // namespace Extensions
     166             : } // namespace Envoy

Generated by: LCOV version 1.15