| 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 <map> | 7 #include <map> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 }; | 52 }; |
| 53 | 53 |
| 54 namespace { | 54 namespace { |
| 55 | 55 |
| 56 const char kServerHostname[] = "test.example.com"; | 56 const char kServerHostname[] = "test.example.com"; |
| 57 const uint16_t kServerPort = 443; | 57 const uint16_t kServerPort = 443; |
| 58 | 58 |
| 59 class QuicCryptoServerStreamTest : public ::testing::TestWithParam<bool> { | 59 class QuicCryptoServerStreamTest : public ::testing::TestWithParam<bool> { |
| 60 public: | 60 public: |
| 61 QuicCryptoServerStreamTest() | 61 QuicCryptoServerStreamTest() |
| 62 : QuicCryptoServerStreamTest(CryptoTestUtils::ProofSourceForTesting()) {} | 62 : QuicCryptoServerStreamTest(crypto_test_utils::ProofSourceForTesting()) { |
| 63 } |
| 63 | 64 |
| 64 explicit QuicCryptoServerStreamTest(std::unique_ptr<ProofSource> proof_source) | 65 explicit QuicCryptoServerStreamTest(std::unique_ptr<ProofSource> proof_source) |
| 65 : server_crypto_config_(QuicCryptoServerConfig::TESTING, | 66 : server_crypto_config_(QuicCryptoServerConfig::TESTING, |
| 66 QuicRandom::GetInstance(), | 67 QuicRandom::GetInstance(), |
| 67 std::move(proof_source)), | 68 std::move(proof_source)), |
| 68 server_compressed_certs_cache_( | 69 server_compressed_certs_cache_( |
| 69 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize), | 70 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize), |
| 70 server_id_(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED), | 71 server_id_(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED), |
| 71 client_crypto_config_(CryptoTestUtils::ProofVerifierForTesting()) { | 72 client_crypto_config_(crypto_test_utils::ProofVerifierForTesting()) { |
| 72 FLAGS_quic_reloadable_flag_enable_quic_stateless_reject_support = false; | 73 FLAGS_quic_reloadable_flag_enable_quic_stateless_reject_support = false; |
| 73 } | 74 } |
| 74 | 75 |
| 75 void Initialize() { InitializeServer(); } | 76 void Initialize() { InitializeServer(); } |
| 76 | 77 |
| 77 ~QuicCryptoServerStreamTest() override { | 78 ~QuicCryptoServerStreamTest() override { |
| 78 // Ensure that anything that might reference |helpers_| is destroyed before | 79 // Ensure that anything that might reference |helpers_| is destroyed before |
| 79 // |helpers_| is destroyed. | 80 // |helpers_| is destroyed. |
| 80 server_session_.reset(); | 81 server_session_.reset(); |
| 81 client_session_.reset(); | 82 client_session_.reset(); |
| 82 helpers_.clear(); | 83 helpers_.clear(); |
| 83 alarm_factories_.clear(); | 84 alarm_factories_.clear(); |
| 84 } | 85 } |
| 85 | 86 |
| 86 // Initializes the crypto server stream state for testing. May be | 87 // Initializes the crypto server stream state for testing. May be |
| 87 // called multiple times. | 88 // called multiple times. |
| 88 void InitializeServer() { | 89 void InitializeServer() { |
| 89 TestQuicSpdyServerSession* server_session = nullptr; | 90 TestQuicSpdyServerSession* server_session = nullptr; |
| 90 helpers_.push_back(QuicMakeUnique<MockQuicConnectionHelper>()); | 91 helpers_.push_back(QuicMakeUnique<MockQuicConnectionHelper>()); |
| 91 alarm_factories_.push_back(QuicMakeUnique<MockAlarmFactory>()); | 92 alarm_factories_.push_back(QuicMakeUnique<MockAlarmFactory>()); |
| 92 CreateServerSessionForTest( | 93 CreateServerSessionForTest( |
| 93 server_id_, QuicTime::Delta::FromSeconds(100000), supported_versions_, | 94 server_id_, QuicTime::Delta::FromSeconds(100000), supported_versions_, |
| 94 helpers_.back().get(), alarm_factories_.back().get(), | 95 helpers_.back().get(), alarm_factories_.back().get(), |
| 95 &server_crypto_config_, &server_compressed_certs_cache_, | 96 &server_crypto_config_, &server_compressed_certs_cache_, |
| 96 &server_connection_, &server_session); | 97 &server_connection_, &server_session); |
| 97 CHECK(server_session); | 98 CHECK(server_session); |
| 98 server_session_.reset(server_session); | 99 server_session_.reset(server_session); |
| 99 CryptoTestUtils::FakeServerOptions options; | 100 crypto_test_utils::FakeServerOptions options; |
| 100 options.token_binding_params = QuicTagVector{kTB10}; | 101 options.token_binding_params = QuicTagVector{kTB10}; |
| 101 CryptoTestUtils::SetupCryptoServerConfigForTest( | 102 crypto_test_utils::SetupCryptoServerConfigForTest( |
| 102 server_connection_->clock(), server_connection_->random_generator(), | 103 server_connection_->clock(), server_connection_->random_generator(), |
| 103 &server_crypto_config_, options); | 104 &server_crypto_config_, options); |
| 104 } | 105 } |
| 105 | 106 |
| 106 QuicCryptoServerStream* server_stream() { | 107 QuicCryptoServerStream* server_stream() { |
| 107 return server_session_->GetCryptoStream(); | 108 return server_session_->GetCryptoStream(); |
| 108 } | 109 } |
| 109 | 110 |
| 110 QuicCryptoClientStream* client_stream() { | 111 QuicCryptoClientStream* client_stream() { |
| 111 return client_session_->GetCryptoStream(); | 112 return client_session_->GetCryptoStream(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 127 } | 128 } |
| 128 | 129 |
| 129 void ConstructHandshakeMessage() { | 130 void ConstructHandshakeMessage() { |
| 130 CryptoFramer framer; | 131 CryptoFramer framer; |
| 131 message_data_.reset(framer.ConstructHandshakeMessage(message_)); | 132 message_data_.reset(framer.ConstructHandshakeMessage(message_)); |
| 132 } | 133 } |
| 133 | 134 |
| 134 int CompleteCryptoHandshake() { | 135 int CompleteCryptoHandshake() { |
| 135 CHECK(server_connection_); | 136 CHECK(server_connection_); |
| 136 CHECK(server_session_ != nullptr); | 137 CHECK(server_session_ != nullptr); |
| 137 return CryptoTestUtils::HandshakeWithFakeClient( | 138 return crypto_test_utils::HandshakeWithFakeClient( |
| 138 helpers_.back().get(), alarm_factories_.back().get(), | 139 helpers_.back().get(), alarm_factories_.back().get(), |
| 139 server_connection_, server_stream(), server_id_, client_options_); | 140 server_connection_, server_stream(), server_id_, client_options_); |
| 140 } | 141 } |
| 141 | 142 |
| 142 // Performs a single round of handshake message-exchange between the | 143 // Performs a single round of handshake message-exchange between the |
| 143 // client and server. | 144 // client and server. |
| 144 void AdvanceHandshakeWithFakeClient() { | 145 void AdvanceHandshakeWithFakeClient() { |
| 145 CHECK(server_connection_); | 146 CHECK(server_connection_); |
| 146 CHECK(client_session_ != nullptr); | 147 CHECK(client_session_ != nullptr); |
| 147 | 148 |
| 148 EXPECT_CALL(*client_session_, OnProofValid(_)).Times(testing::AnyNumber()); | 149 EXPECT_CALL(*client_session_, OnProofValid(_)).Times(testing::AnyNumber()); |
| 149 client_stream()->CryptoConnect(); | 150 client_stream()->CryptoConnect(); |
| 150 CryptoTestUtils::AdvanceHandshake(client_connection_, client_stream(), 0, | 151 crypto_test_utils::AdvanceHandshake(client_connection_, client_stream(), 0, |
| 151 server_connection_, server_stream(), 0); | 152 server_connection_, server_stream(), 0); |
| 152 } | 153 } |
| 153 | 154 |
| 154 protected: | 155 protected: |
| 155 QuicFlagSaver flags_; // Save/restore all QUIC flag values. | 156 QuicFlagSaver flags_; // Save/restore all QUIC flag values. |
| 156 | 157 |
| 157 // Every connection gets its own MockQuicConnectionHelper and | 158 // Every connection gets its own MockQuicConnectionHelper and |
| 158 // MockAlarmFactory, tracked separately from the server and client state so | 159 // MockAlarmFactory, tracked separately from the server and client state so |
| 159 // their lifetimes persist through the whole test. | 160 // their lifetimes persist through the whole test. |
| 160 std::vector<std::unique_ptr<MockQuicConnectionHelper>> helpers_; | 161 std::vector<std::unique_ptr<MockQuicConnectionHelper>> helpers_; |
| 161 std::vector<std::unique_ptr<MockAlarmFactory>> alarm_factories_; | 162 std::vector<std::unique_ptr<MockAlarmFactory>> alarm_factories_; |
| 162 | 163 |
| 163 // Server state. | 164 // Server state. |
| 164 PacketSavingConnection* server_connection_; | 165 PacketSavingConnection* server_connection_; |
| 165 std::unique_ptr<TestQuicSpdyServerSession> server_session_; | 166 std::unique_ptr<TestQuicSpdyServerSession> server_session_; |
| 166 QuicCryptoServerConfig server_crypto_config_; | 167 QuicCryptoServerConfig server_crypto_config_; |
| 167 QuicCompressedCertsCache server_compressed_certs_cache_; | 168 QuicCompressedCertsCache server_compressed_certs_cache_; |
| 168 QuicServerId server_id_; | 169 QuicServerId server_id_; |
| 169 | 170 |
| 170 // Client state. | 171 // Client state. |
| 171 PacketSavingConnection* client_connection_; | 172 PacketSavingConnection* client_connection_; |
| 172 QuicCryptoClientConfig client_crypto_config_; | 173 QuicCryptoClientConfig client_crypto_config_; |
| 173 std::unique_ptr<TestQuicSpdyClientSession> client_session_; | 174 std::unique_ptr<TestQuicSpdyClientSession> client_session_; |
| 174 | 175 |
| 175 CryptoHandshakeMessage message_; | 176 CryptoHandshakeMessage message_; |
| 176 std::unique_ptr<QuicData> message_data_; | 177 std::unique_ptr<QuicData> message_data_; |
| 177 CryptoTestUtils::FakeClientOptions client_options_; | 178 crypto_test_utils::FakeClientOptions client_options_; |
| 178 | 179 |
| 179 // Which QUIC versions the client and server support. | 180 // Which QUIC versions the client and server support. |
| 180 QuicVersionVector supported_versions_ = AllSupportedVersions(); | 181 QuicVersionVector supported_versions_ = AllSupportedVersions(); |
| 181 }; | 182 }; |
| 182 | 183 |
| 183 INSTANTIATE_TEST_CASE_P(Tests, QuicCryptoServerStreamTest, testing::Bool()); | 184 INSTANTIATE_TEST_CASE_P(Tests, QuicCryptoServerStreamTest, testing::Bool()); |
| 184 | 185 |
| 185 TEST_P(QuicCryptoServerStreamTest, NotInitiallyConected) { | 186 TEST_P(QuicCryptoServerStreamTest, NotInitiallyConected) { |
| 186 Initialize(); | 187 Initialize(); |
| 187 EXPECT_FALSE(server_stream()->encryption_established()); | 188 EXPECT_FALSE(server_stream()->encryption_established()); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 // information. | 333 // information. |
| 333 AdvanceHandshakeWithFakeClient(); | 334 AdvanceHandshakeWithFakeClient(); |
| 334 | 335 |
| 335 // Now do another handshake, hopefully in 0-RTT. | 336 // Now do another handshake, hopefully in 0-RTT. |
| 336 QUIC_LOG(INFO) << "Resetting for 0-RTT handshake attempt"; | 337 QUIC_LOG(INFO) << "Resetting for 0-RTT handshake attempt"; |
| 337 InitializeFakeClient(/* supports_stateless_rejects= */ false); | 338 InitializeFakeClient(/* supports_stateless_rejects= */ false); |
| 338 InitializeServer(); | 339 InitializeServer(); |
| 339 | 340 |
| 340 client_stream()->CryptoConnect(); | 341 client_stream()->CryptoConnect(); |
| 341 | 342 |
| 342 CryptoTestUtils::CommunicateHandshakeMessages( | 343 crypto_test_utils::CommunicateHandshakeMessages( |
| 343 client_connection_, client_stream(), server_connection_, server_stream()); | 344 client_connection_, client_stream(), server_connection_, server_stream()); |
| 344 | 345 |
| 345 EXPECT_EQ(1, client_stream()->num_sent_client_hellos()); | 346 EXPECT_EQ(1, client_stream()->num_sent_client_hellos()); |
| 346 } | 347 } |
| 347 | 348 |
| 348 TEST_P(QuicCryptoServerStreamTest, FailByPolicy) { | 349 TEST_P(QuicCryptoServerStreamTest, FailByPolicy) { |
| 349 Initialize(); | 350 Initialize(); |
| 350 InitializeFakeClient(/* supports_stateless_rejects= */ false); | 351 InitializeFakeClient(/* supports_stateless_rejects= */ false); |
| 351 | 352 |
| 352 EXPECT_CALL(*server_session_->helper(), CanAcceptClientHello(_, _, _)) | 353 EXPECT_CALL(*server_session_->helper(), CanAcceptClientHello(_, _, _)) |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 410 // An attempt to send a SCUP before completing handshake should fail. | 411 // An attempt to send a SCUP before completing handshake should fail. |
| 411 Initialize(); | 412 Initialize(); |
| 412 | 413 |
| 413 server_stream()->SendServerConfigUpdate(nullptr); | 414 server_stream()->SendServerConfigUpdate(nullptr); |
| 414 EXPECT_EQ(0, server_stream()->NumServerConfigUpdateMessagesSent()); | 415 EXPECT_EQ(0, server_stream()->NumServerConfigUpdateMessagesSent()); |
| 415 } | 416 } |
| 416 | 417 |
| 417 TEST_P(QuicCryptoServerStreamTest, SendSCUPAfterHandshakeComplete) { | 418 TEST_P(QuicCryptoServerStreamTest, SendSCUPAfterHandshakeComplete) { |
| 418 // Do not send MAX_HEADER_LIST_SIZE SETTING frame. | 419 // Do not send MAX_HEADER_LIST_SIZE SETTING frame. |
| 419 // TODO(fayang): This SETTING frame cannot be decrypted and | 420 // TODO(fayang): This SETTING frame cannot be decrypted and |
| 420 // CryptoTestUtils::MovePackets stops processing parsing following packets. | 421 // crypto_test_utils::MovePackets stops processing parsing following packets. |
| 421 // Actually, crypto stream test should use QuicSession instead of | 422 // Actually, crypto stream test should use QuicSession instead of |
| 422 // QuicSpdySession (b/32366134). | 423 // QuicSpdySession (b/32366134). |
| 423 FLAGS_quic_reloadable_flag_quic_send_max_header_list_size = false; | 424 FLAGS_quic_reloadable_flag_quic_send_max_header_list_size = false; |
| 424 Initialize(); | 425 Initialize(); |
| 425 | 426 |
| 426 InitializeFakeClient(/* supports_stateless_rejects= */ false); | 427 InitializeFakeClient(/* supports_stateless_rejects= */ false); |
| 427 | 428 |
| 428 // Do a first handshake in order to prime the client config with the server's | 429 // Do a first handshake in order to prime the client config with the server's |
| 429 // information. | 430 // information. |
| 430 AdvanceHandshakeWithFakeClient(); | 431 AdvanceHandshakeWithFakeClient(); |
| 431 | 432 |
| 432 // Now do another handshake, with the blocking SHLO connection option. | 433 // Now do another handshake, with the blocking SHLO connection option. |
| 433 InitializeServer(); | 434 InitializeServer(); |
| 434 InitializeFakeClient(/* supports_stateless_rejects= */ false); | 435 InitializeFakeClient(/* supports_stateless_rejects= */ false); |
| 435 AdvanceHandshakeWithFakeClient(); | 436 AdvanceHandshakeWithFakeClient(); |
| 436 | 437 |
| 437 // Send a SCUP message and ensure that the client was able to verify it. | 438 // Send a SCUP message and ensure that the client was able to verify it. |
| 438 EXPECT_CALL(*client_connection_, CloseConnection(_, _, _)).Times(0); | 439 EXPECT_CALL(*client_connection_, CloseConnection(_, _, _)).Times(0); |
| 439 server_stream()->SendServerConfigUpdate(nullptr); | 440 server_stream()->SendServerConfigUpdate(nullptr); |
| 440 CryptoTestUtils::AdvanceHandshake(client_connection_, client_stream(), 1, | 441 crypto_test_utils::AdvanceHandshake(client_connection_, client_stream(), 1, |
| 441 server_connection_, server_stream(), 1); | 442 server_connection_, server_stream(), 1); |
| 442 | 443 |
| 443 EXPECT_EQ(1, server_stream()->NumServerConfigUpdateMessagesSent()); | 444 EXPECT_EQ(1, server_stream()->NumServerConfigUpdateMessagesSent()); |
| 444 EXPECT_EQ(1, client_stream()->num_scup_messages_received()); | 445 EXPECT_EQ(1, client_stream()->num_scup_messages_received()); |
| 445 } | 446 } |
| 446 | 447 |
| 447 TEST_P(QuicCryptoServerStreamTest, DoesPeerSupportStatelessRejects) { | 448 TEST_P(QuicCryptoServerStreamTest, DoesPeerSupportStatelessRejects) { |
| 448 Initialize(); | 449 Initialize(); |
| 449 | 450 |
| 450 ConstructHandshakeMessage(); | 451 ConstructHandshakeMessage(); |
| 451 QuicConfig stateless_reject_config = DefaultQuicConfigStatelessRejects(); | 452 QuicConfig stateless_reject_config = DefaultQuicConfigStatelessRejects(); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 500 | 501 |
| 501 // Regression test for b/31521252, in which a crash would happen here. | 502 // Regression test for b/31521252, in which a crash would happen here. |
| 502 AdvanceHandshakeWithFakeClient(); | 503 AdvanceHandshakeWithFakeClient(); |
| 503 EXPECT_FALSE(server_stream()->encryption_established()); | 504 EXPECT_FALSE(server_stream()->encryption_established()); |
| 504 EXPECT_FALSE(server_stream()->handshake_confirmed()); | 505 EXPECT_FALSE(server_stream()->handshake_confirmed()); |
| 505 } | 506 } |
| 506 | 507 |
| 507 } // namespace | 508 } // namespace |
| 508 } // namespace test | 509 } // namespace test |
| 509 } // namespace net | 510 } // namespace net |
| OLD | NEW |