blob: 9dc6fde145c6045ca0244cf0b26223c26d63ffc8 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// 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/third_party/quiche/src/quic/core/quic_framer.h"
6
7#include <algorithm>
8#include <cstdint>
9#include <map>
10#include <memory>
vasilvv872e7a32019-03-12 16:42:44 -070011#include <string>
bnc463f2352019-10-10 04:49:34 -070012#include <utility>
QUICHE teama6ef0a62019-03-07 20:34:33 -050013#include <vector>
14
15#include "net/third_party/quiche/src/quic/core/crypto/null_decrypter.h"
16#include "net/third_party/quiche/src/quic/core/crypto/null_encrypter.h"
17#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
18#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
19#include "net/third_party/quiche/src/quic/core/quic_connection_id.h"
dschinazicf5b1e22019-07-17 18:35:17 -070020#include "net/third_party/quiche/src/quic/core/quic_error_codes.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050021#include "net/third_party/quiche/src/quic/core/quic_packets.h"
22#include "net/third_party/quiche/src/quic/core/quic_types.h"
23#include "net/third_party/quiche/src/quic/core/quic_utils.h"
dschinazi243eabc2019-08-05 16:15:29 -070024#include "net/third_party/quiche/src/quic/core/quic_versions.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050025#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h"
26#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
27#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
28#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
29#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050030#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
31#include "net/third_party/quiche/src/quic/platform/api/quic_text_utils.h"
32#include "net/third_party/quiche/src/quic/test_tools/quic_framer_peer.h"
33#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
34#include "net/third_party/quiche/src/quic/test_tools/simple_data_producer.h"
35
36using testing::_;
37using testing::Return;
38using testing::Truly;
39
40namespace quic {
41namespace test {
42namespace {
43
44const uint64_t kEpoch = UINT64_C(1) << 32;
45const uint64_t kMask = kEpoch - 1;
46
47const QuicUint128 kTestStatelessResetToken = 1010101; // 0x0F69B5
48
49// Use fields in which each byte is distinct to ensure that every byte is
50// framed correctly. The values are otherwise arbitrary.
51QuicConnectionId FramerTestConnectionId() {
52 return TestConnectionId(UINT64_C(0xFEDCBA9876543210));
53}
54
55QuicConnectionId FramerTestConnectionIdPlusOne() {
56 return TestConnectionId(UINT64_C(0xFEDCBA9876543211));
57}
58
QUICHE team8e2e4532019-03-14 14:37:56 -070059QuicConnectionId FramerTestConnectionIdNineBytes() {
60 char connection_id_bytes[9] = {0xFE, 0xDC, 0xBA, 0x98, 0x76,
61 0x54, 0x32, 0x10, 0x42};
62 return QuicConnectionId(connection_id_bytes, sizeof(connection_id_bytes));
63}
64
QUICHE teama6ef0a62019-03-07 20:34:33 -050065const QuicPacketNumber kPacketNumber = QuicPacketNumber(UINT64_C(0x12345678));
66const QuicPacketNumber kSmallLargestObserved =
67 QuicPacketNumber(UINT16_C(0x1234));
68const QuicPacketNumber kSmallMissingPacket = QuicPacketNumber(UINT16_C(0x1233));
69const QuicPacketNumber kLeastUnacked = QuicPacketNumber(UINT64_C(0x012345670));
70const QuicStreamId kStreamId = UINT64_C(0x01020304);
71// Note that the high 4 bits of the stream offset must be less than 0x40
72// in order to ensure that the value can be encoded using VarInt62 encoding.
73const QuicStreamOffset kStreamOffset = UINT64_C(0x3A98FEDC32107654);
74const QuicPublicResetNonceProof kNonceProof = UINT64_C(0xABCDEF0123456789);
75
76// In testing that we can ack the full range of packets...
77// This is the largest packet number that can be represented in IETF QUIC
78// varint62 format.
79const QuicPacketNumber kLargestIetfLargestObserved =
80 QuicPacketNumber(UINT64_C(0x3fffffffffffffff));
81// Encodings for the two bits in a VarInt62 that
82// describe the length of the VarInt61. For binary packet
83// formats in this file, the convention is to code the
84// first byte as
85// kVarInt62FourBytes + 0x<value_in_that_byte>
86const uint8_t kVarInt62OneByte = 0x00;
87const uint8_t kVarInt62TwoBytes = 0x40;
88const uint8_t kVarInt62FourBytes = 0x80;
89const uint8_t kVarInt62EightBytes = 0xc0;
90
91class TestEncrypter : public QuicEncrypter {
92 public:
93 ~TestEncrypter() override {}
dschinazi17d42422019-06-18 16:35:07 -070094 bool SetKey(QuicStringPiece /*key*/) override { return true; }
95 bool SetNoncePrefix(QuicStringPiece /*nonce_prefix*/) override {
96 return true;
97 }
98 bool SetIV(QuicStringPiece /*iv*/) override { return true; }
99 bool SetHeaderProtectionKey(QuicStringPiece /*key*/) override { return true; }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500100 bool EncryptPacket(uint64_t packet_number,
101 QuicStringPiece associated_data,
102 QuicStringPiece plaintext,
103 char* output,
104 size_t* output_length,
dschinazi17d42422019-06-18 16:35:07 -0700105 size_t /*max_output_length*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500106 packet_number_ = QuicPacketNumber(packet_number);
vasilvvc48c8712019-03-11 13:38:16 -0700107 associated_data_ = std::string(associated_data);
108 plaintext_ = std::string(plaintext);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500109 memcpy(output, plaintext.data(), plaintext.length());
110 *output_length = plaintext.length();
111 return true;
112 }
dschinazi17d42422019-06-18 16:35:07 -0700113 std::string GenerateHeaderProtectionMask(
114 QuicStringPiece /*sample*/) override {
QUICHE team2d187972019-03-19 16:23:47 -0700115 return std::string(5, 0);
116 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500117 size_t GetKeySize() const override { return 0; }
118 size_t GetNoncePrefixSize() const override { return 0; }
119 size_t GetIVSize() const override { return 0; }
120 size_t GetMaxPlaintextSize(size_t ciphertext_size) const override {
121 return ciphertext_size;
122 }
123 size_t GetCiphertextSize(size_t plaintext_size) const override {
124 return plaintext_size;
125 }
126 QuicStringPiece GetKey() const override { return QuicStringPiece(); }
127 QuicStringPiece GetNoncePrefix() const override { return QuicStringPiece(); }
128
129 QuicPacketNumber packet_number_;
vasilvvc48c8712019-03-11 13:38:16 -0700130 std::string associated_data_;
131 std::string plaintext_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500132};
133
134class TestDecrypter : public QuicDecrypter {
135 public:
136 ~TestDecrypter() override {}
dschinazi17d42422019-06-18 16:35:07 -0700137 bool SetKey(QuicStringPiece /*key*/) override { return true; }
138 bool SetNoncePrefix(QuicStringPiece /*nonce_prefix*/) override {
139 return true;
140 }
141 bool SetIV(QuicStringPiece /*iv*/) override { return true; }
142 bool SetHeaderProtectionKey(QuicStringPiece /*key*/) override { return true; }
143 bool SetPreliminaryKey(QuicStringPiece /*key*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500144 QUIC_BUG << "should not be called";
145 return false;
146 }
dschinazi17d42422019-06-18 16:35:07 -0700147 bool SetDiversificationNonce(const DiversificationNonce& /*key*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500148 return true;
149 }
150 bool DecryptPacket(uint64_t packet_number,
151 QuicStringPiece associated_data,
152 QuicStringPiece ciphertext,
153 char* output,
154 size_t* output_length,
dschinazi17d42422019-06-18 16:35:07 -0700155 size_t /*max_output_length*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500156 packet_number_ = QuicPacketNumber(packet_number);
vasilvvc48c8712019-03-11 13:38:16 -0700157 associated_data_ = std::string(associated_data);
158 ciphertext_ = std::string(ciphertext);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500159 memcpy(output, ciphertext.data(), ciphertext.length());
160 *output_length = ciphertext.length();
161 return true;
162 }
QUICHE team2d187972019-03-19 16:23:47 -0700163 std::string GenerateHeaderProtectionMask(
dschinazi17d42422019-06-18 16:35:07 -0700164 QuicDataReader* /*sample_reader*/) override {
QUICHE team2d187972019-03-19 16:23:47 -0700165 return std::string(5, 0);
166 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500167 size_t GetKeySize() const override { return 0; }
nharper965e5922019-09-23 22:33:54 -0700168 size_t GetNoncePrefixSize() const override { return 0; }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500169 size_t GetIVSize() const override { return 0; }
170 QuicStringPiece GetKey() const override { return QuicStringPiece(); }
171 QuicStringPiece GetNoncePrefix() const override { return QuicStringPiece(); }
172 // Use a distinct value starting with 0xFFFFFF, which is never used by TLS.
173 uint32_t cipher_id() const override { return 0xFFFFFFF2; }
174 QuicPacketNumber packet_number_;
vasilvvc48c8712019-03-11 13:38:16 -0700175 std::string associated_data_;
176 std::string ciphertext_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500177};
178
179class TestQuicVisitor : public QuicFramerVisitorInterface {
180 public:
181 TestQuicVisitor()
182 : error_count_(0),
183 version_mismatch_(0),
184 packet_count_(0),
185 frame_count_(0),
186 complete_packets_(0),
187 accept_packet_(true),
188 accept_public_header_(true) {}
189
190 ~TestQuicVisitor() override {}
191
192 void OnError(QuicFramer* f) override {
193 QUIC_DLOG(INFO) << "QuicFramer Error: " << QuicErrorCodeToString(f->error())
194 << " (" << f->error() << ")";
195 ++error_count_;
196 }
197
198 void OnPacket() override {}
199
200 void OnPublicResetPacket(const QuicPublicResetPacket& packet) override {
vasilvv0fc587f2019-09-06 13:33:08 -0700201 public_reset_packet_ = std::make_unique<QuicPublicResetPacket>((packet));
fkastenholza3660102019-08-28 05:19:24 -0700202 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500203 }
204
205 void OnVersionNegotiationPacket(
206 const QuicVersionNegotiationPacket& packet) override {
207 version_negotiation_packet_ =
vasilvv0fc587f2019-09-06 13:33:08 -0700208 std::make_unique<QuicVersionNegotiationPacket>((packet));
fkastenholza3660102019-08-28 05:19:24 -0700209 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500210 }
211
dschinazi244f6dc2019-05-06 15:45:16 -0700212 void OnRetryPacket(QuicConnectionId original_connection_id,
213 QuicConnectionId new_connection_id,
214 QuicStringPiece retry_token) override {
215 retry_original_connection_id_ =
vasilvv0fc587f2019-09-06 13:33:08 -0700216 std::make_unique<QuicConnectionId>(original_connection_id);
dschinazi244f6dc2019-05-06 15:45:16 -0700217 retry_new_connection_id_ =
vasilvv0fc587f2019-09-06 13:33:08 -0700218 std::make_unique<QuicConnectionId>(new_connection_id);
219 retry_token_ = std::make_unique<std::string>(std::string(retry_token));
fkastenholza3660102019-08-28 05:19:24 -0700220 EXPECT_EQ(0u, framer_->current_received_frame_type());
dschinazi244f6dc2019-05-06 15:45:16 -0700221 }
222
fayang8aba1ff2019-06-21 12:00:54 -0700223 bool OnProtocolVersionMismatch(ParsedQuicVersion received_version) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500224 QUIC_DLOG(INFO) << "QuicFramer Version Mismatch, version: "
225 << received_version;
226 ++version_mismatch_;
fkastenholza3660102019-08-28 05:19:24 -0700227 EXPECT_EQ(0u, framer_->current_received_frame_type());
dschinazi48ac9192019-07-31 00:07:26 -0700228 return false;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500229 }
230
231 bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override {
vasilvv0fc587f2019-09-06 13:33:08 -0700232 header_ = std::make_unique<QuicPacketHeader>((header));
fkastenholza3660102019-08-28 05:19:24 -0700233 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500234 return accept_public_header_;
235 }
236
dschinazi17d42422019-06-18 16:35:07 -0700237 bool OnUnauthenticatedHeader(const QuicPacketHeader& /*header*/) override {
fkastenholza3660102019-08-28 05:19:24 -0700238 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500239 return true;
240 }
241
fkastenholza3660102019-08-28 05:19:24 -0700242 void OnDecryptedPacket(EncryptionLevel /*level*/) override {
243 EXPECT_EQ(0u, framer_->current_received_frame_type());
244 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500245
246 bool OnPacketHeader(const QuicPacketHeader& header) override {
247 ++packet_count_;
vasilvv0fc587f2019-09-06 13:33:08 -0700248 header_ = std::make_unique<QuicPacketHeader>((header));
fkastenholza3660102019-08-28 05:19:24 -0700249 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500250 return accept_packet_;
251 }
252
253 void OnCoalescedPacket(const QuicEncryptedPacket& packet) override {
dschinazi4b5a68a2019-08-15 15:45:36 -0700254 coalesced_packets_.push_back(packet.Clone());
255 }
256
257 void OnUndecryptablePacket(const QuicEncryptedPacket& packet,
258 EncryptionLevel decryption_level,
259 bool has_decryption_key) override {
260 undecryptable_packets_.push_back(packet.Clone());
261 undecryptable_decryption_levels_.push_back(decryption_level);
262 undecryptable_has_decryption_keys_.push_back(has_decryption_key);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500263 }
264
265 bool OnStreamFrame(const QuicStreamFrame& frame) override {
266 ++frame_count_;
267 // Save a copy of the data so it is valid after the packet is processed.
vasilvvc48c8712019-03-11 13:38:16 -0700268 std::string* string_data =
269 new std::string(frame.data_buffer, frame.data_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500270 stream_data_.push_back(QuicWrapUnique(string_data));
vasilvv0fc587f2019-09-06 13:33:08 -0700271 stream_frames_.push_back(std::make_unique<QuicStreamFrame>(
QUICHE teama6ef0a62019-03-07 20:34:33 -0500272 frame.stream_id, frame.fin, frame.offset, *string_data));
fkastenholza3660102019-08-28 05:19:24 -0700273 if (VersionHasIetfQuicFrames(transport_version_)) {
274 // Low order bits of type encode flags, ignore them for this test.
275 EXPECT_TRUE(IS_IETF_STREAM_FRAME(framer_->current_received_frame_type()));
276 } else {
277 EXPECT_EQ(0u, framer_->current_received_frame_type());
278 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500279 return true;
280 }
281
282 bool OnCryptoFrame(const QuicCryptoFrame& frame) override {
283 ++frame_count_;
284 // Save a copy of the data so it is valid after the packet is processed.
vasilvvc48c8712019-03-11 13:38:16 -0700285 std::string* string_data =
286 new std::string(frame.data_buffer, frame.data_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500287 crypto_data_.push_back(QuicWrapUnique(string_data));
vasilvv0fc587f2019-09-06 13:33:08 -0700288 crypto_frames_.push_back(std::make_unique<QuicCryptoFrame>(
QUICHE team6987b4a2019-03-15 16:23:04 -0700289 ENCRYPTION_INITIAL, frame.offset, *string_data));
fkastenholza3660102019-08-28 05:19:24 -0700290 if (VersionHasIetfQuicFrames(transport_version_)) {
291 EXPECT_EQ(IETF_CRYPTO, framer_->current_received_frame_type());
292 } else {
293 EXPECT_EQ(0u, framer_->current_received_frame_type());
294 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500295 return true;
296 }
297
298 bool OnAckFrameStart(QuicPacketNumber largest_acked,
299 QuicTime::Delta ack_delay_time) override {
300 ++frame_count_;
301 QuicAckFrame ack_frame;
302 ack_frame.largest_acked = largest_acked;
303 ack_frame.ack_delay_time = ack_delay_time;
vasilvv0fc587f2019-09-06 13:33:08 -0700304 ack_frames_.push_back(std::make_unique<QuicAckFrame>(ack_frame));
fkastenholza3660102019-08-28 05:19:24 -0700305 if (VersionHasIetfQuicFrames(transport_version_)) {
306 EXPECT_EQ(IETF_ACK, framer_->current_received_frame_type());
307 } else {
308 EXPECT_EQ(0u, framer_->current_received_frame_type());
309 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500310 return true;
311 }
312
313 bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) override {
314 DCHECK(!ack_frames_.empty());
315 ack_frames_[ack_frames_.size() - 1]->packets.AddRange(start, end);
fkastenholza3660102019-08-28 05:19:24 -0700316 if (VersionHasIetfQuicFrames(transport_version_)) {
317 EXPECT_EQ(IETF_ACK, framer_->current_received_frame_type());
318 } else {
319 EXPECT_EQ(0u, framer_->current_received_frame_type());
320 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500321 return true;
322 }
323
324 bool OnAckTimestamp(QuicPacketNumber packet_number,
325 QuicTime timestamp) override {
326 ack_frames_[ack_frames_.size() - 1]->received_packet_times.push_back(
327 std::make_pair(packet_number, timestamp));
fkastenholza3660102019-08-28 05:19:24 -0700328 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500329 return true;
330 }
331
332 bool OnAckFrameEnd(QuicPacketNumber /*start*/) override { return true; }
333
334 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override {
335 ++frame_count_;
vasilvv0fc587f2019-09-06 13:33:08 -0700336 stop_waiting_frames_.push_back(
337 std::make_unique<QuicStopWaitingFrame>(frame));
fkastenholza3660102019-08-28 05:19:24 -0700338 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500339 return true;
340 }
341
342 bool OnPaddingFrame(const QuicPaddingFrame& frame) override {
vasilvv0fc587f2019-09-06 13:33:08 -0700343 padding_frames_.push_back(std::make_unique<QuicPaddingFrame>(frame));
fkastenholza3660102019-08-28 05:19:24 -0700344 if (VersionHasIetfQuicFrames(transport_version_)) {
345 EXPECT_EQ(IETF_PADDING, framer_->current_received_frame_type());
346 } else {
347 EXPECT_EQ(0u, framer_->current_received_frame_type());
348 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500349 return true;
350 }
351
352 bool OnPingFrame(const QuicPingFrame& frame) override {
353 ++frame_count_;
vasilvv0fc587f2019-09-06 13:33:08 -0700354 ping_frames_.push_back(std::make_unique<QuicPingFrame>(frame));
fkastenholza3660102019-08-28 05:19:24 -0700355 if (VersionHasIetfQuicFrames(transport_version_)) {
356 EXPECT_EQ(IETF_PING, framer_->current_received_frame_type());
357 } else {
358 EXPECT_EQ(0u, framer_->current_received_frame_type());
359 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500360 return true;
361 }
362
363 bool OnMessageFrame(const QuicMessageFrame& frame) override {
364 ++frame_count_;
365 message_frames_.push_back(
vasilvv0fc587f2019-09-06 13:33:08 -0700366 std::make_unique<QuicMessageFrame>(frame.data, frame.message_length));
fkastenholza3660102019-08-28 05:19:24 -0700367 if (VersionHasIetfQuicFrames(transport_version_)) {
dschinazicd86dd12019-11-14 10:11:13 -0800368 EXPECT_TRUE(IETF_EXTENSION_MESSAGE_NO_LENGTH_V99 ==
fkastenholza3660102019-08-28 05:19:24 -0700369 framer_->current_received_frame_type() ||
dschinazicd86dd12019-11-14 10:11:13 -0800370 IETF_EXTENSION_MESSAGE_V99 ==
fkastenholza3660102019-08-28 05:19:24 -0700371 framer_->current_received_frame_type());
372 } else {
373 EXPECT_EQ(0u, framer_->current_received_frame_type());
374 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500375 return true;
376 }
377
378 void OnPacketComplete() override { ++complete_packets_; }
379
380 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override {
381 rst_stream_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700382 if (VersionHasIetfQuicFrames(transport_version_)) {
383 EXPECT_EQ(IETF_RST_STREAM, framer_->current_received_frame_type());
384 } else {
385 EXPECT_EQ(0u, framer_->current_received_frame_type());
386 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500387 return true;
388 }
389
390 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override {
391 connection_close_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700392 if (VersionHasIetfQuicFrames(transport_version_)) {
393 EXPECT_NE(GOOGLE_QUIC_CONNECTION_CLOSE, frame.close_type);
394 if (frame.close_type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
395 EXPECT_EQ(IETF_CONNECTION_CLOSE,
396 framer_->current_received_frame_type());
397 } else {
398 EXPECT_EQ(IETF_APPLICATION_CLOSE,
399 framer_->current_received_frame_type());
400 }
401 } else {
402 EXPECT_EQ(0u, framer_->current_received_frame_type());
403 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500404 return true;
405 }
406
QUICHE teama6ef0a62019-03-07 20:34:33 -0500407 bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override {
408 stop_sending_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700409 EXPECT_EQ(IETF_STOP_SENDING, framer_->current_received_frame_type());
410 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500411 return true;
412 }
413
414 bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override {
415 path_challenge_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700416 EXPECT_EQ(IETF_PATH_CHALLENGE, framer_->current_received_frame_type());
417 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500418 return true;
419 }
420
421 bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override {
422 path_response_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700423 EXPECT_EQ(IETF_PATH_RESPONSE, framer_->current_received_frame_type());
424 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500425 return true;
426 }
427
428 bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override {
429 goaway_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700430 EXPECT_FALSE(VersionHasIetfQuicFrames(transport_version_));
431 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500432 return true;
433 }
434
fkastenholz3c4eabf2019-04-22 07:49:59 -0700435 bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& frame) override {
436 max_streams_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700437 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
438 EXPECT_TRUE(IETF_MAX_STREAMS_UNIDIRECTIONAL ==
439 framer_->current_received_frame_type() ||
440 IETF_MAX_STREAMS_BIDIRECTIONAL ==
441 framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500442 return true;
443 }
444
fkastenholz3c4eabf2019-04-22 07:49:59 -0700445 bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame) override {
446 streams_blocked_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700447 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
448 EXPECT_TRUE(IETF_STREAMS_BLOCKED_UNIDIRECTIONAL ==
449 framer_->current_received_frame_type() ||
450 IETF_STREAMS_BLOCKED_BIDIRECTIONAL ==
451 framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500452 return true;
453 }
454
455 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override {
456 window_update_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700457 if (VersionHasIetfQuicFrames(transport_version_)) {
458 EXPECT_TRUE(IETF_MAX_DATA == framer_->current_received_frame_type() ||
459 IETF_MAX_STREAM_DATA ==
460 framer_->current_received_frame_type());
461 } else {
462 EXPECT_EQ(0u, framer_->current_received_frame_type());
463 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500464 return true;
465 }
466
467 bool OnBlockedFrame(const QuicBlockedFrame& frame) override {
468 blocked_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700469 if (VersionHasIetfQuicFrames(transport_version_)) {
470 EXPECT_TRUE(IETF_BLOCKED == framer_->current_received_frame_type() ||
471 IETF_STREAM_BLOCKED ==
472 framer_->current_received_frame_type());
473 } else {
474 EXPECT_EQ(0u, framer_->current_received_frame_type());
475 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500476 return true;
477 }
478
479 bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override {
480 new_connection_id_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700481 EXPECT_EQ(IETF_NEW_CONNECTION_ID, framer_->current_received_frame_type());
482 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500483 return true;
484 }
485
486 bool OnRetireConnectionIdFrame(
487 const QuicRetireConnectionIdFrame& frame) override {
fkastenholza3660102019-08-28 05:19:24 -0700488 EXPECT_EQ(IETF_RETIRE_CONNECTION_ID,
489 framer_->current_received_frame_type());
490 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500491 retire_connection_id_ = frame;
492 return true;
493 }
494
495 bool OnNewTokenFrame(const QuicNewTokenFrame& frame) override {
496 new_token_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700497 EXPECT_EQ(IETF_NEW_TOKEN, framer_->current_received_frame_type());
498 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500499 return true;
500 }
501
502 bool IsValidStatelessResetToken(QuicUint128 token) const override {
fkastenholza3660102019-08-28 05:19:24 -0700503 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500504 return token == kTestStatelessResetToken;
505 }
506
507 void OnAuthenticatedIetfStatelessResetPacket(
508 const QuicIetfStatelessResetPacket& packet) override {
509 stateless_reset_packet_ =
vasilvv0fc587f2019-09-06 13:33:08 -0700510 std::make_unique<QuicIetfStatelessResetPacket>(packet);
fkastenholza3660102019-08-28 05:19:24 -0700511 EXPECT_EQ(0u, framer_->current_received_frame_type());
512 }
513
514 void set_framer(QuicFramer* framer) {
515 framer_ = framer;
516 transport_version_ = framer->transport_version();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500517 }
518
519 // Counters from the visitor_ callbacks.
520 int error_count_;
521 int version_mismatch_;
522 int packet_count_;
523 int frame_count_;
524 int complete_packets_;
525 bool accept_packet_;
526 bool accept_public_header_;
527
528 std::unique_ptr<QuicPacketHeader> header_;
529 std::unique_ptr<QuicPublicResetPacket> public_reset_packet_;
530 std::unique_ptr<QuicIetfStatelessResetPacket> stateless_reset_packet_;
531 std::unique_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_;
dschinazi244f6dc2019-05-06 15:45:16 -0700532 std::unique_ptr<QuicConnectionId> retry_original_connection_id_;
533 std::unique_ptr<QuicConnectionId> retry_new_connection_id_;
534 std::unique_ptr<std::string> retry_token_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500535 std::vector<std::unique_ptr<QuicStreamFrame>> stream_frames_;
536 std::vector<std::unique_ptr<QuicCryptoFrame>> crypto_frames_;
537 std::vector<std::unique_ptr<QuicAckFrame>> ack_frames_;
538 std::vector<std::unique_ptr<QuicStopWaitingFrame>> stop_waiting_frames_;
539 std::vector<std::unique_ptr<QuicPaddingFrame>> padding_frames_;
540 std::vector<std::unique_ptr<QuicPingFrame>> ping_frames_;
541 std::vector<std::unique_ptr<QuicMessageFrame>> message_frames_;
542 std::vector<std::unique_ptr<QuicEncryptedPacket>> coalesced_packets_;
dschinazi4b5a68a2019-08-15 15:45:36 -0700543 std::vector<std::unique_ptr<QuicEncryptedPacket>> undecryptable_packets_;
544 std::vector<EncryptionLevel> undecryptable_decryption_levels_;
545 std::vector<bool> undecryptable_has_decryption_keys_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500546 QuicRstStreamFrame rst_stream_frame_;
547 QuicConnectionCloseFrame connection_close_frame_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500548 QuicStopSendingFrame stop_sending_frame_;
549 QuicGoAwayFrame goaway_frame_;
550 QuicPathChallengeFrame path_challenge_frame_;
551 QuicPathResponseFrame path_response_frame_;
552 QuicWindowUpdateFrame window_update_frame_;
553 QuicBlockedFrame blocked_frame_;
fkastenholz3c4eabf2019-04-22 07:49:59 -0700554 QuicStreamsBlockedFrame streams_blocked_frame_;
555 QuicMaxStreamsFrame max_streams_frame_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500556 QuicNewConnectionIdFrame new_connection_id_;
557 QuicRetireConnectionIdFrame retire_connection_id_;
558 QuicNewTokenFrame new_token_;
vasilvvc48c8712019-03-11 13:38:16 -0700559 std::vector<std::unique_ptr<std::string>> stream_data_;
560 std::vector<std::unique_ptr<std::string>> crypto_data_;
fkastenholza3660102019-08-28 05:19:24 -0700561 QuicTransportVersion transport_version_;
562 QuicFramer* framer_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500563};
564
565// Simple struct for defining a packet's content, and associated
566// parse error.
567struct PacketFragment {
vasilvvc48c8712019-03-11 13:38:16 -0700568 std::string error_if_missing;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500569 std::vector<unsigned char> fragment;
570};
571
572using PacketFragments = std::vector<struct PacketFragment>;
573
QUICHE teama6ef0a62019-03-07 20:34:33 -0500574class QuicFramerTest : public QuicTestWithParam<ParsedQuicVersion> {
575 public:
576 QuicFramerTest()
577 : encrypter_(new test::TestEncrypter()),
578 decrypter_(new test::TestDecrypter()),
579 version_(GetParam()),
580 start_(QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(0x10)),
nharperf5e68452019-05-29 17:24:18 -0700581 framer_(AllSupportedVersions(),
QUICHE teama6ef0a62019-03-07 20:34:33 -0500582 start_,
583 Perspective::IS_SERVER,
584 kQuicDefaultConnectionIdLength) {
rch16df2a52019-09-10 10:50:09 -0700585 SetQuicReloadableFlag(quic_supports_tls_handshake, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500586 framer_.set_version(version_);
zhongyi546cc452019-04-12 15:27:49 -0700587 if (framer_.version().KnowsWhichDecrypterToUse()) {
588 framer_.InstallDecrypter(ENCRYPTION_INITIAL,
589 std::unique_ptr<QuicDecrypter>(decrypter_));
590 } else {
591 framer_.SetDecrypter(ENCRYPTION_INITIAL,
592 std::unique_ptr<QuicDecrypter>(decrypter_));
593 }
QUICHE team6987b4a2019-03-15 16:23:04 -0700594 framer_.SetEncrypter(ENCRYPTION_INITIAL,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500595 std::unique_ptr<QuicEncrypter>(encrypter_));
596
597 framer_.set_visitor(&visitor_);
598 framer_.InferPacketHeaderTypeFromVersion();
fkastenholza3660102019-08-28 05:19:24 -0700599 visitor_.set_framer(&framer_);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500600 }
601
zhongyi546cc452019-04-12 15:27:49 -0700602 void SetDecrypterLevel(EncryptionLevel level) {
603 if (!framer_.version().KnowsWhichDecrypterToUse()) {
604 return;
605 }
606 decrypter_ = new TestDecrypter();
607 framer_.InstallDecrypter(level, std::unique_ptr<QuicDecrypter>(decrypter_));
608 }
609
QUICHE teama6ef0a62019-03-07 20:34:33 -0500610 // Helper function to get unsigned char representation of the handshake
rcha702be22019-08-30 15:20:12 -0700611 // protocol byte at position |pos| of the current QUIC version number.
612 unsigned char GetQuicVersionByte(int pos) {
613 return (CreateQuicVersionLabel(version_) >> 8 * (3 - pos)) & 0xff;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500614 }
615
616 bool CheckEncryption(QuicPacketNumber packet_number, QuicPacket* packet) {
617 if (packet_number != encrypter_->packet_number_) {
618 QUIC_LOG(ERROR) << "Encrypted incorrect packet number. expected "
619 << packet_number
620 << " actual: " << encrypter_->packet_number_;
621 return false;
622 }
623 if (packet->AssociatedData(framer_.transport_version()) !=
624 encrypter_->associated_data_) {
625 QUIC_LOG(ERROR) << "Encrypted incorrect associated data. expected "
626 << packet->AssociatedData(framer_.transport_version())
627 << " actual: " << encrypter_->associated_data_;
628 return false;
629 }
630 if (packet->Plaintext(framer_.transport_version()) !=
631 encrypter_->plaintext_) {
632 QUIC_LOG(ERROR) << "Encrypted incorrect plaintext data. expected "
633 << packet->Plaintext(framer_.transport_version())
634 << " actual: " << encrypter_->plaintext_;
635 return false;
636 }
637 return true;
638 }
639
640 bool CheckDecryption(const QuicEncryptedPacket& encrypted,
641 bool includes_version,
642 bool includes_diversification_nonce,
643 QuicConnectionIdLength destination_connection_id_length,
644 QuicConnectionIdLength source_connection_id_length) {
645 return CheckDecryption(
646 encrypted, includes_version, includes_diversification_nonce,
647 destination_connection_id_length, source_connection_id_length,
648 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
649 }
650
651 bool CheckDecryption(
652 const QuicEncryptedPacket& encrypted,
653 bool includes_version,
654 bool includes_diversification_nonce,
655 QuicConnectionIdLength destination_connection_id_length,
656 QuicConnectionIdLength source_connection_id_length,
657 QuicVariableLengthIntegerLength retry_token_length_length,
658 size_t retry_token_length,
659 QuicVariableLengthIntegerLength length_length) {
660 if (visitor_.header_->packet_number != decrypter_->packet_number_) {
661 QUIC_LOG(ERROR) << "Decrypted incorrect packet number. expected "
662 << visitor_.header_->packet_number
663 << " actual: " << decrypter_->packet_number_;
664 return false;
665 }
666 QuicStringPiece associated_data =
667 QuicFramer::GetAssociatedDataFromEncryptedPacket(
668 framer_.transport_version(), encrypted,
669 destination_connection_id_length, source_connection_id_length,
670 includes_version, includes_diversification_nonce,
671 PACKET_4BYTE_PACKET_NUMBER, retry_token_length_length,
672 retry_token_length, length_length);
673 if (associated_data != decrypter_->associated_data_) {
674 QUIC_LOG(ERROR) << "Decrypted incorrect associated data. expected "
675 << QuicTextUtils::HexEncode(associated_data)
676 << " actual: "
677 << QuicTextUtils::HexEncode(decrypter_->associated_data_);
678 return false;
679 }
680 QuicStringPiece ciphertext(
681 encrypted.AsStringPiece().substr(GetStartOfEncryptedData(
682 framer_.transport_version(), destination_connection_id_length,
683 source_connection_id_length, includes_version,
684 includes_diversification_nonce, PACKET_4BYTE_PACKET_NUMBER,
685 retry_token_length_length, retry_token_length, length_length)));
686 if (ciphertext != decrypter_->ciphertext_) {
687 QUIC_LOG(ERROR) << "Decrypted incorrect ciphertext data. expected "
688 << QuicTextUtils::HexEncode(ciphertext) << " actual: "
689 << QuicTextUtils::HexEncode(decrypter_->ciphertext_)
690 << " associated data: "
691 << QuicTextUtils::HexEncode(associated_data);
692 return false;
693 }
694 return true;
695 }
696
697 char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); }
698
699 // Creates a new QuicEncryptedPacket by concatenating the various
700 // packet fragments in |fragments|.
701 std::unique_ptr<QuicEncryptedPacket> AssemblePacketFromFragments(
702 const PacketFragments& fragments) {
dschinazi66dea072019-04-09 11:41:06 -0700703 char* buffer = new char[kMaxOutgoingPacketSize + 1];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500704 size_t len = 0;
705 for (const auto& fragment : fragments) {
706 memcpy(buffer + len, fragment.fragment.data(), fragment.fragment.size());
707 len += fragment.fragment.size();
708 }
vasilvv0fc587f2019-09-06 13:33:08 -0700709 return std::make_unique<QuicEncryptedPacket>(buffer, len, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500710 }
711
712 void CheckFramingBoundaries(const PacketFragments& fragments,
713 QuicErrorCode error_code) {
714 std::unique_ptr<QuicEncryptedPacket> packet(
715 AssemblePacketFromFragments(fragments));
716 // Check all the various prefixes of |packet| for the expected
717 // parse error and error code.
718 for (size_t i = 0; i < packet->length(); ++i) {
vasilvvc48c8712019-03-11 13:38:16 -0700719 std::string expected_error;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500720 size_t len = 0;
721 for (const auto& fragment : fragments) {
722 len += fragment.fragment.size();
723 if (i < len) {
724 expected_error = fragment.error_if_missing;
725 break;
726 }
727 }
728
729 if (expected_error.empty())
730 continue;
731
732 CheckProcessingFails(*packet, i, expected_error, error_code);
733 }
734 }
735
736 void CheckProcessingFails(const QuicEncryptedPacket& packet,
737 size_t len,
vasilvvc48c8712019-03-11 13:38:16 -0700738 std::string expected_error,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500739 QuicErrorCode error_code) {
740 QuicEncryptedPacket encrypted(packet.data(), len, false);
741 EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
742 EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len;
743 EXPECT_EQ(error_code, framer_.error()) << "len: " << len;
744 }
745
746 void CheckProcessingFails(unsigned char* packet,
747 size_t len,
vasilvvc48c8712019-03-11 13:38:16 -0700748 std::string expected_error,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500749 QuicErrorCode error_code) {
750 QuicEncryptedPacket encrypted(AsChars(packet), len, false);
751 EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
752 EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len;
753 EXPECT_EQ(error_code, framer_.error()) << "len: " << len;
754 }
755
756 // Checks if the supplied string matches data in the supplied StreamFrame.
vasilvvc48c8712019-03-11 13:38:16 -0700757 void CheckStreamFrameData(std::string str, QuicStreamFrame* frame) {
758 EXPECT_EQ(str, std::string(frame->data_buffer, frame->data_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500759 }
760
761 void CheckCalculatePacketNumber(uint64_t expected_packet_number,
762 QuicPacketNumber last_packet_number) {
763 uint64_t wire_packet_number = expected_packet_number & kMask;
764 EXPECT_EQ(expected_packet_number,
765 QuicFramerPeer::CalculatePacketNumberFromWire(
766 &framer_, PACKET_4BYTE_PACKET_NUMBER, last_packet_number,
767 wire_packet_number))
768 << "last_packet_number: " << last_packet_number
769 << " wire_packet_number: " << wire_packet_number;
770 }
771
772 std::unique_ptr<QuicPacket> BuildDataPacket(const QuicPacketHeader& header,
773 const QuicFrames& frames) {
774 return BuildUnsizedDataPacket(&framer_, header, frames);
775 }
776
777 std::unique_ptr<QuicPacket> BuildDataPacket(const QuicPacketHeader& header,
778 const QuicFrames& frames,
779 size_t packet_size) {
780 return BuildUnsizedDataPacket(&framer_, header, frames, packet_size);
781 }
782
783 // N starts at 1.
784 QuicStreamId GetNthStreamid(QuicTransportVersion transport_version,
785 Perspective perspective,
786 bool bidirectional,
787 int n) {
788 if (bidirectional) {
789 return QuicUtils::GetFirstBidirectionalStreamId(transport_version,
790 perspective) +
791 ((n - 1) * QuicUtils::StreamIdDelta(transport_version));
792 }
793 // Unidirectional
794 return QuicUtils::GetFirstUnidirectionalStreamId(transport_version,
795 perspective) +
796 ((n - 1) * QuicUtils::StreamIdDelta(transport_version));
797 }
798
799 test::TestEncrypter* encrypter_;
800 test::TestDecrypter* decrypter_;
801 ParsedQuicVersion version_;
802 QuicTime start_;
803 QuicFramer framer_;
804 test::TestQuicVisitor visitor_;
805 SimpleBufferAllocator allocator_;
806};
807
808// Multiple test cases of QuicFramerTest use byte arrays to define packets for
809// testing, and these byte arrays contain the QUIC version. This macro explodes
810// the 32-bit version into four bytes in network order. Since it uses methods of
811// QuicFramerTest, it is only valid to use this in a QuicFramerTest.
rcha702be22019-08-30 15:20:12 -0700812#define QUIC_VERSION_BYTES \
813 GetQuicVersionByte(0), GetQuicVersionByte(1), GetQuicVersionByte(2), \
814 GetQuicVersionByte(3)
QUICHE teama6ef0a62019-03-07 20:34:33 -0500815
816// Run all framer tests with all supported versions of QUIC.
nharperf5e68452019-05-29 17:24:18 -0700817INSTANTIATE_TEST_SUITE_P(QuicFramerTests,
818 QuicFramerTest,
dschinazi98fc8d02019-09-17 23:34:49 -0700819 ::testing::ValuesIn(AllSupportedVersions()),
820 ::testing::PrintToStringParamName());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500821
822TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochStart) {
823 // A few quick manual sanity checks.
824 CheckCalculatePacketNumber(UINT64_C(1), QuicPacketNumber());
825 CheckCalculatePacketNumber(kEpoch + 1, QuicPacketNumber(kMask));
826 CheckCalculatePacketNumber(kEpoch, QuicPacketNumber(kMask));
827 for (uint64_t j = 0; j < 10; j++) {
828 CheckCalculatePacketNumber(j, QuicPacketNumber());
829 CheckCalculatePacketNumber(kEpoch - 1 - j, QuicPacketNumber());
830 }
831
832 // Cases where the last number was close to the start of the range.
833 for (QuicPacketNumber last = QuicPacketNumber(1); last < QuicPacketNumber(10);
834 last++) {
835 // Small numbers should not wrap (even if they're out of order).
836 for (uint64_t j = 0; j < 10; j++) {
837 CheckCalculatePacketNumber(j, last);
838 }
839
840 // Large numbers should not wrap either (because we're near 0 already).
841 for (uint64_t j = 0; j < 10; j++) {
842 CheckCalculatePacketNumber(kEpoch - 1 - j, last);
843 }
844 }
845}
846
847TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochEnd) {
848 // Cases where the last number was close to the end of the range
849 for (uint64_t i = 0; i < 10; i++) {
850 QuicPacketNumber last = QuicPacketNumber(kEpoch - i);
851
852 // Small numbers should wrap.
853 for (uint64_t j = 0; j < 10; j++) {
854 CheckCalculatePacketNumber(kEpoch + j, last);
855 }
856
857 // Large numbers should not (even if they're out of order).
858 for (uint64_t j = 0; j < 10; j++) {
859 CheckCalculatePacketNumber(kEpoch - 1 - j, last);
860 }
861 }
862}
863
864// Next check where we're in a non-zero epoch to verify we handle
865// reverse wrapping, too.
866TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearPrevEpoch) {
867 const uint64_t prev_epoch = 1 * kEpoch;
868 const uint64_t cur_epoch = 2 * kEpoch;
869 // Cases where the last number was close to the start of the range
870 for (uint64_t i = 0; i < 10; i++) {
871 QuicPacketNumber last = QuicPacketNumber(cur_epoch + i);
872 // Small number should not wrap (even if they're out of order).
873 for (uint64_t j = 0; j < 10; j++) {
874 CheckCalculatePacketNumber(cur_epoch + j, last);
875 }
876
877 // But large numbers should reverse wrap.
878 for (uint64_t j = 0; j < 10; j++) {
879 uint64_t num = kEpoch - 1 - j;
880 CheckCalculatePacketNumber(prev_epoch + num, last);
881 }
882 }
883}
884
885TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextEpoch) {
886 const uint64_t cur_epoch = 2 * kEpoch;
887 const uint64_t next_epoch = 3 * kEpoch;
888 // Cases where the last number was close to the end of the range
889 for (uint64_t i = 0; i < 10; i++) {
890 QuicPacketNumber last = QuicPacketNumber(next_epoch - 1 - i);
891
892 // Small numbers should wrap.
893 for (uint64_t j = 0; j < 10; j++) {
894 CheckCalculatePacketNumber(next_epoch + j, last);
895 }
896
897 // but large numbers should not (even if they're out of order).
898 for (uint64_t j = 0; j < 10; j++) {
899 uint64_t num = kEpoch - 1 - j;
900 CheckCalculatePacketNumber(cur_epoch + num, last);
901 }
902 }
903}
904
905TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextMax) {
906 const uint64_t max_number = std::numeric_limits<uint64_t>::max();
907 const uint64_t max_epoch = max_number & ~kMask;
908
909 // Cases where the last number was close to the end of the range
910 for (uint64_t i = 0; i < 10; i++) {
911 // Subtract 1, because the expected next packet number is 1 more than the
912 // last packet number.
913 QuicPacketNumber last = QuicPacketNumber(max_number - i - 1);
914
915 // Small numbers should not wrap, because they have nowhere to go.
916 for (uint64_t j = 0; j < 10; j++) {
917 CheckCalculatePacketNumber(max_epoch + j, last);
918 }
919
920 // Large numbers should not wrap either.
921 for (uint64_t j = 0; j < 10; j++) {
922 uint64_t num = kEpoch - 1 - j;
923 CheckCalculatePacketNumber(max_epoch + num, last);
924 }
925 }
926}
927
928TEST_P(QuicFramerTest, EmptyPacket) {
929 char packet[] = {0x00};
930 QuicEncryptedPacket encrypted(packet, 0, false);
931 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -0700932 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500933}
934
935TEST_P(QuicFramerTest, LargePacket) {
zhongyi546cc452019-04-12 15:27:49 -0700936 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500937 // clang-format off
dschinazie8d7fa72019-04-05 14:44:40 -0700938 unsigned char packet[kMaxIncomingPacketSize + 1] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500939 // public flags (8 byte connection_id)
940 0x28,
941 // connection_id
942 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
943 // packet number
944 0x78, 0x56, 0x34, 0x12,
945 // private flags
946 0x00,
947 };
dschinazie8d7fa72019-04-05 14:44:40 -0700948 unsigned char packet46[kMaxIncomingPacketSize + 1] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500949 // type (short header 4 byte packet number)
950 0x43,
951 // connection_id
952 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
953 // packet number
954 0x78, 0x56, 0x34, 0x12,
955 };
956 // clang-format on
957 unsigned char* p = packet;
958 size_t p_size = QUIC_ARRAYSIZE(packet);
fayang36825da2019-08-21 14:01:27 -0700959 if (framer_.transport_version() > QUIC_VERSION_43) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500960 p = packet46;
961 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500962 }
963
964 const size_t header_size = GetPacketHeaderSize(
965 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
966 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
967 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
968 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
969
dschinazie8d7fa72019-04-05 14:44:40 -0700970 memset(p + header_size, 0, kMaxIncomingPacketSize - header_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500971
972 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
dschinazie8d7fa72019-04-05 14:44:40 -0700973 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500974
975 ASSERT_TRUE(visitor_.header_.get());
976 // Make sure we've parsed the packet header, so we can send an error.
977 EXPECT_EQ(FramerTestConnectionId(),
978 visitor_.header_->destination_connection_id);
979 // Make sure the correct error is propagated.
bncf6f82b12019-10-30 07:01:01 -0700980 EXPECT_THAT(framer_.error(), IsError(QUIC_PACKET_TOO_LARGE));
dschinazie8d7fa72019-04-05 14:44:40 -0700981 EXPECT_EQ("Packet too large.", framer_.detailed_error());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500982}
983
984TEST_P(QuicFramerTest, PacketHeader) {
985 if (framer_.transport_version() > QUIC_VERSION_43) {
986 return;
987 }
988
989 // clang-format off
990 PacketFragments packet = {
991 // public flags (8 byte connection_id)
992 {"Unable to read public flags.",
993 {0x28}},
994 // connection_id
995 {"Unable to read ConnectionId.",
996 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
997 // packet number
998 {"Unable to read packet number.",
999 {0x12, 0x34, 0x56, 0x78}},
1000 };
1001 // clang-format on
1002
1003 PacketFragments& fragments = packet;
1004
1005 std::unique_ptr<QuicEncryptedPacket> encrypted(
1006 AssemblePacketFromFragments(fragments));
1007
1008 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001009 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001010 ASSERT_TRUE(visitor_.header_.get());
1011 EXPECT_EQ(FramerTestConnectionId(),
1012 visitor_.header_->destination_connection_id);
1013 EXPECT_FALSE(visitor_.header_->reset_flag);
1014 EXPECT_FALSE(visitor_.header_->version_flag);
1015 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1016
1017 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
fayangccbab732019-05-13 10:11:25 -07001018
1019 PacketHeaderFormat format;
fayange3f2f7b2019-09-19 17:01:57 -07001020 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
fayangccbab732019-05-13 10:11:25 -07001021 bool version_flag;
dschinazib42a8c52019-05-30 09:45:01 -07001022 QuicConnectionId destination_connection_id, source_connection_id;
fayangccbab732019-05-13 10:11:25 -07001023 QuicVersionLabel version_label;
1024 std::string detailed_error;
dschinazibf0413d2019-10-07 14:19:53 -07001025 bool retry_token_present, use_length_prefix;
1026 QuicStringPiece retry_token;
1027 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1028 const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1029 *encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1030 &version_flag, &use_length_prefix, &version_label, &parsed_version,
1031 &destination_connection_id, &source_connection_id, &retry_token_present,
1032 &retry_token, &detailed_error);
1033 EXPECT_FALSE(retry_token_present);
1034 EXPECT_FALSE(use_length_prefix);
bncf6f82b12019-10-30 07:01:01 -07001035 EXPECT_THAT(error_code, IsQuicNoError());
fayangccbab732019-05-13 10:11:25 -07001036 EXPECT_EQ(GOOGLE_QUIC_PACKET, format);
1037 EXPECT_FALSE(version_flag);
dschinazib42a8c52019-05-30 09:45:01 -07001038 EXPECT_EQ(kQuicDefaultConnectionIdLength, destination_connection_id.length());
fayangccbab732019-05-13 10:11:25 -07001039 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
dschinazib42a8c52019-05-30 09:45:01 -07001040 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001041}
1042
1043TEST_P(QuicFramerTest, LongPacketHeader) {
1044 // clang-format off
QUICHE teama6ef0a62019-03-07 20:34:33 -05001045 PacketFragments packet46 = {
dschinazibf0413d2019-10-07 14:19:53 -07001046 // type (long header with packet type ZERO_RTT)
dschinazi48ac9192019-07-31 00:07:26 -07001047 {"Unable to read first byte.",
dschinazibf0413d2019-10-07 14:19:53 -07001048 {0xD3}},
QUICHE teama6ef0a62019-03-07 20:34:33 -05001049 // version tag
1050 {"Unable to read protocol version.",
1051 {QUIC_VERSION_BYTES}},
1052 // connection_id length
1053 {"Unable to read ConnectionId length.",
1054 {0x50}},
1055 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001056 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001057 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1058 // packet number
1059 {"Unable to read packet number.",
1060 {0x12, 0x34, 0x56, 0x78}},
1061 };
1062 // clang-format on
1063
1064 if (framer_.transport_version() <= QUIC_VERSION_43 ||
1065 QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
1066 return;
1067 }
1068
dschinazibf0413d2019-10-07 14:19:53 -07001069 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001070 std::unique_ptr<QuicEncryptedPacket> encrypted(
fayang36825da2019-08-21 14:01:27 -07001071 AssemblePacketFromFragments(packet46));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001072
1073 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001074 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001075 ASSERT_TRUE(visitor_.header_.get());
1076 EXPECT_EQ(FramerTestConnectionId(),
1077 visitor_.header_->destination_connection_id);
1078 EXPECT_FALSE(visitor_.header_->reset_flag);
1079 EXPECT_TRUE(visitor_.header_->version_flag);
1080 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1081
fayang36825da2019-08-21 14:01:27 -07001082 CheckFramingBoundaries(packet46, QUIC_INVALID_PACKET_HEADER);
fayangccbab732019-05-13 10:11:25 -07001083
1084 PacketHeaderFormat format;
fayange3f2f7b2019-09-19 17:01:57 -07001085 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
fayangccbab732019-05-13 10:11:25 -07001086 bool version_flag;
dschinazib42a8c52019-05-30 09:45:01 -07001087 QuicConnectionId destination_connection_id, source_connection_id;
fayangccbab732019-05-13 10:11:25 -07001088 QuicVersionLabel version_label;
1089 std::string detailed_error;
dschinazibf0413d2019-10-07 14:19:53 -07001090 bool retry_token_present, use_length_prefix;
1091 QuicStringPiece retry_token;
1092 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1093 const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1094 *encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1095 &version_flag, &use_length_prefix, &version_label, &parsed_version,
1096 &destination_connection_id, &source_connection_id, &retry_token_present,
1097 &retry_token, &detailed_error);
bncf6f82b12019-10-30 07:01:01 -07001098 EXPECT_THAT(error_code, IsQuicNoError());
dschinazibf0413d2019-10-07 14:19:53 -07001099 EXPECT_EQ("", detailed_error);
1100 EXPECT_FALSE(retry_token_present);
1101 EXPECT_FALSE(use_length_prefix);
fayangccbab732019-05-13 10:11:25 -07001102 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1103 EXPECT_TRUE(version_flag);
dschinazib42a8c52019-05-30 09:45:01 -07001104 EXPECT_EQ(kQuicDefaultConnectionIdLength, destination_connection_id.length());
fayangccbab732019-05-13 10:11:25 -07001105 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
dschinazib42a8c52019-05-30 09:45:01 -07001106 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1107}
1108
1109TEST_P(QuicFramerTest, LongPacketHeaderWithBothConnectionIds) {
1110 if (framer_.transport_version() <= QUIC_VERSION_43) {
1111 // This test requires an IETF long header.
1112 return;
1113 }
dschinazib42a8c52019-05-30 09:45:01 -07001114 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
dschinazib42a8c52019-05-30 09:45:01 -07001115 // clang-format off
1116 unsigned char packet[] = {
1117 // public flags (long header with packet type ZERO_RTT_PROTECTED and
1118 // 4-byte packet number)
fayang36825da2019-08-21 14:01:27 -07001119 0xD3,
dschinazib42a8c52019-05-30 09:45:01 -07001120 // version
1121 QUIC_VERSION_BYTES,
1122 // connection ID lengths
1123 0x55,
1124 // destination connection ID
1125 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1126 // source connection ID
1127 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
dschinazibf0413d2019-10-07 14:19:53 -07001128 // packet number
1129 0x12, 0x34, 0x56, 0x00,
1130 // padding frame
1131 0x00,
1132 };
1133 unsigned char packet49[] = {
1134 // public flags (long header with packet type ZERO_RTT_PROTECTED and
1135 // 4-byte packet number)
1136 0xD3,
1137 // version
1138 QUIC_VERSION_BYTES,
1139 // destination connection ID length
1140 0x08,
1141 // destination connection ID
1142 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1143 // source connection ID length
1144 0x08,
1145 // source connection ID
1146 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
dschinazib42a8c52019-05-30 09:45:01 -07001147 // long header packet length
1148 0x05,
1149 // packet number
1150 0x12, 0x34, 0x56, 0x00,
1151 // padding frame
1152 0x00,
1153 };
1154 // clang-format on
1155
dschinazibf0413d2019-10-07 14:19:53 -07001156 unsigned char* p = packet;
1157 size_t p_length = QUIC_ARRAYSIZE(packet);
1158 if (framer_.transport_version() >= QUIC_VERSION_49) {
1159 p = packet49;
1160 p_length = QUIC_ARRAYSIZE(packet49);
1161 }
1162
1163 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
dschinazib42a8c52019-05-30 09:45:01 -07001164 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
fayange3f2f7b2019-09-19 17:01:57 -07001165 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
dschinazib42a8c52019-05-30 09:45:01 -07001166 bool version_flag = false;
1167 QuicConnectionId destination_connection_id, source_connection_id;
1168 QuicVersionLabel version_label = 0;
1169 std::string detailed_error = "";
dschinazibf0413d2019-10-07 14:19:53 -07001170 bool retry_token_present, use_length_prefix;
1171 QuicStringPiece retry_token;
1172 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1173 const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1174 encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1175 &version_flag, &use_length_prefix, &version_label, &parsed_version,
1176 &destination_connection_id, &source_connection_id, &retry_token_present,
1177 &retry_token, &detailed_error);
bncf6f82b12019-10-30 07:01:01 -07001178 EXPECT_THAT(error_code, IsQuicNoError());
dschinazibf0413d2019-10-07 14:19:53 -07001179 EXPECT_FALSE(retry_token_present);
1180 EXPECT_EQ(framer_.version().HasLengthPrefixedConnectionIds(),
1181 use_length_prefix);
dschinazib42a8c52019-05-30 09:45:01 -07001182 EXPECT_EQ("", detailed_error);
1183 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1184 EXPECT_TRUE(version_flag);
1185 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1186 EXPECT_EQ(FramerTestConnectionIdPlusOne(), source_connection_id);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001187}
1188
dschinazi243eabc2019-08-05 16:15:29 -07001189TEST_P(QuicFramerTest, ParsePublicHeader) {
dschinazi243eabc2019-08-05 16:15:29 -07001190 // clang-format off
1191 unsigned char packet[] = {
1192 // public flags (version included, 8-byte connection ID,
1193 // 4-byte packet number)
1194 0x29,
1195 // connection_id
1196 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1197 // version
1198 QUIC_VERSION_BYTES,
1199 // packet number
1200 0x12, 0x34, 0x56, 0x78,
1201 // padding frame
1202 0x00,
1203 };
fayang36825da2019-08-21 14:01:27 -07001204 unsigned char packet46[] = {
1205 // public flags (long header with packet type HANDSHAKE and
1206 // 4-byte packet number)
1207 0xE3,
1208 // version
1209 QUIC_VERSION_BYTES,
1210 // connection ID lengths
1211 0x50,
1212 // destination connection ID
1213 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1214 // long header packet length
1215 0x05,
1216 // packet number
1217 0x12, 0x34, 0x56, 0x78,
1218 // padding frame
1219 0x00,
dschinazi243eabc2019-08-05 16:15:29 -07001220 };
dschinazic73506e2019-09-20 13:26:46 -07001221 unsigned char packet49[] = {
dschinazi243eabc2019-08-05 16:15:29 -07001222 // public flags (long header with packet type HANDSHAKE and
1223 // 4-byte packet number)
1224 0xE3,
1225 // version
1226 QUIC_VERSION_BYTES,
1227 // destination connection ID length
1228 0x08,
1229 // destination connection ID
1230 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1231 // source connection ID length
1232 0x00,
1233 // long header packet length
1234 0x05,
1235 // packet number
1236 0x12, 0x34, 0x56, 0x78,
1237 // padding frame
1238 0x00,
1239 };
1240 // clang-format on
1241 unsigned char* p = packet;
1242 size_t p_length = QUIC_ARRAYSIZE(packet);
dschinazic73506e2019-09-20 13:26:46 -07001243 if (framer_.transport_version() >= QUIC_VERSION_49) {
1244 p = packet49;
1245 p_length = QUIC_ARRAYSIZE(packet49);
fayang36825da2019-08-21 14:01:27 -07001246 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
1247 p = packet46;
1248 p_length = QUIC_ARRAYSIZE(packet46);
dschinazi243eabc2019-08-05 16:15:29 -07001249 }
1250
1251 uint8_t first_byte = 0x33;
1252 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1253 bool version_present = false, has_length_prefix = false;
1254 QuicVersionLabel version_label = 0;
1255 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1256 QuicConnectionId destination_connection_id = EmptyQuicConnectionId(),
1257 source_connection_id = EmptyQuicConnectionId();
1258 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1259 QuicVariableLengthIntegerLength retry_token_length_length =
1260 VARIABLE_LENGTH_INTEGER_LENGTH_4;
1261 QuicStringPiece retry_token;
1262 std::string detailed_error = "foobar";
1263
1264 QuicDataReader reader(AsChars(p), p_length);
1265 const QuicErrorCode parse_error = QuicFramer::ParsePublicHeader(
1266 &reader, kQuicDefaultConnectionIdLength,
1267 /*ietf_format=*/
1268 VersionHasIetfInvariantHeader(framer_.transport_version()), &first_byte,
1269 &format, &version_present, &has_length_prefix, &version_label,
1270 &parsed_version, &destination_connection_id, &source_connection_id,
1271 &long_packet_type, &retry_token_length_length, &retry_token,
1272 &detailed_error);
bncf6f82b12019-10-30 07:01:01 -07001273 EXPECT_THAT(parse_error, IsQuicNoError());
dschinazi243eabc2019-08-05 16:15:29 -07001274 EXPECT_EQ("", detailed_error);
1275 EXPECT_EQ(p[0], first_byte);
1276 EXPECT_TRUE(version_present);
1277 EXPECT_EQ(framer_.version().HasLengthPrefixedConnectionIds(),
1278 has_length_prefix);
1279 EXPECT_EQ(CreateQuicVersionLabel(framer_.version()), version_label);
1280 EXPECT_EQ(framer_.version(), parsed_version);
1281 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1282 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1283 EXPECT_EQ(VARIABLE_LENGTH_INTEGER_LENGTH_0, retry_token_length_length);
1284 EXPECT_EQ(QuicStringPiece(), retry_token);
1285 if (VersionHasIetfInvariantHeader(framer_.transport_version())) {
1286 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1287 EXPECT_EQ(HANDSHAKE, long_packet_type);
1288 } else {
1289 EXPECT_EQ(GOOGLE_QUIC_PACKET, format);
1290 }
1291}
1292
dschinazi81eb4e02019-09-27 17:12:17 -07001293TEST_P(QuicFramerTest, ParsePublicHeaderProxBadSourceConnectionIdLength) {
1294 if (!framer_.version().HasLengthPrefixedConnectionIds()) {
1295 return;
1296 }
dschinazi81eb4e02019-09-27 17:12:17 -07001297 // clang-format off
1298 unsigned char packet[] = {
1299 // public flags (long header with packet type HANDSHAKE and
1300 // 4-byte packet number)
1301 0xE3,
1302 // version
1303 'P', 'R', 'O', 'X',
1304 // destination connection ID length
1305 0x08,
1306 // destination connection ID
1307 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1308 // source connection ID length (bogus)
1309 0xEE,
1310 // long header packet length
1311 0x05,
1312 // packet number
1313 0x12, 0x34, 0x56, 0x78,
1314 // padding frame
1315 0x00,
1316 };
1317 // clang-format on
1318 unsigned char* p = packet;
1319 size_t p_length = QUIC_ARRAYSIZE(packet);
1320
1321 uint8_t first_byte = 0x33;
1322 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1323 bool version_present = false, has_length_prefix = false;
1324 QuicVersionLabel version_label = 0;
1325 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1326 QuicConnectionId destination_connection_id = EmptyQuicConnectionId(),
1327 source_connection_id = EmptyQuicConnectionId();
1328 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1329 QuicVariableLengthIntegerLength retry_token_length_length =
1330 VARIABLE_LENGTH_INTEGER_LENGTH_4;
1331 QuicStringPiece retry_token;
1332 std::string detailed_error = "foobar";
1333
1334 QuicDataReader reader(AsChars(p), p_length);
1335 const QuicErrorCode parse_error = QuicFramer::ParsePublicHeader(
1336 &reader, kQuicDefaultConnectionIdLength,
1337 /*ietf_format=*/true, &first_byte, &format, &version_present,
1338 &has_length_prefix, &version_label, &parsed_version,
1339 &destination_connection_id, &source_connection_id, &long_packet_type,
1340 &retry_token_length_length, &retry_token, &detailed_error);
bncf6f82b12019-10-30 07:01:01 -07001341 EXPECT_THAT(parse_error, IsQuicNoError());
dschinazi81eb4e02019-09-27 17:12:17 -07001342 EXPECT_EQ("", detailed_error);
1343 EXPECT_EQ(p[0], first_byte);
1344 EXPECT_TRUE(version_present);
1345 EXPECT_TRUE(has_length_prefix);
1346 EXPECT_EQ(0x50524F58u, version_label); // "PROX"
1347 EXPECT_EQ(UnsupportedQuicVersion(), parsed_version);
1348 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1349 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1350 EXPECT_EQ(VARIABLE_LENGTH_INTEGER_LENGTH_0, retry_token_length_length);
1351 EXPECT_EQ(QuicStringPiece(), retry_token);
1352 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1353}
1354
dschinazi346b7ce2019-06-05 01:38:18 -07001355TEST_P(QuicFramerTest, ClientConnectionIdFromShortHeaderToClient) {
dschinazi346b7ce2019-06-05 01:38:18 -07001356 if (!framer_.version().SupportsClientConnectionIds()) {
1357 return;
1358 }
1359 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1360 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
1361 TestConnectionId(0x33));
1362 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1363 framer_.SetExpectedClientConnectionIdLength(kQuicDefaultConnectionIdLength);
1364 // clang-format off
1365 unsigned char packet[] = {
1366 // type (short header, 4 byte packet number)
1367 0x43,
1368 // connection_id
1369 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1370 // packet number
1371 0x13, 0x37, 0x42, 0x33,
1372 // padding frame
1373 0x00,
1374 };
1375 // clang-format on
1376 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
1377 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07001378 EXPECT_THAT(framer_.error(), IsQuicNoError());
dschinazi346b7ce2019-06-05 01:38:18 -07001379 EXPECT_EQ("", framer_.detailed_error());
1380 ASSERT_TRUE(visitor_.header_.get());
1381 EXPECT_EQ(FramerTestConnectionId(),
1382 visitor_.header_->destination_connection_id);
1383 EXPECT_EQ(TestConnectionId(0x33), visitor_.header_->source_connection_id);
1384}
1385
1386// In short header packets from client to server, the client connection ID
1387// is omitted, but the framer adds it to the header struct using its
1388// last serialized client connection ID. This test ensures that this
1389// mechanism behaves as expected.
1390TEST_P(QuicFramerTest, ClientConnectionIdFromShortHeaderToServer) {
dschinazi346b7ce2019-06-05 01:38:18 -07001391 if (!framer_.version().SupportsClientConnectionIds()) {
1392 return;
1393 }
1394 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1395 QuicFramerPeer::SetLastSerializedClientConnectionId(&framer_,
1396 TestConnectionId(0x33));
1397 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1398 // clang-format off
1399 unsigned char packet[] = {
1400 // type (short header, 4 byte packet number)
1401 0x43,
1402 // connection_id
1403 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1404 // packet number
1405 0x13, 0x37, 0x42, 0x33,
1406 // padding frame
1407 0x00,
1408 };
1409 // clang-format on
1410 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
1411 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07001412 EXPECT_THAT(framer_.error(), IsQuicNoError());
dschinazi346b7ce2019-06-05 01:38:18 -07001413 EXPECT_EQ("", framer_.detailed_error());
1414 ASSERT_TRUE(visitor_.header_.get());
1415 EXPECT_EQ(FramerTestConnectionId(),
1416 visitor_.header_->destination_connection_id);
1417 EXPECT_EQ(TestConnectionId(0x33), visitor_.header_->source_connection_id);
1418}
1419
QUICHE teama6ef0a62019-03-07 20:34:33 -05001420TEST_P(QuicFramerTest, PacketHeaderWith0ByteConnectionId) {
zhongyi546cc452019-04-12 15:27:49 -07001421 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
dschinazi7b9278c2019-05-20 07:36:21 -07001422 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
1423 FramerTestConnectionId());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001424 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1425
1426 // clang-format off
1427 PacketFragments packet = {
1428 // public flags (0 byte connection_id)
1429 {"Unable to read public flags.",
1430 {0x20}},
1431 // connection_id
1432 // packet number
1433 {"Unable to read packet number.",
1434 {0x12, 0x34, 0x56, 0x78}},
1435 };
1436
QUICHE teama6ef0a62019-03-07 20:34:33 -05001437 PacketFragments packet46 = {
1438 // type (short header, 4 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001439 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001440 {0x43}},
1441 // connection_id
1442 // packet number
1443 {"Unable to read packet number.",
1444 {0x12, 0x34, 0x56, 0x78}},
1445 };
nharper55fa6132019-05-07 19:37:21 -07001446
1447 PacketFragments packet_hp = {
1448 // type (short header, 4 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001449 {"Unable to read first byte.",
nharper55fa6132019-05-07 19:37:21 -07001450 {0x43}},
1451 // connection_id
1452 // packet number
1453 {"",
1454 {0x12, 0x34, 0x56, 0x78}},
1455 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001456 // clang-format on
1457
1458 PacketFragments& fragments =
nharper55fa6132019-05-07 19:37:21 -07001459 framer_.version().HasHeaderProtection()
1460 ? packet_hp
fayang36825da2019-08-21 14:01:27 -07001461 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
1462 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001463 std::unique_ptr<QuicEncryptedPacket> encrypted(
1464 AssemblePacketFromFragments(fragments));
1465 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001466 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001467 ASSERT_TRUE(visitor_.header_.get());
dschinazi5e1a7b22019-07-31 12:23:21 -07001468 EXPECT_EQ(FramerTestConnectionId(), visitor_.header_->source_connection_id);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001469 EXPECT_FALSE(visitor_.header_->reset_flag);
1470 EXPECT_FALSE(visitor_.header_->version_flag);
1471 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1472
1473 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1474}
1475
1476TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) {
zhongyi546cc452019-04-12 15:27:49 -07001477 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001478 // clang-format off
1479 PacketFragments packet = {
1480 // public flags (0 byte connection_id)
1481 {"Unable to read public flags.",
1482 {0x29}},
1483 // connection_id
1484 {"Unable to read ConnectionId.",
1485 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1486 // version tag
1487 {"Unable to read protocol version.",
1488 {QUIC_VERSION_BYTES}},
1489 // packet number
1490 {"Unable to read packet number.",
1491 {0x12, 0x34, 0x56, 0x78}},
1492 };
1493
QUICHE teama6ef0a62019-03-07 20:34:33 -05001494 PacketFragments packet46 = {
1495 // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1496 // packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001497 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001498 {0xD3}},
1499 // version tag
1500 {"Unable to read protocol version.",
1501 {QUIC_VERSION_BYTES}},
1502 // connection_id length
1503 {"Unable to read ConnectionId length.",
1504 {0x50}},
1505 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001506 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001507 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1508 // packet number
1509 {"Unable to read packet number.",
1510 {0x12, 0x34, 0x56, 0x78}},
1511 };
1512
dschinazic73506e2019-09-20 13:26:46 -07001513 PacketFragments packet49 = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001514 // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1515 // packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001516 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001517 {0xD3}},
1518 // version tag
1519 {"Unable to read protocol version.",
1520 {QUIC_VERSION_BYTES}},
dschinazi48ac9192019-07-31 00:07:26 -07001521 // destination connection ID length
1522 {"Unable to read destination connection ID.",
1523 {0x08}},
1524 // destination connection ID
1525 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001526 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
dschinazi48ac9192019-07-31 00:07:26 -07001527 // source connection ID length
1528 {"Unable to read source connection ID.",
1529 {0x00}},
QUICHE teama6ef0a62019-03-07 20:34:33 -05001530 // long header packet length
1531 {"Unable to read long header payload length.",
1532 {0x04}},
1533 // packet number
1534 {"Long header payload length longer than packet.",
1535 {0x12, 0x34, 0x56, 0x78}},
1536 };
1537 // clang-format on
1538
1539 PacketFragments& fragments =
dschinazic73506e2019-09-20 13:26:46 -07001540 framer_.transport_version() >= QUIC_VERSION_49
1541 ? packet49
fayang36825da2019-08-21 14:01:27 -07001542 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
1543 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001544 std::unique_ptr<QuicEncryptedPacket> encrypted(
1545 AssemblePacketFromFragments(fragments));
1546 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001547 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001548 ASSERT_TRUE(visitor_.header_.get());
1549 EXPECT_EQ(FramerTestConnectionId(),
1550 visitor_.header_->destination_connection_id);
1551 EXPECT_FALSE(visitor_.header_->reset_flag);
1552 EXPECT_TRUE(visitor_.header_->version_flag);
1553 EXPECT_EQ(GetParam(), visitor_.header_->version);
1554 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1555
1556 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1557}
1558
1559TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) {
zhongyi546cc452019-04-12 15:27:49 -07001560 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001561 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1562
1563 // clang-format off
1564 PacketFragments packet = {
1565 // public flags (8 byte connection_id and 4 byte packet number)
1566 {"Unable to read public flags.",
1567 {0x28}},
1568 // connection_id
1569 {"Unable to read ConnectionId.",
1570 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1571 // packet number
1572 {"Unable to read packet number.",
1573 {0x12, 0x34, 0x56, 0x78}},
1574 };
1575
QUICHE teama6ef0a62019-03-07 20:34:33 -05001576 PacketFragments packet46 = {
1577 // type (short header, 4 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001578 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001579 {0x43}},
1580 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001581 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001582 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1583 // packet number
1584 {"Unable to read packet number.",
1585 {0x12, 0x34, 0x56, 0x78}},
1586 };
nharper55fa6132019-05-07 19:37:21 -07001587
1588 PacketFragments packet_hp = {
1589 // type (short header, 4 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001590 {"Unable to read first byte.",
nharper55fa6132019-05-07 19:37:21 -07001591 {0x43}},
1592 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001593 {"Unable to read destination connection ID.",
nharper55fa6132019-05-07 19:37:21 -07001594 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1595 // packet number
1596 {"",
1597 {0x12, 0x34, 0x56, 0x78}},
1598 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001599 // clang-format on
1600
1601 PacketFragments& fragments =
nharper55fa6132019-05-07 19:37:21 -07001602 framer_.version().HasHeaderProtection()
1603 ? packet_hp
fayang36825da2019-08-21 14:01:27 -07001604 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
1605 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001606 std::unique_ptr<QuicEncryptedPacket> encrypted(
1607 AssemblePacketFromFragments(fragments));
1608 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001609 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001610 ASSERT_TRUE(visitor_.header_.get());
1611 EXPECT_EQ(FramerTestConnectionId(),
1612 visitor_.header_->destination_connection_id);
1613 EXPECT_FALSE(visitor_.header_->reset_flag);
1614 EXPECT_FALSE(visitor_.header_->version_flag);
1615 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1616
1617 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1618}
1619
1620TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) {
zhongyi546cc452019-04-12 15:27:49 -07001621 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001622 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1623
1624 // clang-format off
1625 PacketFragments packet = {
1626 // public flags (8 byte connection_id and 2 byte packet number)
1627 {"Unable to read public flags.",
1628 {0x18}},
1629 // connection_id
1630 {"Unable to read ConnectionId.",
1631 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1632 // packet number
1633 {"Unable to read packet number.",
1634 {0x56, 0x78}},
1635 };
1636
QUICHE teama6ef0a62019-03-07 20:34:33 -05001637 PacketFragments packet46 = {
1638 // type (short header, 2 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001639 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001640 {0x41}},
1641 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001642 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001643 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1644 // packet number
1645 {"Unable to read packet number.",
1646 {0x56, 0x78}},
1647 };
nharper55fa6132019-05-07 19:37:21 -07001648
1649 PacketFragments packet_hp = {
1650 // type (short header, 2 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001651 {"Unable to read first byte.",
nharper55fa6132019-05-07 19:37:21 -07001652 {0x41}},
1653 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001654 {"Unable to read destination connection ID.",
nharper55fa6132019-05-07 19:37:21 -07001655 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1656 // packet number
1657 {"",
1658 {0x56, 0x78}},
1659 // padding
1660 {"", {0x00, 0x00}},
1661 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001662 // clang-format on
1663
1664 PacketFragments& fragments =
nharper55fa6132019-05-07 19:37:21 -07001665 framer_.version().HasHeaderProtection()
1666 ? packet_hp
fayang36825da2019-08-21 14:01:27 -07001667 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
1668 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001669 std::unique_ptr<QuicEncryptedPacket> encrypted(
1670 AssemblePacketFromFragments(fragments));
nharper55fa6132019-05-07 19:37:21 -07001671 if (framer_.version().HasHeaderProtection()) {
1672 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001673 EXPECT_THAT(framer_.error(), IsQuicNoError());
nharper55fa6132019-05-07 19:37:21 -07001674 } else {
1675 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001676 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
nharper55fa6132019-05-07 19:37:21 -07001677 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001678 ASSERT_TRUE(visitor_.header_.get());
1679 EXPECT_EQ(FramerTestConnectionId(),
1680 visitor_.header_->destination_connection_id);
1681 EXPECT_FALSE(visitor_.header_->reset_flag);
1682 EXPECT_FALSE(visitor_.header_->version_flag);
1683 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1684 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1685
1686 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1687}
1688
1689TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) {
zhongyi546cc452019-04-12 15:27:49 -07001690 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001691 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1692
1693 // clang-format off
1694 PacketFragments packet = {
1695 // public flags (8 byte connection_id and 1 byte packet number)
1696 {"Unable to read public flags.",
1697 {0x08}},
1698 // connection_id
1699 {"Unable to read ConnectionId.",
1700 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1701 // packet number
1702 {"Unable to read packet number.",
1703 {0x78}},
1704 };
1705
QUICHE teama6ef0a62019-03-07 20:34:33 -05001706 PacketFragments packet46 = {
1707 // type (8 byte connection_id and 1 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001708 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001709 {0x40}},
1710 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001711 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001712 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1713 // packet number
1714 {"Unable to read packet number.",
1715 {0x78}},
1716 };
1717
nharper55fa6132019-05-07 19:37:21 -07001718 PacketFragments packet_hp = {
1719 // type (8 byte connection_id and 1 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001720 {"Unable to read first byte.",
nharper55fa6132019-05-07 19:37:21 -07001721 {0x40}},
1722 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001723 {"Unable to read destination connection ID.",
nharper55fa6132019-05-07 19:37:21 -07001724 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1725 // packet number
1726 {"",
1727 {0x78}},
1728 // padding
1729 {"", {0x00, 0x00, 0x00}},
1730 };
1731
QUICHE teama6ef0a62019-03-07 20:34:33 -05001732 // clang-format on
1733
1734 PacketFragments& fragments =
nharper55fa6132019-05-07 19:37:21 -07001735 framer_.version().HasHeaderProtection()
1736 ? packet_hp
fayang36825da2019-08-21 14:01:27 -07001737 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
1738 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001739 std::unique_ptr<QuicEncryptedPacket> encrypted(
1740 AssemblePacketFromFragments(fragments));
nharper55fa6132019-05-07 19:37:21 -07001741 if (framer_.version().HasHeaderProtection()) {
1742 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001743 EXPECT_THAT(framer_.error(), IsQuicNoError());
nharper55fa6132019-05-07 19:37:21 -07001744 } else {
1745 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001746 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
nharper55fa6132019-05-07 19:37:21 -07001747 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001748 ASSERT_TRUE(visitor_.header_.get());
1749 EXPECT_EQ(FramerTestConnectionId(),
1750 visitor_.header_->destination_connection_id);
1751 EXPECT_FALSE(visitor_.header_->reset_flag);
1752 EXPECT_FALSE(visitor_.header_->version_flag);
1753 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1754 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1755
1756 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1757}
1758
1759TEST_P(QuicFramerTest, PacketNumberDecreasesThenIncreases) {
zhongyi546cc452019-04-12 15:27:49 -07001760 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001761 // Test the case when a packet is received from the past and future packet
1762 // numbers are still calculated relative to the largest received packet.
1763 QuicPacketHeader header;
1764 header.destination_connection_id = FramerTestConnectionId();
1765 header.reset_flag = false;
1766 header.version_flag = false;
1767 header.packet_number = kPacketNumber - 2;
1768
1769 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
1770 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1771 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
1772 ASSERT_TRUE(data != nullptr);
1773
1774 QuicEncryptedPacket encrypted(data->data(), data->length(), false);
1775 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1776 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1777 ASSERT_TRUE(visitor_.header_.get());
1778 EXPECT_EQ(FramerTestConnectionId(),
1779 visitor_.header_->destination_connection_id);
1780 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1781 EXPECT_EQ(kPacketNumber - 2, visitor_.header_->packet_number);
1782
1783 // Receive a 1 byte packet number.
1784 header.packet_number = kPacketNumber;
1785 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1786 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1787 data = BuildDataPacket(header, frames);
1788 QuicEncryptedPacket encrypted1(data->data(), data->length(), false);
1789 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1790 EXPECT_TRUE(framer_.ProcessPacket(encrypted1));
1791 ASSERT_TRUE(visitor_.header_.get());
1792 EXPECT_EQ(FramerTestConnectionId(),
1793 visitor_.header_->destination_connection_id);
1794 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1795 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1796
1797 // Process a 2 byte packet number 256 packets ago.
1798 header.packet_number = kPacketNumber - 256;
1799 header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
1800 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1801 data = BuildDataPacket(header, frames);
1802 QuicEncryptedPacket encrypted2(data->data(), data->length(), false);
1803 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1804 EXPECT_TRUE(framer_.ProcessPacket(encrypted2));
1805 ASSERT_TRUE(visitor_.header_.get());
1806 EXPECT_EQ(FramerTestConnectionId(),
1807 visitor_.header_->destination_connection_id);
1808 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1809 EXPECT_EQ(kPacketNumber - 256, visitor_.header_->packet_number);
1810
1811 // Process another 1 byte packet number and ensure it works.
1812 header.packet_number = kPacketNumber - 1;
1813 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1814 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1815 data = BuildDataPacket(header, frames);
1816 QuicEncryptedPacket encrypted3(data->data(), data->length(), false);
1817 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1818 EXPECT_TRUE(framer_.ProcessPacket(encrypted3));
1819 ASSERT_TRUE(visitor_.header_.get());
1820 EXPECT_EQ(FramerTestConnectionId(),
1821 visitor_.header_->destination_connection_id);
1822 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1823 EXPECT_EQ(kPacketNumber - 1, visitor_.header_->packet_number);
1824}
1825
1826TEST_P(QuicFramerTest, PacketWithDiversificationNonce) {
zhongyi546cc452019-04-12 15:27:49 -07001827 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001828 // clang-format off
1829 unsigned char packet[] = {
1830 // public flags: includes nonce flag
1831 0x2C,
1832 // connection_id
1833 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1834 // nonce
1835 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1836 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1837 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1838 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1839 // packet number
1840 0x12, 0x34, 0x56, 0x78,
1841
1842 // frame type (padding)
1843 0x00,
1844 0x00, 0x00, 0x00, 0x00
1845 };
1846
QUICHE teama6ef0a62019-03-07 20:34:33 -05001847 unsigned char packet46[] = {
1848 // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1849 // number.
1850 0xD0,
1851 // version tag
1852 QUIC_VERSION_BYTES,
1853 // connection_id length
1854 0x05,
1855 // connection_id
1856 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1857 // packet number
1858 0x78,
1859 // nonce
1860 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1861 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1862 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1863 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1864
1865 // frame type (padding)
1866 0x00,
1867 0x00, 0x00, 0x00, 0x00
1868 };
1869
dschinazic73506e2019-09-20 13:26:46 -07001870 unsigned char packet49[] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001871 // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1872 // number.
1873 0xD0,
1874 // version tag
1875 QUIC_VERSION_BYTES,
dschinazi48ac9192019-07-31 00:07:26 -07001876 // destination connection ID length
1877 0x00,
1878 // source connection ID length
1879 0x08,
1880 // source connection ID
QUICHE teama6ef0a62019-03-07 20:34:33 -05001881 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1882 // long header packet length
1883 0x26,
1884 // packet number
1885 0x78,
1886 // nonce
1887 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1888 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1889 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1890 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1891
1892 // frame type (padding)
1893 0x00,
1894 0x00, 0x00, 0x00, 0x00
1895 };
1896 // clang-format on
1897
1898 if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
1899 return;
1900 }
1901
1902 unsigned char* p = packet;
1903 size_t p_size = QUIC_ARRAYSIZE(packet);
dschinazic73506e2019-09-20 13:26:46 -07001904 if (framer_.transport_version() >= QUIC_VERSION_49) {
1905 p = packet49;
1906 p_size = QUIC_ARRAYSIZE(packet49);
fayang36825da2019-08-21 14:01:27 -07001907 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001908 p = packet46;
1909 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001910 }
1911
1912 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1913 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1914 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1915 ASSERT_TRUE(visitor_.header_->nonce != nullptr);
1916 for (char i = 0; i < 32; ++i) {
1917 EXPECT_EQ(i, (*visitor_.header_->nonce)[static_cast<size_t>(i)]);
1918 }
1919 EXPECT_EQ(1u, visitor_.padding_frames_.size());
1920 EXPECT_EQ(5, visitor_.padding_frames_[0]->num_padding_bytes);
1921}
1922
1923TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) {
1924 // clang-format off
1925 unsigned char packet[] = {
1926 // public flags (8 byte connection_id, version flag and an unknown flag)
1927 0x29,
1928 // connection_id
1929 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1930 // version tag
1931 'Q', '0', '0', '0',
1932 // packet number
1933 0x12, 0x34, 0x56, 0x78,
1934
1935 // frame type (padding frame)
1936 0x00,
1937 0x00, 0x00, 0x00, 0x00
1938 };
1939
fayang36825da2019-08-21 14:01:27 -07001940 unsigned char packet46[] = {
nharper55fa6132019-05-07 19:37:21 -07001941 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
1942 0xD3,
1943 // version tag
1944 'Q', '0', '0', '0',
1945 // connection_id length
1946 0x50,
1947 // connection_id
1948 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1949 // packet number
1950 0x12, 0x34, 0x56, 0x78,
1951
1952 // frame type (padding frame)
1953 0x00,
1954 0x00, 0x00, 0x00, 0x00
1955 };
dschinazi48ac9192019-07-31 00:07:26 -07001956
dschinazic73506e2019-09-20 13:26:46 -07001957 unsigned char packet49[] = {
dschinazi48ac9192019-07-31 00:07:26 -07001958 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
1959 0xD3,
1960 // version tag
1961 'Q', '0', '0', '0',
1962 // destination connection ID length
1963 0x08,
1964 // destination connection ID
1965 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1966 // source connection ID length
1967 0x00,
1968 // packet number
1969 0x12, 0x34, 0x56, 0x78,
1970
1971 // frame type (padding frame)
1972 0x00,
1973 0x00, 0x00, 0x00, 0x00
1974 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001975 // clang-format on
1976
nharper55fa6132019-05-07 19:37:21 -07001977 unsigned char* p = packet;
1978 size_t p_size = QUIC_ARRAYSIZE(packet);
dschinazic73506e2019-09-20 13:26:46 -07001979 if (framer_.transport_version() >= QUIC_VERSION_49) {
1980 p = packet49;
1981 p_size = QUIC_ARRAYSIZE(packet49);
fayang36825da2019-08-21 14:01:27 -07001982 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
1983 p = packet46;
1984 p_size = QUIC_ARRAYSIZE(packet46);
nharper55fa6132019-05-07 19:37:21 -07001985 }
1986 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001987 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07001988 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001989 ASSERT_TRUE(visitor_.header_.get());
1990 EXPECT_EQ(0, visitor_.frame_count_);
1991 EXPECT_EQ(1, visitor_.version_mismatch_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001992}
1993
1994TEST_P(QuicFramerTest, PaddingFrame) {
zhongyi546cc452019-04-12 15:27:49 -07001995 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001996 // clang-format off
1997 unsigned char packet[] = {
1998 // public flags (8 byte connection_id)
1999 0x28,
2000 // connection_id
2001 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2002 // packet number
2003 0x12, 0x34, 0x56, 0x78,
2004
2005 // paddings
2006 0x00, 0x00,
2007 // frame type (stream frame with fin)
2008 0xFF,
2009 // stream id
2010 0x01, 0x02, 0x03, 0x04,
2011 // offset
2012 0x3A, 0x98, 0xFE, 0xDC,
2013 0x32, 0x10, 0x76, 0x54,
2014 // data length
2015 0x00, 0x0c,
2016 // data
2017 'h', 'e', 'l', 'l',
2018 'o', ' ', 'w', 'o',
2019 'r', 'l', 'd', '!',
2020 // paddings
2021 0x00, 0x00,
2022 };
2023
QUICHE teama6ef0a62019-03-07 20:34:33 -05002024 unsigned char packet46[] = {
2025 // type (short header, 4 byte packet number)
2026 0x43,
2027 // connection_id
2028 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2029 // packet number
2030 0x12, 0x34, 0x56, 0x78,
2031
2032 // paddings
2033 0x00, 0x00,
2034 // frame type (stream frame with fin)
2035 0xFF,
2036 // stream id
2037 0x01, 0x02, 0x03, 0x04,
2038 // offset
2039 0x3A, 0x98, 0xFE, 0xDC,
2040 0x32, 0x10, 0x76, 0x54,
2041 // data length
2042 0x00, 0x0c,
2043 // data
2044 'h', 'e', 'l', 'l',
2045 'o', ' ', 'w', 'o',
2046 'r', 'l', 'd', '!',
2047 // paddings
2048 0x00, 0x00,
2049 };
2050
2051 unsigned char packet99[] = {
2052 // type (short header, 4 byte packet number)
2053 0x43,
2054 // connection_id
2055 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2056 // packet number
2057 0x12, 0x34, 0x56, 0x78,
2058
2059 // paddings
2060 0x00, 0x00,
2061 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
2062 0x08 | 0x01 | 0x02 | 0x04,
2063
2064 // stream id
2065 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
2066 // offset
2067 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2068 0x32, 0x10, 0x76, 0x54,
2069 // data length
2070 kVarInt62OneByte + 0x0c,
2071 // data
2072 'h', 'e', 'l', 'l',
2073 'o', ' ', 'w', 'o',
2074 'r', 'l', 'd', '!',
2075 // paddings
2076 0x00, 0x00,
2077 };
2078 // clang-format on
2079
2080 unsigned char* p = packet;
2081 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07002082 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002083 p = packet99;
2084 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07002085 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002086 p = packet46;
2087 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002088 }
2089
2090 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
2091 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07002092 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002093 ASSERT_TRUE(visitor_.header_.get());
2094 EXPECT_TRUE(CheckDecryption(
2095 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2096 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2097
2098 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2099 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2100 EXPECT_EQ(2u, visitor_.padding_frames_.size());
2101 EXPECT_EQ(2, visitor_.padding_frames_[0]->num_padding_bytes);
2102 EXPECT_EQ(2, visitor_.padding_frames_[1]->num_padding_bytes);
2103 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2104 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2105 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2106 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2107}
2108
2109TEST_P(QuicFramerTest, StreamFrame) {
zhongyi546cc452019-04-12 15:27:49 -07002110 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002111 // clang-format off
2112 PacketFragments packet = {
2113 // public flags (8 byte connection_id)
2114 {"",
2115 {0x28}},
2116 // connection_id
2117 {"",
2118 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2119 // packet number
2120 {"",
2121 {0x12, 0x34, 0x56, 0x78}},
2122 // frame type (stream frame with fin)
2123 {"",
2124 {0xFF}},
2125 // stream id
2126 {"Unable to read stream_id.",
2127 {0x01, 0x02, 0x03, 0x04}},
2128 // offset
2129 {"Unable to read offset.",
2130 {0x3A, 0x98, 0xFE, 0xDC,
2131 0x32, 0x10, 0x76, 0x54}},
2132 {"Unable to read frame data.",
2133 {
2134 // data length
2135 0x00, 0x0c,
2136 // data
2137 'h', 'e', 'l', 'l',
2138 'o', ' ', 'w', 'o',
2139 'r', 'l', 'd', '!'}},
2140 };
2141
QUICHE teama6ef0a62019-03-07 20:34:33 -05002142 PacketFragments packet46 = {
2143 // type (short header, 4 byte packet number)
2144 {"",
2145 {0x43}},
2146 // connection_id
2147 {"",
2148 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2149 // packet number
2150 {"",
2151 {0x12, 0x34, 0x56, 0x78}},
2152 // frame type (stream frame with fin)
2153 {"",
2154 {0xFF}},
2155 // stream id
2156 {"Unable to read stream_id.",
2157 {0x01, 0x02, 0x03, 0x04}},
2158 // offset
2159 {"Unable to read offset.",
2160 {0x3A, 0x98, 0xFE, 0xDC,
2161 0x32, 0x10, 0x76, 0x54}},
2162 {"Unable to read frame data.",
2163 {
2164 // data length
2165 0x00, 0x0c,
2166 // data
2167 'h', 'e', 'l', 'l',
2168 'o', ' ', 'w', 'o',
2169 'r', 'l', 'd', '!'}},
2170 };
2171
2172 PacketFragments packet99 = {
2173 // type (short header, 4 byte packet number)
2174 {"",
2175 {0x43}},
2176 // connection_id
2177 {"",
2178 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2179 // packet number
2180 {"",
2181 {0x12, 0x34, 0x56, 0x78}},
2182 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
2183 {"",
2184 { 0x08 | 0x01 | 0x02 | 0x04 }},
2185 // stream id
2186 {"Unable to read stream_id.",
2187 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
2188 // offset
2189 {"Unable to read stream data offset.",
2190 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2191 0x32, 0x10, 0x76, 0x54}},
2192 // data length
2193 {"Unable to read stream data length.",
2194 {kVarInt62OneByte + 0x0c}},
2195 // data
2196 {"Unable to read frame data.",
2197 { 'h', 'e', 'l', 'l',
2198 'o', ' ', 'w', 'o',
2199 'r', 'l', 'd', '!'}},
2200 };
2201 // clang-format on
2202
2203 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07002204 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05002205 ? packet99
fayang36825da2019-08-21 14:01:27 -07002206 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
2207 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002208 std::unique_ptr<QuicEncryptedPacket> encrypted(
2209 AssemblePacketFromFragments(fragments));
2210 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2211
bncf6f82b12019-10-30 07:01:01 -07002212 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002213 ASSERT_TRUE(visitor_.header_.get());
2214 EXPECT_TRUE(CheckDecryption(
2215 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2216 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2217
2218 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2219 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2220 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2221 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2222 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2223 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2224
2225 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2226}
2227
2228// Test an empty (no data) stream frame.
2229TEST_P(QuicFramerTest, EmptyStreamFrame) {
2230 // Only the IETF QUIC spec explicitly says that empty
2231 // stream frames are supported.
fkastenholz305e1732019-06-18 05:01:22 -07002232 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002233 return;
2234 }
zhongyi546cc452019-04-12 15:27:49 -07002235 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002236 // clang-format off
2237 PacketFragments packet = {
2238 // type (short header, 4 byte packet number)
2239 {"",
2240 {0x43}},
2241 // connection_id
2242 {"",
2243 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2244 // packet number
2245 {"",
2246 {0x12, 0x34, 0x56, 0x78}},
2247 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
2248 {"",
2249 { 0x08 | 0x01 | 0x02 | 0x04 }},
2250 // stream id
2251 {"Unable to read stream_id.",
2252 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
2253 // offset
2254 {"Unable to read stream data offset.",
2255 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2256 0x32, 0x10, 0x76, 0x54}},
2257 // data length
2258 {"Unable to read stream data length.",
2259 {kVarInt62OneByte + 0x00}},
2260 };
2261 // clang-format on
2262
2263 std::unique_ptr<QuicEncryptedPacket> encrypted(
2264 AssemblePacketFromFragments(packet));
2265 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2266
bncf6f82b12019-10-30 07:01:01 -07002267 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002268 ASSERT_TRUE(visitor_.header_.get());
2269 EXPECT_TRUE(CheckDecryption(
2270 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2271 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2272
2273 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2274 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2275 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2276 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2277 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2278 EXPECT_EQ(visitor_.stream_frames_[0].get()->data_length, 0u);
2279
2280 CheckFramingBoundaries(packet, QUIC_INVALID_STREAM_DATA);
2281}
2282
2283TEST_P(QuicFramerTest, MissingDiversificationNonce) {
QUICHE team8e2e4532019-03-14 14:37:56 -07002284 if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
2285 // TLS does not use diversification nonces.
2286 return;
2287 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002288 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002289 decrypter_ = new test::TestDecrypter();
zhongyi546cc452019-04-12 15:27:49 -07002290 if (framer_.version().KnowsWhichDecrypterToUse()) {
vasilvv0fc587f2019-09-06 13:33:08 -07002291 framer_.InstallDecrypter(
2292 ENCRYPTION_INITIAL,
2293 std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07002294 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
2295 std::unique_ptr<QuicDecrypter>(decrypter_));
2296 } else {
vasilvv0fc587f2019-09-06 13:33:08 -07002297 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
2298 Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07002299 framer_.SetAlternativeDecrypter(
2300 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
2301 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002302
2303 // clang-format off
2304 unsigned char packet[] = {
2305 // public flags (8 byte connection_id)
2306 0x28,
2307 // connection_id
2308 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2309 // packet number
2310 0x12, 0x34, 0x56, 0x78,
QUICHE team8e2e4532019-03-14 14:37:56 -07002311 // padding frame
2312 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002313 };
2314
QUICHE team8e2e4532019-03-14 14:37:56 -07002315 unsigned char packet46[] = {
2316 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2317 0xD3,
2318 // version tag
2319 QUIC_VERSION_BYTES,
2320 // connection_id length
2321 0x05,
2322 // connection_id
2323 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2324 // packet number
2325 0x12, 0x34, 0x56, 0x78,
2326 // padding frame
2327 0x00,
2328 };
2329
dschinazic73506e2019-09-20 13:26:46 -07002330 unsigned char packet49[] = {
QUICHE team8e2e4532019-03-14 14:37:56 -07002331 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2332 0xD3,
2333 // version tag
2334 QUIC_VERSION_BYTES,
dschinazi48ac9192019-07-31 00:07:26 -07002335 // destination connection ID length
2336 0x00,
2337 // source connection ID length
2338 0x08,
2339 // source connection ID
QUICHE team8e2e4532019-03-14 14:37:56 -07002340 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2341 // IETF long header payload length
2342 0x05,
2343 // packet number
2344 0x12, 0x34, 0x56, 0x78,
2345 // padding frame
2346 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002347 };
2348 // clang-format on
2349
2350 unsigned char* p = packet;
QUICHE team8e2e4532019-03-14 14:37:56 -07002351 size_t p_length = QUIC_ARRAYSIZE(packet);
dschinazic73506e2019-09-20 13:26:46 -07002352 if (framer_.transport_version() >= QUIC_VERSION_49) {
2353 p = packet49;
2354 p_length = QUIC_ARRAYSIZE(packet49);
fayangf36e29d2019-06-06 14:03:40 -07002355 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE team8e2e4532019-03-14 14:37:56 -07002356 p = packet46;
2357 p_length = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002358 }
QUICHE team8e2e4532019-03-14 14:37:56 -07002359 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002360 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
nharper55fa6132019-05-07 19:37:21 -07002361 if (framer_.version().HasHeaderProtection()) {
bncf6f82b12019-10-30 07:01:01 -07002362 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
nharper55fa6132019-05-07 19:37:21 -07002363 EXPECT_EQ("Unable to decrypt header protection.", framer_.detailed_error());
fayang36825da2019-08-21 14:01:27 -07002364 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002365 // Cannot read diversification nonce.
bncf6f82b12019-10-30 07:01:01 -07002366 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
QUICHE team8e2e4532019-03-14 14:37:56 -07002367 EXPECT_EQ("Unable to read nonce.", framer_.detailed_error());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002368 } else {
bncf6f82b12019-10-30 07:01:01 -07002369 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002370 }
2371}
2372
2373TEST_P(QuicFramerTest, StreamFrame3ByteStreamId) {
2374 if (framer_.transport_version() > QUIC_VERSION_43) {
2375 // This test is nonsensical for IETF Quic.
2376 return;
2377 }
2378 // clang-format off
2379 PacketFragments packet = {
2380 // public flags (8 byte connection_id)
2381 {"",
2382 {0x28}},
2383 // connection_id
2384 {"",
2385 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2386 // packet number
2387 {"",
2388 {0x12, 0x34, 0x56, 0x78}},
2389 // frame type (stream frame with fin)
2390 {"",
2391 {0xFE}},
2392 // stream id
2393 {"Unable to read stream_id.",
2394 {0x02, 0x03, 0x04}},
2395 // offset
2396 {"Unable to read offset.",
2397 {0x3A, 0x98, 0xFE, 0xDC,
2398 0x32, 0x10, 0x76, 0x54}},
2399 {"Unable to read frame data.",
2400 {
2401 // data length
2402 0x00, 0x0c,
2403 // data
2404 'h', 'e', 'l', 'l',
2405 'o', ' ', 'w', 'o',
2406 'r', 'l', 'd', '!'}},
2407 };
2408 // clang-format on
2409
2410 PacketFragments& fragments = packet;
2411 std::unique_ptr<QuicEncryptedPacket> encrypted(
2412 AssemblePacketFromFragments(fragments));
2413 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2414
bncf6f82b12019-10-30 07:01:01 -07002415 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002416 ASSERT_TRUE(visitor_.header_.get());
2417 EXPECT_TRUE(CheckDecryption(
2418 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2419 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2420
2421 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2422 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2423 // Stream ID should be the last 3 bytes of kStreamId.
2424 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2425 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2426 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2427 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2428
2429 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2430}
2431
2432TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) {
zhongyi546cc452019-04-12 15:27:49 -07002433 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002434 // clang-format off
2435 PacketFragments packet = {
2436 // public flags (8 byte connection_id)
2437 {"",
2438 {0x28}},
2439 // connection_id
2440 {"",
2441 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2442 // packet number
2443 {"",
2444 {0x12, 0x34, 0x56, 0x78}},
2445 // frame type (stream frame with fin)
2446 {"",
2447 {0xFD}},
2448 // stream id
2449 {"Unable to read stream_id.",
2450 {0x03, 0x04}},
2451 // offset
2452 {"Unable to read offset.",
2453 {0x3A, 0x98, 0xFE, 0xDC,
2454 0x32, 0x10, 0x76, 0x54}},
2455 {"Unable to read frame data.",
2456 {
2457 // data length
2458 0x00, 0x0c,
2459 // data
2460 'h', 'e', 'l', 'l',
2461 'o', ' ', 'w', 'o',
2462 'r', 'l', 'd', '!'}},
2463 };
2464
QUICHE teama6ef0a62019-03-07 20:34:33 -05002465 PacketFragments packet46 = {
2466 // type (short header, 4 byte packet number)
2467 {"",
2468 {0x43}},
2469 // connection_id
2470 {"",
2471 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2472 // packet number
2473 {"",
2474 {0x12, 0x34, 0x56, 0x78}},
2475 // frame type (stream frame with fin)
2476 {"",
2477 {0xFD}},
2478 // stream id
2479 {"Unable to read stream_id.",
2480 {0x03, 0x04}},
2481 // offset
2482 {"Unable to read offset.",
2483 {0x3A, 0x98, 0xFE, 0xDC,
2484 0x32, 0x10, 0x76, 0x54}},
2485 {"Unable to read frame data.",
2486 {
2487 // data length
2488 0x00, 0x0c,
2489 // data
2490 'h', 'e', 'l', 'l',
2491 'o', ' ', 'w', 'o',
2492 'r', 'l', 'd', '!'}},
2493 };
2494
2495 PacketFragments packet99 = {
2496 // type (short header, 4 byte packet number)
2497 {"",
2498 {0x43}},
2499 // connection_id
2500 {"",
2501 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2502 // packet number
2503 {"",
2504 {0x12, 0x34, 0x56, 0x78}},
2505 // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2506 {"",
2507 {0x08 | 0x01 | 0x02 | 0x04}},
2508 // stream id
2509 {"Unable to read stream_id.",
2510 {kVarInt62TwoBytes + 0x03, 0x04}},
2511 // offset
2512 {"Unable to read stream data offset.",
2513 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2514 0x32, 0x10, 0x76, 0x54}},
2515 // data length
2516 {"Unable to read stream data length.",
2517 {kVarInt62OneByte + 0x0c}},
2518 // data
2519 {"Unable to read frame data.",
2520 { 'h', 'e', 'l', 'l',
2521 'o', ' ', 'w', 'o',
2522 'r', 'l', 'd', '!'}},
2523 };
2524 // clang-format on
2525
2526 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07002527 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05002528 ? packet99
fayang36825da2019-08-21 14:01:27 -07002529 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
2530 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002531 std::unique_ptr<QuicEncryptedPacket> encrypted(
2532 AssemblePacketFromFragments(fragments));
2533 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2534
bncf6f82b12019-10-30 07:01:01 -07002535 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002536 ASSERT_TRUE(visitor_.header_.get());
2537 EXPECT_TRUE(CheckDecryption(
2538 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2539 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2540
2541 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2542 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2543 // Stream ID should be the last 2 bytes of kStreamId.
2544 EXPECT_EQ(0x0000FFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2545 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2546 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2547 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2548
2549 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2550}
2551
2552TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) {
zhongyi546cc452019-04-12 15:27:49 -07002553 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002554 // clang-format off
2555 PacketFragments packet = {
2556 // public flags (8 byte connection_id)
2557 {"",
2558 {0x28}},
2559 // connection_id
2560 {"",
2561 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2562 // packet number
2563 {"",
2564 {0x12, 0x34, 0x56, 0x78}},
2565 // frame type (stream frame with fin)
2566 {"",
2567 {0xFC}},
2568 // stream id
2569 {"Unable to read stream_id.",
2570 {0x04}},
2571 // offset
2572 {"Unable to read offset.",
2573 {0x3A, 0x98, 0xFE, 0xDC,
2574 0x32, 0x10, 0x76, 0x54}},
2575 {"Unable to read frame data.",
2576 {
2577 // data length
2578 0x00, 0x0c,
2579 // data
2580 'h', 'e', 'l', 'l',
2581 'o', ' ', 'w', 'o',
2582 'r', 'l', 'd', '!'}},
2583 };
2584
QUICHE teama6ef0a62019-03-07 20:34:33 -05002585 PacketFragments packet46 = {
2586 // type (short header, 4 byte packet number)
2587 {"",
2588 {0x43}},
2589 // connection_id
2590 {"",
2591 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2592 // packet number
2593 {"",
2594 {0x12, 0x34, 0x56, 0x78}},
2595 // frame type (stream frame with fin)
2596 {"",
2597 {0xFC}},
2598 // stream id
2599 {"Unable to read stream_id.",
2600 {0x04}},
2601 // offset
2602 {"Unable to read offset.",
2603 {0x3A, 0x98, 0xFE, 0xDC,
2604 0x32, 0x10, 0x76, 0x54}},
2605 {"Unable to read frame data.",
2606 {
2607 // data length
2608 0x00, 0x0c,
2609 // data
2610 'h', 'e', 'l', 'l',
2611 'o', ' ', 'w', 'o',
2612 'r', 'l', 'd', '!'}},
2613 };
2614
2615 PacketFragments packet99 = {
2616 // type (short header, 4 byte packet number)
2617 {"",
2618 {0x43}},
2619 // connection_id
2620 {"",
2621 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2622 // packet number
2623 {"",
2624 {0x12, 0x34, 0x56, 0x78}},
2625 // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2626 {"",
2627 {0x08 | 0x01 | 0x02 | 0x04}},
2628 // stream id
2629 {"Unable to read stream_id.",
2630 {kVarInt62OneByte + 0x04}},
2631 // offset
2632 {"Unable to read stream data offset.",
2633 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2634 0x32, 0x10, 0x76, 0x54}},
2635 // data length
2636 {"Unable to read stream data length.",
2637 {kVarInt62OneByte + 0x0c}},
2638 // data
2639 {"Unable to read frame data.",
2640 { 'h', 'e', 'l', 'l',
2641 'o', ' ', 'w', 'o',
2642 'r', 'l', 'd', '!'}},
2643 };
2644 // clang-format on
2645
2646 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07002647 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05002648 ? packet99
fayang36825da2019-08-21 14:01:27 -07002649 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
2650 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002651 std::unique_ptr<QuicEncryptedPacket> encrypted(
2652 AssemblePacketFromFragments(fragments));
2653 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2654
bncf6f82b12019-10-30 07:01:01 -07002655 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002656 ASSERT_TRUE(visitor_.header_.get());
2657 EXPECT_TRUE(CheckDecryption(
2658 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2659 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2660
2661 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2662 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2663 // Stream ID should be the last 1 byte of kStreamId.
2664 EXPECT_EQ(0x000000FF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2665 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2666 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2667 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2668
2669 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2670}
2671
2672TEST_P(QuicFramerTest, StreamFrameWithVersion) {
fkastenholz305e1732019-06-18 05:01:22 -07002673 // If IETF frames are in use then we must also have the IETF
2674 // header invariants.
2675 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
2676 DCHECK(VersionHasIetfInvariantHeader(framer_.transport_version()));
2677 }
2678
zhongyi546cc452019-04-12 15:27:49 -07002679 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002680 // clang-format off
2681 PacketFragments packet = {
2682 // public flags (version, 8 byte connection_id)
2683 {"",
2684 {0x29}},
2685 // connection_id
2686 {"",
2687 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2688 // version tag
2689 {"",
2690 {QUIC_VERSION_BYTES}},
2691 // packet number
2692 {"",
2693 {0x12, 0x34, 0x56, 0x78}},
2694 // frame type (stream frame with fin)
2695 {"",
2696 {0xFE}},
2697 // stream id
2698 {"Unable to read stream_id.",
2699 {0x02, 0x03, 0x04}},
2700 // offset
2701 {"Unable to read offset.",
2702 {0x3A, 0x98, 0xFE, 0xDC,
2703 0x32, 0x10, 0x76, 0x54}},
2704 {"Unable to read frame data.",
2705 {
2706 // data length
2707 0x00, 0x0c,
2708 // data
2709 'h', 'e', 'l', 'l',
2710 'o', ' ', 'w', 'o',
2711 'r', 'l', 'd', '!'}},
2712 };
2713
QUICHE teama6ef0a62019-03-07 20:34:33 -05002714 PacketFragments packet46 = {
2715 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2716 // 4-byte packet number)
2717 {"",
2718 {0xD3}},
2719 // version tag
2720 {"",
2721 {QUIC_VERSION_BYTES}},
2722 // connection_id length
2723 {"",
2724 {0x50}},
2725 // connection_id
2726 {"",
2727 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2728 // packet number
2729 {"",
2730 {0x12, 0x34, 0x56, 0x78}},
2731 // frame type (stream frame with fin)
2732 {"",
2733 {0xFE}},
2734 // stream id
2735 {"Unable to read stream_id.",
2736 {0x02, 0x03, 0x04}},
2737 // offset
2738 {"Unable to read offset.",
2739 {0x3A, 0x98, 0xFE, 0xDC,
2740 0x32, 0x10, 0x76, 0x54}},
2741 {"Unable to read frame data.",
2742 {
2743 // data length
2744 0x00, 0x0c,
2745 // data
2746 'h', 'e', 'l', 'l',
2747 'o', ' ', 'w', 'o',
2748 'r', 'l', 'd', '!'}},
2749 };
2750
dschinazic73506e2019-09-20 13:26:46 -07002751 PacketFragments packet49 = {
2752 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2753 // 4-byte packet number)
2754 {"",
2755 {0xD3}},
2756 // version tag
2757 {"",
2758 {QUIC_VERSION_BYTES}},
2759 // destination connection ID length
2760 {"",
2761 {0x08}},
2762 // destination connection ID
2763 {"",
2764 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2765 // source connection ID length
2766 {"",
2767 {0x00}},
2768 // long header packet length
2769 {"",
2770 {0x1E}},
2771 // packet number
2772 {"",
2773 {0x12, 0x34, 0x56, 0x78}},
2774 // frame type (stream frame with fin)
2775 {"",
2776 {0xFE}},
2777 // stream id
2778 {"Long header payload length longer than packet.",
2779 {0x02, 0x03, 0x04}},
2780 // offset
2781 {"Long header payload length longer than packet.",
2782 {0x3A, 0x98, 0xFE, 0xDC,
2783 0x32, 0x10, 0x76, 0x54}},
2784 {"Long header payload length longer than packet.",
2785 {
2786 // data length
2787 0x00, 0x0c,
2788 // data
2789 'h', 'e', 'l', 'l',
2790 'o', ' ', 'w', 'o',
2791 'r', 'l', 'd', '!'}},
2792 };
2793
QUICHE teama6ef0a62019-03-07 20:34:33 -05002794 PacketFragments packet99 = {
2795 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2796 // 4-byte packet number)
2797 {"",
2798 {0xD3}},
2799 // version tag
2800 {"",
2801 {QUIC_VERSION_BYTES}},
dschinazi48ac9192019-07-31 00:07:26 -07002802 // destination connection ID length
QUICHE teama6ef0a62019-03-07 20:34:33 -05002803 {"",
dschinazi48ac9192019-07-31 00:07:26 -07002804 {0x08}},
2805 // destination connection ID
QUICHE teama6ef0a62019-03-07 20:34:33 -05002806 {"",
2807 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
dschinazi48ac9192019-07-31 00:07:26 -07002808 // source connection ID length
2809 {"",
2810 {0x00}},
QUICHE teama6ef0a62019-03-07 20:34:33 -05002811 // long header packet length
2812 {"",
2813 {0x1E}},
2814 // packet number
2815 {"",
2816 {0x12, 0x34, 0x56, 0x78}},
2817 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
2818 {"",
2819 {0x08 | 0x01 | 0x02 | 0x04}},
2820 // stream id
2821 {"Long header payload length longer than packet.",
2822 {kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04}},
2823 // offset
2824 {"Long header payload length longer than packet.",
2825 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2826 0x32, 0x10, 0x76, 0x54}},
2827 // data length
2828 {"Long header payload length longer than packet.",
2829 {kVarInt62OneByte + 0x0c}},
2830 // data
2831 {"Long header payload length longer than packet.",
2832 { 'h', 'e', 'l', 'l',
2833 'o', ' ', 'w', 'o',
2834 'r', 'l', 'd', '!'}},
2835 };
2836 // clang-format on
2837
2838 QuicVariableLengthIntegerLength retry_token_length_length =
2839 VARIABLE_LENGTH_INTEGER_LENGTH_0;
2840 size_t retry_token_length = 0;
2841 QuicVariableLengthIntegerLength length_length =
2842 QuicVersionHasLongHeaderLengths(framer_.transport_version())
2843 ? VARIABLE_LENGTH_INTEGER_LENGTH_1
2844 : VARIABLE_LENGTH_INTEGER_LENGTH_0;
2845
2846 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07002847 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05002848 ? packet99
dschinazic73506e2019-09-20 13:26:46 -07002849 : (framer_.transport_version() >= QUIC_VERSION_49
2850 ? packet49
2851 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
2852 : packet));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002853 std::unique_ptr<QuicEncryptedPacket> encrypted(
2854 AssemblePacketFromFragments(fragments));
2855 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2856
bncf6f82b12019-10-30 07:01:01 -07002857 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002858 ASSERT_TRUE(visitor_.header_.get());
2859 EXPECT_TRUE(CheckDecryption(
2860 *encrypted, kIncludeVersion, !kIncludeDiversificationNonce,
2861 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID,
2862 retry_token_length_length, retry_token_length, length_length));
2863
2864 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2865 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2866 // Stream ID should be the last 3 bytes of kStreamId.
2867 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2868 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2869 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2870 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2871
2872 CheckFramingBoundaries(fragments,
dschinazic73506e2019-09-20 13:26:46 -07002873 framer_.transport_version() >= QUIC_VERSION_49
QUICHE teama6ef0a62019-03-07 20:34:33 -05002874 ? QUIC_INVALID_PACKET_HEADER
2875 : QUIC_INVALID_STREAM_DATA);
2876}
2877
2878TEST_P(QuicFramerTest, RejectPacket) {
zhongyi546cc452019-04-12 15:27:49 -07002879 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002880 visitor_.accept_packet_ = false;
2881
2882 // clang-format off
2883 unsigned char packet[] = {
2884 // public flags (8 byte connection_id)
2885 0x28,
2886 // connection_id
2887 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2888 // packet number
2889 0x12, 0x34, 0x56, 0x78,
2890
2891 // frame type (stream frame with fin)
2892 0xFF,
2893 // stream id
2894 0x01, 0x02, 0x03, 0x04,
2895 // offset
2896 0x3A, 0x98, 0xFE, 0xDC,
2897 0x32, 0x10, 0x76, 0x54,
2898 // data length
2899 0x00, 0x0c,
2900 // data
2901 'h', 'e', 'l', 'l',
2902 'o', ' ', 'w', 'o',
2903 'r', 'l', 'd', '!',
2904 };
2905
QUICHE teama6ef0a62019-03-07 20:34:33 -05002906 unsigned char packet46[] = {
2907 // type (short header, 4 byte packet number)
2908 0x43,
2909 // connection_id
2910 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2911 // packet number
2912 0x12, 0x34, 0x56, 0x78,
2913
2914 // frame type (STREAM Frame with FIN, LEN, and OFFSET bits set)
2915 0x10 | 0x01 | 0x02 | 0x04,
2916 // stream id
2917 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
2918 // offset
2919 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2920 0x32, 0x10, 0x76, 0x54,
2921 // data length
2922 kVarInt62OneByte + 0x0c,
2923 // data
2924 'h', 'e', 'l', 'l',
2925 'o', ' ', 'w', 'o',
2926 'r', 'l', 'd', '!',
2927 };
2928 // clang-format on
2929
2930 unsigned char* p = packet;
fayang36825da2019-08-21 14:01:27 -07002931 if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002932 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05002933 }
2934 QuicEncryptedPacket encrypted(AsChars(p),
2935 framer_.transport_version() > QUIC_VERSION_43
fayang36825da2019-08-21 14:01:27 -07002936 ? QUIC_ARRAYSIZE(packet46)
QUICHE teama6ef0a62019-03-07 20:34:33 -05002937 : QUIC_ARRAYSIZE(packet),
2938 false);
2939 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2940
bncf6f82b12019-10-30 07:01:01 -07002941 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002942 ASSERT_TRUE(visitor_.header_.get());
2943 EXPECT_TRUE(CheckDecryption(
2944 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2945 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2946
2947 ASSERT_EQ(0u, visitor_.stream_frames_.size());
2948 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2949}
2950
2951TEST_P(QuicFramerTest, RejectPublicHeader) {
2952 visitor_.accept_public_header_ = false;
2953
2954 // clang-format off
2955 unsigned char packet[] = {
2956 // public flags (8 byte connection_id)
2957 0x28,
2958 // connection_id
2959 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2960 };
2961
QUICHE teama6ef0a62019-03-07 20:34:33 -05002962 unsigned char packet46[] = {
2963 // type (short header, 1 byte packet number)
2964 0x40,
2965 // connection_id
2966 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2967 // packet number
2968 0x01,
2969 };
2970 // clang-format on
2971
2972 QuicEncryptedPacket encrypted(
fayang36825da2019-08-21 14:01:27 -07002973 framer_.transport_version() >= QUIC_VERSION_46 ? AsChars(packet46)
2974 : AsChars(packet),
2975 framer_.transport_version() >= QUIC_VERSION_46 ? QUIC_ARRAYSIZE(packet46)
2976 : QUIC_ARRAYSIZE(packet),
QUICHE teama6ef0a62019-03-07 20:34:33 -05002977 false);
2978 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2979
bncf6f82b12019-10-30 07:01:01 -07002980 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002981 ASSERT_TRUE(visitor_.header_.get());
2982 EXPECT_FALSE(visitor_.header_->packet_number.IsInitialized());
2983}
2984
2985TEST_P(QuicFramerTest, AckFrameOneAckBlock) {
zhongyi546cc452019-04-12 15:27:49 -07002986 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002987 // clang-format off
2988 PacketFragments packet = {
2989 // public flags (8 byte connection_id)
2990 {"",
2991 {0x2C}},
2992 // connection_id
2993 {"",
2994 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2995 // packet number
2996 {"",
2997 {0x12, 0x34, 0x56, 0x78}},
2998 // frame type (ack frame)
2999 // (one ack block, 2 byte largest observed, 2 byte block length)
3000 {"",
3001 {0x45}},
3002 // largest acked
3003 {"Unable to read largest acked.",
3004 {0x12, 0x34}},
3005 // Zero delta time.
3006 {"Unable to read ack delay time.",
3007 {0x00, 0x00}},
3008 // first ack block length.
3009 {"Unable to read first ack block length.",
3010 {0x12, 0x34}},
3011 // num timestamps.
3012 {"Unable to read num received packets.",
3013 {0x00}}
3014 };
3015
QUICHE teama6ef0a62019-03-07 20:34:33 -05003016 PacketFragments packet46 = {
3017 // type (short packet, 4 byte packet number)
3018 {"",
3019 {0x43}},
3020 // connection_id
3021 {"",
3022 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3023 // packet number
3024 {"",
3025 {0x12, 0x34, 0x56, 0x78}},
3026 // frame type (ack frame)
3027 // (one ack block, 2 byte largest observed, 2 byte block length)
3028 {"",
3029 {0x45}},
3030 // largest acked
3031 {"Unable to read largest acked.",
3032 {0x12, 0x34}},
3033 // Zero delta time.
3034 {"Unable to read ack delay time.",
3035 {0x00, 0x00}},
3036 // first ack block length.
3037 {"Unable to read first ack block length.",
3038 {0x12, 0x34}},
3039 // num timestamps.
3040 {"Unable to read num received packets.",
3041 {0x00}}
3042 };
3043
3044 PacketFragments packet99 = {
3045 // type (short packet, 4 byte packet number)
3046 {"",
3047 {0x43}},
3048 // connection_id
3049 {"",
3050 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3051 // packet number
3052 {"",
3053 {0x12, 0x34, 0x56, 0x78}},
3054 // frame type (IETF_ACK)
3055 // (one ack block, 2 byte largest observed, 2 byte block length)
3056 // IETF-Quic ignores the bit-fields in the ack type, all of
3057 // that information is encoded elsewhere in the frame.
3058 {"",
3059 {0x02}},
3060 // largest acked
3061 {"Unable to read largest acked.",
3062 {kVarInt62TwoBytes + 0x12, 0x34}},
3063 // Zero delta time.
3064 {"Unable to read ack delay time.",
3065 {kVarInt62OneByte + 0x00}},
3066 // Ack block count (0 -- no blocks after the first)
3067 {"Unable to read ack block count.",
3068 {kVarInt62OneByte + 0x00}},
3069 // first ack block length - 1.
3070 // IETF Quic defines the ack block's value as the "number of
3071 // packets that preceed the largest packet number in the block"
3072 // which for the 1st ack block is the largest acked field,
3073 // above. This means that if we are acking just packet 0x1234
3074 // then the 1st ack block will be 0.
3075 {"Unable to read first ack block length.",
3076 {kVarInt62TwoBytes + 0x12, 0x33}}
3077 };
3078 // clang-format on
3079
3080 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07003081 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05003082 ? packet99
fayang36825da2019-08-21 14:01:27 -07003083 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
3084 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003085 std::unique_ptr<QuicEncryptedPacket> encrypted(
3086 AssemblePacketFromFragments(fragments));
3087 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3088
bncf6f82b12019-10-30 07:01:01 -07003089 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05003090 ASSERT_TRUE(visitor_.header_.get());
3091 EXPECT_TRUE(CheckDecryption(
3092 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3093 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
3094
3095 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3096 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3097 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3098 EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
3099 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
3100
3101 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3102}
3103
3104// This test checks that the ack frame processor correctly identifies
3105// and handles the case where the first ack block is larger than the
3106// largest_acked packet.
3107TEST_P(QuicFramerTest, FirstAckFrameUnderflow) {
zhongyi546cc452019-04-12 15:27:49 -07003108 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003109 // clang-format off
3110 PacketFragments packet = {
3111 // public flags (8 byte connection_id)
3112 {"",
3113 {0x2C}},
3114 // connection_id
3115 {"",
3116 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3117 // packet number
3118 {"",
3119 {0x12, 0x34, 0x56, 0x78}},
3120 // frame type (ack frame)
3121 // (one ack block, 2 byte largest observed, 2 byte block length)
3122 {"",
3123 {0x45}},
3124 // largest acked
3125 {"Unable to read largest acked.",
3126 {0x12, 0x34}},
3127 // Zero delta time.
3128 {"Unable to read ack delay time.",
3129 {0x00, 0x00}},
3130 // first ack block length.
3131 {"Unable to read first ack block length.",
3132 {0x88, 0x88}},
3133 // num timestamps.
3134 {"Underflow with first ack block length 34952 largest acked is 4660.",
3135 {0x00}}
3136 };
3137
QUICHE teama6ef0a62019-03-07 20:34:33 -05003138 PacketFragments packet46 = {
3139 // type (short header, 4 byte packet number)
3140 {"",
3141 {0x43}},
3142 // connection_id
3143 {"",
3144 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3145 // packet number
3146 {"",
3147 {0x12, 0x34, 0x56, 0x78}},
3148 // frame type (ack frame)
3149 // (one ack block, 2 byte largest observed, 2 byte block length)
3150 {"",
3151 {0x45}},
3152 // largest acked
3153 {"Unable to read largest acked.",
3154 {0x12, 0x34}},
3155 // Zero delta time.
3156 {"Unable to read ack delay time.",
3157 {0x00, 0x00}},
3158 // first ack block length.
3159 {"Unable to read first ack block length.",
3160 {0x88, 0x88}},
3161 // num timestamps.
3162 {"Underflow with first ack block length 34952 largest acked is 4660.",
3163 {0x00}}
3164 };
3165
3166 PacketFragments packet99 = {
3167 // type (short header, 4 byte packet number)
3168 {"",
3169 {0x43}},
3170 // connection_id
3171 {"",
3172 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3173 // packet number
3174 {"",
3175 {0x12, 0x34, 0x56, 0x78}},
3176 // frame type (IETF_ACK)
3177 {"",
3178 {0x02}},
3179 // largest acked
3180 {"Unable to read largest acked.",
3181 {kVarInt62TwoBytes + 0x12, 0x34}},
3182 // Zero delta time.
3183 {"Unable to read ack delay time.",
3184 {kVarInt62OneByte + 0x00}},
3185 // Ack block count (0 -- no blocks after the first)
3186 {"Unable to read ack block count.",
3187 {kVarInt62OneByte + 0x00}},
3188 // first ack block length.
3189 {"Unable to read first ack block length.",
3190 {kVarInt62TwoBytes + 0x28, 0x88}}
3191 };
3192 // clang-format on
3193
3194 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07003195 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05003196 ? packet99
fayang36825da2019-08-21 14:01:27 -07003197 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
3198 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003199 std::unique_ptr<QuicEncryptedPacket> encrypted(
3200 AssemblePacketFromFragments(fragments));
3201 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3202 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3203}
3204
3205// This test checks that the ack frame processor correctly identifies
3206// and handles the case where the third ack block's gap is larger than the
3207// available space in the ack range.
3208TEST_P(QuicFramerTest, ThirdAckBlockUnderflowGap) {
fkastenholz305e1732019-06-18 05:01:22 -07003209 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07003210 // Test originally written for development of IETF QUIC. The test may
3211 // also apply to Google QUIC. If so, the test should be extended to
3212 // include Google QUIC (frame formats, etc). See b/141858819.
QUICHE teama6ef0a62019-03-07 20:34:33 -05003213 return;
3214 }
zhongyi546cc452019-04-12 15:27:49 -07003215 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003216 // clang-format off
3217 PacketFragments packet99 = {
3218 // type (short header, 4 byte packet number)
3219 {"",
3220 {0x43}},
3221 // connection_id
3222 {"",
3223 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3224 // packet number
3225 {"",
3226 {0x12, 0x34, 0x56, 0x78}},
3227 // frame type (IETF_ACK frame)
3228 {"",
3229 {0x02}},
3230 // largest acked
3231 {"Unable to read largest acked.",
3232 {kVarInt62OneByte + 63}},
3233 // Zero delta time.
3234 {"Unable to read ack delay time.",
3235 {kVarInt62OneByte + 0x00}},
3236 // Ack block count (2 -- 2 blocks after the first)
3237 {"Unable to read ack block count.",
3238 {kVarInt62OneByte + 0x02}},
3239 // first ack block length.
3240 {"Unable to read first ack block length.",
3241 {kVarInt62OneByte + 13}}, // Ack 14 packets, range 50..63 (inclusive)
3242
3243 {"Unable to read gap block value.",
3244 {kVarInt62OneByte + 9}}, // Gap 10 packets, 40..49 (inclusive)
3245 {"Unable to read ack block value.",
3246 {kVarInt62OneByte + 9}}, // Ack 10 packets, 30..39 (inclusive)
3247 {"Unable to read gap block value.",
3248 {kVarInt62OneByte + 29}}, // A gap of 30 packets (0..29 inclusive)
3249 // should be too big, leaving no room
3250 // for the ack.
3251 {"Underflow with gap block length 30 previous ack block start is 30.",
3252 {kVarInt62OneByte + 10}}, // Don't care
3253 };
3254 // clang-format on
3255
3256 std::unique_ptr<QuicEncryptedPacket> encrypted(
3257 AssemblePacketFromFragments(packet99));
3258 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3259 EXPECT_EQ(
3260 framer_.detailed_error(),
3261 "Underflow with gap block length 30 previous ack block start is 30.");
3262 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3263}
3264
3265// This test checks that the ack frame processor correctly identifies
3266// and handles the case where the third ack block's length is larger than the
3267// available space in the ack range.
3268TEST_P(QuicFramerTest, ThirdAckBlockUnderflowAck) {
fkastenholz305e1732019-06-18 05:01:22 -07003269 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07003270 // Test originally written for development of IETF QUIC. The test may
3271 // also apply to Google QUIC. If so, the test should be extended to
3272 // include Google QUIC (frame formats, etc). See b/141858819.
QUICHE teama6ef0a62019-03-07 20:34:33 -05003273 return;
3274 }
zhongyi546cc452019-04-12 15:27:49 -07003275 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003276 // clang-format off
3277 PacketFragments packet99 = {
3278 // type (short header, 4 byte packet number)
3279 {"",
3280 {0x43}},
3281 // connection_id
3282 {"",
3283 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3284 // packet number
3285 {"",
3286 {0x12, 0x34, 0x56, 0x78}},
3287 // frame type (IETF_ACK frame)
3288 {"",
3289 {0x02}},
3290 // largest acked
3291 {"Unable to read largest acked.",
3292 {kVarInt62OneByte + 63}},
3293 // Zero delta time.
3294 {"Unable to read ack delay time.",
3295 {kVarInt62OneByte + 0x00}},
3296 // Ack block count (2 -- 2 blocks after the first)
3297 {"Unable to read ack block count.",
3298 {kVarInt62OneByte + 0x02}},
3299 // first ack block length.
3300 {"Unable to read first ack block length.",
3301 {kVarInt62OneByte + 13}}, // only 50 packet numbers "left"
3302
3303 {"Unable to read gap block value.",
3304 {kVarInt62OneByte + 10}}, // Only 40 packet numbers left
3305 {"Unable to read ack block value.",
3306 {kVarInt62OneByte + 10}}, // only 30 packet numbers left.
3307 {"Unable to read gap block value.",
3308 {kVarInt62OneByte + 1}}, // Gap is OK, 29 packet numbers left
3309 {"Unable to read ack block value.",
3310 {kVarInt62OneByte + 30}}, // Use up all 30, should be an error
3311 };
3312 // clang-format on
3313
3314 std::unique_ptr<QuicEncryptedPacket> encrypted(
3315 AssemblePacketFromFragments(packet99));
3316 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3317 EXPECT_EQ(framer_.detailed_error(),
3318 "Underflow with ack block length 31 latest ack block end is 25.");
3319 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3320}
3321
3322// Tests a variety of ack block wrap scenarios. For example, if the
3323// N-1th block causes packet 0 to be acked, then a gap would wrap
3324// around to 0x3fffffff ffffffff... Make sure we detect this
3325// condition.
3326TEST_P(QuicFramerTest, AckBlockUnderflowGapWrap) {
fkastenholz305e1732019-06-18 05:01:22 -07003327 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07003328 // Test originally written for development of IETF QUIC. The test may
3329 // also apply to Google QUIC. If so, the test should be extended to
3330 // include Google QUIC (frame formats, etc). See b/141858819.
QUICHE teama6ef0a62019-03-07 20:34:33 -05003331 return;
3332 }
zhongyi546cc452019-04-12 15:27:49 -07003333 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003334 // clang-format off
3335 PacketFragments packet99 = {
3336 // type (short header, 4 byte packet number)
3337 {"",
3338 {0x43}},
3339 // connection_id
3340 {"",
3341 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3342 // packet number
3343 {"",
3344 {0x12, 0x34, 0x56, 0x78}},
3345 // frame type (IETF_ACK frame)
3346 {"",
3347 {0x02}},
3348 // largest acked
3349 {"Unable to read largest acked.",
3350 {kVarInt62OneByte + 10}},
3351 // Zero delta time.
3352 {"Unable to read ack delay time.",
3353 {kVarInt62OneByte + 0x00}},
3354 // Ack block count (1 -- 1 blocks after the first)
3355 {"Unable to read ack block count.",
3356 {kVarInt62OneByte + 1}},
3357 // first ack block length.
3358 {"Unable to read first ack block length.",
3359 {kVarInt62OneByte + 9}}, // Ack packets 1..10 (inclusive)
3360
3361 {"Unable to read gap block value.",
3362 {kVarInt62OneByte + 1}}, // Gap of 2 packets (-1...0), should wrap
3363 {"Underflow with gap block length 2 previous ack block start is 1.",
3364 {kVarInt62OneByte + 9}}, // irrelevant
3365 };
3366 // clang-format on
3367
3368 std::unique_ptr<QuicEncryptedPacket> encrypted(
3369 AssemblePacketFromFragments(packet99));
3370 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3371 EXPECT_EQ(framer_.detailed_error(),
3372 "Underflow with gap block length 2 previous ack block start is 1.");
3373 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3374}
3375
3376// As AckBlockUnderflowGapWrap, but in this test, it's the ack
3377// component of the ack-block that causes the wrap, not the gap.
3378TEST_P(QuicFramerTest, AckBlockUnderflowAckWrap) {
fkastenholz305e1732019-06-18 05:01:22 -07003379 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07003380 // Test originally written for development of IETF QUIC. The test may
3381 // also apply to Google QUIC. If so, the test should be extended to
3382 // include Google QUIC (frame formats, etc). See b/141858819.
QUICHE teama6ef0a62019-03-07 20:34:33 -05003383 return;
3384 }
zhongyi546cc452019-04-12 15:27:49 -07003385 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003386 // clang-format off
3387 PacketFragments packet99 = {
3388 // type (short header, 4 byte packet number)
3389 {"",
3390 {0x43}},
3391 // connection_id
3392 {"",
3393 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3394 // packet number
3395 {"",
3396 {0x12, 0x34, 0x56, 0x78}},
3397 // frame type (IETF_ACK frame)
3398 {"",
3399 {0x02}},
3400 // largest acked
3401 {"Unable to read largest acked.",
3402 {kVarInt62OneByte + 10}},
3403 // Zero delta time.
3404 {"Unable to read ack delay time.",
3405 {kVarInt62OneByte + 0x00}},
3406 // Ack block count (1 -- 1 blocks after the first)
3407 {"Unable to read ack block count.",
3408 {kVarInt62OneByte + 1}},
3409 // first ack block length.
3410 {"Unable to read first ack block length.",
3411 {kVarInt62OneByte + 6}}, // Ack packets 4..10 (inclusive)
3412
3413 {"Unable to read gap block value.",
3414 {kVarInt62OneByte + 1}}, // Gap of 2 packets (2..3)
3415 {"Unable to read ack block value.",
3416 {kVarInt62OneByte + 9}}, // Should wrap.
3417 };
3418 // clang-format on
3419
3420 std::unique_ptr<QuicEncryptedPacket> encrypted(
3421 AssemblePacketFromFragments(packet99));
3422 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3423 EXPECT_EQ(framer_.detailed_error(),
3424 "Underflow with ack block length 10 latest ack block end is 1.");
3425 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3426}
3427
3428// An ack block that acks the entire range, 1...0x3fffffffffffffff
3429TEST_P(QuicFramerTest, AckBlockAcksEverything) {
fkastenholz305e1732019-06-18 05:01:22 -07003430 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07003431 // Test originally written for development of IETF QUIC. The test may
3432 // also apply to Google QUIC. If so, the test should be extended to
3433 // include Google QUIC (frame formats, etc). See b/141858819.
QUICHE teama6ef0a62019-03-07 20:34:33 -05003434 return;
3435 }
zhongyi546cc452019-04-12 15:27:49 -07003436 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003437 // clang-format off
3438 PacketFragments packet99 = {
3439 // type (short header, 4 byte packet number)
3440 {"",
3441 {0x43}},
3442 // connection_id
3443 {"",
3444 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3445 // packet number
3446 {"",
3447 {0x12, 0x34, 0x56, 0x78}},
3448 // frame type (IETF_ACK frame)
3449 {"",
3450 {0x02}},
3451 // largest acked
3452 {"Unable to read largest acked.",
3453 {kVarInt62EightBytes + 0x3f, 0xff, 0xff, 0xff,
3454 0xff, 0xff, 0xff, 0xff}},
3455 // Zero delta time.
3456 {"Unable to read ack delay time.",
3457 {kVarInt62OneByte + 0x00}},
3458 // Ack block count No additional blocks
3459 {"Unable to read ack block count.",
3460 {kVarInt62OneByte + 0}},
3461 // first ack block length.
3462 {"Unable to read first ack block length.",
3463 {kVarInt62EightBytes + 0x3f, 0xff, 0xff, 0xff,
3464 0xff, 0xff, 0xff, 0xfe}},
3465 };
3466 // clang-format on
3467
3468 std::unique_ptr<QuicEncryptedPacket> encrypted(
3469 AssemblePacketFromFragments(packet99));
3470 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3471 EXPECT_EQ(1u, visitor_.ack_frames_.size());
3472 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3473 EXPECT_EQ(1u, frame.packets.NumIntervals());
3474 EXPECT_EQ(kLargestIetfLargestObserved, LargestAcked(frame));
3475 EXPECT_EQ(kLargestIetfLargestObserved.ToUint64(),
3476 frame.packets.NumPacketsSlow());
3477}
3478
3479// This test looks for a malformed ack where
3480// - There is a largest-acked value (that is, the frame is acking
3481// something,
3482// - But the length of the first ack block is 0 saying that no frames
3483// are being acked with the largest-acked value or there are no
3484// additional ack blocks.
3485//
3486TEST_P(QuicFramerTest, AckFrameFirstAckBlockLengthZero) {
fkastenholz305e1732019-06-18 05:01:22 -07003487 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003488 // Not applicable to version 99 -- first ack block contains the
3489 // number of packets that preceed the largest_acked packet.
3490 // A value of 0 means no packets preceed --- that the block's
3491 // length is 1. Therefore the condition that this test checks can
3492 // not arise.
3493 return;
3494 }
nharper9bb83462019-05-01 10:53:22 -07003495 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003496
3497 // clang-format off
3498 PacketFragments packet = {
3499 // public flags (8 byte connection_id)
3500 {"",
3501 { 0x2C }},
3502 // connection_id
3503 {"",
3504 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3505 // packet number
3506 {"",
3507 { 0x12, 0x34, 0x56, 0x78 }},
3508
3509 // frame type (ack frame)
3510 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3511 {"",
3512 { 0x65 }},
3513 // largest acked
3514 {"Unable to read largest acked.",
3515 { 0x12, 0x34 }},
3516 // Zero delta time.
3517 {"Unable to read ack delay time.",
3518 { 0x00, 0x00 }},
3519 // num ack blocks ranges.
3520 {"Unable to read num of ack blocks.",
3521 { 0x01 }},
3522 // first ack block length.
3523 {"Unable to read first ack block length.",
3524 { 0x00, 0x00 }},
3525 // gap to next block.
3526 { "First block length is zero.",
3527 { 0x01 }},
3528 // ack block length.
3529 { "First block length is zero.",
3530 { 0x0e, 0xaf }},
3531 // Number of timestamps.
3532 { "First block length is zero.",
3533 { 0x00 }},
3534 };
3535
QUICHE teama6ef0a62019-03-07 20:34:33 -05003536 PacketFragments packet46 = {
3537 // type (short header, 4 byte packet number)
3538 {"",
3539 { 0x43 }},
3540 // connection_id
3541 {"",
3542 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3543 // packet number
3544 {"",
3545 { 0x12, 0x34, 0x56, 0x78 }},
3546
3547 // frame type (ack frame)
3548 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3549 {"",
3550 { 0x65 }},
3551 // largest acked
3552 {"Unable to read largest acked.",
3553 { 0x12, 0x34 }},
3554 // Zero delta time.
3555 {"Unable to read ack delay time.",
3556 { 0x00, 0x00 }},
3557 // num ack blocks ranges.
3558 {"Unable to read num of ack blocks.",
3559 { 0x01 }},
3560 // first ack block length.
3561 {"Unable to read first ack block length.",
3562 { 0x00, 0x00 }},
3563 // gap to next block.
3564 { "First block length is zero.",
3565 { 0x01 }},
3566 // ack block length.
3567 { "First block length is zero.",
3568 { 0x0e, 0xaf }},
3569 // Number of timestamps.
3570 { "First block length is zero.",
3571 { 0x00 }},
3572 };
3573
3574 // clang-format on
3575 PacketFragments& fragments =
fayang36825da2019-08-21 14:01:27 -07003576 framer_.transport_version() >= QUIC_VERSION_46 ? packet46 : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -05003577
3578 std::unique_ptr<QuicEncryptedPacket> encrypted(
3579 AssemblePacketFromFragments(fragments));
3580
3581 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07003582 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_ACK_DATA));
QUICHE teama6ef0a62019-03-07 20:34:33 -05003583
3584 ASSERT_TRUE(visitor_.header_.get());
3585 EXPECT_TRUE(CheckDecryption(
3586 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3587 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
3588
3589 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3590 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3591
3592 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3593}
3594
3595TEST_P(QuicFramerTest, AckFrameOneAckBlockMaxLength) {
zhongyi546cc452019-04-12 15:27:49 -07003596 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003597 // clang-format off
3598 PacketFragments packet = {
3599 // public flags (8 byte connection_id)
3600 {"",
3601 {0x2C}},
3602 // connection_id
3603 {"",
3604 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3605 // packet number
3606 {"",
3607 {0x12, 0x34, 0x56, 0x78}},
3608 // frame type (ack frame)
3609 // (one ack block, 4 byte largest observed, 2 byte block length)
3610 {"",
3611 {0x49}},
3612 // largest acked
3613 {"Unable to read largest acked.",
3614 {0x12, 0x34, 0x56, 0x78}},
3615 // Zero delta time.
3616 {"Unable to read ack delay time.",
3617 {0x00, 0x00}},
3618 // first ack block length.
3619 {"Unable to read first ack block length.",
3620 {0x12, 0x34}},
3621 // num timestamps.
3622 {"Unable to read num received packets.",
3623 {0x00}}
3624 };
3625
QUICHE teama6ef0a62019-03-07 20:34:33 -05003626 PacketFragments packet46 = {
3627 // type (short header, 4 byte packet number)
3628 {"",
3629 {0x43}},
3630 // connection_id
3631 {"",
3632 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3633 // packet number
3634 {"",
3635 {0x56, 0x78, 0x9A, 0xBC}},
3636 // frame type (ack frame)
3637 // (one ack block, 4 byte largest observed, 2 byte block length)
3638 {"",
3639 {0x49}},
3640 // largest acked
3641 {"Unable to read largest acked.",
3642 {0x12, 0x34, 0x56, 0x78}},
3643 // Zero delta time.
3644 {"Unable to read ack delay time.",
3645 {0x00, 0x00}},
3646 // first ack block length.
3647 {"Unable to read first ack block length.",
3648 {0x12, 0x34}},
3649 // num timestamps.
3650 {"Unable to read num received packets.",
3651 {0x00}}
3652 };
3653
3654 PacketFragments packet99 = {
3655 // type (short header, 4 byte packet number)
3656 {"",
3657 {0x43}},
3658 // connection_id
3659 {"",
3660 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3661 // packet number
3662 {"",
3663 {0x56, 0x78, 0x9A, 0xBC}},
3664 // frame type (IETF_ACK frame)
3665 {"",
3666 {0x02}},
3667 // largest acked
3668 {"Unable to read largest acked.",
3669 {kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78}},
3670 // Zero delta time.
3671 {"Unable to read ack delay time.",
3672 {kVarInt62OneByte + 0x00}},
3673 // Number of ack blocks after first
3674 {"Unable to read ack block count.",
3675 {kVarInt62OneByte + 0x00}},
3676 // first ack block length.
3677 {"Unable to read first ack block length.",
3678 {kVarInt62TwoBytes + 0x12, 0x33}}
3679 };
3680 // clang-format on
3681
3682 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07003683 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05003684 ? packet99
fayang36825da2019-08-21 14:01:27 -07003685 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
3686 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003687 std::unique_ptr<QuicEncryptedPacket> encrypted(
3688 AssemblePacketFromFragments(fragments));
3689 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3690
bncf6f82b12019-10-30 07:01:01 -07003691 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05003692 ASSERT_TRUE(visitor_.header_.get());
3693 EXPECT_TRUE(CheckDecryption(
3694 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3695 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
3696
3697 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3698 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3699 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3700 EXPECT_EQ(kPacketNumber, LargestAcked(frame));
3701 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
3702
3703 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3704}
3705
3706// Tests ability to handle multiple ackblocks after the first ack
3707// block. Non-version-99 tests include multiple timestamps as well.
3708TEST_P(QuicFramerTest, AckFrameTwoTimeStampsMultipleAckBlocks) {
zhongyi546cc452019-04-12 15:27:49 -07003709 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003710 // clang-format off
3711 PacketFragments packet = {
3712 // public flags (8 byte connection_id)
3713 {"",
3714 { 0x2C }},
3715 // connection_id
3716 {"",
3717 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3718 // packet number
3719 {"",
3720 { 0x12, 0x34, 0x56, 0x78 }},
3721
3722 // frame type (ack frame)
3723 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3724 {"",
3725 { 0x65 }},
3726 // largest acked
3727 {"Unable to read largest acked.",
3728 { 0x12, 0x34 }},
3729 // Zero delta time.
3730 {"Unable to read ack delay time.",
3731 { 0x00, 0x00 }},
3732 // num ack blocks ranges.
3733 {"Unable to read num of ack blocks.",
3734 { 0x04 }},
3735 // first ack block length.
3736 {"Unable to read first ack block length.",
3737 { 0x00, 0x01 }},
3738 // gap to next block.
3739 { "Unable to read gap to next ack block.",
3740 { 0x01 }},
3741 // ack block length.
3742 { "Unable to ack block length.",
3743 { 0x0e, 0xaf }},
3744 // gap to next block.
3745 { "Unable to read gap to next ack block.",
3746 { 0xff }},
3747 // ack block length.
3748 { "Unable to ack block length.",
3749 { 0x00, 0x00 }},
3750 // gap to next block.
3751 { "Unable to read gap to next ack block.",
3752 { 0x91 }},
3753 // ack block length.
3754 { "Unable to ack block length.",
3755 { 0x01, 0xea }},
3756 // gap to next block.
3757 { "Unable to read gap to next ack block.",
3758 { 0x05 }},
3759 // ack block length.
3760 { "Unable to ack block length.",
3761 { 0x00, 0x04 }},
3762 // Number of timestamps.
3763 { "Unable to read num received packets.",
3764 { 0x02 }},
3765 // Delta from largest observed.
3766 { "Unable to read sequence delta in received packets.",
3767 { 0x01 }},
3768 // Delta time.
3769 { "Unable to read time delta in received packets.",
3770 { 0x76, 0x54, 0x32, 0x10 }},
3771 // Delta from largest observed.
3772 { "Unable to read sequence delta in received packets.",
3773 { 0x02 }},
3774 // Delta time.
3775 { "Unable to read incremental time delta in received packets.",
3776 { 0x32, 0x10 }},
3777 };
3778
QUICHE teama6ef0a62019-03-07 20:34:33 -05003779 PacketFragments packet46 = {
3780 // type (short header, 4 byte packet number)
3781 {"",
3782 { 0x43 }},
3783 // connection_id
3784 {"",
3785 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3786 // packet number
3787 {"",
3788 { 0x12, 0x34, 0x56, 0x78 }},
3789
3790 // frame type (ack frame)
3791 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3792 {"",
3793 { 0x65 }},
3794 // largest acked
3795 {"Unable to read largest acked.",
3796 { 0x12, 0x34 }},
3797 // Zero delta time.
3798 {"Unable to read ack delay time.",
3799 { 0x00, 0x00 }},
3800 // num ack blocks ranges.
3801 {"Unable to read num of ack blocks.",
3802 { 0x04 }},
3803 // first ack block length.
3804 {"Unable to read first ack block length.",
3805 { 0x00, 0x01 }},
3806 // gap to next block.
3807 { "Unable to read gap to next ack block.",
3808 { 0x01 }},
3809 // ack block length.
3810 { "Unable to ack block length.",
3811 { 0x0e, 0xaf }},
3812 // gap to next block.
3813 { "Unable to read gap to next ack block.",
3814 { 0xff }},
3815 // ack block length.
3816 { "Unable to ack block length.",
3817 { 0x00, 0x00 }},
3818 // gap to next block.
3819 { "Unable to read gap to next ack block.",
3820 { 0x91 }},
3821 // ack block length.
3822 { "Unable to ack block length.",
3823 { 0x01, 0xea }},
3824 // gap to next block.
3825 { "Unable to read gap to next ack block.",
3826 { 0x05 }},
3827 // ack block length.
3828 { "Unable to ack block length.",
3829 { 0x00, 0x04 }},
3830 // Number of timestamps.
3831 { "Unable to read num received packets.",
3832 { 0x02 }},
3833 // Delta from largest observed.
3834 { "Unable to read sequence delta in received packets.",
3835 { 0x01 }},
3836 // Delta time.
3837 { "Unable to read time delta in received packets.",
3838 { 0x76, 0x54, 0x32, 0x10 }},
3839 // Delta from largest observed.
3840 { "Unable to read sequence delta in received packets.",
3841 { 0x02 }},
3842 // Delta time.
3843 { "Unable to read incremental time delta in received packets.",
3844 { 0x32, 0x10 }},
3845 };
3846
3847 PacketFragments packet99 = {
3848 // type (short header, 4 byte packet number)
3849 {"",
3850 { 0x43 }},
3851 // connection_id
3852 {"",
3853 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3854 // packet number
3855 {"",
3856 { 0x12, 0x34, 0x56, 0x78 }},
3857
3858 // frame type (IETF_ACK frame)
3859 {"",
3860 { 0x02 }},
3861 // largest acked
3862 {"Unable to read largest acked.",
3863 { kVarInt62TwoBytes + 0x12, 0x34 }}, // = 4660
3864 // Zero delta time.
3865 {"Unable to read ack delay time.",
3866 { kVarInt62OneByte + 0x00 }},
3867 // number of additional ack blocks
3868 {"Unable to read ack block count.",
3869 { kVarInt62OneByte + 0x03 }},
3870 // first ack block length.
3871 {"Unable to read first ack block length.",
3872 { kVarInt62OneByte + 0x00 }}, // 1st block length = 1
3873
3874 // Additional ACK Block #1
3875 // gap to next block.
3876 { "Unable to read gap block value.",
3877 { kVarInt62OneByte + 0x00 }}, // gap of 1 packet
3878 // ack block length.
3879 { "Unable to read ack block value.",
3880 { kVarInt62TwoBytes + 0x0e, 0xae }}, // 3759
3881
3882 // pre-version-99 test includes an ack block of 0 length. this
3883 // can not happen in version 99. ergo the second block is not
3884 // present in the v99 test and the gap length of the next block
3885 // is the sum of the two gaps in the pre-version-99 tests.
3886 // Additional ACK Block #2
3887 // gap to next block.
3888 { "Unable to read gap block value.",
3889 { kVarInt62TwoBytes + 0x01, 0x8f }}, // Gap is 400 (0x190) pkts
3890 // ack block length.
3891 { "Unable to read ack block value.",
3892 { kVarInt62TwoBytes + 0x01, 0xe9 }}, // block is 389 (x1ea) pkts
3893
3894 // Additional ACK Block #3
3895 // gap to next block.
3896 { "Unable to read gap block value.",
3897 { kVarInt62OneByte + 0x04 }}, // Gap is 5 packets.
3898 // ack block length.
3899 { "Unable to read ack block value.",
3900 { kVarInt62OneByte + 0x03 }}, // block is 3 packets.
3901 };
3902
3903 // clang-format on
3904 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07003905 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05003906 ? packet99
fayang36825da2019-08-21 14:01:27 -07003907 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
3908 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003909
3910 std::unique_ptr<QuicEncryptedPacket> encrypted(
3911 AssemblePacketFromFragments(fragments));
3912
3913 framer_.set_process_timestamps(true);
3914 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3915
bncf6f82b12019-10-30 07:01:01 -07003916 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05003917 ASSERT_TRUE(visitor_.header_.get());
3918 EXPECT_TRUE(CheckDecryption(
3919 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3920 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
3921
3922 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3923 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3924 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3925 EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
3926 ASSERT_EQ(4254u, frame.packets.NumPacketsSlow());
3927 EXPECT_EQ(4u, frame.packets.NumIntervals());
fkastenholz305e1732019-06-18 05:01:22 -07003928 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003929 EXPECT_EQ(0u, frame.received_packet_times.size());
3930 } else {
3931 EXPECT_EQ(2u, frame.received_packet_times.size());
3932 }
3933 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3934}
3935
3936TEST_P(QuicFramerTest, AckFrameTimeStampDeltaTooHigh) {
nharper9bb83462019-05-01 10:53:22 -07003937 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003938 // clang-format off
3939 unsigned char packet[] = {
3940 // public flags (8 byte connection_id)
3941 0x28,
3942 // connection_id
3943 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3944 // packet number
3945 0x12, 0x34, 0x56, 0x78,
3946
3947 // frame type (ack frame)
3948 // (no ack blocks, 1 byte largest observed, 1 byte block length)
3949 0x40,
3950 // largest acked
3951 0x01,
3952 // Zero delta time.
3953 0x00, 0x00,
3954 // first ack block length.
3955 0x01,
3956 // num timestamps.
3957 0x01,
3958 // Delta from largest observed.
3959 0x01,
3960 // Delta time.
3961 0x10, 0x32, 0x54, 0x76,
3962 };
3963
QUICHE teama6ef0a62019-03-07 20:34:33 -05003964 unsigned char packet46[] = {
3965 // type (short header, 4 byte packet number)
3966 0x43,
3967 // connection_id
3968 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3969 // packet number
3970 0x12, 0x34, 0x56, 0x78,
3971
3972 // frame type (ack frame)
3973 // (no ack blocks, 1 byte largest observed, 1 byte block length)
3974 0x40,
3975 // largest acked
3976 0x01,
3977 // Zero delta time.
3978 0x00, 0x00,
3979 // first ack block length.
3980 0x01,
3981 // num timestamps.
3982 0x01,
3983 // Delta from largest observed.
3984 0x01,
3985 // Delta time.
3986 0x10, 0x32, 0x54, 0x76,
3987 };
3988 // clang-format on
fkastenholz305e1732019-06-18 05:01:22 -07003989 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07003990 // ACK Timestamp is not a feature of IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05003991 return;
3992 }
3993 QuicEncryptedPacket encrypted(
fayang36825da2019-08-21 14:01:27 -07003994 AsChars(framer_.transport_version() >= QUIC_VERSION_46 ? packet46
3995 : packet),
QUICHE teama6ef0a62019-03-07 20:34:33 -05003996 QUIC_ARRAYSIZE(packet), false);
3997 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
3998 EXPECT_TRUE(QuicTextUtils::StartsWith(
3999 framer_.detailed_error(), "delta_from_largest_observed too high"));
4000}
4001
4002TEST_P(QuicFramerTest, AckFrameTimeStampSecondDeltaTooHigh) {
nharper9bb83462019-05-01 10:53:22 -07004003 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004004 // clang-format off
4005 unsigned char packet[] = {
4006 // public flags (8 byte connection_id)
4007 0x28,
4008 // connection_id
4009 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4010 // packet number
4011 0x12, 0x34, 0x56, 0x78,
4012
4013 // frame type (ack frame)
4014 // (no ack blocks, 1 byte largest observed, 1 byte block length)
4015 0x40,
4016 // largest acked
4017 0x03,
4018 // Zero delta time.
4019 0x00, 0x00,
4020 // first ack block length.
4021 0x03,
4022 // num timestamps.
4023 0x02,
4024 // Delta from largest observed.
4025 0x01,
4026 // Delta time.
4027 0x10, 0x32, 0x54, 0x76,
4028 // Delta from largest observed.
4029 0x03,
4030 // Delta time.
4031 0x10, 0x32,
4032 };
4033
QUICHE teama6ef0a62019-03-07 20:34:33 -05004034 unsigned char packet46[] = {
4035 // type (short header, 4 byte packet number)
4036 0x43,
4037 // connection_id
4038 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4039 // packet number
4040 0x12, 0x34, 0x56, 0x78,
4041
4042 // frame type (ack frame)
4043 // (no ack blocks, 1 byte largest observed, 1 byte block length)
4044 0x40,
4045 // largest acked
4046 0x03,
4047 // Zero delta time.
4048 0x00, 0x00,
4049 // first ack block length.
4050 0x03,
4051 // num timestamps.
4052 0x02,
4053 // Delta from largest observed.
4054 0x01,
4055 // Delta time.
4056 0x10, 0x32, 0x54, 0x76,
4057 // Delta from largest observed.
4058 0x03,
4059 // Delta time.
4060 0x10, 0x32,
4061 };
4062 // clang-format on
fkastenholz305e1732019-06-18 05:01:22 -07004063 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07004064 // ACK Timestamp is not a feature of IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004065 return;
4066 }
4067 QuicEncryptedPacket encrypted(
fayang36825da2019-08-21 14:01:27 -07004068 AsChars(framer_.transport_version() >= QUIC_VERSION_46 ? packet46
4069 : packet),
QUICHE teama6ef0a62019-03-07 20:34:33 -05004070 QUIC_ARRAYSIZE(packet), false);
4071 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
4072 EXPECT_TRUE(QuicTextUtils::StartsWith(
4073 framer_.detailed_error(), "delta_from_largest_observed too high"));
4074}
4075
4076TEST_P(QuicFramerTest, NewStopWaitingFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07004077 if (VersionHasIetfQuicFrames(version_.transport_version)) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07004078 // The Stop Waiting frame is not in IETF QUIC
QUICHE teama6ef0a62019-03-07 20:34:33 -05004079 return;
4080 }
nharper9bb83462019-05-01 10:53:22 -07004081 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004082 // clang-format off
4083 PacketFragments packet = {
4084 // public flags (8 byte connection_id)
4085 {"",
4086 {0x2C}},
4087 // connection_id
4088 {"",
4089 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4090 // packet number
4091 {"",
4092 {0x12, 0x34, 0x56, 0x78}},
4093 // frame type (stop waiting frame)
4094 {"",
4095 {0x06}},
4096 // least packet number awaiting an ack, delta from packet number.
4097 {"Unable to read least unacked delta.",
4098 {0x00, 0x00, 0x00, 0x08}}
4099 };
4100
QUICHE teama6ef0a62019-03-07 20:34:33 -05004101 PacketFragments packet46 = {
4102 // type (short header, 4 byte packet number)
4103 {"",
4104 {0x43}},
4105 // connection_id
4106 {"",
4107 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4108 // packet number
4109 {"",
4110 {0x12, 0x34, 0x56, 0x78}},
4111 // frame type (stop waiting frame)
4112 {"",
4113 {0x06}},
4114 // least packet number awaiting an ack, delta from packet number.
4115 {"Unable to read least unacked delta.",
4116 {0x00, 0x00, 0x00, 0x08}}
4117 };
4118 // clang-format on
4119
4120 PacketFragments& fragments =
fayang36825da2019-08-21 14:01:27 -07004121 framer_.transport_version() >= QUIC_VERSION_46 ? packet46 : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004122
4123 std::unique_ptr<QuicEncryptedPacket> encrypted(
4124 AssemblePacketFromFragments(fragments));
ianswett97b690b2019-05-02 15:12:43 -07004125 if (GetQuicReloadableFlag(quic_do_not_accept_stop_waiting) &&
fayang36825da2019-08-21 14:01:27 -07004126 version_.transport_version >= QUIC_VERSION_46) {
ianswett97b690b2019-05-02 15:12:43 -07004127 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07004128 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_STOP_WAITING_DATA));
ianswett97b690b2019-05-02 15:12:43 -07004129 EXPECT_EQ("STOP WAITING not supported in version 44+.",
4130 framer_.detailed_error());
4131 return;
4132 }
4133
QUICHE teama6ef0a62019-03-07 20:34:33 -05004134 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4135
bncf6f82b12019-10-30 07:01:01 -07004136 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05004137 ASSERT_TRUE(visitor_.header_.get());
4138 EXPECT_TRUE(CheckDecryption(
4139 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4140 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4141
4142 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4143 ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size());
4144 const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0];
4145 EXPECT_EQ(kLeastUnacked, frame.least_unacked);
4146
4147 CheckFramingBoundaries(fragments, QUIC_INVALID_STOP_WAITING_DATA);
4148}
4149
4150TEST_P(QuicFramerTest, InvalidNewStopWaitingFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07004151 // The Stop Waiting frame is not in IETF QUIC
fkastenholz305e1732019-06-18 05:01:22 -07004152 if (VersionHasIetfQuicFrames(version_.transport_version) ||
ianswett97b690b2019-05-02 15:12:43 -07004153 (GetQuicReloadableFlag(quic_do_not_accept_stop_waiting) &&
fayang36825da2019-08-21 14:01:27 -07004154 version_.transport_version >= QUIC_VERSION_46)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004155 return;
4156 }
nharper9bb83462019-05-01 10:53:22 -07004157 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004158 // clang-format off
4159 unsigned char packet[] = {
4160 // public flags (8 byte connection_id)
4161 0x2C,
4162 // connection_id
4163 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4164 // packet number
4165 0x12, 0x34, 0x56, 0x78,
4166 // frame type (stop waiting frame)
4167 0x06,
4168 // least packet number awaiting an ack, delta from packet number.
4169 0x13, 0x34, 0x56, 0x78,
4170 0x9A, 0xA8,
4171 };
4172
QUICHE teama6ef0a62019-03-07 20:34:33 -05004173 unsigned char packet46[] = {
4174 // type (short header, 4 byte packet number)
4175 0x43,
4176 // connection_id
4177 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4178 // packet number
4179 0x12, 0x34, 0x56, 0x78,
4180 // frame type (stop waiting frame)
4181 0x06,
4182 // least packet number awaiting an ack, delta from packet number.
4183 0x57, 0x78, 0x9A, 0xA8,
4184 };
4185 // clang-format on
4186
4187 QuicEncryptedPacket encrypted(
fayang36825da2019-08-21 14:01:27 -07004188 AsChars(framer_.transport_version() >= QUIC_VERSION_46 ? packet46
4189 : packet),
4190 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46)
QUICHE teama6ef0a62019-03-07 20:34:33 -05004191 : QUIC_ARRAYSIZE(packet),
4192 false);
4193 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07004194 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_STOP_WAITING_DATA));
QUICHE teama6ef0a62019-03-07 20:34:33 -05004195 EXPECT_EQ("Invalid unacked delta.", framer_.detailed_error());
4196}
4197
4198TEST_P(QuicFramerTest, RstStreamFrame) {
zhongyi546cc452019-04-12 15:27:49 -07004199 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004200 // clang-format off
4201 PacketFragments packet = {
4202 // public flags (8 byte connection_id)
4203 {"",
4204 {0x28}},
4205 // connection_id
4206 {"",
4207 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4208 // packet number
4209 {"",
4210 {0x12, 0x34, 0x56, 0x78}},
4211 // frame type (rst stream frame)
4212 {"",
4213 {0x01}},
4214 // stream id
4215 {"Unable to read stream_id.",
4216 {0x01, 0x02, 0x03, 0x04}},
4217 // sent byte offset
4218 {"Unable to read rst stream sent byte offset.",
4219 {0x3A, 0x98, 0xFE, 0xDC,
4220 0x32, 0x10, 0x76, 0x54}},
4221 // error code
4222 {"Unable to read rst stream error code.",
4223 {0x00, 0x00, 0x00, 0x01}}
4224 };
4225
QUICHE teama6ef0a62019-03-07 20:34:33 -05004226 PacketFragments packet46 = {
4227 // type (short header, 4 byte packet number)
4228 {"",
4229 {0x43}},
4230 // connection_id
4231 {"",
4232 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4233 // packet number
4234 {"",
4235 {0x12, 0x34, 0x56, 0x78}},
4236 // frame type (rst stream frame)
4237 {"",
4238 {0x01}},
4239 // stream id
4240 {"Unable to read stream_id.",
4241 {0x01, 0x02, 0x03, 0x04}},
4242 // sent byte offset
4243 {"Unable to read rst stream sent byte offset.",
4244 {0x3A, 0x98, 0xFE, 0xDC,
4245 0x32, 0x10, 0x76, 0x54}},
4246 // error code
4247 {"Unable to read rst stream error code.",
4248 {0x00, 0x00, 0x00, 0x01}}
4249 };
4250
4251 PacketFragments packet99 = {
4252 // type (short header, 4 byte packet number)
4253 {"",
4254 {0x43}},
4255 // connection_id
4256 {"",
4257 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4258 // packet number
4259 {"",
4260 {0x12, 0x34, 0x56, 0x78}},
4261 // frame type (IETF_RST_STREAM frame)
4262 {"",
4263 {0x04}},
4264 // stream id
4265 {"Unable to read rst stream stream id.",
4266 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4267 // application error code
4268 {"Unable to read rst stream error code.",
fkastenholz07300e52019-07-16 11:51:37 -07004269 {kVarInt62OneByte + 0x01}},
QUICHE teama6ef0a62019-03-07 20:34:33 -05004270 // Final Offset
4271 {"Unable to read rst stream sent byte offset.",
4272 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}}
4273 };
4274 // clang-format on
4275
4276 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07004277 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05004278 ? packet99
fayang36825da2019-08-21 14:01:27 -07004279 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
4280 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004281 std::unique_ptr<QuicEncryptedPacket> encrypted(
4282 AssemblePacketFromFragments(fragments));
4283 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4284
bncf6f82b12019-10-30 07:01:01 -07004285 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05004286 ASSERT_TRUE(visitor_.header_.get());
4287 EXPECT_TRUE(CheckDecryption(
4288 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4289 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4290
4291 EXPECT_EQ(kStreamId, visitor_.rst_stream_frame_.stream_id);
4292 EXPECT_EQ(0x01, visitor_.rst_stream_frame_.error_code);
4293 EXPECT_EQ(kStreamOffset, visitor_.rst_stream_frame_.byte_offset);
4294 CheckFramingBoundaries(fragments, QUIC_INVALID_RST_STREAM_DATA);
4295}
4296
4297TEST_P(QuicFramerTest, ConnectionCloseFrame) {
zhongyi546cc452019-04-12 15:27:49 -07004298 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004299 // clang-format off
4300 PacketFragments packet = {
4301 // public flags (8 byte connection_id)
4302 {"",
4303 {0x28}},
4304 // connection_id
4305 {"",
4306 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4307 // packet number
4308 {"",
4309 {0x12, 0x34, 0x56, 0x78}},
4310 // frame type (connection close frame)
4311 {"",
4312 {0x02}},
4313 // error code
4314 {"Unable to read connection close error code.",
4315 {0x00, 0x00, 0x00, 0x11}},
4316 {"Unable to read connection close error details.",
4317 {
4318 // error details length
4319 0x0, 0x0d,
4320 // error details
4321 'b', 'e', 'c', 'a',
4322 'u', 's', 'e', ' ',
4323 'I', ' ', 'c', 'a',
4324 'n'}
4325 }
4326 };
4327
QUICHE teama6ef0a62019-03-07 20:34:33 -05004328 PacketFragments packet46 = {
4329 // type (short header, 4 byte packet number)
4330 {"",
4331 {0x43}},
4332 // connection_id
4333 {"",
4334 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4335 // packet number
4336 {"",
4337 {0x12, 0x34, 0x56, 0x78}},
4338 // frame type (connection close frame)
4339 {"",
4340 {0x02}},
4341 // error code
4342 {"Unable to read connection close error code.",
4343 {0x00, 0x00, 0x00, 0x11}},
4344 {"Unable to read connection close error details.",
4345 {
4346 // error details length
4347 0x0, 0x0d,
4348 // error details
4349 'b', 'e', 'c', 'a',
4350 'u', 's', 'e', ' ',
4351 'I', ' ', 'c', 'a',
4352 'n'}
4353 }
4354 };
4355
4356 PacketFragments packet99 = {
4357 // type (short header, 4 byte packet number)
4358 {"",
4359 {0x43}},
4360 // connection_id
4361 {"",
4362 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4363 // packet number
4364 {"",
4365 {0x12, 0x34, 0x56, 0x78}},
fkastenholzb4dade72019-08-05 06:54:20 -07004366 // frame type (IETF Transport CONNECTION_CLOSE frame)
QUICHE teama6ef0a62019-03-07 20:34:33 -05004367 {"",
4368 {0x1c}},
4369 // error code
4370 {"Unable to read connection close error code.",
fkastenholzd57d3f92019-07-16 09:05:17 -07004371 {kVarInt62TwoBytes + 0x00, 0x11}},
QUICHE teama6ef0a62019-03-07 20:34:33 -05004372 {"Unable to read connection close frame type.",
4373 {kVarInt62TwoBytes + 0x12, 0x34 }},
4374 {"Unable to read connection close error details.",
4375 {
4376 // error details length
4377 kVarInt62OneByte + 0x0d,
4378 // error details
4379 'b', 'e', 'c', 'a',
4380 'u', 's', 'e', ' ',
4381 'I', ' ', 'c', 'a',
4382 'n'}
4383 }
4384 };
4385 // clang-format on
4386
4387 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07004388 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05004389 ? packet99
fayang36825da2019-08-21 14:01:27 -07004390 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
4391 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004392 std::unique_ptr<QuicEncryptedPacket> encrypted(
4393 AssemblePacketFromFragments(fragments));
4394 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4395
bncf6f82b12019-10-30 07:01:01 -07004396 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05004397 ASSERT_TRUE(visitor_.header_.get());
4398 EXPECT_TRUE(CheckDecryption(
4399 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4400 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4401
4402 EXPECT_EQ(0u, visitor_.stream_frames_.size());
zhongyiba6354a2019-04-10 16:49:25 -07004403 EXPECT_EQ(0x11u, static_cast<unsigned>(
4404 visitor_.connection_close_frame_.quic_error_code));
QUICHE teama6ef0a62019-03-07 20:34:33 -05004405 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
fkastenholz305e1732019-06-18 05:01:22 -07004406 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholze9d71a82019-04-09 05:12:13 -07004407 EXPECT_EQ(0x1234u,
4408 visitor_.connection_close_frame_.transport_close_frame_type);
bncf6f82b12019-10-30 07:01:01 -07004409 EXPECT_THAT(visitor_.connection_close_frame_.extracted_error_code,
4410 IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
fkastenholza14a7ae2019-08-07 05:21:22 -07004411 } else {
4412 // For Google QUIC closes, the error code is copied into
4413 // extracted_error_code.
4414 EXPECT_EQ(0x11u,
4415 static_cast<unsigned>(
4416 visitor_.connection_close_frame_.extracted_error_code));
fkastenholzb4dade72019-08-05 06:54:20 -07004417 }
4418
4419 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4420
4421 CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4422}
4423
4424// As above, but checks that for Google-QUIC, if there happens
4425// to be an ErrorCode string at the start of the details, it is
4426// NOT extracted/parsed/folded/spindled/and/mutilated.
4427TEST_P(QuicFramerTest, ConnectionCloseFrameWithExtractedInfoIgnoreGCuic) {
4428 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4429
4430 // clang-format off
4431 PacketFragments packet = {
4432 // public flags (8 byte connection_id)
4433 {"",
4434 {0x28}},
4435 // connection_id
4436 {"",
4437 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4438 // packet number
4439 {"",
4440 {0x12, 0x34, 0x56, 0x78}},
4441 // frame type (connection close frame)
4442 {"",
4443 {0x02}},
4444 // error code
4445 {"Unable to read connection close error code.",
4446 {0x00, 0x00, 0x00, 0x11}},
4447 {"Unable to read connection close error details.",
4448 {
4449 // error details length
4450 0x0, 0x13,
4451 // error details
4452 '1', '7', '7', '6',
4453 '7', ':', 'b', 'e',
4454 'c', 'a', 'u', 's',
4455 'e', ' ', 'I', ' ',
4456 'c', 'a', 'n'}
4457 }
4458 };
4459
fkastenholzb4dade72019-08-05 06:54:20 -07004460 PacketFragments packet46 = {
4461 // type (short header, 4 byte packet number)
4462 {"",
4463 {0x43}},
4464 // connection_id
4465 {"",
4466 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4467 // packet number
4468 {"",
4469 {0x12, 0x34, 0x56, 0x78}},
4470 // frame type (connection close frame)
4471 {"",
4472 {0x02}},
4473 // error code
4474 {"Unable to read connection close error code.",
4475 {0x00, 0x00, 0x00, 0x11}},
4476 {"Unable to read connection close error details.",
4477 {
4478 // error details length
4479 0x0, 0x13,
4480 // error details
4481 '1', '7', '7', '6',
4482 '7', ':', 'b', 'e',
4483 'c', 'a', 'u', 's',
4484 'e', ' ', 'I', ' ',
4485 'c', 'a', 'n'}
4486 }
4487 };
4488
4489 PacketFragments packet99 = {
4490 // type (short header, 4 byte packet number)
4491 {"",
4492 {0x43}},
4493 // connection_id
4494 {"",
4495 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4496 // packet number
4497 {"",
4498 {0x12, 0x34, 0x56, 0x78}},
4499 // frame type (IETF Transport CONNECTION_CLOSE frame)
4500 {"",
4501 {0x1c}},
4502 // error code
4503 {"Unable to read connection close error code.",
4504 {kVarInt62OneByte + 0x11}},
4505 {"Unable to read connection close frame type.",
4506 {kVarInt62TwoBytes + 0x12, 0x34 }},
4507 {"Unable to read connection close error details.",
4508 {
4509 // error details length
4510 kVarInt62OneByte + 0x13,
4511 // error details
4512 '1', '7', '7', '6',
4513 '7', ':', 'b', 'e',
4514 'c', 'a', 'u', 's',
4515 'e', ' ', 'I', ' ',
4516 'c', 'a', 'n'}
4517 }
4518 };
4519 // clang-format on
4520
4521 PacketFragments& fragments =
4522 VersionHasIetfQuicFrames(framer_.transport_version())
4523 ? packet99
fayang36825da2019-08-21 14:01:27 -07004524 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
4525 : packet);
fkastenholzb4dade72019-08-05 06:54:20 -07004526 std::unique_ptr<QuicEncryptedPacket> encrypted(
4527 AssemblePacketFromFragments(fragments));
4528 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4529
bncf6f82b12019-10-30 07:01:01 -07004530 EXPECT_THAT(framer_.error(), IsQuicNoError());
fkastenholzb4dade72019-08-05 06:54:20 -07004531 ASSERT_TRUE(visitor_.header_.get());
4532 EXPECT_TRUE(CheckDecryption(
4533 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4534 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4535
4536 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4537 EXPECT_EQ(0x11u, static_cast<unsigned>(
4538 visitor_.connection_close_frame_.quic_error_code));
fkastenholz488a4622019-08-26 06:24:46 -07004539
fkastenholzb4dade72019-08-05 06:54:20 -07004540 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4541 EXPECT_EQ(0x1234u,
4542 visitor_.connection_close_frame_.transport_close_frame_type);
4543 EXPECT_EQ(17767u, visitor_.connection_close_frame_.extracted_error_code);
fkastenholz488a4622019-08-26 06:24:46 -07004544 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
fkastenholzb4dade72019-08-05 06:54:20 -07004545 } else {
fkastenholza14a7ae2019-08-07 05:21:22 -07004546 EXPECT_EQ(0x11u, visitor_.connection_close_frame_.extracted_error_code);
fkastenholz488a4622019-08-26 06:24:46 -07004547 // Error code is not prepended in GQUIC, so it is not removed and should
4548 // remain in the reason phrase.
4549 EXPECT_EQ("17767:because I can",
4550 visitor_.connection_close_frame_.error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004551 }
4552
4553 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4554
4555 CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4556}
4557
fkastenholz04bd4f32019-04-16 12:24:38 -07004558// Test the CONNECTION_CLOSE/Application variant.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004559TEST_P(QuicFramerTest, ApplicationCloseFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07004560 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07004561 // This frame is only in IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004562 return;
4563 }
zhongyi546cc452019-04-12 15:27:49 -07004564 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004565
4566 // clang-format off
4567 PacketFragments packet99 = {
4568 // type (short header, 4 byte packet number)
4569 {"",
4570 {0x43}},
4571 // connection_id
4572 {"",
4573 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4574 // packet number
4575 {"",
4576 {0x12, 0x34, 0x56, 0x78}},
fkastenholz72f509b2019-04-10 09:17:49 -07004577 // frame type (IETF_CONNECTION_CLOSE/Application frame)
QUICHE teama6ef0a62019-03-07 20:34:33 -05004578 {"",
4579 {0x1d}},
4580 // error code
fkastenholz72f509b2019-04-10 09:17:49 -07004581 {"Unable to read connection close error code.",
fkastenholzd57d3f92019-07-16 09:05:17 -07004582 {kVarInt62TwoBytes + 0x00, 0x11}},
fkastenholz72f509b2019-04-10 09:17:49 -07004583 {"Unable to read connection close error details.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05004584 {
4585 // error details length
4586 kVarInt62OneByte + 0x0d,
4587 // error details
4588 'b', 'e', 'c', 'a',
4589 'u', 's', 'e', ' ',
4590 'I', ' ', 'c', 'a',
4591 'n'}
4592 }
4593 };
4594 // clang-format on
4595
4596 std::unique_ptr<QuicEncryptedPacket> encrypted(
4597 AssemblePacketFromFragments(packet99));
4598 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4599
bncf6f82b12019-10-30 07:01:01 -07004600 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05004601 ASSERT_TRUE(visitor_.header_.get());
4602 EXPECT_TRUE(CheckDecryption(
4603 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4604 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4605
4606 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4607
fkastenholz72f509b2019-04-10 09:17:49 -07004608 EXPECT_EQ(IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
4609 visitor_.connection_close_frame_.close_type);
4610 EXPECT_EQ(122u, visitor_.connection_close_frame_.extracted_error_code);
fkastenholz88d08f42019-09-06 07:38:04 -07004611 EXPECT_EQ(0x11u, visitor_.connection_close_frame_.quic_error_code);
fkastenholz72f509b2019-04-10 09:17:49 -07004612 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004613
4614 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4615
fkastenholz04bd4f32019-04-16 12:24:38 -07004616 CheckFramingBoundaries(packet99, QUIC_INVALID_CONNECTION_CLOSE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004617}
4618
fkastenholzb4dade72019-08-05 06:54:20 -07004619// Check that we can extract an error code from an application close.
4620TEST_P(QuicFramerTest, ApplicationCloseFrameExtract) {
4621 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07004622 // This frame is only in IETF QUIC.
fkastenholzb4dade72019-08-05 06:54:20 -07004623 return;
4624 }
4625 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4626
4627 // clang-format off
4628 PacketFragments packet99 = {
4629 // type (short header, 4 byte packet number)
4630 {"",
4631 {0x43}},
4632 // connection_id
4633 {"",
4634 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4635 // packet number
4636 {"",
4637 {0x12, 0x34, 0x56, 0x78}},
4638 // frame type (IETF_CONNECTION_CLOSE/Application frame)
4639 {"",
4640 {0x1d}},
4641 // error code
4642 {"Unable to read connection close error code.",
4643 {kVarInt62OneByte + 0x11}},
4644 {"Unable to read connection close error details.",
4645 {
4646 // error details length
4647 kVarInt62OneByte + 0x13,
4648 // error details
4649 '1', '7', '7', '6',
4650 '7', ':', 'b', 'e',
4651 'c', 'a', 'u', 's',
4652 'e', ' ', 'I', ' ',
4653 'c', 'a', 'n'}
4654 }
4655 };
4656 // clang-format on
4657
4658 std::unique_ptr<QuicEncryptedPacket> encrypted(
4659 AssemblePacketFromFragments(packet99));
4660 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4661
bncf6f82b12019-10-30 07:01:01 -07004662 EXPECT_THAT(framer_.error(), IsQuicNoError());
fkastenholzb4dade72019-08-05 06:54:20 -07004663 ASSERT_TRUE(visitor_.header_.get());
4664 EXPECT_TRUE(CheckDecryption(
4665 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4666 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4667
4668 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4669
4670 EXPECT_EQ(IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
4671 visitor_.connection_close_frame_.close_type);
4672 EXPECT_EQ(17767u, visitor_.connection_close_frame_.extracted_error_code);
4673 EXPECT_EQ(0x11u, visitor_.connection_close_frame_.quic_error_code);
fkastenholz488a4622019-08-26 06:24:46 -07004674 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
fkastenholzb4dade72019-08-05 06:54:20 -07004675
4676 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4677
4678 CheckFramingBoundaries(packet99, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4679}
4680
QUICHE teama6ef0a62019-03-07 20:34:33 -05004681TEST_P(QuicFramerTest, GoAwayFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07004682 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07004683 // This frame is not in IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004684 return;
4685 }
nharper9bb83462019-05-01 10:53:22 -07004686 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004687 // clang-format off
4688 PacketFragments packet = {
4689 // public flags (8 byte connection_id)
4690 {"",
4691 {0x28}},
4692 // connection_id
4693 {"",
4694 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4695 // packet number
4696 {"",
4697 {0x12, 0x34, 0x56, 0x78}},
4698 // frame type (go away frame)
4699 {"",
4700 {0x03}},
4701 // error code
4702 {"Unable to read go away error code.",
4703 {0x00, 0x00, 0x00, 0x09}},
4704 // stream id
4705 {"Unable to read last good stream id.",
4706 {0x01, 0x02, 0x03, 0x04}},
4707 // stream id
4708 {"Unable to read goaway reason.",
4709 {
4710 // error details length
4711 0x0, 0x0d,
4712 // error details
4713 'b', 'e', 'c', 'a',
4714 'u', 's', 'e', ' ',
4715 'I', ' ', 'c', 'a',
4716 'n'}
4717 }
4718 };
4719
QUICHE teama6ef0a62019-03-07 20:34:33 -05004720 PacketFragments packet46 = {
4721 // type (short header, 4 byte packet number)
4722 {"",
4723 {0x43}},
4724 // connection_id
4725 {"",
4726 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4727 // packet number
4728 {"",
4729 {0x12, 0x34, 0x56, 0x78}},
4730 // frame type (go away frame)
4731 {"",
4732 {0x03}},
4733 // error code
4734 {"Unable to read go away error code.",
4735 {0x00, 0x00, 0x00, 0x09}},
4736 // stream id
4737 {"Unable to read last good stream id.",
4738 {0x01, 0x02, 0x03, 0x04}},
4739 // stream id
4740 {"Unable to read goaway reason.",
4741 {
4742 // error details length
4743 0x0, 0x0d,
4744 // error details
4745 'b', 'e', 'c', 'a',
4746 'u', 's', 'e', ' ',
4747 'I', ' ', 'c', 'a',
4748 'n'}
4749 }
4750 };
4751 // clang-format on
4752
4753 PacketFragments& fragments =
fayang36825da2019-08-21 14:01:27 -07004754 framer_.transport_version() >= QUIC_VERSION_46 ? packet46 : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004755 std::unique_ptr<QuicEncryptedPacket> encrypted(
4756 AssemblePacketFromFragments(fragments));
4757 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4758
bncf6f82b12019-10-30 07:01:01 -07004759 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05004760 ASSERT_TRUE(visitor_.header_.get());
4761 EXPECT_TRUE(CheckDecryption(
4762 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4763 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4764
4765 EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id);
fkastenholz88d08f42019-09-06 07:38:04 -07004766 EXPECT_EQ(0x9u, visitor_.goaway_frame_.error_code);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004767 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase);
4768
4769 CheckFramingBoundaries(fragments, QUIC_INVALID_GOAWAY_DATA);
4770}
4771
4772TEST_P(QuicFramerTest, WindowUpdateFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07004773 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07004774 // This frame is not in IETF QUIC, see MaxDataFrame and MaxStreamDataFrame
4775 // for IETF QUIC equivalents.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004776 return;
4777 }
nharper9bb83462019-05-01 10:53:22 -07004778 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004779 // clang-format off
4780 PacketFragments packet = {
4781 // public flags (8 byte connection_id)
4782 {"",
4783 {0x28}},
4784 // connection_id
4785 {"",
4786 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4787 // packet number
4788 {"",
4789 {0x12, 0x34, 0x56, 0x78}},
4790 // frame type (window update frame)
4791 {"",
4792 {0x04}},
4793 // stream id
4794 {"Unable to read stream_id.",
4795 {0x01, 0x02, 0x03, 0x04}},
4796 // byte offset
4797 {"Unable to read window byte_offset.",
4798 {0x3A, 0x98, 0xFE, 0xDC,
4799 0x32, 0x10, 0x76, 0x54}},
4800 };
4801
QUICHE teama6ef0a62019-03-07 20:34:33 -05004802 PacketFragments packet46 = {
4803 // type (short header, 4 byte packet number)
4804 {"",
4805 {0x43}},
4806 // connection_id
4807 {"",
4808 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4809 // packet number
4810 {"",
4811 {0x12, 0x34, 0x56, 0x78}},
4812 // frame type (window update frame)
4813 {"",
4814 {0x04}},
4815 // stream id
4816 {"Unable to read stream_id.",
4817 {0x01, 0x02, 0x03, 0x04}},
4818 // byte offset
4819 {"Unable to read window byte_offset.",
4820 {0x3A, 0x98, 0xFE, 0xDC,
4821 0x32, 0x10, 0x76, 0x54}},
4822 };
4823
4824 // clang-format on
4825
4826 PacketFragments& fragments =
fayang36825da2019-08-21 14:01:27 -07004827 framer_.transport_version() >= QUIC_VERSION_46 ? packet46 : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004828 std::unique_ptr<QuicEncryptedPacket> encrypted(
4829 AssemblePacketFromFragments(fragments));
4830 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4831
bncf6f82b12019-10-30 07:01:01 -07004832 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05004833 ASSERT_TRUE(visitor_.header_.get());
4834 EXPECT_TRUE(CheckDecryption(
4835 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4836 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4837
4838 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
renjietangd088eab2019-11-21 14:54:41 -08004839 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004840
4841 CheckFramingBoundaries(fragments, QUIC_INVALID_WINDOW_UPDATE_DATA);
4842}
4843
4844TEST_P(QuicFramerTest, MaxDataFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07004845 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07004846 // This frame is available only in IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004847 return;
4848 }
zhongyi546cc452019-04-12 15:27:49 -07004849 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004850 // clang-format off
4851 PacketFragments packet99 = {
4852 // type (short header, 4 byte packet number)
4853 {"",
4854 {0x43}},
4855 // connection_id
4856 {"",
4857 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4858 // packet number
4859 {"",
4860 {0x12, 0x34, 0x56, 0x78}},
4861 // frame type (IETF_MAX_DATA frame)
4862 {"",
4863 {0x10}},
4864 // byte offset
4865 {"Can not read MAX_DATA byte-offset",
4866 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
4867 0x32, 0x10, 0x76, 0x54}},
4868 };
4869 // clang-format on
4870
4871 std::unique_ptr<QuicEncryptedPacket> encrypted(
4872 AssemblePacketFromFragments(packet99));
4873 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4874
bncf6f82b12019-10-30 07:01:01 -07004875 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05004876 ASSERT_TRUE(visitor_.header_.get());
4877 EXPECT_TRUE(CheckDecryption(
4878 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4879 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4880
4881 EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
4882 visitor_.window_update_frame_.stream_id);
renjietangd088eab2019-11-21 14:54:41 -08004883 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004884
4885 CheckFramingBoundaries(packet99, QUIC_INVALID_MAX_DATA_FRAME_DATA);
4886}
4887
4888TEST_P(QuicFramerTest, MaxStreamDataFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07004889 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07004890 // This frame available only in IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004891 return;
4892 }
zhongyi546cc452019-04-12 15:27:49 -07004893 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004894 // clang-format off
4895 PacketFragments packet99 = {
4896 // type (short header, 4 byte packet number)
4897 {"",
4898 {0x43}},
4899 // connection_id
4900 {"",
4901 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4902 // packet number
4903 {"",
4904 {0x12, 0x34, 0x56, 0x78}},
4905 // frame type (IETF_MAX_STREAM_DATA frame)
4906 {"",
4907 {0x11}},
4908 // stream id
4909 {"Can not read MAX_STREAM_DATA stream id",
4910 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4911 // byte offset
4912 {"Can not read MAX_STREAM_DATA byte-count",
4913 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
4914 0x32, 0x10, 0x76, 0x54}},
4915 };
4916 // clang-format on
4917
4918 std::unique_ptr<QuicEncryptedPacket> encrypted(
4919 AssemblePacketFromFragments(packet99));
4920 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4921
bncf6f82b12019-10-30 07:01:01 -07004922 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05004923 ASSERT_TRUE(visitor_.header_.get());
4924 EXPECT_TRUE(CheckDecryption(
4925 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4926 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4927
4928 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
renjietangd088eab2019-11-21 14:54:41 -08004929 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004930
4931 CheckFramingBoundaries(packet99, QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA);
4932}
4933
4934TEST_P(QuicFramerTest, BlockedFrame) {
zhongyi546cc452019-04-12 15:27:49 -07004935 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004936 // clang-format off
4937 PacketFragments packet = {
4938 // public flags (8 byte connection_id)
4939 {"",
4940 {0x28}},
4941 // connection_id
4942 {"",
4943 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4944 // packet number
4945 {"",
4946 {0x12, 0x34, 0x56, 0x78}},
4947 // frame type (blocked frame)
4948 {"",
4949 {0x05}},
4950 // stream id
4951 {"Unable to read stream_id.",
4952 {0x01, 0x02, 0x03, 0x04}},
4953 };
4954
QUICHE teama6ef0a62019-03-07 20:34:33 -05004955 PacketFragments packet46 = {
4956 // type (short header, 4 byte packet number)
4957 {"",
4958 {0x43}},
4959 // connection_id
4960 {"",
4961 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4962 // packet number
4963 {"",
4964 {0x12, 0x34, 0x56, 0x78}},
4965 // frame type (blocked frame)
4966 {"",
4967 {0x05}},
4968 // stream id
4969 {"Unable to read stream_id.",
4970 {0x01, 0x02, 0x03, 0x04}},
4971 };
4972
4973 PacketFragments packet99 = {
4974 // type (short header, 4 byte packet number)
4975 {"",
4976 {0x43}},
4977 // connection_id
4978 {"",
4979 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4980 // packet number
4981 {"",
4982 {0x12, 0x34, 0x56, 0x78}},
4983 // frame type (IETF_STREAM_BLOCKED frame)
4984 {"",
4985 {0x15}},
4986 // stream id
4987 {"Can not read stream blocked stream id.",
4988 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4989 // Offset
4990 {"Can not read stream blocked offset.",
4991 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
4992 };
4993 // clang-format on
4994
4995 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07004996 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05004997 ? packet99
fayang36825da2019-08-21 14:01:27 -07004998 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
4999 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005000 std::unique_ptr<QuicEncryptedPacket> encrypted(
5001 AssemblePacketFromFragments(fragments));
5002 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5003
bncf6f82b12019-10-30 07:01:01 -07005004 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005005 ASSERT_TRUE(visitor_.header_.get());
5006 EXPECT_TRUE(CheckDecryption(
5007 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5008 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
5009
fkastenholz305e1732019-06-18 05:01:22 -07005010 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005011 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
5012 } else {
5013 EXPECT_EQ(0u, visitor_.blocked_frame_.offset);
5014 }
5015 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
5016
fkastenholz305e1732019-06-18 05:01:22 -07005017 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005018 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_BLOCKED_DATA);
5019 } else {
5020 CheckFramingBoundaries(fragments, QUIC_INVALID_BLOCKED_DATA);
5021 }
5022}
5023
5024TEST_P(QuicFramerTest, PingFrame) {
zhongyi546cc452019-04-12 15:27:49 -07005025 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005026 // clang-format off
5027 unsigned char packet[] = {
5028 // public flags (8 byte connection_id)
5029 0x28,
5030 // connection_id
5031 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5032 // packet number
5033 0x12, 0x34, 0x56, 0x78,
5034
5035 // frame type (ping frame)
5036 0x07,
5037 };
5038
QUICHE teama6ef0a62019-03-07 20:34:33 -05005039 unsigned char packet46[] = {
5040 // type (short header, 4 byte packet number)
5041 0x43,
5042 // connection_id
5043 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5044 // packet number
5045 0x12, 0x34, 0x56, 0x78,
5046
5047 // frame type
5048 0x07,
5049 };
5050
5051 unsigned char packet99[] = {
5052 // type (short header, 4 byte packet number)
5053 0x43,
5054 // connection_id
5055 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5056 // packet number
5057 0x12, 0x34, 0x56, 0x78,
5058
5059 // frame type (IETF_PING frame)
5060 0x01,
5061 };
5062 // clang-format on
5063
5064 QuicEncryptedPacket encrypted(
fkastenholz305e1732019-06-18 05:01:22 -07005065 AsChars(VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05005066 ? packet99
fayang36825da2019-08-21 14:01:27 -07005067 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
5068 : packet)),
fkastenholz305e1732019-06-18 05:01:22 -07005069 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05005070 ? QUIC_ARRAYSIZE(packet99)
fayang36825da2019-08-21 14:01:27 -07005071 : (framer_.transport_version() >= QUIC_VERSION_46
QUICHE teama6ef0a62019-03-07 20:34:33 -05005072 ? QUIC_ARRAYSIZE(packet46)
fayang36825da2019-08-21 14:01:27 -07005073 : QUIC_ARRAYSIZE(packet)),
QUICHE teama6ef0a62019-03-07 20:34:33 -05005074 false);
5075 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5076
bncf6f82b12019-10-30 07:01:01 -07005077 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005078 ASSERT_TRUE(visitor_.header_.get());
5079 EXPECT_TRUE(CheckDecryption(
5080 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5081 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
5082
5083 EXPECT_EQ(1u, visitor_.ping_frames_.size());
5084
5085 // No need to check the PING frame boundaries because it has no payload.
5086}
5087
5088TEST_P(QuicFramerTest, MessageFrame) {
dschinazicd86dd12019-11-14 10:11:13 -08005089 if (!VersionSupportsMessageFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005090 return;
5091 }
zhongyi546cc452019-04-12 15:27:49 -07005092 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005093 // clang-format off
QUICHE teama6ef0a62019-03-07 20:34:33 -05005094 PacketFragments packet46 = {
5095 // type (short header, 4 byte packet number)
5096 {"",
5097 {0x43}},
5098 // connection_id
5099 {"",
5100 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5101 // packet number
5102 {"",
5103 {0x12, 0x34, 0x56, 0x78}},
5104 // message frame type.
5105 {"",
5106 { 0x21 }},
5107 // message length
5108 {"Unable to read message length",
5109 {0x07}},
5110 // message data
5111 {"Unable to read message data",
5112 {'m', 'e', 's', 's', 'a', 'g', 'e'}},
5113 // message frame no length.
5114 {"",
5115 { 0x20 }},
5116 // message data
5117 {{},
5118 {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
5119 };
dschinazicd86dd12019-11-14 10:11:13 -08005120 PacketFragments packet99 = {
5121 // type (short header, 4 byte packet number)
5122 {"",
5123 {0x43}},
5124 // connection_id
5125 {"",
5126 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5127 // packet number
5128 {"",
5129 {0x12, 0x34, 0x56, 0x78}},
5130 // message frame type.
5131 {"",
5132 { 0x31 }},
5133 // message length
5134 {"Unable to read message length",
5135 {0x07}},
5136 // message data
5137 {"Unable to read message data",
5138 {'m', 'e', 's', 's', 'a', 'g', 'e'}},
5139 // message frame no length.
5140 {"",
5141 { 0x30 }},
5142 // message data
5143 {{},
5144 {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
5145 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05005146 // clang-format on
5147
dschinazicd86dd12019-11-14 10:11:13 -08005148 std::unique_ptr<QuicEncryptedPacket> encrypted;
5149 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5150 encrypted = AssemblePacketFromFragments(packet99);
5151 } else {
5152 encrypted = AssemblePacketFromFragments(packet46);
5153 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005154 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5155
bncf6f82b12019-10-30 07:01:01 -07005156 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005157 ASSERT_TRUE(visitor_.header_.get());
5158 EXPECT_TRUE(CheckDecryption(
5159 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5160 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
5161
5162 ASSERT_EQ(2u, visitor_.message_frames_.size());
5163 EXPECT_EQ(7u, visitor_.message_frames_[0]->message_length);
5164 EXPECT_EQ(8u, visitor_.message_frames_[1]->message_length);
5165
dschinazicd86dd12019-11-14 10:11:13 -08005166 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5167 CheckFramingBoundaries(packet99, QUIC_INVALID_MESSAGE_DATA);
5168 } else {
5169 CheckFramingBoundaries(packet46, QUIC_INVALID_MESSAGE_DATA);
5170 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005171}
5172
5173TEST_P(QuicFramerTest, PublicResetPacketV33) {
5174 // clang-format off
5175 PacketFragments packet = {
5176 // public flags (public reset, 8 byte connection_id)
5177 {"",
5178 {0x0A}},
5179 // connection_id
5180 {"",
5181 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5182 {"Unable to read reset message.",
5183 {
5184 // message tag (kPRST)
5185 'P', 'R', 'S', 'T',
5186 // num_entries (2) + padding
5187 0x02, 0x00, 0x00, 0x00,
5188 // tag kRNON
5189 'R', 'N', 'O', 'N',
5190 // end offset 8
5191 0x08, 0x00, 0x00, 0x00,
5192 // tag kRSEQ
5193 'R', 'S', 'E', 'Q',
5194 // end offset 16
5195 0x10, 0x00, 0x00, 0x00,
5196 // nonce proof
5197 0x89, 0x67, 0x45, 0x23,
5198 0x01, 0xEF, 0xCD, 0xAB,
5199 // rejected packet number
5200 0xBC, 0x9A, 0x78, 0x56,
5201 0x34, 0x12, 0x00, 0x00,
5202 }
5203 }
5204 };
5205 // clang-format on
5206 if (framer_.transport_version() > QUIC_VERSION_43) {
5207 return;
5208 }
5209
5210 std::unique_ptr<QuicEncryptedPacket> encrypted(
5211 AssemblePacketFromFragments(packet));
5212 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07005213 ASSERT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005214 ASSERT_TRUE(visitor_.public_reset_packet_.get());
5215 EXPECT_EQ(FramerTestConnectionId(),
5216 visitor_.public_reset_packet_->connection_id);
5217 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof);
5218 EXPECT_EQ(
5219 IpAddressFamily::IP_UNSPEC,
5220 visitor_.public_reset_packet_->client_address.host().address_family());
5221
5222 CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
5223}
5224
5225TEST_P(QuicFramerTest, PublicResetPacket) {
5226 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5227
5228 // clang-format off
5229 PacketFragments packet = {
5230 // public flags (public reset, 8 byte connection_id)
5231 {"",
5232 {0x0E}},
5233 // connection_id
5234 {"",
5235 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5236 {"Unable to read reset message.",
5237 {
5238 // message tag (kPRST)
5239 'P', 'R', 'S', 'T',
5240 // num_entries (2) + padding
5241 0x02, 0x00, 0x00, 0x00,
5242 // tag kRNON
5243 'R', 'N', 'O', 'N',
5244 // end offset 8
5245 0x08, 0x00, 0x00, 0x00,
5246 // tag kRSEQ
5247 'R', 'S', 'E', 'Q',
5248 // end offset 16
5249 0x10, 0x00, 0x00, 0x00,
5250 // nonce proof
5251 0x89, 0x67, 0x45, 0x23,
5252 0x01, 0xEF, 0xCD, 0xAB,
5253 // rejected packet number
5254 0xBC, 0x9A, 0x78, 0x56,
5255 0x34, 0x12, 0x00, 0x00,
5256 }
5257 }
5258 };
5259 // clang-format on
5260
5261 if (framer_.transport_version() > QUIC_VERSION_43) {
5262 return;
5263 }
5264
5265 std::unique_ptr<QuicEncryptedPacket> encrypted(
5266 AssemblePacketFromFragments(packet));
5267 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07005268 ASSERT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005269 ASSERT_TRUE(visitor_.public_reset_packet_.get());
5270 EXPECT_EQ(FramerTestConnectionId(),
5271 visitor_.public_reset_packet_->connection_id);
5272 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof);
5273 EXPECT_EQ(
5274 IpAddressFamily::IP_UNSPEC,
5275 visitor_.public_reset_packet_->client_address.host().address_family());
5276
5277 CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
5278}
5279
5280TEST_P(QuicFramerTest, PublicResetPacketWithTrailingJunk) {
5281 // clang-format off
5282 unsigned char packet[] = {
5283 // public flags (public reset, 8 byte connection_id)
5284 0x0A,
5285 // connection_id
5286 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5287 // message tag (kPRST)
5288 'P', 'R', 'S', 'T',
5289 // num_entries (2) + padding
5290 0x02, 0x00, 0x00, 0x00,
5291 // tag kRNON
5292 'R', 'N', 'O', 'N',
5293 // end offset 8
5294 0x08, 0x00, 0x00, 0x00,
5295 // tag kRSEQ
5296 'R', 'S', 'E', 'Q',
5297 // end offset 16
5298 0x10, 0x00, 0x00, 0x00,
5299 // nonce proof
5300 0x89, 0x67, 0x45, 0x23,
5301 0x01, 0xEF, 0xCD, 0xAB,
5302 // rejected packet number
5303 0xBC, 0x9A, 0x78, 0x56,
5304 0x34, 0x12, 0x00, 0x00,
5305 // trailing junk
5306 'j', 'u', 'n', 'k',
5307 };
5308 // clang-format on
5309 if (framer_.transport_version() > QUIC_VERSION_43) {
5310 return;
5311 }
5312
5313 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5314 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
bncf54082a2019-11-27 10:19:47 -08005315 ASSERT_THAT(framer_.error(), IsError(QUIC_INVALID_PUBLIC_RST_PACKET));
QUICHE teama6ef0a62019-03-07 20:34:33 -05005316 EXPECT_EQ("Unable to read reset message.", framer_.detailed_error());
5317}
5318
5319TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) {
5320 // clang-format off
5321 PacketFragments packet = {
5322 // public flags (public reset, 8 byte connection_id)
5323 {"",
5324 {0x0A}},
5325 // connection_id
5326 {"",
5327 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5328 {"Unable to read reset message.",
5329 {
5330 // message tag (kPRST)
5331 'P', 'R', 'S', 'T',
5332 // num_entries (2) + padding
5333 0x03, 0x00, 0x00, 0x00,
5334 // tag kRNON
5335 'R', 'N', 'O', 'N',
5336 // end offset 8
5337 0x08, 0x00, 0x00, 0x00,
5338 // tag kRSEQ
5339 'R', 'S', 'E', 'Q',
5340 // end offset 16
5341 0x10, 0x00, 0x00, 0x00,
5342 // tag kCADR
5343 'C', 'A', 'D', 'R',
5344 // end offset 24
5345 0x18, 0x00, 0x00, 0x00,
5346 // nonce proof
5347 0x89, 0x67, 0x45, 0x23,
5348 0x01, 0xEF, 0xCD, 0xAB,
5349 // rejected packet number
5350 0xBC, 0x9A, 0x78, 0x56,
5351 0x34, 0x12, 0x00, 0x00,
5352 // client address: 4.31.198.44:443
5353 0x02, 0x00,
5354 0x04, 0x1F, 0xC6, 0x2C,
5355 0xBB, 0x01,
5356 }
5357 }
5358 };
5359 // clang-format on
5360 if (framer_.transport_version() > QUIC_VERSION_43) {
5361 return;
5362 }
5363
5364 std::unique_ptr<QuicEncryptedPacket> encrypted(
5365 AssemblePacketFromFragments(packet));
5366 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07005367 ASSERT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005368 ASSERT_TRUE(visitor_.public_reset_packet_.get());
5369 EXPECT_EQ(FramerTestConnectionId(),
5370 visitor_.public_reset_packet_->connection_id);
5371 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof);
5372 EXPECT_EQ("4.31.198.44",
5373 visitor_.public_reset_packet_->client_address.host().ToString());
5374 EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port());
5375
5376 CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
5377}
5378
5379TEST_P(QuicFramerTest, IetfStatelessResetPacket) {
5380 // clang-format off
5381 unsigned char packet[] = {
5382 // type (short packet, 1 byte packet number)
5383 0x50,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005384 // Random bytes
5385 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5386 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5387 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5388 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5389 // stateless reset token
5390 0xB5, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
5391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5392 };
5393 // clang-format on
5394 if (framer_.transport_version() <= QUIC_VERSION_43) {
5395 return;
5396 }
5397 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
dschinazib953d022019-08-01 18:05:58 -07005398 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
5399 TestConnectionId(0x33));
QUICHE teama6ef0a62019-03-07 20:34:33 -05005400 decrypter_ = new test::TestDecrypter();
zhongyi546cc452019-04-12 15:27:49 -07005401 if (framer_.version().KnowsWhichDecrypterToUse()) {
vasilvv0fc587f2019-09-06 13:33:08 -07005402 framer_.InstallDecrypter(
5403 ENCRYPTION_INITIAL,
5404 std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07005405 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
5406 std::unique_ptr<QuicDecrypter>(decrypter_));
5407 } else {
vasilvv0fc587f2019-09-06 13:33:08 -07005408 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
5409 Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07005410 framer_.SetAlternativeDecrypter(
5411 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
5412 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005413 // This packet cannot be decrypted because diversification nonce is missing.
5414 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5415 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07005416 ASSERT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005417 ASSERT_TRUE(visitor_.stateless_reset_packet_.get());
5418 EXPECT_EQ(kTestStatelessResetToken,
5419 visitor_.stateless_reset_packet_->stateless_reset_token);
5420}
5421
5422TEST_P(QuicFramerTest, IetfStatelessResetPacketInvalidStatelessResetToken) {
5423 // clang-format off
5424 unsigned char packet[] = {
5425 // type (short packet, 1 byte packet number)
5426 0x50,
dschinazib953d022019-08-01 18:05:58 -07005427 // Random bytes
5428 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5429 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5430 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5431 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005432 // stateless reset token
5433 0xB6, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
5434 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5435 };
5436 // clang-format on
5437 if (framer_.transport_version() <= QUIC_VERSION_43) {
5438 return;
5439 }
dschinazib953d022019-08-01 18:05:58 -07005440 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
5441 TestConnectionId(0x33));
QUICHE teama6ef0a62019-03-07 20:34:33 -05005442 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005443 decrypter_ = new test::TestDecrypter();
zhongyi546cc452019-04-12 15:27:49 -07005444 if (framer_.version().KnowsWhichDecrypterToUse()) {
vasilvv0fc587f2019-09-06 13:33:08 -07005445 framer_.InstallDecrypter(
5446 ENCRYPTION_INITIAL,
5447 std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07005448 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
5449 std::unique_ptr<QuicDecrypter>(decrypter_));
5450 } else {
vasilvv0fc587f2019-09-06 13:33:08 -07005451 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
5452 Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07005453 framer_.SetAlternativeDecrypter(
5454 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
5455 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005456 // This packet cannot be decrypted because diversification nonce is missing.
5457 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5458 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07005459 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
QUICHE teama6ef0a62019-03-07 20:34:33 -05005460 ASSERT_FALSE(visitor_.stateless_reset_packet_);
5461}
5462
dschinazi072da7c2019-05-07 17:57:42 -07005463TEST_P(QuicFramerTest, VersionNegotiationPacketClient) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005464 // clang-format off
5465 PacketFragments packet = {
5466 // public flags (version, 8 byte connection_id)
5467 {"",
5468 {0x29}},
5469 // connection_id
5470 {"",
5471 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5472 // version tag
5473 {"Unable to read supported version in negotiation.",
5474 {QUIC_VERSION_BYTES,
5475 'Q', '2', '.', '0'}},
5476 };
5477
fayang36825da2019-08-21 14:01:27 -07005478 PacketFragments packet46 = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005479 // type (long header)
5480 {"",
5481 {0x8F}},
5482 // version tag
5483 {"",
5484 {0x00, 0x00, 0x00, 0x00}},
5485 {"",
5486 {0x05}},
5487 // connection_id
5488 {"",
5489 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5490 // Supported versions
5491 {"Unable to read supported version in negotiation.",
5492 {QUIC_VERSION_BYTES,
5493 'Q', '2', '.', '0'}},
5494 };
dschinazi48ac9192019-07-31 00:07:26 -07005495
dschinazic73506e2019-09-20 13:26:46 -07005496 PacketFragments packet49 = {
dschinazi48ac9192019-07-31 00:07:26 -07005497 // type (long header)
5498 {"",
5499 {0x8F}},
5500 // version tag
5501 {"",
5502 {0x00, 0x00, 0x00, 0x00}},
5503 {"",
5504 {0x08}},
5505 // connection_id
5506 {"",
5507 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5508 {"",
5509 {0x00}},
5510 // Supported versions
5511 {"Unable to read supported version in negotiation.",
5512 {QUIC_VERSION_BYTES,
5513 'Q', '2', '.', '0'}},
5514 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05005515 // clang-format on
5516
5517 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5518
5519 PacketFragments& fragments =
dschinazic73506e2019-09-20 13:26:46 -07005520 framer_.transport_version() >= QUIC_VERSION_49
5521 ? packet49
fayang36825da2019-08-21 14:01:27 -07005522 : framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -05005523 std::unique_ptr<QuicEncryptedPacket> encrypted(
5524 AssemblePacketFromFragments(fragments));
5525 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07005526 ASSERT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005527 ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
nharper4fd11052019-06-04 14:23:22 -07005528 EXPECT_EQ(1u, visitor_.version_negotiation_packet_->versions.size());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005529 EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]);
5530
5531 // Remove the last version from the packet so that every truncated
5532 // version of the packet is invalid, otherwise checking boundaries
5533 // is annoyingly complicated.
5534 for (size_t i = 0; i < 4; ++i) {
5535 fragments.back().fragment.pop_back();
5536 }
5537 CheckFramingBoundaries(fragments, QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
5538}
5539
dschinazi072da7c2019-05-07 17:57:42 -07005540TEST_P(QuicFramerTest, VersionNegotiationPacketServer) {
fayang36825da2019-08-21 14:01:27 -07005541 if (framer_.transport_version() <= QUIC_VERSION_43) {
dschinazi072da7c2019-05-07 17:57:42 -07005542 return;
5543 }
5544
5545 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
5546 // clang-format off
5547 unsigned char packet[] = {
5548 // public flags (long header with all ignored bits set)
5549 0xFF,
5550 // version
5551 0x00, 0x00, 0x00, 0x00,
5552 // connection ID lengths
5553 0x50,
5554 // destination connection ID
5555 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5556 // supported versions
5557 QUIC_VERSION_BYTES,
5558 'Q', '2', '.', '0',
5559 };
dschinazi48ac9192019-07-31 00:07:26 -07005560 unsigned char packet2[] = {
5561 // public flags (long header with all ignored bits set)
5562 0xFF,
5563 // version
5564 0x00, 0x00, 0x00, 0x00,
5565 // destination connection ID length
5566 0x08,
5567 // destination connection ID
5568 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5569 // source connection ID length
5570 0x00,
5571 // supported versions
5572 QUIC_VERSION_BYTES,
5573 'Q', '2', '.', '0',
5574 };
dschinazi072da7c2019-05-07 17:57:42 -07005575 // clang-format on
dschinazi48ac9192019-07-31 00:07:26 -07005576 unsigned char* p = packet;
5577 size_t p_length = QUIC_ARRAYSIZE(packet);
5578 if (framer_.version().HasLengthPrefixedConnectionIds()) {
5579 p = packet2;
5580 p_length = QUIC_ARRAYSIZE(packet2);
5581 }
dschinazi072da7c2019-05-07 17:57:42 -07005582
dschinazi48ac9192019-07-31 00:07:26 -07005583 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
dschinazi072da7c2019-05-07 17:57:42 -07005584 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07005585 EXPECT_THAT(framer_.error(),
5586 IsError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET));
dschinazi072da7c2019-05-07 17:57:42 -07005587 EXPECT_EQ("Server received version negotiation packet.",
5588 framer_.detailed_error());
5589 EXPECT_FALSE(visitor_.version_negotiation_packet_.get());
5590}
5591
QUICHE teama6ef0a62019-03-07 20:34:33 -05005592TEST_P(QuicFramerTest, OldVersionNegotiationPacket) {
5593 // clang-format off
5594 PacketFragments packet = {
5595 // public flags (version, 8 byte connection_id)
5596 {"",
5597 {0x2D}},
5598 // connection_id
5599 {"",
5600 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5601 // version tag
5602 {"Unable to read supported version in negotiation.",
5603 {QUIC_VERSION_BYTES,
5604 'Q', '2', '.', '0'}},
5605 };
5606 // clang-format on
5607
5608 if (framer_.transport_version() > QUIC_VERSION_43) {
5609 return;
5610 }
5611
5612 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5613
5614 std::unique_ptr<QuicEncryptedPacket> encrypted(
5615 AssemblePacketFromFragments(packet));
5616 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07005617 ASSERT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005618 ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
nharper4fd11052019-06-04 14:23:22 -07005619 EXPECT_EQ(1u, visitor_.version_negotiation_packet_->versions.size());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005620 EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]);
5621
5622 // Remove the last version from the packet so that every truncated
5623 // version of the packet is invalid, otherwise checking boundaries
5624 // is annoyingly complicated.
5625 for (size_t i = 0; i < 4; ++i) {
5626 packet.back().fragment.pop_back();
5627 }
5628 CheckFramingBoundaries(packet, QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
5629}
5630
dschinazi244f6dc2019-05-06 15:45:16 -07005631TEST_P(QuicFramerTest, ParseIetfRetryPacket) {
5632 if (!framer_.version().SupportsRetry()) {
5633 return;
5634 }
5635 // IETF RETRY is only sent from client to server.
5636 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5637 // clang-format off
5638 unsigned char packet[] = {
5639 // public flags (long header with packet type RETRY and ODCIL=8)
5640 0xF5,
5641 // version
5642 QUIC_VERSION_BYTES,
5643 // connection ID lengths
5644 0x05,
5645 // source connection ID
5646 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5647 // original destination connection ID
5648 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5649 // retry token
5650 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5651 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5652 };
dschinazic73506e2019-09-20 13:26:46 -07005653 unsigned char packet49[] = {
dschinazi48ac9192019-07-31 00:07:26 -07005654 // public flags (long header with packet type RETRY)
5655 0xF0,
5656 // version
5657 QUIC_VERSION_BYTES,
5658 // destination connection ID length
5659 0x00,
5660 // source connection ID length
5661 0x08,
5662 // source connection ID
5663 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5664 // original destination connection ID length
5665 0x08,
5666 // original destination connection ID
5667 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5668 // retry token
5669 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5670 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5671 };
dschinazi244f6dc2019-05-06 15:45:16 -07005672 // clang-format on
5673
dschinazi48ac9192019-07-31 00:07:26 -07005674 unsigned char* p = packet;
5675 size_t p_length = QUIC_ARRAYSIZE(packet);
dschinazic73506e2019-09-20 13:26:46 -07005676 if (framer_.transport_version() >= QUIC_VERSION_49) {
5677 p = packet49;
5678 p_length = QUIC_ARRAYSIZE(packet49);
dschinazi48ac9192019-07-31 00:07:26 -07005679 }
5680 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
dschinazi244f6dc2019-05-06 15:45:16 -07005681 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5682
bncf6f82b12019-10-30 07:01:01 -07005683 EXPECT_THAT(framer_.error(), IsQuicNoError());
dschinazi244f6dc2019-05-06 15:45:16 -07005684 ASSERT_TRUE(visitor_.header_.get());
5685
5686 ASSERT_TRUE(visitor_.retry_original_connection_id_.get());
5687 ASSERT_TRUE(visitor_.retry_new_connection_id_.get());
5688 ASSERT_TRUE(visitor_.retry_token_.get());
5689
5690 EXPECT_EQ(FramerTestConnectionId(),
5691 *visitor_.retry_original_connection_id_.get());
5692 EXPECT_EQ(FramerTestConnectionIdPlusOne(),
5693 *visitor_.retry_new_connection_id_.get());
5694 EXPECT_EQ("Hello this is RETRY!", *visitor_.retry_token_.get());
5695}
5696
5697TEST_P(QuicFramerTest, RejectIetfRetryPacketAsServer) {
5698 if (!framer_.version().SupportsRetry()) {
5699 return;
5700 }
5701 // IETF RETRY is only sent from client to server.
5702 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
5703 // clang-format off
5704 unsigned char packet[] = {
5705 // public flags (long header with packet type RETRY and ODCIL=8)
5706 0xF5,
5707 // version
5708 QUIC_VERSION_BYTES,
5709 // connection ID lengths
dschinazi48ac9192019-07-31 00:07:26 -07005710 0x00, 0x08,
dschinazi244f6dc2019-05-06 15:45:16 -07005711 // source connection ID
5712 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5713 // original destination connection ID
5714 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5715 // retry token
5716 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5717 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5718 };
5719 // clang-format on
5720
5721 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5722 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5723
bncf6f82b12019-10-30 07:01:01 -07005724 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
dschinazi244f6dc2019-05-06 15:45:16 -07005725 EXPECT_EQ("Client-initiated RETRY is invalid.", framer_.detailed_error());
5726}
5727
QUICHE teama6ef0a62019-03-07 20:34:33 -05005728TEST_P(QuicFramerTest, BuildPaddingFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04005729 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005730 QuicPacketHeader header;
5731 header.destination_connection_id = FramerTestConnectionId();
5732 header.reset_flag = false;
5733 header.version_flag = false;
5734 header.packet_number = kPacketNumber;
5735
5736 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5737
5738 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07005739 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005740 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04005741 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005742 // connection_id
5743 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5744 // packet number
5745 0x12, 0x34, 0x56, 0x78,
5746
5747 // frame type (padding frame)
5748 0x00,
5749 0x00, 0x00, 0x00, 0x00
5750 };
5751
dschinazi66dea072019-04-09 11:41:06 -07005752 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005753 // type (short header, 4 byte packet number)
5754 0x43,
5755 // connection_id
5756 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5757 // packet number
5758 0x12, 0x34, 0x56, 0x78,
5759
5760 // frame type (padding frame)
5761 0x00,
5762 0x00, 0x00, 0x00, 0x00
5763 };
5764
dschinazi66dea072019-04-09 11:41:06 -07005765 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005766 // type (short header, 4 byte packet number)
5767 0x43,
5768 // connection_id
5769 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5770 // packet number
5771 0x12, 0x34, 0x56, 0x78,
5772
5773 // frame type (padding frame)
5774 0x00,
5775 0x00, 0x00, 0x00, 0x00
5776 };
5777 // clang-format on
5778
5779 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07005780 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005781 p = packet99;
fayang36825da2019-08-21 14:01:27 -07005782 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fayang374888f2019-05-31 06:47:21 -07005783 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05005784 }
5785
5786 uint64_t header_size = GetPacketHeaderSize(
5787 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
5788 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
5789 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
5790 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07005791 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005792
5793 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5794 ASSERT_TRUE(data != nullptr);
5795
5796 test::CompareCharArraysWithHexError(
5797 "constructed packet", data->data(), data->length(), AsChars(p),
fayang36825da2019-08-21 14:01:27 -07005798 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46)
QUICHE teama6ef0a62019-03-07 20:34:33 -05005799 : QUIC_ARRAYSIZE(packet));
5800}
5801
5802TEST_P(QuicFramerTest, BuildStreamFramePacketWithNewPaddingFrame) {
QUICHE team2252b702019-05-14 23:55:14 -04005803 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005804 QuicPacketHeader header;
5805 header.destination_connection_id = FramerTestConnectionId();
5806 header.reset_flag = false;
5807 header.version_flag = false;
5808 header.packet_number = kPacketNumber;
5809 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
5810 QuicStringPiece("hello world!"));
5811 QuicPaddingFrame padding_frame(2);
5812 QuicFrames frames = {QuicFrame(padding_frame), QuicFrame(stream_frame),
5813 QuicFrame(padding_frame)};
5814
5815 // clang-format off
5816 unsigned char packet[] = {
5817 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04005818 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005819 // connection_id
5820 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5821 // packet number
5822 0x12, 0x34, 0x56, 0x78,
5823
5824 // paddings
5825 0x00, 0x00,
5826 // frame type (stream frame with fin)
5827 0xFF,
5828 // stream id
5829 0x01, 0x02, 0x03, 0x04,
5830 // offset
5831 0x3A, 0x98, 0xFE, 0xDC,
5832 0x32, 0x10, 0x76, 0x54,
5833 // data length
5834 0x00, 0x0c,
5835 // data
5836 'h', 'e', 'l', 'l',
5837 'o', ' ', 'w', 'o',
5838 'r', 'l', 'd', '!',
5839 // paddings
5840 0x00, 0x00,
5841 };
5842
QUICHE teama6ef0a62019-03-07 20:34:33 -05005843 unsigned char packet46[] = {
5844 // type (short header, 4 byte packet number)
5845 0x43,
5846 // connection_id
5847 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5848 // packet number
5849 0x12, 0x34, 0x56, 0x78,
5850
5851 // paddings
5852 0x00, 0x00,
5853 // frame type (stream frame with fin)
5854 0xFF,
5855 // stream id
5856 0x01, 0x02, 0x03, 0x04,
5857 // offset
5858 0x3A, 0x98, 0xFE, 0xDC,
5859 0x32, 0x10, 0x76, 0x54,
5860 // data length
5861 0x00, 0x0c,
5862 // data
5863 'h', 'e', 'l', 'l',
5864 'o', ' ', 'w', 'o',
5865 'r', 'l', 'd', '!',
5866 // paddings
5867 0x00, 0x00,
5868 };
5869
5870 unsigned char packet99[] = {
5871 // type (short header, 4 byte packet number)
5872 0x43,
5873 // connection_id
5874 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5875 // packet number
5876 0x12, 0x34, 0x56, 0x78,
5877
5878 // paddings
5879 0x00, 0x00,
5880 // frame type (IETF_STREAM with FIN, LEN, and OFFSET bits set)
5881 0x08 | 0x01 | 0x02 | 0x04,
5882 // stream id
5883 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
5884 // offset
5885 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5886 0x32, 0x10, 0x76, 0x54,
5887 // data length
5888 kVarInt62OneByte + 0x0c,
5889 // data
5890 'h', 'e', 'l', 'l',
5891 'o', ' ', 'w', 'o',
5892 'r', 'l', 'd', '!',
5893 // paddings
5894 0x00, 0x00,
5895 };
5896 // clang-format on
5897
5898 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5899 ASSERT_TRUE(data != nullptr);
5900
5901 unsigned char* p = packet;
5902 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07005903 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005904 p = packet99;
5905 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07005906 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005907 p = packet46;
5908 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005909 }
5910 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
5911
5912 test::CompareCharArraysWithHexError("constructed packet", data->data(),
5913 data->length(), AsChars(p), p_size);
5914}
5915
5916TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04005917 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005918 QuicPacketHeader header;
5919 header.destination_connection_id = FramerTestConnectionId();
5920 header.reset_flag = false;
5921 header.version_flag = false;
5922 header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
5923 header.packet_number = kPacketNumber;
5924
5925 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5926
5927 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07005928 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005929 // public flags (8 byte connection_id and 4 byte packet number)
QUICHE team2252b702019-05-14 23:55:14 -04005930 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005931 // connection_id
5932 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5933 // packet number
5934 0x12, 0x34, 0x56, 0x78,
5935
5936 // frame type (padding frame)
5937 0x00,
5938 0x00, 0x00, 0x00, 0x00
5939 };
5940
dschinazi66dea072019-04-09 11:41:06 -07005941 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005942 // type (short header, 4 byte packet number)
5943 0x43,
5944 // connection_id
5945 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5946 // packet number
5947 0x12, 0x34, 0x56, 0x78,
5948
5949 // frame type (padding frame)
5950 0x00,
5951 0x00, 0x00, 0x00, 0x00
5952 };
5953
dschinazi66dea072019-04-09 11:41:06 -07005954 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005955 // type (short header, 4 byte packet number)
5956 0x43,
5957 // connection_id
5958 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5959 // packet number
5960 0x12, 0x34, 0x56, 0x78,
5961
5962 // frame type (padding frame)
5963 0x00,
5964 0x00, 0x00, 0x00, 0x00
5965 };
5966 // clang-format on
5967
5968 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07005969 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005970 p = packet99;
fayang36825da2019-08-21 14:01:27 -07005971 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fayang374888f2019-05-31 06:47:21 -07005972 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05005973 }
5974
5975 uint64_t header_size = GetPacketHeaderSize(
5976 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
5977 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
5978 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
5979 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07005980 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005981
5982 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5983 ASSERT_TRUE(data != nullptr);
5984
5985 test::CompareCharArraysWithHexError(
5986 "constructed packet", data->data(), data->length(), AsChars(p),
fayang36825da2019-08-21 14:01:27 -07005987 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46)
QUICHE teama6ef0a62019-03-07 20:34:33 -05005988 : QUIC_ARRAYSIZE(packet));
5989}
5990
5991TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04005992 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005993 QuicPacketHeader header;
5994 header.destination_connection_id = FramerTestConnectionId();
5995 header.reset_flag = false;
5996 header.version_flag = false;
5997 header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
5998 header.packet_number = kPacketNumber;
5999
6000 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
6001
6002 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07006003 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006004 // public flags (8 byte connection_id and 2 byte packet number)
QUICHE team2252b702019-05-14 23:55:14 -04006005 0x1C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006006 // connection_id
6007 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6008 // packet number
6009 0x56, 0x78,
6010
6011 // frame type (padding frame)
6012 0x00,
6013 0x00, 0x00, 0x00, 0x00
6014 };
6015
dschinazi66dea072019-04-09 11:41:06 -07006016 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006017 // type (short header, 2 byte packet number)
6018 0x41,
6019 // connection_id
6020 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6021 // packet number
6022 0x56, 0x78,
6023
6024 // frame type (padding frame)
6025 0x00,
6026 0x00, 0x00, 0x00, 0x00
6027 };
6028
dschinazi66dea072019-04-09 11:41:06 -07006029 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006030 // type (short header, 2 byte packet number)
6031 0x41,
6032 // connection_id
6033 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6034 // packet number
6035 0x56, 0x78,
6036
6037 // frame type (padding frame)
6038 0x00,
6039 0x00, 0x00, 0x00, 0x00
6040 };
6041 // clang-format on
6042
6043 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07006044 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006045 p = packet99;
fayang36825da2019-08-21 14:01:27 -07006046 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fayang374888f2019-05-31 06:47:21 -07006047 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05006048 }
6049
6050 uint64_t header_size = GetPacketHeaderSize(
6051 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
6052 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
6053 !kIncludeDiversificationNonce, PACKET_2BYTE_PACKET_NUMBER,
6054 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07006055 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006056
6057 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6058 ASSERT_TRUE(data != nullptr);
6059
6060 test::CompareCharArraysWithHexError(
6061 "constructed packet", data->data(), data->length(), AsChars(p),
fayang36825da2019-08-21 14:01:27 -07006062 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46)
QUICHE teama6ef0a62019-03-07 20:34:33 -05006063 : QUIC_ARRAYSIZE(packet));
6064}
6065
6066TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04006067 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006068 QuicPacketHeader header;
6069 header.destination_connection_id = FramerTestConnectionId();
6070 header.reset_flag = false;
6071 header.version_flag = false;
6072 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
6073 header.packet_number = kPacketNumber;
6074
6075 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
6076
6077 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07006078 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006079 // public flags (8 byte connection_id and 1 byte packet number)
QUICHE team2252b702019-05-14 23:55:14 -04006080 0x0C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006081 // connection_id
6082 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6083 // packet number
6084 0x78,
6085
6086 // frame type (padding frame)
6087 0x00,
6088 0x00, 0x00, 0x00, 0x00
6089 };
6090
dschinazi66dea072019-04-09 11:41:06 -07006091 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006092 // type (short header, 1 byte packet number)
6093 0x40,
6094 // connection_id
6095 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6096 // packet number
6097 0x78,
6098
6099 // frame type (padding frame)
6100 0x00,
6101 0x00, 0x00, 0x00, 0x00
6102 };
6103
dschinazi66dea072019-04-09 11:41:06 -07006104 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006105 // type (short header, 1 byte packet number)
6106 0x40,
6107 // connection_id
6108 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6109 // packet number
6110 0x78,
6111
6112 // frame type (padding frame)
6113 0x00,
6114 0x00, 0x00, 0x00, 0x00
6115 };
6116 // clang-format on
6117
6118 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07006119 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006120 p = packet99;
fayang36825da2019-08-21 14:01:27 -07006121 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fayang374888f2019-05-31 06:47:21 -07006122 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05006123 }
6124
6125 uint64_t header_size = GetPacketHeaderSize(
6126 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
6127 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
6128 !kIncludeDiversificationNonce, PACKET_1BYTE_PACKET_NUMBER,
6129 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07006130 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006131
6132 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6133 ASSERT_TRUE(data != nullptr);
6134
6135 test::CompareCharArraysWithHexError(
6136 "constructed packet", data->data(), data->length(), AsChars(p),
fayang36825da2019-08-21 14:01:27 -07006137 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46)
QUICHE teama6ef0a62019-03-07 20:34:33 -05006138 : QUIC_ARRAYSIZE(packet));
6139}
6140
6141TEST_P(QuicFramerTest, BuildStreamFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04006142 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006143 QuicPacketHeader header;
6144 header.destination_connection_id = FramerTestConnectionId();
6145 header.reset_flag = false;
6146 header.version_flag = false;
6147 header.packet_number = kPacketNumber;
6148 if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
6149 header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
6150 }
6151
6152 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
6153 QuicStringPiece("hello world!"));
6154
6155 QuicFrames frames = {QuicFrame(stream_frame)};
6156
6157 // clang-format off
6158 unsigned char packet[] = {
6159 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04006160 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006161 // connection_id
6162 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6163 // packet number
6164 0x12, 0x34, 0x56, 0x78,
6165
6166 // frame type (stream frame with fin and no length)
6167 0xDF,
6168 // stream id
6169 0x01, 0x02, 0x03, 0x04,
6170 // offset
6171 0x3A, 0x98, 0xFE, 0xDC,
6172 0x32, 0x10, 0x76, 0x54,
6173 // data
6174 'h', 'e', 'l', 'l',
6175 'o', ' ', 'w', 'o',
6176 'r', 'l', 'd', '!',
6177 };
6178
QUICHE teama6ef0a62019-03-07 20:34:33 -05006179 unsigned char packet46[] = {
6180 // type (short header, 4 byte packet number)
6181 0x43,
6182 // connection_id
6183 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6184 // packet number
6185 0x12, 0x34, 0x56, 0x78,
6186
6187 // frame type (stream frame with fin and no length)
6188 0xDF,
6189 // stream id
6190 0x01, 0x02, 0x03, 0x04,
6191 // offset
6192 0x3A, 0x98, 0xFE, 0xDC,
6193 0x32, 0x10, 0x76, 0x54,
6194 // data
6195 'h', 'e', 'l', 'l',
6196 'o', ' ', 'w', 'o',
6197 'r', 'l', 'd', '!',
6198 };
6199
6200 unsigned char packet99[] = {
6201 // type (short header, 4 byte packet number)
6202 0x43,
6203 // connection_id
6204 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6205 // packet number
6206 0x12, 0x34, 0x56, 0x78,
6207
6208 // frame type (IETF_STREAM frame with FIN and OFFSET, no length)
6209 0x08 | 0x01 | 0x04,
6210 // stream id
6211 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
6212 // offset
6213 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6214 0x32, 0x10, 0x76, 0x54,
6215 // data
6216 'h', 'e', 'l', 'l',
6217 'o', ' ', 'w', 'o',
6218 'r', 'l', 'd', '!',
6219 };
6220 // clang-format on
6221
6222 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6223 ASSERT_TRUE(data != nullptr);
6224
6225 unsigned char* p = packet;
6226 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07006227 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006228 p = packet99;
6229 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07006230 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006231 p = packet46;
6232 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006233 }
6234 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6235 data->length(), AsChars(p), p_size);
6236}
6237
6238TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) {
6239 QuicPacketHeader header;
6240 header.destination_connection_id = FramerTestConnectionId();
6241 header.reset_flag = false;
6242 header.version_flag = true;
6243 if (framer_.transport_version() > QUIC_VERSION_43) {
6244 header.long_packet_type = ZERO_RTT_PROTECTED;
6245 }
6246 header.packet_number = kPacketNumber;
6247 if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
6248 header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
6249 }
6250
6251 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
6252 QuicStringPiece("hello world!"));
6253 QuicFrames frames = {QuicFrame(stream_frame)};
6254
6255 // clang-format off
6256 unsigned char packet[] = {
6257 // public flags (version, 8 byte connection_id)
6258 0x2D,
6259 // connection_id
6260 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6261 // version tag
6262 QUIC_VERSION_BYTES,
6263 // packet number
6264 0x12, 0x34, 0x56, 0x78,
6265
6266 // frame type (stream frame with fin and no length)
6267 0xDF,
6268 // stream id
6269 0x01, 0x02, 0x03, 0x04,
6270 // offset
6271 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6272 // data
6273 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6274 };
6275
QUICHE teama6ef0a62019-03-07 20:34:33 -05006276 unsigned char packet46[] = {
6277 // type (long header with packet type ZERO_RTT_PROTECTED)
6278 0xD3,
6279 // version tag
6280 QUIC_VERSION_BYTES,
6281 // connection_id length
6282 0x50,
6283 // connection_id
6284 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6285 // packet number
6286 0x12, 0x34, 0x56, 0x78,
6287
6288 // frame type (stream frame with fin and no length)
6289 0xDF,
6290 // stream id
6291 0x01, 0x02, 0x03, 0x04,
6292 // offset
6293 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6294 // data
6295 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6296 };
6297
dschinazic73506e2019-09-20 13:26:46 -07006298 unsigned char packet49[] = {
6299 // type (long header with packet type ZERO_RTT_PROTECTED)
6300 0xD3,
6301 // version tag
6302 QUIC_VERSION_BYTES,
6303 // destination connection ID length
6304 0x08,
6305 // destination connection ID
6306 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6307 // source connection ID length
6308 0x00,
6309 // length
6310 0x40, 0x1D,
6311 // packet number
6312 0x12, 0x34, 0x56, 0x78,
6313
6314 // frame type (stream frame with fin and no length)
6315 0xDF,
6316 // stream id
6317 0x01, 0x02, 0x03, 0x04,
6318 // offset
6319 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6320 // data
6321 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6322 };
6323
QUICHE teama6ef0a62019-03-07 20:34:33 -05006324 unsigned char packet99[] = {
6325 // type (long header with packet type ZERO_RTT_PROTECTED)
6326 0xD3,
6327 // version tag
6328 QUIC_VERSION_BYTES,
dschinazi48ac9192019-07-31 00:07:26 -07006329 // destination connection ID length
6330 0x08,
6331 // destination connection ID
QUICHE teama6ef0a62019-03-07 20:34:33 -05006332 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -07006333 // source connection ID length
6334 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006335 // length
6336 0x40, 0x1D,
6337 // packet number
6338 0x12, 0x34, 0x56, 0x78,
6339
6340 // frame type (IETF_STREAM frame with fin and offset, no length)
6341 0x08 | 0x01 | 0x04,
6342 // stream id
6343 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
6344 // offset
6345 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6346 // data
6347 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6348 };
6349 // clang-format on
6350
6351 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6352 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6353 ASSERT_TRUE(data != nullptr);
6354
6355 unsigned char* p = packet;
6356 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07006357 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006358 p = packet99;
6359 p_size = QUIC_ARRAYSIZE(packet99);
dschinazic73506e2019-09-20 13:26:46 -07006360 } else if (framer_.transport_version() >= QUIC_VERSION_49) {
6361 p = packet49;
6362 p_size = QUIC_ARRAYSIZE(packet49);
fayang36825da2019-08-21 14:01:27 -07006363 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006364 p = packet46;
6365 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006366 }
6367 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6368 data->length(), AsChars(p), p_size);
6369}
6370
6371TEST_P(QuicFramerTest, BuildCryptoFramePacket) {
fkastenholzceae8372019-06-12 12:22:22 -07006372 if (!QuicVersionUsesCryptoFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006373 return;
6374 }
QUICHE team2252b702019-05-14 23:55:14 -04006375 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006376 QuicPacketHeader header;
6377 header.destination_connection_id = FramerTestConnectionId();
6378 header.reset_flag = false;
6379 header.version_flag = false;
6380 header.packet_number = kPacketNumber;
6381
6382 SimpleDataProducer data_producer;
6383 framer_.set_data_producer(&data_producer);
6384
6385 QuicStringPiece crypto_frame_contents("hello world!");
QUICHE team6987b4a2019-03-15 16:23:04 -07006386 QuicCryptoFrame crypto_frame(ENCRYPTION_INITIAL, kStreamOffset,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006387 crypto_frame_contents.length());
QUICHE team6987b4a2019-03-15 16:23:04 -07006388 data_producer.SaveCryptoData(ENCRYPTION_INITIAL, kStreamOffset,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006389 crypto_frame_contents);
6390
6391 QuicFrames frames = {QuicFrame(&crypto_frame)};
6392
6393 // clang-format off
nharper107ba5f2019-07-02 21:33:39 -07006394 unsigned char packet48[] = {
6395 // type (short header, 4 byte packet number)
6396 0x43,
6397 // connection_id
6398 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6399 // packet number
6400 0x12, 0x34, 0x56, 0x78,
6401
6402 // frame type (QuicFrameType CRYPTO_FRAME)
6403 0x08,
6404 // offset
6405 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6406 0x32, 0x10, 0x76, 0x54,
6407 // length
6408 kVarInt62OneByte + 12,
6409 // data
6410 'h', 'e', 'l', 'l',
6411 'o', ' ', 'w', 'o',
6412 'r', 'l', 'd', '!',
6413 };
6414
6415 unsigned char packet99[] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006416 // type (short header, 4 byte packet number)
6417 0x43,
6418 // connection_id
6419 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6420 // packet number
6421 0x12, 0x34, 0x56, 0x78,
6422
6423 // frame type (IETF_CRYPTO frame)
6424 0x06,
6425 // offset
6426 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6427 0x32, 0x10, 0x76, 0x54,
6428 // length
6429 kVarInt62OneByte + 12,
6430 // data
6431 'h', 'e', 'l', 'l',
6432 'o', ' ', 'w', 'o',
6433 'r', 'l', 'd', '!',
6434 };
6435 // clang-format on
6436
nharper107ba5f2019-07-02 21:33:39 -07006437 unsigned char* packet = packet48;
6438 size_t packet_size = QUIC_ARRAYSIZE(packet48);
6439 if (framer_.transport_version() == QUIC_VERSION_99) {
6440 packet = packet99;
6441 packet_size = QUIC_ARRAYSIZE(packet99);
6442 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05006443
6444 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6445 ASSERT_TRUE(data != nullptr);
6446 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6447 data->length(), AsChars(packet),
6448 packet_size);
6449}
6450
6451TEST_P(QuicFramerTest, CryptoFrame) {
nharper107ba5f2019-07-02 21:33:39 -07006452 if (framer_.transport_version() < QUIC_VERSION_48) {
6453 // CRYPTO frames aren't supported prior to v48.
QUICHE teama6ef0a62019-03-07 20:34:33 -05006454 return;
6455 }
zhongyi546cc452019-04-12 15:27:49 -07006456 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006457
6458 // clang-format off
nharper107ba5f2019-07-02 21:33:39 -07006459 PacketFragments packet48 = {
6460 // type (short header, 4 byte packet number)
6461 {"",
6462 {0x43}},
6463 // connection_id
6464 {"",
6465 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
6466 // packet number
6467 {"",
6468 {0x12, 0x34, 0x56, 0x78}},
6469 // frame type (QuicFrameType CRYPTO_FRAME)
6470 {"",
6471 {0x08}},
6472 // offset
6473 {"",
6474 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6475 0x32, 0x10, 0x76, 0x54}},
6476 // data length
6477 {"Invalid data length.",
6478 {kVarInt62OneByte + 12}},
6479 // data
6480 {"Unable to read frame data.",
6481 {'h', 'e', 'l', 'l',
6482 'o', ' ', 'w', 'o',
6483 'r', 'l', 'd', '!'}},
6484 };
6485
6486 PacketFragments packet99 = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006487 // type (short header, 4 byte packet number)
6488 {"",
6489 {0x43}},
6490 // connection_id
6491 {"",
6492 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
6493 // packet number
6494 {"",
6495 {0x12, 0x34, 0x56, 0x78}},
6496 // frame type (IETF_CRYPTO frame)
6497 {"",
6498 {0x06}},
6499 // offset
6500 {"",
6501 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6502 0x32, 0x10, 0x76, 0x54}},
6503 // data length
6504 {"Invalid data length.",
6505 {kVarInt62OneByte + 12}},
6506 // data
6507 {"Unable to read frame data.",
6508 {'h', 'e', 'l', 'l',
6509 'o', ' ', 'w', 'o',
6510 'r', 'l', 'd', '!'}},
6511 };
6512 // clang-format on
6513
nharper107ba5f2019-07-02 21:33:39 -07006514 PacketFragments& fragments =
6515 framer_.transport_version() == QUIC_VERSION_99 ? packet99 : packet48;
QUICHE teama6ef0a62019-03-07 20:34:33 -05006516 std::unique_ptr<QuicEncryptedPacket> encrypted(
nharper107ba5f2019-07-02 21:33:39 -07006517 AssemblePacketFromFragments(fragments));
QUICHE teama6ef0a62019-03-07 20:34:33 -05006518 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6519
bncf6f82b12019-10-30 07:01:01 -07006520 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05006521 ASSERT_TRUE(visitor_.header_.get());
6522 EXPECT_TRUE(CheckDecryption(
6523 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
6524 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
6525 ASSERT_EQ(1u, visitor_.crypto_frames_.size());
6526 QuicCryptoFrame* frame = visitor_.crypto_frames_[0].get();
6527 EXPECT_EQ(kStreamOffset, frame->offset);
vasilvvc48c8712019-03-11 13:38:16 -07006528 EXPECT_EQ("hello world!",
6529 std::string(frame->data_buffer, frame->data_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05006530
nharper107ba5f2019-07-02 21:33:39 -07006531 CheckFramingBoundaries(fragments, QUIC_INVALID_FRAME_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006532}
6533
6534TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) {
dschinazi1ac22cc2019-06-25 11:47:50 -07006535 SetQuicFlag(FLAGS_quic_disable_version_negotiation_grease_randomness, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006536 // clang-format off
6537 unsigned char packet[] = {
6538 // public flags (version, 8 byte connection_id)
6539 0x0D,
6540 // connection_id
6541 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi1ac22cc2019-06-25 11:47:50 -07006542 // supported versions
6543 0xDA, 0x5A, 0x3A, 0x3A,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006544 QUIC_VERSION_BYTES,
6545 };
fayang36825da2019-08-21 14:01:27 -07006546 unsigned char packet46[] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006547 // type (long header)
dschinazi0366de92019-06-18 20:00:27 -07006548 0xC0,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006549 // version tag
6550 0x00, 0x00, 0x00, 0x00,
6551 // connection_id length
6552 0x05,
6553 // connection_id
6554 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi1ac22cc2019-06-25 11:47:50 -07006555 // supported versions
6556 0xDA, 0x5A, 0x3A, 0x3A,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006557 QUIC_VERSION_BYTES,
6558 };
dschinazic73506e2019-09-20 13:26:46 -07006559 unsigned char packet49[] = {
dschinazi48ac9192019-07-31 00:07:26 -07006560 // type (long header)
6561 0xC0,
6562 // version tag
6563 0x00, 0x00, 0x00, 0x00,
6564 // destination connection ID length
6565 0x00,
6566 // source connection ID length
6567 0x08,
6568 // source connection ID
6569 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6570 // supported versions
6571 0xDA, 0x5A, 0x3A, 0x3A,
6572 QUIC_VERSION_BYTES,
6573 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05006574 // clang-format on
6575 unsigned char* p = packet;
6576 size_t p_size = QUIC_ARRAYSIZE(packet);
dschinazic73506e2019-09-20 13:26:46 -07006577 if (framer_.transport_version() >= QUIC_VERSION_49) {
6578 p = packet49;
6579 p_size = QUIC_ARRAYSIZE(packet49);
dschinazi48ac9192019-07-31 00:07:26 -07006580 } else if (framer_.transport_version() > QUIC_VERSION_43) {
fayang36825da2019-08-21 14:01:27 -07006581 p = packet46;
6582 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006583 }
6584
6585 QuicConnectionId connection_id = FramerTestConnectionId();
6586 std::unique_ptr<QuicEncryptedPacket> data(
dschinazib417d602019-05-29 13:08:45 -07006587 QuicFramer::BuildVersionNegotiationPacket(
6588 connection_id, EmptyQuicConnectionId(),
6589 framer_.transport_version() > QUIC_VERSION_43,
dschinazi48ac9192019-07-31 00:07:26 -07006590 framer_.version().HasLengthPrefixedConnectionIds(),
QUICHE teama6ef0a62019-03-07 20:34:33 -05006591 SupportedVersions(GetParam())));
6592 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6593 data->length(), AsChars(p), p_size);
6594}
6595
dschinazib417d602019-05-29 13:08:45 -07006596TEST_P(QuicFramerTest, BuildVersionNegotiationPacketWithClientConnectionId) {
dschinazi48ac9192019-07-31 00:07:26 -07006597 if (!framer_.version().SupportsClientConnectionIds()) {
dschinazib417d602019-05-29 13:08:45 -07006598 return;
6599 }
6600
dschinazi1ac22cc2019-06-25 11:47:50 -07006601 SetQuicFlag(FLAGS_quic_disable_version_negotiation_grease_randomness, true);
dschinazib417d602019-05-29 13:08:45 -07006602
dschinazib417d602019-05-29 13:08:45 -07006603 // clang-format off
6604 unsigned char packet[] = {
6605 // type (long header)
dschinazi0366de92019-06-18 20:00:27 -07006606 0xC0,
dschinazib417d602019-05-29 13:08:45 -07006607 // version tag
6608 0x00, 0x00, 0x00, 0x00,
dschinazib417d602019-05-29 13:08:45 -07006609 // client/destination connection ID
dschinazi48ac9192019-07-31 00:07:26 -07006610 0x08,
dschinazib417d602019-05-29 13:08:45 -07006611 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
6612 // server/source connection ID
dschinazi48ac9192019-07-31 00:07:26 -07006613 0x08,
dschinazib417d602019-05-29 13:08:45 -07006614 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi1ac22cc2019-06-25 11:47:50 -07006615 // supported versions
6616 0xDA, 0x5A, 0x3A, 0x3A,
dschinazib417d602019-05-29 13:08:45 -07006617 QUIC_VERSION_BYTES,
6618 };
6619 // clang-format on
6620
6621 QuicConnectionId server_connection_id = FramerTestConnectionId();
6622 QuicConnectionId client_connection_id = FramerTestConnectionIdPlusOne();
6623 std::unique_ptr<QuicEncryptedPacket> data(
dschinazi48ac9192019-07-31 00:07:26 -07006624 QuicFramer::BuildVersionNegotiationPacket(
6625 server_connection_id, client_connection_id, true, true,
6626 SupportedVersions(GetParam())));
dschinazib417d602019-05-29 13:08:45 -07006627 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6628 data->length(), AsChars(packet),
6629 QUIC_ARRAYSIZE(packet));
6630}
6631
QUICHE teama6ef0a62019-03-07 20:34:33 -05006632TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlock) {
QUICHE team2252b702019-05-14 23:55:14 -04006633 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006634 QuicPacketHeader header;
6635 header.destination_connection_id = FramerTestConnectionId();
6636 header.reset_flag = false;
6637 header.version_flag = false;
6638 header.packet_number = kPacketNumber;
6639
6640 // Use kSmallLargestObserved to make this test finished in a short time.
6641 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6642 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6643
6644 QuicFrames frames = {QuicFrame(&ack_frame)};
6645
6646 // clang-format off
6647 unsigned char packet[] = {
6648 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04006649 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006650 // connection_id
6651 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6652 // packet number
6653 0x12, 0x34, 0x56, 0x78,
6654
6655 // frame type (ack frame)
6656 // (no ack blocks, 2 byte largest observed, 2 byte block length)
6657 0x45,
6658 // largest acked
6659 0x12, 0x34,
6660 // Zero delta time.
6661 0x00, 0x00,
6662 // first ack block length.
6663 0x12, 0x34,
6664 // num timestamps.
6665 0x00,
6666 };
6667
QUICHE teama6ef0a62019-03-07 20:34:33 -05006668 unsigned char packet46[] = {
6669 // type (short header, 4 byte packet number)
6670 0x43,
6671 // connection_id
6672 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6673 // packet number
6674 0x12, 0x34, 0x56, 0x78,
6675
6676 // frame type (ack frame)
6677 // (no ack blocks, 2 byte largest observed, 2 byte block length)
6678 0x45,
6679 // largest acked
6680 0x12, 0x34,
6681 // Zero delta time.
6682 0x00, 0x00,
6683 // first ack block length.
6684 0x12, 0x34,
6685 // num timestamps.
6686 0x00,
6687 };
6688
6689 unsigned char packet99[] = {
6690 // type (short header, 4 byte packet number)
6691 0x43,
6692 // connection_id
6693 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6694 // packet number
6695 0x12, 0x34, 0x56, 0x78,
6696
6697 // frame type (IETF_ACK frame)
6698 0x02,
6699 // largest acked
6700 kVarInt62TwoBytes + 0x12, 0x34,
6701 // Zero delta time.
6702 kVarInt62OneByte + 0x00,
6703 // Number of additional ack blocks.
6704 kVarInt62OneByte + 0x00,
6705 // first ack block length.
6706 kVarInt62TwoBytes + 0x12, 0x33,
6707 };
6708 // clang-format on
6709 unsigned char* p = packet;
6710 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07006711 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006712 p = packet99;
6713 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07006714 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006715 p = packet46;
6716 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006717 }
6718
6719 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6720 ASSERT_TRUE(data != nullptr);
6721 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6722 data->length(), AsChars(p), p_size);
6723}
6724
6725TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlockMaxLength) {
QUICHE team2252b702019-05-14 23:55:14 -04006726 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006727 QuicPacketHeader header;
6728 header.destination_connection_id = FramerTestConnectionId();
6729 header.reset_flag = false;
6730 header.version_flag = false;
6731 header.packet_number = kPacketNumber;
6732
6733 QuicAckFrame ack_frame = InitAckFrame(kPacketNumber);
6734 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6735
6736 QuicFrames frames = {QuicFrame(&ack_frame)};
6737
6738 // clang-format off
6739 unsigned char packet[] = {
6740 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04006741 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006742 // connection_id
6743 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6744 // packet number
6745 0x12, 0x34, 0x56, 0x78,
6746
6747 // frame type (ack frame)
6748 // (no ack blocks, 4 byte largest observed, 4 byte block length)
6749 0x4A,
6750 // largest acked
6751 0x12, 0x34, 0x56, 0x78,
6752 // Zero delta time.
6753 0x00, 0x00,
6754 // first ack block length.
6755 0x12, 0x34, 0x56, 0x78,
6756 // num timestamps.
6757 0x00,
6758 };
6759
QUICHE teama6ef0a62019-03-07 20:34:33 -05006760 unsigned char packet46[] = {
6761 // type (short header, 4 byte packet number)
6762 0x43,
6763 // connection_id
6764 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6765 // packet number
6766 0x12, 0x34, 0x56, 0x78,
6767
6768 // frame type (ack frame)
6769 // (no ack blocks, 4 byte largest observed, 4 byte block length)
6770 0x4A,
6771 // largest acked
6772 0x12, 0x34, 0x56, 0x78,
6773 // Zero delta time.
6774 0x00, 0x00,
6775 // first ack block length.
6776 0x12, 0x34, 0x56, 0x78,
6777 // num timestamps.
6778 0x00,
6779 };
6780
6781
6782 unsigned char packet99[] = {
6783 // type (short header, 4 byte packet number)
6784 0x43,
6785 // connection_id
6786 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6787 // packet number
6788 0x12, 0x34, 0x56, 0x78,
6789
6790 // frame type (IETF_ACK frame)
6791 0x02,
6792 // largest acked
6793 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
6794 // Zero delta time.
6795 kVarInt62OneByte + 0x00,
6796 // Nr. of additional ack blocks
6797 kVarInt62OneByte + 0x00,
6798 // first ack block length.
6799 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
6800 };
6801 // clang-format on
6802 unsigned char* p = packet;
6803 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07006804 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006805 p = packet99;
6806 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07006807 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006808 p = packet46;
6809 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006810 }
6811
6812 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6813 ASSERT_TRUE(data != nullptr);
6814 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6815 data->length(), AsChars(p), p_size);
6816}
6817
6818TEST_P(QuicFramerTest, BuildAckFramePacketMultipleAckBlocks) {
QUICHE team2252b702019-05-14 23:55:14 -04006819 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006820 QuicPacketHeader header;
6821 header.destination_connection_id = FramerTestConnectionId();
6822 header.reset_flag = false;
6823 header.version_flag = false;
6824 header.packet_number = kPacketNumber;
6825
6826 // Use kSmallLargestObserved to make this test finished in a short time.
6827 QuicAckFrame ack_frame =
6828 InitAckFrame({{QuicPacketNumber(1), QuicPacketNumber(5)},
6829 {QuicPacketNumber(10), QuicPacketNumber(500)},
6830 {QuicPacketNumber(900), kSmallMissingPacket},
6831 {kSmallMissingPacket + 1, kSmallLargestObserved + 1}});
6832 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6833
6834 QuicFrames frames = {QuicFrame(&ack_frame)};
6835
6836 // clang-format off
6837 unsigned char packet[] = {
6838 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04006839 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006840 // connection_id
6841 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6842 // packet number
6843 0x12, 0x34, 0x56, 0x78,
6844
6845 // frame type (ack frame)
6846 // (has ack blocks, 2 byte largest observed, 2 byte block length)
6847 0x65,
6848 // largest acked
6849 0x12, 0x34,
6850 // Zero delta time.
6851 0x00, 0x00,
6852 // num ack blocks ranges.
6853 0x04,
6854 // first ack block length.
6855 0x00, 0x01,
6856 // gap to next block.
6857 0x01,
6858 // ack block length.
6859 0x0e, 0xaf,
6860 // gap to next block.
6861 0xff,
6862 // ack block length.
6863 0x00, 0x00,
6864 // gap to next block.
6865 0x91,
6866 // ack block length.
6867 0x01, 0xea,
6868 // gap to next block.
6869 0x05,
6870 // ack block length.
6871 0x00, 0x04,
6872 // num timestamps.
6873 0x00,
6874 };
6875
QUICHE teama6ef0a62019-03-07 20:34:33 -05006876 unsigned char packet46[] = {
6877 // type (short header, 4 byte packet number)
6878 0x43,
6879 // connection_id
6880 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6881 // packet number
6882 0x12, 0x34, 0x56, 0x78,
6883
6884 // frame type (ack frame)
6885 // (has ack blocks, 2 byte largest observed, 2 byte block length)
6886 0x65,
6887 // largest acked
6888 0x12, 0x34,
6889 // Zero delta time.
6890 0x00, 0x00,
6891 // num ack blocks ranges.
6892 0x04,
6893 // first ack block length.
6894 0x00, 0x01,
6895 // gap to next block.
6896 0x01,
6897 // ack block length.
6898 0x0e, 0xaf,
6899 // gap to next block.
6900 0xff,
6901 // ack block length.
6902 0x00, 0x00,
6903 // gap to next block.
6904 0x91,
6905 // ack block length.
6906 0x01, 0xea,
6907 // gap to next block.
6908 0x05,
6909 // ack block length.
6910 0x00, 0x04,
6911 // num timestamps.
6912 0x00,
6913 };
6914
6915 unsigned char packet99[] = {
6916 // type (short header, 4 byte packet number)
6917 0x43,
6918 // connection_id
6919 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6920 // packet number
6921 0x12, 0x34, 0x56, 0x78,
6922
6923 // frame type (IETF_ACK frame)
6924 0x02,
6925 // largest acked
6926 kVarInt62TwoBytes + 0x12, 0x34,
6927 // Zero delta time.
6928 kVarInt62OneByte + 0x00,
6929 // num additional ack blocks.
6930 kVarInt62OneByte + 0x03,
6931 // first ack block length.
6932 kVarInt62OneByte + 0x00,
6933
6934 // gap to next block.
6935 kVarInt62OneByte + 0x00,
6936 // ack block length.
6937 kVarInt62TwoBytes + 0x0e, 0xae,
6938
6939 // gap to next block.
6940 kVarInt62TwoBytes + 0x01, 0x8f,
6941 // ack block length.
6942 kVarInt62TwoBytes + 0x01, 0xe9,
6943
6944 // gap to next block.
6945 kVarInt62OneByte + 0x04,
6946 // ack block length.
6947 kVarInt62OneByte + 0x03,
6948 };
6949 // clang-format on
6950 unsigned char* p = packet;
6951 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07006952 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006953 p = packet99;
6954 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07006955 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006956 p = packet46;
6957 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006958 }
6959
6960 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6961 ASSERT_TRUE(data != nullptr);
6962
6963 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6964 data->length(), AsChars(p), p_size);
6965}
6966
6967TEST_P(QuicFramerTest, BuildAckFramePacketMaxAckBlocks) {
QUICHE team2252b702019-05-14 23:55:14 -04006968 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006969 QuicPacketHeader header;
6970 header.destination_connection_id = FramerTestConnectionId();
6971 header.reset_flag = false;
6972 header.version_flag = false;
6973 header.packet_number = kPacketNumber;
6974
6975 // Use kSmallLargestObservedto make this test finished in a short time.
6976 QuicAckFrame ack_frame;
6977 ack_frame.largest_acked = kSmallLargestObserved;
6978 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6979 // 300 ack blocks.
6980 for (size_t i = 2; i < 2 * 300; i += 2) {
6981 ack_frame.packets.Add(QuicPacketNumber(i));
6982 }
6983 ack_frame.packets.AddRange(QuicPacketNumber(600), kSmallLargestObserved + 1);
6984
6985 QuicFrames frames = {QuicFrame(&ack_frame)};
6986
6987 // clang-format off
6988 unsigned char packet[] = {
6989 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04006990 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006991 // connection_id
6992 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6993 // packet number
6994 0x12, 0x34, 0x56, 0x78,
6995 // frame type (ack frame)
6996 // (has ack blocks, 2 byte largest observed, 2 byte block length)
6997 0x65,
6998 // largest acked
6999 0x12, 0x34,
7000 // Zero delta time.
7001 0x00, 0x00,
7002 // num ack blocks ranges.
7003 0xff,
7004 // first ack block length.
7005 0x0f, 0xdd,
7006 // 255 = 4 * 63 + 3
7007 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7008 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7009 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7010 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7011 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7012 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7013 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7014 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7015 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7016 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7017
7018 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7019 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7020 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7021 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7022 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7023 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7024 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7025 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7026 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7027 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7028
7029 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7030 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7031 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7032 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7033 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7034 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7035 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7036 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7037 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7038 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7039
7040 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7041 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7042 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7043 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7044 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7045 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7046 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7047 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7048 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7049 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7050
7051 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7052 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7053 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7054 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7055 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7056 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7057 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7058 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7059 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7060 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7061
7062 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7063 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7064 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7065 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7066 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7067 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7068 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7069 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7070 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7071 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7072
7073 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7074 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7075 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7076 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7077 // num timestamps.
7078 0x00,
7079 };
7080
QUICHE teama6ef0a62019-03-07 20:34:33 -05007081 unsigned char packet46[] = {
7082 // type (short header, 4 byte packet number)
7083 0x43,
7084 // connection_id
7085 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7086 // packet number
7087 0x12, 0x34, 0x56, 0x78,
7088 // frame type (ack frame)
7089 // (has ack blocks, 2 byte largest observed, 2 byte block length)
7090 0x65,
7091 // largest acked
7092 0x12, 0x34,
7093 // Zero delta time.
7094 0x00, 0x00,
7095 // num ack blocks ranges.
7096 0xff,
7097 // first ack block length.
7098 0x0f, 0xdd,
7099 // 255 = 4 * 63 + 3
7100 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7101 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7102 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7103 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7104 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7105 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7106 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7107 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7108 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7109 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7110
7111 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7112 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7113 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7114 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7115 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7116 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7117 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7118 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7119 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7120 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7121
7122 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7123 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7124 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7125 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7126 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7127 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7128 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7129 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7130 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7131 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7132
7133 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7134 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7135 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7136 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7137 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7138 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7139 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7140 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7141 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7142 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7143
7144 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7145 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7146 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7147 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7148 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7149 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7150 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7151 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7152 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7153 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7154
7155 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7156 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7157 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7158 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7159 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7160 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7161 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7162 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7163 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7164 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7165
7166 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7167 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7168 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7169 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7170 // num timestamps.
7171 0x00,
7172 };
7173
7174 unsigned char packet99[] = {
7175 // type (short header, 4 byte packet number)
7176 0x43,
7177 // connection_id
7178 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7179 // packet number
7180 0x12, 0x34, 0x56, 0x78,
7181 // frame type (IETF_ACK frame)
7182 0x02,
7183 // largest acked
7184 kVarInt62TwoBytes + 0x12, 0x34,
7185 // Zero delta time.
7186 kVarInt62OneByte + 0x00,
7187 // num ack blocks ranges.
7188 kVarInt62TwoBytes + 0x01, 0x2b,
7189 // first ack block length.
7190 kVarInt62TwoBytes + 0x0f, 0xdc,
7191 // 255 added blocks of gap_size == 1, ack_size == 1
7192#define V99AddedBLOCK kVarInt62OneByte + 0x00, kVarInt62OneByte + 0x00
7193 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7194 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7195 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7196 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7197 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7198 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7199 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7200 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7201 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7202 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7203 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7204 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7205 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7206 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7207 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7208 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7209 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7210 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7211 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7212 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7213
7214 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7215 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7216 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7217 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7218 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7219 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7220 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7221 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7222 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7223 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7224 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7225 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7226 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7227 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7228 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7229 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7230 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7231 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7232 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7233 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7234
7235 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7236 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7237 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7238 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7239 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7240 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7241 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7242 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7243 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7244 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7245 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7246 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7247 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7248 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7249 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7250 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7251 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7252 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7253 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7254 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7255
7256#undef V99AddedBLOCK
7257 };
7258 // clang-format on
7259 unsigned char* p = packet;
7260 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07007261 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007262 p = packet99;
7263 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07007264 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007265 p = packet46;
7266 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007267 }
7268
7269 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7270 ASSERT_TRUE(data != nullptr);
7271
7272 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7273 data->length(), AsChars(p), p_size);
7274}
7275
7276TEST_P(QuicFramerTest, BuildNewStopWaitingPacket) {
7277 if (version_.transport_version > QUIC_VERSION_43) {
7278 return;
7279 }
QUICHE team2252b702019-05-14 23:55:14 -04007280 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007281 QuicPacketHeader header;
7282 header.destination_connection_id = FramerTestConnectionId();
7283 header.reset_flag = false;
7284 header.version_flag = false;
7285 header.packet_number = kPacketNumber;
7286
7287 QuicStopWaitingFrame stop_waiting_frame;
7288 stop_waiting_frame.least_unacked = kLeastUnacked;
7289
7290 QuicFrames frames = {QuicFrame(stop_waiting_frame)};
7291
7292 // clang-format off
7293 unsigned char packet[] = {
7294 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007295 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007296 // connection_id
7297 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7298 // packet number
7299 0x12, 0x34, 0x56, 0x78,
7300
7301 // frame type (stop waiting frame)
7302 0x06,
7303 // least packet number awaiting an ack, delta from packet number.
7304 0x00, 0x00, 0x00, 0x08,
7305 };
7306
7307 // clang-format on
7308
7309 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7310 ASSERT_TRUE(data != nullptr);
7311
7312 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7313 data->length(), AsChars(packet),
7314 QUIC_ARRAYSIZE(packet));
7315}
7316
7317TEST_P(QuicFramerTest, BuildRstFramePacketQuic) {
QUICHE team2252b702019-05-14 23:55:14 -04007318 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007319 QuicPacketHeader header;
7320 header.destination_connection_id = FramerTestConnectionId();
7321 header.reset_flag = false;
7322 header.version_flag = false;
7323 header.packet_number = kPacketNumber;
7324
7325 QuicRstStreamFrame rst_frame;
7326 rst_frame.stream_id = kStreamId;
fkastenholz305e1732019-06-18 05:01:22 -07007327 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007328 rst_frame.ietf_error_code = 0x01;
7329 } else {
7330 rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708);
7331 }
7332 rst_frame.byte_offset = 0x0807060504030201;
7333
7334 // clang-format off
7335 unsigned char packet[] = {
7336 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007337 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007338 // connection_id
7339 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7340 // packet number
7341 0x12, 0x34, 0x56, 0x78,
7342
7343 // frame type (rst stream frame)
7344 0x01,
7345 // stream id
7346 0x01, 0x02, 0x03, 0x04,
7347 // sent byte offset
7348 0x08, 0x07, 0x06, 0x05,
7349 0x04, 0x03, 0x02, 0x01,
7350 // error code
7351 0x05, 0x06, 0x07, 0x08,
7352 };
7353
QUICHE teama6ef0a62019-03-07 20:34:33 -05007354 unsigned char packet46[] = {
7355 // type (short packet, 4 byte packet number)
7356 0x43,
7357 // connection_id
7358 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7359 // packet number
7360 0x12, 0x34, 0x56, 0x78,
7361
7362 // frame type (rst stream frame)
7363 0x01,
7364 // stream id
7365 0x01, 0x02, 0x03, 0x04,
7366 // sent byte offset
7367 0x08, 0x07, 0x06, 0x05,
7368 0x04, 0x03, 0x02, 0x01,
7369 // error code
7370 0x05, 0x06, 0x07, 0x08,
7371 };
7372
7373 unsigned char packet99[] = {
7374 // type (short packet, 4 byte packet number)
7375 0x43,
7376 // connection_id
7377 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7378 // packet number
7379 0x12, 0x34, 0x56, 0x78,
7380
7381 // frame type (IETF_RST_STREAM frame)
7382 0x04,
7383 // stream id
7384 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
fkastenholz07300e52019-07-16 11:51:37 -07007385 // error code
7386 kVarInt62OneByte + 0x01,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007387 // sent byte offset
7388 kVarInt62EightBytes + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01
7389 };
7390 // clang-format on
7391
7392 QuicFrames frames = {QuicFrame(&rst_frame)};
7393
7394 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7395 ASSERT_TRUE(data != nullptr);
7396
7397 unsigned char* p = packet;
7398 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07007399 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007400 p = packet99;
7401 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07007402 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007403 p = packet46;
7404 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007405 }
7406 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
7407
7408 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7409 data->length(), AsChars(p), p_size);
7410}
7411
7412TEST_P(QuicFramerTest, BuildCloseFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04007413 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007414 QuicPacketHeader header;
7415 header.destination_connection_id = FramerTestConnectionId();
7416 header.reset_flag = false;
7417 header.version_flag = false;
7418 header.packet_number = kPacketNumber;
7419
fkastenholz2d55b912019-09-10 15:57:17 -07007420 QuicConnectionCloseFrame close_frame(
7421 framer_.transport_version(),
7422 static_cast<QuicErrorCode>(
7423 VersionHasIetfQuicFrames(framer_.transport_version()) ? 0x11
7424 : 0x05060708),
7425 "because I can", 0x05);
7426 close_frame.extracted_error_code = QUIC_IETF_GQUIC_ERROR_MISSING;
QUICHE teama6ef0a62019-03-07 20:34:33 -05007427 QuicFrames frames = {QuicFrame(&close_frame)};
7428
7429 // clang-format off
7430 unsigned char packet[] = {
7431 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007432 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007433 // connection_id
7434 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7435 // packet number
7436 0x12, 0x34, 0x56, 0x78,
7437
7438 // frame type (connection close frame)
7439 0x02,
7440 // error code
7441 0x05, 0x06, 0x07, 0x08,
7442 // error details length
7443 0x00, 0x0d,
7444 // error details
7445 'b', 'e', 'c', 'a',
7446 'u', 's', 'e', ' ',
7447 'I', ' ', 'c', 'a',
7448 'n',
7449 };
7450
QUICHE teama6ef0a62019-03-07 20:34:33 -05007451 unsigned char packet46[] = {
7452 // type (short header, 4 byte packet number)
7453 0x43,
7454 // connection_id
7455 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7456 // packet number
7457 0x12, 0x34, 0x56, 0x78,
7458
7459 // frame type (connection close frame)
7460 0x02,
7461 // error code
7462 0x05, 0x06, 0x07, 0x08,
7463 // error details length
7464 0x00, 0x0d,
7465 // error details
7466 'b', 'e', 'c', 'a',
7467 'u', 's', 'e', ' ',
7468 'I', ' ', 'c', 'a',
7469 'n',
7470 };
7471
7472 unsigned char packet99[] = {
7473 // type (short header, 4 byte packet number)
7474 0x43,
7475 // connection_id
7476 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7477 // packet number
7478 0x12, 0x34, 0x56, 0x78,
7479
7480 // frame type (IETF_CONNECTION_CLOSE frame)
7481 0x1c,
7482 // error code
fkastenholzd57d3f92019-07-16 09:05:17 -07007483 kVarInt62OneByte + 0x11,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007484 // Frame type within the CONNECTION_CLOSE frame
7485 kVarInt62OneByte + 0x05,
7486 // error details length
7487 kVarInt62OneByte + 0x0d,
7488 // error details
7489 'b', 'e', 'c', 'a',
7490 'u', 's', 'e', ' ',
7491 'I', ' ', 'c', 'a',
7492 'n',
7493 };
7494 // clang-format on
7495
7496 unsigned char* p = packet;
7497 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07007498 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007499 p = packet99;
7500 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07007501 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007502 p = packet46;
7503 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007504 }
7505
7506 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7507 ASSERT_TRUE(data != nullptr);
7508
7509 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7510 data->length(), AsChars(p), p_size);
7511}
7512
fkastenholzb4dade72019-08-05 06:54:20 -07007513TEST_P(QuicFramerTest, BuildCloseFramePacketExtendedInfo) {
7514 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7515 QuicPacketHeader header;
7516 header.destination_connection_id = FramerTestConnectionId();
7517 header.reset_flag = false;
7518 header.version_flag = false;
7519 header.packet_number = kPacketNumber;
7520
fkastenholz2d55b912019-09-10 15:57:17 -07007521 QuicConnectionCloseFrame close_frame(
7522 framer_.transport_version(),
7523 static_cast<QuicErrorCode>(
7524 VersionHasIetfQuicFrames(framer_.transport_version()) ? 0x11
7525 : 0x05060708),
7526 "because I can", 0x05);
fkastenholzb4dade72019-08-05 06:54:20 -07007527 // Set this so that it is "there" for both Google QUIC and IETF QUIC
7528 // framing. It better not show up for Google QUIC!
7529 close_frame.extracted_error_code = static_cast<QuicErrorCode>(0x4567);
7530
fkastenholzb4dade72019-08-05 06:54:20 -07007531 QuicFrames frames = {QuicFrame(&close_frame)};
7532
7533 // clang-format off
7534 unsigned char packet[] = {
7535 // public flags (8 byte connection_id)
7536 0x2C,
7537 // connection_id
7538 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7539 // packet number
7540 0x12, 0x34, 0x56, 0x78,
7541
7542 // frame type (connection close frame)
7543 0x02,
7544 // error code
7545 0x05, 0x06, 0x07, 0x08,
7546 // error details length
7547 0x00, 0x0d,
7548 // error details
7549 'b', 'e', 'c', 'a',
7550 'u', 's', 'e', ' ',
7551 'I', ' ', 'c', 'a',
7552 'n',
7553 };
7554
fkastenholzb4dade72019-08-05 06:54:20 -07007555 unsigned char packet46[] = {
7556 // type (short header, 4 byte packet number)
7557 0x43,
7558 // connection_id
7559 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7560 // packet number
7561 0x12, 0x34, 0x56, 0x78,
7562
7563 // frame type (connection close frame)
7564 0x02,
7565 // error code
7566 0x05, 0x06, 0x07, 0x08,
7567 // error details length
7568 0x00, 0x0d,
7569 // error details
7570 'b', 'e', 'c', 'a',
7571 'u', 's', 'e', ' ',
7572 'I', ' ', 'c', 'a',
7573 'n',
7574 };
7575
7576 unsigned char packet99[] = {
7577 // type (short header, 4 byte packet number)
7578 0x43,
7579 // connection_id
7580 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7581 // packet number
7582 0x12, 0x34, 0x56, 0x78,
7583
7584 // frame type (IETF_CONNECTION_CLOSE frame)
7585 0x1c,
7586 // error code
7587 kVarInt62OneByte + 0x11,
7588 // Frame type within the CONNECTION_CLOSE frame
7589 kVarInt62OneByte + 0x05,
7590 // error details length
7591 kVarInt62OneByte + 0x13,
7592 // error details
7593 '1', '7', '7', '6',
7594 '7', ':', 'b', 'e',
7595 'c', 'a', 'u', 's',
7596 'e', ' ', 'I', ' ',
7597 'c', 'a', 'n'
7598 };
7599 // clang-format on
7600
7601 unsigned char* p = packet;
7602 size_t p_size = QUIC_ARRAYSIZE(packet);
7603 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7604 p = packet99;
7605 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07007606 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fkastenholzb4dade72019-08-05 06:54:20 -07007607 p = packet46;
7608 p_size = QUIC_ARRAYSIZE(packet46);
fkastenholzb4dade72019-08-05 06:54:20 -07007609 }
7610
7611 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7612 ASSERT_TRUE(data != nullptr);
7613
7614 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7615 data->length(), AsChars(p), p_size);
7616}
7617
QUICHE teama6ef0a62019-03-07 20:34:33 -05007618TEST_P(QuicFramerTest, BuildTruncatedCloseFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04007619 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007620 QuicPacketHeader header;
7621 header.destination_connection_id = FramerTestConnectionId();
7622 header.reset_flag = false;
7623 header.version_flag = false;
7624 header.packet_number = kPacketNumber;
7625
fkastenholz2d55b912019-09-10 15:57:17 -07007626 QuicConnectionCloseFrame close_frame(
7627 framer_.transport_version(),
7628 static_cast<QuicErrorCode>(
7629 VersionHasIetfQuicFrames(framer_.transport_version()) ? 0xa
7630 : 0x05060708),
7631 std::string(2048, 'A'), 0x05);
7632 close_frame.extracted_error_code = QUIC_IETF_GQUIC_ERROR_MISSING;
QUICHE teama6ef0a62019-03-07 20:34:33 -05007633 QuicFrames frames = {QuicFrame(&close_frame)};
7634
7635 // clang-format off
7636 unsigned char packet[] = {
7637 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007638 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007639 // connection_id
7640 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7641 // packet number
7642 0x12, 0x34, 0x56, 0x78,
7643
7644 // frame type (connection close frame)
7645 0x02,
7646 // error code
7647 0x05, 0x06, 0x07, 0x08,
7648 // error details length
7649 0x01, 0x00,
7650 // error details (truncated to 256 bytes)
7651 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7652 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7653 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7654 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7655 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7656 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7657 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7658 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7659 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7660 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7661 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7662 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7663 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7664 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7665 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7666 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7667 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7668 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7669 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7670 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7671 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7672 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7673 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7674 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7675 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7676 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7677 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7678 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7679 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7680 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7681 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7682 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7683 };
7684
QUICHE teama6ef0a62019-03-07 20:34:33 -05007685 unsigned char packet46[] = {
7686 // type (short header, 4 byte packet number)
7687 0x43,
7688 // connection_id
7689 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7690 // packet number
7691 0x12, 0x34, 0x56, 0x78,
7692
7693 // frame type (connection close frame)
7694 0x02,
7695 // error code
7696 0x05, 0x06, 0x07, 0x08,
7697 // error details length
7698 0x01, 0x00,
7699 // error details (truncated to 256 bytes)
7700 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7701 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7702 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7703 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7704 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7705 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7706 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7707 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7708 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7709 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7710 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7711 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7712 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7713 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7714 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7715 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7716 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7717 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7718 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7719 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7720 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7721 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7722 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7723 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7724 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7725 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7726 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7727 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7728 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7729 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7730 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7731 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7732 };
7733
7734 unsigned char packet99[] = {
7735 // type (short header, 4 byte packet number)
7736 0x43,
7737 // connection_id
7738 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7739 // packet number
7740 0x12, 0x34, 0x56, 0x78,
7741
7742 // frame type (IETF_CONNECTION_CLOSE frame)
7743 0x1c,
7744 // error code
fkastenholzd57d3f92019-07-16 09:05:17 -07007745 kVarInt62OneByte + 0x0a,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007746 // Frame type within the CONNECTION_CLOSE frame
fkastenholz2d55b912019-09-10 15:57:17 -07007747 kVarInt62OneByte + 0x05,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007748 // error details length
7749 kVarInt62TwoBytes + 0x01, 0x00,
7750 // error details (truncated to 256 bytes)
7751 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7752 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7753 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7754 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7755 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7756 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7757 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7758 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7759 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7760 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7761 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7762 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7763 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7764 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7765 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7766 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7767 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7768 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7769 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7770 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7771 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7772 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7773 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7774 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7775 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7776 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7777 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7778 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7779 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7780 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7781 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7782 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7783 };
7784 // clang-format on
7785
7786 unsigned char* p = packet;
7787 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07007788 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007789 p = packet99;
7790 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07007791 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007792 p = packet46;
7793 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007794 }
7795
7796 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7797 ASSERT_TRUE(data != nullptr);
7798
7799 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7800 data->length(), AsChars(p), p_size);
7801}
7802
7803TEST_P(QuicFramerTest, BuildApplicationCloseFramePacket) {
fkastenholz305e1732019-06-18 05:01:22 -07007804 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07007805 // This frame is only for IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05007806 return;
7807 }
QUICHE team2252b702019-05-14 23:55:14 -04007808 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007809 QuicPacketHeader header;
7810 header.destination_connection_id = FramerTestConnectionId();
7811 header.reset_flag = false;
7812 header.version_flag = false;
7813 header.packet_number = kPacketNumber;
7814
fkastenholz72f509b2019-04-10 09:17:49 -07007815 QuicConnectionCloseFrame app_close_frame;
fkastenholzd57d3f92019-07-16 09:05:17 -07007816 app_close_frame.application_error_code =
7817 static_cast<uint64_t>(QUIC_INVALID_STREAM_ID);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007818 app_close_frame.error_details = "because I can";
fkastenholz72f509b2019-04-10 09:17:49 -07007819 app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -05007820
7821 QuicFrames frames = {QuicFrame(&app_close_frame)};
7822
7823 // clang-format off
7824
7825 unsigned char packet99[] = {
7826 // type (short header, 4 byte packet number)
7827 0x43,
7828 // connection_id
7829 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7830 // packet number
7831 0x12, 0x34, 0x56, 0x78,
7832
7833 // frame type (IETF_APPLICATION_CLOSE frame)
7834 0x1d,
7835 // error code
fkastenholzd57d3f92019-07-16 09:05:17 -07007836 kVarInt62OneByte + 0x11,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007837 // error details length
fkastenholz2d55b912019-09-10 15:57:17 -07007838 kVarInt62OneByte + 0x0f,
7839 // error details, note that it includes an extended error code.
7840 '0', ':', 'b', 'e',
7841 'c', 'a', 'u', 's',
7842 'e', ' ', 'I', ' ',
7843 'c', 'a', 'n',
QUICHE teama6ef0a62019-03-07 20:34:33 -05007844 };
7845 // clang-format on
7846
7847 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7848 ASSERT_TRUE(data != nullptr);
7849
7850 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7851 data->length(), AsChars(packet99),
7852 QUIC_ARRAYSIZE(packet99));
7853}
7854
7855TEST_P(QuicFramerTest, BuildTruncatedApplicationCloseFramePacket) {
fkastenholz305e1732019-06-18 05:01:22 -07007856 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07007857 // This frame is only for IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05007858 return;
7859 }
QUICHE team2252b702019-05-14 23:55:14 -04007860 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007861 QuicPacketHeader header;
7862 header.destination_connection_id = FramerTestConnectionId();
7863 header.reset_flag = false;
7864 header.version_flag = false;
7865 header.packet_number = kPacketNumber;
7866
fkastenholz72f509b2019-04-10 09:17:49 -07007867 QuicConnectionCloseFrame app_close_frame;
fkastenholzd57d3f92019-07-16 09:05:17 -07007868 app_close_frame.application_error_code =
7869 static_cast<uint64_t>(QUIC_INVALID_STREAM_ID);
vasilvvc48c8712019-03-11 13:38:16 -07007870 app_close_frame.error_details = std::string(2048, 'A');
fkastenholz72f509b2019-04-10 09:17:49 -07007871 app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
fkastenholz2d55b912019-09-10 15:57:17 -07007872 // Setting to missing ensures that if it is missing, the extended
7873 // code is not added to the text message.
7874 app_close_frame.extracted_error_code = QUIC_IETF_GQUIC_ERROR_MISSING;
QUICHE teama6ef0a62019-03-07 20:34:33 -05007875
7876 QuicFrames frames = {QuicFrame(&app_close_frame)};
7877
7878 // clang-format off
7879 unsigned char packet99[] = {
7880 // type (short header, 4 byte packet number)
7881 0x43,
7882 // connection_id
7883 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7884 // packet number
7885 0x12, 0x34, 0x56, 0x78,
7886
7887 // frame type (IETF_APPLICATION_CLOSE frame)
7888 0x1d,
7889 // error code
fkastenholzd57d3f92019-07-16 09:05:17 -07007890 kVarInt62OneByte + 0x11,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007891 // error details length
7892 kVarInt62TwoBytes + 0x01, 0x00,
7893 // error details (truncated to 256 bytes)
7894 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7895 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7896 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7897 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7898 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7899 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7900 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7901 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7902 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7903 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7904 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7905 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7906 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7907 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7908 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7909 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7910 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7911 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7912 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7913 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7914 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7915 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7916 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7917 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7918 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7919 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7920 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7921 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7922 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7923 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7924 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7925 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7926 };
7927 // clang-format on
7928
7929 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7930 ASSERT_TRUE(data != nullptr);
7931
7932 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7933 data->length(), AsChars(packet99),
7934 QUIC_ARRAYSIZE(packet99));
7935}
7936
7937TEST_P(QuicFramerTest, BuildGoAwayPacket) {
fkastenholz305e1732019-06-18 05:01:22 -07007938 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07007939 // This frame is only for Google QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05007940 return;
7941 }
QUICHE team2252b702019-05-14 23:55:14 -04007942 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007943 QuicPacketHeader header;
7944 header.destination_connection_id = FramerTestConnectionId();
7945 header.reset_flag = false;
7946 header.version_flag = false;
7947 header.packet_number = kPacketNumber;
7948
7949 QuicGoAwayFrame goaway_frame;
7950 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
7951 goaway_frame.last_good_stream_id = kStreamId;
7952 goaway_frame.reason_phrase = "because I can";
7953
7954 QuicFrames frames = {QuicFrame(&goaway_frame)};
7955
7956 // clang-format off
7957 unsigned char packet[] = {
7958 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007959 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007960 // connection_id
7961 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7962 // packet number
7963 0x12, 0x34, 0x56, 0x78,
7964
7965 // frame type (go away frame)
7966 0x03,
7967 // error code
7968 0x05, 0x06, 0x07, 0x08,
7969 // stream id
7970 0x01, 0x02, 0x03, 0x04,
7971 // error details length
7972 0x00, 0x0d,
7973 // error details
7974 'b', 'e', 'c', 'a',
7975 'u', 's', 'e', ' ',
7976 'I', ' ', 'c', 'a',
7977 'n',
7978 };
7979
QUICHE teama6ef0a62019-03-07 20:34:33 -05007980 unsigned char packet46[] = {
7981 // type (short header, 4 byte packet number)
7982 0x43,
7983 // connection_id
7984 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7985 // packet number
7986 0x12, 0x34, 0x56, 0x78,
7987
7988 // frame type (go away frame)
7989 0x03,
7990 // error code
7991 0x05, 0x06, 0x07, 0x08,
7992 // stream id
7993 0x01, 0x02, 0x03, 0x04,
7994 // error details length
7995 0x00, 0x0d,
7996 // error details
7997 'b', 'e', 'c', 'a',
7998 'u', 's', 'e', ' ',
7999 'I', ' ', 'c', 'a',
8000 'n',
8001 };
8002
8003 // clang-format on
8004
8005 unsigned char* p = packet;
8006 size_t p_size = QUIC_ARRAYSIZE(packet);
fayang36825da2019-08-21 14:01:27 -07008007 if (framer_.transport_version() > QUIC_VERSION_43) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008008 p = packet46;
8009 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008010 }
8011
8012 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8013 ASSERT_TRUE(data != nullptr);
8014
8015 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8016 data->length(), AsChars(p), p_size);
8017}
8018
8019TEST_P(QuicFramerTest, BuildTruncatedGoAwayPacket) {
fkastenholz305e1732019-06-18 05:01:22 -07008020 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07008021 // This frame is only for Google QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05008022 return;
8023 }
QUICHE team2252b702019-05-14 23:55:14 -04008024 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008025 QuicPacketHeader header;
8026 header.destination_connection_id = FramerTestConnectionId();
8027 header.reset_flag = false;
8028 header.version_flag = false;
8029 header.packet_number = kPacketNumber;
8030
8031 QuicGoAwayFrame goaway_frame;
8032 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
8033 goaway_frame.last_good_stream_id = kStreamId;
vasilvvc48c8712019-03-11 13:38:16 -07008034 goaway_frame.reason_phrase = std::string(2048, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -05008035
8036 QuicFrames frames = {QuicFrame(&goaway_frame)};
8037
8038 // clang-format off
8039 unsigned char packet[] = {
8040 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04008041 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008042 // connection_id
8043 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8044 // packet number
8045 0x12, 0x34, 0x56, 0x78,
8046
8047 // frame type (go away frame)
8048 0x03,
8049 // error code
8050 0x05, 0x06, 0x07, 0x08,
8051 // stream id
8052 0x01, 0x02, 0x03, 0x04,
8053 // error details length
8054 0x01, 0x00,
8055 // error details (truncated to 256 bytes)
8056 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8057 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8058 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8059 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8060 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8061 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8062 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8063 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8064 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8065 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8066 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8067 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8068 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8069 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8070 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8071 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8072 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8073 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8074 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8075 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8076 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8077 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8078 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8079 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8080 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8081 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8082 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8083 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8084 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8085 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8086 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8087 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8088 };
8089
QUICHE teama6ef0a62019-03-07 20:34:33 -05008090 unsigned char packet46[] = {
8091 // type (short header, 4 byte packet number)
8092 0x43,
8093 // connection_id
8094 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8095 // packet number
8096 0x12, 0x34, 0x56, 0x78,
8097
8098 // frame type (go away frame)
8099 0x03,
8100 // error code
8101 0x05, 0x06, 0x07, 0x08,
8102 // stream id
8103 0x01, 0x02, 0x03, 0x04,
8104 // error details length
8105 0x01, 0x00,
8106 // error details (truncated to 256 bytes)
8107 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8108 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8109 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8110 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8111 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8112 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8113 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8114 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8115 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8116 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8117 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8118 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8119 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8120 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8121 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8122 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8123 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8124 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8125 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8126 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8127 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8128 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8129 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8130 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8131 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8132 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8133 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8134 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8135 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8136 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8137 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8138 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8139 };
8140 // clang-format on
8141
8142 unsigned char* p = packet;
8143 size_t p_size = QUIC_ARRAYSIZE(packet);
fayang36825da2019-08-21 14:01:27 -07008144 if (framer_.transport_version() > QUIC_VERSION_43) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008145 p = packet46;
8146 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008147 }
8148
8149 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8150 ASSERT_TRUE(data != nullptr);
8151
8152 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8153 data->length(), AsChars(p), p_size);
8154}
8155
8156TEST_P(QuicFramerTest, BuildWindowUpdatePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04008157 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008158 QuicPacketHeader header;
8159 header.destination_connection_id = FramerTestConnectionId();
8160 header.reset_flag = false;
8161 header.version_flag = false;
8162 header.packet_number = kPacketNumber;
8163
8164 QuicWindowUpdateFrame window_update_frame;
8165 window_update_frame.stream_id = kStreamId;
renjietangd088eab2019-11-21 14:54:41 -08008166 window_update_frame.max_data = 0x1122334455667788;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008167
8168 QuicFrames frames = {QuicFrame(&window_update_frame)};
8169
8170 // clang-format off
8171 unsigned char packet[] = {
8172 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04008173 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008174 // connection_id
8175 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8176 // packet number
8177 0x12, 0x34, 0x56, 0x78,
8178
8179 // frame type (window update frame)
8180 0x04,
8181 // stream id
8182 0x01, 0x02, 0x03, 0x04,
8183 // byte offset
8184 0x11, 0x22, 0x33, 0x44,
8185 0x55, 0x66, 0x77, 0x88,
8186 };
8187
QUICHE teama6ef0a62019-03-07 20:34:33 -05008188 unsigned char packet46[] = {
8189 // type (short header, 4 byte packet number)
8190 0x43,
8191 // connection_id
8192 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8193 // packet number
8194 0x12, 0x34, 0x56, 0x78,
8195
8196 // frame type (window update frame)
8197 0x04,
8198 // stream id
8199 0x01, 0x02, 0x03, 0x04,
8200 // byte offset
8201 0x11, 0x22, 0x33, 0x44,
8202 0x55, 0x66, 0x77, 0x88,
8203 };
8204
8205 unsigned char packet99[] = {
8206 // type (short header, 4 byte packet number)
8207 0x43,
8208 // connection_id
8209 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8210 // packet number
8211 0x12, 0x34, 0x56, 0x78,
8212
8213 // frame type (IETF_MAX_STREAM_DATA frame)
8214 0x11,
8215 // stream id
8216 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
8217 // byte offset
8218 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
8219 0x55, 0x66, 0x77, 0x88,
8220 };
8221 // clang-format on
8222
8223 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8224 ASSERT_TRUE(data != nullptr);
8225
8226 unsigned char* p = packet;
8227 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07008228 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008229 p = packet99;
8230 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07008231 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008232 p = packet46;
8233 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008234 }
8235
8236 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8237 data->length(), AsChars(p), p_size);
8238}
8239
8240TEST_P(QuicFramerTest, BuildMaxStreamDataPacket) {
fkastenholz305e1732019-06-18 05:01:22 -07008241 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07008242 // This frame is only for IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05008243 return;
8244 }
QUICHE team2252b702019-05-14 23:55:14 -04008245 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008246 QuicPacketHeader header;
8247 header.destination_connection_id = FramerTestConnectionId();
8248 header.reset_flag = false;
8249 header.version_flag = false;
8250 header.packet_number = kPacketNumber;
8251
8252 QuicWindowUpdateFrame window_update_frame;
8253 window_update_frame.stream_id = kStreamId;
renjietangd088eab2019-11-21 14:54:41 -08008254 window_update_frame.max_data = 0x1122334455667788;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008255
8256 QuicFrames frames = {QuicFrame(&window_update_frame)};
8257
8258 // clang-format off
8259 unsigned char packet99[] = {
8260 // type (short header, 4 byte packet number)
8261 0x43,
8262 // connection_id
8263 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8264 // packet number
8265 0x12, 0x34, 0x56, 0x78,
8266
8267 // frame type (IETF_MAX_STREAM_DATA frame)
8268 0x11,
8269 // stream id
8270 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
8271 // byte offset
8272 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
8273 0x55, 0x66, 0x77, 0x88,
8274 };
8275 // clang-format on
8276
8277 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8278 ASSERT_TRUE(data != nullptr);
8279
8280 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8281 data->length(), AsChars(packet99),
8282 QUIC_ARRAYSIZE(packet99));
8283}
8284
8285TEST_P(QuicFramerTest, BuildMaxDataPacket) {
fkastenholz305e1732019-06-18 05:01:22 -07008286 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07008287 // This frame is only for IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05008288 return;
8289 }
QUICHE team2252b702019-05-14 23:55:14 -04008290 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008291 QuicPacketHeader header;
8292 header.destination_connection_id = FramerTestConnectionId();
8293 header.reset_flag = false;
8294 header.version_flag = false;
8295 header.packet_number = kPacketNumber;
8296
8297 QuicWindowUpdateFrame window_update_frame;
8298 window_update_frame.stream_id =
8299 QuicUtils::GetInvalidStreamId(framer_.transport_version());
renjietangd088eab2019-11-21 14:54:41 -08008300 window_update_frame.max_data = 0x1122334455667788;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008301
8302 QuicFrames frames = {QuicFrame(&window_update_frame)};
8303
8304 // clang-format off
8305 unsigned char packet99[] = {
8306 // type (short header, 4 byte packet number)
8307 0x43,
8308 // connection_id
8309 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8310 // packet number
8311 0x12, 0x34, 0x56, 0x78,
8312
8313 // frame type (IETF_MAX_DATA frame)
8314 0x10,
8315 // byte offset
8316 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
8317 0x55, 0x66, 0x77, 0x88,
8318 };
8319 // clang-format on
8320
8321 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8322 ASSERT_TRUE(data != nullptr);
8323
8324 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8325 data->length(), AsChars(packet99),
8326 QUIC_ARRAYSIZE(packet99));
8327}
8328
8329TEST_P(QuicFramerTest, BuildBlockedPacket) {
QUICHE team2252b702019-05-14 23:55:14 -04008330 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008331 QuicPacketHeader header;
8332 header.destination_connection_id = FramerTestConnectionId();
8333 header.reset_flag = false;
8334 header.version_flag = false;
8335 header.packet_number = kPacketNumber;
8336
8337 QuicBlockedFrame blocked_frame;
fkastenholz305e1732019-06-18 05:01:22 -07008338 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8339 // For IETF QUIC, the stream ID must be <invalid> for the frame
QUICHE teama6ef0a62019-03-07 20:34:33 -05008340 // to be a BLOCKED frame. if it's valid, it will be a
8341 // STREAM_BLOCKED frame.
8342 blocked_frame.stream_id =
8343 QuicUtils::GetInvalidStreamId(framer_.transport_version());
8344 } else {
8345 blocked_frame.stream_id = kStreamId;
8346 }
8347 blocked_frame.offset = kStreamOffset;
8348
8349 QuicFrames frames = {QuicFrame(&blocked_frame)};
8350
8351 // clang-format off
8352 unsigned char packet[] = {
8353 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04008354 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008355 // connection_id
8356 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8357 // packet number
8358 0x12, 0x34, 0x56, 0x78,
8359
8360 // frame type (blocked frame)
8361 0x05,
8362 // stream id
8363 0x01, 0x02, 0x03, 0x04,
8364 };
8365
QUICHE teama6ef0a62019-03-07 20:34:33 -05008366 unsigned char packet46[] = {
8367 // type (short packet, 4 byte packet number)
8368 0x43,
8369 // connection_id
8370 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8371 // packet number
8372 0x12, 0x34, 0x56, 0x78,
8373
8374 // frame type (blocked frame)
8375 0x05,
8376 // stream id
8377 0x01, 0x02, 0x03, 0x04,
8378 };
8379
8380 unsigned char packet99[] = {
8381 // type (short packet, 4 byte packet number)
8382 0x43,
8383 // connection_id
8384 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8385 // packet number
8386 0x12, 0x34, 0x56, 0x78,
8387
8388 // frame type (IETF_BLOCKED frame)
8389 0x14,
8390 // Offset
8391 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
8392 };
8393 // clang-format on
8394
8395 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8396 ASSERT_TRUE(data != nullptr);
8397
8398 unsigned char* p = packet;
8399 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07008400 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008401 p = packet99;
8402 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07008403 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008404 p = packet46;
8405 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008406 }
8407
8408 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8409 data->length(), AsChars(p), p_size);
8410}
8411
8412TEST_P(QuicFramerTest, BuildPingPacket) {
QUICHE team2252b702019-05-14 23:55:14 -04008413 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008414 QuicPacketHeader header;
8415 header.destination_connection_id = FramerTestConnectionId();
8416 header.reset_flag = false;
8417 header.version_flag = false;
8418 header.packet_number = kPacketNumber;
8419
8420 QuicFrames frames = {QuicFrame(QuicPingFrame())};
8421
8422 // clang-format off
8423 unsigned char packet[] = {
8424 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04008425 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008426 // connection_id
8427 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8428 // packet number
8429 0x12, 0x34, 0x56, 0x78,
8430
8431 // frame type (ping frame)
8432 0x07,
8433 };
8434
QUICHE teama6ef0a62019-03-07 20:34:33 -05008435 unsigned char packet46[] = {
8436 // type (short header, 4 byte packet number)
8437 0x43,
8438 // connection_id
8439 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8440 // packet number
8441 0x12, 0x34, 0x56, 0x78,
8442
8443 // frame type
8444 0x07,
8445 };
8446
8447 unsigned char packet99[] = {
8448 // type (short header, 4 byte packet number)
8449 0x43,
8450 // connection_id
8451 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8452 // packet number
8453 0x12, 0x34, 0x56, 0x78,
8454
8455 // frame type (IETF_PING frame)
8456 0x01,
8457 };
8458 // clang-format on
8459
8460 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07008461 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008462 p = packet99;
fayang36825da2019-08-21 14:01:27 -07008463 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fayang374888f2019-05-31 06:47:21 -07008464 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008465 }
8466
8467 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8468 ASSERT_TRUE(data != nullptr);
8469
8470 test::CompareCharArraysWithHexError(
8471 "constructed packet", data->data(), data->length(), AsChars(p),
fayang36825da2019-08-21 14:01:27 -07008472 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46)
QUICHE teama6ef0a62019-03-07 20:34:33 -05008473 : QUIC_ARRAYSIZE(packet));
8474}
8475
8476TEST_P(QuicFramerTest, BuildMessagePacket) {
dschinazicd86dd12019-11-14 10:11:13 -08008477 if (!VersionSupportsMessageFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008478 return;
8479 }
QUICHE team2252b702019-05-14 23:55:14 -04008480 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008481 QuicPacketHeader header;
8482 header.destination_connection_id = FramerTestConnectionId();
8483 header.reset_flag = false;
8484 header.version_flag = false;
8485 header.packet_number = kPacketNumber;
8486 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
8487
wub553a9662019-03-28 20:13:23 -07008488 QuicMessageFrame frame(1, MakeSpan(&allocator_, "message", &storage));
8489 QuicMessageFrame frame2(2, MakeSpan(&allocator_, "message2", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05008490 QuicFrames frames = {QuicFrame(&frame), QuicFrame(&frame2)};
8491
8492 // clang-format off
QUICHE teama6ef0a62019-03-07 20:34:33 -05008493 unsigned char packet46[] = {
8494 // type (short header, 4 byte packet number)
8495 0x43,
8496 // connection_id
8497 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8498 // packet number
8499 0x12, 0x34, 0x56, 0x78,
8500
8501 // frame type (message frame)
8502 0x21,
8503 // Length
8504 0x07,
8505 // Message Data
8506 'm', 'e', 's', 's', 'a', 'g', 'e',
8507 // frame type (message frame no length)
8508 0x20,
8509 // Message Data
8510 'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8511 };
8512
8513 unsigned char packet99[] = {
8514 // type (short header, 4 byte packet number)
8515 0x43,
8516 // connection_id
8517 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8518 // packet number
8519 0x12, 0x34, 0x56, 0x78,
8520
8521 // frame type (IETF_MESSAGE frame)
dschinazicd86dd12019-11-14 10:11:13 -08008522 0x31,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008523 // Length
8524 0x07,
8525 // Message Data
8526 'm', 'e', 's', 's', 'a', 'g', 'e',
8527 // frame type (message frame no length)
dschinazicd86dd12019-11-14 10:11:13 -08008528 0x30,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008529 // Message Data
8530 'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8531 };
8532 // clang-format on
8533
fayang36825da2019-08-21 14:01:27 -07008534 unsigned char* p = packet46;
fkastenholz305e1732019-06-18 05:01:22 -07008535 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008536 p = packet99;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008537 }
8538
8539 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8540 ASSERT_TRUE(data != nullptr);
8541
8542 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8543 data->length(), AsChars(p),
fayang36825da2019-08-21 14:01:27 -07008544 QUIC_ARRAYSIZE(packet46));
QUICHE teama6ef0a62019-03-07 20:34:33 -05008545}
8546
QUICHE teama6ef0a62019-03-07 20:34:33 -05008547
8548// Test that the MTU discovery packet is serialized correctly as a PING packet.
8549TEST_P(QuicFramerTest, BuildMtuDiscoveryPacket) {
QUICHE team2252b702019-05-14 23:55:14 -04008550 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008551 QuicPacketHeader header;
8552 header.destination_connection_id = FramerTestConnectionId();
8553 header.reset_flag = false;
8554 header.version_flag = false;
8555 header.packet_number = kPacketNumber;
8556
8557 QuicFrames frames = {QuicFrame(QuicMtuDiscoveryFrame())};
8558
8559 // clang-format off
8560 unsigned char packet[] = {
8561 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04008562 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008563 // connection_id
8564 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8565 // packet number
8566 0x12, 0x34, 0x56, 0x78,
8567
8568 // frame type (ping frame)
8569 0x07,
8570 };
8571
QUICHE teama6ef0a62019-03-07 20:34:33 -05008572 unsigned char packet46[] = {
8573 // type (short header, 4 byte packet number)
8574 0x43,
8575 // connection_id
8576 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8577 // packet number
8578 0x12, 0x34, 0x56, 0x78,
8579
8580 // frame type
8581 0x07,
8582 };
8583
8584 unsigned char packet99[] = {
8585 // type (short header, 4 byte packet number)
8586 0x43,
8587 // connection_id
8588 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8589 // packet number
8590 0x12, 0x34, 0x56, 0x78,
8591
8592 // frame type (IETF_PING frame)
8593 0x01,
8594 };
8595 // clang-format on
8596
8597 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8598 ASSERT_TRUE(data != nullptr);
8599
8600 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07008601 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008602 p = packet99;
fayang36825da2019-08-21 14:01:27 -07008603 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fayang374888f2019-05-31 06:47:21 -07008604 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008605 }
8606
8607 test::CompareCharArraysWithHexError(
8608 "constructed packet", data->data(), data->length(), AsChars(p),
fayang36825da2019-08-21 14:01:27 -07008609 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46)
QUICHE teama6ef0a62019-03-07 20:34:33 -05008610 : QUIC_ARRAYSIZE(packet));
8611}
8612
8613TEST_P(QuicFramerTest, BuildPublicResetPacket) {
8614 QuicPublicResetPacket reset_packet;
8615 reset_packet.connection_id = FramerTestConnectionId();
8616 reset_packet.nonce_proof = kNonceProof;
8617
8618 // clang-format off
8619 unsigned char packet[] = {
8620 // public flags (public reset, 8 byte ConnectionId)
8621 0x0E,
8622 // connection_id
8623 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8624 // message tag (kPRST)
8625 'P', 'R', 'S', 'T',
8626 // num_entries (1) + padding
8627 0x01, 0x00, 0x00, 0x00,
8628 // tag kRNON
8629 'R', 'N', 'O', 'N',
8630 // end offset 8
8631 0x08, 0x00, 0x00, 0x00,
8632 // nonce proof
8633 0x89, 0x67, 0x45, 0x23,
8634 0x01, 0xEF, 0xCD, 0xAB,
8635 };
8636 // clang-format on
8637
8638 if (framer_.transport_version() > QUIC_VERSION_43) {
8639 return;
8640 }
8641
8642 std::unique_ptr<QuicEncryptedPacket> data(
8643 framer_.BuildPublicResetPacket(reset_packet));
8644 ASSERT_TRUE(data != nullptr);
8645 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8646 data->length(), AsChars(packet),
8647 QUIC_ARRAYSIZE(packet));
8648}
8649
8650TEST_P(QuicFramerTest, BuildPublicResetPacketWithClientAddress) {
8651 QuicPublicResetPacket reset_packet;
8652 reset_packet.connection_id = FramerTestConnectionId();
8653 reset_packet.nonce_proof = kNonceProof;
8654 reset_packet.client_address =
8655 QuicSocketAddress(QuicIpAddress::Loopback4(), 0x1234);
8656
8657 // clang-format off
8658 unsigned char packet[] = {
8659 // public flags (public reset, 8 byte ConnectionId)
8660 0x0E,
8661 // connection_id
8662 0xFE, 0xDC, 0xBA, 0x98,
8663 0x76, 0x54, 0x32, 0x10,
8664 // message tag (kPRST)
8665 'P', 'R', 'S', 'T',
8666 // num_entries (2) + padding
8667 0x02, 0x00, 0x00, 0x00,
8668 // tag kRNON
8669 'R', 'N', 'O', 'N',
8670 // end offset 8
8671 0x08, 0x00, 0x00, 0x00,
8672 // tag kCADR
8673 'C', 'A', 'D', 'R',
8674 // end offset 16
8675 0x10, 0x00, 0x00, 0x00,
8676 // nonce proof
8677 0x89, 0x67, 0x45, 0x23,
8678 0x01, 0xEF, 0xCD, 0xAB,
8679 // client address
8680 0x02, 0x00,
8681 0x7F, 0x00, 0x00, 0x01,
8682 0x34, 0x12,
8683 };
8684 // clang-format on
8685
8686 if (framer_.transport_version() > QUIC_VERSION_43) {
8687 return;
8688 }
8689
8690 std::unique_ptr<QuicEncryptedPacket> data(
8691 framer_.BuildPublicResetPacket(reset_packet));
8692 ASSERT_TRUE(data != nullptr);
8693
8694 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8695 data->length(), AsChars(packet),
8696 QUIC_ARRAYSIZE(packet));
8697}
8698
8699TEST_P(QuicFramerTest, BuildPublicResetPacketWithEndpointId) {
8700 QuicPublicResetPacket reset_packet;
8701 reset_packet.connection_id = FramerTestConnectionId();
8702 reset_packet.nonce_proof = kNonceProof;
8703 reset_packet.endpoint_id = "FakeServerId";
8704
8705 // The tag value map in CryptoHandshakeMessage is a std::map, so the two tags
8706 // in the packet, kRNON and kEPID, have unspecified ordering w.r.t each other.
8707 // clang-format off
8708 unsigned char packet_variant1[] = {
8709 // public flags (public reset, 8 byte ConnectionId)
8710 0x0E,
8711 // connection_id
8712 0xFE, 0xDC, 0xBA, 0x98,
8713 0x76, 0x54, 0x32, 0x10,
8714 // message tag (kPRST)
8715 'P', 'R', 'S', 'T',
8716 // num_entries (2) + padding
8717 0x02, 0x00, 0x00, 0x00,
8718 // tag kRNON
8719 'R', 'N', 'O', 'N',
8720 // end offset 8
8721 0x08, 0x00, 0x00, 0x00,
8722 // tag kEPID
8723 'E', 'P', 'I', 'D',
8724 // end offset 20
8725 0x14, 0x00, 0x00, 0x00,
8726 // nonce proof
8727 0x89, 0x67, 0x45, 0x23,
8728 0x01, 0xEF, 0xCD, 0xAB,
8729 // Endpoint ID
8730 'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
8731 };
8732 unsigned char packet_variant2[] = {
8733 // public flags (public reset, 8 byte ConnectionId)
8734 0x0E,
8735 // connection_id
8736 0xFE, 0xDC, 0xBA, 0x98,
8737 0x76, 0x54, 0x32, 0x10,
8738 // message tag (kPRST)
8739 'P', 'R', 'S', 'T',
8740 // num_entries (2) + padding
8741 0x02, 0x00, 0x00, 0x00,
8742 // tag kEPID
8743 'E', 'P', 'I', 'D',
8744 // end offset 12
8745 0x0C, 0x00, 0x00, 0x00,
8746 // tag kRNON
8747 'R', 'N', 'O', 'N',
8748 // end offset 20
8749 0x14, 0x00, 0x00, 0x00,
8750 // Endpoint ID
8751 'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
8752 // nonce proof
8753 0x89, 0x67, 0x45, 0x23,
8754 0x01, 0xEF, 0xCD, 0xAB,
8755 };
8756 // clang-format on
8757
8758 if (framer_.transport_version() > QUIC_VERSION_43) {
8759 return;
8760 }
8761
8762 std::unique_ptr<QuicEncryptedPacket> data(
8763 framer_.BuildPublicResetPacket(reset_packet));
8764 ASSERT_TRUE(data != nullptr);
8765
8766 // Variant 1 ends with char 'd'. Variant 1 ends with char 0xAB.
8767 if ('d' == data->data()[data->length() - 1]) {
8768 test::CompareCharArraysWithHexError(
8769 "constructed packet", data->data(), data->length(),
8770 AsChars(packet_variant1), QUIC_ARRAYSIZE(packet_variant1));
8771 } else {
8772 test::CompareCharArraysWithHexError(
8773 "constructed packet", data->data(), data->length(),
8774 AsChars(packet_variant2), QUIC_ARRAYSIZE(packet_variant2));
8775 }
8776}
8777
8778TEST_P(QuicFramerTest, BuildIetfStatelessResetPacket) {
8779 // clang-format off
fayang36825da2019-08-21 14:01:27 -07008780 unsigned char packet[] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008781 // type (short header, 1 byte packet number)
8782 0x70,
8783 // random packet number
8784 0xFE,
8785 // stateless reset token
8786 0xB5, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
8787 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8788 };
8789 // clang-format on
8790
8791 std::unique_ptr<QuicEncryptedPacket> data(
8792 framer_.BuildIetfStatelessResetPacket(FramerTestConnectionId(),
8793 kTestStatelessResetToken));
8794 ASSERT_TRUE(data != nullptr);
8795 // Skip packet number byte which is random in stateless reset packet.
8796 test::CompareCharArraysWithHexError("constructed packet", data->data(), 1,
fayang36825da2019-08-21 14:01:27 -07008797 AsChars(packet), 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008798 const size_t random_bytes_length =
8799 data->length() - kPacketHeaderTypeSize - sizeof(kTestStatelessResetToken);
8800 EXPECT_EQ(kMinRandomBytesLengthInStatelessReset, random_bytes_length);
8801 // Verify stateless reset token is correct.
8802 test::CompareCharArraysWithHexError(
8803 "constructed packet",
8804 data->data() + data->length() - sizeof(kTestStatelessResetToken),
8805 sizeof(kTestStatelessResetToken),
fayang36825da2019-08-21 14:01:27 -07008806 AsChars(packet) + QUIC_ARRAYSIZE(packet) -
QUICHE teama6ef0a62019-03-07 20:34:33 -05008807 sizeof(kTestStatelessResetToken),
8808 sizeof(kTestStatelessResetToken));
8809}
8810
8811TEST_P(QuicFramerTest, EncryptPacket) {
8812 QuicPacketNumber packet_number = kPacketNumber;
8813 // clang-format off
8814 unsigned char packet[] = {
8815 // public flags (8 byte connection_id)
8816 0x28,
8817 // connection_id
8818 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8819 // packet number
8820 0x12, 0x34, 0x56, 0x78,
8821
8822 // redundancy
8823 'a', 'b', 'c', 'd',
8824 'e', 'f', 'g', 'h',
8825 'i', 'j', 'k', 'l',
8826 'm', 'n', 'o', 'p',
8827 };
8828
QUICHE teama6ef0a62019-03-07 20:34:33 -05008829 unsigned char packet46[] = {
8830 // type (short header, 4 byte packet number)
8831 0x43,
8832 // connection_id
8833 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8834 // packet number
8835 0x12, 0x34, 0x56, 0x78,
8836
8837 // redundancy
8838 'a', 'b', 'c', 'd',
8839 'e', 'f', 'g', 'h',
8840 'i', 'j', 'k', 'l',
8841 'm', 'n', 'o', 'p',
8842 };
8843
nharperc32d8ab2019-10-09 11:09:06 -07008844 unsigned char packet50[] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008845 // type (short header, 4 byte packet number)
8846 0x43,
8847 // connection_id
8848 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8849 // packet number
8850 0x12, 0x34, 0x56, 0x78,
8851
8852 // redundancy
8853 'a', 'b', 'c', 'd',
8854 'e', 'f', 'g', 'h',
8855 'i', 'j', 'k', 'l',
8856 'm', 'n', 'o', 'p',
nharper55fa6132019-05-07 19:37:21 -07008857 'q', 'r', 's', 't',
QUICHE teama6ef0a62019-03-07 20:34:33 -05008858 };
8859 // clang-format on
8860
8861 unsigned char* p = packet;
nharper55fa6132019-05-07 19:37:21 -07008862 size_t p_size = QUIC_ARRAYSIZE(packet);
nharperc32d8ab2019-10-09 11:09:06 -07008863 if (framer_.transport_version() >= QUIC_VERSION_50) {
8864 p = packet50;
8865 p_size = QUIC_ARRAYSIZE(packet50);
fayang36825da2019-08-21 14:01:27 -07008866 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fayang374888f2019-05-31 06:47:21 -07008867 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008868 }
8869
8870 std::unique_ptr<QuicPacket> raw(new QuicPacket(
nharper55fa6132019-05-07 19:37:21 -07008871 AsChars(p), p_size, false, PACKET_8BYTE_CONNECTION_ID,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008872 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
8873 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
8874 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0));
dschinazi66dea072019-04-09 11:41:06 -07008875 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05008876 size_t encrypted_length = framer_.EncryptPayload(
dschinazi66dea072019-04-09 11:41:06 -07008877 ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008878
8879 ASSERT_NE(0u, encrypted_length);
8880 EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
8881}
8882
8883TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) {
nharper55fa6132019-05-07 19:37:21 -07008884 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008885 QuicPacketNumber packet_number = kPacketNumber;
8886 // clang-format off
8887 unsigned char packet[] = {
8888 // public flags (version, 8 byte connection_id)
8889 0x29,
8890 // connection_id
8891 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8892 // version tag
8893 'Q', '.', '1', '0',
8894 // packet number
8895 0x12, 0x34, 0x56, 0x78,
8896
8897 // redundancy
8898 'a', 'b', 'c', 'd',
8899 'e', 'f', 'g', 'h',
8900 'i', 'j', 'k', 'l',
8901 'm', 'n', 'o', 'p',
8902 };
8903
QUICHE teama6ef0a62019-03-07 20:34:33 -05008904 unsigned char packet46[] = {
8905 // type (long header with packet type ZERO_RTT_PROTECTED)
8906 0xD3,
8907 // version tag
8908 'Q', '.', '1', '0',
8909 // connection_id length
8910 0x50,
8911 // connection_id
8912 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8913 // packet number
8914 0x12, 0x34, 0x56, 0x78,
8915
8916 // redundancy
8917 'a', 'b', 'c', 'd',
8918 'e', 'f', 'g', 'h',
8919 'i', 'j', 'k', 'l',
8920 'm', 'n', 'o', 'p',
8921 };
8922
nharperc32d8ab2019-10-09 11:09:06 -07008923 unsigned char packet50[] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008924 // type (long header with packet type ZERO_RTT_PROTECTED)
8925 0xD3,
8926 // version tag
8927 'Q', '.', '1', '0',
dschinazi48ac9192019-07-31 00:07:26 -07008928 // destination connection ID length
8929 0x08,
8930 // destination connection ID
QUICHE teama6ef0a62019-03-07 20:34:33 -05008931 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -07008932 // source connection ID length
8933 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008934 // packet number
8935 0x12, 0x34, 0x56, 0x78,
8936
8937 // redundancy
8938 'a', 'b', 'c', 'd',
8939 'e', 'f', 'g', 'h',
8940 'i', 'j', 'k', 'l',
8941 'm', 'n', 'o', 'p',
nharper55fa6132019-05-07 19:37:21 -07008942 'q', 'r', 's', 't',
QUICHE teama6ef0a62019-03-07 20:34:33 -05008943 };
8944 // clang-format on
8945
8946 unsigned char* p = packet;
nharper55fa6132019-05-07 19:37:21 -07008947 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07008948 // TODO(ianswett): see todo in previous test.
nharperc32d8ab2019-10-09 11:09:06 -07008949 if (framer_.transport_version() >= QUIC_VERSION_50) {
8950 p = packet50;
8951 p_size = QUIC_ARRAYSIZE(packet50);
fayang36825da2019-08-21 14:01:27 -07008952 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008953 p = packet46;
nharper55fa6132019-05-07 19:37:21 -07008954 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008955 }
8956
8957 std::unique_ptr<QuicPacket> raw(new QuicPacket(
nharper55fa6132019-05-07 19:37:21 -07008958 AsChars(p), p_size, false, PACKET_8BYTE_CONNECTION_ID,
8959 PACKET_0BYTE_CONNECTION_ID, kIncludeVersion,
8960 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
8961 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0));
dschinazi66dea072019-04-09 11:41:06 -07008962 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05008963 size_t encrypted_length = framer_.EncryptPayload(
dschinazi66dea072019-04-09 11:41:06 -07008964 ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008965
8966 ASSERT_NE(0u, encrypted_length);
8967 EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
8968}
8969
8970TEST_P(QuicFramerTest, AckTruncationLargePacket) {
fkastenholz305e1732019-06-18 05:01:22 -07008971 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008972 // This test is not applicable to this version; the range count is
8973 // effectively unlimited
8974 return;
8975 }
nharper9bb83462019-05-01 10:53:22 -07008976 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008977
8978 QuicPacketHeader header;
8979 header.destination_connection_id = FramerTestConnectionId();
8980 header.reset_flag = false;
8981 header.version_flag = false;
8982 header.packet_number = kPacketNumber;
8983
8984 QuicAckFrame ack_frame;
8985 // Create a packet with just the ack.
8986 ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
8987 QuicFrames frames = {QuicFrame(&ack_frame)};
8988
8989 // Build an ack packet with truncation due to limit in number of nack ranges.
8990 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8991 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
8992 ASSERT_TRUE(raw_ack_packet != nullptr);
dschinazi66dea072019-04-09 11:41:06 -07008993 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05008994 size_t encrypted_length =
QUICHE team6987b4a2019-03-15 16:23:04 -07008995 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
dschinazi66dea072019-04-09 11:41:06 -07008996 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008997 ASSERT_NE(0u, encrypted_length);
8998 // Now make sure we can turn our ack packet back into an ack frame.
8999 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
9000 ASSERT_TRUE(framer_.ProcessPacket(
9001 QuicEncryptedPacket(buffer, encrypted_length, false)));
9002 ASSERT_EQ(1u, visitor_.ack_frames_.size());
9003 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
9004 EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
9005 ASSERT_EQ(256u, processed_ack_frame.packets.NumPacketsSlow());
9006 EXPECT_EQ(QuicPacketNumber(90u), processed_ack_frame.packets.Min());
9007 EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
9008}
9009
9010TEST_P(QuicFramerTest, AckTruncationSmallPacket) {
fkastenholz305e1732019-06-18 05:01:22 -07009011 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009012 // This test is not applicable to this version; the range count is
9013 // effectively unlimited
9014 return;
9015 }
nharper9bb83462019-05-01 10:53:22 -07009016 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009017
9018 QuicPacketHeader header;
9019 header.destination_connection_id = FramerTestConnectionId();
9020 header.reset_flag = false;
9021 header.version_flag = false;
9022 header.packet_number = kPacketNumber;
9023
9024 // Create a packet with just the ack.
9025 QuicAckFrame ack_frame;
9026 ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
9027 QuicFrames frames = {QuicFrame(&ack_frame)};
9028
9029 // Build an ack packet with truncation due to limit in number of nack ranges.
9030 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9031 std::unique_ptr<QuicPacket> raw_ack_packet(
9032 BuildDataPacket(header, frames, 500));
9033 ASSERT_TRUE(raw_ack_packet != nullptr);
dschinazi66dea072019-04-09 11:41:06 -07009034 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009035 size_t encrypted_length =
QUICHE team6987b4a2019-03-15 16:23:04 -07009036 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
dschinazi66dea072019-04-09 11:41:06 -07009037 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009038 ASSERT_NE(0u, encrypted_length);
9039 // Now make sure we can turn our ack packet back into an ack frame.
9040 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
9041 ASSERT_TRUE(framer_.ProcessPacket(
9042 QuicEncryptedPacket(buffer, encrypted_length, false)));
9043 ASSERT_EQ(1u, visitor_.ack_frames_.size());
9044 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
9045 EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
9046 ASSERT_EQ(240u, processed_ack_frame.packets.NumPacketsSlow());
9047 EXPECT_EQ(QuicPacketNumber(122u), processed_ack_frame.packets.Min());
9048 EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
9049}
9050
9051TEST_P(QuicFramerTest, CleanTruncation) {
fkastenholz305e1732019-06-18 05:01:22 -07009052 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009053 // This test is not applicable to this version; the range count is
9054 // effectively unlimited
9055 return;
9056 }
nharper9bb83462019-05-01 10:53:22 -07009057 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009058
9059 QuicPacketHeader header;
9060 header.destination_connection_id = FramerTestConnectionId();
9061 header.reset_flag = false;
9062 header.version_flag = false;
9063 header.packet_number = kPacketNumber;
9064
9065 QuicAckFrame ack_frame = InitAckFrame(201);
9066
9067 // Create a packet with just the ack.
9068 QuicFrames frames = {QuicFrame(&ack_frame)};
nharperc32d8ab2019-10-09 11:09:06 -07009069 if (framer_.version().HasHeaderProtection()) {
9070 frames.push_back(QuicFrame(QuicPaddingFrame(12)));
9071 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05009072 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9073 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
9074 ASSERT_TRUE(raw_ack_packet != nullptr);
9075
dschinazi66dea072019-04-09 11:41:06 -07009076 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009077 size_t encrypted_length =
QUICHE team6987b4a2019-03-15 16:23:04 -07009078 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
dschinazi66dea072019-04-09 11:41:06 -07009079 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009080 ASSERT_NE(0u, encrypted_length);
9081
9082 // Now make sure we can turn our ack packet back into an ack frame.
9083 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
9084 ASSERT_TRUE(framer_.ProcessPacket(
9085 QuicEncryptedPacket(buffer, encrypted_length, false)));
9086
9087 // Test for clean truncation of the ack by comparing the length of the
9088 // original packets to the re-serialized packets.
9089 frames.clear();
9090 frames.push_back(QuicFrame(visitor_.ack_frames_[0].get()));
nharperc32d8ab2019-10-09 11:09:06 -07009091 if (framer_.version().HasHeaderProtection()) {
9092 frames.push_back(QuicFrame(*visitor_.padding_frames_[0].get()));
9093 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05009094
9095 size_t original_raw_length = raw_ack_packet->length();
9096 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9097 raw_ack_packet = BuildDataPacket(header, frames);
9098 ASSERT_TRUE(raw_ack_packet != nullptr);
9099 EXPECT_EQ(original_raw_length, raw_ack_packet->length());
9100 ASSERT_TRUE(raw_ack_packet != nullptr);
9101}
9102
9103TEST_P(QuicFramerTest, StopPacketProcessing) {
zhongyi546cc452019-04-12 15:27:49 -07009104 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009105 // clang-format off
9106 unsigned char packet[] = {
9107 // public flags (8 byte connection_id)
9108 0x28,
9109 // connection_id
9110 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9111 // packet number
9112 0x12, 0x34, 0x56, 0x78,
9113
9114 // frame type (stream frame with fin)
9115 0xFF,
9116 // stream id
9117 0x01, 0x02, 0x03, 0x04,
9118 // offset
9119 0x3A, 0x98, 0xFE, 0xDC,
9120 0x32, 0x10, 0x76, 0x54,
9121 // data length
9122 0x00, 0x0c,
9123 // data
9124 'h', 'e', 'l', 'l',
9125 'o', ' ', 'w', 'o',
9126 'r', 'l', 'd', '!',
9127
9128 // frame type (ack frame)
9129 0x40,
9130 // least packet number awaiting an ack
9131 0x12, 0x34, 0x56, 0x78,
9132 0x9A, 0xA0,
9133 // largest observed packet number
9134 0x12, 0x34, 0x56, 0x78,
9135 0x9A, 0xBF,
9136 // num missing packets
9137 0x01,
9138 // missing packet
9139 0x12, 0x34, 0x56, 0x78,
9140 0x9A, 0xBE,
9141 };
9142
QUICHE teama6ef0a62019-03-07 20:34:33 -05009143 unsigned char packet46[] = {
9144 // type (short header, 4 byte packet number)
9145 0x43,
9146 // connection_id
9147 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9148 // packet number
9149 0x12, 0x34, 0x56, 0x78,
9150
9151 // frame type (stream frame with fin)
9152 0xFF,
9153 // stream id
9154 0x01, 0x02, 0x03, 0x04,
9155 // offset
9156 0x3A, 0x98, 0xFE, 0xDC,
9157 0x32, 0x10, 0x76, 0x54,
9158 // data length
9159 0x00, 0x0c,
9160 // data
9161 'h', 'e', 'l', 'l',
9162 'o', ' ', 'w', 'o',
9163 'r', 'l', 'd', '!',
9164
9165 // frame type (ack frame)
9166 0x40,
9167 // least packet number awaiting an ack
9168 0x12, 0x34, 0x56, 0x78,
9169 0x9A, 0xA0,
9170 // largest observed packet number
9171 0x12, 0x34, 0x56, 0x78,
9172 0x9A, 0xBF,
9173 // num missing packets
9174 0x01,
9175 // missing packet
9176 0x12, 0x34, 0x56, 0x78,
9177 0x9A, 0xBE,
9178 };
9179
9180 unsigned char packet99[] = {
9181 // type (short header, 4 byte packet number)
9182 0x43,
9183 // connection_id
9184 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9185 // packet number
9186 0x12, 0x34, 0x56, 0x78,
9187
9188 // frame type (IETF_STREAM frame with fin, length, and offset bits set)
9189 0x08 | 0x01 | 0x02 | 0x04,
9190 // stream id
9191 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
9192 // offset
9193 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
9194 0x32, 0x10, 0x76, 0x54,
9195 // data length
9196 kVarInt62TwoBytes + 0x00, 0x0c,
9197 // data
9198 'h', 'e', 'l', 'l',
9199 'o', ' ', 'w', 'o',
9200 'r', 'l', 'd', '!',
9201
9202 // frame type (ack frame)
9203 0x0d,
9204 // largest observed packet number
9205 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
9206 // Delta time
9207 kVarInt62OneByte + 0x00,
9208 // Ack Block count
9209 kVarInt62OneByte + 0x01,
9210 // First block size (one packet)
9211 kVarInt62OneByte + 0x00,
9212
9213 // Next gap size & ack. Missing all preceding packets
9214 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
9215 kVarInt62OneByte + 0x00,
9216 };
9217 // clang-format on
9218
9219 MockFramerVisitor visitor;
9220 framer_.set_visitor(&visitor);
9221 EXPECT_CALL(visitor, OnPacket());
9222 EXPECT_CALL(visitor, OnPacketHeader(_));
9223 EXPECT_CALL(visitor, OnStreamFrame(_)).WillOnce(Return(false));
9224 EXPECT_CALL(visitor, OnPacketComplete());
9225 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true));
9226 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_)).WillOnce(Return(true));
9227 EXPECT_CALL(visitor, OnDecryptedPacket(_));
9228
9229 unsigned char* p = packet;
9230 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07009231 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009232 p = packet99;
9233 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07009234 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009235 p = packet46;
9236 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009237 }
9238 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
9239 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07009240 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05009241}
9242
9243static char kTestString[] = "At least 20 characters.";
9244static QuicStreamId kTestQuicStreamId = 1;
9245static bool ExpectedStreamFrame(const QuicStreamFrame& frame) {
9246 return (frame.stream_id == kTestQuicStreamId ||
nharper46833c32019-05-15 21:33:05 -07009247 QuicUtils::IsCryptoStreamId(QUIC_VERSION_99, frame.stream_id)) &&
QUICHE teama6ef0a62019-03-07 20:34:33 -05009248 !frame.fin && frame.offset == 0 &&
vasilvvc48c8712019-03-11 13:38:16 -07009249 std::string(frame.data_buffer, frame.data_length) == kTestString;
QUICHE teama6ef0a62019-03-07 20:34:33 -05009250 // FIN is hard-coded false in ConstructEncryptedPacket.
9251 // Offset 0 is hard-coded in ConstructEncryptedPacket.
9252}
9253
9254// Verify that the packet returned by ConstructEncryptedPacket() can be properly
9255// parsed by the framer.
9256TEST_P(QuicFramerTest, ConstructEncryptedPacket) {
9257 // Since we are using ConstructEncryptedPacket, we have to set the framer's
9258 // crypto to be Null.
zhongyi546cc452019-04-12 15:27:49 -07009259 if (framer_.version().KnowsWhichDecrypterToUse()) {
9260 framer_.InstallDecrypter(
9261 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -07009262 std::make_unique<NullDecrypter>(framer_.perspective()));
zhongyi546cc452019-04-12 15:27:49 -07009263 } else {
vasilvv0fc587f2019-09-06 13:33:08 -07009264 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
9265 framer_.perspective()));
zhongyi546cc452019-04-12 15:27:49 -07009266 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05009267 ParsedQuicVersionVector versions;
9268 versions.push_back(framer_.version());
9269 std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket(
9270 TestConnectionId(), EmptyQuicConnectionId(), false, false,
9271 kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
9272 CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, &versions));
9273
9274 MockFramerVisitor visitor;
9275 framer_.set_visitor(&visitor);
9276 EXPECT_CALL(visitor, OnPacket()).Times(1);
9277 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
9278 .Times(1)
9279 .WillOnce(Return(true));
9280 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
9281 .Times(1)
9282 .WillOnce(Return(true));
9283 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1).WillOnce(Return(true));
9284 EXPECT_CALL(visitor, OnDecryptedPacket(_)).Times(1);
9285 EXPECT_CALL(visitor, OnError(_)).Times(0);
9286 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
QUICHE teamea740082019-03-11 17:58:43 -07009287 if (!QuicVersionUsesCryptoFrames(framer_.version().transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009288 EXPECT_CALL(visitor, OnStreamFrame(Truly(ExpectedStreamFrame))).Times(1);
9289 } else {
9290 EXPECT_CALL(visitor, OnCryptoFrame(_)).Times(1);
9291 }
9292 EXPECT_CALL(visitor, OnPacketComplete()).Times(1);
9293
9294 EXPECT_TRUE(framer_.ProcessPacket(*packet));
bncf6f82b12019-10-30 07:01:01 -07009295 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05009296}
9297
9298// Verify that the packet returned by ConstructMisFramedEncryptedPacket()
9299// does cause the framer to return an error.
9300TEST_P(QuicFramerTest, ConstructMisFramedEncryptedPacket) {
9301 // Since we are using ConstructEncryptedPacket, we have to set the framer's
9302 // crypto to be Null.
zhongyi546cc452019-04-12 15:27:49 -07009303 if (framer_.version().KnowsWhichDecrypterToUse()) {
nharper9bb83462019-05-01 10:53:22 -07009304 framer_.InstallDecrypter(
9305 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -07009306 std::make_unique<NullDecrypter>(framer_.perspective()));
zhongyi546cc452019-04-12 15:27:49 -07009307 } else {
vasilvv0fc587f2019-09-06 13:33:08 -07009308 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
9309 framer_.perspective()));
zhongyi546cc452019-04-12 15:27:49 -07009310 }
QUICHE team6987b4a2019-03-15 16:23:04 -07009311 framer_.SetEncrypter(ENCRYPTION_INITIAL,
vasilvv0fc587f2019-09-06 13:33:08 -07009312 std::make_unique<NullEncrypter>(framer_.perspective()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05009313 std::unique_ptr<QuicEncryptedPacket> packet(ConstructMisFramedEncryptedPacket(
9314 TestConnectionId(), EmptyQuicConnectionId(), false, false,
9315 kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
bnc9711a9e2019-11-01 06:31:51 -07009316 CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, framer_.version(),
QUICHE teama6ef0a62019-03-07 20:34:33 -05009317 Perspective::IS_CLIENT));
9318
9319 MockFramerVisitor visitor;
9320 framer_.set_visitor(&visitor);
9321 EXPECT_CALL(visitor, OnPacket()).Times(1);
9322 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
9323 .Times(1)
9324 .WillOnce(Return(true));
9325 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
9326 .Times(1)
9327 .WillOnce(Return(true));
9328 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1);
9329 EXPECT_CALL(visitor, OnDecryptedPacket(_)).Times(1);
9330 EXPECT_CALL(visitor, OnError(_)).Times(1);
9331 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
9332 EXPECT_CALL(visitor, OnPacketComplete()).Times(0);
9333
9334 EXPECT_FALSE(framer_.ProcessPacket(*packet));
bncf6f82b12019-10-30 07:01:01 -07009335 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
QUICHE teama6ef0a62019-03-07 20:34:33 -05009336}
9337
QUICHE teama6ef0a62019-03-07 20:34:33 -05009338TEST_P(QuicFramerTest, IetfBlockedFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009339 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009340 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009341 return;
9342 }
zhongyi546cc452019-04-12 15:27:49 -07009343 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009344
9345 // clang-format off
9346 PacketFragments packet99 = {
9347 // type (short header, 4 byte packet number)
9348 {"",
9349 {0x43}},
9350 // connection_id
9351 {"",
9352 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9353 // packet number
9354 {"",
9355 {0x12, 0x34, 0x9A, 0xBC}},
9356 // frame type (IETF_BLOCKED)
9357 {"",
9358 {0x14}},
9359 // blocked offset
9360 {"Can not read blocked offset.",
9361 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
9362 };
9363 // clang-format on
9364
9365 std::unique_ptr<QuicEncryptedPacket> encrypted(
9366 AssemblePacketFromFragments(packet99));
9367 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9368
bncf6f82b12019-10-30 07:01:01 -07009369 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05009370 ASSERT_TRUE(visitor_.header_.get());
9371 EXPECT_TRUE(CheckDecryption(
9372 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9373 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9374
9375 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
9376
9377 CheckFramingBoundaries(packet99, QUIC_INVALID_BLOCKED_DATA);
9378}
9379
9380TEST_P(QuicFramerTest, BuildIetfBlockedPacket) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009381 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009382 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009383 return;
9384 }
9385
9386 QuicPacketHeader header;
9387 header.destination_connection_id = FramerTestConnectionId();
9388 header.reset_flag = false;
9389 header.version_flag = false;
9390 header.packet_number = kPacketNumber;
9391
9392 QuicBlockedFrame frame;
9393 frame.stream_id = QuicUtils::GetInvalidStreamId(framer_.transport_version());
9394 frame.offset = kStreamOffset;
9395 QuicFrames frames = {QuicFrame(&frame)};
9396
9397 // clang-format off
9398 unsigned char packet99[] = {
9399 // type (short header, 4 byte packet number)
9400 0x43,
9401 // connection_id
9402 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9403 // packet number
9404 0x12, 0x34, 0x56, 0x78,
9405
9406 // frame type (IETF_BLOCKED)
9407 0x14,
9408 // Offset
9409 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
9410 };
9411 // clang-format on
9412
9413 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9414 ASSERT_TRUE(data != nullptr);
9415
9416 test::CompareCharArraysWithHexError("constructed packet", data->data(),
9417 data->length(), AsChars(packet99),
9418 QUIC_ARRAYSIZE(packet99));
9419}
9420
9421TEST_P(QuicFramerTest, IetfStreamBlockedFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009422 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009423 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009424 return;
9425 }
zhongyi546cc452019-04-12 15:27:49 -07009426 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009427
9428 // clang-format off
9429 PacketFragments packet99 = {
9430 // type (short header, 4 byte packet number)
9431 {"",
9432 {0x43}},
9433 // connection_id
9434 {"",
9435 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9436 // packet number
9437 {"",
9438 {0x12, 0x34, 0x9A, 0xBC}},
9439 // frame type (IETF_STREAM_BLOCKED)
9440 {"",
9441 {0x15}},
9442 // blocked offset
9443 {"Can not read stream blocked stream id.",
9444 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
9445 {"Can not read stream blocked offset.",
9446 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
9447 };
9448 // clang-format on
9449
9450 std::unique_ptr<QuicEncryptedPacket> encrypted(
9451 AssemblePacketFromFragments(packet99));
9452 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9453
bncf6f82b12019-10-30 07:01:01 -07009454 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05009455 ASSERT_TRUE(visitor_.header_.get());
9456 EXPECT_TRUE(CheckDecryption(
9457 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9458 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9459
9460 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
9461 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
9462
9463 CheckFramingBoundaries(packet99, QUIC_INVALID_STREAM_BLOCKED_DATA);
9464}
9465
9466TEST_P(QuicFramerTest, BuildIetfStreamBlockedPacket) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009467 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009468 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009469 return;
9470 }
9471
9472 QuicPacketHeader header;
9473 header.destination_connection_id = FramerTestConnectionId();
9474 header.reset_flag = false;
9475 header.version_flag = false;
9476 header.packet_number = kPacketNumber;
9477
9478 QuicBlockedFrame frame;
9479 frame.stream_id = kStreamId;
9480 frame.offset = kStreamOffset;
9481 QuicFrames frames = {QuicFrame(&frame)};
9482
9483 // clang-format off
9484 unsigned char packet99[] = {
9485 // type (short header, 4 byte packet number)
9486 0x43,
9487 // connection_id
9488 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9489 // packet number
9490 0x12, 0x34, 0x56, 0x78,
9491
9492 // frame type (IETF_STREAM_BLOCKED)
9493 0x15,
9494 // Stream ID
9495 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
9496 // Offset
9497 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
9498 };
9499 // clang-format on
9500
9501 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9502 ASSERT_TRUE(data != nullptr);
9503
9504 test::CompareCharArraysWithHexError("constructed packet", data->data(),
9505 data->length(), AsChars(packet99),
9506 QUIC_ARRAYSIZE(packet99));
9507}
9508
fkastenholz3c4eabf2019-04-22 07:49:59 -07009509TEST_P(QuicFramerTest, BiDiMaxStreamsFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009510 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009511 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009512 return;
9513 }
zhongyi546cc452019-04-12 15:27:49 -07009514 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009515
9516 // clang-format off
9517 PacketFragments packet99 = {
9518 // type (short header, 4 byte packet number)
9519 {"",
9520 {0x43}},
9521 // connection_id
9522 {"",
9523 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9524 // packet number
9525 {"",
9526 {0x12, 0x34, 0x9A, 0xBC}},
9527 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9528 {"",
9529 {0x12}},
9530 // max. streams
9531 {"Can not read MAX_STREAMS stream count.",
9532 {kVarInt62OneByte + 0x03}},
9533 };
9534 // clang-format on
9535
9536 std::unique_ptr<QuicEncryptedPacket> encrypted(
9537 AssemblePacketFromFragments(packet99));
9538 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9539
bncf6f82b12019-10-30 07:01:01 -07009540 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05009541 ASSERT_TRUE(visitor_.header_.get());
9542 EXPECT_TRUE(CheckDecryption(
9543 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9544 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9545
fkastenholz3c4eabf2019-04-22 07:49:59 -07009546 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9547 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
9548 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009549}
9550
fkastenholz3c4eabf2019-04-22 07:49:59 -07009551TEST_P(QuicFramerTest, UniDiMaxStreamsFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009552 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009553 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009554 return;
9555 }
zhongyi546cc452019-04-12 15:27:49 -07009556 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009557
9558 // clang-format off
9559 PacketFragments packet99 = {
9560 // type (short header, 4 byte packet number)
9561 {"",
9562 {0x43}},
9563 // Test runs in client mode, no connection id
9564 // packet number
9565 {"",
9566 {0x12, 0x34, 0x9A, 0xBC}},
fkastenholz3c4eabf2019-04-22 07:49:59 -07009567 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
QUICHE teama6ef0a62019-03-07 20:34:33 -05009568 {"",
fkastenholz3c4eabf2019-04-22 07:49:59 -07009569 {0x13}},
QUICHE teama6ef0a62019-03-07 20:34:33 -05009570 // max. streams
9571 {"Can not read MAX_STREAMS stream count.",
9572 {kVarInt62OneByte + 0x03}},
9573 };
9574 // clang-format on
9575
9576 std::unique_ptr<QuicEncryptedPacket> encrypted(
9577 AssemblePacketFromFragments(packet99));
9578 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9579 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9580
bncf6f82b12019-10-30 07:01:01 -07009581 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05009582 ASSERT_TRUE(visitor_.header_.get());
9583 EXPECT_TRUE(CheckDecryption(
9584 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9585 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9586
fkastenholz3c4eabf2019-04-22 07:49:59 -07009587 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9588 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9589 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009590}
9591
9592TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009593 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009594 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009595 return;
9596 }
zhongyi546cc452019-04-12 15:27:49 -07009597 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009598
9599 // clang-format off
9600 PacketFragments packet99 = {
9601 // type (short header, 4 byte packet number)
9602 {"",
9603 {0x43}},
9604 // connection_id
9605 {"",
9606 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9607 // packet number
9608 {"",
9609 {0x12, 0x34, 0x9A, 0xBC}},
9610 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9611 {"",
9612 {0x13}},
9613 // max. streams
9614 {"Can not read MAX_STREAMS stream count.",
9615 {kVarInt62OneByte + 0x03}},
9616 };
9617 // clang-format on
9618
9619 std::unique_ptr<QuicEncryptedPacket> encrypted(
9620 AssemblePacketFromFragments(packet99));
9621 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9622
bncf6f82b12019-10-30 07:01:01 -07009623 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05009624 ASSERT_TRUE(visitor_.header_.get());
9625 EXPECT_TRUE(CheckDecryption(
9626 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9627 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9628
fkastenholz3c4eabf2019-04-22 07:49:59 -07009629 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9630 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9631 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009632}
9633
9634TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009635 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009636 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009637 return;
9638 }
zhongyi546cc452019-04-12 15:27:49 -07009639 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009640
9641 // clang-format off
9642 PacketFragments packet99 = {
9643 // type (short header, 4 byte packet number)
9644 {"",
9645 {0x43}},
9646 // Test runs in client mode, no connection id
9647 // packet number
9648 {"",
9649 {0x12, 0x34, 0x9A, 0xBC}},
9650 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9651 {"",
9652 {0x13}},
9653 // max. streams
9654 {"Can not read MAX_STREAMS stream count.",
9655 {kVarInt62OneByte + 0x03}},
9656 };
9657 // clang-format on
9658
9659 std::unique_ptr<QuicEncryptedPacket> encrypted(
9660 AssemblePacketFromFragments(packet99));
9661 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9662 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9663
bncf6f82b12019-10-30 07:01:01 -07009664 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05009665 ASSERT_TRUE(visitor_.header_.get());
9666 EXPECT_TRUE(CheckDecryption(
9667 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9668 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9669
fkastenholz3c4eabf2019-04-22 07:49:59 -07009670 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9671 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9672 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009673}
9674
9675// The following four tests ensure that the framer can deserialize a stream
9676// count that is large enough to cause the resulting stream ID to exceed the
9677// current implementation limit(32 bits). The intent is that when this happens,
9678// the stream limit is pegged to the maximum supported value. There are four
9679// tests, for the four combinations of uni- and bi-directional, server- and
9680// client- initiated.
fkastenholz3c4eabf2019-04-22 07:49:59 -07009681TEST_P(QuicFramerTest, BiDiMaxStreamsFrameTooBig) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009682 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009683 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009684 return;
9685 }
zhongyi546cc452019-04-12 15:27:49 -07009686 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009687
9688 // clang-format off
9689 unsigned char packet99[] = {
9690 // type (short header, 4 byte packet number)
9691 0x43,
9692 // connection_id
9693 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9694 // packet number
9695 0x12, 0x34, 0x9A, 0xBC,
9696 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9697 0x12,
9698
9699 // max. streams. Max stream ID allowed is 0xffffffff
9700 // This encodes a count of 0x40000000, leading to stream
9701 // IDs in the range 0x1 00000000 to 0x1 00000003.
9702 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9703 };
9704 // clang-format on
9705
9706 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
9707 false);
9708 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07009709 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05009710 ASSERT_TRUE(visitor_.header_.get());
9711 EXPECT_TRUE(CheckDecryption(
9712 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9713 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9714
fkastenholz465220f2019-04-23 07:56:27 -07009715 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -07009716 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009717}
9718
9719TEST_P(QuicFramerTest, ClientBiDiMaxStreamsFrameTooBig) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009720 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009721 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009722 return;
9723 }
zhongyi546cc452019-04-12 15:27:49 -07009724 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009725
9726 // clang-format off
9727 unsigned char packet99[] = {
9728 // type (short header, 4 byte packet number)
9729 0x43,
9730 // Test runs in client mode, no connection id
9731 // packet number
9732 0x12, 0x34, 0x9A, 0xBC,
9733 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9734 0x12,
9735
9736 // max. streams. Max stream ID allowed is 0xffffffff
9737 // This encodes a count of 0x40000000, leading to stream
9738 // IDs in the range 0x1 00000000 to 0x1 00000003.
9739 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9740 };
9741 // clang-format on
9742
9743 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
9744 false);
9745 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9746 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9747
bncf6f82b12019-10-30 07:01:01 -07009748 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05009749 ASSERT_TRUE(visitor_.header_.get());
9750 EXPECT_TRUE(CheckDecryption(
9751 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9752 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9753
fkastenholz465220f2019-04-23 07:56:27 -07009754 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -07009755 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009756}
9757
9758TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrameTooBig) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009759 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009760 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009761 return;
9762 }
zhongyi546cc452019-04-12 15:27:49 -07009763 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009764
9765 // clang-format off
9766 unsigned char packet99[] = {
9767 // type (short header, 4 byte packet number)
9768 0x43,
9769 // connection_id
9770 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9771 // packet number
9772 0x12, 0x34, 0x9A, 0xBC,
9773 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9774 0x13,
9775
9776 // max. streams. Max stream ID allowed is 0xffffffff
9777 // This encodes a count of 0x40000000, leading to stream
9778 // IDs in the range 0x1 00000000 to 0x1 00000003.
9779 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9780 };
9781 // clang-format on
9782
9783 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
9784 false);
9785 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9786
bncf6f82b12019-10-30 07:01:01 -07009787 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05009788 ASSERT_TRUE(visitor_.header_.get());
9789 EXPECT_TRUE(CheckDecryption(
9790 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9791 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9792
fkastenholz465220f2019-04-23 07:56:27 -07009793 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -07009794 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009795}
9796
9797TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrameTooBig) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009798 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009799 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009800 return;
9801 }
zhongyi546cc452019-04-12 15:27:49 -07009802 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009803
9804 // clang-format off
9805 unsigned char packet99[] = {
9806 // type (short header, 4 byte packet number)
9807 0x43,
9808 // Test runs in client mode, no connection id
9809 // packet number
9810 0x12, 0x34, 0x9A, 0xBC,
9811 // frame type (IETF_MAX_STREAMS_UNDIRECTIONAL)
9812 0x13,
9813
9814 // max. streams. Max stream ID allowed is 0xffffffff
9815 // This encodes a count of 0x40000000, leading to stream
9816 // IDs in the range 0x1 00000000 to 0x1 00000003.
9817 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9818 };
9819 // clang-format on
9820
9821 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
9822 false);
9823 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9824 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9825
bncf6f82b12019-10-30 07:01:01 -07009826 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05009827 ASSERT_TRUE(visitor_.header_.get());
9828 EXPECT_TRUE(CheckDecryption(
9829 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9830 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9831
fkastenholz465220f2019-04-23 07:56:27 -07009832 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -07009833 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009834}
9835
fkastenholz3c4eabf2019-04-22 07:49:59 -07009836// Specifically test that count==0 is accepted.
QUICHE teama6ef0a62019-03-07 20:34:33 -05009837TEST_P(QuicFramerTest, MaxStreamsFrameZeroCount) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009838 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009839 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009840 return;
9841 }
zhongyi546cc452019-04-12 15:27:49 -07009842 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009843
9844 // clang-format off
9845 unsigned char packet99[] = {
9846 // type (short header, 4 byte packet number)
9847 0x43,
9848 // connection_id
9849 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9850 // packet number
9851 0x12, 0x34, 0x9A, 0xBC,
9852 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9853 0x12,
9854 // max. streams == 0.
9855 kVarInt62OneByte + 0x00
9856 };
9857 // clang-format on
9858
9859 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
9860 false);
fkastenholz3c4eabf2019-04-22 07:49:59 -07009861 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
QUICHE teama6ef0a62019-03-07 20:34:33 -05009862}
9863
9864TEST_P(QuicFramerTest, ServerBiDiStreamsBlockedFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009865 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009866 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009867 return;
9868 }
zhongyi546cc452019-04-12 15:27:49 -07009869 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009870
9871 // clang-format off
9872 PacketFragments packet99 = {
9873 // type (short header, 4 byte packet number)
9874 {"",
9875 {0x43}},
9876 // connection_id
9877 {"",
9878 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9879 // packet number
9880 {"",
9881 {0x12, 0x34, 0x9A, 0xBC}},
fkastenholz3c4eabf2019-04-22 07:49:59 -07009882 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
9883 {"",
9884 {0x13}},
9885 // stream count
9886 {"Can not read MAX_STREAMS stream count.",
9887 {kVarInt62OneByte + 0x00}},
9888 };
9889 // clang-format on
9890
9891 std::unique_ptr<QuicEncryptedPacket> encrypted(
9892 AssemblePacketFromFragments(packet99));
9893 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9894
bncf6f82b12019-10-30 07:01:01 -07009895 EXPECT_THAT(framer_.error(), IsQuicNoError());
fkastenholz3c4eabf2019-04-22 07:49:59 -07009896 ASSERT_TRUE(visitor_.header_.get());
9897 EXPECT_TRUE(CheckDecryption(
9898 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9899 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9900
9901 EXPECT_EQ(0u, visitor_.max_streams_frame_.stream_count);
9902 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9903
9904 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
9905}
9906
9907TEST_P(QuicFramerTest, BiDiStreamsBlockedFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009908 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009909 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07009910 return;
9911 }
9912 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9913
9914 // clang-format off
9915 PacketFragments packet99 = {
9916 // type (short header, 4 byte packet number)
9917 {"",
9918 {0x43}},
9919 // connection_id
9920 {"",
9921 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9922 // packet number
9923 {"",
9924 {0x12, 0x34, 0x9A, 0xBC}},
QUICHE teama6ef0a62019-03-07 20:34:33 -05009925 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
9926 {"",
9927 {0x16}},
9928 // stream id
fkastenholz3c4eabf2019-04-22 07:49:59 -07009929 {"Can not read STREAMS_BLOCKED stream count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05009930 {kVarInt62OneByte + 0x03}},
9931 };
9932 // clang-format on
9933
9934 std::unique_ptr<QuicEncryptedPacket> encrypted(
9935 AssemblePacketFromFragments(packet99));
9936 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9937
bncf6f82b12019-10-30 07:01:01 -07009938 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05009939 ASSERT_TRUE(visitor_.header_.get());
9940 EXPECT_TRUE(CheckDecryption(
9941 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9942 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9943
fkastenholz3c4eabf2019-04-22 07:49:59 -07009944 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
9945 EXPECT_FALSE(visitor_.streams_blocked_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009946
fkastenholz3c4eabf2019-04-22 07:49:59 -07009947 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009948}
9949
fkastenholz3c4eabf2019-04-22 07:49:59 -07009950TEST_P(QuicFramerTest, UniDiStreamsBlockedFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009951 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009952 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009953 return;
9954 }
zhongyi546cc452019-04-12 15:27:49 -07009955 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009956
9957 // clang-format off
9958 PacketFragments packet99 = {
9959 // type (short header, 4 byte packet number)
9960 {"",
9961 {0x43}},
9962 // connection_id
9963 {"",
9964 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9965 // packet number
9966 {"",
9967 {0x12, 0x34, 0x9A, 0xBC}},
9968 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
9969 {"",
9970 {0x17}},
9971 // stream id
fkastenholz3c4eabf2019-04-22 07:49:59 -07009972 {"Can not read STREAMS_BLOCKED stream count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05009973 {kVarInt62OneByte + 0x03}},
9974 };
9975 // clang-format on
9976
9977 std::unique_ptr<QuicEncryptedPacket> encrypted(
9978 AssemblePacketFromFragments(packet99));
9979 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9980
bncf6f82b12019-10-30 07:01:01 -07009981 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05009982 ASSERT_TRUE(visitor_.header_.get());
9983 EXPECT_TRUE(CheckDecryption(
9984 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9985 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9986
fkastenholz3c4eabf2019-04-22 07:49:59 -07009987 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
9988 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
9989 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009990}
9991
9992TEST_P(QuicFramerTest, ClientUniDiStreamsBlockedFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009993 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009994 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009995 return;
9996 }
zhongyi546cc452019-04-12 15:27:49 -07009997 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009998
9999 // clang-format off
10000 PacketFragments packet99 = {
10001 // type (short header, 4 byte packet number)
10002 {"",
10003 {0x43}},
10004 // Test runs in client mode, no connection id
10005 // packet number
10006 {"",
10007 {0x12, 0x34, 0x9A, 0xBC}},
10008 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10009 {"",
10010 {0x17}},
10011 // stream id
fkastenholz3c4eabf2019-04-22 07:49:59 -070010012 {"Can not read STREAMS_BLOCKED stream count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010013 {kVarInt62OneByte + 0x03}},
10014 };
10015 // clang-format on
10016
10017 std::unique_ptr<QuicEncryptedPacket> encrypted(
10018 AssemblePacketFromFragments(packet99));
10019 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10020 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10021
bncf6f82b12019-10-30 07:01:01 -070010022 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010023 ASSERT_TRUE(visitor_.header_.get());
10024 EXPECT_TRUE(CheckDecryption(
10025 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10026 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10027
fkastenholz3c4eabf2019-04-22 07:49:59 -070010028 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
10029 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
10030 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010031}
10032
10033// Check that when we get a STREAMS_BLOCKED frame that specifies too large
10034// a stream count, we reject with an appropriate error. There is no need to
10035// check for different combinations of Uni/Bi directional and client/server
10036// initiated; the logic does not take these into account.
10037TEST_P(QuicFramerTest, StreamsBlockedFrameTooBig) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010038 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010039 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010040 return;
10041 }
zhongyi546cc452019-04-12 15:27:49 -070010042 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010043
10044 // clang-format off
10045 unsigned char packet99[] = {
10046 // type (short header, 4 byte packet number)
10047 0x43,
10048 // Test runs in client mode, no connection id
10049 // packet number
10050 0x12, 0x34, 0x9A, 0xBC,
10051 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL)
fkastenholz3c4eabf2019-04-22 07:49:59 -070010052 0x16,
QUICHE teama6ef0a62019-03-07 20:34:33 -050010053
10054 // max. streams. Max stream ID allowed is 0xffffffff
10055 // This encodes a count of 0x40000000, leading to stream
10056 // IDs in the range 0x1 00000000 to 0x1 00000003.
10057 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01
10058 };
10059 // clang-format on
10060
10061 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
10062 false);
10063 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10064 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
10065
bncf6f82b12019-10-30 07:01:01 -070010066 EXPECT_THAT(framer_.error(), IsError(QUIC_STREAMS_BLOCKED_DATA));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010067 EXPECT_EQ(framer_.detailed_error(),
10068 "STREAMS_BLOCKED stream count exceeds implementation limit.");
10069}
10070
fkastenholz3c4eabf2019-04-22 07:49:59 -070010071// Specifically test that count==0 is accepted.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010072TEST_P(QuicFramerTest, StreamsBlockedFrameZeroCount) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010073 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010074 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010075 return;
10076 }
fkastenholz3c4eabf2019-04-22 07:49:59 -070010077
zhongyi546cc452019-04-12 15:27:49 -070010078 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010079
10080 // clang-format off
fkastenholz3c4eabf2019-04-22 07:49:59 -070010081 PacketFragments packet99 = {
10082 // type (short header, 4 byte packet number)
10083 {"",
10084 {0x43}},
10085 // connection_id
10086 {"",
10087 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10088 // packet number
10089 {"",
10090 {0x12, 0x34, 0x9A, 0xBC}},
10091 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10092 {"",
10093 {0x17}},
10094 // stream id
10095 {"Can not read STREAMS_BLOCKED stream count.",
10096 {kVarInt62OneByte + 0x00}},
QUICHE teama6ef0a62019-03-07 20:34:33 -050010097 };
10098 // clang-format on
10099
fkastenholz3c4eabf2019-04-22 07:49:59 -070010100 std::unique_ptr<QuicEncryptedPacket> encrypted(
10101 AssemblePacketFromFragments(packet99));
10102 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010103
bncf6f82b12019-10-30 07:01:01 -070010104 EXPECT_THAT(framer_.error(), IsQuicNoError());
fkastenholz3c4eabf2019-04-22 07:49:59 -070010105 ASSERT_TRUE(visitor_.header_.get());
10106 EXPECT_TRUE(CheckDecryption(
10107 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10108 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10109
10110 EXPECT_EQ(0u, visitor_.streams_blocked_frame_.stream_count);
10111 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
10112
10113 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010114}
10115
fkastenholz3c4eabf2019-04-22 07:49:59 -070010116TEST_P(QuicFramerTest, BuildBiDiStreamsBlockedPacket) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010117 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010118 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010119 return;
10120 }
10121
10122 QuicPacketHeader header;
10123 header.destination_connection_id = FramerTestConnectionId();
10124 header.reset_flag = false;
10125 header.version_flag = false;
10126 header.packet_number = kPacketNumber;
10127
fkastenholz3c4eabf2019-04-22 07:49:59 -070010128 QuicStreamsBlockedFrame frame;
10129 frame.stream_count = 3;
10130 frame.unidirectional = false;
QUICHE teama6ef0a62019-03-07 20:34:33 -050010131
10132 QuicFrames frames = {QuicFrame(frame)};
10133
10134 // clang-format off
10135 unsigned char packet99[] = {
10136 // type (short header, 4 byte packet number)
10137 0x43,
10138 // connection_id
10139 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10140 // packet number
10141 0x12, 0x34, 0x56, 0x78,
10142
10143 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
10144 0x16,
10145 // Stream count
10146 kVarInt62OneByte + 0x03
10147 };
10148 // clang-format on
10149
10150 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10151 ASSERT_TRUE(data != nullptr);
10152
10153 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10154 data->length(), AsChars(packet99),
10155 QUIC_ARRAYSIZE(packet99));
10156}
10157
fkastenholz3c4eabf2019-04-22 07:49:59 -070010158TEST_P(QuicFramerTest, BuildUniStreamsBlockedPacket) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010159 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010160 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010161 return;
10162 }
10163
10164 QuicPacketHeader header;
10165 header.destination_connection_id = FramerTestConnectionId();
10166 header.reset_flag = false;
10167 header.version_flag = false;
10168 header.packet_number = kPacketNumber;
10169
fkastenholz3c4eabf2019-04-22 07:49:59 -070010170 QuicStreamsBlockedFrame frame;
10171 frame.stream_count = 3;
10172 frame.unidirectional = true;
10173
QUICHE teama6ef0a62019-03-07 20:34:33 -050010174 QuicFrames frames = {QuicFrame(frame)};
10175
10176 // clang-format off
10177 unsigned char packet99[] = {
10178 // type (short header, 4 byte packet number)
10179 0x43,
10180 // connection_id
10181 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10182 // packet number
10183 0x12, 0x34, 0x56, 0x78,
10184
10185 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10186 0x17,
10187 // Stream count
10188 kVarInt62OneByte + 0x03
10189 };
10190 // clang-format on
10191
10192 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10193 ASSERT_TRUE(data != nullptr);
10194
10195 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10196 data->length(), AsChars(packet99),
10197 QUIC_ARRAYSIZE(packet99));
10198}
10199
fkastenholz3c4eabf2019-04-22 07:49:59 -070010200TEST_P(QuicFramerTest, BuildBiDiMaxStreamsPacket) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010201 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010202 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010203 return;
10204 }
10205
10206 QuicPacketHeader header;
10207 header.destination_connection_id = FramerTestConnectionId();
10208 header.reset_flag = false;
10209 header.version_flag = false;
10210 header.packet_number = kPacketNumber;
10211
fkastenholz3c4eabf2019-04-22 07:49:59 -070010212 QuicMaxStreamsFrame frame;
10213 frame.stream_count = 3;
10214 frame.unidirectional = false;
10215
QUICHE teama6ef0a62019-03-07 20:34:33 -050010216 QuicFrames frames = {QuicFrame(frame)};
10217
10218 // clang-format off
10219 unsigned char packet99[] = {
10220 // type (short header, 4 byte packet number)
10221 0x43,
10222 // connection_id
10223 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10224 // packet number
10225 0x12, 0x34, 0x56, 0x78,
10226
10227 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL frame)
10228 0x12,
10229 // Stream count
10230 kVarInt62OneByte + 0x03
10231 };
10232 // clang-format on
10233
10234 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10235 ASSERT_TRUE(data != nullptr);
10236
10237 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10238 data->length(), AsChars(packet99),
10239 QUIC_ARRAYSIZE(packet99));
10240}
10241
fkastenholz3c4eabf2019-04-22 07:49:59 -070010242TEST_P(QuicFramerTest, BuildUniDiMaxStreamsPacket) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010243 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010244 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010245 return;
10246 }
10247
10248 // This test runs in client mode.
10249 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10250
10251 QuicPacketHeader header;
10252 header.destination_connection_id = FramerTestConnectionId();
10253 header.reset_flag = false;
10254 header.version_flag = false;
10255 header.packet_number = kPacketNumber;
10256
fkastenholz3c4eabf2019-04-22 07:49:59 -070010257 QuicMaxStreamsFrame frame;
10258 frame.stream_count = 3;
10259 frame.unidirectional = true;
QUICHE teama6ef0a62019-03-07 20:34:33 -050010260
QUICHE teama6ef0a62019-03-07 20:34:33 -050010261 QuicFrames frames = {QuicFrame(frame)};
10262
10263 // clang-format off
10264 unsigned char packet99[] = {
10265 // type (short header, 4 byte packet number)
10266 0x43,
10267 // connection_id
10268 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10269 // packet number
10270 0x12, 0x34, 0x56, 0x78,
10271
10272 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
10273 0x13,
10274 // Stream count
10275 kVarInt62OneByte + 0x03
10276 };
10277 // clang-format on
10278
10279 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10280 ASSERT_TRUE(data != nullptr);
10281
10282 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10283 data->length(), AsChars(packet99),
10284 QUIC_ARRAYSIZE(packet99));
10285}
10286
10287TEST_P(QuicFramerTest, NewConnectionIdFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070010288 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010289 // This frame is only for IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010290 return;
10291 }
zhongyi546cc452019-04-12 15:27:49 -070010292 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010293 // clang-format off
10294 PacketFragments packet99 = {
10295 // type (short header, 4 byte packet number)
10296 {"",
10297 {0x43}},
10298 // connection_id
10299 {"",
10300 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10301 // packet number
10302 {"",
10303 {0x12, 0x34, 0x56, 0x78}},
10304 // frame type (IETF_NEW_CONNECTION_ID frame)
10305 {"",
10306 {0x18}},
10307 // error code
10308 {"Unable to read new connection ID frame sequence number.",
10309 {kVarInt62OneByte + 0x11}},
fkastenholz1c19fc22019-07-12 11:06:19 -070010310 {"Unable to read new connection ID frame retire_prior_to.",
10311 {kVarInt62OneByte + 0x09}},
dschinazicf5b1e22019-07-17 18:35:17 -070010312 {"Unable to read new connection ID frame connection id.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010313 {0x08}}, // connection ID length
10314 {"Unable to read new connection ID frame connection id.",
10315 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11}},
10316 {"Can not read new connection ID frame reset token.",
10317 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10319 };
10320 // clang-format on
10321
10322 std::unique_ptr<QuicEncryptedPacket> encrypted(
10323 AssemblePacketFromFragments(packet99));
10324 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10325
bncf6f82b12019-10-30 07:01:01 -070010326 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010327 ASSERT_TRUE(visitor_.header_.get());
10328 EXPECT_TRUE(CheckDecryption(
10329 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10330 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10331
10332 EXPECT_EQ(0u, visitor_.stream_frames_.size());
10333
10334 EXPECT_EQ(FramerTestConnectionIdPlusOne(),
10335 visitor_.new_connection_id_.connection_id);
10336 EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
fkastenholz1c19fc22019-07-12 11:06:19 -070010337 EXPECT_EQ(0x09u, visitor_.new_connection_id_.retire_prior_to);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010338 EXPECT_EQ(kTestStatelessResetToken,
10339 visitor_.new_connection_id_.stateless_reset_token);
10340
10341 ASSERT_EQ(0u, visitor_.ack_frames_.size());
10342
10343 CheckFramingBoundaries(packet99, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
10344}
10345
QUICHE team8e2e4532019-03-14 14:37:56 -070010346TEST_P(QuicFramerTest, NewConnectionIdFrameVariableLength) {
fkastenholz305e1732019-06-18 05:01:22 -070010347 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010348 // This frame is only for IETF QUIC.
QUICHE team8e2e4532019-03-14 14:37:56 -070010349 return;
10350 }
zhongyi546cc452019-04-12 15:27:49 -070010351 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE team8e2e4532019-03-14 14:37:56 -070010352 // clang-format off
10353 PacketFragments packet99 = {
10354 // type (short header, 4 byte packet number)
10355 {"",
10356 {0x43}},
10357 // connection_id
10358 {"",
10359 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10360 // packet number
10361 {"",
10362 {0x12, 0x34, 0x56, 0x78}},
10363 // frame type (IETF_NEW_CONNECTION_ID frame)
10364 {"",
10365 {0x18}},
10366 // error code
10367 {"Unable to read new connection ID frame sequence number.",
10368 {kVarInt62OneByte + 0x11}},
fkastenholz1c19fc22019-07-12 11:06:19 -070010369 {"Unable to read new connection ID frame retire_prior_to.",
10370 {kVarInt62OneByte + 0x0a}},
dschinazicf5b1e22019-07-17 18:35:17 -070010371 {"Unable to read new connection ID frame connection id.",
QUICHE team8e2e4532019-03-14 14:37:56 -070010372 {0x09}}, // connection ID length
10373 {"Unable to read new connection ID frame connection id.",
10374 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
10375 {"Can not read new connection ID frame reset token.",
10376 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10378 };
10379 // clang-format on
10380
10381 std::unique_ptr<QuicEncryptedPacket> encrypted(
10382 AssemblePacketFromFragments(packet99));
10383 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10384
bncf6f82b12019-10-30 07:01:01 -070010385 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE team8e2e4532019-03-14 14:37:56 -070010386 ASSERT_TRUE(visitor_.header_.get());
10387 EXPECT_TRUE(CheckDecryption(
10388 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10389 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10390
10391 EXPECT_EQ(0u, visitor_.stream_frames_.size());
10392
10393 EXPECT_EQ(FramerTestConnectionIdNineBytes(),
10394 visitor_.new_connection_id_.connection_id);
10395 EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
fkastenholz1c19fc22019-07-12 11:06:19 -070010396 EXPECT_EQ(0x0au, visitor_.new_connection_id_.retire_prior_to);
QUICHE team8e2e4532019-03-14 14:37:56 -070010397 EXPECT_EQ(kTestStatelessResetToken,
10398 visitor_.new_connection_id_.stateless_reset_token);
10399
10400 ASSERT_EQ(0u, visitor_.ack_frames_.size());
10401
10402 CheckFramingBoundaries(packet99, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
10403}
10404
QUICHE team0131a5b2019-03-20 15:23:27 -070010405// Verifies that parsing a NEW_CONNECTION_ID frame with a length above the
10406// specified maximum fails.
10407TEST_P(QuicFramerTest, InvalidLongNewConnectionIdFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070010408 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010409 // The NEW_CONNECTION_ID frame is only for IETF QUIC.
QUICHE team0131a5b2019-03-20 15:23:27 -070010410 return;
10411 }
zhongyi546cc452019-04-12 15:27:49 -070010412 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE team0131a5b2019-03-20 15:23:27 -070010413 // clang-format off
10414 PacketFragments packet99 = {
10415 // type (short header, 4 byte packet number)
10416 {"",
10417 {0x43}},
10418 // connection_id
10419 {"",
10420 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10421 // packet number
10422 {"",
10423 {0x12, 0x34, 0x56, 0x78}},
10424 // frame type (IETF_NEW_CONNECTION_ID frame)
10425 {"",
10426 {0x18}},
10427 // error code
10428 {"Unable to read new connection ID frame sequence number.",
10429 {kVarInt62OneByte + 0x11}},
fkastenholz1c19fc22019-07-12 11:06:19 -070010430 {"Unable to read new connection ID frame retire_prior_to.",
10431 {kVarInt62OneByte + 0x0b}},
dschinazicf5b1e22019-07-17 18:35:17 -070010432 {"Unable to read new connection ID frame connection id.",
dschinazib953d022019-08-01 18:05:58 -070010433 {0x40}}, // connection ID length
QUICHE team0131a5b2019-03-20 15:23:27 -070010434 {"Unable to read new connection ID frame connection id.",
10435 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10436 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
dschinazib953d022019-08-01 18:05:58 -070010437 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10438 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10439 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10440 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10441 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10442 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E}},
QUICHE team0131a5b2019-03-20 15:23:27 -070010443 {"Can not read new connection ID frame reset token.",
10444 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10445 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10446 };
10447 // clang-format on
10448
10449 std::unique_ptr<QuicEncryptedPacket> encrypted(
10450 AssemblePacketFromFragments(packet99));
10451 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -070010452 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_NEW_CONNECTION_ID_DATA));
dschinazicf5b1e22019-07-17 18:35:17 -070010453 EXPECT_EQ("Unable to read new connection ID frame connection id.",
10454 framer_.detailed_error());
QUICHE team0131a5b2019-03-20 15:23:27 -070010455}
10456
fkastenholz1c19fc22019-07-12 11:06:19 -070010457// Verifies that parsing a NEW_CONNECTION_ID frame with an invalid
10458// retire-prior-to fails.
10459TEST_P(QuicFramerTest, InvalidRetirePriorToNewConnectionIdFrame) {
10460 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010461 // This frame is only for IETF QUIC only.
fkastenholz1c19fc22019-07-12 11:06:19 -070010462 return;
10463 }
10464 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10465 // clang-format off
10466 PacketFragments packet99 = {
10467 // type (short header, 4 byte packet number)
10468 {"",
10469 {0x43}},
10470 // connection_id
10471 {"",
10472 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10473 // packet number
10474 {"",
10475 {0x12, 0x34, 0x56, 0x78}},
10476 // frame type (IETF_NEW_CONNECTION_ID frame)
10477 {"",
10478 {0x18}},
10479 // sequence number
10480 {"Unable to read new connection ID frame sequence number.",
10481 {kVarInt62OneByte + 0x11}},
10482 {"Unable to read new connection ID frame retire_prior_to.",
10483 {kVarInt62OneByte + 0x1b}},
10484 {"Unable to read new connection ID frame connection id length.",
10485 {0x08}}, // connection ID length
10486 {"Unable to read new connection ID frame connection id.",
10487 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11}},
10488 {"Can not read new connection ID frame reset token.",
10489 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10490 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10491 };
10492 // clang-format on
10493
10494 std::unique_ptr<QuicEncryptedPacket> encrypted(
10495 AssemblePacketFromFragments(packet99));
10496 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -070010497 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_NEW_CONNECTION_ID_DATA));
fkastenholz1c19fc22019-07-12 11:06:19 -070010498 EXPECT_EQ("Retire_prior_to > sequence_number.", framer_.detailed_error());
10499}
10500
QUICHE teama6ef0a62019-03-07 20:34:33 -050010501TEST_P(QuicFramerTest, BuildNewConnectionIdFramePacket) {
fkastenholz305e1732019-06-18 05:01:22 -070010502 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010503 // This frame is only for IETF QUIC only.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010504 return;
10505 }
QUICHE team2252b702019-05-14 23:55:14 -040010506 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010507 QuicPacketHeader header;
10508 header.destination_connection_id = FramerTestConnectionId();
10509 header.reset_flag = false;
10510 header.version_flag = false;
10511 header.packet_number = kPacketNumber;
10512
10513 QuicNewConnectionIdFrame frame;
10514 frame.sequence_number = 0x11;
fkastenholz1c19fc22019-07-12 11:06:19 -070010515 frame.retire_prior_to = 0x0c;
QUICHE teama6ef0a62019-03-07 20:34:33 -050010516 // Use this value to force a 4-byte encoded variable length connection ID
10517 // in the frame.
10518 frame.connection_id = FramerTestConnectionIdPlusOne();
10519 frame.stateless_reset_token = kTestStatelessResetToken;
10520
10521 QuicFrames frames = {QuicFrame(&frame)};
10522
10523 // clang-format off
10524 unsigned char packet99[] = {
10525 // type (short header, 4 byte packet number)
10526 0x43,
10527 // connection_id
10528 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10529 // packet number
10530 0x12, 0x34, 0x56, 0x78,
10531
10532 // frame type (IETF_NEW_CONNECTION_ID frame)
10533 0x18,
10534 // sequence number
10535 kVarInt62OneByte + 0x11,
fkastenholz1c19fc22019-07-12 11:06:19 -070010536 // retire_prior_to
10537 kVarInt62OneByte + 0x0c,
QUICHE teama6ef0a62019-03-07 20:34:33 -050010538 // new connection id length
10539 0x08,
10540 // new connection id
10541 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
10542 // stateless reset token
10543 0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10544 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10545 };
10546 // clang-format on
10547
10548 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10549 ASSERT_TRUE(data != nullptr);
10550
10551 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10552 data->length(), AsChars(packet99),
10553 QUIC_ARRAYSIZE(packet99));
10554}
10555
10556TEST_P(QuicFramerTest, NewTokenFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070010557 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010558 // This frame is only for IETF QUIC only.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010559 return;
10560 }
zhongyi546cc452019-04-12 15:27:49 -070010561 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010562 // clang-format off
10563 PacketFragments packet = {
10564 // type (short header, 4 byte packet number)
10565 {"",
10566 {0x43}},
10567 // connection_id
10568 {"",
10569 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10570 // packet number
10571 {"",
10572 {0x12, 0x34, 0x56, 0x78}},
10573 // frame type (IETF_NEW_TOKEN frame)
10574 {"",
10575 {0x07}},
10576 // Length
10577 {"Unable to read new token length.",
10578 {kVarInt62OneByte + 0x08}},
10579 {"Unable to read new token data.",
10580 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}}
10581 };
10582 // clang-format on
10583 uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
10584 0x04, 0x05, 0x06, 0x07};
10585
10586 std::unique_ptr<QuicEncryptedPacket> encrypted(
10587 AssemblePacketFromFragments(packet));
10588 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10589
bncf6f82b12019-10-30 07:01:01 -070010590 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010591 ASSERT_TRUE(visitor_.header_.get());
10592 EXPECT_TRUE(CheckDecryption(
10593 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10594 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10595
10596 EXPECT_EQ(0u, visitor_.stream_frames_.size());
10597
10598 EXPECT_EQ(sizeof(expected_token_value), visitor_.new_token_.token.length());
10599 EXPECT_EQ(0, memcmp(expected_token_value, visitor_.new_token_.token.data(),
10600 sizeof(expected_token_value)));
10601
10602 CheckFramingBoundaries(packet, QUIC_INVALID_NEW_TOKEN);
10603}
10604
10605TEST_P(QuicFramerTest, BuildNewTokenFramePacket) {
fkastenholz305e1732019-06-18 05:01:22 -070010606 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010607 // This frame is only for IETF QUIC only.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010608 return;
10609 }
QUICHE team2252b702019-05-14 23:55:14 -040010610 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010611 QuicPacketHeader header;
10612 header.destination_connection_id = FramerTestConnectionId();
10613 header.reset_flag = false;
10614 header.version_flag = false;
10615 header.packet_number = kPacketNumber;
10616
10617 uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
10618 0x04, 0x05, 0x06, 0x07};
10619
vasilvvc48c8712019-03-11 13:38:16 -070010620 QuicNewTokenFrame frame(0, std::string((const char*)(expected_token_value),
10621 sizeof(expected_token_value)));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010622
10623 QuicFrames frames = {QuicFrame(&frame)};
10624
10625 // clang-format off
10626 unsigned char packet[] = {
10627 // type (short header, 4 byte packet number)
10628 0x43,
10629 // connection_id
10630 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10631 // packet number
10632 0x12, 0x34, 0x56, 0x78,
10633
10634 // frame type (IETF_NEW_TOKEN frame)
10635 0x07,
10636 // Length and token
10637 kVarInt62OneByte + 0x08,
10638 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
10639 };
10640 // clang-format on
10641
10642 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10643 ASSERT_TRUE(data != nullptr);
10644
10645 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10646 data->length(), AsChars(packet),
10647 QUIC_ARRAYSIZE(packet));
10648}
10649
10650TEST_P(QuicFramerTest, IetfStopSendingFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070010651 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010652 // Stop sending frame is IETF QUIC only.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010653 return;
10654 }
zhongyi546cc452019-04-12 15:27:49 -070010655 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010656
10657 // clang-format off
10658 PacketFragments packet99 = {
10659 // type (short header, 4 byte packet number)
10660 {"",
10661 {0x43}},
10662 // connection_id
10663 {"",
10664 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10665 // packet number
10666 {"",
10667 {0x12, 0x34, 0x9A, 0xBC}},
10668 // frame type (IETF_STOP_SENDING frame)
10669 {"",
10670 {0x05}},
10671 // stream id
10672 {"Unable to read stop sending stream id.",
10673 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
10674 {"Unable to read stop sending application error code.",
fkastenholz733552e2019-07-16 11:16:58 -070010675 {kVarInt62FourBytes + 0x00, 0x00, 0x76, 0x54}},
QUICHE teama6ef0a62019-03-07 20:34:33 -050010676 };
10677 // clang-format on
10678
10679 std::unique_ptr<QuicEncryptedPacket> encrypted(
10680 AssemblePacketFromFragments(packet99));
10681 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10682
bncf6f82b12019-10-30 07:01:01 -070010683 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010684 ASSERT_TRUE(visitor_.header_.get());
10685 EXPECT_TRUE(CheckDecryption(
10686 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10687 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10688
10689 EXPECT_EQ(kStreamId, visitor_.stop_sending_frame_.stream_id);
10690 EXPECT_EQ(0x7654, visitor_.stop_sending_frame_.application_error_code);
10691
10692 CheckFramingBoundaries(packet99, QUIC_INVALID_STOP_SENDING_FRAME_DATA);
10693}
10694
10695TEST_P(QuicFramerTest, BuildIetfStopSendingPacket) {
fkastenholz305e1732019-06-18 05:01:22 -070010696 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010697 // Stop sending frame is IETF QUIC only.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010698 return;
10699 }
10700
10701 QuicPacketHeader header;
10702 header.destination_connection_id = FramerTestConnectionId();
10703 header.reset_flag = false;
10704 header.version_flag = false;
10705 header.packet_number = kPacketNumber;
10706
10707 QuicStopSendingFrame frame;
10708 frame.stream_id = kStreamId;
10709 frame.application_error_code = 0xffff;
10710 QuicFrames frames = {QuicFrame(&frame)};
10711
10712 // clang-format off
10713 unsigned char packet99[] = {
10714 // type (short header, 4 byte packet number)
10715 0x43,
10716 // connection_id
10717 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10718 // packet number
10719 0x12, 0x34, 0x56, 0x78,
10720
10721 // frame type (IETF_STOP_SENDING frame)
10722 0x05,
10723 // Stream ID
10724 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
10725 // Application error code
fkastenholz733552e2019-07-16 11:16:58 -070010726 kVarInt62FourBytes + 0x00, 0x00, 0xff, 0xff
QUICHE teama6ef0a62019-03-07 20:34:33 -050010727 };
10728 // clang-format on
10729
10730 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10731 ASSERT_TRUE(data != nullptr);
10732
10733 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10734 data->length(), AsChars(packet99),
10735 QUIC_ARRAYSIZE(packet99));
10736}
10737
10738TEST_P(QuicFramerTest, IetfPathChallengeFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070010739 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010740 // Path Challenge frame is IETF QUIC only.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010741 return;
10742 }
zhongyi546cc452019-04-12 15:27:49 -070010743 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010744
10745 // clang-format off
10746 PacketFragments packet99 = {
10747 // type (short header, 4 byte packet number)
10748 {"",
10749 {0x43}},
10750 // connection_id
10751 {"",
10752 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10753 // packet number
10754 {"",
10755 {0x12, 0x34, 0x9A, 0xBC}},
10756 // frame type (IETF_PATH_CHALLENGE)
10757 {"",
10758 {0x1a}},
10759 // data
10760 {"Can not read path challenge data.",
10761 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
10762 };
10763 // clang-format on
10764
10765 std::unique_ptr<QuicEncryptedPacket> encrypted(
10766 AssemblePacketFromFragments(packet99));
10767 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10768
bncf6f82b12019-10-30 07:01:01 -070010769 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010770 ASSERT_TRUE(visitor_.header_.get());
10771 EXPECT_TRUE(CheckDecryption(
10772 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10773 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10774
10775 EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
10776 visitor_.path_challenge_frame_.data_buffer);
10777
10778 CheckFramingBoundaries(packet99, QUIC_INVALID_PATH_CHALLENGE_DATA);
10779}
10780
10781TEST_P(QuicFramerTest, BuildIetfPathChallengePacket) {
fkastenholz305e1732019-06-18 05:01:22 -070010782 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010783 // Path Challenge frame is IETF QUIC only.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010784 return;
10785 }
10786
10787 QuicPacketHeader header;
10788 header.destination_connection_id = FramerTestConnectionId();
10789 header.reset_flag = false;
10790 header.version_flag = false;
10791 header.packet_number = kPacketNumber;
10792
10793 QuicPathChallengeFrame frame;
10794 frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
10795 QuicFrames frames = {QuicFrame(&frame)};
10796
10797 // clang-format off
10798 unsigned char packet99[] = {
10799 // type (short header, 4 byte packet number)
10800 0x43,
10801 // connection_id
10802 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10803 // packet number
10804 0x12, 0x34, 0x56, 0x78,
10805
10806 // frame type (IETF_PATH_CHALLENGE)
10807 0x1a,
10808 // Data
10809 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
10810 };
10811 // clang-format on
10812
10813 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10814 ASSERT_TRUE(data != nullptr);
10815
10816 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10817 data->length(), AsChars(packet99),
10818 QUIC_ARRAYSIZE(packet99));
10819}
10820
10821TEST_P(QuicFramerTest, IetfPathResponseFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070010822 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010823 // Path response frame is IETF QUIC only.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010824 return;
10825 }
zhongyi546cc452019-04-12 15:27:49 -070010826 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010827
10828 // clang-format off
10829 PacketFragments packet99 = {
10830 // type (short header, 4 byte packet number)
10831 {"",
10832 {0x43}},
10833 // connection_id
10834 {"",
10835 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10836 // packet number
10837 {"",
10838 {0x12, 0x34, 0x9A, 0xBC}},
10839 // frame type (IETF_PATH_RESPONSE)
10840 {"",
10841 {0x1b}},
10842 // data
10843 {"Can not read path response data.",
10844 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
10845 };
10846 // clang-format on
10847
10848 std::unique_ptr<QuicEncryptedPacket> encrypted(
10849 AssemblePacketFromFragments(packet99));
10850 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10851
bncf6f82b12019-10-30 07:01:01 -070010852 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010853 ASSERT_TRUE(visitor_.header_.get());
10854 EXPECT_TRUE(CheckDecryption(
10855 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10856 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10857
10858 EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
10859 visitor_.path_response_frame_.data_buffer);
10860
10861 CheckFramingBoundaries(packet99, QUIC_INVALID_PATH_RESPONSE_DATA);
10862}
10863
10864TEST_P(QuicFramerTest, BuildIetfPathResponsePacket) {
fkastenholz305e1732019-06-18 05:01:22 -070010865 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010866 // Path response frame is IETF QUIC only
QUICHE teama6ef0a62019-03-07 20:34:33 -050010867 return;
10868 }
10869
10870 QuicPacketHeader header;
10871 header.destination_connection_id = FramerTestConnectionId();
10872 header.reset_flag = false;
10873 header.version_flag = false;
10874 header.packet_number = kPacketNumber;
10875
10876 QuicPathResponseFrame frame;
10877 frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
10878 QuicFrames frames = {QuicFrame(&frame)};
10879
10880 // clang-format off
10881 unsigned char packet99[] = {
10882 // type (short header, 4 byte packet number)
10883 0x43,
10884 // connection_id
10885 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10886 // packet number
10887 0x12, 0x34, 0x56, 0x78,
10888
10889 // frame type (IETF_PATH_RESPONSE)
10890 0x1b,
10891 // Data
10892 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
10893 };
10894 // clang-format on
10895
10896 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10897 ASSERT_TRUE(data != nullptr);
10898
10899 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10900 data->length(), AsChars(packet99),
10901 QUIC_ARRAYSIZE(packet99));
10902}
10903
10904TEST_P(QuicFramerTest, GetRetransmittableControlFrameSize) {
10905 QuicRstStreamFrame rst_stream(1, 3, QUIC_STREAM_CANCELLED, 1024);
10906 EXPECT_EQ(QuicFramer::GetRstStreamFrameSize(framer_.transport_version(),
10907 rst_stream),
10908 QuicFramer::GetRetransmittableControlFrameSize(
10909 framer_.transport_version(), QuicFrame(&rst_stream)));
10910
vasilvvc48c8712019-03-11 13:38:16 -070010911 std::string error_detail(2048, 'e');
wuba0cbbdc2019-09-09 06:40:59 -070010912 QuicConnectionCloseFrame connection_close(
10913 framer_.transport_version(), QUIC_NETWORK_IDLE_TIMEOUT, error_detail,
10914 /*transport_close_frame_type=*/0);
fkastenholz72f509b2019-04-10 09:17:49 -070010915
fkastenholza037b8b2019-05-07 06:00:05 -070010916 EXPECT_EQ(QuicFramer::GetConnectionCloseFrameSize(framer_.transport_version(),
10917 connection_close),
QUICHE teama6ef0a62019-03-07 20:34:33 -050010918 QuicFramer::GetRetransmittableControlFrameSize(
10919 framer_.transport_version(), QuicFrame(&connection_close)));
10920
10921 QuicGoAwayFrame goaway(2, QUIC_PEER_GOING_AWAY, 3, error_detail);
10922 EXPECT_EQ(QuicFramer::GetMinGoAwayFrameSize() + 256,
10923 QuicFramer::GetRetransmittableControlFrameSize(
10924 framer_.transport_version(), QuicFrame(&goaway)));
10925
10926 QuicWindowUpdateFrame window_update(3, 3, 1024);
10927 EXPECT_EQ(QuicFramer::GetWindowUpdateFrameSize(framer_.transport_version(),
10928 window_update),
10929 QuicFramer::GetRetransmittableControlFrameSize(
10930 framer_.transport_version(), QuicFrame(&window_update)));
10931
10932 QuicBlockedFrame blocked(4, 3, 1024);
10933 EXPECT_EQ(
10934 QuicFramer::GetBlockedFrameSize(framer_.transport_version(), blocked),
10935 QuicFramer::GetRetransmittableControlFrameSize(
10936 framer_.transport_version(), QuicFrame(&blocked)));
10937
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010938 // Following frames are IETF QUIC frames only.
fkastenholz305e1732019-06-18 05:01:22 -070010939 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010940 return;
10941 }
QUICHE teama6ef0a62019-03-07 20:34:33 -050010942
fkastenholz1c19fc22019-07-12 11:06:19 -070010943 QuicNewConnectionIdFrame new_connection_id(5, TestConnectionId(), 1, 101111,
10944 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010945 EXPECT_EQ(QuicFramer::GetNewConnectionIdFrameSize(new_connection_id),
10946 QuicFramer::GetRetransmittableControlFrameSize(
10947 framer_.transport_version(), QuicFrame(&new_connection_id)));
10948
fkastenholz3c4eabf2019-04-22 07:49:59 -070010949 QuicMaxStreamsFrame max_streams(6, 3, /*unidirectional=*/false);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010950 EXPECT_EQ(QuicFramer::GetMaxStreamsFrameSize(framer_.transport_version(),
fkastenholz3c4eabf2019-04-22 07:49:59 -070010951 max_streams),
QUICHE teama6ef0a62019-03-07 20:34:33 -050010952 QuicFramer::GetRetransmittableControlFrameSize(
fkastenholz3c4eabf2019-04-22 07:49:59 -070010953 framer_.transport_version(), QuicFrame(max_streams)));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010954
fkastenholz3c4eabf2019-04-22 07:49:59 -070010955 QuicStreamsBlockedFrame streams_blocked(7, 3, /*unidirectional=*/false);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010956 EXPECT_EQ(QuicFramer::GetStreamsBlockedFrameSize(framer_.transport_version(),
fkastenholz3c4eabf2019-04-22 07:49:59 -070010957 streams_blocked),
QUICHE teama6ef0a62019-03-07 20:34:33 -050010958 QuicFramer::GetRetransmittableControlFrameSize(
fkastenholz3c4eabf2019-04-22 07:49:59 -070010959 framer_.transport_version(), QuicFrame(streams_blocked)));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010960
10961 QuicPathFrameBuffer buffer = {
10962 {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
10963 QuicPathResponseFrame path_response_frame(8, buffer);
10964 EXPECT_EQ(QuicFramer::GetPathResponseFrameSize(path_response_frame),
10965 QuicFramer::GetRetransmittableControlFrameSize(
10966 framer_.transport_version(), QuicFrame(&path_response_frame)));
10967
10968 QuicPathChallengeFrame path_challenge_frame(9, buffer);
10969 EXPECT_EQ(QuicFramer::GetPathChallengeFrameSize(path_challenge_frame),
10970 QuicFramer::GetRetransmittableControlFrameSize(
10971 framer_.transport_version(), QuicFrame(&path_challenge_frame)));
10972
10973 QuicStopSendingFrame stop_sending_frame(10, 3, 20);
10974 EXPECT_EQ(QuicFramer::GetStopSendingFrameSize(stop_sending_frame),
10975 QuicFramer::GetRetransmittableControlFrameSize(
10976 framer_.transport_version(), QuicFrame(&stop_sending_frame)));
10977}
10978
10979// A set of tests to ensure that bad frame-type encodings
10980// are properly detected and handled.
10981// First, four tests to see that unknown frame types generate
10982// a QUIC_INVALID_FRAME_DATA error with detailed information
10983// "Illegal frame type." This regardless of the encoding of the type
10984// (1/2/4/8 bytes).
10985// This only for version 99.
10986TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown1Byte) {
fkastenholz305e1732019-06-18 05:01:22 -070010987 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010988 // Only IETF QUIC encodes frame types such that this test is relevant.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010989 return;
10990 }
zhongyi546cc452019-04-12 15:27:49 -070010991 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010992 // clang-format off
10993 PacketFragments packet = {
10994 // type (short header, 4 byte packet number)
10995 {"",
10996 {0x43}},
10997 // connection_id
10998 {"",
10999 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11000 // packet number
11001 {"",
11002 {0x12, 0x34, 0x9A, 0xBC}},
11003 // frame type (unknown value, single-byte encoding)
11004 {"",
11005 {0x38}}
11006 };
11007 // clang-format on
11008
11009 std::unique_ptr<QuicEncryptedPacket> encrypted(
11010 AssemblePacketFromFragments(packet));
11011
11012 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11013
bncf6f82b12019-10-30 07:01:01 -070011014 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011015 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11016}
11017
11018TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown2Bytes) {
fkastenholz305e1732019-06-18 05:01:22 -070011019 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011020 // Only IETF QUIC encodes frame types such that this test is relevant.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011021 return;
11022 }
zhongyi546cc452019-04-12 15:27:49 -070011023 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011024
11025 // clang-format off
11026 PacketFragments packet = {
11027 // type (short header, 4 byte packet number)
11028 {"",
11029 {0x43}},
11030 // connection_id
11031 {"",
11032 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11033 // packet number
11034 {"",
11035 {0x12, 0x34, 0x9A, 0xBC}},
11036 // frame type (unknown value, two-byte encoding)
11037 {"",
11038 {kVarInt62TwoBytes + 0x01, 0x38}}
11039 };
11040 // clang-format on
11041
11042 std::unique_ptr<QuicEncryptedPacket> encrypted(
11043 AssemblePacketFromFragments(packet));
11044
11045 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11046
bncf6f82b12019-10-30 07:01:01 -070011047 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011048 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11049}
11050
11051TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown4Bytes) {
fkastenholz305e1732019-06-18 05:01:22 -070011052 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011053 // Only IETF QUIC encodes frame types such that this test is relevant.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011054 return;
11055 }
zhongyi546cc452019-04-12 15:27:49 -070011056 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011057
11058 // clang-format off
11059 PacketFragments packet = {
11060 // type (short header, 4 byte packet number)
11061 {"",
11062 {0x43}},
11063 // connection_id
11064 {"",
11065 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11066 // packet number
11067 {"",
11068 {0x12, 0x34, 0x9A, 0xBC}},
11069 // frame type (unknown value, four-byte encoding)
11070 {"",
11071 {kVarInt62FourBytes + 0x01, 0x00, 0x00, 0x38}}
11072 };
11073 // clang-format on
11074
11075 std::unique_ptr<QuicEncryptedPacket> encrypted(
11076 AssemblePacketFromFragments(packet));
11077
11078 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11079
bncf6f82b12019-10-30 07:01:01 -070011080 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011081 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11082}
11083
11084TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown8Bytes) {
fkastenholz305e1732019-06-18 05:01:22 -070011085 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011086 // Only IETF QUIC encodes frame types such that this test is relevant.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011087 return;
11088 }
zhongyi546cc452019-04-12 15:27:49 -070011089 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011090 // clang-format off
11091 PacketFragments packet = {
11092 // type (short header, 4 byte packet number)
11093 {"",
11094 {0x43}},
11095 // connection_id
11096 {"",
11097 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11098 // packet number
11099 {"",
11100 {0x12, 0x34, 0x9A, 0xBC}},
11101 // frame type (unknown value, eight-byte encoding)
11102 {"",
11103 {kVarInt62EightBytes + 0x01, 0x00, 0x00, 0x01, 0x02, 0x34, 0x56, 0x38}}
11104 };
11105 // clang-format on
11106
11107 std::unique_ptr<QuicEncryptedPacket> encrypted(
11108 AssemblePacketFromFragments(packet));
11109
11110 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11111
bncf6f82b12019-10-30 07:01:01 -070011112 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011113 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11114}
11115
11116// Three tests to check that known frame types that are not minimally
11117// encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
11118// information "Frame type not minimally encoded."
11119// Look at the frame-type encoded in 2, 4, and 8 bytes.
11120TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2Bytes) {
fkastenholz305e1732019-06-18 05:01:22 -070011121 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011122 // Only IETF QUIC encodes frame types such that this test is relevant.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011123 return;
11124 }
zhongyi546cc452019-04-12 15:27:49 -070011125 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011126
11127 // clang-format off
11128 PacketFragments packet = {
11129 // type (short header, 4 byte packet number)
11130 {"",
11131 {0x43}},
11132 // connection_id
11133 {"",
11134 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11135 // packet number
11136 {"",
11137 {0x12, 0x34, 0x9A, 0xBC}},
11138 // frame type (Blocked, two-byte encoding)
11139 {"",
11140 {kVarInt62TwoBytes + 0x00, 0x08}}
11141 };
11142 // clang-format on
11143
11144 std::unique_ptr<QuicEncryptedPacket> encrypted(
11145 AssemblePacketFromFragments(packet));
11146
11147 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11148
bncf54082a2019-11-27 10:19:47 -080011149 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011150 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11151}
11152
11153TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown4Bytes) {
fkastenholz305e1732019-06-18 05:01:22 -070011154 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011155 // Only IETF QUIC encodes frame types such that this test is relevant.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011156 return;
11157 }
zhongyi546cc452019-04-12 15:27:49 -070011158 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011159
11160 // clang-format off
11161 PacketFragments packet = {
11162 // type (short header, 4 byte packet number)
11163 {"",
11164 {0x43}},
11165 // connection_id
11166 {"",
11167 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11168 // packet number
11169 {"",
11170 {0x12, 0x34, 0x9A, 0xBC}},
11171 // frame type (Blocked, four-byte encoding)
11172 {"",
11173 {kVarInt62FourBytes + 0x00, 0x00, 0x00, 0x08}}
11174 };
11175 // clang-format on
11176
11177 std::unique_ptr<QuicEncryptedPacket> encrypted(
11178 AssemblePacketFromFragments(packet));
11179
11180 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11181
bncf54082a2019-11-27 10:19:47 -080011182 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011183 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11184}
11185
11186TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown8Bytes) {
fkastenholz305e1732019-06-18 05:01:22 -070011187 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011188 // Only IETF QUIC encodes frame types such that this test is relevant.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011189 return;
11190 }
zhongyi546cc452019-04-12 15:27:49 -070011191 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011192 // clang-format off
11193 PacketFragments packet = {
11194 // type (short header, 4 byte packet number)
11195 {"",
11196 {0x43}},
11197 // connection_id
11198 {"",
11199 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11200 // packet number
11201 {"",
11202 {0x12, 0x34, 0x9A, 0xBC}},
11203 // frame type (Blocked, eight-byte encoding)
11204 {"",
11205 {kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08}}
11206 };
11207 // clang-format on
11208
11209 std::unique_ptr<QuicEncryptedPacket> encrypted(
11210 AssemblePacketFromFragments(packet));
11211
11212 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11213
bncf54082a2019-11-27 10:19:47 -080011214 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011215 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11216}
11217
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011218// Tests to check that all known IETF frame types that are not minimally
QUICHE teama6ef0a62019-03-07 20:34:33 -050011219// encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
11220// information "Frame type not minimally encoded."
11221// Just look at 2-byte encoding.
11222TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2BytesAllTypes) {
fkastenholz305e1732019-06-18 05:01:22 -070011223 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011224 // Only IETF QUIC encodes frame types such that this test is relevant.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011225 return;
11226 }
zhongyi546cc452019-04-12 15:27:49 -070011227 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011228
11229 // clang-format off
11230 PacketFragments packets[] = {
11231 {
11232 // type (short header, 4 byte packet number)
11233 {"",
11234 {0x43}},
11235 // connection_id
11236 {"",
11237 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11238 // packet number
11239 {"",
11240 {0x12, 0x34, 0x9A, 0xBC}},
11241 // frame type (two-byte encoding)
11242 {"",
11243 {kVarInt62TwoBytes + 0x00, 0x00}}
11244 },
11245 {
11246 // type (short header, 4 byte packet number)
11247 {"",
11248 {0x43}},
11249 // connection_id
11250 {"",
11251 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11252 // packet number
11253 {"",
11254 {0x12, 0x34, 0x9A, 0xBC}},
11255 // frame type (two-byte encoding)
11256 {"",
11257 {kVarInt62TwoBytes + 0x00, 0x01}}
11258 },
11259 {
11260 // type (short header, 4 byte packet number)
11261 {"",
11262 {0x43}},
11263 // connection_id
11264 {"",
11265 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11266 // packet number
11267 {"",
11268 {0x12, 0x34, 0x9A, 0xBC}},
11269 // frame type (two-byte encoding)
11270 {"",
11271 {kVarInt62TwoBytes + 0x00, 0x02}}
11272 },
11273 {
11274 // type (short header, 4 byte packet number)
11275 {"",
11276 {0x43}},
11277 // connection_id
11278 {"",
11279 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11280 // packet number
11281 {"",
11282 {0x12, 0x34, 0x9A, 0xBC}},
11283 // frame type (two-byte encoding)
11284 {"",
11285 {kVarInt62TwoBytes + 0x00, 0x03}}
11286 },
11287 {
11288 // type (short header, 4 byte packet number)
11289 {"",
11290 {0x43}},
11291 // connection_id
11292 {"",
11293 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11294 // packet number
11295 {"",
11296 {0x12, 0x34, 0x9A, 0xBC}},
11297 // frame type (two-byte encoding)
11298 {"",
11299 {kVarInt62TwoBytes + 0x00, 0x04}}
11300 },
11301 {
11302 // type (short header, 4 byte packet number)
11303 {"",
11304 {0x43}},
11305 // connection_id
11306 {"",
11307 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11308 // packet number
11309 {"",
11310 {0x12, 0x34, 0x9A, 0xBC}},
11311 // frame type (two-byte encoding)
11312 {"",
11313 {kVarInt62TwoBytes + 0x00, 0x05}}
11314 },
11315 {
11316 // type (short header, 4 byte packet number)
11317 {"",
11318 {0x43}},
11319 // connection_id
11320 {"",
11321 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11322 // packet number
11323 {"",
11324 {0x12, 0x34, 0x9A, 0xBC}},
11325 // frame type (two-byte encoding)
11326 {"",
11327 {kVarInt62TwoBytes + 0x00, 0x06}}
11328 },
11329 {
11330 // type (short header, 4 byte packet number)
11331 {"",
11332 {0x43}},
11333 // connection_id
11334 {"",
11335 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11336 // packet number
11337 {"",
11338 {0x12, 0x34, 0x9A, 0xBC}},
11339 // frame type (two-byte encoding)
11340 {"",
11341 {kVarInt62TwoBytes + 0x00, 0x07}}
11342 },
11343 {
11344 // type (short header, 4 byte packet number)
11345 {"",
11346 {0x43}},
11347 // connection_id
11348 {"",
11349 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11350 // packet number
11351 {"",
11352 {0x12, 0x34, 0x9A, 0xBC}},
11353 // frame type (two-byte encoding)
11354 {"",
11355 {kVarInt62TwoBytes + 0x00, 0x08}}
11356 },
11357 {
11358 // type (short header, 4 byte packet number)
11359 {"",
11360 {0x43}},
11361 // connection_id
11362 {"",
11363 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11364 // packet number
11365 {"",
11366 {0x12, 0x34, 0x9A, 0xBC}},
11367 // frame type (two-byte encoding)
11368 {"",
11369 {kVarInt62TwoBytes + 0x00, 0x09}}
11370 },
11371 {
11372 // type (short header, 4 byte packet number)
11373 {"",
11374 {0x43}},
11375 // connection_id
11376 {"",
11377 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11378 // packet number
11379 {"",
11380 {0x12, 0x34, 0x9A, 0xBC}},
11381 // frame type (two-byte encoding)
11382 {"",
11383 {kVarInt62TwoBytes + 0x00, 0x0a}}
11384 },
11385 {
11386 // type (short header, 4 byte packet number)
11387 {"",
11388 {0x43}},
11389 // connection_id
11390 {"",
11391 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11392 // packet number
11393 {"",
11394 {0x12, 0x34, 0x9A, 0xBC}},
11395 // frame type (two-byte encoding)
11396 {"",
11397 {kVarInt62TwoBytes + 0x00, 0x0b}}
11398 },
11399 {
11400 // type (short header, 4 byte packet number)
11401 {"",
11402 {0x43}},
11403 // connection_id
11404 {"",
11405 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11406 // packet number
11407 {"",
11408 {0x12, 0x34, 0x9A, 0xBC}},
11409 // frame type (two-byte encoding)
11410 {"",
11411 {kVarInt62TwoBytes + 0x00, 0x0c}}
11412 },
11413 {
11414 // type (short header, 4 byte packet number)
11415 {"",
11416 {0x43}},
11417 // connection_id
11418 {"",
11419 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11420 // packet number
11421 {"",
11422 {0x12, 0x34, 0x9A, 0xBC}},
11423 // frame type (two-byte encoding)
11424 {"",
11425 {kVarInt62TwoBytes + 0x00, 0x0d}}
11426 },
11427 {
11428 // type (short header, 4 byte packet number)
11429 {"",
11430 {0x43}},
11431 // connection_id
11432 {"",
11433 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11434 // packet number
11435 {"",
11436 {0x12, 0x34, 0x9A, 0xBC}},
11437 // frame type (two-byte encoding)
11438 {"",
11439 {kVarInt62TwoBytes + 0x00, 0x0e}}
11440 },
11441 {
11442 // type (short header, 4 byte packet number)
11443 {"",
11444 {0x43}},
11445 // connection_id
11446 {"",
11447 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11448 // packet number
11449 {"",
11450 {0x12, 0x34, 0x9A, 0xBC}},
11451 // frame type (two-byte encoding)
11452 {"",
11453 {kVarInt62TwoBytes + 0x00, 0x0f}}
11454 },
11455 {
11456 // type (short header, 4 byte packet number)
11457 {"",
11458 {0x43}},
11459 // connection_id
11460 {"",
11461 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11462 // packet number
11463 {"",
11464 {0x12, 0x34, 0x9A, 0xBC}},
11465 // frame type (two-byte encoding)
11466 {"",
11467 {kVarInt62TwoBytes + 0x00, 0x10}}
11468 },
11469 {
11470 // type (short header, 4 byte packet number)
11471 {"",
11472 {0x43}},
11473 // connection_id
11474 {"",
11475 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11476 // packet number
11477 {"",
11478 {0x12, 0x34, 0x9A, 0xBC}},
11479 // frame type (two-byte encoding)
11480 {"",
11481 {kVarInt62TwoBytes + 0x00, 0x11}}
11482 },
11483 {
11484 // type (short header, 4 byte packet number)
11485 {"",
11486 {0x43}},
11487 // connection_id
11488 {"",
11489 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11490 // packet number
11491 {"",
11492 {0x12, 0x34, 0x9A, 0xBC}},
11493 // frame type (two-byte encoding)
11494 {"",
11495 {kVarInt62TwoBytes + 0x00, 0x12}}
11496 },
11497 {
11498 // type (short header, 4 byte packet number)
11499 {"",
11500 {0x43}},
11501 // connection_id
11502 {"",
11503 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11504 // packet number
11505 {"",
11506 {0x12, 0x34, 0x9A, 0xBC}},
11507 // frame type (two-byte encoding)
11508 {"",
11509 {kVarInt62TwoBytes + 0x00, 0x13}}
11510 },
11511 {
11512 // type (short header, 4 byte packet number)
11513 {"",
11514 {0x43}},
11515 // connection_id
11516 {"",
11517 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11518 // packet number
11519 {"",
11520 {0x12, 0x34, 0x9A, 0xBC}},
11521 // frame type (two-byte encoding)
11522 {"",
11523 {kVarInt62TwoBytes + 0x00, 0x14}}
11524 },
11525 {
11526 // type (short header, 4 byte packet number)
11527 {"",
11528 {0x43}},
11529 // connection_id
11530 {"",
11531 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11532 // packet number
11533 {"",
11534 {0x12, 0x34, 0x9A, 0xBC}},
11535 // frame type (two-byte encoding)
11536 {"",
11537 {kVarInt62TwoBytes + 0x00, 0x15}}
11538 },
11539 {
11540 // type (short header, 4 byte packet number)
11541 {"",
11542 {0x43}},
11543 // connection_id
11544 {"",
11545 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11546 // packet number
11547 {"",
11548 {0x12, 0x34, 0x9A, 0xBC}},
11549 // frame type (two-byte encoding)
11550 {"",
11551 {kVarInt62TwoBytes + 0x00, 0x16}}
11552 },
11553 {
11554 // type (short header, 4 byte packet number)
11555 {"",
11556 {0x43}},
11557 // connection_id
11558 {"",
11559 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11560 // packet number
11561 {"",
11562 {0x12, 0x34, 0x9A, 0xBC}},
11563 // frame type (two-byte encoding)
11564 {"",
11565 {kVarInt62TwoBytes + 0x00, 0x17}}
11566 },
11567 {
11568 // type (short header, 4 byte packet number)
11569 {"",
11570 {0x43}},
11571 // connection_id
11572 {"",
11573 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11574 // packet number
11575 {"",
11576 {0x12, 0x34, 0x9A, 0xBC}},
11577 // frame type (two-byte encoding)
11578 {"",
11579 {kVarInt62TwoBytes + 0x00, 0x18}}
11580 },
11581 {
11582 // type (short header, 4 byte packet number)
11583 {"",
11584 {0x43}},
11585 // connection_id
11586 {"",
11587 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11588 // packet number
11589 {"",
11590 {0x12, 0x34, 0x9A, 0xBC}},
11591 // frame type (two-byte encoding)
11592 {"",
11593 {kVarInt62TwoBytes + 0x00, 0x20}}
11594 },
11595 {
11596 // type (short header, 4 byte packet number)
11597 {"",
11598 {0x43}},
11599 // connection_id
11600 {"",
11601 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11602 // packet number
11603 {"",
11604 {0x12, 0x34, 0x9A, 0xBC}},
11605 // frame type (two-byte encoding)
11606 {"",
11607 {kVarInt62TwoBytes + 0x00, 0x21}}
11608 },
11609 };
11610 // clang-format on
11611
11612 for (PacketFragments& packet : packets) {
11613 std::unique_ptr<QuicEncryptedPacket> encrypted(
11614 AssemblePacketFromFragments(packet));
11615
11616 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11617
bncf54082a2019-11-27 10:19:47 -080011618 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011619 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11620 }
11621}
11622
11623TEST_P(QuicFramerTest, RetireConnectionIdFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070011624 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011625 // This frame is only for version 99.
11626 return;
11627 }
zhongyi546cc452019-04-12 15:27:49 -070011628 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011629 // clang-format off
11630 PacketFragments packet99 = {
11631 // type (short header, 4 byte packet number)
11632 {"",
11633 {0x43}},
11634 // connection_id
11635 {"",
11636 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11637 // packet number
11638 {"",
11639 {0x12, 0x34, 0x56, 0x78}},
11640 // frame type (IETF_RETIRE_CONNECTION_ID frame)
11641 {"",
11642 {0x19}},
11643 // Sequence number
11644 {"Unable to read retire connection ID frame sequence number.",
11645 {kVarInt62TwoBytes + 0x11, 0x22}}
11646 };
11647 // clang-format on
11648
11649 std::unique_ptr<QuicEncryptedPacket> encrypted(
11650 AssemblePacketFromFragments(packet99));
11651 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11652
bncf6f82b12019-10-30 07:01:01 -070011653 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050011654 ASSERT_TRUE(visitor_.header_.get());
11655 EXPECT_TRUE(CheckDecryption(
11656 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11657 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11658
11659 EXPECT_EQ(0u, visitor_.stream_frames_.size());
11660
11661 EXPECT_EQ(0x1122u, visitor_.retire_connection_id_.sequence_number);
11662
11663 ASSERT_EQ(0u, visitor_.ack_frames_.size());
11664
11665 CheckFramingBoundaries(packet99, QUIC_INVALID_RETIRE_CONNECTION_ID_DATA);
11666}
11667
11668TEST_P(QuicFramerTest, BuildRetireConnectionIdFramePacket) {
fkastenholz305e1732019-06-18 05:01:22 -070011669 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011670 // This frame is only for version 99.
11671 return;
11672 }
QUICHE team2252b702019-05-14 23:55:14 -040011673 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011674 QuicPacketHeader header;
11675 header.destination_connection_id = FramerTestConnectionId();
11676 header.reset_flag = false;
11677 header.version_flag = false;
11678 header.packet_number = kPacketNumber;
11679
11680 QuicRetireConnectionIdFrame frame;
11681 frame.sequence_number = 0x1122;
11682
11683 QuicFrames frames = {QuicFrame(&frame)};
11684
11685 // clang-format off
11686 unsigned char packet99[] = {
11687 // type (short header, 4 byte packet number)
11688 0x43,
11689 // connection_id
11690 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11691 // packet number
11692 0x12, 0x34, 0x56, 0x78,
11693
11694 // frame type (IETF_RETIRE_CONNECTION_ID frame)
11695 0x19,
11696 // sequence number
11697 kVarInt62TwoBytes + 0x11, 0x22
11698 };
11699 // clang-format on
11700
11701 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11702 ASSERT_TRUE(data != nullptr);
11703
11704 test::CompareCharArraysWithHexError("constructed packet", data->data(),
11705 data->length(), AsChars(packet99),
11706 QUIC_ARRAYSIZE(packet99));
11707}
11708
11709TEST_P(QuicFramerTest, AckFrameWithInvalidLargestObserved) {
zhongyi546cc452019-04-12 15:27:49 -070011710 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011711 // clang-format off
11712 unsigned char packet[] = {
11713 // public flags (8 byte connection_id)
11714 0x2C,
11715 // connection_id
11716 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11717 // packet number
11718 0x12, 0x34, 0x56, 0x78,
11719
11720 // frame type (ack frame)
11721 0x45,
11722 // largest observed
11723 0x00, 0x00,
11724 // Zero delta time.
11725 0x00, 0x00,
11726 // first ack block length.
11727 0x00, 0x00,
11728 // num timestamps.
11729 0x00
11730 };
11731
QUICHE teama6ef0a62019-03-07 20:34:33 -050011732 unsigned char packet46[] = {
11733 // type (short header, 4 byte packet number)
11734 0x43,
11735 // connection_id
11736 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11737 // packet number
11738 0x12, 0x34, 0x56, 0x78,
11739
11740 // frame type (ack frame)
11741 0x45,
11742 // largest observed
11743 0x00, 0x00,
11744 // Zero delta time.
11745 0x00, 0x00,
11746 // first ack block length.
11747 0x00, 0x00,
11748 // num timestamps.
11749 0x00
11750 };
11751
11752 unsigned char packet99[] = {
11753 // type (short header, 4 byte packet number)
11754 0x43,
11755 // connection_id
11756 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11757 // packet number
11758 0x12, 0x34, 0x56, 0x78,
11759
11760 // frame type (IETF_ACK frame)
11761 0x02,
11762 // Largest acked
11763 kVarInt62OneByte + 0x00,
11764 // Zero delta time.
11765 kVarInt62OneByte + 0x00,
11766 // Ack block count 0
11767 kVarInt62OneByte + 0x00,
11768 // First ack block length
11769 kVarInt62OneByte + 0x00,
11770 };
11771 // clang-format on
11772
11773 unsigned char* p = packet;
11774 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -070011775 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011776 p = packet99;
11777 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -070011778 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fayang374888f2019-05-31 06:47:21 -070011779 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -050011780 }
11781
11782 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
11783 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
11784 EXPECT_EQ(framer_.detailed_error(), "Largest acked is 0.");
11785}
11786
11787TEST_P(QuicFramerTest, FirstAckBlockJustUnderFlow) {
zhongyi546cc452019-04-12 15:27:49 -070011788 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011789 // clang-format off
11790 unsigned char packet[] = {
11791 // public flags (8 byte connection_id)
11792 0x2C,
11793 // connection_id
11794 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11795 // packet number
11796 0x12, 0x34, 0x56, 0x78,
11797
11798 // frame type (ack frame)
11799 0x45,
11800 // largest observed
11801 0x00, 0x02,
11802 // Zero delta time.
11803 0x00, 0x00,
11804 // first ack block length.
11805 0x00, 0x03,
11806 // num timestamps.
11807 0x00
11808 };
11809
QUICHE teama6ef0a62019-03-07 20:34:33 -050011810 unsigned char packet46[] = {
11811 // type (short header, 4 byte packet number)
11812 0x43,
11813 // connection_id
11814 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11815 // packet number
11816 0x12, 0x34, 0x56, 0x78,
11817
11818 // frame type (ack frame)
11819 0x45,
11820 // largest observed
11821 0x00, 0x02,
11822 // Zero delta time.
11823 0x00, 0x00,
11824 // first ack block length.
11825 0x00, 0x03,
11826 // num timestamps.
11827 0x00
11828 };
11829
11830 unsigned char packet99[] = {
11831 // type (short header, 4 byte packet number)
11832 0x43,
11833 // connection_id
11834 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11835 // packet number
11836 0x12, 0x34, 0x56, 0x78,
11837
11838 // frame type (IETF_ACK frame)
11839 0x02,
11840 // Largest acked
11841 kVarInt62OneByte + 0x02,
11842 // Zero delta time.
11843 kVarInt62OneByte + 0x00,
11844 // Ack block count 0
11845 kVarInt62OneByte + 0x00,
11846 // First ack block length
11847 kVarInt62OneByte + 0x02,
11848 };
11849 // clang-format on
11850
11851 unsigned char* p = packet;
11852 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -070011853 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011854 p = packet99;
11855 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -070011856 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011857 p = packet46;
11858 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011859 }
11860
11861 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
11862 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
11863 EXPECT_EQ(framer_.detailed_error(),
11864 "Underflow with first ack block length 3 largest acked is 2.");
11865}
11866
11867TEST_P(QuicFramerTest, ThirdAckBlockJustUnderflow) {
zhongyi546cc452019-04-12 15:27:49 -070011868 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011869 // clang-format off
11870 unsigned char packet[] = {
11871 // public flags (8 byte connection_id)
11872 0x2C,
11873 // connection_id
11874 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11875 // packet number
11876 0x12, 0x34, 0x56, 0x78,
11877
11878 // frame type (ack frame)
11879 0x60,
11880 // largest observed
11881 0x0A,
11882 // Zero delta time.
11883 0x00, 0x00,
11884 // Num of ack blocks
11885 0x02,
11886 // first ack block length.
11887 0x02,
11888 // gap to next block
11889 0x01,
11890 // ack block length
11891 0x01,
11892 // gap to next block
11893 0x01,
11894 // ack block length
11895 0x06,
11896 // num timestamps.
11897 0x00
11898 };
11899
QUICHE teama6ef0a62019-03-07 20:34:33 -050011900 unsigned char packet46[] = {
11901 // type (short header, 4 byte packet number)
11902 0x43,
11903 // connection_id
11904 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11905 // packet number
11906 0x12, 0x34, 0x56, 0x78,
11907
11908 // frame type (ack frame)
11909 0x60,
11910 // largest observed
11911 0x0A,
11912 // Zero delta time.
11913 0x00, 0x00,
11914 // Num of ack blocks
11915 0x02,
11916 // first ack block length.
11917 0x02,
11918 // gap to next block
11919 0x01,
11920 // ack block length
11921 0x01,
11922 // gap to next block
11923 0x01,
11924 // ack block length
11925 0x06,
11926 // num timestamps.
11927 0x00
11928 };
11929
11930 unsigned char packet99[] = {
11931 // type (short header, 4 byte packet number)
11932 0x43,
11933 // connection_id
11934 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11935 // packet number
11936 0x12, 0x34, 0x56, 0x78,
11937
11938 // frame type (IETF_ACK frame)
11939 0x02,
11940 // Largest acked
11941 kVarInt62OneByte + 0x0A,
11942 // Zero delta time.
11943 kVarInt62OneByte + 0x00,
11944 // Ack block count 2
11945 kVarInt62OneByte + 0x02,
11946 // First ack block length
11947 kVarInt62OneByte + 0x01,
11948 // gap to next block length
11949 kVarInt62OneByte + 0x00,
11950 // ack block length
11951 kVarInt62OneByte + 0x00,
11952 // gap to next block length
11953 kVarInt62OneByte + 0x00,
11954 // ack block length
11955 kVarInt62OneByte + 0x05,
11956 };
11957 // clang-format on
11958
11959 unsigned char* p = packet;
11960 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -070011961 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011962 p = packet99;
11963 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -070011964 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011965 p = packet46;
11966 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011967 }
11968
11969 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
11970 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
fkastenholz305e1732019-06-18 05:01:22 -070011971 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011972 EXPECT_EQ(framer_.detailed_error(),
11973 "Underflow with ack block length 6 latest ack block end is 5.");
11974 } else {
11975 EXPECT_EQ(framer_.detailed_error(),
11976 "Underflow with ack block length 6, end of block is 6.");
11977 }
11978}
11979
11980TEST_P(QuicFramerTest, CoalescedPacket) {
11981 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
11982 return;
11983 }
zhongyi546cc452019-04-12 15:27:49 -070011984 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011985 // clang-format off
11986 unsigned char packet[] = {
11987 // first coalesced packet
11988 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11989 // 4-byte packet number)
11990 0xD3,
11991 // version
11992 QUIC_VERSION_BYTES,
11993 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070011994 0x08,
QUICHE teama6ef0a62019-03-07 20:34:33 -050011995 // destination connection ID
11996 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -070011997 // source connection ID length
11998 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -050011999 // long header packet length
12000 0x1E,
12001 // packet number
12002 0x12, 0x34, 0x56, 0x78,
dschinazic73506e2019-09-20 13:26:46 -070012003 // frame type (stream frame with fin)
12004 0xFE,
12005 // stream id
12006 0x02, 0x03, 0x04,
12007 // offset
12008 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12009 // data length
12010 0x00, 0x0c,
12011 // data
12012 'h', 'e', 'l', 'l',
12013 'o', ' ', 'w', 'o',
12014 'r', 'l', 'd', '!',
12015 // second coalesced packet
12016 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12017 // 4-byte packet number)
12018 0xD3,
12019 // version
12020 QUIC_VERSION_BYTES,
12021 // destination connection ID length
12022 0x08,
12023 // destination connection ID
12024 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12025 // source connection ID length
12026 0x00,
12027 // long header packet length
12028 0x1E,
12029 // packet number
12030 0x12, 0x34, 0x56, 0x79,
12031 // frame type (stream frame with fin)
12032 0xFE,
12033 // stream id
12034 0x02, 0x03, 0x04,
12035 // offset
12036 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12037 // data length
12038 0x00, 0x0c,
12039 // data
12040 'H', 'E', 'L', 'L',
12041 'O', '_', 'W', 'O',
12042 'R', 'L', 'D', '?',
12043 };
12044 unsigned char packet99[] = {
12045 // first coalesced packet
12046 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12047 // 4-byte packet number)
12048 0xD3,
12049 // version
12050 QUIC_VERSION_BYTES,
12051 // destination connection ID length
12052 0x08,
12053 // destination connection ID
12054 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12055 // source connection ID length
12056 0x00,
12057 // long header packet length
12058 0x1E,
12059 // packet number
12060 0x12, 0x34, 0x56, 0x78,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012061 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12062 0x08 | 0x01 | 0x02 | 0x04,
12063 // stream id
12064 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12065 // offset
12066 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12067 0x32, 0x10, 0x76, 0x54,
12068 // data length
12069 kVarInt62OneByte + 0x0c,
12070 // data
12071 'h', 'e', 'l', 'l',
12072 'o', ' ', 'w', 'o',
12073 'r', 'l', 'd', '!',
12074 // second coalesced packet
12075 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12076 // 4-byte packet number)
12077 0xD3,
12078 // version
12079 QUIC_VERSION_BYTES,
12080 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070012081 0x08,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012082 // destination connection ID
12083 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -070012084 // source connection ID length
12085 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012086 // long header packet length
12087 0x1E,
12088 // packet number
12089 0x12, 0x34, 0x56, 0x79,
12090 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12091 0x08 | 0x01 | 0x02 | 0x04,
12092 // stream id
12093 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12094 // offset
12095 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12096 0x32, 0x10, 0x76, 0x54,
12097 // data length
12098 kVarInt62OneByte + 0x0c,
12099 // data
12100 'H', 'E', 'L', 'L',
12101 'O', '_', 'W', 'O',
12102 'R', 'L', 'D', '?',
12103 };
12104 // clang-format on
12105
dschinazic73506e2019-09-20 13:26:46 -070012106 unsigned char* p = packet;
12107 size_t p_length = QUIC_ARRAYSIZE(packet);
12108 if (framer_.transport_version() == QUIC_VERSION_99) {
12109 p = packet99;
12110 p_length = QUIC_ARRAYSIZE(packet99);
12111 }
12112
12113 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012114 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12115
bncf6f82b12019-10-30 07:01:01 -070012116 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050012117 ASSERT_TRUE(visitor_.header_.get());
12118
12119 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12120 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12121
12122 // Stream ID should be the last 3 bytes of kStreamId.
12123 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12124 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12125 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12126 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12127
12128 ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
12129 EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
12130
bncf6f82b12019-10-30 07:01:01 -070012131 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050012132 ASSERT_TRUE(visitor_.header_.get());
12133
12134 ASSERT_EQ(2u, visitor_.stream_frames_.size());
12135 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12136
12137 // Stream ID should be the last 3 bytes of kStreamId.
12138 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[1]->stream_id);
12139 EXPECT_TRUE(visitor_.stream_frames_[1]->fin);
12140 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[1]->offset);
12141 CheckStreamFrameData("HELLO_WORLD?", visitor_.stream_frames_[1].get());
12142}
12143
dschinazi4b5a68a2019-08-15 15:45:36 -070012144TEST_P(QuicFramerTest, UndecryptablePacketWithoutDecrypter) {
12145 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12146
12147 if (!framer_.version().KnowsWhichDecrypterToUse()) {
12148 // We create a bad client decrypter by using initial encryption with a
12149 // bogus connection ID; it should fail to decrypt everything.
12150 QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
12151 CrypterPair bogus_crypters;
nharperc8d9e402019-09-12 18:30:14 -070012152 CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12153 framer_.version(),
dschinazi4b5a68a2019-08-15 15:45:36 -070012154 bogus_connection_id, &bogus_crypters);
12155 // This removes all other decrypters.
12156 framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
12157 std::move(bogus_crypters.decrypter));
12158 }
12159
dschinazi4b5a68a2019-08-15 15:45:36 -070012160 // clang-format off
12161 unsigned char packet[] = {
12162 // public flags (version included, 8-byte connection ID,
12163 // 4-byte packet number)
12164 0x28,
12165 // connection_id
12166 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12167 // packet number
12168 0x12, 0x34, 0x56, 0x00,
12169 // padding frames
12170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12172 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12174 };
fayang36825da2019-08-21 14:01:27 -070012175 unsigned char packet46[] = {
dschinazi4b5a68a2019-08-15 15:45:36 -070012176 // public flags (long header with packet type HANDSHAKE and
12177 // 4-byte packet number)
fayang36825da2019-08-21 14:01:27 -070012178 0xE3,
dschinazi4b5a68a2019-08-15 15:45:36 -070012179 // version
12180 QUIC_VERSION_BYTES,
12181 // connection ID lengths
12182 0x05,
12183 // source connection ID
12184 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12185 // long header packet length
12186 0x05,
12187 // packet number
12188 0x12, 0x34, 0x56, 0x00,
12189 // padding frames
12190 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12191 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12194 };
dschinazic73506e2019-09-20 13:26:46 -070012195 unsigned char packet49[] = {
dschinazi4b5a68a2019-08-15 15:45:36 -070012196 // public flags (long header with packet type HANDSHAKE and
12197 // 4-byte packet number)
12198 0xE3,
12199 // version
12200 QUIC_VERSION_BYTES,
12201 // destination connection ID length
12202 0x00,
12203 // source connection ID length
12204 0x08,
12205 // source connection ID
12206 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12207 // long header packet length
12208 0x24,
12209 // packet number
12210 0x12, 0x34, 0x56, 0x00,
12211 // padding frames
12212 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12216 };
12217 // clang-format on
12218 unsigned char* p = packet;
12219 size_t p_length = QUIC_ARRAYSIZE(packet);
dschinazic73506e2019-09-20 13:26:46 -070012220 if (framer_.transport_version() >= QUIC_VERSION_49) {
12221 p = packet49;
12222 p_length = QUIC_ARRAYSIZE(packet49);
fayang36825da2019-08-21 14:01:27 -070012223 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
12224 p = packet46;
12225 p_length = QUIC_ARRAYSIZE(packet46);
dschinazi4b5a68a2019-08-15 15:45:36 -070012226 }
12227 // First attempt decryption without the handshake crypter.
12228 EXPECT_FALSE(
12229 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false)));
bncf6f82b12019-10-30 07:01:01 -070012230 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
12231 ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12232 ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12233 ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12234 CompareCharArraysWithHexError(
12235 "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
12236 visitor_.undecryptable_packets_[0]->length(), AsChars(p), p_length);
12237 if (framer_.version().KnowsWhichDecrypterToUse()) {
12238 EXPECT_EQ(ENCRYPTION_HANDSHAKE,
12239 visitor_.undecryptable_decryption_levels_[0]);
12240 }
12241 EXPECT_FALSE(visitor_.undecryptable_has_decryption_keys_[0]);
dschinazi4b5a68a2019-08-15 15:45:36 -070012242}
12243
12244TEST_P(QuicFramerTest, UndecryptablePacketWithDecrypter) {
12245 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12246
12247 // We create a bad client decrypter by using initial encryption with a
12248 // bogus connection ID; it should fail to decrypt everything.
12249 QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
12250 CrypterPair bad_handshake_crypters;
nharperc8d9e402019-09-12 18:30:14 -070012251 CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12252 framer_.version(), bogus_connection_id,
12253 &bad_handshake_crypters);
dschinazi4b5a68a2019-08-15 15:45:36 -070012254 if (framer_.version().KnowsWhichDecrypterToUse()) {
12255 framer_.InstallDecrypter(ENCRYPTION_HANDSHAKE,
12256 std::move(bad_handshake_crypters.decrypter));
12257 } else {
12258 framer_.SetDecrypter(ENCRYPTION_HANDSHAKE,
12259 std::move(bad_handshake_crypters.decrypter));
12260 }
12261
dschinazi4b5a68a2019-08-15 15:45:36 -070012262 // clang-format off
12263 unsigned char packet[] = {
12264 // public flags (version included, 8-byte connection ID,
12265 // 4-byte packet number)
12266 0x28,
12267 // connection_id
12268 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12269 // packet number
12270 0x12, 0x34, 0x56, 0x00,
12271 // padding frames
12272 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12274 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12275 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12276 };
fayang36825da2019-08-21 14:01:27 -070012277 unsigned char packet46[] = {
dschinazi4b5a68a2019-08-15 15:45:36 -070012278 // public flags (long header with packet type HANDSHAKE and
12279 // 4-byte packet number)
fayang36825da2019-08-21 14:01:27 -070012280 0xE3,
dschinazi4b5a68a2019-08-15 15:45:36 -070012281 // version
12282 QUIC_VERSION_BYTES,
12283 // connection ID lengths
12284 0x05,
12285 // source connection ID
12286 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12287 // long header packet length
12288 0x05,
12289 // packet number
12290 0x12, 0x34, 0x56, 0x00,
12291 // padding frames
12292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12294 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12296 };
dschinazic73506e2019-09-20 13:26:46 -070012297 unsigned char packet49[] = {
dschinazi4b5a68a2019-08-15 15:45:36 -070012298 // public flags (long header with packet type HANDSHAKE and
12299 // 4-byte packet number)
12300 0xE3,
12301 // version
12302 QUIC_VERSION_BYTES,
12303 // destination connection ID length
12304 0x00,
12305 // source connection ID length
12306 0x08,
12307 // source connection ID
12308 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12309 // long header packet length
12310 0x24,
12311 // packet number
12312 0x12, 0x34, 0x56, 0x00,
12313 // padding frames
12314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12318 };
12319 // clang-format on
12320 unsigned char* p = packet;
12321 size_t p_length = QUIC_ARRAYSIZE(packet);
dschinazic73506e2019-09-20 13:26:46 -070012322 if (framer_.transport_version() >= QUIC_VERSION_49) {
12323 p = packet49;
12324 p_length = QUIC_ARRAYSIZE(packet49);
fayang36825da2019-08-21 14:01:27 -070012325 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
12326 p = packet46;
12327 p_length = QUIC_ARRAYSIZE(packet46);
dschinazi4b5a68a2019-08-15 15:45:36 -070012328 }
12329
12330 EXPECT_FALSE(
12331 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false)));
bncf6f82b12019-10-30 07:01:01 -070012332 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
12333 ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12334 ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12335 ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12336 CompareCharArraysWithHexError(
12337 "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
12338 visitor_.undecryptable_packets_[0]->length(), AsChars(p), p_length);
12339 if (framer_.version().KnowsWhichDecrypterToUse()) {
12340 EXPECT_EQ(ENCRYPTION_HANDSHAKE,
12341 visitor_.undecryptable_decryption_levels_[0]);
12342 }
12343 EXPECT_EQ(framer_.version().KnowsWhichDecrypterToUse(),
12344 visitor_.undecryptable_has_decryption_keys_[0]);
dschinazi4b5a68a2019-08-15 15:45:36 -070012345}
12346
12347TEST_P(QuicFramerTest, UndecryptableCoalescedPacket) {
12348 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12349 return;
12350 }
12351 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
12352 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
12353 // We create a bad client decrypter by using initial encryption with a
12354 // bogus connection ID; it should fail to decrypt everything.
12355 QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
12356 CrypterPair bad_handshake_crypters;
nharperc8d9e402019-09-12 18:30:14 -070012357 CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12358 framer_.version(), bogus_connection_id,
12359 &bad_handshake_crypters);
dschinazi4b5a68a2019-08-15 15:45:36 -070012360 framer_.InstallDecrypter(ENCRYPTION_HANDSHAKE,
12361 std::move(bad_handshake_crypters.decrypter));
12362 // clang-format off
12363 unsigned char packet[] = {
12364 // first coalesced packet
12365 // public flags (long header with packet type HANDSHAKE and
12366 // 4-byte packet number)
12367 0xE3,
12368 // version
12369 QUIC_VERSION_BYTES,
12370 // destination connection ID length
12371 0x08,
12372 // destination connection ID
12373 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12374 // source connection ID length
12375 0x00,
12376 // long header packet length
12377 0x1E,
12378 // packet number
12379 0x12, 0x34, 0x56, 0x78,
dschinazic73506e2019-09-20 13:26:46 -070012380 // frame type (stream frame with fin)
12381 0xFE,
12382 // stream id
12383 0x02, 0x03, 0x04,
12384 // offset
12385 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12386 // data length
12387 0x00, 0x0c,
12388 // data
12389 'h', 'e', 'l', 'l',
12390 'o', ' ', 'w', 'o',
12391 'r', 'l', 'd', '!',
12392 // second coalesced packet
12393 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12394 // 4-byte packet number)
12395 0xD3,
12396 // version
12397 QUIC_VERSION_BYTES,
12398 // destination connection ID length
12399 0x08,
12400 // destination connection ID
12401 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12402 // source connection ID length
12403 0x00,
12404 // long header packet length
12405 0x1E,
12406 // packet number
12407 0x12, 0x34, 0x56, 0x79,
12408 // frame type (stream frame with fin)
12409 0xFE,
12410 // stream id
12411 0x02, 0x03, 0x04,
12412 // offset
12413 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12414 // data length
12415 0x00, 0x0c,
12416 // data
12417 'H', 'E', 'L', 'L',
12418 'O', '_', 'W', 'O',
12419 'R', 'L', 'D', '?',
12420 };
12421 unsigned char packet99[] = {
12422 // first coalesced packet
12423 // public flags (long header with packet type HANDSHAKE and
12424 // 4-byte packet number)
12425 0xE3,
12426 // version
12427 QUIC_VERSION_BYTES,
12428 // destination connection ID length
12429 0x08,
12430 // destination connection ID
12431 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12432 // source connection ID length
12433 0x00,
12434 // long header packet length
12435 0x1E,
12436 // packet number
12437 0x12, 0x34, 0x56, 0x78,
dschinazi4b5a68a2019-08-15 15:45:36 -070012438 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12439 0x08 | 0x01 | 0x02 | 0x04,
12440 // stream id
12441 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12442 // offset
12443 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12444 0x32, 0x10, 0x76, 0x54,
12445 // data length
12446 kVarInt62OneByte + 0x0c,
12447 // data
12448 'h', 'e', 'l', 'l',
12449 'o', ' ', 'w', 'o',
12450 'r', 'l', 'd', '!',
12451 // second coalesced packet
12452 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12453 // 4-byte packet number)
12454 0xD3,
12455 // version
12456 QUIC_VERSION_BYTES,
12457 // destination connection ID length
12458 0x08,
12459 // destination connection ID
12460 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12461 // source connection ID length
12462 0x00,
12463 // long header packet length
12464 0x1E,
12465 // packet number
12466 0x12, 0x34, 0x56, 0x79,
12467 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12468 0x08 | 0x01 | 0x02 | 0x04,
12469 // stream id
12470 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12471 // offset
12472 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12473 0x32, 0x10, 0x76, 0x54,
12474 // data length
12475 kVarInt62OneByte + 0x0c,
12476 // data
12477 'H', 'E', 'L', 'L',
12478 'O', '_', 'W', 'O',
12479 'R', 'L', 'D', '?',
12480 };
12481 // clang-format on
12482 const size_t length_of_first_coalesced_packet = 46;
12483
dschinazic73506e2019-09-20 13:26:46 -070012484 unsigned char* p = packet;
12485 size_t p_length = QUIC_ARRAYSIZE(packet);
12486 if (framer_.transport_version() == QUIC_VERSION_99) {
12487 p = packet99;
12488 p_length = QUIC_ARRAYSIZE(packet99);
12489 }
12490
12491 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12492
dschinazi4b5a68a2019-08-15 15:45:36 -070012493 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12494
bncf6f82b12019-10-30 07:01:01 -070012495 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
dschinazi4b5a68a2019-08-15 15:45:36 -070012496
bncf6f82b12019-10-30 07:01:01 -070012497 ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12498 ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12499 ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12500 // Make sure we only receive the first undecryptable packet and not the
12501 // full packet including the second coalesced packet.
12502 CompareCharArraysWithHexError("undecryptable packet",
12503 visitor_.undecryptable_packets_[0]->data(),
12504 visitor_.undecryptable_packets_[0]->length(),
12505 AsChars(p), length_of_first_coalesced_packet);
12506 EXPECT_EQ(ENCRYPTION_HANDSHAKE, visitor_.undecryptable_decryption_levels_[0]);
12507 EXPECT_TRUE(visitor_.undecryptable_has_decryption_keys_[0]);
dschinazi4b5a68a2019-08-15 15:45:36 -070012508
12509 // Make sure the second coalesced packet is parsed correctly.
12510 ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
12511 EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
12512
12513 ASSERT_TRUE(visitor_.header_.get());
12514
12515 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12516 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12517
12518 // Stream ID should be the last 3 bytes of kStreamId.
12519 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12520 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12521 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12522 CheckStreamFrameData("HELLO_WORLD?", visitor_.stream_frames_[0].get());
12523}
12524
QUICHE teama6ef0a62019-03-07 20:34:33 -050012525TEST_P(QuicFramerTest, MismatchedCoalescedPacket) {
12526 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12527 return;
12528 }
zhongyi546cc452019-04-12 15:27:49 -070012529 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012530 // clang-format off
12531 unsigned char packet[] = {
12532 // first coalesced packet
12533 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12534 // 4-byte packet number)
12535 0xD3,
12536 // version
12537 QUIC_VERSION_BYTES,
12538 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070012539 0x08,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012540 // destination connection ID
12541 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -070012542 // source connection ID length
12543 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012544 // long header packet length
12545 0x1E,
12546 // packet number
12547 0x12, 0x34, 0x56, 0x78,
dschinazic73506e2019-09-20 13:26:46 -070012548 // frame type (stream frame with fin)
12549 0xFE,
12550 // stream id
12551 0x02, 0x03, 0x04,
12552 // offset
12553 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12554 // data length
12555 0x00, 0x0c,
12556 // data
12557 'h', 'e', 'l', 'l',
12558 'o', ' ', 'w', 'o',
12559 'r', 'l', 'd', '!',
12560 // second coalesced packet
12561 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12562 // 4-byte packet number)
12563 0xD3,
12564 // version
12565 QUIC_VERSION_BYTES,
12566 // destination connection ID length
12567 0x08,
12568 // destination connection ID
12569 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
12570 // source connection ID length
12571 0x00,
12572 // long header packet length
12573 0x1E,
12574 // packet number
12575 0x12, 0x34, 0x56, 0x79,
12576 // frame type (stream frame with fin)
12577 0xFE,
12578 // stream id
12579 0x02, 0x03, 0x04,
12580 // offset
12581 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12582 // data length
12583 0x00, 0x0c,
12584 // data
12585 'H', 'E', 'L', 'L',
12586 'O', '_', 'W', 'O',
12587 'R', 'L', 'D', '?',
12588 };
12589 unsigned char packet99[] = {
12590 // first coalesced packet
12591 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12592 // 4-byte packet number)
12593 0xD3,
12594 // version
12595 QUIC_VERSION_BYTES,
12596 // destination connection ID length
12597 0x08,
12598 // destination connection ID
12599 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12600 // source connection ID length
12601 0x00,
12602 // long header packet length
12603 0x1E,
12604 // packet number
12605 0x12, 0x34, 0x56, 0x78,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012606 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12607 0x08 | 0x01 | 0x02 | 0x04,
12608 // stream id
12609 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12610 // offset
12611 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12612 0x32, 0x10, 0x76, 0x54,
12613 // data length
12614 kVarInt62OneByte + 0x0c,
12615 // data
12616 'h', 'e', 'l', 'l',
12617 'o', ' ', 'w', 'o',
12618 'r', 'l', 'd', '!',
12619 // second coalesced packet
12620 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12621 // 4-byte packet number)
12622 0xD3,
12623 // version
12624 QUIC_VERSION_BYTES,
12625 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070012626 0x08,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012627 // destination connection ID
12628 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
dschinazi48ac9192019-07-31 00:07:26 -070012629 // source connection ID length
12630 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012631 // long header packet length
12632 0x1E,
12633 // packet number
12634 0x12, 0x34, 0x56, 0x79,
12635 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12636 0x08 | 0x01 | 0x02 | 0x04,
12637 // stream id
12638 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12639 // offset
12640 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12641 0x32, 0x10, 0x76, 0x54,
12642 // data length
12643 kVarInt62OneByte + 0x0c,
12644 // data
12645 'H', 'E', 'L', 'L',
12646 'O', '_', 'W', 'O',
12647 'R', 'L', 'D', '?',
12648 };
12649 // clang-format on
12650
dschinazic73506e2019-09-20 13:26:46 -070012651 unsigned char* p = packet;
12652 size_t p_length = QUIC_ARRAYSIZE(packet);
12653 if (framer_.transport_version() == QUIC_VERSION_99) {
12654 p = packet99;
12655 p_length = QUIC_ARRAYSIZE(packet99);
12656 }
12657
12658 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12659
QUICHE teama6ef0a62019-03-07 20:34:33 -050012660 EXPECT_QUIC_PEER_BUG(EXPECT_TRUE(framer_.ProcessPacket(encrypted)),
12661 "Server: Received mismatched coalesced header.*");
12662
bncf6f82b12019-10-30 07:01:01 -070012663 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050012664 ASSERT_TRUE(visitor_.header_.get());
12665
12666 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12667 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12668
12669 // Stream ID should be the last 3 bytes of kStreamId.
12670 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12671 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12672 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12673 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12674
12675 ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
12676}
12677
12678TEST_P(QuicFramerTest, InvalidCoalescedPacket) {
12679 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12680 return;
12681 }
zhongyi546cc452019-04-12 15:27:49 -070012682 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012683 // clang-format off
12684 unsigned char packet[] = {
12685 // first coalesced packet
12686 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12687 // 4-byte packet number)
12688 0xD3,
12689 // version
12690 QUIC_VERSION_BYTES,
12691 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070012692 0x08,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012693 // destination connection ID
12694 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -070012695 // source connection ID length
12696 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012697 // long header packet length
12698 0x1E,
12699 // packet number
12700 0x12, 0x34, 0x56, 0x78,
dschinazic73506e2019-09-20 13:26:46 -070012701 // frame type (stream frame with fin)
12702 0xFE,
12703 // stream id
12704 0x02, 0x03, 0x04,
12705 // offset
12706 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12707 // data length
12708 0x00, 0x0c,
12709 // data
12710 'h', 'e', 'l', 'l',
12711 'o', ' ', 'w', 'o',
12712 'r', 'l', 'd', '!',
12713 // second coalesced packet
12714 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12715 // 4-byte packet number)
12716 0xD3,
12717 // version would be here but we cut off the invalid coalesced header.
12718 };
12719 unsigned char packet99[] = {
12720 // first coalesced packet
12721 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12722 // 4-byte packet number)
12723 0xD3,
12724 // version
12725 QUIC_VERSION_BYTES,
12726 // destination connection ID length
12727 0x08,
12728 // destination connection ID
12729 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12730 // source connection ID length
12731 0x00,
12732 // long header packet length
12733 0x1E,
12734 // packet number
12735 0x12, 0x34, 0x56, 0x78,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012736 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12737 0x08 | 0x01 | 0x02 | 0x04,
12738 // stream id
12739 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12740 // offset
12741 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12742 0x32, 0x10, 0x76, 0x54,
12743 // data length
12744 kVarInt62OneByte + 0x0c,
12745 // data
12746 'h', 'e', 'l', 'l',
12747 'o', ' ', 'w', 'o',
12748 'r', 'l', 'd', '!',
12749 // second coalesced packet
12750 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12751 // 4-byte packet number)
12752 0xD3,
12753 // version would be here but we cut off the invalid coalesced header.
12754 };
12755 // clang-format on
12756
dschinazic73506e2019-09-20 13:26:46 -070012757 unsigned char* p = packet;
12758 size_t p_length = QUIC_ARRAYSIZE(packet);
12759 if (framer_.transport_version() == QUIC_VERSION_99) {
12760 p = packet99;
12761 p_length = QUIC_ARRAYSIZE(packet99);
12762 }
12763
12764 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12765
QUICHE teama6ef0a62019-03-07 20:34:33 -050012766 EXPECT_QUIC_PEER_BUG(EXPECT_TRUE(framer_.ProcessPacket(encrypted)),
12767 "Server: Failed to parse received coalesced header.*");
12768
bncf6f82b12019-10-30 07:01:01 -070012769 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050012770 ASSERT_TRUE(visitor_.header_.get());
12771
12772 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12773 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12774
12775 // Stream ID should be the last 3 bytes of kStreamId.
12776 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12777 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12778 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12779 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12780
12781 ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
12782}
12783
dschinazia484f982019-05-23 03:54:44 -070012784// Some IETF implementations send an initial followed by zeroes instead of
12785// padding inside the initial. We need to make sure that we still process
12786// the initial correctly and ignore the zeroes.
12787TEST_P(QuicFramerTest, CoalescedPacketWithZeroesRoundTrip) {
nharperc8d9e402019-09-12 18:30:14 -070012788 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version()) ||
12789 !framer_.version().UsesInitialObfuscators()) {
dschinazia484f982019-05-23 03:54:44 -070012790 return;
12791 }
12792 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
12793 QuicConnectionId connection_id = FramerTestConnectionId();
12794 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12795
12796 CrypterPair client_crypters;
nharperc8d9e402019-09-12 18:30:14 -070012797 CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12798 framer_.version(), connection_id,
12799 &client_crypters);
dschinazia484f982019-05-23 03:54:44 -070012800 framer_.SetEncrypter(ENCRYPTION_INITIAL,
12801 std::move(client_crypters.encrypter));
12802
12803 QuicPacketHeader header;
12804 header.destination_connection_id = connection_id;
12805 header.version_flag = true;
12806 header.packet_number = kPacketNumber;
12807 header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
12808 header.long_packet_type = INITIAL;
12809 header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
12810 header.retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_1;
nharper965e5922019-09-23 22:33:54 -070012811 QuicFrames frames = {QuicFrame(QuicPingFrame()),
12812 QuicFrame(QuicPaddingFrame(3))};
dschinazia484f982019-05-23 03:54:44 -070012813
12814 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
12815 ASSERT_NE(nullptr, data);
12816
12817 // Add zeroes after the valid initial packet.
12818 unsigned char packet[kMaxOutgoingPacketSize] = {};
12819 size_t encrypted_length =
12820 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number, *data,
12821 AsChars(packet), QUIC_ARRAYSIZE(packet));
12822 ASSERT_NE(0u, encrypted_length);
12823
12824 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
12825 CrypterPair server_crypters;
nharperc8d9e402019-09-12 18:30:14 -070012826 CryptoUtils::CreateInitialObfuscators(Perspective::IS_SERVER,
12827 framer_.version(), connection_id,
12828 &server_crypters);
dschinazia484f982019-05-23 03:54:44 -070012829 framer_.InstallDecrypter(ENCRYPTION_INITIAL,
12830 std::move(server_crypters.decrypter));
12831
12832 // Make sure the first long header initial packet parses correctly.
12833 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
12834
12835 // Make sure we discard the subsequent zeroes.
12836 EXPECT_QUIC_PEER_BUG(EXPECT_TRUE(framer_.ProcessPacket(encrypted)),
dschinazi48ac9192019-07-31 00:07:26 -070012837 "Server: (Failed to parse received|Received mismatched) "
12838 "coalesced header.*");
dschinazia484f982019-05-23 03:54:44 -070012839}
12840
dschinazie0df3f72019-05-06 16:37:51 -070012841TEST_P(QuicFramerTest, ClientReceivesInvalidVersion) {
fayang36825da2019-08-21 14:01:27 -070012842 if (framer_.transport_version() <= QUIC_VERSION_43) {
dschinazie0df3f72019-05-06 16:37:51 -070012843 return;
12844 }
12845 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12846
12847 // clang-format off
12848 unsigned char packet[] = {
12849 // public flags (long header with packet type INITIAL)
fayang36825da2019-08-21 14:01:27 -070012850 0xC3,
dschinazie0df3f72019-05-06 16:37:51 -070012851 // version that is different from the framer's version
12852 'Q', '0', '4', '3',
12853 // connection ID lengths
12854 0x05,
12855 // source connection ID
12856 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12857 // packet number
12858 0x01,
12859 // padding frame
12860 0x00,
12861 };
12862 // clang-format on
12863
12864 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
12865 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12866
bncf6f82b12019-10-30 07:01:01 -070012867 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_VERSION));
dschinazie0df3f72019-05-06 16:37:51 -070012868 EXPECT_EQ("Client received unexpected version.", framer_.detailed_error());
12869}
12870
QUICHE teama6ef0a62019-03-07 20:34:33 -050012871TEST_P(QuicFramerTest, PacketHeaderWithVariableLengthConnectionId) {
dschinazib953d022019-08-01 18:05:58 -070012872 if (!QuicUtils::VariableLengthConnectionIdAllowedForVersion(
12873 framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050012874 return;
12875 }
zhongyi546cc452019-04-12 15:27:49 -070012876 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012877 char connection_id_bytes[9] = {0xFE, 0xDC, 0xBA, 0x98, 0x76,
12878 0x54, 0x32, 0x10, 0x42};
12879 QuicConnectionId connection_id(connection_id_bytes,
12880 sizeof(connection_id_bytes));
12881 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
dschinazi8ff74822019-05-28 16:37:20 -070012882 QuicFramerPeer::SetExpectedServerConnectionIDLength(&framer_,
12883 connection_id.length());
QUICHE teama6ef0a62019-03-07 20:34:33 -050012884
12885 // clang-format off
12886 PacketFragments packet = {
12887 // type (8 byte connection_id and 1 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -070012888 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050012889 {0x40}},
12890 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -070012891 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050012892 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
12893 // packet number
12894 {"Unable to read packet number.",
12895 {0x78}},
12896 };
nharper55fa6132019-05-07 19:37:21 -070012897
12898 PacketFragments packet_with_padding = {
12899 // type (8 byte connection_id and 1 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -070012900 {"Unable to read first byte.",
nharper55fa6132019-05-07 19:37:21 -070012901 {0x40}},
12902 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -070012903 {"Unable to read destination connection ID.",
nharper55fa6132019-05-07 19:37:21 -070012904 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
12905 // packet number
12906 {"",
12907 {0x78}},
12908 // padding
12909 {"", {0x00, 0x00, 0x00}},
12910 };
QUICHE teama6ef0a62019-03-07 20:34:33 -050012911 // clang-format on
12912
nharper55fa6132019-05-07 19:37:21 -070012913 PacketFragments& fragments =
12914 framer_.version().HasHeaderProtection() ? packet_with_padding : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -050012915 std::unique_ptr<QuicEncryptedPacket> encrypted(
nharper55fa6132019-05-07 19:37:21 -070012916 AssemblePacketFromFragments(fragments));
12917 if (framer_.version().HasHeaderProtection()) {
12918 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -070012919 EXPECT_THAT(framer_.error(), IsQuicNoError());
nharper55fa6132019-05-07 19:37:21 -070012920 } else {
12921 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -070012922 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
nharper55fa6132019-05-07 19:37:21 -070012923 }
QUICHE teama6ef0a62019-03-07 20:34:33 -050012924 ASSERT_TRUE(visitor_.header_.get());
12925 EXPECT_EQ(connection_id, visitor_.header_->destination_connection_id);
12926 EXPECT_FALSE(visitor_.header_->reset_flag);
12927 EXPECT_FALSE(visitor_.header_->version_flag);
12928 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
12929 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
12930
nharper55fa6132019-05-07 19:37:21 -070012931 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012932}
12933
QUICHE team10b22a12019-03-21 15:31:42 -070012934TEST_P(QuicFramerTest, MultiplePacketNumberSpaces) {
12935 if (framer_.transport_version() < QUIC_VERSION_46) {
12936 return;
12937 }
QUICHE team10b22a12019-03-21 15:31:42 -070012938 framer_.EnableMultiplePacketNumberSpacesSupport();
12939
12940 // clang-format off
12941 unsigned char long_header_packet[] = {
12942 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12943 // 4-byte packet number)
12944 0xD3,
12945 // version
12946 QUIC_VERSION_BYTES,
12947 // destination connection ID length
fayang91475c42019-06-19 08:04:26 -070012948 0x50,
QUICHE team10b22a12019-03-21 15:31:42 -070012949 // destination connection ID
fayang91475c42019-06-19 08:04:26 -070012950 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
QUICHE team10b22a12019-03-21 15:31:42 -070012951 // packet number
12952 0x12, 0x34, 0x56, 0x78,
12953 // padding frame
12954 0x00,
12955 };
12956 unsigned char long_header_packet99[] = {
12957 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12958 // 4-byte packet number)
12959 0xD3,
12960 // version
12961 QUIC_VERSION_BYTES,
12962 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070012963 0x08,
QUICHE team10b22a12019-03-21 15:31:42 -070012964 // destination connection ID
fayang91475c42019-06-19 08:04:26 -070012965 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -070012966 // source connection ID length
12967 0x00,
QUICHE team10b22a12019-03-21 15:31:42 -070012968 // long header packet length
12969 0x05,
12970 // packet number
12971 0x12, 0x34, 0x56, 0x78,
12972 // padding frame
12973 0x00,
12974 };
12975 // clang-format on
12976
zhongyi546cc452019-04-12 15:27:49 -070012977 if (framer_.version().KnowsWhichDecrypterToUse()) {
12978 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
vasilvv0fc587f2019-09-06 13:33:08 -070012979 std::make_unique<TestDecrypter>());
zhongyi546cc452019-04-12 15:27:49 -070012980 framer_.RemoveDecrypter(ENCRYPTION_INITIAL);
12981 } else {
vasilvv0fc587f2019-09-06 13:33:08 -070012982 framer_.SetDecrypter(ENCRYPTION_ZERO_RTT,
12983 std::make_unique<TestDecrypter>());
zhongyi546cc452019-04-12 15:27:49 -070012984 }
QUICHE team10b22a12019-03-21 15:31:42 -070012985 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12986 EXPECT_TRUE(framer_.ProcessPacket(
12987 QuicEncryptedPacket(AsChars(long_header_packet),
12988 QUIC_ARRAYSIZE(long_header_packet), false)));
12989 } else {
12990 EXPECT_TRUE(framer_.ProcessPacket(
12991 QuicEncryptedPacket(AsChars(long_header_packet99),
12992 QUIC_ARRAYSIZE(long_header_packet99), false)));
12993 }
12994
bncf6f82b12019-10-30 07:01:01 -070012995 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE team10b22a12019-03-21 15:31:42 -070012996 EXPECT_FALSE(
12997 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
12998 .IsInitialized());
12999 EXPECT_FALSE(
13000 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
13001 .IsInitialized());
13002 EXPECT_EQ(kPacketNumber, QuicFramerPeer::GetLargestDecryptedPacketNumber(
13003 &framer_, APPLICATION_DATA));
13004
13005 // clang-format off
13006 unsigned char short_header_packet[] = {
13007 // type (short header, 1 byte packet number)
13008 0x40,
13009 // connection_id
fayang91475c42019-06-19 08:04:26 -070013010 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
QUICHE team10b22a12019-03-21 15:31:42 -070013011 // packet number
13012 0x79,
13013 // padding frame
nharper55fa6132019-05-07 19:37:21 -070013014 0x00, 0x00, 0x00,
QUICHE team10b22a12019-03-21 15:31:42 -070013015 };
13016 // clang-format on
13017
13018 QuicEncryptedPacket short_header_encrypted(
13019 AsChars(short_header_packet), QUIC_ARRAYSIZE(short_header_packet), false);
zhongyi546cc452019-04-12 15:27:49 -070013020 if (framer_.version().KnowsWhichDecrypterToUse()) {
13021 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -070013022 std::make_unique<TestDecrypter>());
zhongyi546cc452019-04-12 15:27:49 -070013023 framer_.RemoveDecrypter(ENCRYPTION_ZERO_RTT);
13024 } else {
13025 framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -070013026 std::make_unique<TestDecrypter>());
zhongyi546cc452019-04-12 15:27:49 -070013027 }
QUICHE team10b22a12019-03-21 15:31:42 -070013028 EXPECT_TRUE(framer_.ProcessPacket(short_header_encrypted));
13029
bncf6f82b12019-10-30 07:01:01 -070013030 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE team10b22a12019-03-21 15:31:42 -070013031 EXPECT_FALSE(
13032 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
13033 .IsInitialized());
13034 EXPECT_FALSE(
13035 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
13036 .IsInitialized());
13037 EXPECT_EQ(kPacketNumber + 1, QuicFramerPeer::GetLargestDecryptedPacketNumber(
13038 &framer_, APPLICATION_DATA));
13039}
13040
nharper2ceb97c2019-04-19 11:38:59 -070013041TEST_P(QuicFramerTest, IetfRetryPacketRejected) {
dschinazi244f6dc2019-05-06 15:45:16 -070013042 if (!framer_.version().KnowsWhichDecrypterToUse() ||
13043 framer_.version().SupportsRetry()) {
nharper2ceb97c2019-04-19 11:38:59 -070013044 return;
13045 }
13046
13047 // clang-format off
fayang36825da2019-08-21 14:01:27 -070013048 PacketFragments packet46 = {
nharper9bb83462019-05-01 10:53:22 -070013049 // public flags (IETF Retry packet, 0-length original destination CID)
dschinazi48ac9192019-07-31 00:07:26 -070013050 {"Unable to read first byte.",
nharper9bb83462019-05-01 10:53:22 -070013051 {0xf0}},
13052 // version tag
13053 {"Unable to read protocol version.",
13054 {QUIC_VERSION_BYTES}},
13055 // connection_id length
dschinazi244f6dc2019-05-06 15:45:16 -070013056 {"RETRY not supported in this version.",
nharper2ceb97c2019-04-19 11:38:59 -070013057 {0x00}},
13058 };
13059 // clang-format on
13060
13061 std::unique_ptr<QuicEncryptedPacket> encrypted(
fayang36825da2019-08-21 14:01:27 -070013062 AssemblePacketFromFragments(packet46));
nharper2ceb97c2019-04-19 11:38:59 -070013063
13064 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -070013065 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
fayang36825da2019-08-21 14:01:27 -070013066 CheckFramingBoundaries(packet46, QUIC_INVALID_PACKET_HEADER);
nharper2ceb97c2019-04-19 11:38:59 -070013067}
13068
13069TEST_P(QuicFramerTest, RetryPacketRejectedWithMultiplePacketNumberSpaces) {
dschinazi244f6dc2019-05-06 15:45:16 -070013070 if (framer_.transport_version() < QUIC_VERSION_46 ||
13071 framer_.version().SupportsRetry()) {
nharper2ceb97c2019-04-19 11:38:59 -070013072 return;
13073 }
13074 framer_.EnableMultiplePacketNumberSpacesSupport();
13075
13076 // clang-format off
13077 PacketFragments packet = {
13078 // public flags (IETF Retry packet, 0-length original destination CID)
dschinazi48ac9192019-07-31 00:07:26 -070013079 {"Unable to read first byte.",
nharper2ceb97c2019-04-19 11:38:59 -070013080 {0xf0}},
13081 // version tag
13082 {"Unable to read protocol version.",
13083 {QUIC_VERSION_BYTES}},
13084 // connection_id length
dschinazi244f6dc2019-05-06 15:45:16 -070013085 {"RETRY not supported in this version.",
nharper2ceb97c2019-04-19 11:38:59 -070013086 {0x00}},
13087 };
13088 // clang-format on
13089
13090 std::unique_ptr<QuicEncryptedPacket> encrypted(
13091 AssemblePacketFromFragments(packet));
13092
13093 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -070013094 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
nharper2ceb97c2019-04-19 11:38:59 -070013095 CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
13096}
13097
nharpera745e392019-04-19 12:05:15 -070013098TEST_P(QuicFramerTest, ProcessPublicHeaderNoVersionInferredType) {
13099 // The framer needs to have Perspective::IS_SERVER and configured to infer the
13100 // packet header type from the packet (not the version). The framer's version
13101 // needs to be one that uses the IETF packet format.
13102 if (!framer_.version().KnowsWhichDecrypterToUse()) {
13103 return;
13104 }
13105 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13106
13107 // Prepare a packet that uses the Google QUIC packet header but has no version
13108 // field.
13109
13110 // clang-format off
13111 PacketFragments packet = {
13112 // public flags (1-byte packet number, 8-byte connection_id, no version)
13113 {"Unable to read public flags.",
13114 {0x08}},
13115 // connection_id
13116 {"Unable to read ConnectionId.",
13117 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
13118 // packet number
13119 {"Unable to read packet number.",
13120 {0x01}},
13121 // padding
13122 {"Invalid public header type for expected version.",
13123 {0x00}},
13124 };
13125 // clang-format on
13126
13127 PacketFragments& fragments = packet;
13128
13129 std::unique_ptr<QuicEncryptedPacket> encrypted(
13130 AssemblePacketFromFragments(fragments));
13131
13132 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -070013133 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
nharper8b6d63a2019-05-03 10:34:53 -070013134 EXPECT_EQ("Invalid public header type for expected version.",
13135 framer_.detailed_error());
nharpera745e392019-04-19 12:05:15 -070013136 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
13137}
13138
nharper3f283562019-05-02 16:37:12 -070013139TEST_P(QuicFramerTest, ProcessMismatchedHeaderVersion) {
13140 // The framer needs to have Perspective::IS_SERVER and configured to infer the
13141 // packet header type from the packet (not the version). The framer's version
13142 // needs to be one that uses the IETF packet format.
13143 if (!framer_.version().KnowsWhichDecrypterToUse()) {
13144 return;
13145 }
13146 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13147
13148 // clang-format off
13149 PacketFragments packet = {
dschinazi072da7c2019-05-07 17:57:42 -070013150 // public flags (Google QUIC header with version present)
nharper3f283562019-05-02 16:37:12 -070013151 {"Unable to read public flags.",
13152 {0x09}},
13153 // connection_id
13154 {"Unable to read ConnectionId.",
13155 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
13156 // version tag
13157 {"Unable to read protocol version.",
13158 {QUIC_VERSION_BYTES}},
13159 // packet number
13160 {"Unable to read packet number.",
13161 {0x01}},
13162 };
13163 // clang-format on
13164
13165 std::unique_ptr<QuicEncryptedPacket> encrypted(
13166 AssemblePacketFromFragments(packet));
13167 framer_.ProcessPacket(*encrypted);
13168
13169 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -070013170 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
nharper8b6d63a2019-05-03 10:34:53 -070013171 EXPECT_EQ("Invalid public header type for expected version.",
13172 framer_.detailed_error());
nharper3f283562019-05-02 16:37:12 -070013173 CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
13174}
13175
dschinazi48ac9192019-07-31 00:07:26 -070013176TEST_P(QuicFramerTest, WriteClientVersionNegotiationProbePacketOld) {
13177 SetQuicFlag(FLAGS_quic_prober_uses_length_prefixed_connection_ids, false);
dschinazide0f6dc2019-05-15 16:10:11 -070013178 // clang-format off
13179 static const char expected_packet[1200] = {
13180 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13181 0xc0,
13182 // Version, part of the IETF space reserved for negotiation.
13183 0xca, 0xba, 0xda, 0xba,
13184 // Destination connection ID length 8, source connection ID length 0.
13185 0x50,
13186 // 8-byte destination connection ID.
13187 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13188 // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13189 // not parse with any known version.
13190 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13191 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13192 // 2 bytes of zeroes to pad to 16 byte boundary.
13193 0x00, 0x00,
13194 // A polite greeting in case a human sees this in tcpdump.
13195 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13196 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13197 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13198 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13199 0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13200 0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13201 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13202 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13203 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13204 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13205 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13206 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13207 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13208 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13209 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13210 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13211 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13212 0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13213 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13214 0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13215 0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13216 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13217 0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13218 };
13219 // clang-format on
13220 char packet[1200];
13221 char destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13222 0x6c, 0x7a, 0x20, 0x21};
13223 EXPECT_TRUE(QuicFramer::WriteClientVersionNegotiationProbePacket(
13224 packet, sizeof(packet), destination_connection_id_bytes,
13225 sizeof(destination_connection_id_bytes)));
dschinazi48ac9192019-07-31 00:07:26 -070013226 test::CompareCharArraysWithHexError("constructed packet", packet,
13227 sizeof(packet), expected_packet,
13228 sizeof(expected_packet));
dschinazide0f6dc2019-05-15 16:10:11 -070013229 QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13230 sizeof(packet), false);
13231 // Make sure we fail to parse this packet for the version under test.
dschinazide0f6dc2019-05-15 16:10:11 -070013232 if (framer_.transport_version() <= QUIC_VERSION_43) {
13233 // We can only parse the connection ID with an IETF parser.
dschinazi48ac9192019-07-31 00:07:26 -070013234 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
dschinazide0f6dc2019-05-15 16:10:11 -070013235 return;
13236 }
dschinazi48ac9192019-07-31 00:07:26 -070013237 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
dschinazide0f6dc2019-05-15 16:10:11 -070013238 ASSERT_TRUE(visitor_.header_.get());
13239 QuicConnectionId probe_payload_connection_id(
13240 reinterpret_cast<const char*>(destination_connection_id_bytes),
13241 sizeof(destination_connection_id_bytes));
13242 EXPECT_EQ(probe_payload_connection_id,
13243 visitor_.header_.get()->destination_connection_id);
dschinazi30ab6db2019-08-13 14:43:32 -070013244
13245 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
fayange3f2f7b2019-09-19 17:01:57 -070013246 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
dschinazi30ab6db2019-08-13 14:43:32 -070013247 bool version_present = false, has_length_prefix = false;
13248 QuicVersionLabel version_label = 0;
13249 ParsedQuicVersion parsed_version = QuicVersionReservedForNegotiation();
13250 QuicConnectionId destination_connection_id = TestConnectionId(0x33);
13251 QuicConnectionId source_connection_id = TestConnectionId(0x34);
13252 bool retry_token_present = true;
13253 QuicStringPiece retry_token;
13254 std::string detailed_error = "foobar";
13255
13256 QuicErrorCode parse_result = QuicFramer::ParsePublicHeaderDispatcher(
fayange3f2f7b2019-09-19 17:01:57 -070013257 encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
13258 &version_present, &has_length_prefix, &version_label, &parsed_version,
dschinazi30ab6db2019-08-13 14:43:32 -070013259 &destination_connection_id, &source_connection_id, &retry_token_present,
13260 &retry_token, &detailed_error);
bncf6f82b12019-10-30 07:01:01 -070013261 EXPECT_THAT(parse_result, IsQuicNoError());
dschinazi30ab6db2019-08-13 14:43:32 -070013262 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
13263 EXPECT_TRUE(version_present);
13264 EXPECT_FALSE(has_length_prefix);
13265 EXPECT_EQ(0xcabadaba, version_label);
13266 EXPECT_EQ(QUIC_VERSION_UNSUPPORTED, parsed_version.transport_version);
13267 EXPECT_EQ(probe_payload_connection_id, destination_connection_id);
13268 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
13269 EXPECT_FALSE(retry_token_present);
13270 EXPECT_EQ(QuicStringPiece(), retry_token);
13271 EXPECT_EQ("", detailed_error);
dschinazide0f6dc2019-05-15 16:10:11 -070013272}
13273
dschinazi48ac9192019-07-31 00:07:26 -070013274TEST_P(QuicFramerTest, WriteClientVersionNegotiationProbePacket) {
13275 SetQuicFlag(FLAGS_quic_prober_uses_length_prefixed_connection_ids, true);
13276 // clang-format off
13277 static const char expected_packet[1200] = {
13278 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13279 0xc0,
13280 // Version, part of the IETF space reserved for negotiation.
13281 0xca, 0xba, 0xda, 0xda,
13282 // Destination connection ID length 8.
13283 0x08,
13284 // 8-byte destination connection ID.
13285 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13286 // Source connection ID length 0.
13287 0x00,
13288 // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13289 // not parse with any known version.
13290 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13291 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13292 // zeroes to pad to 16 byte boundary.
13293 0x00,
13294 // A polite greeting in case a human sees this in tcpdump.
13295 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13296 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13297 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13298 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13299 0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13300 0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13301 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13302 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13303 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13304 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13305 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13306 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13307 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13308 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13309 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13310 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13311 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13312 0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13313 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13314 0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13315 0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13316 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13317 0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13318 };
13319 // clang-format on
13320 char packet[1200];
13321 char destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13322 0x6c, 0x7a, 0x20, 0x21};
13323 EXPECT_TRUE(QuicFramer::WriteClientVersionNegotiationProbePacket(
13324 packet, sizeof(packet), destination_connection_id_bytes,
13325 sizeof(destination_connection_id_bytes)));
13326 test::CompareCharArraysWithHexError("constructed packet", packet,
13327 sizeof(packet), expected_packet,
13328 sizeof(expected_packet));
13329 QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13330 sizeof(packet), false);
dschinazic73506e2019-09-20 13:26:46 -070013331 if (!framer_.version().HasLengthPrefixedConnectionIds()) {
13332 // We can only parse the connection ID with a parser expecting
13333 // length-prefixed connection IDs.
dschinazi48ac9192019-07-31 00:07:26 -070013334 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
13335 return;
13336 }
13337 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
13338 ASSERT_TRUE(visitor_.header_.get());
13339 QuicConnectionId probe_payload_connection_id(
13340 reinterpret_cast<const char*>(destination_connection_id_bytes),
13341 sizeof(destination_connection_id_bytes));
13342 EXPECT_EQ(probe_payload_connection_id,
13343 visitor_.header_.get()->destination_connection_id);
13344}
13345
13346TEST_P(QuicFramerTest, DispatcherParseOldClientVersionNegotiationProbePacket) {
13347 // clang-format off
13348 static const char packet[1200] = {
13349 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13350 0xc0,
13351 // Version, part of the IETF space reserved for negotiation.
13352 0xca, 0xba, 0xda, 0xba,
13353 // Destination connection ID length 8, source connection ID length 0.
13354 0x50,
13355 // 8-byte destination connection ID.
13356 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13357 // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13358 // not parse with any known version.
13359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13360 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13361 // 2 bytes of zeroes to pad to 16 byte boundary.
13362 0x00, 0x00,
13363 // A polite greeting in case a human sees this in tcpdump.
13364 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13365 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13366 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13367 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13368 0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13369 0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13370 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13371 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13372 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13373 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13374 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13375 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13376 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13377 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13378 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13379 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13380 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13381 0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13382 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13383 0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13384 0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13385 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13386 0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13387 };
13388 // clang-format on
13389 char expected_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13390 0x6c, 0x7a, 0x20, 0x21};
13391 QuicConnectionId expected_destination_connection_id(
13392 reinterpret_cast<const char*>(expected_destination_connection_id_bytes),
13393 sizeof(expected_destination_connection_id_bytes));
13394
13395 QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13396 sizeof(packet));
13397 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
fayange3f2f7b2019-09-19 17:01:57 -070013398 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
dschinazi48ac9192019-07-31 00:07:26 -070013399 bool version_present = false, has_length_prefix = true;
13400 QuicVersionLabel version_label = 33;
13401 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
13402 QuicConnectionId destination_connection_id = TestConnectionId(1);
13403 QuicConnectionId source_connection_id = TestConnectionId(2);
13404 bool retry_token_present = true;
13405 QuicStringPiece retry_token;
13406 std::string detailed_error = "foobar";
13407 QuicErrorCode header_parse_result = QuicFramer::ParsePublicHeaderDispatcher(
fayange3f2f7b2019-09-19 17:01:57 -070013408 encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
13409 &version_present, &has_length_prefix, &version_label, &parsed_version,
dschinazi48ac9192019-07-31 00:07:26 -070013410 &destination_connection_id, &source_connection_id, &retry_token_present,
13411 &retry_token, &detailed_error);
bncf6f82b12019-10-30 07:01:01 -070013412 EXPECT_THAT(header_parse_result, IsQuicNoError());
dschinazi48ac9192019-07-31 00:07:26 -070013413 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
13414 EXPECT_TRUE(version_present);
13415 EXPECT_FALSE(has_length_prefix);
13416 EXPECT_EQ(0xcabadaba, version_label);
13417 EXPECT_EQ(expected_destination_connection_id, destination_connection_id);
13418 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
13419 EXPECT_FALSE(retry_token_present);
13420 EXPECT_EQ("", detailed_error);
13421}
13422
13423TEST_P(QuicFramerTest, DispatcherParseClientVersionNegotiationProbePacket) {
13424 // clang-format off
13425 static const char packet[1200] = {
13426 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13427 0xc0,
13428 // Version, part of the IETF space reserved for negotiation.
13429 0xca, 0xba, 0xda, 0xba,
13430 // Destination connection ID length 8.
13431 0x08,
13432 // 8-byte destination connection ID.
13433 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13434 // Source connection ID length 0.
13435 0x00,
13436 // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13437 // not parse with any known version.
13438 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13439 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13440 // 1 byte of zeroes to pad to 16 byte boundary.
13441 0x00,
13442 // A polite greeting in case a human sees this in tcpdump.
13443 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13444 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13445 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13446 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13447 0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13448 0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13449 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13450 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13451 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13452 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13453 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13454 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13455 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13456 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13457 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13458 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13459 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13460 0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13461 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13462 0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13463 0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13464 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13465 0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13466 };
13467 // clang-format on
13468 char expected_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13469 0x6c, 0x7a, 0x20, 0x21};
13470 QuicConnectionId expected_destination_connection_id(
13471 reinterpret_cast<const char*>(expected_destination_connection_id_bytes),
13472 sizeof(expected_destination_connection_id_bytes));
13473
13474 QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13475 sizeof(packet));
13476 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
fayange3f2f7b2019-09-19 17:01:57 -070013477 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
dschinazi48ac9192019-07-31 00:07:26 -070013478 bool version_present = false, has_length_prefix = false;
13479 QuicVersionLabel version_label = 33;
13480 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
13481 QuicConnectionId destination_connection_id = TestConnectionId(1);
13482 QuicConnectionId source_connection_id = TestConnectionId(2);
13483 bool retry_token_present = true;
13484 QuicStringPiece retry_token;
13485 std::string detailed_error = "foobar";
13486 QuicErrorCode header_parse_result = QuicFramer::ParsePublicHeaderDispatcher(
fayange3f2f7b2019-09-19 17:01:57 -070013487 encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
13488 &version_present, &has_length_prefix, &version_label, &parsed_version,
dschinazi48ac9192019-07-31 00:07:26 -070013489 &destination_connection_id, &source_connection_id, &retry_token_present,
13490 &retry_token, &detailed_error);
bncf6f82b12019-10-30 07:01:01 -070013491 EXPECT_THAT(header_parse_result, IsQuicNoError());
dschinazi48ac9192019-07-31 00:07:26 -070013492 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
13493 EXPECT_TRUE(version_present);
13494 EXPECT_TRUE(has_length_prefix);
13495 EXPECT_EQ(0xcabadaba, version_label);
13496 EXPECT_EQ(expected_destination_connection_id, destination_connection_id);
13497 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
13498 EXPECT_EQ("", detailed_error);
13499}
13500
13501TEST_P(QuicFramerTest, ParseServerVersionNegotiationProbeResponseOld) {
13502 SetQuicFlag(FLAGS_quic_prober_uses_length_prefixed_connection_ids, false);
dschinazide0f6dc2019-05-15 16:10:11 -070013503 // clang-format off
13504 const char packet[] = {
13505 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13506 0xc0,
13507 // Version of 0, indicating version negotiation.
13508 0x00, 0x00, 0x00, 0x00,
13509 // Destination connection ID length 0, source connection ID length 8.
13510 0x05,
13511 // 8-byte source connection ID.
13512 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13513 // A few supported versions.
13514 0xaa, 0xaa, 0xaa, 0xaa,
13515 QUIC_VERSION_BYTES,
13516 };
13517 // clang-format on
13518 char probe_payload_bytes[] = {0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21};
dschinazib012d212019-08-01 18:07:26 -070013519 char parsed_probe_payload_bytes[255] = {};
dschinazide0f6dc2019-05-15 16:10:11 -070013520 uint8_t parsed_probe_payload_length = 0;
13521 std::string parse_detailed_error = "";
13522 EXPECT_TRUE(QuicFramer::ParseServerVersionNegotiationProbeResponse(
13523 reinterpret_cast<const char*>(packet), sizeof(packet),
13524 reinterpret_cast<char*>(parsed_probe_payload_bytes),
13525 &parsed_probe_payload_length, &parse_detailed_error));
13526 EXPECT_EQ("", parse_detailed_error);
13527 test::CompareCharArraysWithHexError(
dschinazi48ac9192019-07-31 00:07:26 -070013528 "parsed probe", parsed_probe_payload_bytes, parsed_probe_payload_length,
13529 probe_payload_bytes, sizeof(probe_payload_bytes));
13530}
13531
13532TEST_P(QuicFramerTest, ParseServerVersionNegotiationProbeResponse) {
13533 SetQuicFlag(FLAGS_quic_prober_uses_length_prefixed_connection_ids, true);
13534 // clang-format off
13535 const char packet[] = {
13536 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13537 0xc0,
13538 // Version of 0, indicating version negotiation.
13539 0x00, 0x00, 0x00, 0x00,
13540 // Destination connection ID length 0, source connection ID length 8.
13541 0x00, 0x08,
13542 // 8-byte source connection ID.
13543 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13544 // A few supported versions.
13545 0xaa, 0xaa, 0xaa, 0xaa,
13546 QUIC_VERSION_BYTES,
13547 };
13548 // clang-format on
13549 char probe_payload_bytes[] = {0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21};
dschinazib012d212019-08-01 18:07:26 -070013550 char parsed_probe_payload_bytes[255] = {};
dschinazi48ac9192019-07-31 00:07:26 -070013551 uint8_t parsed_probe_payload_length = 0;
13552 std::string parse_detailed_error = "";
13553 EXPECT_TRUE(QuicFramer::ParseServerVersionNegotiationProbeResponse(
13554 reinterpret_cast<const char*>(packet), sizeof(packet),
13555 reinterpret_cast<char*>(parsed_probe_payload_bytes),
13556 &parsed_probe_payload_length, &parse_detailed_error));
13557 EXPECT_EQ("", parse_detailed_error);
13558 test::CompareCharArraysWithHexError(
13559 "parsed probe", parsed_probe_payload_bytes, parsed_probe_payload_length,
13560 probe_payload_bytes, sizeof(probe_payload_bytes));
dschinazide0f6dc2019-05-15 16:10:11 -070013561}
13562
dschinazi346b7ce2019-06-05 01:38:18 -070013563TEST_P(QuicFramerTest, ClientConnectionIdFromLongHeaderToClient) {
dschinazi7d066ca2019-05-15 17:59:49 -070013564 if (framer_.transport_version() <= QUIC_VERSION_43) {
13565 // This test requires an IETF long header.
13566 return;
13567 }
dschinazi346b7ce2019-06-05 01:38:18 -070013568 SetDecrypterLevel(ENCRYPTION_HANDSHAKE);
dschinazi7d066ca2019-05-15 17:59:49 -070013569 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
dschinazi7d066ca2019-05-15 17:59:49 -070013570 // clang-format off
13571 unsigned char packet[] = {
dschinazi346b7ce2019-06-05 01:38:18 -070013572 // public flags (long header with packet type HANDSHAKE and
dschinazi7d066ca2019-05-15 17:59:49 -070013573 // 4-byte packet number)
fayang36825da2019-08-21 14:01:27 -070013574 0xE3,
dschinazi7d066ca2019-05-15 17:59:49 -070013575 // version
13576 QUIC_VERSION_BYTES,
dschinazi346b7ce2019-06-05 01:38:18 -070013577 // connection ID lengths
dschinazi7d066ca2019-05-15 17:59:49 -070013578 0x50,
13579 // destination connection ID
13580 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13581 // long header packet length
13582 0x05,
13583 // packet number
13584 0x12, 0x34, 0x56, 0x00,
13585 // padding frame
13586 0x00,
13587 };
dschinazic73506e2019-09-20 13:26:46 -070013588 unsigned char packet49[] = {
dschinazi48ac9192019-07-31 00:07:26 -070013589 // public flags (long header with packet type HANDSHAKE and
13590 // 4-byte packet number)
13591 0xE3,
13592 // version
13593 QUIC_VERSION_BYTES,
13594 // destination connection ID length
13595 0x08,
13596 // destination connection ID
13597 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13598 // source connection ID length
13599 0x00,
13600 // long header packet length
13601 0x05,
13602 // packet number
13603 0x12, 0x34, 0x56, 0x00,
13604 // padding frame
13605 0x00,
13606 };
dschinazi7d066ca2019-05-15 17:59:49 -070013607 // clang-format on
dschinazi48ac9192019-07-31 00:07:26 -070013608 unsigned char* p = packet;
13609 size_t p_length = QUIC_ARRAYSIZE(packet);
dschinazic73506e2019-09-20 13:26:46 -070013610 if (framer_.transport_version() >= QUIC_VERSION_49) {
13611 p = packet49;
13612 p_length = QUIC_ARRAYSIZE(packet49);
dschinazi48ac9192019-07-31 00:07:26 -070013613 }
13614 const bool parse_success =
13615 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false));
dschinazi7d066ca2019-05-15 17:59:49 -070013616 if (!QuicUtils::VariableLengthConnectionIdAllowedForVersion(
13617 framer_.transport_version())) {
dschinazi346b7ce2019-06-05 01:38:18 -070013618 EXPECT_FALSE(parse_success);
bncf6f82b12019-10-30 07:01:01 -070013619 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
dschinazi7d066ca2019-05-15 17:59:49 -070013620 EXPECT_EQ("Invalid ConnectionId length.", framer_.detailed_error());
dschinazi346b7ce2019-06-05 01:38:18 -070013621 return;
13622 }
dschinazi346b7ce2019-06-05 01:38:18 -070013623 EXPECT_TRUE(parse_success);
bncf6f82b12019-10-30 07:01:01 -070013624 EXPECT_THAT(framer_.error(), IsQuicNoError());
dschinazi346b7ce2019-06-05 01:38:18 -070013625 EXPECT_EQ("", framer_.detailed_error());
13626 ASSERT_TRUE(visitor_.header_.get());
13627 EXPECT_EQ(FramerTestConnectionId(),
13628 visitor_.header_.get()->destination_connection_id);
13629}
13630
13631TEST_P(QuicFramerTest, ClientConnectionIdFromLongHeaderToServer) {
13632 if (framer_.transport_version() <= QUIC_VERSION_43) {
13633 // This test requires an IETF long header.
13634 return;
13635 }
13636 SetDecrypterLevel(ENCRYPTION_HANDSHAKE);
13637 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13638 // clang-format off
13639 unsigned char packet[] = {
13640 // public flags (long header with packet type HANDSHAKE and
13641 // 4-byte packet number)
fayang36825da2019-08-21 14:01:27 -070013642 0xE3,
dschinazi346b7ce2019-06-05 01:38:18 -070013643 // version
13644 QUIC_VERSION_BYTES,
13645 // connection ID lengths
13646 0x05,
13647 // source connection ID
13648 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13649 // long header packet length
13650 0x05,
13651 // packet number
13652 0x12, 0x34, 0x56, 0x00,
13653 // padding frame
13654 0x00,
13655 };
dschinazic73506e2019-09-20 13:26:46 -070013656 unsigned char packet49[] = {
dschinazi48ac9192019-07-31 00:07:26 -070013657 // public flags (long header with packet type HANDSHAKE and
13658 // 4-byte packet number)
13659 0xE3,
13660 // version
13661 QUIC_VERSION_BYTES,
13662 // connection ID lengths
13663 0x00, 0x08,
13664 // source connection ID
13665 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13666 // long header packet length
13667 0x05,
13668 // packet number
13669 0x12, 0x34, 0x56, 0x00,
13670 // padding frame
13671 0x00,
13672 };
dschinazi346b7ce2019-06-05 01:38:18 -070013673 // clang-format on
dschinazi48ac9192019-07-31 00:07:26 -070013674 unsigned char* p = packet;
13675 size_t p_length = QUIC_ARRAYSIZE(packet);
dschinazic73506e2019-09-20 13:26:46 -070013676 if (framer_.transport_version() >= QUIC_VERSION_49) {
13677 p = packet49;
13678 p_length = QUIC_ARRAYSIZE(packet49);
dschinazi48ac9192019-07-31 00:07:26 -070013679 }
13680 const bool parse_success =
13681 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false));
dschinazi346b7ce2019-06-05 01:38:18 -070013682 if (!QuicUtils::VariableLengthConnectionIdAllowedForVersion(
13683 framer_.transport_version())) {
13684 EXPECT_FALSE(parse_success);
bncf6f82b12019-10-30 07:01:01 -070013685 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
dschinazi346b7ce2019-06-05 01:38:18 -070013686 EXPECT_EQ("Invalid ConnectionId length.", framer_.detailed_error());
13687 return;
13688 }
dschinazi5e1a7b22019-07-31 12:23:21 -070013689 if (!framer_.version().SupportsClientConnectionIds()) {
dschinazi346b7ce2019-06-05 01:38:18 -070013690 EXPECT_FALSE(parse_success);
bncf6f82b12019-10-30 07:01:01 -070013691 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
dschinazi346b7ce2019-06-05 01:38:18 -070013692 EXPECT_EQ("Client connection ID not supported in this version.",
13693 framer_.detailed_error());
13694 return;
13695 }
13696 EXPECT_TRUE(parse_success);
bncf6f82b12019-10-30 07:01:01 -070013697 EXPECT_THAT(framer_.error(), IsQuicNoError());
dschinazi346b7ce2019-06-05 01:38:18 -070013698 EXPECT_EQ("", framer_.detailed_error());
13699 ASSERT_TRUE(visitor_.header_.get());
13700 EXPECT_EQ(FramerTestConnectionId(),
13701 visitor_.header_.get()->source_connection_id);
dschinazi7d066ca2019-05-15 17:59:49 -070013702}
13703
dschinazi334f0232019-05-29 16:08:53 -070013704TEST_P(QuicFramerTest, ProcessAndValidateIetfConnectionIdLengthClient) {
13705 if (framer_.transport_version() <= QUIC_VERSION_43) {
13706 // This test requires an IETF long header.
13707 return;
13708 }
13709 char connection_id_lengths = 0x05;
13710 QuicDataReader reader(&connection_id_lengths, 1);
13711
13712 bool should_update_expected_server_connection_id_length = false;
13713 uint8_t expected_server_connection_id_length = 8;
13714 uint8_t destination_connection_id_length = 0;
13715 uint8_t source_connection_id_length = 8;
13716 std::string detailed_error = "";
13717
13718 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13719 &reader, framer_.version(), Perspective::IS_CLIENT,
13720 should_update_expected_server_connection_id_length,
13721 &expected_server_connection_id_length, &destination_connection_id_length,
13722 &source_connection_id_length, &detailed_error));
13723 EXPECT_EQ(8, expected_server_connection_id_length);
13724 EXPECT_EQ(0, destination_connection_id_length);
13725 EXPECT_EQ(8, source_connection_id_length);
13726 EXPECT_EQ("", detailed_error);
13727
13728 QuicDataReader reader2(&connection_id_lengths, 1);
13729 should_update_expected_server_connection_id_length = true;
13730 expected_server_connection_id_length = 33;
13731 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13732 &reader2, framer_.version(), Perspective::IS_CLIENT,
13733 should_update_expected_server_connection_id_length,
13734 &expected_server_connection_id_length, &destination_connection_id_length,
13735 &source_connection_id_length, &detailed_error));
13736 EXPECT_EQ(8, expected_server_connection_id_length);
13737 EXPECT_EQ(0, destination_connection_id_length);
13738 EXPECT_EQ(8, source_connection_id_length);
13739 EXPECT_EQ("", detailed_error);
13740}
13741
13742TEST_P(QuicFramerTest, ProcessAndValidateIetfConnectionIdLengthServer) {
13743 if (framer_.transport_version() <= QUIC_VERSION_43) {
13744 // This test requires an IETF long header.
13745 return;
13746 }
13747 char connection_id_lengths = 0x50;
13748 QuicDataReader reader(&connection_id_lengths, 1);
13749
13750 bool should_update_expected_server_connection_id_length = false;
13751 uint8_t expected_server_connection_id_length = 8;
13752 uint8_t destination_connection_id_length = 8;
13753 uint8_t source_connection_id_length = 0;
13754 std::string detailed_error = "";
13755
13756 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13757 &reader, framer_.version(), Perspective::IS_SERVER,
13758 should_update_expected_server_connection_id_length,
13759 &expected_server_connection_id_length, &destination_connection_id_length,
13760 &source_connection_id_length, &detailed_error));
13761 EXPECT_EQ(8, expected_server_connection_id_length);
13762 EXPECT_EQ(8, destination_connection_id_length);
13763 EXPECT_EQ(0, source_connection_id_length);
13764 EXPECT_EQ("", detailed_error);
13765
13766 QuicDataReader reader2(&connection_id_lengths, 1);
13767 should_update_expected_server_connection_id_length = true;
13768 expected_server_connection_id_length = 33;
13769 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13770 &reader2, framer_.version(), Perspective::IS_SERVER,
13771 should_update_expected_server_connection_id_length,
13772 &expected_server_connection_id_length, &destination_connection_id_length,
13773 &source_connection_id_length, &detailed_error));
13774 EXPECT_EQ(8, expected_server_connection_id_length);
13775 EXPECT_EQ(8, destination_connection_id_length);
13776 EXPECT_EQ(0, source_connection_id_length);
13777 EXPECT_EQ("", detailed_error);
13778}
13779
fkastenholzb4dade72019-08-05 06:54:20 -070013780TEST_P(QuicFramerTest, TestExtendedErrorCodeParser) {
13781 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070013782 // Extended error codes only in IETF QUIC
fkastenholzb4dade72019-08-05 06:54:20 -070013783 return;
13784 }
fkastenholz488a4622019-08-26 06:24:46 -070013785 QuicConnectionCloseFrame frame;
13786
13787 frame.error_details = "this has no error code info in it";
13788 MaybeExtractQuicErrorCode(&frame);
bncf6f82b12019-10-30 07:01:01 -070013789 EXPECT_THAT(frame.extracted_error_code,
13790 IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
fkastenholz488a4622019-08-26 06:24:46 -070013791 EXPECT_EQ("this has no error code info in it", frame.error_details);
13792
13793 frame.error_details = "1234this does not have the colon in it";
13794 MaybeExtractQuicErrorCode(&frame);
bncf6f82b12019-10-30 07:01:01 -070013795 EXPECT_THAT(frame.extracted_error_code,
13796 IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
fkastenholz488a4622019-08-26 06:24:46 -070013797 EXPECT_EQ("1234this does not have the colon in it", frame.error_details);
13798
13799 frame.error_details = "1a234:this has a colon, but a malformed error number";
13800 MaybeExtractQuicErrorCode(&frame);
bncf6f82b12019-10-30 07:01:01 -070013801 EXPECT_THAT(frame.extracted_error_code,
13802 IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
fkastenholz488a4622019-08-26 06:24:46 -070013803 EXPECT_EQ("1a234:this has a colon, but a malformed error number",
13804 frame.error_details);
13805
13806 frame.error_details = "1234:this is good";
13807 MaybeExtractQuicErrorCode(&frame);
13808 EXPECT_EQ(1234u, frame.extracted_error_code);
13809 EXPECT_EQ("this is good", frame.error_details);
13810
13811 frame.error_details =
13812 "1234 :this is not good, space between last digit and colon";
13813 MaybeExtractQuicErrorCode(&frame);
bncf6f82b12019-10-30 07:01:01 -070013814 EXPECT_THAT(frame.extracted_error_code,
13815 IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
fkastenholz488a4622019-08-26 06:24:46 -070013816 EXPECT_EQ("1234 :this is not good, space between last digit and colon",
13817 frame.error_details);
13818
13819 frame.error_details = "123456789";
13820 MaybeExtractQuicErrorCode(&frame);
bncf6f82b12019-10-30 07:01:01 -070013821 EXPECT_THAT(
13822 frame.extracted_error_code,
13823 IsError(QUIC_IETF_GQUIC_ERROR_MISSING)); // Not good, all numbers, no :
fkastenholz488a4622019-08-26 06:24:46 -070013824 EXPECT_EQ("123456789", frame.error_details);
13825
13826 frame.error_details = "1234:";
13827 MaybeExtractQuicErrorCode(&frame);
fkastenholzb4dade72019-08-05 06:54:20 -070013828 EXPECT_EQ(1234u,
fkastenholz488a4622019-08-26 06:24:46 -070013829 frame.extracted_error_code); // corner case.
13830 EXPECT_EQ("", frame.error_details);
13831
13832 frame.error_details = "1234:5678";
13833 MaybeExtractQuicErrorCode(&frame);
13834 EXPECT_EQ(1234u,
13835 frame.extracted_error_code); // another corner case.
13836 EXPECT_EQ("5678", frame.error_details);
13837
13838 frame.error_details = "12345 6789:";
13839 MaybeExtractQuicErrorCode(&frame);
bncf6f82b12019-10-30 07:01:01 -070013840 EXPECT_THAT(frame.extracted_error_code,
13841 IsError(QUIC_IETF_GQUIC_ERROR_MISSING)); // Not good
fkastenholz488a4622019-08-26 06:24:46 -070013842 EXPECT_EQ("12345 6789:", frame.error_details);
13843
13844 frame.error_details = ":no numbers, is not good";
13845 MaybeExtractQuicErrorCode(&frame);
bncf6f82b12019-10-30 07:01:01 -070013846 EXPECT_THAT(frame.extracted_error_code,
13847 IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
fkastenholz488a4622019-08-26 06:24:46 -070013848 EXPECT_EQ(":no numbers, is not good", frame.error_details);
13849
13850 frame.error_details = "qwer:also no numbers, is not good";
13851 MaybeExtractQuicErrorCode(&frame);
bncf6f82b12019-10-30 07:01:01 -070013852 EXPECT_THAT(frame.extracted_error_code,
13853 IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
fkastenholz488a4622019-08-26 06:24:46 -070013854 EXPECT_EQ("qwer:also no numbers, is not good", frame.error_details);
13855
13856 frame.error_details = " 1234:this is not good, space before first digit";
13857 MaybeExtractQuicErrorCode(&frame);
bncf6f82b12019-10-30 07:01:01 -070013858 EXPECT_THAT(frame.extracted_error_code,
13859 IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
fkastenholz488a4622019-08-26 06:24:46 -070013860 EXPECT_EQ(" 1234:this is not good, space before first digit",
13861 frame.error_details);
13862
13863 frame.error_details = "1234:";
13864 MaybeExtractQuicErrorCode(&frame);
13865 EXPECT_EQ(1234u,
13866 frame.extracted_error_code); // this is good
13867 EXPECT_EQ("", frame.error_details);
fkastenholzb4dade72019-08-05 06:54:20 -070013868}
13869
QUICHE teama6ef0a62019-03-07 20:34:33 -050013870} // namespace
13871} // namespace test
13872} // namespace quic