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 |