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 EXPECT_TRUE(crypto_config.BuildServerConfigUpdateMessage( |
256 session_->connection()->version(), stream()->chlo_hash(), tokens, | 256 session_->connection()->version(), stream()->chlo_hash(), tokens, |
257 QuicSocketAddress(QuicIpAddress::Loopback6(), 1234), | 257 QuicSocketAddress(QuicIpAddress::Loopback6(), 1234), |
258 QuicIpAddress::Loopback6(), connection_->clock(), | 258 QuicIpAddress::Loopback6(), connection_->clock(), |
259 QuicRandom::GetInstance(), &cache, stream()->crypto_negotiated_params(), | 259 QuicRandom::GetInstance(), &cache, stream()->crypto_negotiated_params(), |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 | 327 |
328 CompleteCryptoHandshake(); | 328 CompleteCryptoHandshake(); |
329 EXPECT_TRUE(stream()->encryption_established()); | 329 EXPECT_TRUE(stream()->encryption_established()); |
330 EXPECT_TRUE(stream()->handshake_confirmed()); | 330 EXPECT_TRUE(stream()->handshake_confirmed()); |
331 EXPECT_EQ(0u, stream()->crypto_negotiated_params().token_binding_key_param); | 331 EXPECT_EQ(0u, stream()->crypto_negotiated_params().token_binding_key_param); |
332 } | 332 } |
333 | 333 |
334 class QuicCryptoClientStreamStatelessTest : public ::testing::Test { | 334 class QuicCryptoClientStreamStatelessTest : public ::testing::Test { |
335 public: | 335 public: |
336 QuicCryptoClientStreamStatelessTest() | 336 QuicCryptoClientStreamStatelessTest() |
337 : client_crypto_config_(CryptoTestUtils::ProofVerifierForTesting()), | 337 : client_crypto_config_(crypto_test_utils::ProofVerifierForTesting()), |
338 server_crypto_config_(QuicCryptoServerConfig::TESTING, | 338 server_crypto_config_(QuicCryptoServerConfig::TESTING, |
339 QuicRandom::GetInstance(), | 339 QuicRandom::GetInstance(), |
340 CryptoTestUtils::ProofSourceForTesting()), | 340 crypto_test_utils::ProofSourceForTesting()), |
341 server_compressed_certs_cache_( | 341 server_compressed_certs_cache_( |
342 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize), | 342 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize), |
343 server_id_(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED) { | 343 server_id_(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED) { |
344 TestQuicSpdyClientSession* client_session = nullptr; | 344 TestQuicSpdyClientSession* client_session = nullptr; |
345 CreateClientSessionForTest(server_id_, | 345 CreateClientSessionForTest(server_id_, |
346 /* supports_stateless_rejects= */ true, | 346 /* supports_stateless_rejects= */ true, |
347 QuicTime::Delta::FromSeconds(100000), | 347 QuicTime::Delta::FromSeconds(100000), |
348 AllSupportedVersions(), &helper_, | 348 AllSupportedVersions(), &helper_, |
349 &alarm_factory_, &client_crypto_config_, | 349 &alarm_factory_, &client_crypto_config_, |
350 &client_connection_, &client_session); | 350 &client_connection_, &client_session); |
351 CHECK(client_session); | 351 CHECK(client_session); |
352 client_session_.reset(client_session); | 352 client_session_.reset(client_session); |
353 } | 353 } |
354 | 354 |
355 QuicCryptoServerStream* server_stream() { | 355 QuicCryptoServerStream* server_stream() { |
356 return server_session_->GetCryptoStream(); | 356 return server_session_->GetCryptoStream(); |
357 } | 357 } |
358 | 358 |
359 void AdvanceHandshakeWithFakeServer() { | 359 void AdvanceHandshakeWithFakeServer() { |
360 client_session_->GetCryptoStream()->CryptoConnect(); | 360 client_session_->GetCryptoStream()->CryptoConnect(); |
361 CryptoTestUtils::AdvanceHandshake(client_connection_, | 361 crypto_test_utils::AdvanceHandshake(client_connection_, |
362 client_session_->GetCryptoStream(), 0, | 362 client_session_->GetCryptoStream(), 0, |
363 server_connection_, server_stream(), 0); | 363 server_connection_, server_stream(), 0); |
364 } | 364 } |
365 | 365 |
366 // Initializes the server_stream_ for stateless rejects. | 366 // Initializes the server_stream_ for stateless rejects. |
367 void InitializeFakeStatelessRejectServer() { | 367 void InitializeFakeStatelessRejectServer() { |
368 TestQuicSpdyServerSession* server_session = nullptr; | 368 TestQuicSpdyServerSession* server_session = nullptr; |
369 CreateServerSessionForTest(server_id_, QuicTime::Delta::FromSeconds(100000), | 369 CreateServerSessionForTest(server_id_, QuicTime::Delta::FromSeconds(100000), |
370 AllSupportedVersions(), &helper_, | 370 AllSupportedVersions(), &helper_, |
371 &alarm_factory_, &server_crypto_config_, | 371 &alarm_factory_, &server_crypto_config_, |
372 &server_compressed_certs_cache_, | 372 &server_compressed_certs_cache_, |
373 &server_connection_, &server_session); | 373 &server_connection_, &server_session); |
374 CHECK(server_session); | 374 CHECK(server_session); |
375 server_session_.reset(server_session); | 375 server_session_.reset(server_session); |
376 CryptoTestUtils::FakeServerOptions options; | 376 crypto_test_utils::FakeServerOptions options; |
377 CryptoTestUtils::SetupCryptoServerConfigForTest( | 377 crypto_test_utils::SetupCryptoServerConfigForTest( |
378 server_connection_->clock(), server_connection_->random_generator(), | 378 server_connection_->clock(), server_connection_->random_generator(), |
379 &server_crypto_config_, options); | 379 &server_crypto_config_, options); |
380 FLAGS_quic_reloadable_flag_enable_quic_stateless_reject_support = true; | 380 FLAGS_quic_reloadable_flag_enable_quic_stateless_reject_support = true; |
381 } | 381 } |
382 | 382 |
383 QuicFlagSaver flags_; // Save/restore all QUIC flag values. | 383 QuicFlagSaver flags_; // Save/restore all QUIC flag values. |
384 | 384 |
385 MockQuicConnectionHelper helper_; | 385 MockQuicConnectionHelper helper_; |
386 MockAlarmFactory alarm_factory_; | 386 MockAlarmFactory alarm_factory_; |
387 | 387 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
426 client_state->GetNextServerDesignatedConnectionId(); | 426 client_state->GetNextServerDesignatedConnectionId(); |
427 QuicConnectionId expected_id = | 427 QuicConnectionId expected_id = |
428 server_session_->connection()->random_generator()->RandUint64(); | 428 server_session_->connection()->random_generator()->RandUint64(); |
429 EXPECT_EQ(expected_id, server_designated_id); | 429 EXPECT_EQ(expected_id, server_designated_id); |
430 EXPECT_FALSE(client_state->has_server_designated_connection_id()); | 430 EXPECT_FALSE(client_state->has_server_designated_connection_id()); |
431 } | 431 } |
432 | 432 |
433 } // namespace | 433 } // namespace |
434 } // namespace test | 434 } // namespace test |
435 } // namespace net | 435 } // namespace net |
OLD | NEW |