| 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_client_stream.h" | 5 #include "net/quic/quic_crypto_client_stream.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/metrics/histogram_macros.h" | 9 #include "base/metrics/histogram_macros.h" |
| 10 #include "base/metrics/sparse_histogram.h" | 10 #include "base/metrics/sparse_histogram.h" |
| 11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
| 12 #include "net/quic/crypto/crypto_protocol.h" | 12 #include "net/quic/crypto/crypto_protocol.h" |
| 13 #include "net/quic/crypto/crypto_utils.h" | 13 #include "net/quic/crypto/crypto_utils.h" |
| 14 #include "net/quic/crypto/null_encrypter.h" | 14 #include "net/quic/crypto/null_encrypter.h" |
| 15 #include "net/quic/quic_client_session_base.h" | |
| 16 #include "net/quic/quic_flags.h" | 15 #include "net/quic/quic_flags.h" |
| 17 #include "net/quic/quic_protocol.h" | 16 #include "net/quic/quic_protocol.h" |
| 18 #include "net/quic/quic_session.h" | 17 #include "net/quic/quic_session.h" |
| 19 | 18 |
| 20 using std::string; | 19 using std::string; |
| 21 using std::vector; | 20 using std::vector; |
| 22 | 21 |
| 23 namespace net { | 22 namespace net { |
| 24 | 23 |
| 25 namespace { | 24 namespace { |
| 26 | 25 |
| 27 void AppendFixed(CryptoHandshakeMessage* message) { | 26 void AppendFixed(CryptoHandshakeMessage* message) { |
| 28 vector<QuicTag> tags; | 27 vector<QuicTag> tags; |
| 29 tags.push_back(kFIXD); | 28 tags.push_back(kFIXD); |
| 30 | 29 |
| 31 const QuicTag* received_tags; | 30 const QuicTag* received_tags; |
| 32 size_t received_tags_length; | 31 size_t received_tags_length; |
| 33 QuicErrorCode error = | 32 QuicErrorCode error = |
| 34 message->GetTaglist(kCOPT, &received_tags, &received_tags_length); | 33 message->GetTaglist(kCOPT, &received_tags, &received_tags_length); |
| 35 if (error == QUIC_NO_ERROR) { | 34 if (error == QUIC_NO_ERROR) { |
| 36 for (size_t i = 0; i < received_tags_length; ++i) { | 35 for (size_t i = 0; i < received_tags_length; ++i) { |
| 37 tags.push_back(received_tags[i]); | 36 tags.push_back(received_tags[i]); |
| 38 } | 37 } |
| 39 } | 38 } |
| 40 message->SetVector(kCOPT, tags); | 39 message->SetVector(kCOPT, tags); |
| 41 } | 40 } |
| 42 | 41 |
| 43 } // namespace | 42 } // namespace |
| 44 | 43 |
| 45 QuicCryptoClientStreamBase::QuicCryptoClientStreamBase( | 44 QuicCryptoClientStreamBase::QuicCryptoClientStreamBase(QuicSession* session) |
| 46 QuicClientSessionBase* session) | |
| 47 : QuicCryptoStream(session) {} | 45 : QuicCryptoStream(session) {} |
| 48 | 46 |
| 49 QuicCryptoClientStream::ChannelIDSourceCallbackImpl:: | 47 QuicCryptoClientStream::ChannelIDSourceCallbackImpl:: |
| 50 ChannelIDSourceCallbackImpl(QuicCryptoClientStream* stream) | 48 ChannelIDSourceCallbackImpl(QuicCryptoClientStream* stream) |
| 51 : stream_(stream) {} | 49 : stream_(stream) {} |
| 52 | 50 |
| 53 QuicCryptoClientStream::ChannelIDSourceCallbackImpl:: | 51 QuicCryptoClientStream::ChannelIDSourceCallbackImpl:: |
| 54 ~ChannelIDSourceCallbackImpl() {} | 52 ~ChannelIDSourceCallbackImpl() {} |
| 55 | 53 |
| 56 void QuicCryptoClientStream::ChannelIDSourceCallbackImpl::Run( | 54 void QuicCryptoClientStream::ChannelIDSourceCallbackImpl::Run( |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 // The ProofVerifier owns this object and will delete it when this method | 94 // The ProofVerifier owns this object and will delete it when this method |
| 97 // returns. | 95 // returns. |
| 98 } | 96 } |
| 99 | 97 |
| 100 void QuicCryptoClientStream::ProofVerifierCallbackImpl::Cancel() { | 98 void QuicCryptoClientStream::ProofVerifierCallbackImpl::Cancel() { |
| 101 stream_ = nullptr; | 99 stream_ = nullptr; |
| 102 } | 100 } |
| 103 | 101 |
| 104 QuicCryptoClientStream::QuicCryptoClientStream( | 102 QuicCryptoClientStream::QuicCryptoClientStream( |
| 105 const QuicServerId& server_id, | 103 const QuicServerId& server_id, |
| 106 QuicClientSessionBase* session, | 104 QuicSession* session, |
| 107 ProofVerifyContext* verify_context, | 105 ProofVerifyContext* verify_context, |
| 108 QuicCryptoClientConfig* crypto_config) | 106 QuicCryptoClientConfig* crypto_config, |
| 107 ProofHandler* proof_handler) |
| 109 : QuicCryptoClientStreamBase(session), | 108 : QuicCryptoClientStreamBase(session), |
| 110 next_state_(STATE_IDLE), | 109 next_state_(STATE_IDLE), |
| 111 num_client_hellos_(0), | 110 num_client_hellos_(0), |
| 112 crypto_config_(crypto_config), | 111 crypto_config_(crypto_config), |
| 113 server_id_(server_id), | 112 server_id_(server_id), |
| 114 generation_counter_(0), | 113 generation_counter_(0), |
| 115 channel_id_sent_(false), | 114 channel_id_sent_(false), |
| 116 channel_id_source_callback_run_(false), | 115 channel_id_source_callback_run_(false), |
| 117 channel_id_source_callback_(nullptr), | 116 channel_id_source_callback_(nullptr), |
| 118 verify_context_(verify_context), | 117 verify_context_(verify_context), |
| 119 proof_verify_callback_(nullptr), | 118 proof_verify_callback_(nullptr), |
| 119 proof_handler_(proof_handler), |
| 120 stateless_reject_received_(false) { | 120 stateless_reject_received_(false) { |
| 121 DCHECK_EQ(Perspective::IS_CLIENT, session->connection()->perspective()); | 121 DCHECK_EQ(Perspective::IS_CLIENT, session->connection()->perspective()); |
| 122 } | 122 } |
| 123 | 123 |
| 124 QuicCryptoClientStream::~QuicCryptoClientStream() { | 124 QuicCryptoClientStream::~QuicCryptoClientStream() { |
| 125 if (channel_id_source_callback_) { | 125 if (channel_id_source_callback_) { |
| 126 channel_id_source_callback_->Cancel(); | 126 channel_id_source_callback_->Cancel(); |
| 127 } | 127 } |
| 128 if (proof_verify_callback_) { | 128 if (proof_verify_callback_) { |
| 129 proof_verify_callback_->Cancel(); | 129 proof_verify_callback_->Cancel(); |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 | 349 |
| 350 if (error != QUIC_NO_ERROR) { | 350 if (error != QUIC_NO_ERROR) { |
| 351 // Flush the cached config so that, if it's bad, the server has a | 351 // Flush the cached config so that, if it's bad, the server has a |
| 352 // chance to send us another in the future. | 352 // chance to send us another in the future. |
| 353 cached->InvalidateServerConfig(); | 353 cached->InvalidateServerConfig(); |
| 354 CloseConnectionWithDetails(error, error_details); | 354 CloseConnectionWithDetails(error, error_details); |
| 355 return; | 355 return; |
| 356 } | 356 } |
| 357 channel_id_sent_ = (channel_id_key_.get() != nullptr); | 357 channel_id_sent_ = (channel_id_key_.get() != nullptr); |
| 358 if (cached->proof_verify_details()) { | 358 if (cached->proof_verify_details()) { |
| 359 client_session()->OnProofVerifyDetailsAvailable( | 359 proof_handler_->OnProofVerifyDetailsAvailable( |
| 360 *cached->proof_verify_details()); | 360 *cached->proof_verify_details()); |
| 361 } | 361 } |
| 362 next_state_ = STATE_RECV_SHLO; | 362 next_state_ = STATE_RECV_SHLO; |
| 363 SendHandshakeMessage(out); | 363 SendHandshakeMessage(out); |
| 364 // Be prepared to decrypt with the new server write key. | 364 // Be prepared to decrypt with the new server write key. |
| 365 session()->connection()->SetAlternativeDecrypter( | 365 session()->connection()->SetAlternativeDecrypter( |
| 366 ENCRYPTION_INITIAL, | 366 ENCRYPTION_INITIAL, |
| 367 crypto_negotiated_params_.initial_crypters.decrypter.release(), | 367 crypto_negotiated_params_.initial_crypters.decrypter.release(), |
| 368 true /* latch once used */); | 368 true /* latch once used */); |
| 369 // Send subsequent packets under encryption on the assumption that the | 369 // Send subsequent packets under encryption on the assumption that the |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 } | 479 } |
| 480 | 480 |
| 481 void QuicCryptoClientStream::DoVerifyProofComplete( | 481 void QuicCryptoClientStream::DoVerifyProofComplete( |
| 482 QuicCryptoClientConfig::CachedState* cached) { | 482 QuicCryptoClientConfig::CachedState* cached) { |
| 483 if (!proof_verify_start_time_.is_null()) { | 483 if (!proof_verify_start_time_.is_null()) { |
| 484 UMA_HISTOGRAM_TIMES("Net.QuicSession.VerifyProofTime.CachedServerConfig", | 484 UMA_HISTOGRAM_TIMES("Net.QuicSession.VerifyProofTime.CachedServerConfig", |
| 485 base::TimeTicks::Now() - proof_verify_start_time_); | 485 base::TimeTicks::Now() - proof_verify_start_time_); |
| 486 } | 486 } |
| 487 if (!verify_ok_) { | 487 if (!verify_ok_) { |
| 488 if (verify_details_.get()) { | 488 if (verify_details_.get()) { |
| 489 client_session()->OnProofVerifyDetailsAvailable(*verify_details_); | 489 proof_handler_->OnProofVerifyDetailsAvailable(*verify_details_); |
| 490 } | 490 } |
| 491 if (num_client_hellos_ == 0) { | 491 if (num_client_hellos_ == 0) { |
| 492 cached->Clear(); | 492 cached->Clear(); |
| 493 next_state_ = STATE_INITIALIZE; | 493 next_state_ = STATE_INITIALIZE; |
| 494 return; | 494 return; |
| 495 } | 495 } |
| 496 next_state_ = STATE_NONE; | 496 next_state_ = STATE_NONE; |
| 497 UMA_HISTOGRAM_BOOLEAN("Net.QuicVerifyProofFailed.HandshakeConfirmed", | 497 UMA_HISTOGRAM_BOOLEAN("Net.QuicVerifyProofFailed.HandshakeConfirmed", |
| 498 handshake_confirmed()); | 498 handshake_confirmed()); |
| 499 CloseConnectionWithDetails(QUIC_PROOF_INVALID, | 499 CloseConnectionWithDetails(QUIC_PROOF_INVALID, |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 update_ignored = true; | 642 update_ignored = true; |
| 643 next_state_ = STATE_NONE; | 643 next_state_ = STATE_NONE; |
| 644 } | 644 } |
| 645 UMA_HISTOGRAM_COUNTS("Net.QuicNumServerConfig.UpdateMessagesIgnored", | 645 UMA_HISTOGRAM_COUNTS("Net.QuicNumServerConfig.UpdateMessagesIgnored", |
| 646 update_ignored); | 646 update_ignored); |
| 647 } | 647 } |
| 648 | 648 |
| 649 void QuicCryptoClientStream::SetCachedProofValid( | 649 void QuicCryptoClientStream::SetCachedProofValid( |
| 650 QuicCryptoClientConfig::CachedState* cached) { | 650 QuicCryptoClientConfig::CachedState* cached) { |
| 651 cached->SetProofValid(); | 651 cached->SetProofValid(); |
| 652 client_session()->OnProofValid(*cached); | 652 proof_handler_->OnProofValid(*cached); |
| 653 } | 653 } |
| 654 | 654 |
| 655 bool QuicCryptoClientStream::RequiresChannelID( | 655 bool QuicCryptoClientStream::RequiresChannelID( |
| 656 QuicCryptoClientConfig::CachedState* cached) { | 656 QuicCryptoClientConfig::CachedState* cached) { |
| 657 if (server_id_.privacy_mode() == PRIVACY_MODE_ENABLED || | 657 if (server_id_.privacy_mode() == PRIVACY_MODE_ENABLED || |
| 658 !crypto_config_->channel_id_source()) { | 658 !crypto_config_->channel_id_source()) { |
| 659 return false; | 659 return false; |
| 660 } | 660 } |
| 661 const CryptoHandshakeMessage* scfg = cached->GetServerConfig(); | 661 const CryptoHandshakeMessage* scfg = cached->GetServerConfig(); |
| 662 if (!scfg) { // scfg may be null then we send an inchoate CHLO. | 662 if (!scfg) { // scfg may be null then we send an inchoate CHLO. |
| 663 return false; | 663 return false; |
| 664 } | 664 } |
| 665 const QuicTag* their_proof_demands; | 665 const QuicTag* their_proof_demands; |
| 666 size_t num_their_proof_demands; | 666 size_t num_their_proof_demands; |
| 667 if (scfg->GetTaglist(kPDMD, &their_proof_demands, &num_their_proof_demands) != | 667 if (scfg->GetTaglist(kPDMD, &their_proof_demands, &num_their_proof_demands) != |
| 668 QUIC_NO_ERROR) { | 668 QUIC_NO_ERROR) { |
| 669 return false; | 669 return false; |
| 670 } | 670 } |
| 671 for (size_t i = 0; i < num_their_proof_demands; i++) { | 671 for (size_t i = 0; i < num_their_proof_demands; i++) { |
| 672 if (their_proof_demands[i] == kCHID) { | 672 if (their_proof_demands[i] == kCHID) { |
| 673 return true; | 673 return true; |
| 674 } | 674 } |
| 675 } | 675 } |
| 676 return false; | 676 return false; |
| 677 } | 677 } |
| 678 | 678 |
| 679 QuicClientSessionBase* QuicCryptoClientStream::client_session() { | |
| 680 return reinterpret_cast<QuicClientSessionBase*>(session()); | |
| 681 } | |
| 682 | |
| 683 } // namespace net | 679 } // namespace net |
| OLD | NEW |