| 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_server_stream.h" | 5 #include "net/quic/quic_crypto_server_stream.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 class ReliableQuicStream; | 33 class ReliableQuicStream; |
| 34 } // namespace net | 34 } // namespace net |
| 35 | 35 |
| 36 using std::pair; | 36 using std::pair; |
| 37 using std::string; | 37 using std::string; |
| 38 using testing::_; | 38 using testing::_; |
| 39 | 39 |
| 40 namespace net { | 40 namespace net { |
| 41 namespace test { | 41 namespace test { |
| 42 | 42 |
| 43 #if defined(USE_OPENSSL) |
| 44 |
| 43 class QuicCryptoServerConfigPeer { | 45 class QuicCryptoServerConfigPeer { |
| 44 public: | 46 public: |
| 45 static string GetPrimaryOrbit(const QuicCryptoServerConfig& config) { | 47 static string GetPrimaryOrbit(const QuicCryptoServerConfig& config) { |
| 46 base::AutoLock lock(config.configs_lock_); | 48 base::AutoLock lock(config.configs_lock_); |
| 47 CHECK(config.primary_config_.get() != nullptr); | 49 CHECK(config.primary_config_.get() != nullptr); |
| 48 return string(reinterpret_cast<const char*>(config.primary_config_->orbit), | 50 return string(reinterpret_cast<const char*>(config.primary_config_->orbit), |
| 49 kOrbitSize); | 51 kOrbitSize); |
| 50 } | 52 } |
| 51 }; | 53 }; |
| 52 | 54 |
| 53 class QuicCryptoServerStreamPeer { | 55 class QuicCryptoServerStreamPeer { |
| 54 public: | 56 public: |
| 55 static bool DoesPeerSupportStatelessRejects( | 57 static bool DoesPeerSupportStatelessRejects( |
| 56 const CryptoHandshakeMessage& message) { | 58 const CryptoHandshakeMessage& message) { |
| 57 return net::QuicCryptoServerStream::DoesPeerSupportStatelessRejects( | 59 return net::QuicCryptoServerStream::DoesPeerSupportStatelessRejects( |
| 58 message); | 60 message); |
| 59 } | 61 } |
| 60 }; | 62 }; |
| 61 | 63 |
| 62 namespace { | 64 namespace { |
| 63 | 65 |
| 64 const char kServerHostname[] = "test.example.com"; | 66 const char kServerHostname[] = "test.example.com"; |
| 65 const uint16 kServerPort = 443; | 67 const uint16 kServerPort = 443; |
| 66 | 68 |
| 67 class QuicCryptoServerStreamTest : public ::testing::TestWithParam<bool> { | 69 class QuicCryptoServerStreamTest : public ::testing::TestWithParam<bool> { |
| 68 public: | 70 public: |
| 69 QuicCryptoServerStreamTest() | 71 QuicCryptoServerStreamTest() |
| 70 : server_crypto_config_(QuicCryptoServerConfig::TESTING, | 72 : server_crypto_config_(QuicCryptoServerConfig::TESTING, |
| 71 QuicRandom::GetInstance()), | 73 QuicRandom::GetInstance(), |
| 72 server_id_(kServerHostname, kServerPort, true, PRIVACY_MODE_DISABLED) { | 74 CryptoTestUtils::ProofSourceForTesting()), |
| 73 #if defined(USE_OPENSSL) | 75 server_id_(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED), |
| 74 server_crypto_config_.SetProofSource( | 76 client_crypto_config_(CryptoTestUtils::ProofVerifierForTesting()) { |
| 75 CryptoTestUtils::ProofSourceForTesting()); | |
| 76 #else | |
| 77 // TODO(rch): Implement a NSS proof source. | |
| 78 server_crypto_config_.SetProofSource( | |
| 79 CryptoTestUtils::FakeProofSourceForTesting()); | |
| 80 #endif | |
| 81 server_crypto_config_.set_strike_register_no_startup_period(); | 77 server_crypto_config_.set_strike_register_no_startup_period(); |
| 82 | 78 |
| 83 InitializeServer(); | 79 InitializeServer(); |
| 84 | 80 |
| 85 if (AsyncStrikeRegisterVerification()) { | 81 if (AsyncStrikeRegisterVerification()) { |
| 86 string orbit = | 82 string orbit = |
| 87 QuicCryptoServerConfigPeer::GetPrimaryOrbit(server_crypto_config_); | 83 QuicCryptoServerConfigPeer::GetPrimaryOrbit(server_crypto_config_); |
| 88 strike_register_client_ = new DelayedVerifyStrikeRegisterClient( | 84 strike_register_client_ = new DelayedVerifyStrikeRegisterClient( |
| 89 10000, // strike_register_max_entries | 85 10000, // strike_register_max_entries |
| 90 static_cast<uint32>( | 86 static_cast<uint32>( |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 // testing. May be called multiple times. | 122 // testing. May be called multiple times. |
| 127 void InitializeFakeClient(bool supports_stateless_rejects) { | 123 void InitializeFakeClient(bool supports_stateless_rejects) { |
| 128 TestQuicSpdyClientSession* client_session = nullptr; | 124 TestQuicSpdyClientSession* client_session = nullptr; |
| 129 helpers_.push_back(new MockHelper); | 125 helpers_.push_back(new MockHelper); |
| 130 CreateClientSessionForTest(server_id_, supports_stateless_rejects, | 126 CreateClientSessionForTest(server_id_, supports_stateless_rejects, |
| 131 QuicTime::Delta::FromSeconds(100000), | 127 QuicTime::Delta::FromSeconds(100000), |
| 132 helpers_.back(), &client_crypto_config_, | 128 helpers_.back(), &client_crypto_config_, |
| 133 &client_connection_, &client_session); | 129 &client_connection_, &client_session); |
| 134 CHECK(client_session); | 130 CHECK(client_session); |
| 135 client_session_.reset(client_session); | 131 client_session_.reset(client_session); |
| 136 if (!client_options_.dont_verify_certs) { | |
| 137 #if defined(USE_OPENSSL) | |
| 138 client_crypto_config_.SetProofVerifier( | |
| 139 CryptoTestUtils::ProofVerifierForTesting()); | |
| 140 #else | |
| 141 // TODO(rch): Implement a NSS proof source. | |
| 142 client_crypto_config_.SetProofVerifier( | |
| 143 CryptoTestUtils::FakeProofVerifierForTesting()); | |
| 144 #endif | |
| 145 } | |
| 146 } | 132 } |
| 147 | 133 |
| 148 bool AsyncStrikeRegisterVerification() { | 134 bool AsyncStrikeRegisterVerification() { |
| 149 if (server_connection_->version() > QUIC_VERSION_26) { | 135 if (server_connection_->version() > QUIC_VERSION_26) { |
| 150 return false; | 136 return false; |
| 151 } | 137 } |
| 152 return GetParam(); | 138 return GetParam(); |
| 153 } | 139 } |
| 154 | 140 |
| 155 void ConstructHandshakeMessage() { | 141 void ConstructHandshakeMessage() { |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 TEST_P(QuicCryptoServerStreamTest, BadMessageType) { | 374 TEST_P(QuicCryptoServerStreamTest, BadMessageType) { |
| 389 message_.set_tag(kSHLO); | 375 message_.set_tag(kSHLO); |
| 390 ConstructHandshakeMessage(); | 376 ConstructHandshakeMessage(); |
| 391 EXPECT_CALL(*server_connection_, | 377 EXPECT_CALL(*server_connection_, |
| 392 SendConnectionClose(QUIC_INVALID_CRYPTO_MESSAGE_TYPE)); | 378 SendConnectionClose(QUIC_INVALID_CRYPTO_MESSAGE_TYPE)); |
| 393 server_stream()->OnStreamFrame( | 379 server_stream()->OnStreamFrame( |
| 394 QuicStreamFrame(kCryptoStreamId, /*fin=*/false, /*offset=*/0, | 380 QuicStreamFrame(kCryptoStreamId, /*fin=*/false, /*offset=*/0, |
| 395 message_data_->AsStringPiece())); | 381 message_data_->AsStringPiece())); |
| 396 } | 382 } |
| 397 | 383 |
| 398 TEST_P(QuicCryptoServerStreamTest, WithoutCertificates) { | |
| 399 server_crypto_config_.SetProofSource(nullptr); | |
| 400 server_id_ = | |
| 401 QuicServerId(kServerHostname, kServerPort, false, PRIVACY_MODE_DISABLED); | |
| 402 client_options_.dont_verify_certs = true; | |
| 403 | |
| 404 // Only 2 client hellos need to be sent in the no-certs case: one to get the | |
| 405 // source-address token and the second to finish. | |
| 406 EXPECT_EQ(2, CompleteCryptoHandshake()); | |
| 407 EXPECT_TRUE(server_stream()->encryption_established()); | |
| 408 EXPECT_TRUE(server_stream()->handshake_confirmed()); | |
| 409 } | |
| 410 | |
| 411 TEST_P(QuicCryptoServerStreamTest, ChannelID) { | 384 TEST_P(QuicCryptoServerStreamTest, ChannelID) { |
| 412 client_options_.channel_id_enabled = true; | 385 client_options_.channel_id_enabled = true; |
| 413 client_options_.channel_id_source_async = false; | 386 client_options_.channel_id_source_async = false; |
| 414 // CompleteCryptoHandshake verifies | 387 // CompleteCryptoHandshake verifies |
| 415 // server_stream()->crypto_negotiated_params().channel_id is correct. | 388 // server_stream()->crypto_negotiated_params().channel_id is correct. |
| 416 EXPECT_EQ(2, CompleteCryptoHandshake()); | 389 EXPECT_EQ(2, CompleteCryptoHandshake()); |
| 417 EXPECT_TRUE(server_stream()->encryption_established()); | 390 EXPECT_TRUE(server_stream()->encryption_established()); |
| 418 EXPECT_TRUE(server_stream()->handshake_confirmed()); | 391 EXPECT_TRUE(server_stream()->handshake_confirmed()); |
| 419 } | 392 } |
| 420 | 393 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 442 QuicCryptoServerStreamPeer::DoesPeerSupportStatelessRejects(message_)); | 415 QuicCryptoServerStreamPeer::DoesPeerSupportStatelessRejects(message_)); |
| 443 | 416 |
| 444 message_.Clear(); | 417 message_.Clear(); |
| 445 QuicConfig stateful_reject_config = DefaultQuicConfig(); | 418 QuicConfig stateful_reject_config = DefaultQuicConfig(); |
| 446 stateful_reject_config.ToHandshakeMessage(&message_); | 419 stateful_reject_config.ToHandshakeMessage(&message_); |
| 447 EXPECT_FALSE( | 420 EXPECT_FALSE( |
| 448 QuicCryptoServerStreamPeer::DoesPeerSupportStatelessRejects(message_)); | 421 QuicCryptoServerStreamPeer::DoesPeerSupportStatelessRejects(message_)); |
| 449 } | 422 } |
| 450 | 423 |
| 451 } // namespace | 424 } // namespace |
| 425 |
| 426 #endif |
| 427 |
| 452 } // namespace test | 428 } // namespace test |
| 453 } // namespace net | 429 } // namespace net |
| OLD | NEW |