| 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_client_stream.h" | 5 #include "net/quic/core/quic_crypto_client_stream.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "net/quic/core/crypto/aes_128_gcm_12_encrypter.h" | 9 #include "net/quic/core/crypto/aes_128_gcm_12_encrypter.h" |
| 10 #include "net/quic/core/crypto/quic_decrypter.h" | 10 #include "net/quic/core/crypto/quic_decrypter.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 namespace test { | 29 namespace test { |
| 30 namespace { | 30 namespace { |
| 31 | 31 |
| 32 const char kServerHostname[] = "test.example.com"; | 32 const char kServerHostname[] = "test.example.com"; |
| 33 const uint16_t kServerPort = 443; | 33 const uint16_t kServerPort = 443; |
| 34 | 34 |
| 35 class QuicCryptoClientStreamTest : public ::testing::Test { | 35 class QuicCryptoClientStreamTest : public ::testing::Test { |
| 36 public: | 36 public: |
| 37 QuicCryptoClientStreamTest() | 37 QuicCryptoClientStreamTest() |
| 38 : server_id_(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED), | 38 : server_id_(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED), |
| 39 crypto_config_(CryptoTestUtils::ProofVerifierForTesting()) { | 39 crypto_config_(crypto_test_utils::ProofVerifierForTesting()) { |
| 40 CreateConnection(); | 40 CreateConnection(); |
| 41 } | 41 } |
| 42 | 42 |
| 43 void CreateConnection() { | 43 void CreateConnection() { |
| 44 connection_ = new PacketSavingConnection(&client_helper_, &alarm_factory_, | 44 connection_ = new PacketSavingConnection(&client_helper_, &alarm_factory_, |
| 45 Perspective::IS_CLIENT); | 45 Perspective::IS_CLIENT); |
| 46 // Advance the time, because timers do not like uninitialized times. | 46 // Advance the time, because timers do not like uninitialized times. |
| 47 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 47 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
| 48 | 48 |
| 49 session_.reset(new TestQuicSpdyClientSession( | 49 session_.reset(new TestQuicSpdyClientSession( |
| 50 connection_, DefaultQuicConfig(), server_id_, &crypto_config_)); | 50 connection_, DefaultQuicConfig(), server_id_, &crypto_config_)); |
| 51 } | 51 } |
| 52 | 52 |
| 53 void CompleteCryptoHandshake() { | 53 void CompleteCryptoHandshake() { |
| 54 stream()->CryptoConnect(); | 54 stream()->CryptoConnect(); |
| 55 QuicConfig config; | 55 QuicConfig config; |
| 56 CryptoTestUtils::HandshakeWithFakeServer(&config, &server_helper_, | 56 crypto_test_utils::HandshakeWithFakeServer(&config, &server_helper_, |
| 57 &alarm_factory_, connection_, | 57 &alarm_factory_, connection_, |
| 58 stream(), server_options_); | 58 stream(), server_options_); |
| 59 } | 59 } |
| 60 | 60 |
| 61 void ConstructHandshakeMessage() { | 61 void ConstructHandshakeMessage() { |
| 62 CryptoFramer framer; | 62 CryptoFramer framer; |
| 63 message_data_.reset(framer.ConstructHandshakeMessage(message_)); | 63 message_data_.reset(framer.ConstructHandshakeMessage(message_)); |
| 64 } | 64 } |
| 65 | 65 |
| 66 QuicCryptoClientStream* stream() { return session_->GetCryptoStream(); } | 66 QuicCryptoClientStream* stream() { return session_->GetCryptoStream(); } |
| 67 | 67 |
| 68 MockQuicConnectionHelper server_helper_; | 68 MockQuicConnectionHelper server_helper_; |
| 69 MockQuicConnectionHelper client_helper_; | 69 MockQuicConnectionHelper client_helper_; |
| 70 MockAlarmFactory alarm_factory_; | 70 MockAlarmFactory alarm_factory_; |
| 71 PacketSavingConnection* connection_; | 71 PacketSavingConnection* connection_; |
| 72 std::unique_ptr<TestQuicSpdyClientSession> session_; | 72 std::unique_ptr<TestQuicSpdyClientSession> session_; |
| 73 QuicServerId server_id_; | 73 QuicServerId server_id_; |
| 74 CryptoHandshakeMessage message_; | 74 CryptoHandshakeMessage message_; |
| 75 std::unique_ptr<QuicData> message_data_; | 75 std::unique_ptr<QuicData> message_data_; |
| 76 QuicCryptoClientConfig crypto_config_; | 76 QuicCryptoClientConfig crypto_config_; |
| 77 CryptoTestUtils::FakeServerOptions server_options_; | 77 crypto_test_utils::FakeServerOptions server_options_; |
| 78 }; | 78 }; |
| 79 | 79 |
| 80 TEST_F(QuicCryptoClientStreamTest, NotInitiallyConected) { | 80 TEST_F(QuicCryptoClientStreamTest, NotInitiallyConected) { |
| 81 EXPECT_FALSE(stream()->encryption_established()); | 81 EXPECT_FALSE(stream()->encryption_established()); |
| 82 EXPECT_FALSE(stream()->handshake_confirmed()); | 82 EXPECT_FALSE(stream()->handshake_confirmed()); |
| 83 } | 83 } |
| 84 | 84 |
| 85 TEST_F(QuicCryptoClientStreamTest, ConnectedAfterSHLO) { | 85 TEST_F(QuicCryptoClientStreamTest, ConnectedAfterSHLO) { |
| 86 CompleteCryptoHandshake(); | 86 CompleteCryptoHandshake(); |
| 87 EXPECT_TRUE(stream()->encryption_established()); | 87 EXPECT_TRUE(stream()->encryption_established()); |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 } | 237 } |
| 238 | 238 |
| 239 TEST_F(QuicCryptoClientStreamTest, ServerConfigUpdateWithCert) { | 239 TEST_F(QuicCryptoClientStreamTest, ServerConfigUpdateWithCert) { |
| 240 // Test that the crypto client stream can receive and use server config | 240 // Test that the crypto client stream can receive and use server config |
| 241 // updates with certificates after the connection has been established. | 241 // updates with certificates after the connection has been established. |
| 242 CompleteCryptoHandshake(); | 242 CompleteCryptoHandshake(); |
| 243 | 243 |
| 244 // Build a server config update message with certificates | 244 // Build a server config update message with certificates |
| 245 QuicCryptoServerConfig crypto_config( | 245 QuicCryptoServerConfig crypto_config( |
| 246 QuicCryptoServerConfig::TESTING, QuicRandom::GetInstance(), | 246 QuicCryptoServerConfig::TESTING, QuicRandom::GetInstance(), |
| 247 CryptoTestUtils::ProofSourceForTesting()); | 247 crypto_test_utils::ProofSourceForTesting()); |
| 248 CryptoTestUtils::FakeServerOptions options; | 248 crypto_test_utils::FakeServerOptions options; |
| 249 CryptoTestUtils::SetupCryptoServerConfigForTest( | 249 crypto_test_utils::SetupCryptoServerConfigForTest( |
| 250 connection_->clock(), QuicRandom::GetInstance(), &crypto_config, options); | 250 connection_->clock(), QuicRandom::GetInstance(), &crypto_config, options); |
| 251 SourceAddressTokens tokens; | 251 SourceAddressTokens tokens; |
| 252 QuicCompressedCertsCache cache(1); | 252 QuicCompressedCertsCache cache(1); |
| 253 CachedNetworkParameters network_params; | 253 CachedNetworkParameters network_params; |
| 254 CryptoHandshakeMessage server_config_update; | 254 CryptoHandshakeMessage server_config_update; |
| 255 EXPECT_TRUE(crypto_config.BuildServerConfigUpdateMessage( | 255 |
| 256 class Callback : public BuildServerConfigUpdateMessageResultCallback { |
| 257 public: |
| 258 Callback(bool* ok, CryptoHandshakeMessage* message) |
| 259 : ok_(ok), message_(message) {} |
| 260 void Run(bool ok, const CryptoHandshakeMessage& message) override { |
| 261 *ok_ = ok; |
| 262 *message_ = message; |
| 263 } |
| 264 |
| 265 private: |
| 266 bool* ok_; |
| 267 CryptoHandshakeMessage* message_; |
| 268 }; |
| 269 |
| 270 // Note: relies on the callback being invoked synchronously |
| 271 bool ok = false; |
| 272 crypto_config.BuildServerConfigUpdateMessage( |
| 256 session_->connection()->version(), stream()->chlo_hash(), tokens, | 273 session_->connection()->version(), stream()->chlo_hash(), tokens, |
| 257 QuicSocketAddress(QuicIpAddress::Loopback6(), 1234), | 274 QuicSocketAddress(QuicIpAddress::Loopback6(), 1234), |
| 258 QuicIpAddress::Loopback6(), connection_->clock(), | 275 QuicIpAddress::Loopback6(), connection_->clock(), |
| 259 QuicRandom::GetInstance(), &cache, stream()->crypto_negotiated_params(), | 276 QuicRandom::GetInstance(), &cache, stream()->crypto_negotiated_params(), |
| 260 &network_params, QuicTagVector(), &server_config_update)); | 277 &network_params, QuicTagVector(), |
| 278 std::unique_ptr<BuildServerConfigUpdateMessageResultCallback>( |
| 279 new Callback(&ok, &server_config_update))); |
| 280 EXPECT_TRUE(ok); |
| 261 | 281 |
| 262 std::unique_ptr<QuicData> data( | 282 std::unique_ptr<QuicData> data( |
| 263 CryptoFramer::ConstructHandshakeMessage(server_config_update)); | 283 CryptoFramer::ConstructHandshakeMessage(server_config_update)); |
| 264 stream()->OnStreamFrame(QuicStreamFrame(kCryptoStreamId, /*fin=*/false, | 284 stream()->OnStreamFrame(QuicStreamFrame(kCryptoStreamId, /*fin=*/false, |
| 265 /*offset=*/0, data->AsStringPiece())); | 285 /*offset=*/0, data->AsStringPiece())); |
| 266 | 286 |
| 267 // Recreate connection with the new config and verify a 0-RTT attempt. | 287 // Recreate connection with the new config and verify a 0-RTT attempt. |
| 268 CreateConnection(); | 288 CreateConnection(); |
| 269 | 289 |
| 270 stream()->CryptoConnect(); | 290 stream()->CryptoConnect(); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 | 347 |
| 328 CompleteCryptoHandshake(); | 348 CompleteCryptoHandshake(); |
| 329 EXPECT_TRUE(stream()->encryption_established()); | 349 EXPECT_TRUE(stream()->encryption_established()); |
| 330 EXPECT_TRUE(stream()->handshake_confirmed()); | 350 EXPECT_TRUE(stream()->handshake_confirmed()); |
| 331 EXPECT_EQ(0u, stream()->crypto_negotiated_params().token_binding_key_param); | 351 EXPECT_EQ(0u, stream()->crypto_negotiated_params().token_binding_key_param); |
| 332 } | 352 } |
| 333 | 353 |
| 334 class QuicCryptoClientStreamStatelessTest : public ::testing::Test { | 354 class QuicCryptoClientStreamStatelessTest : public ::testing::Test { |
| 335 public: | 355 public: |
| 336 QuicCryptoClientStreamStatelessTest() | 356 QuicCryptoClientStreamStatelessTest() |
| 337 : client_crypto_config_(CryptoTestUtils::ProofVerifierForTesting()), | 357 : client_crypto_config_(crypto_test_utils::ProofVerifierForTesting()), |
| 338 server_crypto_config_(QuicCryptoServerConfig::TESTING, | 358 server_crypto_config_(QuicCryptoServerConfig::TESTING, |
| 339 QuicRandom::GetInstance(), | 359 QuicRandom::GetInstance(), |
| 340 CryptoTestUtils::ProofSourceForTesting()), | 360 crypto_test_utils::ProofSourceForTesting()), |
| 341 server_compressed_certs_cache_( | 361 server_compressed_certs_cache_( |
| 342 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize), | 362 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize), |
| 343 server_id_(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED) { | 363 server_id_(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED) { |
| 344 TestQuicSpdyClientSession* client_session = nullptr; | 364 TestQuicSpdyClientSession* client_session = nullptr; |
| 345 CreateClientSessionForTest(server_id_, | 365 CreateClientSessionForTest(server_id_, |
| 346 /* supports_stateless_rejects= */ true, | 366 /* supports_stateless_rejects= */ true, |
| 347 QuicTime::Delta::FromSeconds(100000), | 367 QuicTime::Delta::FromSeconds(100000), |
| 348 AllSupportedVersions(), &helper_, | 368 AllSupportedVersions(), &helper_, |
| 349 &alarm_factory_, &client_crypto_config_, | 369 &alarm_factory_, &client_crypto_config_, |
| 350 &client_connection_, &client_session); | 370 &client_connection_, &client_session); |
| 351 CHECK(client_session); | 371 CHECK(client_session); |
| 352 client_session_.reset(client_session); | 372 client_session_.reset(client_session); |
| 353 } | 373 } |
| 354 | 374 |
| 355 QuicCryptoServerStream* server_stream() { | 375 QuicCryptoServerStream* server_stream() { |
| 356 return server_session_->GetCryptoStream(); | 376 return server_session_->GetCryptoStream(); |
| 357 } | 377 } |
| 358 | 378 |
| 359 void AdvanceHandshakeWithFakeServer() { | 379 void AdvanceHandshakeWithFakeServer() { |
| 360 client_session_->GetCryptoStream()->CryptoConnect(); | 380 client_session_->GetCryptoStream()->CryptoConnect(); |
| 361 CryptoTestUtils::AdvanceHandshake(client_connection_, | 381 crypto_test_utils::AdvanceHandshake(client_connection_, |
| 362 client_session_->GetCryptoStream(), 0, | 382 client_session_->GetCryptoStream(), 0, |
| 363 server_connection_, server_stream(), 0); | 383 server_connection_, server_stream(), 0); |
| 364 } | 384 } |
| 365 | 385 |
| 366 // Initializes the server_stream_ for stateless rejects. | 386 // Initializes the server_stream_ for stateless rejects. |
| 367 void InitializeFakeStatelessRejectServer() { | 387 void InitializeFakeStatelessRejectServer() { |
| 368 TestQuicSpdyServerSession* server_session = nullptr; | 388 TestQuicSpdyServerSession* server_session = nullptr; |
| 369 CreateServerSessionForTest(server_id_, QuicTime::Delta::FromSeconds(100000), | 389 CreateServerSessionForTest(server_id_, QuicTime::Delta::FromSeconds(100000), |
| 370 AllSupportedVersions(), &helper_, | 390 AllSupportedVersions(), &helper_, |
| 371 &alarm_factory_, &server_crypto_config_, | 391 &alarm_factory_, &server_crypto_config_, |
| 372 &server_compressed_certs_cache_, | 392 &server_compressed_certs_cache_, |
| 373 &server_connection_, &server_session); | 393 &server_connection_, &server_session); |
| 374 CHECK(server_session); | 394 CHECK(server_session); |
| 375 server_session_.reset(server_session); | 395 server_session_.reset(server_session); |
| 376 CryptoTestUtils::FakeServerOptions options; | 396 crypto_test_utils::FakeServerOptions options; |
| 377 CryptoTestUtils::SetupCryptoServerConfigForTest( | 397 crypto_test_utils::SetupCryptoServerConfigForTest( |
| 378 server_connection_->clock(), server_connection_->random_generator(), | 398 server_connection_->clock(), server_connection_->random_generator(), |
| 379 &server_crypto_config_, options); | 399 &server_crypto_config_, options); |
| 380 FLAGS_quic_reloadable_flag_enable_quic_stateless_reject_support = true; | 400 FLAGS_quic_reloadable_flag_enable_quic_stateless_reject_support = true; |
| 381 } | 401 } |
| 382 | 402 |
| 383 QuicFlagSaver flags_; // Save/restore all QUIC flag values. | 403 QuicFlagSaver flags_; // Save/restore all QUIC flag values. |
| 384 | 404 |
| 385 MockQuicConnectionHelper helper_; | 405 MockQuicConnectionHelper helper_; |
| 386 MockAlarmFactory alarm_factory_; | 406 MockAlarmFactory alarm_factory_; |
| 387 | 407 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 client_state->GetNextServerDesignatedConnectionId(); | 446 client_state->GetNextServerDesignatedConnectionId(); |
| 427 QuicConnectionId expected_id = | 447 QuicConnectionId expected_id = |
| 428 server_session_->connection()->random_generator()->RandUint64(); | 448 server_session_->connection()->random_generator()->RandUint64(); |
| 429 EXPECT_EQ(expected_id, server_designated_id); | 449 EXPECT_EQ(expected_id, server_designated_id); |
| 430 EXPECT_FALSE(client_state->has_server_designated_connection_id()); | 450 EXPECT_FALSE(client_state->has_server_designated_connection_id()); |
| 431 } | 451 } |
| 432 | 452 |
| 433 } // namespace | 453 } // namespace |
| 434 } // namespace test | 454 } // namespace test |
| 435 } // namespace net | 455 } // namespace net |
| OLD | NEW |