| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef NET_QUIC_QUIC_CRYPTO_SERVER_STREAM_H_ | |
| 6 #define NET_QUIC_QUIC_CRYPTO_SERVER_STREAM_H_ | |
| 7 | |
| 8 #include <cstdint> | |
| 9 #include <memory> | |
| 10 #include <string> | |
| 11 | |
| 12 #include "base/macros.h" | |
| 13 #include "net/quic/crypto/crypto_handshake.h" | |
| 14 #include "net/quic/crypto/quic_compressed_certs_cache.h" | |
| 15 #include "net/quic/crypto/quic_crypto_server_config.h" | |
| 16 #include "net/quic/proto/source_address_token.pb.h" | |
| 17 #include "net/quic/quic_config.h" | |
| 18 #include "net/quic/quic_crypto_stream.h" | |
| 19 | |
| 20 namespace net { | |
| 21 | |
| 22 class CachedNetworkParameters; | |
| 23 class CryptoHandshakeMessage; | |
| 24 class QuicCryptoServerConfig; | |
| 25 class QuicCryptoServerStreamBase; | |
| 26 class QuicServerSessionBase; | |
| 27 | |
| 28 namespace test { | |
| 29 class CryptoTestUtils; | |
| 30 class QuicCryptoServerStreamPeer; | |
| 31 } // namespace test | |
| 32 | |
| 33 // Receives a notification when the server hello (SHLO) has been ACKed by the | |
| 34 // peer. At this point we disable HANDSHAKE_MODE in the sent packet manager. | |
| 35 class NET_EXPORT_PRIVATE ServerHelloNotifier : public QuicAckListenerInterface { | |
| 36 public: | |
| 37 explicit ServerHelloNotifier(QuicCryptoServerStreamBase* stream) | |
| 38 : server_stream_(stream) {} | |
| 39 | |
| 40 void OnPacketAcked(int acked_bytes, QuicTime::Delta ack_delay_time) override; | |
| 41 | |
| 42 void OnPacketRetransmitted(int retransmitted_bytes) override; | |
| 43 | |
| 44 private: | |
| 45 ~ServerHelloNotifier() override {} | |
| 46 | |
| 47 QuicCryptoServerStreamBase* server_stream_; | |
| 48 | |
| 49 DISALLOW_COPY_AND_ASSIGN(ServerHelloNotifier); | |
| 50 }; | |
| 51 | |
| 52 // TODO(alyssar) see what can be moved out of QuicCryptoServerStream with | |
| 53 // various code and test refactoring. | |
| 54 class NET_EXPORT_PRIVATE QuicCryptoServerStreamBase : public QuicCryptoStream { | |
| 55 public: | |
| 56 explicit QuicCryptoServerStreamBase(QuicServerSessionBase* session); | |
| 57 ~QuicCryptoServerStreamBase() override {} | |
| 58 | |
| 59 // Cancel any outstanding callbacks, such as asynchronous validation of client | |
| 60 // hello. | |
| 61 virtual void CancelOutstandingCallbacks() = 0; | |
| 62 | |
| 63 // GetBase64SHA256ClientChannelID sets |*output| to the base64 encoded, | |
| 64 // SHA-256 hash of the client's ChannelID key and returns true, if the client | |
| 65 // presented a ChannelID. Otherwise it returns false. | |
| 66 virtual bool GetBase64SHA256ClientChannelID(std::string* output) const = 0; | |
| 67 | |
| 68 virtual int NumServerConfigUpdateMessagesSent() const = 0; | |
| 69 | |
| 70 // Sends the latest server config and source-address token to the client. | |
| 71 virtual void SendServerConfigUpdate( | |
| 72 const CachedNetworkParameters* cached_network_params) = 0; | |
| 73 | |
| 74 // Called by the ServerHello AckNotifier once the SHLO has been ACKed by the | |
| 75 // client. | |
| 76 virtual void OnServerHelloAcked() = 0; | |
| 77 | |
| 78 // These are all accessors and setters to their respective counters. | |
| 79 virtual uint8_t NumHandshakeMessages() const = 0; | |
| 80 virtual uint8_t NumHandshakeMessagesWithServerNonces() const = 0; | |
| 81 virtual bool UseStatelessRejectsIfPeerSupported() const = 0; | |
| 82 virtual bool PeerSupportsStatelessRejects() const = 0; | |
| 83 virtual void SetPeerSupportsStatelessRejects(bool set) = 0; | |
| 84 virtual const CachedNetworkParameters* PreviousCachedNetworkParams() | |
| 85 const = 0; | |
| 86 virtual void SetPreviousCachedNetworkParams( | |
| 87 CachedNetworkParameters cached_network_params) = 0; | |
| 88 | |
| 89 // Checks the options on the handshake-message to see whether the | |
| 90 // peer supports stateless-rejects. | |
| 91 static bool DoesPeerSupportStatelessRejects( | |
| 92 const CryptoHandshakeMessage& message); | |
| 93 }; | |
| 94 | |
| 95 class NET_EXPORT_PRIVATE QuicCryptoServerStream | |
| 96 : public QuicCryptoServerStreamBase { | |
| 97 public: | |
| 98 // |crypto_config| must outlive the stream. | |
| 99 QuicCryptoServerStream(const QuicCryptoServerConfig* crypto_config, | |
| 100 QuicCompressedCertsCache* compressed_certs_cache, | |
| 101 bool use_stateless_rejects_if_peer_supported, | |
| 102 QuicServerSessionBase* session); | |
| 103 ~QuicCryptoServerStream() override; | |
| 104 | |
| 105 // From QuicCryptoServerStreamBase | |
| 106 void CancelOutstandingCallbacks() override; | |
| 107 void OnHandshakeMessage(const CryptoHandshakeMessage& message) override; | |
| 108 bool GetBase64SHA256ClientChannelID(std::string* output) const override; | |
| 109 void SendServerConfigUpdate( | |
| 110 const CachedNetworkParameters* cached_network_params) override; | |
| 111 void OnServerHelloAcked() override; | |
| 112 uint8_t NumHandshakeMessages() const override; | |
| 113 uint8_t NumHandshakeMessagesWithServerNonces() const override; | |
| 114 int NumServerConfigUpdateMessagesSent() const override; | |
| 115 const CachedNetworkParameters* PreviousCachedNetworkParams() const override; | |
| 116 bool UseStatelessRejectsIfPeerSupported() const override; | |
| 117 bool PeerSupportsStatelessRejects() const override; | |
| 118 void SetPeerSupportsStatelessRejects( | |
| 119 bool peer_supports_stateless_rejects) override; | |
| 120 void SetPreviousCachedNetworkParams( | |
| 121 CachedNetworkParameters cached_network_params) override; | |
| 122 | |
| 123 protected: | |
| 124 virtual QuicErrorCode ProcessClientHello( | |
| 125 const CryptoHandshakeMessage& message, | |
| 126 const ValidateClientHelloResultCallback::Result& result, | |
| 127 std::unique_ptr<ProofSource::Details> proof_source_details, | |
| 128 CryptoHandshakeMessage* reply, | |
| 129 DiversificationNonce* out_diversification_nonce, | |
| 130 std::string* error_details); | |
| 131 | |
| 132 // Hook that allows the server to set QuicConfig defaults just | |
| 133 // before going through the parameter negotiation step. | |
| 134 virtual void OverrideQuicConfigDefaults(QuicConfig* config); | |
| 135 | |
| 136 // Given the current connection_id, generates a new ConnectionId to | |
| 137 // be returned with a stateless reject. | |
| 138 virtual QuicConnectionId GenerateConnectionIdForReject( | |
| 139 QuicConnectionId connection_id); | |
| 140 | |
| 141 private: | |
| 142 friend class test::CryptoTestUtils; | |
| 143 friend class test::QuicCryptoServerStreamPeer; | |
| 144 | |
| 145 class ValidateCallback : public ValidateClientHelloResultCallback { | |
| 146 public: | |
| 147 explicit ValidateCallback(QuicCryptoServerStream* parent); | |
| 148 // To allow the parent to detach itself from the callback before deletion. | |
| 149 void Cancel(); | |
| 150 | |
| 151 // From ValidateClientHelloResultCallback | |
| 152 void RunImpl(const CryptoHandshakeMessage& client_hello, | |
| 153 const Result& result, | |
| 154 std::unique_ptr<ProofSource::Details> details) override; | |
| 155 | |
| 156 private: | |
| 157 QuicCryptoServerStream* parent_; | |
| 158 | |
| 159 DISALLOW_COPY_AND_ASSIGN(ValidateCallback); | |
| 160 }; | |
| 161 | |
| 162 class SendServerConfigUpdateCallback | |
| 163 : public BuildServerConfigUpdateMessageResultCallback { | |
| 164 public: | |
| 165 explicit SendServerConfigUpdateCallback(QuicCryptoServerStream* parent); | |
| 166 SendServerConfigUpdateCallback(const SendServerConfigUpdateCallback&) = | |
| 167 delete; | |
| 168 void operator=(const SendServerConfigUpdateCallback&) = delete; | |
| 169 | |
| 170 // To allow the parent to detach itself from the callback before deletion. | |
| 171 void Cancel(); | |
| 172 | |
| 173 // From BuildServerConfigUpdateMessageResultCallback | |
| 174 void Run(bool ok, const CryptoHandshakeMessage& message) override; | |
| 175 | |
| 176 private: | |
| 177 QuicCryptoServerStream* parent_; | |
| 178 }; | |
| 179 | |
| 180 // Invoked by ValidateCallback::RunImpl once initial validation of | |
| 181 // the client hello is complete. Finishes processing of the client | |
| 182 // hello message and handles handshake success/failure. | |
| 183 void FinishProcessingHandshakeMessage( | |
| 184 const CryptoHandshakeMessage& message, | |
| 185 const ValidateClientHelloResultCallback::Result& result, | |
| 186 std::unique_ptr<ProofSource::Details> details); | |
| 187 | |
| 188 // Invoked by SendServerConfigUpdateCallback::RunImpl once the proof has been | |
| 189 // received. |ok| indicates whether or not the proof was successfully | |
| 190 // acquired, and |message| holds the partially-constructed message from | |
| 191 // SendServerConfigUpdate. | |
| 192 void FinishSendServerConfigUpdate(bool ok, | |
| 193 const CryptoHandshakeMessage& message); | |
| 194 | |
| 195 // crypto_config_ contains crypto parameters for the handshake. | |
| 196 const QuicCryptoServerConfig* crypto_config_; | |
| 197 | |
| 198 // compressed_certs_cache_ contains a set of most recently compressed certs. | |
| 199 // Owned by QuicDispatcher. | |
| 200 QuicCompressedCertsCache* compressed_certs_cache_; | |
| 201 | |
| 202 // Server's certificate chain and signature of the server config, as provided | |
| 203 // by ProofSource::GetProof. | |
| 204 QuicCryptoProof crypto_proof_; | |
| 205 | |
| 206 // Hash of the last received CHLO message which can be used for generating | |
| 207 // server config update messages. | |
| 208 std::string chlo_hash_; | |
| 209 | |
| 210 // Pointer to the active callback that will receive the result of | |
| 211 // the client hello validation request and forward it to | |
| 212 // FinishProcessingHandshakeMessage for processing. nullptr if no | |
| 213 // handshake message is being validated. | |
| 214 ValidateCallback* validate_client_hello_cb_; | |
| 215 | |
| 216 // Number of handshake messages received by this stream. | |
| 217 uint8_t num_handshake_messages_; | |
| 218 | |
| 219 // Number of handshake messages received by this stream that contain | |
| 220 // server nonces (indicating that this is a non-zero-RTT handshake | |
| 221 // attempt). | |
| 222 uint8_t num_handshake_messages_with_server_nonces_; | |
| 223 | |
| 224 // Pointer to the active callback that will receive the result of | |
| 225 // BuildServerConfigUpdateMessage and forward it to | |
| 226 // FinishSendServerConfigUpdate. nullptr if no update message is currently | |
| 227 // being built. | |
| 228 SendServerConfigUpdateCallback* send_server_config_update_cb_; | |
| 229 | |
| 230 // Number of server config update (SCUP) messages sent by this stream. | |
| 231 int num_server_config_update_messages_sent_; | |
| 232 | |
| 233 // If the client provides CachedNetworkParameters in the STK in the CHLO, then | |
| 234 // store here, and send back in future STKs if we have no better bandwidth | |
| 235 // estimate to send. | |
| 236 std::unique_ptr<CachedNetworkParameters> previous_cached_network_params_; | |
| 237 | |
| 238 // Contains any source address tokens which were present in the CHLO. | |
| 239 SourceAddressTokens previous_source_address_tokens_; | |
| 240 | |
| 241 // If true, the server should use stateless rejects, so long as the | |
| 242 // client supports them, as indicated by | |
| 243 // peer_supports_stateless_rejects_. | |
| 244 bool use_stateless_rejects_if_peer_supported_; | |
| 245 | |
| 246 // Set to true, once the server has received information from the | |
| 247 // client that it supports stateless reject. | |
| 248 // TODO(jokulik): Remove once client stateless reject support | |
| 249 // becomes the default. | |
| 250 bool peer_supports_stateless_rejects_; | |
| 251 | |
| 252 DISALLOW_COPY_AND_ASSIGN(QuicCryptoServerStream); | |
| 253 }; | |
| 254 | |
| 255 } // namespace net | |
| 256 | |
| 257 #endif // NET_QUIC_QUIC_CRYPTO_SERVER_STREAM_H_ | |
| OLD | NEW |