| 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" |
| 11 #include "net/quic/crypto/aes_128_gcm_12_encrypter.h" | 11 #include "net/quic/crypto/aes_128_gcm_12_encrypter.h" |
| 12 #include "net/quic/crypto/crypto_framer.h" | 12 #include "net/quic/crypto/crypto_framer.h" |
| 13 #include "net/quic/crypto/crypto_handshake.h" | 13 #include "net/quic/crypto/crypto_handshake.h" |
| 14 #include "net/quic/crypto/crypto_protocol.h" | 14 #include "net/quic/crypto/crypto_protocol.h" |
| 15 #include "net/quic/crypto/crypto_utils.h" | 15 #include "net/quic/crypto/crypto_utils.h" |
| 16 #include "net/quic/crypto/quic_crypto_server_config.h" | 16 #include "net/quic/crypto/quic_crypto_server_config.h" |
| 17 #include "net/quic/crypto/quic_decrypter.h" | 17 #include "net/quic/crypto/quic_decrypter.h" |
| 18 #include "net/quic/crypto/quic_encrypter.h" | 18 #include "net/quic/crypto/quic_encrypter.h" |
| 19 #include "net/quic/crypto/quic_random.h" | 19 #include "net/quic/crypto/quic_random.h" |
| 20 #include "net/quic/quic_crypto_client_stream.h" | 20 #include "net/quic/quic_crypto_client_stream.h" |
| 21 #include "net/quic/quic_flags.h" |
| 21 #include "net/quic/quic_protocol.h" | 22 #include "net/quic/quic_protocol.h" |
| 22 #include "net/quic/quic_session.h" | 23 #include "net/quic/quic_session.h" |
| 23 #include "net/quic/test_tools/crypto_test_utils.h" | 24 #include "net/quic/test_tools/crypto_test_utils.h" |
| 24 #include "net/quic/test_tools/delayed_verify_strike_register_client.h" | 25 #include "net/quic/test_tools/delayed_verify_strike_register_client.h" |
| 25 #include "net/quic/test_tools/quic_test_utils.h" | 26 #include "net/quic/test_tools/quic_test_utils.h" |
| 26 #include "testing/gmock/include/gmock/gmock.h" | 27 #include "testing/gmock/include/gmock/gmock.h" |
| 27 #include "testing/gtest/include/gtest/gtest.h" | 28 #include "testing/gtest/include/gtest/gtest.h" |
| 28 | 29 |
| 29 namespace net { | 30 namespace net { |
| 30 class QuicConnection; | 31 class QuicConnection; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 41 class QuicCryptoServerConfigPeer { | 42 class QuicCryptoServerConfigPeer { |
| 42 public: | 43 public: |
| 43 static string GetPrimaryOrbit(const QuicCryptoServerConfig& config) { | 44 static string GetPrimaryOrbit(const QuicCryptoServerConfig& config) { |
| 44 base::AutoLock lock(config.configs_lock_); | 45 base::AutoLock lock(config.configs_lock_); |
| 45 CHECK(config.primary_config_.get() != nullptr); | 46 CHECK(config.primary_config_.get() != nullptr); |
| 46 return string(reinterpret_cast<const char*>(config.primary_config_->orbit), | 47 return string(reinterpret_cast<const char*>(config.primary_config_->orbit), |
| 47 kOrbitSize); | 48 kOrbitSize); |
| 48 } | 49 } |
| 49 }; | 50 }; |
| 50 | 51 |
| 52 class QuicCryptoServerStreamPeer { |
| 53 public: |
| 54 static bool DoesPeerSupportStatelessRejects( |
| 55 const CryptoHandshakeMessage& message) { |
| 56 return net::QuicCryptoServerStream::DoesPeerSupportStatelessRejects( |
| 57 message); |
| 58 } |
| 59 }; |
| 60 |
| 51 namespace { | 61 namespace { |
| 52 | 62 |
| 53 const char kServerHostname[] = "test.example.com"; | 63 const char kServerHostname[] = "test.example.com"; |
| 54 const uint16 kServerPort = 80; | 64 const uint16 kServerPort = 80; |
| 55 | 65 |
| 56 class QuicCryptoServerStreamTest : public ::testing::TestWithParam<bool> { | 66 class QuicCryptoServerStreamTest : public ::testing::TestWithParam<bool> { |
| 57 public: | 67 public: |
| 58 QuicCryptoServerStreamTest() | 68 QuicCryptoServerStreamTest() |
| 59 : connection_(new PacketSavingConnection(Perspective::IS_SERVER)), | 69 : server_crypto_config_(QuicCryptoServerConfig::TESTING, |
| 60 session_(connection_, DefaultQuicConfig()), | 70 QuicRandom::GetInstance()), |
| 61 crypto_config_(QuicCryptoServerConfig::TESTING, | 71 server_id_(kServerHostname, kServerPort, false, PRIVACY_MODE_DISABLED) { |
| 62 QuicRandom::GetInstance()), | |
| 63 stream_(&crypto_config_, &session_), | |
| 64 strike_register_client_(nullptr) { | |
| 65 session_.SetCryptoStream(&stream_); | |
| 66 // We advance the clock initially because the default time is zero and the | |
| 67 // strike register worries that we've just overflowed a uint32 time. | |
| 68 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(100000)); | |
| 69 // TODO(wtc): replace this with ProofSourceForTesting() when Chromium has | 72 // TODO(wtc): replace this with ProofSourceForTesting() when Chromium has |
| 70 // a working ProofSourceForTesting(). | 73 // a working ProofSourceForTesting(). |
| 71 crypto_config_.SetProofSource(CryptoTestUtils::FakeProofSourceForTesting()); | 74 server_crypto_config_.SetProofSource( |
| 72 crypto_config_.set_strike_register_no_startup_period(); | 75 CryptoTestUtils::FakeProofSourceForTesting()); |
| 76 server_crypto_config_.set_strike_register_no_startup_period(); |
| 73 | 77 |
| 74 CryptoTestUtils::SetupCryptoServerConfigForTest( | 78 InitializeServer(); |
| 75 connection_->clock(), connection_->random_generator(), | |
| 76 session_.config(), &crypto_config_); | |
| 77 | 79 |
| 78 if (AsyncStrikeRegisterVerification()) { | 80 if (AsyncStrikeRegisterVerification()) { |
| 79 string orbit = | 81 string orbit = |
| 80 QuicCryptoServerConfigPeer::GetPrimaryOrbit(crypto_config_); | 82 QuicCryptoServerConfigPeer::GetPrimaryOrbit(server_crypto_config_); |
| 81 strike_register_client_ = new DelayedVerifyStrikeRegisterClient( | 83 strike_register_client_ = new DelayedVerifyStrikeRegisterClient( |
| 82 10000, // strike_register_max_entries | 84 10000, // strike_register_max_entries |
| 83 static_cast<uint32>(connection_->clock()->WallNow().ToUNIXSeconds()), | 85 static_cast<uint32>( |
| 86 server_connection_->clock()->WallNow().ToUNIXSeconds()), |
| 84 60, // strike_register_window_secs | 87 60, // strike_register_window_secs |
| 85 reinterpret_cast<const uint8 *>(orbit.data()), | 88 reinterpret_cast<const uint8*>(orbit.data()), |
| 86 StrikeRegister::NO_STARTUP_PERIOD_NEEDED); | 89 StrikeRegister::NO_STARTUP_PERIOD_NEEDED); |
| 87 strike_register_client_->StartDelayingVerification(); | 90 strike_register_client_->StartDelayingVerification(); |
| 88 crypto_config_.SetStrikeRegisterClient(strike_register_client_); | 91 server_crypto_config_.SetStrikeRegisterClient(strike_register_client_); |
| 89 } | 92 } |
| 90 } | 93 } |
| 91 | 94 |
| 95 // Initializes the crypto server stream state for testing. May be |
| 96 // called multiple times. |
| 97 void InitializeServer() { |
| 98 TestServerSession* server_session = nullptr; |
| 99 QuicCryptoServerStream* server_stream = nullptr; |
| 100 SetupCryptoServerStreamForTest(server_id_, |
| 101 QuicTime::Delta::FromSeconds(100000), |
| 102 &server_crypto_config_, &server_connection_, |
| 103 &server_session, &server_stream); |
| 104 CHECK(server_session); |
| 105 CHECK(server_stream); |
| 106 server_session_.reset(server_session); |
| 107 server_stream_.reset(server_stream); |
| 108 CryptoTestUtils::SetupCryptoServerConfigForTest( |
| 109 server_connection_->clock(), server_connection_->random_generator(), |
| 110 server_session_->config(), &server_crypto_config_); |
| 111 } |
| 112 |
| 113 // Initializes a fake client, and all its associated state, for |
| 114 // testing. May be called multiple times. |
| 115 void InitializeFakeClient(bool supports_stateless_rejects) { |
| 116 TestClientSession* client_session = nullptr; |
| 117 QuicCryptoClientStream* client_stream = nullptr; |
| 118 SetupCryptoClientStreamForTest(server_id_, supports_stateless_rejects, |
| 119 QuicTime::Delta::FromSeconds(100000), |
| 120 &client_crypto_config_, &client_connection_, |
| 121 &client_session, &client_stream); |
| 122 CHECK(client_session); |
| 123 CHECK(client_stream); |
| 124 client_session_.reset(client_session); |
| 125 client_stream_.reset(client_stream); |
| 126 } |
| 127 |
| 92 bool AsyncStrikeRegisterVerification() { | 128 bool AsyncStrikeRegisterVerification() { |
| 93 return GetParam(); | 129 return GetParam(); |
| 94 } | 130 } |
| 95 | 131 |
| 96 void ConstructHandshakeMessage() { | 132 void ConstructHandshakeMessage() { |
| 97 CryptoFramer framer; | 133 CryptoFramer framer; |
| 98 message_data_.reset(framer.ConstructHandshakeMessage(message_)); | 134 message_data_.reset(framer.ConstructHandshakeMessage(message_)); |
| 99 } | 135 } |
| 100 | 136 |
| 101 int CompleteCryptoHandshake() { | 137 int CompleteCryptoHandshake() { |
| 102 return CryptoTestUtils::HandshakeWithFakeClient(connection_, &stream_, | 138 CHECK(server_connection_); |
| 103 client_options_); | 139 CHECK(server_stream_ != nullptr); |
| 140 return CryptoTestUtils::HandshakeWithFakeClient( |
| 141 server_connection_, server_stream_.get(), client_options_); |
| 142 } |
| 143 |
| 144 // Performs a single round of handshake message-exchange between the |
| 145 // client and server. |
| 146 void AdvanceHandshakeWithFakeClient() { |
| 147 CHECK(server_connection_); |
| 148 CHECK(server_stream_ != nullptr); |
| 149 CHECK(client_session_ != nullptr); |
| 150 CHECK(client_stream_ != nullptr); |
| 151 |
| 152 EXPECT_CALL(*client_session_, OnProofValid(_)).Times(testing::AnyNumber()); |
| 153 client_stream_->CryptoConnect(); |
| 154 CryptoTestUtils::AdvanceHandshake(client_connection_, client_stream_.get(), |
| 155 0, server_connection_, |
| 156 server_stream_.get(), 0); |
| 104 } | 157 } |
| 105 | 158 |
| 106 protected: | 159 protected: |
| 107 PacketSavingConnection* connection_; | 160 // Server state |
| 108 TestClientSession session_; | 161 PacketSavingConnection* server_connection_; |
| 109 QuicConfig config_; | 162 scoped_ptr<TestServerSession> server_session_; |
| 110 QuicCryptoServerConfig crypto_config_; | 163 QuicCryptoServerConfig server_crypto_config_; |
| 111 QuicCryptoServerStream stream_; | 164 scoped_ptr<QuicCryptoServerStream> server_stream_; |
| 165 QuicServerId server_id_; |
| 166 |
| 167 // Client state |
| 168 PacketSavingConnection* client_connection_; |
| 169 QuicCryptoClientConfig client_crypto_config_; |
| 170 scoped_ptr<TestClientSession> client_session_; |
| 171 scoped_ptr<QuicCryptoClientStream> client_stream_; |
| 172 |
| 112 CryptoHandshakeMessage message_; | 173 CryptoHandshakeMessage message_; |
| 113 scoped_ptr<QuicData> message_data_; | 174 scoped_ptr<QuicData> message_data_; |
| 114 CryptoTestUtils::FakeClientOptions client_options_; | 175 CryptoTestUtils::FakeClientOptions client_options_; |
| 115 DelayedVerifyStrikeRegisterClient* strike_register_client_; | 176 DelayedVerifyStrikeRegisterClient* strike_register_client_; |
| 116 }; | 177 }; |
| 117 | 178 |
| 118 INSTANTIATE_TEST_CASE_P(Tests, QuicCryptoServerStreamTest, testing::Bool()); | 179 INSTANTIATE_TEST_CASE_P(Tests, QuicCryptoServerStreamTest, testing::Bool()); |
| 119 | 180 |
| 120 TEST_P(QuicCryptoServerStreamTest, NotInitiallyConected) { | 181 TEST_P(QuicCryptoServerStreamTest, NotInitiallyConected) { |
| 121 EXPECT_FALSE(stream_.encryption_established()); | 182 EXPECT_FALSE(server_stream_->encryption_established()); |
| 122 EXPECT_FALSE(stream_.handshake_confirmed()); | 183 EXPECT_FALSE(server_stream_->handshake_confirmed()); |
| 184 } |
| 185 |
| 186 TEST_P(QuicCryptoServerStreamTest, NotInitiallySendingStatelessRejects) { |
| 187 EXPECT_FALSE(server_stream_->use_stateless_rejects_if_peer_supported()); |
| 188 EXPECT_FALSE(server_stream_->peer_supports_stateless_rejects()); |
| 123 } | 189 } |
| 124 | 190 |
| 125 TEST_P(QuicCryptoServerStreamTest, ConnectedAfterCHLO) { | 191 TEST_P(QuicCryptoServerStreamTest, ConnectedAfterCHLO) { |
| 126 // CompleteCryptoHandshake returns the number of client hellos sent. This | 192 // CompleteCryptoHandshake returns the number of client hellos sent. This |
| 127 // test should send: | 193 // test should send: |
| 128 // * One to get a source-address token and certificates. | 194 // * One to get a source-address token and certificates. |
| 129 // * One to complete the handshake. | 195 // * One to complete the handshake. |
| 130 EXPECT_EQ(2, CompleteCryptoHandshake()); | 196 EXPECT_EQ(2, CompleteCryptoHandshake()); |
| 131 EXPECT_TRUE(stream_.encryption_established()); | 197 EXPECT_TRUE(server_stream_->encryption_established()); |
| 132 EXPECT_TRUE(stream_.handshake_confirmed()); | 198 EXPECT_TRUE(server_stream_->handshake_confirmed()); |
| 133 } | 199 } |
| 134 | 200 |
| 135 TEST_P(QuicCryptoServerStreamTest, ZeroRTT) { | 201 TEST_P(QuicCryptoServerStreamTest, StatelessRejectAfterCHLO) { |
| 136 PacketSavingConnection* client_conn = | 202 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stateless_reject_support, |
| 137 new PacketSavingConnection(Perspective::IS_CLIENT); | 203 true); |
| 138 PacketSavingConnection* server_conn = | 204 server_stream_->set_use_stateless_rejects_if_peer_supported(true); |
| 139 new PacketSavingConnection(Perspective::IS_SERVER); | 205 |
| 140 client_conn->AdvanceTime(QuicTime::Delta::FromSeconds(100000)); | 206 InitializeFakeClient(/* supports_stateless_rejects= */ true); |
| 141 server_conn->AdvanceTime(QuicTime::Delta::FromSeconds(100000)); | 207 AdvanceHandshakeWithFakeClient(); |
| 142 | 208 |
| 143 QuicConfig client_config; | 209 // Check the server to make the sure the handshake did not succeed. |
| 144 scoped_ptr<TestClientSession> client_session( | 210 EXPECT_FALSE(server_stream_->encryption_established()); |
| 145 new TestClientSession(client_conn, client_config)); | 211 EXPECT_FALSE(server_stream_->handshake_confirmed()); |
| 146 QuicCryptoClientConfig client_crypto_config; | 212 |
| 147 | 213 // Check the client state to make sure that it received a |
| 148 QuicServerId server_id(kServerHostname, kServerPort, false, | 214 // server-designated connection id. |
| 149 PRIVACY_MODE_DISABLED); | 215 QuicCryptoClientConfig::CachedState* client_state = |
| 150 scoped_ptr<QuicCryptoClientStream> client(new QuicCryptoClientStream( | 216 client_crypto_config_.LookupOrCreate(server_id_); |
| 151 server_id, client_session.get(), nullptr, &client_crypto_config)); | 217 |
| 152 client_session->SetCryptoStream(client.get()); | 218 ASSERT_TRUE(client_state->has_server_designated_connection_id()); |
| 153 | 219 const QuicConnectionId server_designated_connection_id = |
| 154 // Do a first handshake in order to prime the client config with the server's | 220 client_state->GetNextServerDesignatedConnectionId(); |
| 155 // information. | 221 const QuicConnectionId expected_id = |
| 156 client->CryptoConnect(); | 222 reinterpret_cast<MockRandom*>(server_connection_->random_generator()) |
| 157 CHECK_EQ(1u, client_conn->encrypted_packets_.size()); | 223 ->RandUint64(); |
| 158 | 224 EXPECT_EQ(expected_id, server_designated_connection_id); |
| 159 scoped_ptr<TestSession> server_session(new TestSession(server_conn, config_)); | 225 EXPECT_FALSE(client_state->has_server_designated_connection_id()); |
| 160 scoped_ptr<QuicCryptoServerStream> server( | 226 ASSERT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0))); |
| 161 new QuicCryptoServerStream(&crypto_config_, server_session.get())); | 227 } |
| 162 server_session->SetCryptoStream(server.get()); | 228 |
| 163 | 229 TEST_P(QuicCryptoServerStreamTest, ConnectedAfterStatelessHandshake) { |
| 164 CryptoTestUtils::CommunicateHandshakeMessages( | 230 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stateless_reject_support, |
| 165 client_conn, client.get(), server_conn, server.get()); | 231 true); |
| 166 EXPECT_EQ(2, client->num_sent_client_hellos()); | 232 server_stream_->set_use_stateless_rejects_if_peer_supported(true); |
| 167 | 233 |
| 168 // Now do another handshake, hopefully in 0-RTT. | 234 InitializeFakeClient(/* supports_stateless_rejects= */ true); |
| 169 LOG(INFO) << "Resetting for 0-RTT handshake attempt"; | 235 AdvanceHandshakeWithFakeClient(); |
| 170 | 236 |
| 171 client_conn = new PacketSavingConnection(Perspective::IS_CLIENT); | 237 // On the first round, encryption will not be established. |
| 172 server_conn = new PacketSavingConnection(Perspective::IS_SERVER); | 238 EXPECT_FALSE(server_stream_->encryption_established()); |
| 173 // We need to advance time past the strike-server window so that it's | 239 EXPECT_FALSE(server_stream_->handshake_confirmed()); |
| 174 // authoritative in this time span. | 240 |
| 175 client_conn->AdvanceTime(QuicTime::Delta::FromSeconds(102000)); | 241 // Now check the client state. |
| 176 server_conn->AdvanceTime(QuicTime::Delta::FromSeconds(102000)); | 242 QuicCryptoClientConfig::CachedState* client_state = |
| 177 | 243 client_crypto_config_.LookupOrCreate(server_id_); |
| 178 // This causes the client's nonce to be different and thus stops the | 244 |
| 179 // strike-register from rejecting the repeated nonce. | 245 ASSERT_TRUE(client_state->has_server_designated_connection_id()); |
| 180 reinterpret_cast<MockRandom*>(client_conn->random_generator())->ChangeValue(); | 246 const QuicConnectionId server_designated_connection_id = |
| 181 client_session.reset(new TestClientSession(client_conn, client_config)); | 247 client_state->GetNextServerDesignatedConnectionId(); |
| 182 server_session.reset(new TestSession(server_conn, config_)); | 248 const QuicConnectionId expected_id = |
| 183 client.reset(new QuicCryptoClientStream(server_id, client_session.get(), | 249 reinterpret_cast<MockRandom*>(server_connection_->random_generator()) |
| 184 nullptr, &client_crypto_config)); | 250 ->RandUint64(); |
| 185 client_session->SetCryptoStream(client.get()); | 251 EXPECT_EQ(expected_id, server_designated_connection_id); |
| 186 | 252 EXPECT_FALSE(client_state->has_server_designated_connection_id()); |
| 187 server.reset(new QuicCryptoServerStream(&crypto_config_, | 253 ASSERT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0))); |
| 188 server_session.get())); | 254 |
| 189 server_session->SetCryptoStream(server.get()); | 255 // Now create new client and server streams with the existing config |
| 190 | 256 // and try the handshake again (0-RTT handshake). |
| 191 client->CryptoConnect(); | 257 InitializeServer(); |
| 192 | 258 server_stream_->set_use_stateless_rejects_if_peer_supported(true); |
| 259 |
| 260 InitializeFakeClient(/* supports_stateless_rejects= */ true); |
| 261 |
| 262 client_stream_->CryptoConnect(); |
| 193 if (AsyncStrikeRegisterVerification()) { | 263 if (AsyncStrikeRegisterVerification()) { |
| 194 EXPECT_FALSE(client->handshake_confirmed()); | 264 EXPECT_FALSE(client_stream_->handshake_confirmed()); |
| 195 EXPECT_FALSE(server->handshake_confirmed()); | 265 EXPECT_FALSE(server_stream_->handshake_confirmed()); |
| 196 | 266 |
| 197 // Advance the handshake. Expect that the server will be stuck | 267 // Advance the handshake. Expect that the server will be stuck |
| 198 // waiting for client nonce verification to complete. | 268 // waiting for client nonce verification to complete. |
| 199 pair<size_t, size_t> messages_moved = CryptoTestUtils::AdvanceHandshake( | 269 pair<size_t, size_t> messages_moved = CryptoTestUtils::AdvanceHandshake( |
| 200 client_conn, client.get(), 0, server_conn, server.get(), 0); | 270 client_connection_, client_stream_.get(), 0, server_connection_, |
| 271 server_stream_.get(), 0); |
| 201 EXPECT_EQ(1u, messages_moved.first); | 272 EXPECT_EQ(1u, messages_moved.first); |
| 202 EXPECT_EQ(0u, messages_moved.second); | 273 EXPECT_EQ(0u, messages_moved.second); |
| 203 EXPECT_EQ(1, strike_register_client_->PendingVerifications()); | 274 EXPECT_EQ(1, strike_register_client_->PendingVerifications()); |
| 204 EXPECT_FALSE(client->handshake_confirmed()); | 275 EXPECT_FALSE(client_stream_->handshake_confirmed()); |
| 205 EXPECT_FALSE(server->handshake_confirmed()); | 276 EXPECT_FALSE(server_stream_->handshake_confirmed()); |
| 206 | 277 |
| 207 // The server handshake completes once the nonce verification completes. | 278 // The server handshake completes once the nonce verification completes. |
| 208 strike_register_client_->RunPendingVerifications(); | 279 strike_register_client_->RunPendingVerifications(); |
| 209 EXPECT_FALSE(client->handshake_confirmed()); | 280 EXPECT_FALSE(client_stream_->handshake_confirmed()); |
| 210 EXPECT_TRUE(server->handshake_confirmed()); | 281 EXPECT_TRUE(server_stream_->handshake_confirmed()); |
| 211 | 282 |
| 212 messages_moved = CryptoTestUtils::AdvanceHandshake( | 283 messages_moved = CryptoTestUtils::AdvanceHandshake( |
| 213 client_conn, client.get(), messages_moved.first, | 284 client_connection_, client_stream_.get(), messages_moved.first, |
| 214 server_conn, server.get(), messages_moved.second); | 285 server_connection_, server_stream_.get(), messages_moved.second); |
| 215 EXPECT_EQ(1u, messages_moved.first); | 286 EXPECT_EQ(1u, messages_moved.first); |
| 216 EXPECT_EQ(1u, messages_moved.second); | 287 EXPECT_EQ(1u, messages_moved.second); |
| 217 EXPECT_TRUE(client->handshake_confirmed()); | 288 } else { |
| 218 EXPECT_TRUE(server->handshake_confirmed()); | 289 AdvanceHandshakeWithFakeClient(); |
| 290 } |
| 291 |
| 292 // On the second round, encryption will be established. |
| 293 EXPECT_TRUE(server_stream_->encryption_established()); |
| 294 EXPECT_TRUE(server_stream_->handshake_confirmed()); |
| 295 } |
| 296 |
| 297 TEST_P(QuicCryptoServerStreamTest, NoStatelessRejectIfNoClientSupport) { |
| 298 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stateless_reject_support, |
| 299 true); |
| 300 server_stream_->set_use_stateless_rejects_if_peer_supported(true); |
| 301 |
| 302 // The server is configured to use stateless rejects, but the client |
| 303 // does not support it. |
| 304 InitializeFakeClient(/* supports_stateless_rejects= */ false); |
| 305 AdvanceHandshakeWithFakeClient(); |
| 306 |
| 307 // Check the server to make the sure the handshake did not succeed. |
| 308 EXPECT_FALSE(server_stream_->encryption_established()); |
| 309 EXPECT_FALSE(server_stream_->handshake_confirmed()); |
| 310 |
| 311 // Check the client state to make sure that it did not receive a |
| 312 // server-designated connection id. |
| 313 QuicCryptoClientConfig::CachedState* client_state = |
| 314 client_crypto_config_.LookupOrCreate(server_id_); |
| 315 |
| 316 ASSERT_FALSE(client_state->has_server_designated_connection_id()); |
| 317 ASSERT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0))); |
| 318 } |
| 319 |
| 320 TEST_P(QuicCryptoServerStreamTest, ZeroRTT) { |
| 321 InitializeFakeClient(/* supports_stateless_rejects= */ false); |
| 322 |
| 323 // Do a first handshake in order to prime the client config with the server's |
| 324 // information. |
| 325 AdvanceHandshakeWithFakeClient(); |
| 326 |
| 327 // Now do another handshake, hopefully in 0-RTT. |
| 328 DVLOG(1) << "Resetting for 0-RTT handshake attempt"; |
| 329 InitializeFakeClient(/* supports_stateless_rejects= */ false); |
| 330 InitializeServer(); |
| 331 |
| 332 client_stream_->CryptoConnect(); |
| 333 |
| 334 if (AsyncStrikeRegisterVerification()) { |
| 335 EXPECT_FALSE(client_stream_->handshake_confirmed()); |
| 336 EXPECT_FALSE(server_stream_->handshake_confirmed()); |
| 337 |
| 338 // Advance the handshake. Expect that the server will be stuck |
| 339 // waiting for client nonce verification to complete. |
| 340 pair<size_t, size_t> messages_moved = CryptoTestUtils::AdvanceHandshake( |
| 341 client_connection_, client_stream_.get(), 0, server_connection_, |
| 342 server_stream_.get(), 0); |
| 343 EXPECT_EQ(1u, messages_moved.first); |
| 344 EXPECT_EQ(0u, messages_moved.second); |
| 345 EXPECT_EQ(1, strike_register_client_->PendingVerifications()); |
| 346 EXPECT_FALSE(client_stream_->handshake_confirmed()); |
| 347 EXPECT_FALSE(server_stream_->handshake_confirmed()); |
| 348 |
| 349 // The server handshake completes once the nonce verification completes. |
| 350 strike_register_client_->RunPendingVerifications(); |
| 351 EXPECT_FALSE(client_stream_->handshake_confirmed()); |
| 352 EXPECT_TRUE(server_stream_->handshake_confirmed()); |
| 353 |
| 354 messages_moved = CryptoTestUtils::AdvanceHandshake( |
| 355 client_connection_, client_stream_.get(), messages_moved.first, |
| 356 server_connection_, server_stream_.get(), messages_moved.second); |
| 357 EXPECT_EQ(1u, messages_moved.first); |
| 358 EXPECT_EQ(1u, messages_moved.second); |
| 359 EXPECT_TRUE(client_stream_->handshake_confirmed()); |
| 360 EXPECT_TRUE(server_stream_->handshake_confirmed()); |
| 219 } else { | 361 } else { |
| 220 CryptoTestUtils::CommunicateHandshakeMessages( | 362 CryptoTestUtils::CommunicateHandshakeMessages( |
| 221 client_conn, client.get(), server_conn, server.get()); | 363 client_connection_, client_stream_.get(), server_connection_, |
| 364 server_stream_.get()); |
| 222 } | 365 } |
| 223 | 366 |
| 224 EXPECT_EQ(1, client->num_sent_client_hellos()); | 367 EXPECT_EQ(1, client_stream_->num_sent_client_hellos()); |
| 225 } | 368 } |
| 226 | 369 |
| 227 TEST_P(QuicCryptoServerStreamTest, MessageAfterHandshake) { | 370 TEST_P(QuicCryptoServerStreamTest, MessageAfterHandshake) { |
| 228 CompleteCryptoHandshake(); | 371 CompleteCryptoHandshake(); |
| 229 EXPECT_CALL(*connection_, SendConnectionClose( | 372 EXPECT_CALL( |
| 230 QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE)); | 373 *server_connection_, |
| 374 SendConnectionClose(QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE)); |
| 231 message_.set_tag(kCHLO); | 375 message_.set_tag(kCHLO); |
| 232 ConstructHandshakeMessage(); | 376 ConstructHandshakeMessage(); |
| 233 stream_.ProcessRawData(message_data_->data(), message_data_->length()); | 377 server_stream_->ProcessRawData(message_data_->data(), |
| 378 message_data_->length()); |
| 234 } | 379 } |
| 235 | 380 |
| 236 TEST_P(QuicCryptoServerStreamTest, BadMessageType) { | 381 TEST_P(QuicCryptoServerStreamTest, BadMessageType) { |
| 237 message_.set_tag(kSHLO); | 382 message_.set_tag(kSHLO); |
| 238 ConstructHandshakeMessage(); | 383 ConstructHandshakeMessage(); |
| 239 EXPECT_CALL(*connection_, SendConnectionClose( | 384 EXPECT_CALL(*server_connection_, |
| 240 QUIC_INVALID_CRYPTO_MESSAGE_TYPE)); | 385 SendConnectionClose(QUIC_INVALID_CRYPTO_MESSAGE_TYPE)); |
| 241 stream_.ProcessRawData(message_data_->data(), message_data_->length()); | 386 server_stream_->ProcessRawData(message_data_->data(), |
| 387 message_data_->length()); |
| 242 } | 388 } |
| 243 | 389 |
| 244 TEST_P(QuicCryptoServerStreamTest, WithoutCertificates) { | 390 TEST_P(QuicCryptoServerStreamTest, WithoutCertificates) { |
| 245 crypto_config_.SetProofSource(nullptr); | 391 server_crypto_config_.SetProofSource(nullptr); |
| 246 client_options_.dont_verify_certs = true; | 392 client_options_.dont_verify_certs = true; |
| 247 | 393 |
| 248 // Only 2 client hellos need to be sent in the no-certs case: one to get the | 394 // Only 2 client hellos need to be sent in the no-certs case: one to get the |
| 249 // source-address token and the second to finish. | 395 // source-address token and the second to finish. |
| 250 EXPECT_EQ(2, CompleteCryptoHandshake()); | 396 EXPECT_EQ(2, CompleteCryptoHandshake()); |
| 251 EXPECT_TRUE(stream_.encryption_established()); | 397 EXPECT_TRUE(server_stream_->encryption_established()); |
| 252 EXPECT_TRUE(stream_.handshake_confirmed()); | 398 EXPECT_TRUE(server_stream_->handshake_confirmed()); |
| 253 } | 399 } |
| 254 | 400 |
| 255 TEST_P(QuicCryptoServerStreamTest, ChannelID) { | 401 TEST_P(QuicCryptoServerStreamTest, ChannelID) { |
| 256 client_options_.channel_id_enabled = true; | 402 client_options_.channel_id_enabled = true; |
| 257 client_options_.channel_id_source_async = false; | 403 client_options_.channel_id_source_async = false; |
| 258 // CompleteCryptoHandshake verifies | 404 // CompleteCryptoHandshake verifies |
| 259 // stream_.crypto_negotiated_params().channel_id is correct. | 405 // server_stream_->crypto_negotiated_params().channel_id is correct. |
| 260 EXPECT_EQ(2, CompleteCryptoHandshake()); | 406 EXPECT_EQ(2, CompleteCryptoHandshake()); |
| 261 EXPECT_TRUE(stream_.encryption_established()); | 407 EXPECT_TRUE(server_stream_->encryption_established()); |
| 262 EXPECT_TRUE(stream_.handshake_confirmed()); | 408 EXPECT_TRUE(server_stream_->handshake_confirmed()); |
| 263 } | 409 } |
| 264 | 410 |
| 265 TEST_P(QuicCryptoServerStreamTest, ChannelIDAsync) { | 411 TEST_P(QuicCryptoServerStreamTest, ChannelIDAsync) { |
| 266 client_options_.channel_id_enabled = true; | 412 client_options_.channel_id_enabled = true; |
| 267 client_options_.channel_id_source_async = true; | 413 client_options_.channel_id_source_async = true; |
| 268 // CompleteCryptoHandshake verifies | 414 // CompleteCryptoHandshake verifies |
| 269 // stream_.crypto_negotiated_params().channel_id is correct. | 415 // server_stream_->crypto_negotiated_params().channel_id is correct. |
| 270 EXPECT_EQ(2, CompleteCryptoHandshake()); | 416 EXPECT_EQ(2, CompleteCryptoHandshake()); |
| 271 EXPECT_TRUE(stream_.encryption_established()); | 417 EXPECT_TRUE(server_stream_->encryption_established()); |
| 272 EXPECT_TRUE(stream_.handshake_confirmed()); | 418 EXPECT_TRUE(server_stream_->handshake_confirmed()); |
| 273 } | 419 } |
| 274 | 420 |
| 275 TEST_P(QuicCryptoServerStreamTest, OnlySendSCUPAfterHandshakeComplete) { | 421 TEST_P(QuicCryptoServerStreamTest, OnlySendSCUPAfterHandshakeComplete) { |
| 276 // An attempt to send a SCUP before completing handshake should fail. | 422 // An attempt to send a SCUP before completing handshake should fail. |
| 277 stream_.SendServerConfigUpdate(nullptr); | 423 server_stream_->SendServerConfigUpdate(nullptr); |
| 278 EXPECT_EQ(0, stream_.num_server_config_update_messages_sent()); | 424 EXPECT_EQ(0, server_stream_->num_server_config_update_messages_sent()); |
| 425 } |
| 426 |
| 427 TEST_P(QuicCryptoServerStreamTest, DoesPeerSupportStatelessRejects) { |
| 428 ConstructHandshakeMessage(); |
| 429 QuicConfig stateless_reject_config = DefaultQuicConfigStatelessRejects(); |
| 430 stateless_reject_config.ToHandshakeMessage(&message_); |
| 431 EXPECT_TRUE( |
| 432 QuicCryptoServerStreamPeer::DoesPeerSupportStatelessRejects(message_)); |
| 433 |
| 434 message_.Clear(); |
| 435 QuicConfig stateful_reject_config = DefaultQuicConfig(); |
| 436 stateful_reject_config.ToHandshakeMessage(&message_); |
| 437 EXPECT_FALSE( |
| 438 QuicCryptoServerStreamPeer::DoesPeerSupportStatelessRejects(message_)); |
| 279 } | 439 } |
| 280 | 440 |
| 281 } // namespace | 441 } // namespace |
| 282 } // namespace test | 442 } // namespace test |
| 283 } // namespace net | 443 } // namespace net |
| OLD | NEW |