OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "net/quic/quic_crypto_server_stream.h" | |
6 | |
7 #include <map> | |
8 #include <memory> | |
9 #include <vector> | |
10 | |
11 #include "base/stl_util.h" | |
12 #include "net/quic/crypto/aes_128_gcm_12_encrypter.h" | |
13 #include "net/quic/crypto/crypto_framer.h" | |
14 #include "net/quic/crypto/crypto_handshake.h" | |
15 #include "net/quic/crypto/crypto_protocol.h" | |
16 #include "net/quic/crypto/crypto_utils.h" | |
17 #include "net/quic/crypto/quic_crypto_server_config.h" | |
18 #include "net/quic/crypto/quic_decrypter.h" | |
19 #include "net/quic/crypto/quic_encrypter.h" | |
20 #include "net/quic/crypto/quic_random.h" | |
21 #include "net/quic/quic_crypto_client_stream.h" | |
22 #include "net/quic/quic_flags.h" | |
23 #include "net/quic/quic_protocol.h" | |
24 #include "net/quic/quic_session.h" | |
25 #include "net/quic/test_tools/crypto_test_utils.h" | |
26 #include "net/quic/test_tools/delayed_verify_strike_register_client.h" | |
27 #include "net/quic/test_tools/quic_crypto_server_config_peer.h" | |
28 #include "net/quic/test_tools/quic_test_utils.h" | |
29 #include "testing/gmock/include/gmock/gmock.h" | |
30 #include "testing/gtest/include/gtest/gtest.h" | |
31 | |
32 namespace net { | |
33 class QuicConnection; | |
34 class ReliableQuicStream; | |
35 } // namespace net | |
36 | |
37 using std::pair; | |
38 using std::string; | |
39 using testing::_; | |
40 | |
41 namespace net { | |
42 namespace test { | |
43 | |
44 class QuicCryptoServerStreamPeer { | |
45 public: | |
46 static bool DoesPeerSupportStatelessRejects( | |
47 const CryptoHandshakeMessage& message) { | |
48 return net::QuicCryptoServerStream::DoesPeerSupportStatelessRejects( | |
49 message); | |
50 } | |
51 }; | |
52 | |
53 namespace { | |
54 | |
55 const char kServerHostname[] = "test.example.com"; | |
56 const uint16_t kServerPort = 443; | |
57 | |
58 class QuicCryptoServerStreamTest : public ::testing::TestWithParam<bool> { | |
59 public: | |
60 QuicCryptoServerStreamTest() | |
61 : server_crypto_config_(QuicCryptoServerConfig::TESTING, | |
62 QuicRandom::GetInstance(), | |
63 CryptoTestUtils::ProofSourceForTesting()), | |
64 server_compressed_certs_cache_( | |
65 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize), | |
66 server_id_(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED), | |
67 client_crypto_config_(CryptoTestUtils::ProofVerifierForTesting()) { | |
68 FLAGS_enable_quic_stateless_reject_support = false; | |
69 server_crypto_config_.set_strike_register_no_startup_period(); | |
70 } | |
71 | |
72 void Initialize() { | |
73 InitializeServer(); | |
74 | |
75 if (AsyncStrikeRegisterVerification()) { | |
76 QuicCryptoServerConfigPeer peer(&server_crypto_config_); | |
77 strike_register_client_ = new DelayedVerifyStrikeRegisterClient( | |
78 10000, // strike_register_max_entries | |
79 static_cast<uint32_t>( | |
80 server_connection_->clock()->WallNow().ToUNIXSeconds()), | |
81 60, // strike_register_window_secs | |
82 peer.GetPrimaryConfig()->orbit, | |
83 StrikeRegister::NO_STARTUP_PERIOD_NEEDED); | |
84 strike_register_client_->StartDelayingVerification(); | |
85 server_crypto_config_.SetStrikeRegisterClient(strike_register_client_); | |
86 } | |
87 } | |
88 | |
89 ~QuicCryptoServerStreamTest() override { | |
90 // Ensure that anything that might reference |helpers_| is destroyed before | |
91 // |helpers_| is destroyed. | |
92 server_session_.reset(); | |
93 client_session_.reset(); | |
94 STLDeleteElements(&helpers_); | |
95 STLDeleteElements(&alarm_factories_); | |
96 } | |
97 | |
98 // Initializes the crypto server stream state for testing. May be | |
99 // called multiple times. | |
100 void InitializeServer() { | |
101 TestQuicSpdyServerSession* server_session = nullptr; | |
102 helpers_.push_back(new MockQuicConnectionHelper); | |
103 alarm_factories_.push_back(new MockAlarmFactory); | |
104 CreateServerSessionForTest( | |
105 server_id_, QuicTime::Delta::FromSeconds(100000), supported_versions_, | |
106 helpers_.back(), alarm_factories_.back(), &server_crypto_config_, | |
107 &server_compressed_certs_cache_, &server_connection_, &server_session); | |
108 CHECK(server_session); | |
109 server_session_.reset(server_session); | |
110 CryptoTestUtils::FakeServerOptions options; | |
111 options.token_binding_enabled = true; | |
112 CryptoTestUtils::SetupCryptoServerConfigForTest( | |
113 server_connection_->clock(), server_connection_->random_generator(), | |
114 server_session_->config(), &server_crypto_config_, options); | |
115 } | |
116 | |
117 QuicCryptoServerStream* server_stream() { | |
118 return server_session_->GetCryptoStream(); | |
119 } | |
120 | |
121 QuicCryptoClientStream* client_stream() { | |
122 return client_session_->GetCryptoStream(); | |
123 } | |
124 | |
125 // Initializes a fake client, and all its associated state, for | |
126 // testing. May be called multiple times. | |
127 void InitializeFakeClient(bool supports_stateless_rejects) { | |
128 TestQuicSpdyClientSession* client_session = nullptr; | |
129 helpers_.push_back(new MockQuicConnectionHelper); | |
130 alarm_factories_.push_back(new MockAlarmFactory); | |
131 CreateClientSessionForTest( | |
132 server_id_, supports_stateless_rejects, | |
133 QuicTime::Delta::FromSeconds(100000), supported_versions_, | |
134 | |
135 helpers_.back(), alarm_factories_.back(), &client_crypto_config_, | |
136 &client_connection_, &client_session); | |
137 CHECK(client_session); | |
138 client_session_.reset(client_session); | |
139 } | |
140 | |
141 bool AsyncStrikeRegisterVerification() { | |
142 if (server_connection_->version() > QUIC_VERSION_32) { | |
143 return false; | |
144 } | |
145 return GetParam(); | |
146 } | |
147 | |
148 void ConstructHandshakeMessage() { | |
149 CryptoFramer framer; | |
150 message_data_.reset(framer.ConstructHandshakeMessage(message_)); | |
151 } | |
152 | |
153 int CompleteCryptoHandshake() { | |
154 CHECK(server_connection_); | |
155 CHECK(server_session_ != nullptr); | |
156 return CryptoTestUtils::HandshakeWithFakeClient( | |
157 helpers_.back(), alarm_factories_.back(), server_connection_, | |
158 server_stream(), server_id_, client_options_); | |
159 } | |
160 | |
161 // Performs a single round of handshake message-exchange between the | |
162 // client and server. | |
163 void AdvanceHandshakeWithFakeClient() { | |
164 CHECK(server_connection_); | |
165 CHECK(client_session_ != nullptr); | |
166 | |
167 EXPECT_CALL(*client_session_, OnProofValid(_)).Times(testing::AnyNumber()); | |
168 client_stream()->CryptoConnect(); | |
169 CryptoTestUtils::AdvanceHandshake(client_connection_, client_stream(), 0, | |
170 server_connection_, server_stream(), 0); | |
171 } | |
172 | |
173 protected: | |
174 // Every connection gets its own MockQuicConnectionHelper and | |
175 // MockAlarmFactory, | |
176 // tracked separately from | |
177 // the server and client state so their lifetimes persist through the whole | |
178 // test. | |
179 std::vector<MockQuicConnectionHelper*> helpers_; | |
180 std::vector<MockAlarmFactory*> alarm_factories_; | |
181 | |
182 // Server state | |
183 PacketSavingConnection* server_connection_; | |
184 std::unique_ptr<TestQuicSpdyServerSession> server_session_; | |
185 QuicCryptoServerConfig server_crypto_config_; | |
186 QuicCompressedCertsCache server_compressed_certs_cache_; | |
187 QuicServerId server_id_; | |
188 | |
189 // Client state | |
190 PacketSavingConnection* client_connection_; | |
191 QuicCryptoClientConfig client_crypto_config_; | |
192 std::unique_ptr<TestQuicSpdyClientSession> client_session_; | |
193 | |
194 CryptoHandshakeMessage message_; | |
195 std::unique_ptr<QuicData> message_data_; | |
196 CryptoTestUtils::FakeClientOptions client_options_; | |
197 DelayedVerifyStrikeRegisterClient* strike_register_client_; | |
198 | |
199 // Which QUIC versions the client and server support. | |
200 QuicVersionVector supported_versions_ = QuicSupportedVersions(); | |
201 }; | |
202 | |
203 INSTANTIATE_TEST_CASE_P(Tests, QuicCryptoServerStreamTest, testing::Bool()); | |
204 | |
205 TEST_P(QuicCryptoServerStreamTest, NotInitiallyConected) { | |
206 Initialize(); | |
207 EXPECT_FALSE(server_stream()->encryption_established()); | |
208 EXPECT_FALSE(server_stream()->handshake_confirmed()); | |
209 } | |
210 | |
211 TEST_P(QuicCryptoServerStreamTest, NotInitiallySendingStatelessRejects) { | |
212 Initialize(); | |
213 EXPECT_FALSE(server_stream()->UseStatelessRejectsIfPeerSupported()); | |
214 EXPECT_FALSE(server_stream()->PeerSupportsStatelessRejects()); | |
215 } | |
216 | |
217 TEST_P(QuicCryptoServerStreamTest, ConnectedAfterCHLO) { | |
218 // CompleteCryptoHandshake returns the number of client hellos sent. This | |
219 // test should send: | |
220 // * One to get a source-address token and certificates. | |
221 // * One to complete the handshake. | |
222 Initialize(); | |
223 EXPECT_EQ(2, CompleteCryptoHandshake()); | |
224 EXPECT_TRUE(server_stream()->encryption_established()); | |
225 EXPECT_TRUE(server_stream()->handshake_confirmed()); | |
226 } | |
227 | |
228 TEST_P(QuicCryptoServerStreamTest, ForwardSecureAfterCHLO) { | |
229 Initialize(); | |
230 InitializeFakeClient(/* supports_stateless_rejects= */ false); | |
231 | |
232 // Do a first handshake in order to prime the client config with the server's | |
233 // information. | |
234 AdvanceHandshakeWithFakeClient(); | |
235 EXPECT_FALSE(server_stream()->encryption_established()); | |
236 EXPECT_FALSE(server_stream()->handshake_confirmed()); | |
237 | |
238 // Now do another handshake, with the blocking SHLO connection option. | |
239 InitializeServer(); | |
240 InitializeFakeClient(/* supports_stateless_rejects= */ false); | |
241 | |
242 AdvanceHandshakeWithFakeClient(); | |
243 EXPECT_TRUE(server_stream()->encryption_established()); | |
244 EXPECT_TRUE(server_stream()->handshake_confirmed()); | |
245 EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, | |
246 server_session_->connection()->encryption_level()); | |
247 } | |
248 | |
249 TEST_P(QuicCryptoServerStreamTest, StatelessRejectAfterCHLO) { | |
250 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stateless_reject_support, | |
251 true); | |
252 Initialize(); | |
253 | |
254 EXPECT_CALL(*server_connection_, | |
255 CloseConnection(QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, _, _)); | |
256 | |
257 InitializeFakeClient(/* supports_stateless_rejects= */ true); | |
258 AdvanceHandshakeWithFakeClient(); | |
259 | |
260 // Check the server to make the sure the handshake did not succeed. | |
261 EXPECT_FALSE(server_stream()->encryption_established()); | |
262 EXPECT_FALSE(server_stream()->handshake_confirmed()); | |
263 | |
264 // Check the client state to make sure that it received a server-designated | |
265 // connection id. | |
266 QuicCryptoClientConfig::CachedState* client_state = | |
267 client_crypto_config_.LookupOrCreate(server_id_); | |
268 | |
269 ASSERT_TRUE(client_state->has_server_nonce()); | |
270 ASSERT_FALSE(client_state->GetNextServerNonce().empty()); | |
271 ASSERT_FALSE(client_state->has_server_nonce()); | |
272 | |
273 ASSERT_TRUE(client_state->has_server_designated_connection_id()); | |
274 const QuicConnectionId server_designated_connection_id = | |
275 client_state->GetNextServerDesignatedConnectionId(); | |
276 const QuicConnectionId expected_id = | |
277 server_connection_->random_generator()->RandUint64(); | |
278 EXPECT_EQ(expected_id, server_designated_connection_id); | |
279 EXPECT_FALSE(client_state->has_server_designated_connection_id()); | |
280 ASSERT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0))); | |
281 } | |
282 | |
283 TEST_P(QuicCryptoServerStreamTest, ConnectedAfterStatelessHandshake) { | |
284 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stateless_reject_support, | |
285 true); | |
286 Initialize(); | |
287 | |
288 InitializeFakeClient(/* supports_stateless_rejects= */ true); | |
289 AdvanceHandshakeWithFakeClient(); | |
290 | |
291 // On the first round, encryption will not be established. | |
292 EXPECT_FALSE(server_stream()->encryption_established()); | |
293 EXPECT_FALSE(server_stream()->handshake_confirmed()); | |
294 EXPECT_EQ(1, server_stream()->NumHandshakeMessages()); | |
295 EXPECT_EQ(0, server_stream()->NumHandshakeMessagesWithServerNonces()); | |
296 | |
297 // Now check the client state. | |
298 QuicCryptoClientConfig::CachedState* client_state = | |
299 client_crypto_config_.LookupOrCreate(server_id_); | |
300 | |
301 ASSERT_TRUE(client_state->has_server_designated_connection_id()); | |
302 const QuicConnectionId server_designated_connection_id = | |
303 client_state->GetNextServerDesignatedConnectionId(); | |
304 const QuicConnectionId expected_id = | |
305 server_connection_->random_generator()->RandUint64(); | |
306 EXPECT_EQ(expected_id, server_designated_connection_id); | |
307 EXPECT_FALSE(client_state->has_server_designated_connection_id()); | |
308 ASSERT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0))); | |
309 | |
310 // Now create new client and server streams with the existing config | |
311 // and try the handshake again (0-RTT handshake). | |
312 InitializeServer(); | |
313 | |
314 InitializeFakeClient(/* supports_stateless_rejects= */ true); | |
315 | |
316 // In the stateless case, the second handshake contains a server-nonce, so the | |
317 // AsyncStrikeRegisterVerification() case will still succeed (unlike a 0-RTT | |
318 // handshake). | |
319 AdvanceHandshakeWithFakeClient(); | |
320 | |
321 // On the second round, encryption will be established. | |
322 EXPECT_TRUE(server_stream()->encryption_established()); | |
323 EXPECT_TRUE(server_stream()->handshake_confirmed()); | |
324 EXPECT_EQ(1, server_stream()->NumHandshakeMessages()); | |
325 EXPECT_EQ(1, server_stream()->NumHandshakeMessagesWithServerNonces()); | |
326 } | |
327 | |
328 TEST_P(QuicCryptoServerStreamTest, NoStatelessRejectIfNoClientSupport) { | |
329 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stateless_reject_support, | |
330 true); | |
331 Initialize(); | |
332 | |
333 // The server is configured to use stateless rejects, but the client does not | |
334 // support it. | |
335 InitializeFakeClient(/* supports_stateless_rejects= */ false); | |
336 AdvanceHandshakeWithFakeClient(); | |
337 | |
338 // Check the server to make the sure the handshake did not succeed. | |
339 EXPECT_FALSE(server_stream()->encryption_established()); | |
340 EXPECT_FALSE(server_stream()->handshake_confirmed()); | |
341 | |
342 // Check the client state to make sure that it did not receive a | |
343 // server-designated connection id. | |
344 QuicCryptoClientConfig::CachedState* client_state = | |
345 client_crypto_config_.LookupOrCreate(server_id_); | |
346 | |
347 ASSERT_FALSE(client_state->has_server_designated_connection_id()); | |
348 ASSERT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0))); | |
349 } | |
350 | |
351 TEST_P(QuicCryptoServerStreamTest, ZeroRTT) { | |
352 Initialize(); | |
353 InitializeFakeClient(/* supports_stateless_rejects= */ false); | |
354 | |
355 // Do a first handshake in order to prime the client config with the server's | |
356 // information. | |
357 AdvanceHandshakeWithFakeClient(); | |
358 | |
359 // Now do another handshake, hopefully in 0-RTT. | |
360 DVLOG(1) << "Resetting for 0-RTT handshake attempt"; | |
361 InitializeFakeClient(/* supports_stateless_rejects= */ false); | |
362 InitializeServer(); | |
363 | |
364 client_stream()->CryptoConnect(); | |
365 | |
366 if (AsyncStrikeRegisterVerification()) { | |
367 EXPECT_FALSE(client_stream()->handshake_confirmed()); | |
368 EXPECT_FALSE(server_stream()->handshake_confirmed()); | |
369 | |
370 // Advance the handshake. Expect that the server will be stuck waiting for | |
371 // client nonce verification to complete. | |
372 pair<size_t, size_t> messages_moved = CryptoTestUtils::AdvanceHandshake( | |
373 client_connection_, client_stream(), 0, server_connection_, | |
374 server_stream(), 0); | |
375 EXPECT_EQ(1u, messages_moved.first); | |
376 EXPECT_EQ(0u, messages_moved.second); | |
377 EXPECT_EQ(1, strike_register_client_->PendingVerifications()); | |
378 EXPECT_FALSE(client_stream()->handshake_confirmed()); | |
379 EXPECT_FALSE(server_stream()->handshake_confirmed()); | |
380 | |
381 // The server handshake completes once the nonce verification completes. | |
382 strike_register_client_->RunPendingVerifications(); | |
383 EXPECT_FALSE(client_stream()->handshake_confirmed()); | |
384 EXPECT_TRUE(server_stream()->handshake_confirmed()); | |
385 | |
386 messages_moved = CryptoTestUtils::AdvanceHandshake( | |
387 client_connection_, client_stream(), messages_moved.first, | |
388 server_connection_, server_stream(), messages_moved.second); | |
389 EXPECT_EQ(1u, messages_moved.first); | |
390 EXPECT_EQ(1u, messages_moved.second); | |
391 EXPECT_TRUE(client_stream()->handshake_confirmed()); | |
392 EXPECT_TRUE(server_stream()->handshake_confirmed()); | |
393 } else { | |
394 CryptoTestUtils::CommunicateHandshakeMessages( | |
395 client_connection_, client_stream(), server_connection_, | |
396 server_stream()); | |
397 } | |
398 | |
399 EXPECT_EQ(1, client_stream()->num_sent_client_hellos()); | |
400 } | |
401 | |
402 TEST_P(QuicCryptoServerStreamTest, FailByPolicy) { | |
403 FLAGS_quic_deprecate_kfixd = true; | |
404 Initialize(); | |
405 InitializeFakeClient(/* supports_stateless_rejects= */ false); | |
406 | |
407 EXPECT_CALL(*server_session_->helper(), CanAcceptClientHello(_, _, _)) | |
408 .WillOnce(testing::Return(false)); | |
409 EXPECT_CALL(*server_connection_, | |
410 CloseConnection(QUIC_HANDSHAKE_FAILED, _, _)); | |
411 | |
412 AdvanceHandshakeWithFakeClient(); | |
413 } | |
414 | |
415 TEST_P(QuicCryptoServerStreamTest, MessageAfterHandshake) { | |
416 FLAGS_quic_deprecate_kfixd = true; | |
417 Initialize(); | |
418 CompleteCryptoHandshake(); | |
419 EXPECT_CALL( | |
420 *server_connection_, | |
421 CloseConnection(QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE, _, _)); | |
422 message_.set_tag(kCHLO); | |
423 ConstructHandshakeMessage(); | |
424 server_stream()->OnStreamFrame( | |
425 QuicStreamFrame(kCryptoStreamId, /*fin=*/false, /*offset=*/0, | |
426 message_data_->AsStringPiece())); | |
427 } | |
428 | |
429 TEST_P(QuicCryptoServerStreamTest, BadMessageType) { | |
430 FLAGS_quic_deprecate_kfixd = true; | |
431 Initialize(); | |
432 | |
433 message_.set_tag(kSHLO); | |
434 ConstructHandshakeMessage(); | |
435 EXPECT_CALL(*server_connection_, | |
436 CloseConnection(QUIC_INVALID_CRYPTO_MESSAGE_TYPE, _, _)); | |
437 server_stream()->OnStreamFrame( | |
438 QuicStreamFrame(kCryptoStreamId, /*fin=*/false, /*offset=*/0, | |
439 message_data_->AsStringPiece())); | |
440 } | |
441 | |
442 TEST_P(QuicCryptoServerStreamTest, ChannelID) { | |
443 Initialize(); | |
444 | |
445 client_options_.channel_id_enabled = true; | |
446 client_options_.channel_id_source_async = false; | |
447 // CompleteCryptoHandshake verifies | |
448 // server_stream()->crypto_negotiated_params().channel_id is correct. | |
449 EXPECT_EQ(2, CompleteCryptoHandshake()); | |
450 EXPECT_TRUE(server_stream()->encryption_established()); | |
451 EXPECT_TRUE(server_stream()->handshake_confirmed()); | |
452 } | |
453 | |
454 TEST_P(QuicCryptoServerStreamTest, ChannelIDAsync) { | |
455 Initialize(); | |
456 | |
457 client_options_.channel_id_enabled = true; | |
458 client_options_.channel_id_source_async = true; | |
459 // CompleteCryptoHandshake verifies | |
460 // server_stream()->crypto_negotiated_params().channel_id is correct. | |
461 EXPECT_EQ(2, CompleteCryptoHandshake()); | |
462 EXPECT_TRUE(server_stream()->encryption_established()); | |
463 EXPECT_TRUE(server_stream()->handshake_confirmed()); | |
464 } | |
465 | |
466 TEST_P(QuicCryptoServerStreamTest, OnlySendSCUPAfterHandshakeComplete) { | |
467 // An attempt to send a SCUP before completing handshake should fail. | |
468 Initialize(); | |
469 | |
470 server_stream()->SendServerConfigUpdate(nullptr); | |
471 EXPECT_EQ(0, server_stream()->NumServerConfigUpdateMessagesSent()); | |
472 } | |
473 | |
474 TEST_P(QuicCryptoServerStreamTest, SendSCUPAfterHandshakeComplete) { | |
475 Initialize(); | |
476 | |
477 InitializeFakeClient(/* supports_stateless_rejects= */ false); | |
478 | |
479 // Do a first handshake in order to prime the client config with the server's | |
480 // information. | |
481 AdvanceHandshakeWithFakeClient(); | |
482 | |
483 // Now do another handshake, with the blocking SHLO connection option. | |
484 InitializeServer(); | |
485 InitializeFakeClient(/* supports_stateless_rejects= */ false); | |
486 AdvanceHandshakeWithFakeClient(); | |
487 | |
488 // Send a SCUP message and ensure that the client was able to verify it. | |
489 EXPECT_CALL(*client_connection_, CloseConnection(_, _, _)).Times(0); | |
490 server_stream()->SendServerConfigUpdate(nullptr); | |
491 CryptoTestUtils::AdvanceHandshake(client_connection_, client_stream(), 1, | |
492 server_connection_, server_stream(), 1); | |
493 | |
494 EXPECT_EQ(1, server_stream()->NumServerConfigUpdateMessagesSent()); | |
495 EXPECT_EQ(1, client_stream()->num_scup_messages_received()); | |
496 } | |
497 | |
498 TEST_P(QuicCryptoServerStreamTest, DoesPeerSupportStatelessRejects) { | |
499 Initialize(); | |
500 | |
501 ConstructHandshakeMessage(); | |
502 QuicConfig stateless_reject_config = DefaultQuicConfigStatelessRejects(); | |
503 stateless_reject_config.ToHandshakeMessage(&message_); | |
504 EXPECT_TRUE( | |
505 QuicCryptoServerStreamPeer::DoesPeerSupportStatelessRejects(message_)); | |
506 | |
507 message_.Clear(); | |
508 QuicConfig stateful_reject_config = DefaultQuicConfig(); | |
509 stateful_reject_config.ToHandshakeMessage(&message_); | |
510 EXPECT_FALSE( | |
511 QuicCryptoServerStreamPeer::DoesPeerSupportStatelessRejects(message_)); | |
512 } | |
513 | |
514 TEST_P(QuicCryptoServerStreamTest, TokenBindingNegotiated) { | |
515 Initialize(); | |
516 | |
517 client_options_.token_binding_enabled = true; | |
518 CompleteCryptoHandshake(); | |
519 EXPECT_EQ( | |
520 kP256, | |
521 server_stream()->crypto_negotiated_params().token_binding_key_param); | |
522 EXPECT_TRUE(server_stream()->encryption_established()); | |
523 EXPECT_TRUE(server_stream()->handshake_confirmed()); | |
524 } | |
525 | |
526 TEST_P(QuicCryptoServerStreamTest, NoTokenBindingWithoutClientSupport) { | |
527 Initialize(); | |
528 | |
529 CompleteCryptoHandshake(); | |
530 EXPECT_EQ( | |
531 0u, server_stream()->crypto_negotiated_params().token_binding_key_param); | |
532 EXPECT_TRUE(server_stream()->encryption_established()); | |
533 EXPECT_TRUE(server_stream()->handshake_confirmed()); | |
534 } | |
535 | |
536 TEST_P(QuicCryptoServerStreamTest, CancelRPCBeforeVerificationCompletes) { | |
537 FLAGS_quic_require_handshake_confirmation_pre33 = false; | |
538 // Tests that the client can close the connection while the remote strike | |
539 // register verification RPC is still pending. | |
540 | |
541 // Set version to QUIC_VERSION_32 as QUIC_VERSION_33 and later don't support | |
542 // asynchronous strike register RPCs. | |
543 supported_versions_ = {QUIC_VERSION_32}; | |
544 Initialize(); | |
545 if (!AsyncStrikeRegisterVerification()) { | |
546 return; | |
547 } | |
548 InitializeFakeClient(/* supports_stateless_rejects= */ false); | |
549 | |
550 // Do a first handshake in order to prime the client config with the server's | |
551 // information. | |
552 AdvanceHandshakeWithFakeClient(); | |
553 | |
554 // Now start another handshake, this time the server will attempt to verify | |
555 // the client's nonce with the strike registers. | |
556 InitializeFakeClient(/* supports_stateless_rejects= */ false); | |
557 InitializeServer(); | |
558 client_stream()->CryptoConnect(); | |
559 EXPECT_FALSE(client_stream()->handshake_confirmed()); | |
560 EXPECT_FALSE(server_stream()->handshake_confirmed()); | |
561 | |
562 // Advance the handshake. Expect that the server will be stuck waiting for | |
563 // client nonce verification to complete. | |
564 CryptoTestUtils::AdvanceHandshake(client_connection_, client_stream(), 0, | |
565 server_connection_, server_stream(), 0); | |
566 EXPECT_EQ(1, strike_register_client_->PendingVerifications()); | |
567 EXPECT_FALSE(client_stream()->handshake_confirmed()); | |
568 EXPECT_FALSE(server_stream()->handshake_confirmed()); | |
569 | |
570 // While waiting for the asynchronous verification to complete, the client | |
571 // decides to close the connection. | |
572 server_session_->connection()->CloseConnection( | |
573 QUIC_NO_ERROR, "", ConnectionCloseBehavior::SILENT_CLOSE); | |
574 | |
575 // The outstanding nonce verification RPC now completes. | |
576 strike_register_client_->RunPendingVerifications(); | |
577 } | |
578 | |
579 } // namespace | |
580 | |
581 } // namespace test | |
582 } // namespace net | |
OLD | NEW |