blob: a5bf5538bfa50a2e2295031e59aa71efb8ebfe07 [file] [log] [blame]
[email protected]72818ea2013-03-13 03:23:571// 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 <vector>
9
10#include "base/memory/scoped_ptr.h"
rtenneti8a4a0732015-10-18 00:45:5111#include "base/stl_util.h"
[email protected]0bbeb6972013-05-23 04:10:2112#include "net/quic/crypto/aes_128_gcm_12_encrypter.h"
[email protected]72818ea2013-03-13 03:23:5713#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"
[email protected]8e01c062013-10-31 07:35:3117#include "net/quic/crypto/quic_crypto_server_config.h"
[email protected]72818ea2013-03-13 03:23:5718#include "net/quic/crypto/quic_decrypter.h"
19#include "net/quic/crypto/quic_encrypter.h"
[email protected]b064310782013-05-30 21:12:1720#include "net/quic/crypto/quic_random.h"
[email protected]fe053f92013-04-23 20:18:5521#include "net/quic/quic_crypto_client_stream.h"
rtennetia2ea9162015-05-15 19:26:4422#include "net/quic/quic_flags.h"
[email protected]72818ea2013-03-13 03:23:5723#include "net/quic/quic_protocol.h"
24#include "net/quic/quic_session.h"
25#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]691f45a982013-11-19 10:52:0426#include "net/quic/test_tools/delayed_verify_strike_register_client.h"
[email protected]72818ea2013-03-13 03:23:5727#include "net/quic/test_tools/quic_test_utils.h"
28#include "testing/gmock/include/gmock/gmock.h"
29#include "testing/gtest/include/gtest/gtest.h"
30
31namespace net {
32class QuicConnection;
33class ReliableQuicStream;
34} // namespace net
35
[email protected]691f45a982013-11-19 10:52:0436using std::pair;
halton.huoe4e45742014-12-08 07:55:4637using std::string;
[email protected]72818ea2013-03-13 03:23:5738using testing::_;
39
40namespace net {
41namespace test {
[email protected]691f45a982013-11-19 10:52:0442
[email protected]691f45a982013-11-19 10:52:0443class QuicCryptoServerConfigPeer {
44 public:
45 static string GetPrimaryOrbit(const QuicCryptoServerConfig& config) {
46 base::AutoLock lock(config.configs_lock_);
rtennetibe635732014-10-02 22:51:4247 CHECK(config.primary_config_.get() != nullptr);
[email protected]691f45a982013-11-19 10:52:0448 return string(reinterpret_cast<const char*>(config.primary_config_->orbit),
49 kOrbitSize);
50 }
51};
52
rtennetia2ea9162015-05-15 19:26:4453class QuicCryptoServerStreamPeer {
54 public:
55 static bool DoesPeerSupportStatelessRejects(
56 const CryptoHandshakeMessage& message) {
57 return net::QuicCryptoServerStream::DoesPeerSupportStatelessRejects(
58 message);
59 }
60};
61
[email protected]72818ea2013-03-13 03:23:5762namespace {
63
[email protected]e4c3ea62014-03-15 00:45:1464const char kServerHostname[] = "test.example.com";
zhongyic92bc492015-09-22 19:14:3665const uint16 kServerPort = 443;
[email protected]e4c3ea62014-03-15 00:45:1466
[email protected]5d03bbd2014-03-07 16:19:1667class QuicCryptoServerStreamTest : public ::testing::TestWithParam<bool> {
[email protected]72818ea2013-03-13 03:23:5768 public:
69 QuicCryptoServerStreamTest()
rtennetia2ea9162015-05-15 19:26:4470 : server_crypto_config_(QuicCryptoServerConfig::TESTING,
rch1fe2eeb2015-10-26 14:45:5771 QuicRandom::GetInstance(),
72 CryptoTestUtils::ProofSourceForTesting()),
73 server_id_(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED),
74 client_crypto_config_(CryptoTestUtils::ProofVerifierForTesting()) {
rch99b644c2015-11-04 05:25:2875 FLAGS_enable_quic_stateless_reject_support = false;
rtennetia2ea9162015-05-15 19:26:4476 server_crypto_config_.set_strike_register_no_startup_period();
[email protected]fe053f92013-04-23 20:18:5577
rtennetia2ea9162015-05-15 19:26:4478 InitializeServer();
[email protected]691f45a982013-11-19 10:52:0479
80 if (AsyncStrikeRegisterVerification()) {
81 string orbit =
rtennetia2ea9162015-05-15 19:26:4482 QuicCryptoServerConfigPeer::GetPrimaryOrbit(server_crypto_config_);
[email protected]691f45a982013-11-19 10:52:0483 strike_register_client_ = new DelayedVerifyStrikeRegisterClient(
84 10000, // strike_register_max_entries
rtennetia2ea9162015-05-15 19:26:4485 static_cast<uint32>(
86 server_connection_->clock()->WallNow().ToUNIXSeconds()),
[email protected]691f45a982013-11-19 10:52:0487 60, // strike_register_window_secs
rtennetia2ea9162015-05-15 19:26:4488 reinterpret_cast<const uint8*>(orbit.data()),
[email protected]691f45a982013-11-19 10:52:0489 StrikeRegister::NO_STARTUP_PERIOD_NEEDED);
90 strike_register_client_->StartDelayingVerification();
rtennetia2ea9162015-05-15 19:26:4491 server_crypto_config_.SetStrikeRegisterClient(strike_register_client_);
[email protected]691f45a982013-11-19 10:52:0492 }
93 }
94
rtenneti8a4a0732015-10-18 00:45:5195 ~QuicCryptoServerStreamTest() override { STLDeleteElements(&helpers_); }
96
rtennetia2ea9162015-05-15 19:26:4497 // Initializes the crypto server stream state for testing. May be
98 // called multiple times.
99 void InitializeServer() {
rtennetib865eb82015-06-17 20:21:46100 TestQuicSpdyServerSession* server_session = nullptr;
rch99b644c2015-11-04 05:25:28101 helpers_.push_back(new MockConnectionHelper);
102
rtennetid39bd762015-06-12 01:05:52103 CreateServerSessionForTest(server_id_, QuicTime::Delta::FromSeconds(100000),
rtenneti8a4a0732015-10-18 00:45:51104 helpers_.back(), &server_crypto_config_,
105 &server_connection_, &server_session);
rtennetia2ea9162015-05-15 19:26:44106 CHECK(server_session);
rtennetia2ea9162015-05-15 19:26:44107 server_session_.reset(server_session);
rjshadec86dbfa2015-11-12 20:16:25108 CryptoTestUtils::FakeServerOptions options;
109 options.token_binding_enabled = true;
rtennetia2ea9162015-05-15 19:26:44110 CryptoTestUtils::SetupCryptoServerConfigForTest(
111 server_connection_->clock(), server_connection_->random_generator(),
rjshadec86dbfa2015-11-12 20:16:25112 server_session_->config(), &server_crypto_config_, options);
rtennetia2ea9162015-05-15 19:26:44113 }
114
rtennetid39bd762015-06-12 01:05:52115 QuicCryptoServerStream* server_stream() {
116 return server_session_->GetCryptoStream();
117 }
118
119 QuicCryptoClientStream* client_stream() {
120 return client_session_->GetCryptoStream();
121 }
122
rtennetia2ea9162015-05-15 19:26:44123 // Initializes a fake client, and all its associated state, for
124 // testing. May be called multiple times.
125 void InitializeFakeClient(bool supports_stateless_rejects) {
rtennetib865eb82015-06-17 20:21:46126 TestQuicSpdyClientSession* client_session = nullptr;
rch99b644c2015-11-04 05:25:28127 helpers_.push_back(new MockConnectionHelper);
rtennetid39bd762015-06-12 01:05:52128 CreateClientSessionForTest(server_id_, supports_stateless_rejects,
129 QuicTime::Delta::FromSeconds(100000),
rtenneti8a4a0732015-10-18 00:45:51130 helpers_.back(), &client_crypto_config_,
131 &client_connection_, &client_session);
rtennetia2ea9162015-05-15 19:26:44132 CHECK(client_session);
rtennetia2ea9162015-05-15 19:26:44133 client_session_.reset(client_session);
rtennetia2ea9162015-05-15 19:26:44134 }
135
[email protected]691f45a982013-11-19 10:52:04136 bool AsyncStrikeRegisterVerification() {
rtenneti5ca6eee2015-10-15 21:54:30137 if (server_connection_->version() > QUIC_VERSION_26) {
138 return false;
139 }
[email protected]691f45a982013-11-19 10:52:04140 return GetParam();
[email protected]72818ea2013-03-13 03:23:57141 }
142
143 void ConstructHandshakeMessage() {
144 CryptoFramer framer;
145 message_data_.reset(framer.ConstructHandshakeMessage(message_));
146 }
147
[email protected]fe053f92013-04-23 20:18:55148 int CompleteCryptoHandshake() {
rtennetia2ea9162015-05-15 19:26:44149 CHECK(server_connection_);
rtennetid39bd762015-06-12 01:05:52150 CHECK(server_session_ != nullptr);
rtennetia2ea9162015-05-15 19:26:44151 return CryptoTestUtils::HandshakeWithFakeClient(
rtenneti8a4a0732015-10-18 00:45:51152 helpers_.back(), server_connection_, server_stream(), server_id_,
153 client_options_);
rtennetia2ea9162015-05-15 19:26:44154 }
155
156 // Performs a single round of handshake message-exchange between the
157 // client and server.
158 void AdvanceHandshakeWithFakeClient() {
159 CHECK(server_connection_);
rtennetia2ea9162015-05-15 19:26:44160 CHECK(client_session_ != nullptr);
rtennetia2ea9162015-05-15 19:26:44161
162 EXPECT_CALL(*client_session_, OnProofValid(_)).Times(testing::AnyNumber());
rtennetid39bd762015-06-12 01:05:52163 client_stream()->CryptoConnect();
164 CryptoTestUtils::AdvanceHandshake(client_connection_, client_stream(), 0,
165 server_connection_, server_stream(), 0);
[email protected]72818ea2013-03-13 03:23:57166 }
167
168 protected:
rch99b644c2015-11-04 05:25:28169 // Every connection gets its own MockConnectionHelper, tracked separately
170 // from the server and client state so their lifetimes persist through the
171 // whole test.
172 std::vector<MockConnectionHelper*> helpers_;
rtenneti8a4a0732015-10-18 00:45:51173
rtennetia2ea9162015-05-15 19:26:44174 // Server state
175 PacketSavingConnection* server_connection_;
rtennetib865eb82015-06-17 20:21:46176 scoped_ptr<TestQuicSpdyServerSession> server_session_;
rtennetia2ea9162015-05-15 19:26:44177 QuicCryptoServerConfig server_crypto_config_;
rtennetia2ea9162015-05-15 19:26:44178 QuicServerId server_id_;
179
180 // Client state
181 PacketSavingConnection* client_connection_;
182 QuicCryptoClientConfig client_crypto_config_;
rtennetib865eb82015-06-17 20:21:46183 scoped_ptr<TestQuicSpdyClientSession> client_session_;
rtennetia2ea9162015-05-15 19:26:44184
[email protected]72818ea2013-03-13 03:23:57185 CryptoHandshakeMessage message_;
186 scoped_ptr<QuicData> message_data_;
[email protected]899951652013-05-16 12:52:39187 CryptoTestUtils::FakeClientOptions client_options_;
[email protected]691f45a982013-11-19 10:52:04188 DelayedVerifyStrikeRegisterClient* strike_register_client_;
[email protected]72818ea2013-03-13 03:23:57189};
190
[email protected]691f45a982013-11-19 10:52:04191INSTANTIATE_TEST_CASE_P(Tests, QuicCryptoServerStreamTest, testing::Bool());
192
193TEST_P(QuicCryptoServerStreamTest, NotInitiallyConected) {
rtennetid39bd762015-06-12 01:05:52194 EXPECT_FALSE(server_stream()->encryption_established());
195 EXPECT_FALSE(server_stream()->handshake_confirmed());
rtennetia2ea9162015-05-15 19:26:44196}
197
198TEST_P(QuicCryptoServerStreamTest, NotInitiallySendingStatelessRejects) {
rjshadec86dbfa2015-11-12 20:16:25199 EXPECT_FALSE(server_stream()->UseStatelessRejectsIfPeerSupported());
200 EXPECT_FALSE(server_stream()->PeerSupportsStatelessRejects());
[email protected]72818ea2013-03-13 03:23:57201}
202
[email protected]691f45a982013-11-19 10:52:04203TEST_P(QuicCryptoServerStreamTest, ConnectedAfterCHLO) {
[email protected]a57e0272013-04-26 07:31:47204 // CompleteCryptoHandshake returns the number of client hellos sent. This
205 // test should send:
[email protected]48878092013-07-26 14:51:56206 // * One to get a source-address token and certificates.
[email protected]a57e0272013-04-26 07:31:47207 // * One to complete the handshake.
[email protected]fe053f92013-04-23 20:18:55208 EXPECT_EQ(2, CompleteCryptoHandshake());
rtennetid39bd762015-06-12 01:05:52209 EXPECT_TRUE(server_stream()->encryption_established());
210 EXPECT_TRUE(server_stream()->handshake_confirmed());
[email protected]72818ea2013-03-13 03:23:57211}
212
rtennetia2ea9162015-05-15 19:26:44213TEST_P(QuicCryptoServerStreamTest, StatelessRejectAfterCHLO) {
214 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stateless_reject_support,
215 true);
rch99b644c2015-11-04 05:25:28216 InitializeServer();
[email protected]fe053f92013-04-23 20:18:55217
rtennetia2ea9162015-05-15 19:26:44218 InitializeFakeClient(/* supports_stateless_rejects= */ true);
219 AdvanceHandshakeWithFakeClient();
[email protected]fe053f92013-04-23 20:18:55220
rtennetia2ea9162015-05-15 19:26:44221 // Check the server to make the sure the handshake did not succeed.
rtennetid39bd762015-06-12 01:05:52222 EXPECT_FALSE(server_stream()->encryption_established());
223 EXPECT_FALSE(server_stream()->handshake_confirmed());
[email protected]fe053f92013-04-23 20:18:55224
rtenneti85816fdf2015-05-25 03:01:10225 // Check the client state to make sure that it received a server-designated
226 // connection id.
rtennetia2ea9162015-05-15 19:26:44227 QuicCryptoClientConfig::CachedState* client_state =
228 client_crypto_config_.LookupOrCreate(server_id_);
[email protected]fe053f92013-04-23 20:18:55229
rtenneti85816fdf2015-05-25 03:01:10230 ASSERT_TRUE(client_state->has_server_nonce());
231 ASSERT_FALSE(client_state->GetNextServerNonce().empty());
232 ASSERT_FALSE(client_state->has_server_nonce());
233
rtennetia2ea9162015-05-15 19:26:44234 ASSERT_TRUE(client_state->has_server_designated_connection_id());
235 const QuicConnectionId server_designated_connection_id =
236 client_state->GetNextServerDesignatedConnectionId();
237 const QuicConnectionId expected_id =
rtenneti8a4a0732015-10-18 00:45:51238 server_connection_->random_generator()->RandUint64();
rtennetia2ea9162015-05-15 19:26:44239 EXPECT_EQ(expected_id, server_designated_connection_id);
240 EXPECT_FALSE(client_state->has_server_designated_connection_id());
241 ASSERT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0)));
ckrasicea295fe2015-10-31 05:03:27242 EXPECT_FALSE(server_connection_->connected());
rtennetia2ea9162015-05-15 19:26:44243}
[email protected]fe053f92013-04-23 20:18:55244
rtennetia2ea9162015-05-15 19:26:44245TEST_P(QuicCryptoServerStreamTest, ConnectedAfterStatelessHandshake) {
246 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stateless_reject_support,
247 true);
rch99b644c2015-11-04 05:25:28248 InitializeServer();
[email protected]fe053f92013-04-23 20:18:55249
rtennetia2ea9162015-05-15 19:26:44250 InitializeFakeClient(/* supports_stateless_rejects= */ true);
251 AdvanceHandshakeWithFakeClient();
[email protected]fe053f92013-04-23 20:18:55252
rtennetia2ea9162015-05-15 19:26:44253 // On the first round, encryption will not be established.
rtennetid39bd762015-06-12 01:05:52254 EXPECT_FALSE(server_stream()->encryption_established());
255 EXPECT_FALSE(server_stream()->handshake_confirmed());
rjshadec86dbfa2015-11-12 20:16:25256 EXPECT_EQ(1, server_stream()->NumHandshakeMessages());
257 EXPECT_EQ(0, server_stream()->NumHandshakeMessagesWithServerNonces());
[email protected]fe053f92013-04-23 20:18:55258
rtennetia2ea9162015-05-15 19:26:44259 // Now check the client state.
260 QuicCryptoClientConfig::CachedState* client_state =
261 client_crypto_config_.LookupOrCreate(server_id_);
[email protected]2532de12013-05-09 12:29:33262
rtennetia2ea9162015-05-15 19:26:44263 ASSERT_TRUE(client_state->has_server_designated_connection_id());
264 const QuicConnectionId server_designated_connection_id =
265 client_state->GetNextServerDesignatedConnectionId();
266 const QuicConnectionId expected_id =
rtenneti8a4a0732015-10-18 00:45:51267 server_connection_->random_generator()->RandUint64();
rtennetia2ea9162015-05-15 19:26:44268 EXPECT_EQ(expected_id, server_designated_connection_id);
269 EXPECT_FALSE(client_state->has_server_designated_connection_id());
270 ASSERT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0)));
[email protected]fe053f92013-04-23 20:18:55271
rtennetia2ea9162015-05-15 19:26:44272 // Now create new client and server streams with the existing config
273 // and try the handshake again (0-RTT handshake).
274 InitializeServer();
[email protected]fe053f92013-04-23 20:18:55275
rtennetia2ea9162015-05-15 19:26:44276 InitializeFakeClient(/* supports_stateless_rejects= */ true);
277
rtennetid39bd762015-06-12 01:05:52278 client_stream()->CryptoConnect();
[email protected]691f45a982013-11-19 10:52:04279
rtenneti85816fdf2015-05-25 03:01:10280 // In the stateless case, the second handshake contains a server-nonce, so the
281 // AsyncStrikeRegisterVerification() case will still succeed (unlike a 0-RTT
282 // handshake).
283 AdvanceHandshakeWithFakeClient();
[email protected]691f45a982013-11-19 10:52:04284
rtennetia2ea9162015-05-15 19:26:44285 // On the second round, encryption will be established.
rtennetid39bd762015-06-12 01:05:52286 EXPECT_TRUE(server_stream()->encryption_established());
287 EXPECT_TRUE(server_stream()->handshake_confirmed());
rjshadec86dbfa2015-11-12 20:16:25288 EXPECT_EQ(2, server_stream()->NumHandshakeMessages());
289 EXPECT_EQ(1, server_stream()->NumHandshakeMessagesWithServerNonces());
rtennetia2ea9162015-05-15 19:26:44290}
291
292TEST_P(QuicCryptoServerStreamTest, NoStatelessRejectIfNoClientSupport) {
293 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stateless_reject_support,
294 true);
rch99b644c2015-11-04 05:25:28295 InitializeServer();
rtennetia2ea9162015-05-15 19:26:44296
rtenneti85816fdf2015-05-25 03:01:10297 // The server is configured to use stateless rejects, but the client does not
298 // support it.
rtennetia2ea9162015-05-15 19:26:44299 InitializeFakeClient(/* supports_stateless_rejects= */ false);
300 AdvanceHandshakeWithFakeClient();
301
302 // Check the server to make the sure the handshake did not succeed.
rtennetid39bd762015-06-12 01:05:52303 EXPECT_FALSE(server_stream()->encryption_established());
304 EXPECT_FALSE(server_stream()->handshake_confirmed());
rtennetia2ea9162015-05-15 19:26:44305
306 // Check the client state to make sure that it did not receive a
307 // server-designated connection id.
308 QuicCryptoClientConfig::CachedState* client_state =
309 client_crypto_config_.LookupOrCreate(server_id_);
310
311 ASSERT_FALSE(client_state->has_server_designated_connection_id());
312 ASSERT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0)));
313}
314
315TEST_P(QuicCryptoServerStreamTest, ZeroRTT) {
316 InitializeFakeClient(/* supports_stateless_rejects= */ false);
317
318 // Do a first handshake in order to prime the client config with the server's
319 // information.
320 AdvanceHandshakeWithFakeClient();
321
322 // Now do another handshake, hopefully in 0-RTT.
323 DVLOG(1) << "Resetting for 0-RTT handshake attempt";
324 InitializeFakeClient(/* supports_stateless_rejects= */ false);
325 InitializeServer();
326
rtennetid39bd762015-06-12 01:05:52327 client_stream()->CryptoConnect();
rtennetia2ea9162015-05-15 19:26:44328
329 if (AsyncStrikeRegisterVerification()) {
rtennetid39bd762015-06-12 01:05:52330 EXPECT_FALSE(client_stream()->handshake_confirmed());
331 EXPECT_FALSE(server_stream()->handshake_confirmed());
rtennetia2ea9162015-05-15 19:26:44332
rtenneti85816fdf2015-05-25 03:01:10333 // Advance the handshake. Expect that the server will be stuck waiting for
334 // client nonce verification to complete.
rtennetia2ea9162015-05-15 19:26:44335 pair<size_t, size_t> messages_moved = CryptoTestUtils::AdvanceHandshake(
rtennetid39bd762015-06-12 01:05:52336 client_connection_, client_stream(), 0, server_connection_,
337 server_stream(), 0);
rtennetia2ea9162015-05-15 19:26:44338 EXPECT_EQ(1u, messages_moved.first);
339 EXPECT_EQ(0u, messages_moved.second);
340 EXPECT_EQ(1, strike_register_client_->PendingVerifications());
rtennetid39bd762015-06-12 01:05:52341 EXPECT_FALSE(client_stream()->handshake_confirmed());
342 EXPECT_FALSE(server_stream()->handshake_confirmed());
rtennetia2ea9162015-05-15 19:26:44343
344 // The server handshake completes once the nonce verification completes.
345 strike_register_client_->RunPendingVerifications();
rtennetid39bd762015-06-12 01:05:52346 EXPECT_FALSE(client_stream()->handshake_confirmed());
347 EXPECT_TRUE(server_stream()->handshake_confirmed());
rtennetia2ea9162015-05-15 19:26:44348
349 messages_moved = CryptoTestUtils::AdvanceHandshake(
rtennetid39bd762015-06-12 01:05:52350 client_connection_, client_stream(), messages_moved.first,
351 server_connection_, server_stream(), messages_moved.second);
rtennetia2ea9162015-05-15 19:26:44352 EXPECT_EQ(1u, messages_moved.first);
353 EXPECT_EQ(1u, messages_moved.second);
rtennetid39bd762015-06-12 01:05:52354 EXPECT_TRUE(client_stream()->handshake_confirmed());
355 EXPECT_TRUE(server_stream()->handshake_confirmed());
rtennetia2ea9162015-05-15 19:26:44356 } else {
357 CryptoTestUtils::CommunicateHandshakeMessages(
rtennetid39bd762015-06-12 01:05:52358 client_connection_, client_stream(), server_connection_,
359 server_stream());
rtennetia2ea9162015-05-15 19:26:44360 }
361
rtennetid39bd762015-06-12 01:05:52362 EXPECT_EQ(1, client_stream()->num_sent_client_hellos());
[email protected]fe053f92013-04-23 20:18:55363}
364
[email protected]691f45a982013-11-19 10:52:04365TEST_P(QuicCryptoServerStreamTest, MessageAfterHandshake) {
[email protected]72818ea2013-03-13 03:23:57366 CompleteCryptoHandshake();
rtennetia2ea9162015-05-15 19:26:44367 EXPECT_CALL(
368 *server_connection_,
369 SendConnectionClose(QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE));
[email protected]ccc66e8a2013-03-26 08:26:14370 message_.set_tag(kCHLO);
[email protected]72818ea2013-03-13 03:23:57371 ConstructHandshakeMessage();
rchb27683c2015-07-29 23:53:50372 server_stream()->OnStreamFrame(
373 QuicStreamFrame(kCryptoStreamId, /*fin=*/false, /*offset=*/0,
374 message_data_->AsStringPiece()));
[email protected]72818ea2013-03-13 03:23:57375}
376
[email protected]691f45a982013-11-19 10:52:04377TEST_P(QuicCryptoServerStreamTest, BadMessageType) {
[email protected]ccc66e8a2013-03-26 08:26:14378 message_.set_tag(kSHLO);
[email protected]72818ea2013-03-13 03:23:57379 ConstructHandshakeMessage();
rtennetia2ea9162015-05-15 19:26:44380 EXPECT_CALL(*server_connection_,
381 SendConnectionClose(QUIC_INVALID_CRYPTO_MESSAGE_TYPE));
rchb27683c2015-07-29 23:53:50382 server_stream()->OnStreamFrame(
383 QuicStreamFrame(kCryptoStreamId, /*fin=*/false, /*offset=*/0,
384 message_data_->AsStringPiece()));
[email protected]72818ea2013-03-13 03:23:57385}
386
[email protected]691f45a982013-11-19 10:52:04387TEST_P(QuicCryptoServerStreamTest, ChannelID) {
[email protected]b064310782013-05-30 21:12:17388 client_options_.channel_id_enabled = true;
[email protected]6fc79ea2014-07-10 04:30:23389 client_options_.channel_id_source_async = false;
390 // CompleteCryptoHandshake verifies
rtennetid39bd762015-06-12 01:05:52391 // server_stream()->crypto_negotiated_params().channel_id is correct.
[email protected]6fc79ea2014-07-10 04:30:23392 EXPECT_EQ(2, CompleteCryptoHandshake());
rtennetid39bd762015-06-12 01:05:52393 EXPECT_TRUE(server_stream()->encryption_established());
394 EXPECT_TRUE(server_stream()->handshake_confirmed());
[email protected]6fc79ea2014-07-10 04:30:23395}
396
397TEST_P(QuicCryptoServerStreamTest, ChannelIDAsync) {
398 client_options_.channel_id_enabled = true;
399 client_options_.channel_id_source_async = true;
[email protected]38b3fd12013-06-18 08:19:01400 // CompleteCryptoHandshake verifies
rtennetid39bd762015-06-12 01:05:52401 // server_stream()->crypto_negotiated_params().channel_id is correct.
[email protected]b064310782013-05-30 21:12:17402 EXPECT_EQ(2, CompleteCryptoHandshake());
rtennetid39bd762015-06-12 01:05:52403 EXPECT_TRUE(server_stream()->encryption_established());
404 EXPECT_TRUE(server_stream()->handshake_confirmed());
[email protected]b064310782013-05-30 21:12:17405}
406
rtennetidd4bf8f2014-09-03 00:45:16407TEST_P(QuicCryptoServerStreamTest, OnlySendSCUPAfterHandshakeComplete) {
408 // An attempt to send a SCUP before completing handshake should fail.
rtennetid39bd762015-06-12 01:05:52409 server_stream()->SendServerConfigUpdate(nullptr);
rjshadec86dbfa2015-11-12 20:16:25410 EXPECT_EQ(0, server_stream()->NumServerConfigUpdateMessagesSent());
rtennetia2ea9162015-05-15 19:26:44411}
412
413TEST_P(QuicCryptoServerStreamTest, DoesPeerSupportStatelessRejects) {
414 ConstructHandshakeMessage();
415 QuicConfig stateless_reject_config = DefaultQuicConfigStatelessRejects();
416 stateless_reject_config.ToHandshakeMessage(&message_);
417 EXPECT_TRUE(
418 QuicCryptoServerStreamPeer::DoesPeerSupportStatelessRejects(message_));
419
420 message_.Clear();
421 QuicConfig stateful_reject_config = DefaultQuicConfig();
422 stateful_reject_config.ToHandshakeMessage(&message_);
423 EXPECT_FALSE(
424 QuicCryptoServerStreamPeer::DoesPeerSupportStatelessRejects(message_));
rtennetidd4bf8f2014-09-03 00:45:16425}
426
rjshadec86dbfa2015-11-12 20:16:25427TEST_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
437TEST_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
[email protected]72818ea2013-03-13 03:23:57445} // namespace
rch1fe2eeb2015-10-26 14:45:57446
[email protected]72818ea2013-03-13 03:23:57447} // namespace test
448} // namespace net