| 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/core/quic_crypto_server_stream.h" | 5 #include "net/quic/core/quic_crypto_server_stream.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "net/quic/core/crypto/crypto_protocol.h" | 9 #include "net/quic/core/crypto/crypto_protocol.h" |
| 10 #include "net/quic/core/crypto/crypto_utils.h" | 10 #include "net/quic/core/crypto/crypto_utils.h" |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 compressed_certs_cache_(compressed_certs_cache), | 90 compressed_certs_cache_(compressed_certs_cache), |
| 91 signed_config_(new QuicSignedServerConfig), | 91 signed_config_(new QuicSignedServerConfig), |
| 92 helper_(helper), | 92 helper_(helper), |
| 93 num_handshake_messages_(0), | 93 num_handshake_messages_(0), |
| 94 num_handshake_messages_with_server_nonces_(0), | 94 num_handshake_messages_with_server_nonces_(0), |
| 95 send_server_config_update_cb_(nullptr), | 95 send_server_config_update_cb_(nullptr), |
| 96 num_server_config_update_messages_sent_(0), | 96 num_server_config_update_messages_sent_(0), |
| 97 use_stateless_rejects_if_peer_supported_( | 97 use_stateless_rejects_if_peer_supported_( |
| 98 use_stateless_rejects_if_peer_supported), | 98 use_stateless_rejects_if_peer_supported), |
| 99 peer_supports_stateless_rejects_(false), | 99 peer_supports_stateless_rejects_(false), |
| 100 zero_rtt_attempted_(false), |
| 100 chlo_packet_size_(0), | 101 chlo_packet_size_(0), |
| 101 validate_client_hello_cb_(nullptr), | 102 validate_client_hello_cb_(nullptr), |
| 102 process_client_hello_cb_(nullptr) { | 103 process_client_hello_cb_(nullptr) { |
| 103 DCHECK_EQ(Perspective::IS_SERVER, session->connection()->perspective()); | 104 DCHECK_EQ(Perspective::IS_SERVER, session->connection()->perspective()); |
| 104 } | 105 } |
| 105 | 106 |
| 106 QuicCryptoServerStream::~QuicCryptoServerStream() { | 107 QuicCryptoServerStream::~QuicCryptoServerStream() { |
| 107 CancelOutstandingCallbacks(); | 108 CancelOutstandingCallbacks(); |
| 108 } | 109 } |
| 109 | 110 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 } | 155 } |
| 155 | 156 |
| 156 CryptoUtils::HashHandshakeMessage(message, &chlo_hash_, | 157 CryptoUtils::HashHandshakeMessage(message, &chlo_hash_, |
| 157 Perspective::IS_SERVER); | 158 Perspective::IS_SERVER); |
| 158 | 159 |
| 159 std::unique_ptr<ValidateCallback> cb(new ValidateCallback(this)); | 160 std::unique_ptr<ValidateCallback> cb(new ValidateCallback(this)); |
| 160 DCHECK(validate_client_hello_cb_ == nullptr); | 161 DCHECK(validate_client_hello_cb_ == nullptr); |
| 161 DCHECK(process_client_hello_cb_ == nullptr); | 162 DCHECK(process_client_hello_cb_ == nullptr); |
| 162 validate_client_hello_cb_ = cb.get(); | 163 validate_client_hello_cb_ = cb.get(); |
| 163 crypto_config_->ValidateClientHello( | 164 crypto_config_->ValidateClientHello( |
| 164 message, session()->connection()->peer_address().host(), | 165 message, GetClientAddress().host(), |
| 165 session()->connection()->self_address(), version(), | 166 session()->connection()->self_address(), version(), |
| 166 session()->connection()->clock(), signed_config_, std::move(cb)); | 167 session()->connection()->clock(), signed_config_, std::move(cb)); |
| 167 } | 168 } |
| 168 | 169 |
| 169 void QuicCryptoServerStream::FinishProcessingHandshakeMessage( | 170 void QuicCryptoServerStream::FinishProcessingHandshakeMessage( |
| 170 QuicReferenceCountedPointer<ValidateClientHelloResultCallback::Result> | 171 QuicReferenceCountedPointer<ValidateClientHelloResultCallback::Result> |
| 171 result, | 172 result, |
| 172 std::unique_ptr<ProofSource::Details> details) { | 173 std::unique_ptr<ProofSource::Details> details) { |
| 173 const CryptoHandshakeMessage& message = result->client_hello; | 174 const CryptoHandshakeMessage& message = result->client_hello; |
| 174 | 175 |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 return; | 294 return; |
| 294 } | 295 } |
| 295 | 296 |
| 296 std::unique_ptr<SendServerConfigUpdateCallback> cb( | 297 std::unique_ptr<SendServerConfigUpdateCallback> cb( |
| 297 new SendServerConfigUpdateCallback(this)); | 298 new SendServerConfigUpdateCallback(this)); |
| 298 send_server_config_update_cb_ = cb.get(); | 299 send_server_config_update_cb_ = cb.get(); |
| 299 | 300 |
| 300 crypto_config_->BuildServerConfigUpdateMessage( | 301 crypto_config_->BuildServerConfigUpdateMessage( |
| 301 session()->connection()->version(), chlo_hash_, | 302 session()->connection()->version(), chlo_hash_, |
| 302 previous_source_address_tokens_, session()->connection()->self_address(), | 303 previous_source_address_tokens_, session()->connection()->self_address(), |
| 303 session()->connection()->peer_address().host(), | 304 GetClientAddress().host(), session()->connection()->clock(), |
| 304 session()->connection()->clock(), | |
| 305 session()->connection()->random_generator(), compressed_certs_cache_, | 305 session()->connection()->random_generator(), compressed_certs_cache_, |
| 306 *crypto_negotiated_params_, cached_network_params, | 306 *crypto_negotiated_params_, cached_network_params, |
| 307 (session()->config()->HasReceivedConnectionOptions() | 307 (session()->config()->HasReceivedConnectionOptions() |
| 308 ? session()->config()->ReceivedConnectionOptions() | 308 ? session()->config()->ReceivedConnectionOptions() |
| 309 : QuicTagVector()), | 309 : QuicTagVector()), |
| 310 std::move(cb)); | 310 std::move(cb)); |
| 311 } | 311 } |
| 312 | 312 |
| 313 QuicCryptoServerStream::SendServerConfigUpdateCallback:: | 313 QuicCryptoServerStream::SendServerConfigUpdateCallback:: |
| 314 SendServerConfigUpdateCallback(QuicCryptoServerStream* parent) | 314 SendServerConfigUpdateCallback(QuicCryptoServerStream* parent) |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 } | 367 } |
| 368 | 368 |
| 369 bool QuicCryptoServerStream::UseStatelessRejectsIfPeerSupported() const { | 369 bool QuicCryptoServerStream::UseStatelessRejectsIfPeerSupported() const { |
| 370 return use_stateless_rejects_if_peer_supported_; | 370 return use_stateless_rejects_if_peer_supported_; |
| 371 } | 371 } |
| 372 | 372 |
| 373 bool QuicCryptoServerStream::PeerSupportsStatelessRejects() const { | 373 bool QuicCryptoServerStream::PeerSupportsStatelessRejects() const { |
| 374 return peer_supports_stateless_rejects_; | 374 return peer_supports_stateless_rejects_; |
| 375 } | 375 } |
| 376 | 376 |
| 377 bool QuicCryptoServerStream::ZeroRttAttempted() const { |
| 378 return zero_rtt_attempted_; |
| 379 } |
| 380 |
| 377 void QuicCryptoServerStream::SetPeerSupportsStatelessRejects( | 381 void QuicCryptoServerStream::SetPeerSupportsStatelessRejects( |
| 378 bool peer_supports_stateless_rejects) { | 382 bool peer_supports_stateless_rejects) { |
| 379 peer_supports_stateless_rejects_ = peer_supports_stateless_rejects; | 383 peer_supports_stateless_rejects_ = peer_supports_stateless_rejects; |
| 380 } | 384 } |
| 381 | 385 |
| 382 void QuicCryptoServerStream::SetPreviousCachedNetworkParams( | 386 void QuicCryptoServerStream::SetPreviousCachedNetworkParams( |
| 383 CachedNetworkParameters cached_network_params) { | 387 CachedNetworkParameters cached_network_params) { |
| 384 previous_cached_network_params_.reset( | 388 previous_cached_network_params_.reset( |
| 385 new CachedNetworkParameters(cached_network_params)); | 389 new CachedNetworkParameters(cached_network_params)); |
| 386 } | 390 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 407 std::unique_ptr<ProofSource::Details> proof_source_details, | 411 std::unique_ptr<ProofSource::Details> proof_source_details, |
| 408 std::unique_ptr<ProcessClientHelloResultCallback> done_cb) { | 412 std::unique_ptr<ProcessClientHelloResultCallback> done_cb) { |
| 409 const CryptoHandshakeMessage& message = result->client_hello; | 413 const CryptoHandshakeMessage& message = result->client_hello; |
| 410 string error_details; | 414 string error_details; |
| 411 if (!helper_->CanAcceptClientHello( | 415 if (!helper_->CanAcceptClientHello( |
| 412 message, session()->connection()->self_address(), &error_details)) { | 416 message, session()->connection()->self_address(), &error_details)) { |
| 413 done_cb->Run(QUIC_HANDSHAKE_FAILED, error_details, nullptr, nullptr, | 417 done_cb->Run(QUIC_HANDSHAKE_FAILED, error_details, nullptr, nullptr, |
| 414 nullptr); | 418 nullptr); |
| 415 return; | 419 return; |
| 416 } | 420 } |
| 417 | |
| 418 if (!result->info.server_nonce.empty()) { | 421 if (!result->info.server_nonce.empty()) { |
| 419 ++num_handshake_messages_with_server_nonces_; | 422 ++num_handshake_messages_with_server_nonces_; |
| 420 } | 423 } |
| 424 |
| 425 if (num_handshake_messages_ == 1) { |
| 426 // Client attempts zero RTT handshake by sending a non-inchoate CHLO. |
| 427 QuicStringPiece public_value; |
| 428 zero_rtt_attempted_ = message.GetStringPiece(kPUBS, &public_value); |
| 429 } |
| 430 |
| 421 // Store the bandwidth estimate from the client. | 431 // Store the bandwidth estimate from the client. |
| 422 if (result->cached_network_params.bandwidth_estimate_bytes_per_second() > 0) { | 432 if (result->cached_network_params.bandwidth_estimate_bytes_per_second() > 0) { |
| 423 previous_cached_network_params_.reset( | 433 previous_cached_network_params_.reset( |
| 424 new CachedNetworkParameters(result->cached_network_params)); | 434 new CachedNetworkParameters(result->cached_network_params)); |
| 425 } | 435 } |
| 426 previous_source_address_tokens_ = result->info.source_address_tokens; | 436 previous_source_address_tokens_ = result->info.source_address_tokens; |
| 427 | 437 |
| 428 const bool use_stateless_rejects_in_crypto_config = | 438 const bool use_stateless_rejects_in_crypto_config = |
| 429 use_stateless_rejects_if_peer_supported_ && | 439 use_stateless_rejects_if_peer_supported_ && |
| 430 peer_supports_stateless_rejects_; | 440 peer_supports_stateless_rejects_; |
| 431 QuicConnection* connection = session()->connection(); | 441 QuicConnection* connection = session()->connection(); |
| 432 const QuicConnectionId server_designated_connection_id = | 442 const QuicConnectionId server_designated_connection_id = |
| 433 GenerateConnectionIdForReject(use_stateless_rejects_in_crypto_config); | 443 GenerateConnectionIdForReject(use_stateless_rejects_in_crypto_config); |
| 434 crypto_config_->ProcessClientHello( | 444 crypto_config_->ProcessClientHello( |
| 435 result, /*reject_only=*/false, connection->connection_id(), | 445 result, /*reject_only=*/false, connection->connection_id(), |
| 436 connection->self_address(), connection->peer_address(), version(), | 446 connection->self_address(), GetClientAddress(), version(), |
| 437 connection->supported_versions(), use_stateless_rejects_in_crypto_config, | 447 connection->supported_versions(), use_stateless_rejects_in_crypto_config, |
| 438 server_designated_connection_id, connection->clock(), | 448 server_designated_connection_id, connection->clock(), |
| 439 connection->random_generator(), compressed_certs_cache_, | 449 connection->random_generator(), compressed_certs_cache_, |
| 440 crypto_negotiated_params_, signed_config_, | 450 crypto_negotiated_params_, signed_config_, |
| 441 QuicCryptoStream::CryptoMessageFramingOverhead(version()), | 451 QuicCryptoStream::CryptoMessageFramingOverhead(version()), |
| 442 chlo_packet_size_, std::move(done_cb)); | 452 chlo_packet_size_, std::move(done_cb)); |
| 443 } | 453 } |
| 444 | 454 |
| 445 void QuicCryptoServerStream::OverrideQuicConfigDefaults(QuicConfig* config) {} | 455 void QuicCryptoServerStream::OverrideQuicConfigDefaults(QuicConfig* config) {} |
| 446 | 456 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 463 | 473 |
| 464 QuicConnectionId QuicCryptoServerStream::GenerateConnectionIdForReject( | 474 QuicConnectionId QuicCryptoServerStream::GenerateConnectionIdForReject( |
| 465 bool use_stateless_rejects) { | 475 bool use_stateless_rejects) { |
| 466 if (!use_stateless_rejects) { | 476 if (!use_stateless_rejects) { |
| 467 return 0; | 477 return 0; |
| 468 } | 478 } |
| 469 return helper_->GenerateConnectionIdForReject( | 479 return helper_->GenerateConnectionIdForReject( |
| 470 session()->connection()->connection_id()); | 480 session()->connection()->connection_id()); |
| 471 } | 481 } |
| 472 | 482 |
| 483 const QuicSocketAddress QuicCryptoServerStream::GetClientAddress() { |
| 484 return session()->connection()->peer_address(); |
| 485 } |
| 486 |
| 473 } // namespace net | 487 } // namespace net |
| OLD | NEW |