| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_crypto_server_stream.h" | 5 #include "net/quic/quic_crypto_server_stream.h" |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "crypto/secure_hash.h" | 8 #include "crypto/secure_hash.h" |
| 9 #include "net/quic/crypto/crypto_protocol.h" | 9 #include "net/quic/crypto/crypto_protocol.h" |
| 10 #include "net/quic/crypto/crypto_utils.h" | 10 #include "net/quic/crypto/crypto_utils.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 int num_retransmitted_bytes, | 23 int num_retransmitted_bytes, |
| 24 QuicTime::Delta delta_largest_observed) { | 24 QuicTime::Delta delta_largest_observed) { |
| 25 server_stream_->OnServerHelloAcked(); | 25 server_stream_->OnServerHelloAcked(); |
| 26 } | 26 } |
| 27 | 27 |
| 28 QuicCryptoServerStream::QuicCryptoServerStream( | 28 QuicCryptoServerStream::QuicCryptoServerStream( |
| 29 const QuicCryptoServerConfig& crypto_config, | 29 const QuicCryptoServerConfig& crypto_config, |
| 30 QuicSession* session) | 30 QuicSession* session) |
| 31 : QuicCryptoStream(session), | 31 : QuicCryptoStream(session), |
| 32 crypto_config_(crypto_config), | 32 crypto_config_(crypto_config), |
| 33 validate_client_hello_cb_(NULL), | 33 validate_client_hello_cb_(nullptr), |
| 34 num_handshake_messages_(0), | 34 num_handshake_messages_(0), |
| 35 num_server_config_update_messages_sent_(0) { | 35 num_server_config_update_messages_sent_(0) {} |
| 36 } | |
| 37 | 36 |
| 38 QuicCryptoServerStream::~QuicCryptoServerStream() { | 37 QuicCryptoServerStream::~QuicCryptoServerStream() { |
| 39 CancelOutstandingCallbacks(); | 38 CancelOutstandingCallbacks(); |
| 40 } | 39 } |
| 41 | 40 |
| 42 void QuicCryptoServerStream::CancelOutstandingCallbacks() { | 41 void QuicCryptoServerStream::CancelOutstandingCallbacks() { |
| 43 // Detach from the validation callback. Calling this multiple times is safe. | 42 // Detach from the validation callback. Calling this multiple times is safe. |
| 44 if (validate_client_hello_cb_ != NULL) { | 43 if (validate_client_hello_cb_ != nullptr) { |
| 45 validate_client_hello_cb_->Cancel(); | 44 validate_client_hello_cb_->Cancel(); |
| 46 } | 45 } |
| 47 } | 46 } |
| 48 | 47 |
| 49 void QuicCryptoServerStream::OnHandshakeMessage( | 48 void QuicCryptoServerStream::OnHandshakeMessage( |
| 50 const CryptoHandshakeMessage& message) { | 49 const CryptoHandshakeMessage& message) { |
| 51 QuicCryptoStream::OnHandshakeMessage(message); | 50 QuicCryptoStream::OnHandshakeMessage(message); |
| 52 ++num_handshake_messages_; | 51 ++num_handshake_messages_; |
| 53 | 52 |
| 54 // Do not process handshake messages after the handshake is confirmed. | 53 // Do not process handshake messages after the handshake is confirmed. |
| 55 if (handshake_confirmed_) { | 54 if (handshake_confirmed_) { |
| 56 CloseConnection(QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE); | 55 CloseConnection(QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE); |
| 57 return; | 56 return; |
| 58 } | 57 } |
| 59 | 58 |
| 60 if (message.tag() != kCHLO) { | 59 if (message.tag() != kCHLO) { |
| 61 CloseConnection(QUIC_INVALID_CRYPTO_MESSAGE_TYPE); | 60 CloseConnection(QUIC_INVALID_CRYPTO_MESSAGE_TYPE); |
| 62 return; | 61 return; |
| 63 } | 62 } |
| 64 | 63 |
| 65 if (validate_client_hello_cb_ != NULL) { | 64 if (validate_client_hello_cb_ != nullptr) { |
| 66 // Already processing some other handshake message. The protocol | 65 // Already processing some other handshake message. The protocol |
| 67 // does not allow for clients to send multiple handshake messages | 66 // does not allow for clients to send multiple handshake messages |
| 68 // before the server has a chance to respond. | 67 // before the server has a chance to respond. |
| 69 CloseConnection(QUIC_CRYPTO_MESSAGE_WHILE_VALIDATING_CLIENT_HELLO); | 68 CloseConnection(QUIC_CRYPTO_MESSAGE_WHILE_VALIDATING_CLIENT_HELLO); |
| 70 return; | 69 return; |
| 71 } | 70 } |
| 72 | 71 |
| 73 validate_client_hello_cb_ = new ValidateCallback(this); | 72 validate_client_hello_cb_ = new ValidateCallback(this); |
| 74 return crypto_config_.ValidateClientHello( | 73 return crypto_config_.ValidateClientHello( |
| 75 message, | 74 message, |
| 76 session()->connection()->peer_address(), | 75 session()->connection()->peer_address(), |
| 77 session()->connection()->clock(), | 76 session()->connection()->clock(), |
| 78 validate_client_hello_cb_); | 77 validate_client_hello_cb_); |
| 79 } | 78 } |
| 80 | 79 |
| 81 void QuicCryptoServerStream::FinishProcessingHandshakeMessage( | 80 void QuicCryptoServerStream::FinishProcessingHandshakeMessage( |
| 82 const CryptoHandshakeMessage& message, | 81 const CryptoHandshakeMessage& message, |
| 83 const ValidateClientHelloResultCallback::Result& result) { | 82 const ValidateClientHelloResultCallback::Result& result) { |
| 84 // Clear the callback that got us here. | 83 // Clear the callback that got us here. |
| 85 DCHECK(validate_client_hello_cb_ != NULL); | 84 DCHECK(validate_client_hello_cb_ != nullptr); |
| 86 validate_client_hello_cb_ = NULL; | 85 validate_client_hello_cb_ = nullptr; |
| 87 | 86 |
| 88 string error_details; | 87 string error_details; |
| 89 CryptoHandshakeMessage reply; | 88 CryptoHandshakeMessage reply; |
| 90 QuicErrorCode error = ProcessClientHello( | 89 QuicErrorCode error = ProcessClientHello( |
| 91 message, result, &reply, &error_details); | 90 message, result, &reply, &error_details); |
| 92 | 91 |
| 93 if (error != QUIC_NO_ERROR) { | 92 if (error != QUIC_NO_ERROR) { |
| 94 CloseConnectionWithDetails(error, error_details); | 93 CloseConnectionWithDetails(error, error_details); |
| 95 return; | 94 return; |
| 96 } | 95 } |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 session()->connection()->SetAlternativeDecrypter( | 145 session()->connection()->SetAlternativeDecrypter( |
| 147 crypto_negotiated_params_.forward_secure_crypters.decrypter.release(), | 146 crypto_negotiated_params_.forward_secure_crypters.decrypter.release(), |
| 148 ENCRYPTION_FORWARD_SECURE, false /* don't latch */); | 147 ENCRYPTION_FORWARD_SECURE, false /* don't latch */); |
| 149 | 148 |
| 150 encryption_established_ = true; | 149 encryption_established_ = true; |
| 151 handshake_confirmed_ = true; | 150 handshake_confirmed_ = true; |
| 152 session()->OnCryptoHandshakeEvent(QuicSession::HANDSHAKE_CONFIRMED); | 151 session()->OnCryptoHandshakeEvent(QuicSession::HANDSHAKE_CONFIRMED); |
| 153 | 152 |
| 154 // Now that the handshake is complete, send an updated server config and | 153 // Now that the handshake is complete, send an updated server config and |
| 155 // source-address token to the client. | 154 // source-address token to the client. |
| 156 SendServerConfigUpdate(NULL); | 155 SendServerConfigUpdate(nullptr); |
| 157 } | 156 } |
| 158 | 157 |
| 159 void QuicCryptoServerStream::SendServerConfigUpdate( | 158 void QuicCryptoServerStream::SendServerConfigUpdate( |
| 160 const CachedNetworkParameters* cached_network_params) { | 159 const CachedNetworkParameters* cached_network_params) { |
| 161 if (session()->connection()->version() <= QUIC_VERSION_21 || | 160 if (session()->connection()->version() <= QUIC_VERSION_21 || |
| 162 !handshake_confirmed_) { | 161 !handshake_confirmed_) { |
| 163 return; | 162 return; |
| 164 } | 163 } |
| 165 | 164 |
| 166 CryptoHandshakeMessage server_config_update_message; | 165 CryptoHandshakeMessage server_config_update_message; |
| 167 if (!crypto_config_.BuildServerConfigUpdateMessage( | 166 if (!crypto_config_.BuildServerConfigUpdateMessage( |
| 168 session()->connection()->peer_address(), | 167 session()->connection()->peer_address(), |
| 169 session()->connection()->clock(), | 168 session()->connection()->clock(), |
| 170 session()->connection()->random_generator(), | 169 session()->connection()->random_generator(), |
| 171 crypto_negotiated_params_, | 170 crypto_negotiated_params_, |
| 172 cached_network_params, | 171 cached_network_params, |
| 173 &server_config_update_message)) { | 172 &server_config_update_message)) { |
| 174 DVLOG(1) << "Server: Failed to build server config update (SCUP)!"; | 173 DVLOG(1) << "Server: Failed to build server config update (SCUP)!"; |
| 175 return; | 174 return; |
| 176 } | 175 } |
| 177 | 176 |
| 178 DVLOG(1) << "Server: Sending server config update: " | 177 DVLOG(1) << "Server: Sending server config update: " |
| 179 << server_config_update_message.DebugString(); | 178 << server_config_update_message.DebugString(); |
| 180 const QuicData& data = server_config_update_message.GetSerialized(); | 179 const QuicData& data = server_config_update_message.GetSerialized(); |
| 181 WriteOrBufferData(string(data.data(), data.length()), false, NULL); | 180 WriteOrBufferData(string(data.data(), data.length()), false, nullptr); |
| 182 | 181 |
| 183 ++num_server_config_update_messages_sent_; | 182 ++num_server_config_update_messages_sent_; |
| 184 } | 183 } |
| 185 | 184 |
| 186 void QuicCryptoServerStream::OnServerHelloAcked() { | 185 void QuicCryptoServerStream::OnServerHelloAcked() { |
| 187 session()->connection()->OnHandshakeComplete(); | 186 session()->connection()->OnHandshakeComplete(); |
| 188 } | 187 } |
| 189 | 188 |
| 190 bool QuicCryptoServerStream::GetBase64SHA256ClientChannelID( | 189 bool QuicCryptoServerStream::GetBase64SHA256ClientChannelID( |
| 191 string* output) const { | 190 string* output) const { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 &crypto_negotiated_params_, reply, error_details); | 232 &crypto_negotiated_params_, reply, error_details); |
| 234 } | 233 } |
| 235 | 234 |
| 236 void QuicCryptoServerStream::OverrideQuicConfigDefaults(QuicConfig* config) { | 235 void QuicCryptoServerStream::OverrideQuicConfigDefaults(QuicConfig* config) { |
| 237 } | 236 } |
| 238 | 237 |
| 239 QuicCryptoServerStream::ValidateCallback::ValidateCallback( | 238 QuicCryptoServerStream::ValidateCallback::ValidateCallback( |
| 240 QuicCryptoServerStream* parent) : parent_(parent) { | 239 QuicCryptoServerStream* parent) : parent_(parent) { |
| 241 } | 240 } |
| 242 | 241 |
| 243 void QuicCryptoServerStream::ValidateCallback::Cancel() { | 242 void QuicCryptoServerStream::ValidateCallback::Cancel() { parent_ = nullptr; } |
| 244 parent_ = NULL; | |
| 245 } | |
| 246 | 243 |
| 247 void QuicCryptoServerStream::ValidateCallback::RunImpl( | 244 void QuicCryptoServerStream::ValidateCallback::RunImpl( |
| 248 const CryptoHandshakeMessage& client_hello, | 245 const CryptoHandshakeMessage& client_hello, |
| 249 const Result& result) { | 246 const Result& result) { |
| 250 if (parent_ != NULL) { | 247 if (parent_ != nullptr) { |
| 251 parent_->FinishProcessingHandshakeMessage(client_hello, result); | 248 parent_->FinishProcessingHandshakeMessage(client_hello, result); |
| 252 } | 249 } |
| 253 } | 250 } |
| 254 | 251 |
| 255 } // namespace net | 252 } // namespace net |
| OLD | NEW |