| 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 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 // called multiple times. | 98 // called multiple times. |
| 99 void InitializeServer() { | 99 void InitializeServer() { |
| 100 TestQuicSpdyServerSession* server_session = nullptr; | 100 TestQuicSpdyServerSession* server_session = nullptr; |
| 101 helpers_.push_back(new MockConnectionHelper); | 101 helpers_.push_back(new MockConnectionHelper); |
| 102 | 102 |
| 103 CreateServerSessionForTest(server_id_, QuicTime::Delta::FromSeconds(100000), | 103 CreateServerSessionForTest(server_id_, QuicTime::Delta::FromSeconds(100000), |
| 104 helpers_.back(), &server_crypto_config_, | 104 helpers_.back(), &server_crypto_config_, |
| 105 &server_connection_, &server_session); | 105 &server_connection_, &server_session); |
| 106 CHECK(server_session); | 106 CHECK(server_session); |
| 107 server_session_.reset(server_session); | 107 server_session_.reset(server_session); |
| 108 CryptoTestUtils::FakeServerOptions options; |
| 109 options.token_binding_enabled = true; |
| 108 CryptoTestUtils::SetupCryptoServerConfigForTest( | 110 CryptoTestUtils::SetupCryptoServerConfigForTest( |
| 109 server_connection_->clock(), server_connection_->random_generator(), | 111 server_connection_->clock(), server_connection_->random_generator(), |
| 110 server_session_->config(), &server_crypto_config_); | 112 server_session_->config(), &server_crypto_config_, options); |
| 111 } | 113 } |
| 112 | 114 |
| 113 QuicCryptoServerStream* server_stream() { | 115 QuicCryptoServerStream* server_stream() { |
| 114 return server_session_->GetCryptoStream(); | 116 return server_session_->GetCryptoStream(); |
| 115 } | 117 } |
| 116 | 118 |
| 117 QuicCryptoClientStream* client_stream() { | 119 QuicCryptoClientStream* client_stream() { |
| 118 return client_session_->GetCryptoStream(); | 120 return client_session_->GetCryptoStream(); |
| 119 } | 121 } |
| 120 | 122 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 }; | 189 }; |
| 188 | 190 |
| 189 INSTANTIATE_TEST_CASE_P(Tests, QuicCryptoServerStreamTest, testing::Bool()); | 191 INSTANTIATE_TEST_CASE_P(Tests, QuicCryptoServerStreamTest, testing::Bool()); |
| 190 | 192 |
| 191 TEST_P(QuicCryptoServerStreamTest, NotInitiallyConected) { | 193 TEST_P(QuicCryptoServerStreamTest, NotInitiallyConected) { |
| 192 EXPECT_FALSE(server_stream()->encryption_established()); | 194 EXPECT_FALSE(server_stream()->encryption_established()); |
| 193 EXPECT_FALSE(server_stream()->handshake_confirmed()); | 195 EXPECT_FALSE(server_stream()->handshake_confirmed()); |
| 194 } | 196 } |
| 195 | 197 |
| 196 TEST_P(QuicCryptoServerStreamTest, NotInitiallySendingStatelessRejects) { | 198 TEST_P(QuicCryptoServerStreamTest, NotInitiallySendingStatelessRejects) { |
| 197 EXPECT_FALSE(server_stream()->use_stateless_rejects_if_peer_supported()); | 199 EXPECT_FALSE(server_stream()->UseStatelessRejectsIfPeerSupported()); |
| 198 EXPECT_FALSE(server_stream()->peer_supports_stateless_rejects()); | 200 EXPECT_FALSE(server_stream()->PeerSupportsStatelessRejects()); |
| 199 } | 201 } |
| 200 | 202 |
| 201 TEST_P(QuicCryptoServerStreamTest, ConnectedAfterCHLO) { | 203 TEST_P(QuicCryptoServerStreamTest, ConnectedAfterCHLO) { |
| 202 // CompleteCryptoHandshake returns the number of client hellos sent. This | 204 // CompleteCryptoHandshake returns the number of client hellos sent. This |
| 203 // test should send: | 205 // test should send: |
| 204 // * One to get a source-address token and certificates. | 206 // * One to get a source-address token and certificates. |
| 205 // * One to complete the handshake. | 207 // * One to complete the handshake. |
| 206 EXPECT_EQ(2, CompleteCryptoHandshake()); | 208 EXPECT_EQ(2, CompleteCryptoHandshake()); |
| 207 EXPECT_TRUE(server_stream()->encryption_established()); | 209 EXPECT_TRUE(server_stream()->encryption_established()); |
| 208 EXPECT_TRUE(server_stream()->handshake_confirmed()); | 210 EXPECT_TRUE(server_stream()->handshake_confirmed()); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stateless_reject_support, | 246 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stateless_reject_support, |
| 245 true); | 247 true); |
| 246 InitializeServer(); | 248 InitializeServer(); |
| 247 | 249 |
| 248 InitializeFakeClient(/* supports_stateless_rejects= */ true); | 250 InitializeFakeClient(/* supports_stateless_rejects= */ true); |
| 249 AdvanceHandshakeWithFakeClient(); | 251 AdvanceHandshakeWithFakeClient(); |
| 250 | 252 |
| 251 // On the first round, encryption will not be established. | 253 // On the first round, encryption will not be established. |
| 252 EXPECT_FALSE(server_stream()->encryption_established()); | 254 EXPECT_FALSE(server_stream()->encryption_established()); |
| 253 EXPECT_FALSE(server_stream()->handshake_confirmed()); | 255 EXPECT_FALSE(server_stream()->handshake_confirmed()); |
| 254 EXPECT_EQ(1, server_stream()->num_handshake_messages()); | 256 EXPECT_EQ(1, server_stream()->NumHandshakeMessages()); |
| 255 EXPECT_EQ(0, server_stream()->num_handshake_messages_with_server_nonces()); | 257 EXPECT_EQ(0, server_stream()->NumHandshakeMessagesWithServerNonces()); |
| 256 | 258 |
| 257 // Now check the client state. | 259 // Now check the client state. |
| 258 QuicCryptoClientConfig::CachedState* client_state = | 260 QuicCryptoClientConfig::CachedState* client_state = |
| 259 client_crypto_config_.LookupOrCreate(server_id_); | 261 client_crypto_config_.LookupOrCreate(server_id_); |
| 260 | 262 |
| 261 ASSERT_TRUE(client_state->has_server_designated_connection_id()); | 263 ASSERT_TRUE(client_state->has_server_designated_connection_id()); |
| 262 const QuicConnectionId server_designated_connection_id = | 264 const QuicConnectionId server_designated_connection_id = |
| 263 client_state->GetNextServerDesignatedConnectionId(); | 265 client_state->GetNextServerDesignatedConnectionId(); |
| 264 const QuicConnectionId expected_id = | 266 const QuicConnectionId expected_id = |
| 265 server_connection_->random_generator()->RandUint64(); | 267 server_connection_->random_generator()->RandUint64(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 276 client_stream()->CryptoConnect(); | 278 client_stream()->CryptoConnect(); |
| 277 | 279 |
| 278 // In the stateless case, the second handshake contains a server-nonce, so the | 280 // In the stateless case, the second handshake contains a server-nonce, so the |
| 279 // AsyncStrikeRegisterVerification() case will still succeed (unlike a 0-RTT | 281 // AsyncStrikeRegisterVerification() case will still succeed (unlike a 0-RTT |
| 280 // handshake). | 282 // handshake). |
| 281 AdvanceHandshakeWithFakeClient(); | 283 AdvanceHandshakeWithFakeClient(); |
| 282 | 284 |
| 283 // On the second round, encryption will be established. | 285 // On the second round, encryption will be established. |
| 284 EXPECT_TRUE(server_stream()->encryption_established()); | 286 EXPECT_TRUE(server_stream()->encryption_established()); |
| 285 EXPECT_TRUE(server_stream()->handshake_confirmed()); | 287 EXPECT_TRUE(server_stream()->handshake_confirmed()); |
| 286 EXPECT_EQ(2, server_stream()->num_handshake_messages()); | 288 EXPECT_EQ(2, server_stream()->NumHandshakeMessages()); |
| 287 EXPECT_EQ(1, server_stream()->num_handshake_messages_with_server_nonces()); | 289 EXPECT_EQ(1, server_stream()->NumHandshakeMessagesWithServerNonces()); |
| 288 } | 290 } |
| 289 | 291 |
| 290 TEST_P(QuicCryptoServerStreamTest, NoStatelessRejectIfNoClientSupport) { | 292 TEST_P(QuicCryptoServerStreamTest, NoStatelessRejectIfNoClientSupport) { |
| 291 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stateless_reject_support, | 293 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stateless_reject_support, |
| 292 true); | 294 true); |
| 293 InitializeServer(); | 295 InitializeServer(); |
| 294 | 296 |
| 295 // The server is configured to use stateless rejects, but the client does not | 297 // The server is configured to use stateless rejects, but the client does not |
| 296 // support it. | 298 // support it. |
| 297 InitializeFakeClient(/* supports_stateless_rejects= */ false); | 299 InitializeFakeClient(/* supports_stateless_rejects= */ false); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 398 // CompleteCryptoHandshake verifies | 400 // CompleteCryptoHandshake verifies |
| 399 // server_stream()->crypto_negotiated_params().channel_id is correct. | 401 // server_stream()->crypto_negotiated_params().channel_id is correct. |
| 400 EXPECT_EQ(2, CompleteCryptoHandshake()); | 402 EXPECT_EQ(2, CompleteCryptoHandshake()); |
| 401 EXPECT_TRUE(server_stream()->encryption_established()); | 403 EXPECT_TRUE(server_stream()->encryption_established()); |
| 402 EXPECT_TRUE(server_stream()->handshake_confirmed()); | 404 EXPECT_TRUE(server_stream()->handshake_confirmed()); |
| 403 } | 405 } |
| 404 | 406 |
| 405 TEST_P(QuicCryptoServerStreamTest, OnlySendSCUPAfterHandshakeComplete) { | 407 TEST_P(QuicCryptoServerStreamTest, OnlySendSCUPAfterHandshakeComplete) { |
| 406 // An attempt to send a SCUP before completing handshake should fail. | 408 // An attempt to send a SCUP before completing handshake should fail. |
| 407 server_stream()->SendServerConfigUpdate(nullptr); | 409 server_stream()->SendServerConfigUpdate(nullptr); |
| 408 EXPECT_EQ(0, server_stream()->num_server_config_update_messages_sent()); | 410 EXPECT_EQ(0, server_stream()->NumServerConfigUpdateMessagesSent()); |
| 409 } | 411 } |
| 410 | 412 |
| 411 TEST_P(QuicCryptoServerStreamTest, DoesPeerSupportStatelessRejects) { | 413 TEST_P(QuicCryptoServerStreamTest, DoesPeerSupportStatelessRejects) { |
| 412 ConstructHandshakeMessage(); | 414 ConstructHandshakeMessage(); |
| 413 QuicConfig stateless_reject_config = DefaultQuicConfigStatelessRejects(); | 415 QuicConfig stateless_reject_config = DefaultQuicConfigStatelessRejects(); |
| 414 stateless_reject_config.ToHandshakeMessage(&message_); | 416 stateless_reject_config.ToHandshakeMessage(&message_); |
| 415 EXPECT_TRUE( | 417 EXPECT_TRUE( |
| 416 QuicCryptoServerStreamPeer::DoesPeerSupportStatelessRejects(message_)); | 418 QuicCryptoServerStreamPeer::DoesPeerSupportStatelessRejects(message_)); |
| 417 | 419 |
| 418 message_.Clear(); | 420 message_.Clear(); |
| 419 QuicConfig stateful_reject_config = DefaultQuicConfig(); | 421 QuicConfig stateful_reject_config = DefaultQuicConfig(); |
| 420 stateful_reject_config.ToHandshakeMessage(&message_); | 422 stateful_reject_config.ToHandshakeMessage(&message_); |
| 421 EXPECT_FALSE( | 423 EXPECT_FALSE( |
| 422 QuicCryptoServerStreamPeer::DoesPeerSupportStatelessRejects(message_)); | 424 QuicCryptoServerStreamPeer::DoesPeerSupportStatelessRejects(message_)); |
| 423 } | 425 } |
| 424 | 426 |
| 427 TEST_P(QuicCryptoServerStreamTest, TokenBindingNegotiated) { |
| 428 client_options_.token_binding_enabled = true; |
| 429 CompleteCryptoHandshake(); |
| 430 EXPECT_EQ( |
| 431 kP256, |
| 432 server_stream()->crypto_negotiated_params().token_binding_key_param); |
| 433 EXPECT_TRUE(server_stream()->encryption_established()); |
| 434 EXPECT_TRUE(server_stream()->handshake_confirmed()); |
| 435 } |
| 436 |
| 437 TEST_P(QuicCryptoServerStreamTest, NoTokenBindingWithoutClientSupport) { |
| 438 CompleteCryptoHandshake(); |
| 439 EXPECT_EQ( |
| 440 0u, server_stream()->crypto_negotiated_params().token_binding_key_param); |
| 441 EXPECT_TRUE(server_stream()->encryption_established()); |
| 442 EXPECT_TRUE(server_stream()->handshake_confirmed()); |
| 443 } |
| 444 |
| 425 } // namespace | 445 } // namespace |
| 426 | 446 |
| 427 } // namespace test | 447 } // namespace test |
| 428 } // namespace net | 448 } // namespace net |
| OLD | NEW |