Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(91)

Side by Side Diff: net/quic/quic_crypto_server_stream_test.cc

Issue 1139183002: Flag-protected. Add stateless reject support to crypto streams. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@QuicCryptoClientConfig_ProcessRejection_92637704
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/quic_crypto_server_stream.cc ('k') | net/quic/test_tools/quic_test_utils.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« no previous file with comments | « net/quic/quic_crypto_server_stream.cc ('k') | net/quic/test_tools/quic_test_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698