blob: 700c4cffe77da4df0ec9a22ef50a6907c5256f81 [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>
QUICHE teama6ef0a62019-03-07 20:34:33 -050012#include <vector>
13
14#include "net/third_party/quiche/src/quic/core/crypto/null_decrypter.h"
15#include "net/third_party/quiche/src/quic/core/crypto/null_encrypter.h"
16#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
17#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
18#include "net/third_party/quiche/src/quic/core/quic_connection_id.h"
19#include "net/third_party/quiche/src/quic/core/quic_packets.h"
20#include "net/third_party/quiche/src/quic/core/quic_types.h"
21#include "net/third_party/quiche/src/quic/core/quic_utils.h"
22#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h"
23#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
24#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
25#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
26#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050027#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
28#include "net/third_party/quiche/src/quic/platform/api/quic_text_utils.h"
29#include "net/third_party/quiche/src/quic/test_tools/quic_framer_peer.h"
30#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
31#include "net/third_party/quiche/src/quic/test_tools/simple_data_producer.h"
32
33using testing::_;
34using testing::Return;
35using testing::Truly;
36
37namespace quic {
38namespace test {
39namespace {
40
41const uint64_t kEpoch = UINT64_C(1) << 32;
42const uint64_t kMask = kEpoch - 1;
43
44const QuicUint128 kTestStatelessResetToken = 1010101; // 0x0F69B5
45
46// Use fields in which each byte is distinct to ensure that every byte is
47// framed correctly. The values are otherwise arbitrary.
48QuicConnectionId FramerTestConnectionId() {
49 return TestConnectionId(UINT64_C(0xFEDCBA9876543210));
50}
51
52QuicConnectionId FramerTestConnectionIdPlusOne() {
53 return TestConnectionId(UINT64_C(0xFEDCBA9876543211));
54}
55
QUICHE team8e2e4532019-03-14 14:37:56 -070056QuicConnectionId FramerTestConnectionIdNineBytes() {
57 char connection_id_bytes[9] = {0xFE, 0xDC, 0xBA, 0x98, 0x76,
58 0x54, 0x32, 0x10, 0x42};
59 return QuicConnectionId(connection_id_bytes, sizeof(connection_id_bytes));
60}
61
QUICHE teama6ef0a62019-03-07 20:34:33 -050062const QuicPacketNumber kPacketNumber = QuicPacketNumber(UINT64_C(0x12345678));
63const QuicPacketNumber kSmallLargestObserved =
64 QuicPacketNumber(UINT16_C(0x1234));
65const QuicPacketNumber kSmallMissingPacket = QuicPacketNumber(UINT16_C(0x1233));
66const QuicPacketNumber kLeastUnacked = QuicPacketNumber(UINT64_C(0x012345670));
67const QuicStreamId kStreamId = UINT64_C(0x01020304);
68// Note that the high 4 bits of the stream offset must be less than 0x40
69// in order to ensure that the value can be encoded using VarInt62 encoding.
70const QuicStreamOffset kStreamOffset = UINT64_C(0x3A98FEDC32107654);
71const QuicPublicResetNonceProof kNonceProof = UINT64_C(0xABCDEF0123456789);
72
73// In testing that we can ack the full range of packets...
74// This is the largest packet number that can be represented in IETF QUIC
75// varint62 format.
76const QuicPacketNumber kLargestIetfLargestObserved =
77 QuicPacketNumber(UINT64_C(0x3fffffffffffffff));
78// Encodings for the two bits in a VarInt62 that
79// describe the length of the VarInt61. For binary packet
80// formats in this file, the convention is to code the
81// first byte as
82// kVarInt62FourBytes + 0x<value_in_that_byte>
83const uint8_t kVarInt62OneByte = 0x00;
84const uint8_t kVarInt62TwoBytes = 0x40;
85const uint8_t kVarInt62FourBytes = 0x80;
86const uint8_t kVarInt62EightBytes = 0xc0;
87
88class TestEncrypter : public QuicEncrypter {
89 public:
90 ~TestEncrypter() override {}
91 bool SetKey(QuicStringPiece key) override { return true; }
92 bool SetNoncePrefix(QuicStringPiece nonce_prefix) override { return true; }
93 bool SetIV(QuicStringPiece iv) override { return true; }
QUICHE team2d187972019-03-19 16:23:47 -070094 bool SetHeaderProtectionKey(QuicStringPiece key) override { return true; }
QUICHE teama6ef0a62019-03-07 20:34:33 -050095 bool EncryptPacket(uint64_t packet_number,
96 QuicStringPiece associated_data,
97 QuicStringPiece plaintext,
98 char* output,
99 size_t* output_length,
100 size_t max_output_length) override {
101 packet_number_ = QuicPacketNumber(packet_number);
vasilvvc48c8712019-03-11 13:38:16 -0700102 associated_data_ = std::string(associated_data);
103 plaintext_ = std::string(plaintext);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500104 memcpy(output, plaintext.data(), plaintext.length());
105 *output_length = plaintext.length();
106 return true;
107 }
QUICHE team2d187972019-03-19 16:23:47 -0700108 std::string GenerateHeaderProtectionMask(QuicStringPiece sample) override {
109 return std::string(5, 0);
110 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500111 size_t GetKeySize() const override { return 0; }
112 size_t GetNoncePrefixSize() const override { return 0; }
113 size_t GetIVSize() const override { return 0; }
114 size_t GetMaxPlaintextSize(size_t ciphertext_size) const override {
115 return ciphertext_size;
116 }
117 size_t GetCiphertextSize(size_t plaintext_size) const override {
118 return plaintext_size;
119 }
120 QuicStringPiece GetKey() const override { return QuicStringPiece(); }
121 QuicStringPiece GetNoncePrefix() const override { return QuicStringPiece(); }
122
123 QuicPacketNumber packet_number_;
vasilvvc48c8712019-03-11 13:38:16 -0700124 std::string associated_data_;
125 std::string plaintext_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500126};
127
128class TestDecrypter : public QuicDecrypter {
129 public:
130 ~TestDecrypter() override {}
131 bool SetKey(QuicStringPiece key) override { return true; }
132 bool SetNoncePrefix(QuicStringPiece nonce_prefix) override { return true; }
133 bool SetIV(QuicStringPiece iv) override { return true; }
QUICHE team2d187972019-03-19 16:23:47 -0700134 bool SetHeaderProtectionKey(QuicStringPiece key) override { return true; }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500135 bool SetPreliminaryKey(QuicStringPiece key) override {
136 QUIC_BUG << "should not be called";
137 return false;
138 }
139 bool SetDiversificationNonce(const DiversificationNonce& key) override {
140 return true;
141 }
142 bool DecryptPacket(uint64_t packet_number,
143 QuicStringPiece associated_data,
144 QuicStringPiece ciphertext,
145 char* output,
146 size_t* output_length,
147 size_t max_output_length) override {
148 packet_number_ = QuicPacketNumber(packet_number);
vasilvvc48c8712019-03-11 13:38:16 -0700149 associated_data_ = std::string(associated_data);
150 ciphertext_ = std::string(ciphertext);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500151 memcpy(output, ciphertext.data(), ciphertext.length());
152 *output_length = ciphertext.length();
153 return true;
154 }
QUICHE team2d187972019-03-19 16:23:47 -0700155 std::string GenerateHeaderProtectionMask(
156 QuicDataReader* sample_reader) override {
157 return std::string(5, 0);
158 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500159 size_t GetKeySize() const override { return 0; }
160 size_t GetIVSize() const override { return 0; }
161 QuicStringPiece GetKey() const override { return QuicStringPiece(); }
162 QuicStringPiece GetNoncePrefix() const override { return QuicStringPiece(); }
163 // Use a distinct value starting with 0xFFFFFF, which is never used by TLS.
164 uint32_t cipher_id() const override { return 0xFFFFFFF2; }
165 QuicPacketNumber packet_number_;
vasilvvc48c8712019-03-11 13:38:16 -0700166 std::string associated_data_;
167 std::string ciphertext_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500168};
169
170class TestQuicVisitor : public QuicFramerVisitorInterface {
171 public:
172 TestQuicVisitor()
173 : error_count_(0),
174 version_mismatch_(0),
175 packet_count_(0),
176 frame_count_(0),
177 complete_packets_(0),
178 accept_packet_(true),
179 accept_public_header_(true) {}
180
181 ~TestQuicVisitor() override {}
182
183 void OnError(QuicFramer* f) override {
184 QUIC_DLOG(INFO) << "QuicFramer Error: " << QuicErrorCodeToString(f->error())
185 << " (" << f->error() << ")";
186 ++error_count_;
187 }
188
189 void OnPacket() override {}
190
191 void OnPublicResetPacket(const QuicPublicResetPacket& packet) override {
192 public_reset_packet_ = QuicMakeUnique<QuicPublicResetPacket>((packet));
193 }
194
195 void OnVersionNegotiationPacket(
196 const QuicVersionNegotiationPacket& packet) override {
197 version_negotiation_packet_ =
198 QuicMakeUnique<QuicVersionNegotiationPacket>((packet));
199 }
200
dschinazi244f6dc2019-05-06 15:45:16 -0700201 void OnRetryPacket(QuicConnectionId original_connection_id,
202 QuicConnectionId new_connection_id,
203 QuicStringPiece retry_token) override {
204 retry_original_connection_id_ =
205 QuicMakeUnique<QuicConnectionId>(original_connection_id);
206 retry_new_connection_id_ =
207 QuicMakeUnique<QuicConnectionId>(new_connection_id);
208 retry_token_ = QuicMakeUnique<std::string>(std::string(retry_token));
209 }
210
QUICHE teama6ef0a62019-03-07 20:34:33 -0500211 bool OnProtocolVersionMismatch(ParsedQuicVersion received_version,
212 PacketHeaderFormat /*form*/) override {
213 QUIC_DLOG(INFO) << "QuicFramer Version Mismatch, version: "
214 << received_version;
215 ++version_mismatch_;
216 return true;
217 }
218
219 bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override {
220 header_ = QuicMakeUnique<QuicPacketHeader>((header));
221 return accept_public_header_;
222 }
223
224 bool OnUnauthenticatedHeader(const QuicPacketHeader& header) override {
225 return true;
226 }
227
228 void OnDecryptedPacket(EncryptionLevel level) override {}
229
230 bool OnPacketHeader(const QuicPacketHeader& header) override {
231 ++packet_count_;
232 header_ = QuicMakeUnique<QuicPacketHeader>((header));
233 return accept_packet_;
234 }
235
236 void OnCoalescedPacket(const QuicEncryptedPacket& packet) override {
237 size_t coalesced_data_length = packet.length();
238 char* coalesced_data = new char[coalesced_data_length];
239 memcpy(coalesced_data, packet.data(), coalesced_data_length);
240 coalesced_packets_.push_back(QuicMakeUnique<QuicEncryptedPacket>(
241 coalesced_data, coalesced_data_length,
242 /*owns_buffer=*/true));
243 }
244
245 bool OnStreamFrame(const QuicStreamFrame& frame) override {
246 ++frame_count_;
247 // Save a copy of the data so it is valid after the packet is processed.
vasilvvc48c8712019-03-11 13:38:16 -0700248 std::string* string_data =
249 new std::string(frame.data_buffer, frame.data_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500250 stream_data_.push_back(QuicWrapUnique(string_data));
251 stream_frames_.push_back(QuicMakeUnique<QuicStreamFrame>(
252 frame.stream_id, frame.fin, frame.offset, *string_data));
253 return true;
254 }
255
256 bool OnCryptoFrame(const QuicCryptoFrame& frame) override {
257 ++frame_count_;
258 // Save a copy of the data so it is valid after the packet is processed.
vasilvvc48c8712019-03-11 13:38:16 -0700259 std::string* string_data =
260 new std::string(frame.data_buffer, frame.data_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500261 crypto_data_.push_back(QuicWrapUnique(string_data));
262 crypto_frames_.push_back(QuicMakeUnique<QuicCryptoFrame>(
QUICHE team6987b4a2019-03-15 16:23:04 -0700263 ENCRYPTION_INITIAL, frame.offset, *string_data));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500264 return true;
265 }
266
267 bool OnAckFrameStart(QuicPacketNumber largest_acked,
268 QuicTime::Delta ack_delay_time) override {
269 ++frame_count_;
270 QuicAckFrame ack_frame;
271 ack_frame.largest_acked = largest_acked;
272 ack_frame.ack_delay_time = ack_delay_time;
273 ack_frames_.push_back(QuicMakeUnique<QuicAckFrame>(ack_frame));
274 return true;
275 }
276
277 bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) override {
278 DCHECK(!ack_frames_.empty());
279 ack_frames_[ack_frames_.size() - 1]->packets.AddRange(start, end);
280 return true;
281 }
282
283 bool OnAckTimestamp(QuicPacketNumber packet_number,
284 QuicTime timestamp) override {
285 ack_frames_[ack_frames_.size() - 1]->received_packet_times.push_back(
286 std::make_pair(packet_number, timestamp));
287 return true;
288 }
289
290 bool OnAckFrameEnd(QuicPacketNumber /*start*/) override { return true; }
291
292 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override {
293 ++frame_count_;
294 stop_waiting_frames_.push_back(QuicMakeUnique<QuicStopWaitingFrame>(frame));
295 return true;
296 }
297
298 bool OnPaddingFrame(const QuicPaddingFrame& frame) override {
299 padding_frames_.push_back(QuicMakeUnique<QuicPaddingFrame>(frame));
300 return true;
301 }
302
303 bool OnPingFrame(const QuicPingFrame& frame) override {
304 ++frame_count_;
305 ping_frames_.push_back(QuicMakeUnique<QuicPingFrame>(frame));
306 return true;
307 }
308
309 bool OnMessageFrame(const QuicMessageFrame& frame) override {
310 ++frame_count_;
311 message_frames_.push_back(
312 QuicMakeUnique<QuicMessageFrame>(frame.data, frame.message_length));
313 return true;
314 }
315
316 void OnPacketComplete() override { ++complete_packets_; }
317
318 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override {
319 rst_stream_frame_ = frame;
320 return true;
321 }
322
323 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override {
324 connection_close_frame_ = frame;
325 return true;
326 }
327
QUICHE teama6ef0a62019-03-07 20:34:33 -0500328 bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override {
329 stop_sending_frame_ = frame;
330 return true;
331 }
332
333 bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override {
334 path_challenge_frame_ = frame;
335 return true;
336 }
337
338 bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override {
339 path_response_frame_ = frame;
340 return true;
341 }
342
343 bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override {
344 goaway_frame_ = frame;
345 return true;
346 }
347
fkastenholz3c4eabf2019-04-22 07:49:59 -0700348 bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& frame) override {
349 max_streams_frame_ = frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500350 return true;
351 }
352
fkastenholz3c4eabf2019-04-22 07:49:59 -0700353 bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame) override {
354 streams_blocked_frame_ = frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500355 return true;
356 }
357
358 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override {
359 window_update_frame_ = frame;
360 return true;
361 }
362
363 bool OnBlockedFrame(const QuicBlockedFrame& frame) override {
364 blocked_frame_ = frame;
365 return true;
366 }
367
368 bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override {
369 new_connection_id_ = frame;
370 return true;
371 }
372
373 bool OnRetireConnectionIdFrame(
374 const QuicRetireConnectionIdFrame& frame) override {
375 retire_connection_id_ = frame;
376 return true;
377 }
378
379 bool OnNewTokenFrame(const QuicNewTokenFrame& frame) override {
380 new_token_ = frame;
381 return true;
382 }
383
384 bool IsValidStatelessResetToken(QuicUint128 token) const override {
385 return token == kTestStatelessResetToken;
386 }
387
388 void OnAuthenticatedIetfStatelessResetPacket(
389 const QuicIetfStatelessResetPacket& packet) override {
390 stateless_reset_packet_ =
391 QuicMakeUnique<QuicIetfStatelessResetPacket>(packet);
392 }
393
394 // Counters from the visitor_ callbacks.
395 int error_count_;
396 int version_mismatch_;
397 int packet_count_;
398 int frame_count_;
399 int complete_packets_;
400 bool accept_packet_;
401 bool accept_public_header_;
402
403 std::unique_ptr<QuicPacketHeader> header_;
404 std::unique_ptr<QuicPublicResetPacket> public_reset_packet_;
405 std::unique_ptr<QuicIetfStatelessResetPacket> stateless_reset_packet_;
406 std::unique_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_;
dschinazi244f6dc2019-05-06 15:45:16 -0700407 std::unique_ptr<QuicConnectionId> retry_original_connection_id_;
408 std::unique_ptr<QuicConnectionId> retry_new_connection_id_;
409 std::unique_ptr<std::string> retry_token_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500410 std::vector<std::unique_ptr<QuicStreamFrame>> stream_frames_;
411 std::vector<std::unique_ptr<QuicCryptoFrame>> crypto_frames_;
412 std::vector<std::unique_ptr<QuicAckFrame>> ack_frames_;
413 std::vector<std::unique_ptr<QuicStopWaitingFrame>> stop_waiting_frames_;
414 std::vector<std::unique_ptr<QuicPaddingFrame>> padding_frames_;
415 std::vector<std::unique_ptr<QuicPingFrame>> ping_frames_;
416 std::vector<std::unique_ptr<QuicMessageFrame>> message_frames_;
417 std::vector<std::unique_ptr<QuicEncryptedPacket>> coalesced_packets_;
418 QuicRstStreamFrame rst_stream_frame_;
419 QuicConnectionCloseFrame connection_close_frame_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500420 QuicStopSendingFrame stop_sending_frame_;
421 QuicGoAwayFrame goaway_frame_;
422 QuicPathChallengeFrame path_challenge_frame_;
423 QuicPathResponseFrame path_response_frame_;
424 QuicWindowUpdateFrame window_update_frame_;
425 QuicBlockedFrame blocked_frame_;
fkastenholz3c4eabf2019-04-22 07:49:59 -0700426 QuicStreamsBlockedFrame streams_blocked_frame_;
427 QuicMaxStreamsFrame max_streams_frame_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500428 QuicNewConnectionIdFrame new_connection_id_;
429 QuicRetireConnectionIdFrame retire_connection_id_;
430 QuicNewTokenFrame new_token_;
vasilvvc48c8712019-03-11 13:38:16 -0700431 std::vector<std::unique_ptr<std::string>> stream_data_;
432 std::vector<std::unique_ptr<std::string>> crypto_data_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500433};
434
435// Simple struct for defining a packet's content, and associated
436// parse error.
437struct PacketFragment {
vasilvvc48c8712019-03-11 13:38:16 -0700438 std::string error_if_missing;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500439 std::vector<unsigned char> fragment;
440};
441
442using PacketFragments = std::vector<struct PacketFragment>;
443
444ParsedQuicVersionVector AllSupportedVersionsIncludingTls() {
445 QuicFlagSaver flags;
wub49855982019-05-01 14:16:26 -0700446 SetQuicFlag(FLAGS_quic_supports_tls_handshake, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500447 return AllSupportedVersions();
448}
449
450class QuicFramerTest : public QuicTestWithParam<ParsedQuicVersion> {
451 public:
452 QuicFramerTest()
453 : encrypter_(new test::TestEncrypter()),
454 decrypter_(new test::TestDecrypter()),
455 version_(GetParam()),
456 start_(QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(0x10)),
457 framer_(AllSupportedVersionsIncludingTls(),
458 start_,
459 Perspective::IS_SERVER,
460 kQuicDefaultConnectionIdLength) {
wub49855982019-05-01 14:16:26 -0700461 SetQuicFlag(FLAGS_quic_supports_tls_handshake, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500462 framer_.set_version(version_);
zhongyi546cc452019-04-12 15:27:49 -0700463 if (framer_.version().KnowsWhichDecrypterToUse()) {
464 framer_.InstallDecrypter(ENCRYPTION_INITIAL,
465 std::unique_ptr<QuicDecrypter>(decrypter_));
466 } else {
467 framer_.SetDecrypter(ENCRYPTION_INITIAL,
468 std::unique_ptr<QuicDecrypter>(decrypter_));
469 }
QUICHE team6987b4a2019-03-15 16:23:04 -0700470 framer_.SetEncrypter(ENCRYPTION_INITIAL,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500471 std::unique_ptr<QuicEncrypter>(encrypter_));
472
473 framer_.set_visitor(&visitor_);
474 framer_.InferPacketHeaderTypeFromVersion();
475 }
476
zhongyi546cc452019-04-12 15:27:49 -0700477 void SetDecrypterLevel(EncryptionLevel level) {
478 if (!framer_.version().KnowsWhichDecrypterToUse()) {
479 return;
480 }
481 decrypter_ = new TestDecrypter();
482 framer_.InstallDecrypter(level, std::unique_ptr<QuicDecrypter>(decrypter_));
483 }
484
QUICHE teama6ef0a62019-03-07 20:34:33 -0500485 // Helper function to get unsigned char representation of the handshake
486 // protocol byte of the current QUIC version number.
487 unsigned char GetQuicVersionProtocolByte() {
488 return (CreateQuicVersionLabel(version_) >> 24) & 0xff;
489 }
490
491 // Helper function to get unsigned char representation of digit in the
492 // units place of the current QUIC version number.
493 unsigned char GetQuicVersionDigitOnes() {
494 return CreateQuicVersionLabel(version_) & 0xff;
495 }
496
497 // Helper function to get unsigned char representation of digit in the
498 // tens place of the current QUIC version number.
499 unsigned char GetQuicVersionDigitTens() {
500 return (CreateQuicVersionLabel(version_) >> 8) & 0xff;
501 }
502
503 bool CheckEncryption(QuicPacketNumber packet_number, QuicPacket* packet) {
504 if (packet_number != encrypter_->packet_number_) {
505 QUIC_LOG(ERROR) << "Encrypted incorrect packet number. expected "
506 << packet_number
507 << " actual: " << encrypter_->packet_number_;
508 return false;
509 }
510 if (packet->AssociatedData(framer_.transport_version()) !=
511 encrypter_->associated_data_) {
512 QUIC_LOG(ERROR) << "Encrypted incorrect associated data. expected "
513 << packet->AssociatedData(framer_.transport_version())
514 << " actual: " << encrypter_->associated_data_;
515 return false;
516 }
517 if (packet->Plaintext(framer_.transport_version()) !=
518 encrypter_->plaintext_) {
519 QUIC_LOG(ERROR) << "Encrypted incorrect plaintext data. expected "
520 << packet->Plaintext(framer_.transport_version())
521 << " actual: " << encrypter_->plaintext_;
522 return false;
523 }
524 return true;
525 }
526
527 bool CheckDecryption(const QuicEncryptedPacket& encrypted,
528 bool includes_version,
529 bool includes_diversification_nonce,
530 QuicConnectionIdLength destination_connection_id_length,
531 QuicConnectionIdLength source_connection_id_length) {
532 return CheckDecryption(
533 encrypted, includes_version, includes_diversification_nonce,
534 destination_connection_id_length, source_connection_id_length,
535 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
536 }
537
538 bool CheckDecryption(
539 const QuicEncryptedPacket& encrypted,
540 bool includes_version,
541 bool includes_diversification_nonce,
542 QuicConnectionIdLength destination_connection_id_length,
543 QuicConnectionIdLength source_connection_id_length,
544 QuicVariableLengthIntegerLength retry_token_length_length,
545 size_t retry_token_length,
546 QuicVariableLengthIntegerLength length_length) {
547 if (visitor_.header_->packet_number != decrypter_->packet_number_) {
548 QUIC_LOG(ERROR) << "Decrypted incorrect packet number. expected "
549 << visitor_.header_->packet_number
550 << " actual: " << decrypter_->packet_number_;
551 return false;
552 }
553 QuicStringPiece associated_data =
554 QuicFramer::GetAssociatedDataFromEncryptedPacket(
555 framer_.transport_version(), encrypted,
556 destination_connection_id_length, source_connection_id_length,
557 includes_version, includes_diversification_nonce,
558 PACKET_4BYTE_PACKET_NUMBER, retry_token_length_length,
559 retry_token_length, length_length);
560 if (associated_data != decrypter_->associated_data_) {
561 QUIC_LOG(ERROR) << "Decrypted incorrect associated data. expected "
562 << QuicTextUtils::HexEncode(associated_data)
563 << " actual: "
564 << QuicTextUtils::HexEncode(decrypter_->associated_data_);
565 return false;
566 }
567 QuicStringPiece ciphertext(
568 encrypted.AsStringPiece().substr(GetStartOfEncryptedData(
569 framer_.transport_version(), destination_connection_id_length,
570 source_connection_id_length, includes_version,
571 includes_diversification_nonce, PACKET_4BYTE_PACKET_NUMBER,
572 retry_token_length_length, retry_token_length, length_length)));
573 if (ciphertext != decrypter_->ciphertext_) {
574 QUIC_LOG(ERROR) << "Decrypted incorrect ciphertext data. expected "
575 << QuicTextUtils::HexEncode(ciphertext) << " actual: "
576 << QuicTextUtils::HexEncode(decrypter_->ciphertext_)
577 << " associated data: "
578 << QuicTextUtils::HexEncode(associated_data);
579 return false;
580 }
581 return true;
582 }
583
584 char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); }
585
586 // Creates a new QuicEncryptedPacket by concatenating the various
587 // packet fragments in |fragments|.
588 std::unique_ptr<QuicEncryptedPacket> AssemblePacketFromFragments(
589 const PacketFragments& fragments) {
dschinazi66dea072019-04-09 11:41:06 -0700590 char* buffer = new char[kMaxOutgoingPacketSize + 1];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500591 size_t len = 0;
592 for (const auto& fragment : fragments) {
593 memcpy(buffer + len, fragment.fragment.data(), fragment.fragment.size());
594 len += fragment.fragment.size();
595 }
596 return QuicMakeUnique<QuicEncryptedPacket>(buffer, len, true);
597 }
598
599 void CheckFramingBoundaries(const PacketFragments& fragments,
600 QuicErrorCode error_code) {
601 std::unique_ptr<QuicEncryptedPacket> packet(
602 AssemblePacketFromFragments(fragments));
603 // Check all the various prefixes of |packet| for the expected
604 // parse error and error code.
605 for (size_t i = 0; i < packet->length(); ++i) {
vasilvvc48c8712019-03-11 13:38:16 -0700606 std::string expected_error;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500607 size_t len = 0;
608 for (const auto& fragment : fragments) {
609 len += fragment.fragment.size();
610 if (i < len) {
611 expected_error = fragment.error_if_missing;
612 break;
613 }
614 }
615
616 if (expected_error.empty())
617 continue;
618
619 CheckProcessingFails(*packet, i, expected_error, error_code);
620 }
621 }
622
623 void CheckProcessingFails(const QuicEncryptedPacket& packet,
624 size_t len,
vasilvvc48c8712019-03-11 13:38:16 -0700625 std::string expected_error,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500626 QuicErrorCode error_code) {
627 QuicEncryptedPacket encrypted(packet.data(), len, false);
628 EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
629 EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len;
630 EXPECT_EQ(error_code, framer_.error()) << "len: " << len;
631 }
632
633 void CheckProcessingFails(unsigned char* packet,
634 size_t len,
vasilvvc48c8712019-03-11 13:38:16 -0700635 std::string expected_error,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500636 QuicErrorCode error_code) {
637 QuicEncryptedPacket encrypted(AsChars(packet), len, false);
638 EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
639 EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len;
640 EXPECT_EQ(error_code, framer_.error()) << "len: " << len;
641 }
642
643 // Checks if the supplied string matches data in the supplied StreamFrame.
vasilvvc48c8712019-03-11 13:38:16 -0700644 void CheckStreamFrameData(std::string str, QuicStreamFrame* frame) {
645 EXPECT_EQ(str, std::string(frame->data_buffer, frame->data_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500646 }
647
648 void CheckCalculatePacketNumber(uint64_t expected_packet_number,
649 QuicPacketNumber last_packet_number) {
650 uint64_t wire_packet_number = expected_packet_number & kMask;
651 EXPECT_EQ(expected_packet_number,
652 QuicFramerPeer::CalculatePacketNumberFromWire(
653 &framer_, PACKET_4BYTE_PACKET_NUMBER, last_packet_number,
654 wire_packet_number))
655 << "last_packet_number: " << last_packet_number
656 << " wire_packet_number: " << wire_packet_number;
657 }
658
659 std::unique_ptr<QuicPacket> BuildDataPacket(const QuicPacketHeader& header,
660 const QuicFrames& frames) {
661 return BuildUnsizedDataPacket(&framer_, header, frames);
662 }
663
664 std::unique_ptr<QuicPacket> BuildDataPacket(const QuicPacketHeader& header,
665 const QuicFrames& frames,
666 size_t packet_size) {
667 return BuildUnsizedDataPacket(&framer_, header, frames, packet_size);
668 }
669
670 // N starts at 1.
671 QuicStreamId GetNthStreamid(QuicTransportVersion transport_version,
672 Perspective perspective,
673 bool bidirectional,
674 int n) {
675 if (bidirectional) {
676 return QuicUtils::GetFirstBidirectionalStreamId(transport_version,
677 perspective) +
678 ((n - 1) * QuicUtils::StreamIdDelta(transport_version));
679 }
680 // Unidirectional
681 return QuicUtils::GetFirstUnidirectionalStreamId(transport_version,
682 perspective) +
683 ((n - 1) * QuicUtils::StreamIdDelta(transport_version));
684 }
685
686 test::TestEncrypter* encrypter_;
687 test::TestDecrypter* decrypter_;
688 ParsedQuicVersion version_;
689 QuicTime start_;
690 QuicFramer framer_;
691 test::TestQuicVisitor visitor_;
692 SimpleBufferAllocator allocator_;
693};
694
695// Multiple test cases of QuicFramerTest use byte arrays to define packets for
696// testing, and these byte arrays contain the QUIC version. This macro explodes
697// the 32-bit version into four bytes in network order. Since it uses methods of
698// QuicFramerTest, it is only valid to use this in a QuicFramerTest.
699#define QUIC_VERSION_BYTES \
700 GetQuicVersionProtocolByte(), '0', GetQuicVersionDigitTens(), \
701 GetQuicVersionDigitOnes()
702
703// Run all framer tests with all supported versions of QUIC.
704INSTANTIATE_TEST_SUITE_P(
705 QuicFramerTests,
706 QuicFramerTest,
707 ::testing::ValuesIn(AllSupportedVersionsIncludingTls()));
708
709TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochStart) {
710 // A few quick manual sanity checks.
711 CheckCalculatePacketNumber(UINT64_C(1), QuicPacketNumber());
712 CheckCalculatePacketNumber(kEpoch + 1, QuicPacketNumber(kMask));
713 CheckCalculatePacketNumber(kEpoch, QuicPacketNumber(kMask));
714 for (uint64_t j = 0; j < 10; j++) {
715 CheckCalculatePacketNumber(j, QuicPacketNumber());
716 CheckCalculatePacketNumber(kEpoch - 1 - j, QuicPacketNumber());
717 }
718
719 // Cases where the last number was close to the start of the range.
720 for (QuicPacketNumber last = QuicPacketNumber(1); last < QuicPacketNumber(10);
721 last++) {
722 // Small numbers should not wrap (even if they're out of order).
723 for (uint64_t j = 0; j < 10; j++) {
724 CheckCalculatePacketNumber(j, last);
725 }
726
727 // Large numbers should not wrap either (because we're near 0 already).
728 for (uint64_t j = 0; j < 10; j++) {
729 CheckCalculatePacketNumber(kEpoch - 1 - j, last);
730 }
731 }
732}
733
734TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochEnd) {
735 // Cases where the last number was close to the end of the range
736 for (uint64_t i = 0; i < 10; i++) {
737 QuicPacketNumber last = QuicPacketNumber(kEpoch - i);
738
739 // Small numbers should wrap.
740 for (uint64_t j = 0; j < 10; j++) {
741 CheckCalculatePacketNumber(kEpoch + j, last);
742 }
743
744 // Large numbers should not (even if they're out of order).
745 for (uint64_t j = 0; j < 10; j++) {
746 CheckCalculatePacketNumber(kEpoch - 1 - j, last);
747 }
748 }
749}
750
751// Next check where we're in a non-zero epoch to verify we handle
752// reverse wrapping, too.
753TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearPrevEpoch) {
754 const uint64_t prev_epoch = 1 * kEpoch;
755 const uint64_t cur_epoch = 2 * kEpoch;
756 // Cases where the last number was close to the start of the range
757 for (uint64_t i = 0; i < 10; i++) {
758 QuicPacketNumber last = QuicPacketNumber(cur_epoch + i);
759 // Small number should not wrap (even if they're out of order).
760 for (uint64_t j = 0; j < 10; j++) {
761 CheckCalculatePacketNumber(cur_epoch + j, last);
762 }
763
764 // But large numbers should reverse wrap.
765 for (uint64_t j = 0; j < 10; j++) {
766 uint64_t num = kEpoch - 1 - j;
767 CheckCalculatePacketNumber(prev_epoch + num, last);
768 }
769 }
770}
771
772TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextEpoch) {
773 const uint64_t cur_epoch = 2 * kEpoch;
774 const uint64_t next_epoch = 3 * kEpoch;
775 // Cases where the last number was close to the end of the range
776 for (uint64_t i = 0; i < 10; i++) {
777 QuicPacketNumber last = QuicPacketNumber(next_epoch - 1 - i);
778
779 // Small numbers should wrap.
780 for (uint64_t j = 0; j < 10; j++) {
781 CheckCalculatePacketNumber(next_epoch + j, last);
782 }
783
784 // but large numbers should not (even if they're out of order).
785 for (uint64_t j = 0; j < 10; j++) {
786 uint64_t num = kEpoch - 1 - j;
787 CheckCalculatePacketNumber(cur_epoch + num, last);
788 }
789 }
790}
791
792TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextMax) {
793 const uint64_t max_number = std::numeric_limits<uint64_t>::max();
794 const uint64_t max_epoch = max_number & ~kMask;
795
796 // Cases where the last number was close to the end of the range
797 for (uint64_t i = 0; i < 10; i++) {
798 // Subtract 1, because the expected next packet number is 1 more than the
799 // last packet number.
800 QuicPacketNumber last = QuicPacketNumber(max_number - i - 1);
801
802 // Small numbers should not wrap, because they have nowhere to go.
803 for (uint64_t j = 0; j < 10; j++) {
804 CheckCalculatePacketNumber(max_epoch + j, last);
805 }
806
807 // Large numbers should not wrap either.
808 for (uint64_t j = 0; j < 10; j++) {
809 uint64_t num = kEpoch - 1 - j;
810 CheckCalculatePacketNumber(max_epoch + num, last);
811 }
812 }
813}
814
815TEST_P(QuicFramerTest, EmptyPacket) {
816 char packet[] = {0x00};
817 QuicEncryptedPacket encrypted(packet, 0, false);
818 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
819 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
820}
821
822TEST_P(QuicFramerTest, LargePacket) {
zhongyi546cc452019-04-12 15:27:49 -0700823 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500824 // clang-format off
dschinazie8d7fa72019-04-05 14:44:40 -0700825 unsigned char packet[kMaxIncomingPacketSize + 1] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500826 // public flags (8 byte connection_id)
827 0x28,
828 // connection_id
829 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
830 // packet number
831 0x78, 0x56, 0x34, 0x12,
832 // private flags
833 0x00,
834 };
dschinazie8d7fa72019-04-05 14:44:40 -0700835 unsigned char packet44[kMaxIncomingPacketSize + 1] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500836 // type (short header 4 byte packet number)
837 0x32,
838 // connection_id
839 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
840 // packet number
841 0x78, 0x56, 0x34, 0x12,
842 };
dschinazie8d7fa72019-04-05 14:44:40 -0700843 unsigned char packet46[kMaxIncomingPacketSize + 1] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500844 // type (short header 4 byte packet number)
845 0x43,
846 // connection_id
847 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
848 // packet number
849 0x78, 0x56, 0x34, 0x12,
850 };
851 // clang-format on
852 unsigned char* p = packet;
853 size_t p_size = QUIC_ARRAYSIZE(packet);
854 if (framer_.transport_version() > QUIC_VERSION_44) {
855 p = packet46;
856 p_size = QUIC_ARRAYSIZE(packet46);
857 } else if (framer_.transport_version() > QUIC_VERSION_43) {
858 p = packet44;
859 p_size = QUIC_ARRAYSIZE(packet44);
860 }
861
862 const size_t header_size = GetPacketHeaderSize(
863 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
864 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
865 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
866 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
867
dschinazie8d7fa72019-04-05 14:44:40 -0700868 memset(p + header_size, 0, kMaxIncomingPacketSize - header_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500869
870 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
dschinazie8d7fa72019-04-05 14:44:40 -0700871 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500872
873 ASSERT_TRUE(visitor_.header_.get());
874 // Make sure we've parsed the packet header, so we can send an error.
875 EXPECT_EQ(FramerTestConnectionId(),
876 visitor_.header_->destination_connection_id);
877 // Make sure the correct error is propagated.
878 EXPECT_EQ(QUIC_PACKET_TOO_LARGE, framer_.error());
dschinazie8d7fa72019-04-05 14:44:40 -0700879 EXPECT_EQ("Packet too large.", framer_.detailed_error());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500880}
881
882TEST_P(QuicFramerTest, PacketHeader) {
883 if (framer_.transport_version() > QUIC_VERSION_43) {
884 return;
885 }
886
887 // clang-format off
888 PacketFragments packet = {
889 // public flags (8 byte connection_id)
890 {"Unable to read public flags.",
891 {0x28}},
892 // connection_id
893 {"Unable to read ConnectionId.",
894 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
895 // packet number
896 {"Unable to read packet number.",
897 {0x12, 0x34, 0x56, 0x78}},
898 };
899 // clang-format on
900
901 PacketFragments& fragments = packet;
902
903 std::unique_ptr<QuicEncryptedPacket> encrypted(
904 AssemblePacketFromFragments(fragments));
905
906 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
907 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
908 ASSERT_TRUE(visitor_.header_.get());
909 EXPECT_EQ(FramerTestConnectionId(),
910 visitor_.header_->destination_connection_id);
911 EXPECT_FALSE(visitor_.header_->reset_flag);
912 EXPECT_FALSE(visitor_.header_->version_flag);
913 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
914
915 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
916}
917
918TEST_P(QuicFramerTest, LongPacketHeader) {
919 // clang-format off
920 PacketFragments packet44 = {
921 // type (long header with packet type INITIAL)
922 {"Unable to read type.",
923 {0xFF}},
924 // version tag
925 {"Unable to read protocol version.",
926 {QUIC_VERSION_BYTES}},
927 // connection_id length
928 {"Unable to read ConnectionId length.",
929 {0x50}},
930 // connection_id
931 {"Unable to read Destination ConnectionId.",
932 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
933 // packet number
934 {"Unable to read packet number.",
935 {0x12, 0x34, 0x56, 0x78}},
936 };
937 PacketFragments packet46 = {
938 // type (long header with packet type INITIAL)
939 {"Unable to read type.",
940 {0xC3}},
941 // version tag
942 {"Unable to read protocol version.",
943 {QUIC_VERSION_BYTES}},
944 // connection_id length
945 {"Unable to read ConnectionId length.",
946 {0x50}},
947 // connection_id
948 {"Unable to read Destination ConnectionId.",
949 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
950 // packet number
951 {"Unable to read packet number.",
952 {0x12, 0x34, 0x56, 0x78}},
953 };
954 // clang-format on
955
956 if (framer_.transport_version() <= QUIC_VERSION_43 ||
957 QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
958 return;
959 }
960
961 PacketFragments& fragments =
962 framer_.transport_version() > QUIC_VERSION_44 ? packet46 : packet44;
963 std::unique_ptr<QuicEncryptedPacket> encrypted(
964 AssemblePacketFromFragments(fragments));
965
966 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
967 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
968 ASSERT_TRUE(visitor_.header_.get());
969 EXPECT_EQ(FramerTestConnectionId(),
970 visitor_.header_->destination_connection_id);
971 EXPECT_FALSE(visitor_.header_->reset_flag);
972 EXPECT_TRUE(visitor_.header_->version_flag);
973 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
974
975 CheckFramingBoundaries(
976 framer_.transport_version() > QUIC_VERSION_44 ? packet46 : packet44,
977 QUIC_INVALID_PACKET_HEADER);
978}
979
980TEST_P(QuicFramerTest, PacketHeaderWith0ByteConnectionId) {
zhongyi546cc452019-04-12 15:27:49 -0700981 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500982 QuicFramerPeer::SetLastSerializedConnectionId(&framer_,
983 FramerTestConnectionId());
984 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
985
986 // clang-format off
987 PacketFragments packet = {
988 // public flags (0 byte connection_id)
989 {"Unable to read public flags.",
990 {0x20}},
991 // connection_id
992 // packet number
993 {"Unable to read packet number.",
994 {0x12, 0x34, 0x56, 0x78}},
995 };
996
997 PacketFragments packet44 = {
998 // type (short header, 4 byte packet number)
999 {"Unable to read type.",
1000 {0x32}},
1001 // connection_id
1002 // packet number
1003 {"Unable to read packet number.",
1004 {0x12, 0x34, 0x56, 0x78}},
1005 };
1006
1007 PacketFragments packet46 = {
1008 // type (short header, 4 byte packet number)
1009 {"Unable to read type.",
1010 {0x43}},
1011 // connection_id
1012 // packet number
1013 {"Unable to read packet number.",
1014 {0x12, 0x34, 0x56, 0x78}},
1015 };
nharper55fa6132019-05-07 19:37:21 -07001016
1017 PacketFragments packet_hp = {
1018 // type (short header, 4 byte packet number)
1019 {"Unable to read type.",
1020 {0x43}},
1021 // connection_id
1022 // packet number
1023 {"",
1024 {0x12, 0x34, 0x56, 0x78}},
1025 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001026 // clang-format on
1027
1028 PacketFragments& fragments =
nharper55fa6132019-05-07 19:37:21 -07001029 framer_.version().HasHeaderProtection()
1030 ? packet_hp
1031 : framer_.transport_version() > QUIC_VERSION_44
1032 ? packet46
1033 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
1034 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001035 std::unique_ptr<QuicEncryptedPacket> encrypted(
1036 AssemblePacketFromFragments(fragments));
1037 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1038 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1039 ASSERT_TRUE(visitor_.header_.get());
1040 EXPECT_EQ(FramerTestConnectionId(),
1041 visitor_.header_->destination_connection_id);
1042 EXPECT_FALSE(visitor_.header_->reset_flag);
1043 EXPECT_FALSE(visitor_.header_->version_flag);
1044 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1045
1046 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1047}
1048
1049TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) {
zhongyi546cc452019-04-12 15:27:49 -07001050 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001051 // clang-format off
1052 PacketFragments packet = {
1053 // public flags (0 byte connection_id)
1054 {"Unable to read public flags.",
1055 {0x29}},
1056 // connection_id
1057 {"Unable to read ConnectionId.",
1058 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1059 // version tag
1060 {"Unable to read protocol version.",
1061 {QUIC_VERSION_BYTES}},
1062 // packet number
1063 {"Unable to read packet number.",
1064 {0x12, 0x34, 0x56, 0x78}},
1065 };
1066
1067 PacketFragments packet44 = {
1068 // type (long header with packet type ZERO_RTT_PROTECTED)
1069 {"Unable to read type.",
1070 {0xFC}},
1071 // version tag
1072 {"Unable to read protocol version.",
1073 {QUIC_VERSION_BYTES}},
1074 // connection_id length
1075 {"Unable to read ConnectionId length.",
1076 {0x50}},
1077 // connection_id
1078 {"Unable to read Destination ConnectionId.",
1079 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1080 // packet number
1081 {"Unable to read packet number.",
1082 {0x12, 0x34, 0x56, 0x78}},
1083 };
1084
1085 PacketFragments packet46 = {
1086 // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1087 // packet number)
1088 {"Unable to read type.",
1089 {0xD3}},
1090 // version tag
1091 {"Unable to read protocol version.",
1092 {QUIC_VERSION_BYTES}},
1093 // connection_id length
1094 {"Unable to read ConnectionId length.",
1095 {0x50}},
1096 // connection_id
1097 {"Unable to read Destination ConnectionId.",
1098 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1099 // packet number
1100 {"Unable to read packet number.",
1101 {0x12, 0x34, 0x56, 0x78}},
1102 };
1103
1104 PacketFragments packet99 = {
1105 // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1106 // packet number)
1107 {"Unable to read type.",
1108 {0xD3}},
1109 // version tag
1110 {"Unable to read protocol version.",
1111 {QUIC_VERSION_BYTES}},
1112 // connection_id length
1113 {"Unable to read ConnectionId length.",
1114 {0x50}},
1115 // connection_id
1116 {"Unable to read Destination ConnectionId.",
1117 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1118 // long header packet length
1119 {"Unable to read long header payload length.",
1120 {0x04}},
1121 // packet number
1122 {"Long header payload length longer than packet.",
1123 {0x12, 0x34, 0x56, 0x78}},
1124 };
1125 // clang-format on
1126
1127 PacketFragments& fragments =
1128 framer_.transport_version() == QUIC_VERSION_99
1129 ? packet99
1130 : framer_.transport_version() > QUIC_VERSION_44
1131 ? packet46
1132 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
1133 : packet);
1134 std::unique_ptr<QuicEncryptedPacket> encrypted(
1135 AssemblePacketFromFragments(fragments));
1136 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1137 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1138 ASSERT_TRUE(visitor_.header_.get());
1139 EXPECT_EQ(FramerTestConnectionId(),
1140 visitor_.header_->destination_connection_id);
1141 EXPECT_FALSE(visitor_.header_->reset_flag);
1142 EXPECT_TRUE(visitor_.header_->version_flag);
1143 EXPECT_EQ(GetParam(), visitor_.header_->version);
1144 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1145
1146 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1147}
1148
1149TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) {
zhongyi546cc452019-04-12 15:27:49 -07001150 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001151 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1152
1153 // clang-format off
1154 PacketFragments packet = {
1155 // public flags (8 byte connection_id and 4 byte packet number)
1156 {"Unable to read public flags.",
1157 {0x28}},
1158 // connection_id
1159 {"Unable to read ConnectionId.",
1160 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1161 // packet number
1162 {"Unable to read packet number.",
1163 {0x12, 0x34, 0x56, 0x78}},
1164 };
1165
1166 PacketFragments packet44 = {
1167 // type (short header, 4 byte packet number)
1168 {"Unable to read type.",
1169 {0x32}},
1170 // connection_id
1171 {"Unable to read Destination ConnectionId.",
1172 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1173 // packet number
1174 {"Unable to read packet number.",
1175 {0x12, 0x34, 0x56, 0x78}},
1176 };
1177
1178 PacketFragments packet46 = {
1179 // type (short header, 4 byte packet number)
1180 {"Unable to read type.",
1181 {0x43}},
1182 // connection_id
1183 {"Unable to read Destination ConnectionId.",
1184 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1185 // packet number
1186 {"Unable to read packet number.",
1187 {0x12, 0x34, 0x56, 0x78}},
1188 };
nharper55fa6132019-05-07 19:37:21 -07001189
1190 PacketFragments packet_hp = {
1191 // type (short header, 4 byte packet number)
1192 {"Unable to read type.",
1193 {0x43}},
1194 // connection_id
1195 {"Unable to read Destination ConnectionId.",
1196 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1197 // packet number
1198 {"",
1199 {0x12, 0x34, 0x56, 0x78}},
1200 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001201 // clang-format on
1202
1203 PacketFragments& fragments =
nharper55fa6132019-05-07 19:37:21 -07001204 framer_.version().HasHeaderProtection()
1205 ? packet_hp
1206 : framer_.transport_version() > QUIC_VERSION_44
1207 ? packet46
1208 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
1209 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001210 std::unique_ptr<QuicEncryptedPacket> encrypted(
1211 AssemblePacketFromFragments(fragments));
1212 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1213 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1214 ASSERT_TRUE(visitor_.header_.get());
1215 EXPECT_EQ(FramerTestConnectionId(),
1216 visitor_.header_->destination_connection_id);
1217 EXPECT_FALSE(visitor_.header_->reset_flag);
1218 EXPECT_FALSE(visitor_.header_->version_flag);
1219 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1220
1221 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1222}
1223
1224TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) {
zhongyi546cc452019-04-12 15:27:49 -07001225 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001226 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1227
1228 // clang-format off
1229 PacketFragments packet = {
1230 // public flags (8 byte connection_id and 2 byte packet number)
1231 {"Unable to read public flags.",
1232 {0x18}},
1233 // connection_id
1234 {"Unable to read ConnectionId.",
1235 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1236 // packet number
1237 {"Unable to read packet number.",
1238 {0x56, 0x78}},
1239 };
1240
1241 PacketFragments packet44 = {
1242 // type (short header, 2 byte packet number)
1243 {"Unable to read type.",
1244 {0x31}},
1245 // connection_id
1246 {"Unable to read Destination ConnectionId.",
1247 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1248 // packet number
1249 {"Unable to read packet number.",
1250 {0x56, 0x78}},
1251 };
1252
1253 PacketFragments packet46 = {
1254 // type (short header, 2 byte packet number)
1255 {"Unable to read type.",
1256 {0x41}},
1257 // connection_id
1258 {"Unable to read Destination ConnectionId.",
1259 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1260 // packet number
1261 {"Unable to read packet number.",
1262 {0x56, 0x78}},
1263 };
nharper55fa6132019-05-07 19:37:21 -07001264
1265 PacketFragments packet_hp = {
1266 // type (short header, 2 byte packet number)
1267 {"Unable to read type.",
1268 {0x41}},
1269 // connection_id
1270 {"Unable to read Destination ConnectionId.",
1271 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1272 // packet number
1273 {"",
1274 {0x56, 0x78}},
1275 // padding
1276 {"", {0x00, 0x00}},
1277 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001278 // clang-format on
1279
1280 PacketFragments& fragments =
nharper55fa6132019-05-07 19:37:21 -07001281 framer_.version().HasHeaderProtection()
1282 ? packet_hp
1283 : (framer_.transport_version() > QUIC_VERSION_44
1284 ? packet46
1285 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
1286 : packet));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001287 std::unique_ptr<QuicEncryptedPacket> encrypted(
1288 AssemblePacketFromFragments(fragments));
nharper55fa6132019-05-07 19:37:21 -07001289 if (framer_.version().HasHeaderProtection()) {
1290 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
1291 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1292 } else {
1293 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1294 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1295 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001296 ASSERT_TRUE(visitor_.header_.get());
1297 EXPECT_EQ(FramerTestConnectionId(),
1298 visitor_.header_->destination_connection_id);
1299 EXPECT_FALSE(visitor_.header_->reset_flag);
1300 EXPECT_FALSE(visitor_.header_->version_flag);
1301 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1302 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1303
1304 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1305}
1306
1307TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) {
zhongyi546cc452019-04-12 15:27:49 -07001308 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001309 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1310
1311 // clang-format off
1312 PacketFragments packet = {
1313 // public flags (8 byte connection_id and 1 byte packet number)
1314 {"Unable to read public flags.",
1315 {0x08}},
1316 // connection_id
1317 {"Unable to read ConnectionId.",
1318 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1319 // packet number
1320 {"Unable to read packet number.",
1321 {0x78}},
1322 };
1323
1324 PacketFragments packet44 = {
1325 // type (8 byte connection_id and 1 byte packet number)
1326 {"Unable to read type.",
1327 {0x30}},
1328 // connection_id
1329 {"Unable to read Destination ConnectionId.",
1330 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1331 // packet number
1332 {"Unable to read packet number.",
1333 {0x78}},
1334 };
1335
1336 PacketFragments packet46 = {
1337 // type (8 byte connection_id and 1 byte packet number)
1338 {"Unable to read type.",
1339 {0x40}},
1340 // connection_id
1341 {"Unable to read Destination ConnectionId.",
1342 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1343 // packet number
1344 {"Unable to read packet number.",
1345 {0x78}},
1346 };
1347
nharper55fa6132019-05-07 19:37:21 -07001348 PacketFragments packet_hp = {
1349 // type (8 byte connection_id and 1 byte packet number)
1350 {"Unable to read type.",
1351 {0x40}},
1352 // connection_id
1353 {"Unable to read Destination ConnectionId.",
1354 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1355 // packet number
1356 {"",
1357 {0x78}},
1358 // padding
1359 {"", {0x00, 0x00, 0x00}},
1360 };
1361
QUICHE teama6ef0a62019-03-07 20:34:33 -05001362 // clang-format on
1363
1364 PacketFragments& fragments =
nharper55fa6132019-05-07 19:37:21 -07001365 framer_.version().HasHeaderProtection()
1366 ? packet_hp
1367 : (framer_.transport_version() > QUIC_VERSION_44
1368 ? packet46
1369 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
1370 : packet));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001371 std::unique_ptr<QuicEncryptedPacket> encrypted(
1372 AssemblePacketFromFragments(fragments));
nharper55fa6132019-05-07 19:37:21 -07001373 if (framer_.version().HasHeaderProtection()) {
1374 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
1375 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1376 } else {
1377 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1378 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1379 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001380 ASSERT_TRUE(visitor_.header_.get());
1381 EXPECT_EQ(FramerTestConnectionId(),
1382 visitor_.header_->destination_connection_id);
1383 EXPECT_FALSE(visitor_.header_->reset_flag);
1384 EXPECT_FALSE(visitor_.header_->version_flag);
1385 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1386 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1387
1388 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1389}
1390
1391TEST_P(QuicFramerTest, PacketNumberDecreasesThenIncreases) {
zhongyi546cc452019-04-12 15:27:49 -07001392 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001393 // Test the case when a packet is received from the past and future packet
1394 // numbers are still calculated relative to the largest received packet.
1395 QuicPacketHeader header;
1396 header.destination_connection_id = FramerTestConnectionId();
1397 header.reset_flag = false;
1398 header.version_flag = false;
1399 header.packet_number = kPacketNumber - 2;
1400
1401 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
1402 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1403 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
1404 ASSERT_TRUE(data != nullptr);
1405
1406 QuicEncryptedPacket encrypted(data->data(), data->length(), false);
1407 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1408 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1409 ASSERT_TRUE(visitor_.header_.get());
1410 EXPECT_EQ(FramerTestConnectionId(),
1411 visitor_.header_->destination_connection_id);
1412 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1413 EXPECT_EQ(kPacketNumber - 2, visitor_.header_->packet_number);
1414
1415 // Receive a 1 byte packet number.
1416 header.packet_number = kPacketNumber;
1417 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1418 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1419 data = BuildDataPacket(header, frames);
1420 QuicEncryptedPacket encrypted1(data->data(), data->length(), false);
1421 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1422 EXPECT_TRUE(framer_.ProcessPacket(encrypted1));
1423 ASSERT_TRUE(visitor_.header_.get());
1424 EXPECT_EQ(FramerTestConnectionId(),
1425 visitor_.header_->destination_connection_id);
1426 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1427 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1428
1429 // Process a 2 byte packet number 256 packets ago.
1430 header.packet_number = kPacketNumber - 256;
1431 header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
1432 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1433 data = BuildDataPacket(header, frames);
1434 QuicEncryptedPacket encrypted2(data->data(), data->length(), false);
1435 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1436 EXPECT_TRUE(framer_.ProcessPacket(encrypted2));
1437 ASSERT_TRUE(visitor_.header_.get());
1438 EXPECT_EQ(FramerTestConnectionId(),
1439 visitor_.header_->destination_connection_id);
1440 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1441 EXPECT_EQ(kPacketNumber - 256, visitor_.header_->packet_number);
1442
1443 // Process another 1 byte packet number and ensure it works.
1444 header.packet_number = kPacketNumber - 1;
1445 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1446 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1447 data = BuildDataPacket(header, frames);
1448 QuicEncryptedPacket encrypted3(data->data(), data->length(), false);
1449 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1450 EXPECT_TRUE(framer_.ProcessPacket(encrypted3));
1451 ASSERT_TRUE(visitor_.header_.get());
1452 EXPECT_EQ(FramerTestConnectionId(),
1453 visitor_.header_->destination_connection_id);
1454 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1455 EXPECT_EQ(kPacketNumber - 1, visitor_.header_->packet_number);
1456}
1457
1458TEST_P(QuicFramerTest, PacketWithDiversificationNonce) {
zhongyi546cc452019-04-12 15:27:49 -07001459 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001460 // clang-format off
1461 unsigned char packet[] = {
1462 // public flags: includes nonce flag
1463 0x2C,
1464 // connection_id
1465 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1466 // nonce
1467 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1468 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1469 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1470 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1471 // packet number
1472 0x12, 0x34, 0x56, 0x78,
1473
1474 // frame type (padding)
1475 0x00,
1476 0x00, 0x00, 0x00, 0x00
1477 };
1478
1479 unsigned char packet44[] = {
1480 // type: Long header with packet type ZERO_RTT_PROTECTED
1481 0xFC,
1482 // version tag
1483 QUIC_VERSION_BYTES,
1484 // connection_id length
1485 0x05,
1486 // connection_id
1487 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1488 // packet number
1489 0x12, 0x34, 0x56, 0x78,
1490 // nonce
1491 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1492 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1493 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1494 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1495
1496 // frame type (padding)
1497 0x00,
1498 0x00, 0x00, 0x00, 0x00
1499 };
1500
1501 unsigned char packet46[] = {
1502 // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1503 // number.
1504 0xD0,
1505 // version tag
1506 QUIC_VERSION_BYTES,
1507 // connection_id length
1508 0x05,
1509 // connection_id
1510 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1511 // packet number
1512 0x78,
1513 // nonce
1514 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1515 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1516 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1517 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1518
1519 // frame type (padding)
1520 0x00,
1521 0x00, 0x00, 0x00, 0x00
1522 };
1523
1524 unsigned char packet99[] = {
1525 // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1526 // number.
1527 0xD0,
1528 // version tag
1529 QUIC_VERSION_BYTES,
1530 // connection_id length
1531 0x05,
1532 // connection_id
1533 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1534 // long header packet length
1535 0x26,
1536 // packet number
1537 0x78,
1538 // nonce
1539 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1540 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1541 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1542 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1543
1544 // frame type (padding)
1545 0x00,
1546 0x00, 0x00, 0x00, 0x00
1547 };
1548 // clang-format on
1549
1550 if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
1551 return;
1552 }
1553
1554 unsigned char* p = packet;
1555 size_t p_size = QUIC_ARRAYSIZE(packet);
1556 if (framer_.transport_version() == QUIC_VERSION_99) {
1557 p = packet99;
1558 p_size = QUIC_ARRAYSIZE(packet99);
1559 } else if (framer_.transport_version() > QUIC_VERSION_44) {
1560 p = packet46;
1561 p_size = QUIC_ARRAYSIZE(packet46);
1562 } else if (framer_.transport_version() > QUIC_VERSION_43) {
1563 p = packet44;
1564 p_size = QUIC_ARRAYSIZE(packet44);
1565 }
1566
1567 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1568 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1569 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1570 ASSERT_TRUE(visitor_.header_->nonce != nullptr);
1571 for (char i = 0; i < 32; ++i) {
1572 EXPECT_EQ(i, (*visitor_.header_->nonce)[static_cast<size_t>(i)]);
1573 }
1574 EXPECT_EQ(1u, visitor_.padding_frames_.size());
1575 EXPECT_EQ(5, visitor_.padding_frames_[0]->num_padding_bytes);
1576}
1577
1578TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) {
1579 // clang-format off
1580 unsigned char packet[] = {
1581 // public flags (8 byte connection_id, version flag and an unknown flag)
1582 0x29,
1583 // connection_id
1584 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1585 // version tag
1586 'Q', '0', '0', '0',
1587 // packet number
1588 0x12, 0x34, 0x56, 0x78,
1589
1590 // frame type (padding frame)
1591 0x00,
1592 0x00, 0x00, 0x00, 0x00
1593 };
1594
1595 unsigned char packet44[] = {
1596 // type (long header with packet type ZERO_RTT_PROTECTED)
1597 0xFC,
1598 // version tag
1599 'Q', '0', '0', '0',
1600 // connection_id length
1601 0x50,
1602 // connection_id
1603 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1604 // packet number
1605 0x12, 0x34, 0x56, 0x78,
1606
1607 // frame type (padding frame)
1608 0x00,
1609 0x00, 0x00, 0x00, 0x00
1610 };
nharper55fa6132019-05-07 19:37:21 -07001611
1612 unsigned char packet45[] = {
1613 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
1614 0xD3,
1615 // version tag
1616 'Q', '0', '0', '0',
1617 // connection_id length
1618 0x50,
1619 // connection_id
1620 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1621 // packet number
1622 0x12, 0x34, 0x56, 0x78,
1623
1624 // frame type (padding frame)
1625 0x00,
1626 0x00, 0x00, 0x00, 0x00
1627 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001628 // clang-format on
1629
nharper55fa6132019-05-07 19:37:21 -07001630 unsigned char* p = packet;
1631 size_t p_size = QUIC_ARRAYSIZE(packet);
1632 if (framer_.transport_version() > QUIC_VERSION_44) {
1633 p = packet45;
1634 p_size = QUIC_ARRAYSIZE(packet45);
1635 } else if (framer_.transport_version() > QUIC_VERSION_43) {
1636 p = packet44;
1637 p_size = QUIC_ARRAYSIZE(packet44);
1638 }
1639 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001640 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1641 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1642 ASSERT_TRUE(visitor_.header_.get());
1643 EXPECT_EQ(0, visitor_.frame_count_);
1644 EXPECT_EQ(1, visitor_.version_mismatch_);
nharper55fa6132019-05-07 19:37:21 -07001645 ASSERT_EQ(1u, visitor_.padding_frames_.size());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001646 EXPECT_EQ(5, visitor_.padding_frames_[0]->num_padding_bytes);
1647}
1648
1649TEST_P(QuicFramerTest, PaddingFrame) {
zhongyi546cc452019-04-12 15:27:49 -07001650 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001651 // clang-format off
1652 unsigned char packet[] = {
1653 // public flags (8 byte connection_id)
1654 0x28,
1655 // connection_id
1656 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1657 // packet number
1658 0x12, 0x34, 0x56, 0x78,
1659
1660 // paddings
1661 0x00, 0x00,
1662 // frame type (stream frame with fin)
1663 0xFF,
1664 // stream id
1665 0x01, 0x02, 0x03, 0x04,
1666 // offset
1667 0x3A, 0x98, 0xFE, 0xDC,
1668 0x32, 0x10, 0x76, 0x54,
1669 // data length
1670 0x00, 0x0c,
1671 // data
1672 'h', 'e', 'l', 'l',
1673 'o', ' ', 'w', 'o',
1674 'r', 'l', 'd', '!',
1675 // paddings
1676 0x00, 0x00,
1677 };
1678
1679 unsigned char packet44[] = {
1680 // type (short header, 4 byte packet number)
1681 0x32,
1682 // connection_id
1683 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1684 // packet number
1685 0x12, 0x34, 0x56, 0x78,
1686
1687 // paddings
1688 0x00, 0x00,
1689 // frame type (stream frame with fin)
1690 0xFF,
1691 // stream id
1692 0x01, 0x02, 0x03, 0x04,
1693 // offset
1694 0x3A, 0x98, 0xFE, 0xDC,
1695 0x32, 0x10, 0x76, 0x54,
1696 // data length
1697 0x00, 0x0c,
1698 // data
1699 'h', 'e', 'l', 'l',
1700 'o', ' ', 'w', 'o',
1701 'r', 'l', 'd', '!',
1702 // paddings
1703 0x00, 0x00,
1704 };
1705
1706 unsigned char packet46[] = {
1707 // type (short header, 4 byte packet number)
1708 0x43,
1709 // connection_id
1710 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1711 // packet number
1712 0x12, 0x34, 0x56, 0x78,
1713
1714 // paddings
1715 0x00, 0x00,
1716 // frame type (stream frame with fin)
1717 0xFF,
1718 // stream id
1719 0x01, 0x02, 0x03, 0x04,
1720 // offset
1721 0x3A, 0x98, 0xFE, 0xDC,
1722 0x32, 0x10, 0x76, 0x54,
1723 // data length
1724 0x00, 0x0c,
1725 // data
1726 'h', 'e', 'l', 'l',
1727 'o', ' ', 'w', 'o',
1728 'r', 'l', 'd', '!',
1729 // paddings
1730 0x00, 0x00,
1731 };
1732
1733 unsigned char packet99[] = {
1734 // type (short header, 4 byte packet number)
1735 0x43,
1736 // connection_id
1737 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1738 // packet number
1739 0x12, 0x34, 0x56, 0x78,
1740
1741 // paddings
1742 0x00, 0x00,
1743 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
1744 0x08 | 0x01 | 0x02 | 0x04,
1745
1746 // stream id
1747 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
1748 // offset
1749 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
1750 0x32, 0x10, 0x76, 0x54,
1751 // data length
1752 kVarInt62OneByte + 0x0c,
1753 // data
1754 'h', 'e', 'l', 'l',
1755 'o', ' ', 'w', 'o',
1756 'r', 'l', 'd', '!',
1757 // paddings
1758 0x00, 0x00,
1759 };
1760 // clang-format on
1761
1762 unsigned char* p = packet;
1763 size_t p_size = QUIC_ARRAYSIZE(packet);
1764 if (framer_.transport_version() == QUIC_VERSION_99) {
1765 p = packet99;
1766 p_size = QUIC_ARRAYSIZE(packet99);
1767 } else if (framer_.transport_version() > QUIC_VERSION_44) {
1768 p = packet46;
1769 p_size = QUIC_ARRAYSIZE(packet46);
1770 } else if (framer_.transport_version() > QUIC_VERSION_43) {
1771 p = packet44;
1772 p_size = QUIC_ARRAYSIZE(packet44);
1773 }
1774
1775 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1776 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1777 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1778 ASSERT_TRUE(visitor_.header_.get());
1779 EXPECT_TRUE(CheckDecryption(
1780 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
1781 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
1782
1783 ASSERT_EQ(1u, visitor_.stream_frames_.size());
1784 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1785 EXPECT_EQ(2u, visitor_.padding_frames_.size());
1786 EXPECT_EQ(2, visitor_.padding_frames_[0]->num_padding_bytes);
1787 EXPECT_EQ(2, visitor_.padding_frames_[1]->num_padding_bytes);
1788 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
1789 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
1790 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
1791 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
1792}
1793
1794TEST_P(QuicFramerTest, StreamFrame) {
zhongyi546cc452019-04-12 15:27:49 -07001795 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001796 // clang-format off
1797 PacketFragments packet = {
1798 // public flags (8 byte connection_id)
1799 {"",
1800 {0x28}},
1801 // connection_id
1802 {"",
1803 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1804 // packet number
1805 {"",
1806 {0x12, 0x34, 0x56, 0x78}},
1807 // frame type (stream frame with fin)
1808 {"",
1809 {0xFF}},
1810 // stream id
1811 {"Unable to read stream_id.",
1812 {0x01, 0x02, 0x03, 0x04}},
1813 // offset
1814 {"Unable to read offset.",
1815 {0x3A, 0x98, 0xFE, 0xDC,
1816 0x32, 0x10, 0x76, 0x54}},
1817 {"Unable to read frame data.",
1818 {
1819 // data length
1820 0x00, 0x0c,
1821 // data
1822 'h', 'e', 'l', 'l',
1823 'o', ' ', 'w', 'o',
1824 'r', 'l', 'd', '!'}},
1825 };
1826
1827 PacketFragments packet44 = {
1828 // type (short header, 4 byte packet number)
1829 {"",
1830 {0x32}},
1831 // connection_id
1832 {"",
1833 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1834 // packet number
1835 {"",
1836 {0x12, 0x34, 0x56, 0x78}},
1837 // frame type (stream frame with fin)
1838 {"",
1839 {0xFF}},
1840 // stream id
1841 {"Unable to read stream_id.",
1842 {0x01, 0x02, 0x03, 0x04}},
1843 // offset
1844 {"Unable to read offset.",
1845 {0x3A, 0x98, 0xFE, 0xDC,
1846 0x32, 0x10, 0x76, 0x54}},
1847 {"Unable to read frame data.",
1848 {
1849 // data length
1850 0x00, 0x0c,
1851 // data
1852 'h', 'e', 'l', 'l',
1853 'o', ' ', 'w', 'o',
1854 'r', 'l', 'd', '!'}},
1855 };
1856
1857 PacketFragments packet46 = {
1858 // type (short header, 4 byte packet number)
1859 {"",
1860 {0x43}},
1861 // connection_id
1862 {"",
1863 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1864 // packet number
1865 {"",
1866 {0x12, 0x34, 0x56, 0x78}},
1867 // frame type (stream frame with fin)
1868 {"",
1869 {0xFF}},
1870 // stream id
1871 {"Unable to read stream_id.",
1872 {0x01, 0x02, 0x03, 0x04}},
1873 // offset
1874 {"Unable to read offset.",
1875 {0x3A, 0x98, 0xFE, 0xDC,
1876 0x32, 0x10, 0x76, 0x54}},
1877 {"Unable to read frame data.",
1878 {
1879 // data length
1880 0x00, 0x0c,
1881 // data
1882 'h', 'e', 'l', 'l',
1883 'o', ' ', 'w', 'o',
1884 'r', 'l', 'd', '!'}},
1885 };
1886
1887 PacketFragments packet99 = {
1888 // type (short header, 4 byte packet number)
1889 {"",
1890 {0x43}},
1891 // connection_id
1892 {"",
1893 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1894 // packet number
1895 {"",
1896 {0x12, 0x34, 0x56, 0x78}},
1897 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
1898 {"",
1899 { 0x08 | 0x01 | 0x02 | 0x04 }},
1900 // stream id
1901 {"Unable to read stream_id.",
1902 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
1903 // offset
1904 {"Unable to read stream data offset.",
1905 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
1906 0x32, 0x10, 0x76, 0x54}},
1907 // data length
1908 {"Unable to read stream data length.",
1909 {kVarInt62OneByte + 0x0c}},
1910 // data
1911 {"Unable to read frame data.",
1912 { 'h', 'e', 'l', 'l',
1913 'o', ' ', 'w', 'o',
1914 'r', 'l', 'd', '!'}},
1915 };
1916 // clang-format on
1917
1918 PacketFragments& fragments =
1919 framer_.transport_version() == QUIC_VERSION_99
1920 ? packet99
1921 : (framer_.transport_version() > QUIC_VERSION_44
1922 ? packet46
1923 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
1924 : packet));
1925 std::unique_ptr<QuicEncryptedPacket> encrypted(
1926 AssemblePacketFromFragments(fragments));
1927 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
1928
1929 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1930 ASSERT_TRUE(visitor_.header_.get());
1931 EXPECT_TRUE(CheckDecryption(
1932 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
1933 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
1934
1935 ASSERT_EQ(1u, visitor_.stream_frames_.size());
1936 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1937 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
1938 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
1939 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
1940 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
1941
1942 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
1943}
1944
1945// Test an empty (no data) stream frame.
1946TEST_P(QuicFramerTest, EmptyStreamFrame) {
1947 // Only the IETF QUIC spec explicitly says that empty
1948 // stream frames are supported.
1949 if (framer_.transport_version() != QUIC_VERSION_99) {
1950 return;
1951 }
zhongyi546cc452019-04-12 15:27:49 -07001952 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001953 // clang-format off
1954 PacketFragments packet = {
1955 // type (short header, 4 byte packet number)
1956 {"",
1957 {0x43}},
1958 // connection_id
1959 {"",
1960 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1961 // packet number
1962 {"",
1963 {0x12, 0x34, 0x56, 0x78}},
1964 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
1965 {"",
1966 { 0x08 | 0x01 | 0x02 | 0x04 }},
1967 // stream id
1968 {"Unable to read stream_id.",
1969 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
1970 // offset
1971 {"Unable to read stream data offset.",
1972 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
1973 0x32, 0x10, 0x76, 0x54}},
1974 // data length
1975 {"Unable to read stream data length.",
1976 {kVarInt62OneByte + 0x00}},
1977 };
1978 // clang-format on
1979
1980 std::unique_ptr<QuicEncryptedPacket> encrypted(
1981 AssemblePacketFromFragments(packet));
1982 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
1983
1984 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1985 ASSERT_TRUE(visitor_.header_.get());
1986 EXPECT_TRUE(CheckDecryption(
1987 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
1988 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
1989
1990 ASSERT_EQ(1u, visitor_.stream_frames_.size());
1991 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1992 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
1993 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
1994 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
1995 EXPECT_EQ(visitor_.stream_frames_[0].get()->data_length, 0u);
1996
1997 CheckFramingBoundaries(packet, QUIC_INVALID_STREAM_DATA);
1998}
1999
2000TEST_P(QuicFramerTest, MissingDiversificationNonce) {
QUICHE team8e2e4532019-03-14 14:37:56 -07002001 if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
2002 // TLS does not use diversification nonces.
2003 return;
2004 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002005 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002006 decrypter_ = new test::TestDecrypter();
zhongyi546cc452019-04-12 15:27:49 -07002007 if (framer_.version().KnowsWhichDecrypterToUse()) {
2008 framer_.InstallDecrypter(ENCRYPTION_INITIAL, QuicMakeUnique<NullDecrypter>(
2009 Perspective::IS_CLIENT));
2010 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
2011 std::unique_ptr<QuicDecrypter>(decrypter_));
2012 } else {
2013 framer_.SetDecrypter(ENCRYPTION_INITIAL,
2014 QuicMakeUnique<NullDecrypter>(Perspective::IS_CLIENT));
2015 framer_.SetAlternativeDecrypter(
2016 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
2017 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002018
2019 // clang-format off
2020 unsigned char packet[] = {
2021 // public flags (8 byte connection_id)
2022 0x28,
2023 // connection_id
2024 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2025 // packet number
2026 0x12, 0x34, 0x56, 0x78,
QUICHE team8e2e4532019-03-14 14:37:56 -07002027 // padding frame
2028 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002029 };
2030
2031 unsigned char packet44[] = {
QUICHE team8e2e4532019-03-14 14:37:56 -07002032 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
QUICHE teama6ef0a62019-03-07 20:34:33 -05002033 0xFC,
2034 // version tag
2035 QUIC_VERSION_BYTES,
2036 // connection_id length
QUICHE team8e2e4532019-03-14 14:37:56 -07002037 0x05,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002038 // connection_id
2039 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2040 // packet number
2041 0x12, 0x34, 0x56, 0x78,
QUICHE team8e2e4532019-03-14 14:37:56 -07002042 // padding frame
2043 0x00,
2044 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05002045
QUICHE team8e2e4532019-03-14 14:37:56 -07002046 unsigned char packet46[] = {
2047 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2048 0xD3,
2049 // version tag
2050 QUIC_VERSION_BYTES,
2051 // connection_id length
2052 0x05,
2053 // connection_id
2054 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2055 // packet number
2056 0x12, 0x34, 0x56, 0x78,
2057 // padding frame
2058 0x00,
2059 };
2060
2061 unsigned char packet99[] = {
2062 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2063 0xD3,
2064 // version tag
2065 QUIC_VERSION_BYTES,
2066 // connection_id length
2067 0x05,
2068 // connection_id
2069 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2070 // IETF long header payload length
2071 0x05,
2072 // packet number
2073 0x12, 0x34, 0x56, 0x78,
2074 // padding frame
2075 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002076 };
2077 // clang-format on
2078
2079 unsigned char* p = packet;
QUICHE team8e2e4532019-03-14 14:37:56 -07002080 size_t p_length = QUIC_ARRAYSIZE(packet);
2081 if (framer_.transport_version() == QUIC_VERSION_99) {
2082 p = packet99;
2083 p_length = QUIC_ARRAYSIZE(packet99);
2084 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
2085 p = packet46;
2086 p_length = QUIC_ARRAYSIZE(packet46);
2087 } else if (framer_.transport_version() >= QUIC_VERSION_44) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002088 p = packet44;
QUICHE team8e2e4532019-03-14 14:37:56 -07002089 p_length = QUIC_ARRAYSIZE(packet44);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002090 }
QUICHE team8e2e4532019-03-14 14:37:56 -07002091 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002092 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
nharper55fa6132019-05-07 19:37:21 -07002093 if (framer_.version().HasHeaderProtection()) {
2094 EXPECT_EQ(QUIC_DECRYPTION_FAILURE, framer_.error());
2095 EXPECT_EQ("Unable to decrypt header protection.", framer_.detailed_error());
2096 } else if (framer_.transport_version() >= QUIC_VERSION_44) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002097 // Cannot read diversification nonce.
2098 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
QUICHE team8e2e4532019-03-14 14:37:56 -07002099 EXPECT_EQ("Unable to read nonce.", framer_.detailed_error());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002100 } else {
2101 EXPECT_EQ(QUIC_DECRYPTION_FAILURE, framer_.error());
2102 }
2103}
2104
2105TEST_P(QuicFramerTest, StreamFrame3ByteStreamId) {
2106 if (framer_.transport_version() > QUIC_VERSION_43) {
2107 // This test is nonsensical for IETF Quic.
2108 return;
2109 }
2110 // clang-format off
2111 PacketFragments packet = {
2112 // public flags (8 byte connection_id)
2113 {"",
2114 {0x28}},
2115 // connection_id
2116 {"",
2117 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2118 // packet number
2119 {"",
2120 {0x12, 0x34, 0x56, 0x78}},
2121 // frame type (stream frame with fin)
2122 {"",
2123 {0xFE}},
2124 // stream id
2125 {"Unable to read stream_id.",
2126 {0x02, 0x03, 0x04}},
2127 // offset
2128 {"Unable to read offset.",
2129 {0x3A, 0x98, 0xFE, 0xDC,
2130 0x32, 0x10, 0x76, 0x54}},
2131 {"Unable to read frame data.",
2132 {
2133 // data length
2134 0x00, 0x0c,
2135 // data
2136 'h', 'e', 'l', 'l',
2137 'o', ' ', 'w', 'o',
2138 'r', 'l', 'd', '!'}},
2139 };
2140 // clang-format on
2141
2142 PacketFragments& fragments = packet;
2143 std::unique_ptr<QuicEncryptedPacket> encrypted(
2144 AssemblePacketFromFragments(fragments));
2145 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2146
2147 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2148 ASSERT_TRUE(visitor_.header_.get());
2149 EXPECT_TRUE(CheckDecryption(
2150 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2151 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2152
2153 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2154 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2155 // Stream ID should be the last 3 bytes of kStreamId.
2156 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2157 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2158 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2159 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2160
2161 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2162}
2163
2164TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) {
zhongyi546cc452019-04-12 15:27:49 -07002165 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002166 // clang-format off
2167 PacketFragments packet = {
2168 // public flags (8 byte connection_id)
2169 {"",
2170 {0x28}},
2171 // connection_id
2172 {"",
2173 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2174 // packet number
2175 {"",
2176 {0x12, 0x34, 0x56, 0x78}},
2177 // frame type (stream frame with fin)
2178 {"",
2179 {0xFD}},
2180 // stream id
2181 {"Unable to read stream_id.",
2182 {0x03, 0x04}},
2183 // offset
2184 {"Unable to read offset.",
2185 {0x3A, 0x98, 0xFE, 0xDC,
2186 0x32, 0x10, 0x76, 0x54}},
2187 {"Unable to read frame data.",
2188 {
2189 // data length
2190 0x00, 0x0c,
2191 // data
2192 'h', 'e', 'l', 'l',
2193 'o', ' ', 'w', 'o',
2194 'r', 'l', 'd', '!'}},
2195 };
2196
2197 PacketFragments packet44 = {
2198 // type (short header, 4 byte packet number)
2199 {"",
2200 {0x32}},
2201 // connection_id
2202 {"",
2203 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2204 // packet number
2205 {"",
2206 {0x12, 0x34, 0x56, 0x78}},
2207 // frame type (stream frame with fin)
2208 {"",
2209 {0xFD}},
2210 // stream id
2211 {"Unable to read stream_id.",
2212 {0x03, 0x04}},
2213 // offset
2214 {"Unable to read offset.",
2215 {0x3A, 0x98, 0xFE, 0xDC,
2216 0x32, 0x10, 0x76, 0x54}},
2217 {"Unable to read frame data.",
2218 {
2219 // data length
2220 0x00, 0x0c,
2221 // data
2222 'h', 'e', 'l', 'l',
2223 'o', ' ', 'w', 'o',
2224 'r', 'l', 'd', '!'}},
2225 };
2226
2227 PacketFragments packet46 = {
2228 // type (short header, 4 byte packet number)
2229 {"",
2230 {0x43}},
2231 // connection_id
2232 {"",
2233 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2234 // packet number
2235 {"",
2236 {0x12, 0x34, 0x56, 0x78}},
2237 // frame type (stream frame with fin)
2238 {"",
2239 {0xFD}},
2240 // stream id
2241 {"Unable to read stream_id.",
2242 {0x03, 0x04}},
2243 // offset
2244 {"Unable to read offset.",
2245 {0x3A, 0x98, 0xFE, 0xDC,
2246 0x32, 0x10, 0x76, 0x54}},
2247 {"Unable to read frame data.",
2248 {
2249 // data length
2250 0x00, 0x0c,
2251 // data
2252 'h', 'e', 'l', 'l',
2253 'o', ' ', 'w', 'o',
2254 'r', 'l', 'd', '!'}},
2255 };
2256
2257 PacketFragments packet99 = {
2258 // type (short header, 4 byte packet number)
2259 {"",
2260 {0x43}},
2261 // connection_id
2262 {"",
2263 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2264 // packet number
2265 {"",
2266 {0x12, 0x34, 0x56, 0x78}},
2267 // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2268 {"",
2269 {0x08 | 0x01 | 0x02 | 0x04}},
2270 // stream id
2271 {"Unable to read stream_id.",
2272 {kVarInt62TwoBytes + 0x03, 0x04}},
2273 // offset
2274 {"Unable to read stream data offset.",
2275 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2276 0x32, 0x10, 0x76, 0x54}},
2277 // data length
2278 {"Unable to read stream data length.",
2279 {kVarInt62OneByte + 0x0c}},
2280 // data
2281 {"Unable to read frame data.",
2282 { 'h', 'e', 'l', 'l',
2283 'o', ' ', 'w', 'o',
2284 'r', 'l', 'd', '!'}},
2285 };
2286 // clang-format on
2287
2288 PacketFragments& fragments =
2289 framer_.transport_version() == QUIC_VERSION_99
2290 ? packet99
2291 : (framer_.transport_version() > QUIC_VERSION_44
2292 ? packet46
2293 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
2294 : packet));
2295 std::unique_ptr<QuicEncryptedPacket> encrypted(
2296 AssemblePacketFromFragments(fragments));
2297 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2298
2299 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2300 ASSERT_TRUE(visitor_.header_.get());
2301 EXPECT_TRUE(CheckDecryption(
2302 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2303 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2304
2305 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2306 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2307 // Stream ID should be the last 2 bytes of kStreamId.
2308 EXPECT_EQ(0x0000FFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2309 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2310 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2311 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2312
2313 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2314}
2315
2316TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) {
zhongyi546cc452019-04-12 15:27:49 -07002317 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002318 // clang-format off
2319 PacketFragments packet = {
2320 // public flags (8 byte connection_id)
2321 {"",
2322 {0x28}},
2323 // connection_id
2324 {"",
2325 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2326 // packet number
2327 {"",
2328 {0x12, 0x34, 0x56, 0x78}},
2329 // frame type (stream frame with fin)
2330 {"",
2331 {0xFC}},
2332 // stream id
2333 {"Unable to read stream_id.",
2334 {0x04}},
2335 // offset
2336 {"Unable to read offset.",
2337 {0x3A, 0x98, 0xFE, 0xDC,
2338 0x32, 0x10, 0x76, 0x54}},
2339 {"Unable to read frame data.",
2340 {
2341 // data length
2342 0x00, 0x0c,
2343 // data
2344 'h', 'e', 'l', 'l',
2345 'o', ' ', 'w', 'o',
2346 'r', 'l', 'd', '!'}},
2347 };
2348
2349 PacketFragments packet44 = {
2350 // type (short header, 4 byte packet number)
2351 {"",
2352 {0x32}},
2353 // connection_id
2354 {"",
2355 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2356 // packet number
2357 {"",
2358 {0x12, 0x34, 0x56, 0x78}},
2359 // frame type (stream frame with fin)
2360 {"",
2361 {0xFC}},
2362 // stream id
2363 {"Unable to read stream_id.",
2364 {0x04}},
2365 // offset
2366 {"Unable to read offset.",
2367 {0x3A, 0x98, 0xFE, 0xDC,
2368 0x32, 0x10, 0x76, 0x54}},
2369 {"Unable to read frame data.",
2370 {
2371 // data length
2372 0x00, 0x0c,
2373 // data
2374 'h', 'e', 'l', 'l',
2375 'o', ' ', 'w', 'o',
2376 'r', 'l', 'd', '!'}},
2377 };
2378
2379 PacketFragments packet46 = {
2380 // type (short header, 4 byte packet number)
2381 {"",
2382 {0x43}},
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 {0xFC}},
2392 // stream id
2393 {"Unable to read stream_id.",
2394 {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
2409 PacketFragments packet99 = {
2410 // type (short header, 4 byte packet number)
2411 {"",
2412 {0x43}},
2413 // connection_id
2414 {"",
2415 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2416 // packet number
2417 {"",
2418 {0x12, 0x34, 0x56, 0x78}},
2419 // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2420 {"",
2421 {0x08 | 0x01 | 0x02 | 0x04}},
2422 // stream id
2423 {"Unable to read stream_id.",
2424 {kVarInt62OneByte + 0x04}},
2425 // offset
2426 {"Unable to read stream data offset.",
2427 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2428 0x32, 0x10, 0x76, 0x54}},
2429 // data length
2430 {"Unable to read stream data length.",
2431 {kVarInt62OneByte + 0x0c}},
2432 // data
2433 {"Unable to read frame data.",
2434 { 'h', 'e', 'l', 'l',
2435 'o', ' ', 'w', 'o',
2436 'r', 'l', 'd', '!'}},
2437 };
2438 // clang-format on
2439
2440 PacketFragments& fragments =
2441 framer_.transport_version() == QUIC_VERSION_99
2442 ? packet99
2443 : (framer_.transport_version() > QUIC_VERSION_44
2444 ? packet46
2445 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
2446 : packet));
2447 std::unique_ptr<QuicEncryptedPacket> encrypted(
2448 AssemblePacketFromFragments(fragments));
2449 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2450
2451 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2452 ASSERT_TRUE(visitor_.header_.get());
2453 EXPECT_TRUE(CheckDecryption(
2454 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2455 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2456
2457 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2458 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2459 // Stream ID should be the last 1 byte of kStreamId.
2460 EXPECT_EQ(0x000000FF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2461 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2462 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2463 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2464
2465 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2466}
2467
2468TEST_P(QuicFramerTest, StreamFrameWithVersion) {
zhongyi546cc452019-04-12 15:27:49 -07002469 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002470 // clang-format off
2471 PacketFragments packet = {
2472 // public flags (version, 8 byte connection_id)
2473 {"",
2474 {0x29}},
2475 // connection_id
2476 {"",
2477 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2478 // version tag
2479 {"",
2480 {QUIC_VERSION_BYTES}},
2481 // packet number
2482 {"",
2483 {0x12, 0x34, 0x56, 0x78}},
2484 // frame type (stream frame with fin)
2485 {"",
2486 {0xFE}},
2487 // stream id
2488 {"Unable to read stream_id.",
2489 {0x02, 0x03, 0x04}},
2490 // offset
2491 {"Unable to read offset.",
2492 {0x3A, 0x98, 0xFE, 0xDC,
2493 0x32, 0x10, 0x76, 0x54}},
2494 {"Unable to read frame data.",
2495 {
2496 // data length
2497 0x00, 0x0c,
2498 // data
2499 'h', 'e', 'l', 'l',
2500 'o', ' ', 'w', 'o',
2501 'r', 'l', 'd', '!'}},
2502 };
2503
2504 PacketFragments packet44 = {
2505 // public flags (long header with packet type ZERO_RTT_PROTECTED)
2506 {"",
2507 {0xFC}},
2508 // version tag
2509 {"",
2510 {QUIC_VERSION_BYTES}},
2511 // connection_id length
2512 {"",
2513 {0x50}},
2514 // connection_id
2515 {"",
2516 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2517 // packet number
2518 {"",
2519 {0x12, 0x34, 0x56, 0x78}},
2520 // frame type (stream frame with fin)
2521 {"",
2522 {0xFE}},
2523 // stream id
2524 {"Unable to read stream_id.",
2525 {0x02, 0x03, 0x04}},
2526 // offset
2527 {"Unable to read offset.",
2528 {0x3A, 0x98, 0xFE, 0xDC,
2529 0x32, 0x10, 0x76, 0x54}},
2530 {"Unable to read frame data.",
2531 {
2532 // data length
2533 0x00, 0x0c,
2534 // data
2535 'h', 'e', 'l', 'l',
2536 'o', ' ', 'w', 'o',
2537 'r', 'l', 'd', '!'}},
2538 };
2539
2540 PacketFragments packet46 = {
2541 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2542 // 4-byte packet number)
2543 {"",
2544 {0xD3}},
2545 // version tag
2546 {"",
2547 {QUIC_VERSION_BYTES}},
2548 // connection_id length
2549 {"",
2550 {0x50}},
2551 // connection_id
2552 {"",
2553 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2554 // packet number
2555 {"",
2556 {0x12, 0x34, 0x56, 0x78}},
2557 // frame type (stream frame with fin)
2558 {"",
2559 {0xFE}},
2560 // stream id
2561 {"Unable to read stream_id.",
2562 {0x02, 0x03, 0x04}},
2563 // offset
2564 {"Unable to read offset.",
2565 {0x3A, 0x98, 0xFE, 0xDC,
2566 0x32, 0x10, 0x76, 0x54}},
2567 {"Unable to read frame data.",
2568 {
2569 // data length
2570 0x00, 0x0c,
2571 // data
2572 'h', 'e', 'l', 'l',
2573 'o', ' ', 'w', 'o',
2574 'r', 'l', 'd', '!'}},
2575 };
2576
2577 PacketFragments packet99 = {
2578 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2579 // 4-byte packet number)
2580 {"",
2581 {0xD3}},
2582 // version tag
2583 {"",
2584 {QUIC_VERSION_BYTES}},
2585 // connection_id length
2586 {"",
2587 {0x50}},
2588 // connection_id
2589 {"",
2590 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2591 // long header packet length
2592 {"",
2593 {0x1E}},
2594 // packet number
2595 {"",
2596 {0x12, 0x34, 0x56, 0x78}},
2597 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
2598 {"",
2599 {0x08 | 0x01 | 0x02 | 0x04}},
2600 // stream id
2601 {"Long header payload length longer than packet.",
2602 {kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04}},
2603 // offset
2604 {"Long header payload length longer than packet.",
2605 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2606 0x32, 0x10, 0x76, 0x54}},
2607 // data length
2608 {"Long header payload length longer than packet.",
2609 {kVarInt62OneByte + 0x0c}},
2610 // data
2611 {"Long header payload length longer than packet.",
2612 { 'h', 'e', 'l', 'l',
2613 'o', ' ', 'w', 'o',
2614 'r', 'l', 'd', '!'}},
2615 };
2616 // clang-format on
2617
2618 QuicVariableLengthIntegerLength retry_token_length_length =
2619 VARIABLE_LENGTH_INTEGER_LENGTH_0;
2620 size_t retry_token_length = 0;
2621 QuicVariableLengthIntegerLength length_length =
2622 QuicVersionHasLongHeaderLengths(framer_.transport_version())
2623 ? VARIABLE_LENGTH_INTEGER_LENGTH_1
2624 : VARIABLE_LENGTH_INTEGER_LENGTH_0;
2625
2626 PacketFragments& fragments =
2627 framer_.transport_version() == QUIC_VERSION_99
2628 ? packet99
2629 : (framer_.transport_version() > QUIC_VERSION_44
2630 ? packet46
2631 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
2632 : packet));
2633 std::unique_ptr<QuicEncryptedPacket> encrypted(
2634 AssemblePacketFromFragments(fragments));
2635 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2636
2637 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2638 ASSERT_TRUE(visitor_.header_.get());
2639 EXPECT_TRUE(CheckDecryption(
2640 *encrypted, kIncludeVersion, !kIncludeDiversificationNonce,
2641 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID,
2642 retry_token_length_length, retry_token_length, length_length));
2643
2644 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2645 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2646 // Stream ID should be the last 3 bytes of kStreamId.
2647 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2648 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2649 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2650 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2651
2652 CheckFramingBoundaries(fragments,
2653 framer_.transport_version() == QUIC_VERSION_99
2654 ? QUIC_INVALID_PACKET_HEADER
2655 : QUIC_INVALID_STREAM_DATA);
2656}
2657
2658TEST_P(QuicFramerTest, RejectPacket) {
zhongyi546cc452019-04-12 15:27:49 -07002659 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002660 visitor_.accept_packet_ = false;
2661
2662 // clang-format off
2663 unsigned char packet[] = {
2664 // public flags (8 byte connection_id)
2665 0x28,
2666 // connection_id
2667 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2668 // packet number
2669 0x12, 0x34, 0x56, 0x78,
2670
2671 // frame type (stream frame with fin)
2672 0xFF,
2673 // stream id
2674 0x01, 0x02, 0x03, 0x04,
2675 // offset
2676 0x3A, 0x98, 0xFE, 0xDC,
2677 0x32, 0x10, 0x76, 0x54,
2678 // data length
2679 0x00, 0x0c,
2680 // data
2681 'h', 'e', 'l', 'l',
2682 'o', ' ', 'w', 'o',
2683 'r', 'l', 'd', '!',
2684 };
2685
2686 unsigned char packet44[] = {
2687 // type (short header, 4 byte packet number)
2688 0x32,
2689 // connection_id
2690 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2691 // packet number
2692 0x12, 0x34, 0x56, 0x78,
2693
2694 // frame type (STREAM Frame with FIN, LEN, and OFFSET bits set)
2695 0x10 | 0x01 | 0x02 | 0x04,
2696 // stream id
2697 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
2698 // offset
2699 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2700 0x32, 0x10, 0x76, 0x54,
2701 // data length
2702 kVarInt62OneByte + 0x0c,
2703 // data
2704 'h', 'e', 'l', 'l',
2705 'o', ' ', 'w', 'o',
2706 'r', 'l', 'd', '!',
2707 };
2708
2709 unsigned char packet46[] = {
2710 // type (short header, 4 byte packet number)
2711 0x43,
2712 // connection_id
2713 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2714 // packet number
2715 0x12, 0x34, 0x56, 0x78,
2716
2717 // frame type (STREAM Frame with FIN, LEN, and OFFSET bits set)
2718 0x10 | 0x01 | 0x02 | 0x04,
2719 // stream id
2720 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
2721 // offset
2722 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2723 0x32, 0x10, 0x76, 0x54,
2724 // data length
2725 kVarInt62OneByte + 0x0c,
2726 // data
2727 'h', 'e', 'l', 'l',
2728 'o', ' ', 'w', 'o',
2729 'r', 'l', 'd', '!',
2730 };
2731 // clang-format on
2732
2733 unsigned char* p = packet;
2734 if (framer_.transport_version() > QUIC_VERSION_44) {
2735 p = packet46;
2736 } else if (framer_.transport_version() > QUIC_VERSION_43) {
2737 p = packet44;
2738 }
2739 QuicEncryptedPacket encrypted(AsChars(p),
2740 framer_.transport_version() > QUIC_VERSION_43
2741 ? QUIC_ARRAYSIZE(packet44)
2742 : QUIC_ARRAYSIZE(packet),
2743 false);
2744 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2745
2746 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2747 ASSERT_TRUE(visitor_.header_.get());
2748 EXPECT_TRUE(CheckDecryption(
2749 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2750 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2751
2752 ASSERT_EQ(0u, visitor_.stream_frames_.size());
2753 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2754}
2755
2756TEST_P(QuicFramerTest, RejectPublicHeader) {
2757 visitor_.accept_public_header_ = false;
2758
2759 // clang-format off
2760 unsigned char packet[] = {
2761 // public flags (8 byte connection_id)
2762 0x28,
2763 // connection_id
2764 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2765 };
2766
2767 unsigned char packet44[] = {
2768 // type (short header, 1 byte packet number)
2769 0x30,
2770 // connection_id
2771 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2772 // packet number
2773 0x01,
2774 };
2775
2776 unsigned char packet46[] = {
2777 // type (short header, 1 byte packet number)
2778 0x40,
2779 // connection_id
2780 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2781 // packet number
2782 0x01,
2783 };
2784 // clang-format on
2785
2786 QuicEncryptedPacket encrypted(
2787 framer_.transport_version() > QUIC_VERSION_44
2788 ? AsChars(packet46)
2789 : (framer_.transport_version() > QUIC_VERSION_43 ? AsChars(packet44)
2790 : AsChars(packet)),
2791 framer_.transport_version() > QUIC_VERSION_44
2792 ? QUIC_ARRAYSIZE(packet46)
2793 : (framer_.transport_version() > QUIC_VERSION_43
2794 ? QUIC_ARRAYSIZE(packet44)
2795 : QUIC_ARRAYSIZE(packet)),
2796 false);
2797 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2798
2799 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2800 ASSERT_TRUE(visitor_.header_.get());
2801 EXPECT_FALSE(visitor_.header_->packet_number.IsInitialized());
2802}
2803
2804TEST_P(QuicFramerTest, AckFrameOneAckBlock) {
zhongyi546cc452019-04-12 15:27:49 -07002805 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002806 // clang-format off
2807 PacketFragments packet = {
2808 // public flags (8 byte connection_id)
2809 {"",
2810 {0x2C}},
2811 // connection_id
2812 {"",
2813 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2814 // packet number
2815 {"",
2816 {0x12, 0x34, 0x56, 0x78}},
2817 // frame type (ack frame)
2818 // (one ack block, 2 byte largest observed, 2 byte block length)
2819 {"",
2820 {0x45}},
2821 // largest acked
2822 {"Unable to read largest acked.",
2823 {0x12, 0x34}},
2824 // Zero delta time.
2825 {"Unable to read ack delay time.",
2826 {0x00, 0x00}},
2827 // first ack block length.
2828 {"Unable to read first ack block length.",
2829 {0x12, 0x34}},
2830 // num timestamps.
2831 {"Unable to read num received packets.",
2832 {0x00}}
2833 };
2834
2835 PacketFragments packet44 = {
2836 // type (short packet, 4 byte packet number)
2837 {"",
2838 {0x32}},
2839 // connection_id
2840 {"",
2841 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2842 // packet number
2843 {"",
2844 {0x12, 0x34, 0x56, 0x78}},
2845 // frame type (ack frame)
2846 // (one ack block, 2 byte largest observed, 2 byte block length)
2847 {"",
2848 {0x45}},
2849 // largest acked
2850 {"Unable to read largest acked.",
2851 {0x12, 0x34}},
2852 // Zero delta time.
2853 {"Unable to read ack delay time.",
2854 {0x00, 0x00}},
2855 // first ack block length.
2856 {"Unable to read first ack block length.",
2857 {0x12, 0x34}},
2858 // num timestamps.
2859 {"Unable to read num received packets.",
2860 {0x00}}
2861 };
2862
2863 PacketFragments packet46 = {
2864 // type (short packet, 4 byte packet number)
2865 {"",
2866 {0x43}},
2867 // connection_id
2868 {"",
2869 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2870 // packet number
2871 {"",
2872 {0x12, 0x34, 0x56, 0x78}},
2873 // frame type (ack frame)
2874 // (one ack block, 2 byte largest observed, 2 byte block length)
2875 {"",
2876 {0x45}},
2877 // largest acked
2878 {"Unable to read largest acked.",
2879 {0x12, 0x34}},
2880 // Zero delta time.
2881 {"Unable to read ack delay time.",
2882 {0x00, 0x00}},
2883 // first ack block length.
2884 {"Unable to read first ack block length.",
2885 {0x12, 0x34}},
2886 // num timestamps.
2887 {"Unable to read num received packets.",
2888 {0x00}}
2889 };
2890
2891 PacketFragments packet99 = {
2892 // type (short packet, 4 byte packet number)
2893 {"",
2894 {0x43}},
2895 // connection_id
2896 {"",
2897 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2898 // packet number
2899 {"",
2900 {0x12, 0x34, 0x56, 0x78}},
2901 // frame type (IETF_ACK)
2902 // (one ack block, 2 byte largest observed, 2 byte block length)
2903 // IETF-Quic ignores the bit-fields in the ack type, all of
2904 // that information is encoded elsewhere in the frame.
2905 {"",
2906 {0x02}},
2907 // largest acked
2908 {"Unable to read largest acked.",
2909 {kVarInt62TwoBytes + 0x12, 0x34}},
2910 // Zero delta time.
2911 {"Unable to read ack delay time.",
2912 {kVarInt62OneByte + 0x00}},
2913 // Ack block count (0 -- no blocks after the first)
2914 {"Unable to read ack block count.",
2915 {kVarInt62OneByte + 0x00}},
2916 // first ack block length - 1.
2917 // IETF Quic defines the ack block's value as the "number of
2918 // packets that preceed the largest packet number in the block"
2919 // which for the 1st ack block is the largest acked field,
2920 // above. This means that if we are acking just packet 0x1234
2921 // then the 1st ack block will be 0.
2922 {"Unable to read first ack block length.",
2923 {kVarInt62TwoBytes + 0x12, 0x33}}
2924 };
2925 // clang-format on
2926
2927 PacketFragments& fragments =
2928 framer_.transport_version() == QUIC_VERSION_99
2929 ? packet99
2930 : (framer_.transport_version() > QUIC_VERSION_44
2931 ? packet46
2932 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
2933 : packet));
2934 std::unique_ptr<QuicEncryptedPacket> encrypted(
2935 AssemblePacketFromFragments(fragments));
2936 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2937
2938 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2939 ASSERT_TRUE(visitor_.header_.get());
2940 EXPECT_TRUE(CheckDecryption(
2941 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2942 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2943
2944 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2945 ASSERT_EQ(1u, visitor_.ack_frames_.size());
2946 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
2947 EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
2948 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
2949
2950 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
2951}
2952
2953// This test checks that the ack frame processor correctly identifies
2954// and handles the case where the first ack block is larger than the
2955// largest_acked packet.
2956TEST_P(QuicFramerTest, FirstAckFrameUnderflow) {
zhongyi546cc452019-04-12 15:27:49 -07002957 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002958 // clang-format off
2959 PacketFragments packet = {
2960 // public flags (8 byte connection_id)
2961 {"",
2962 {0x2C}},
2963 // connection_id
2964 {"",
2965 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2966 // packet number
2967 {"",
2968 {0x12, 0x34, 0x56, 0x78}},
2969 // frame type (ack frame)
2970 // (one ack block, 2 byte largest observed, 2 byte block length)
2971 {"",
2972 {0x45}},
2973 // largest acked
2974 {"Unable to read largest acked.",
2975 {0x12, 0x34}},
2976 // Zero delta time.
2977 {"Unable to read ack delay time.",
2978 {0x00, 0x00}},
2979 // first ack block length.
2980 {"Unable to read first ack block length.",
2981 {0x88, 0x88}},
2982 // num timestamps.
2983 {"Underflow with first ack block length 34952 largest acked is 4660.",
2984 {0x00}}
2985 };
2986
2987 PacketFragments packet44 = {
2988 // type (short header, 4 byte packet number)
2989 {"",
2990 {0x32}},
2991 // connection_id
2992 {"",
2993 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2994 // packet number
2995 {"",
2996 {0x12, 0x34, 0x56, 0x78}},
2997 // frame type (ack frame)
2998 // (one ack block, 2 byte largest observed, 2 byte block length)
2999 {"",
3000 {0x45}},
3001 // largest acked
3002 {"Unable to read largest acked.",
3003 {0x12, 0x34}},
3004 // Zero delta time.
3005 {"Unable to read ack delay time.",
3006 {0x00, 0x00}},
3007 // first ack block length.
3008 {"Unable to read first ack block length.",
3009 {0x88, 0x88}},
3010 // num timestamps.
3011 {"Underflow with first ack block length 34952 largest acked is 4660.",
3012 {0x00}}
3013 };
3014
3015 PacketFragments packet46 = {
3016 // type (short header, 4 byte packet number)
3017 {"",
3018 {0x43}},
3019 // connection_id
3020 {"",
3021 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3022 // packet number
3023 {"",
3024 {0x12, 0x34, 0x56, 0x78}},
3025 // frame type (ack frame)
3026 // (one ack block, 2 byte largest observed, 2 byte block length)
3027 {"",
3028 {0x45}},
3029 // largest acked
3030 {"Unable to read largest acked.",
3031 {0x12, 0x34}},
3032 // Zero delta time.
3033 {"Unable to read ack delay time.",
3034 {0x00, 0x00}},
3035 // first ack block length.
3036 {"Unable to read first ack block length.",
3037 {0x88, 0x88}},
3038 // num timestamps.
3039 {"Underflow with first ack block length 34952 largest acked is 4660.",
3040 {0x00}}
3041 };
3042
3043 PacketFragments packet99 = {
3044 // type (short header, 4 byte packet number)
3045 {"",
3046 {0x43}},
3047 // connection_id
3048 {"",
3049 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3050 // packet number
3051 {"",
3052 {0x12, 0x34, 0x56, 0x78}},
3053 // frame type (IETF_ACK)
3054 {"",
3055 {0x02}},
3056 // largest acked
3057 {"Unable to read largest acked.",
3058 {kVarInt62TwoBytes + 0x12, 0x34}},
3059 // Zero delta time.
3060 {"Unable to read ack delay time.",
3061 {kVarInt62OneByte + 0x00}},
3062 // Ack block count (0 -- no blocks after the first)
3063 {"Unable to read ack block count.",
3064 {kVarInt62OneByte + 0x00}},
3065 // first ack block length.
3066 {"Unable to read first ack block length.",
3067 {kVarInt62TwoBytes + 0x28, 0x88}}
3068 };
3069 // clang-format on
3070
3071 PacketFragments& fragments =
3072 framer_.transport_version() == QUIC_VERSION_99
3073 ? packet99
3074 : (framer_.transport_version() > QUIC_VERSION_44
3075 ? packet46
3076 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
3077 : packet));
3078 std::unique_ptr<QuicEncryptedPacket> encrypted(
3079 AssemblePacketFromFragments(fragments));
3080 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3081 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3082}
3083
3084// This test checks that the ack frame processor correctly identifies
3085// and handles the case where the third ack block's gap is larger than the
3086// available space in the ack range.
3087TEST_P(QuicFramerTest, ThirdAckBlockUnderflowGap) {
3088 if (framer_.transport_version() != QUIC_VERSION_99) {
3089 // for now, only v99
3090 return;
3091 }
zhongyi546cc452019-04-12 15:27:49 -07003092 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003093 // clang-format off
3094 PacketFragments packet99 = {
3095 // type (short header, 4 byte packet number)
3096 {"",
3097 {0x43}},
3098 // connection_id
3099 {"",
3100 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3101 // packet number
3102 {"",
3103 {0x12, 0x34, 0x56, 0x78}},
3104 // frame type (IETF_ACK frame)
3105 {"",
3106 {0x02}},
3107 // largest acked
3108 {"Unable to read largest acked.",
3109 {kVarInt62OneByte + 63}},
3110 // Zero delta time.
3111 {"Unable to read ack delay time.",
3112 {kVarInt62OneByte + 0x00}},
3113 // Ack block count (2 -- 2 blocks after the first)
3114 {"Unable to read ack block count.",
3115 {kVarInt62OneByte + 0x02}},
3116 // first ack block length.
3117 {"Unable to read first ack block length.",
3118 {kVarInt62OneByte + 13}}, // Ack 14 packets, range 50..63 (inclusive)
3119
3120 {"Unable to read gap block value.",
3121 {kVarInt62OneByte + 9}}, // Gap 10 packets, 40..49 (inclusive)
3122 {"Unable to read ack block value.",
3123 {kVarInt62OneByte + 9}}, // Ack 10 packets, 30..39 (inclusive)
3124 {"Unable to read gap block value.",
3125 {kVarInt62OneByte + 29}}, // A gap of 30 packets (0..29 inclusive)
3126 // should be too big, leaving no room
3127 // for the ack.
3128 {"Underflow with gap block length 30 previous ack block start is 30.",
3129 {kVarInt62OneByte + 10}}, // Don't care
3130 };
3131 // clang-format on
3132
3133 std::unique_ptr<QuicEncryptedPacket> encrypted(
3134 AssemblePacketFromFragments(packet99));
3135 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3136 EXPECT_EQ(
3137 framer_.detailed_error(),
3138 "Underflow with gap block length 30 previous ack block start is 30.");
3139 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3140}
3141
3142// This test checks that the ack frame processor correctly identifies
3143// and handles the case where the third ack block's length is larger than the
3144// available space in the ack range.
3145TEST_P(QuicFramerTest, ThirdAckBlockUnderflowAck) {
3146 if (framer_.transport_version() != QUIC_VERSION_99) {
3147 // for now, only v99
3148 return;
3149 }
zhongyi546cc452019-04-12 15:27:49 -07003150 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003151 // clang-format off
3152 PacketFragments packet99 = {
3153 // type (short header, 4 byte packet number)
3154 {"",
3155 {0x43}},
3156 // connection_id
3157 {"",
3158 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3159 // packet number
3160 {"",
3161 {0x12, 0x34, 0x56, 0x78}},
3162 // frame type (IETF_ACK frame)
3163 {"",
3164 {0x02}},
3165 // largest acked
3166 {"Unable to read largest acked.",
3167 {kVarInt62OneByte + 63}},
3168 // Zero delta time.
3169 {"Unable to read ack delay time.",
3170 {kVarInt62OneByte + 0x00}},
3171 // Ack block count (2 -- 2 blocks after the first)
3172 {"Unable to read ack block count.",
3173 {kVarInt62OneByte + 0x02}},
3174 // first ack block length.
3175 {"Unable to read first ack block length.",
3176 {kVarInt62OneByte + 13}}, // only 50 packet numbers "left"
3177
3178 {"Unable to read gap block value.",
3179 {kVarInt62OneByte + 10}}, // Only 40 packet numbers left
3180 {"Unable to read ack block value.",
3181 {kVarInt62OneByte + 10}}, // only 30 packet numbers left.
3182 {"Unable to read gap block value.",
3183 {kVarInt62OneByte + 1}}, // Gap is OK, 29 packet numbers left
3184 {"Unable to read ack block value.",
3185 {kVarInt62OneByte + 30}}, // Use up all 30, should be an error
3186 };
3187 // clang-format on
3188
3189 std::unique_ptr<QuicEncryptedPacket> encrypted(
3190 AssemblePacketFromFragments(packet99));
3191 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3192 EXPECT_EQ(framer_.detailed_error(),
3193 "Underflow with ack block length 31 latest ack block end is 25.");
3194 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3195}
3196
3197// Tests a variety of ack block wrap scenarios. For example, if the
3198// N-1th block causes packet 0 to be acked, then a gap would wrap
3199// around to 0x3fffffff ffffffff... Make sure we detect this
3200// condition.
3201TEST_P(QuicFramerTest, AckBlockUnderflowGapWrap) {
3202 if (framer_.transport_version() != QUIC_VERSION_99) {
3203 // for now, only v99
3204 return;
3205 }
zhongyi546cc452019-04-12 15:27:49 -07003206 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003207 // clang-format off
3208 PacketFragments packet99 = {
3209 // type (short header, 4 byte packet number)
3210 {"",
3211 {0x43}},
3212 // connection_id
3213 {"",
3214 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3215 // packet number
3216 {"",
3217 {0x12, 0x34, 0x56, 0x78}},
3218 // frame type (IETF_ACK frame)
3219 {"",
3220 {0x02}},
3221 // largest acked
3222 {"Unable to read largest acked.",
3223 {kVarInt62OneByte + 10}},
3224 // Zero delta time.
3225 {"Unable to read ack delay time.",
3226 {kVarInt62OneByte + 0x00}},
3227 // Ack block count (1 -- 1 blocks after the first)
3228 {"Unable to read ack block count.",
3229 {kVarInt62OneByte + 1}},
3230 // first ack block length.
3231 {"Unable to read first ack block length.",
3232 {kVarInt62OneByte + 9}}, // Ack packets 1..10 (inclusive)
3233
3234 {"Unable to read gap block value.",
3235 {kVarInt62OneByte + 1}}, // Gap of 2 packets (-1...0), should wrap
3236 {"Underflow with gap block length 2 previous ack block start is 1.",
3237 {kVarInt62OneByte + 9}}, // irrelevant
3238 };
3239 // clang-format on
3240
3241 std::unique_ptr<QuicEncryptedPacket> encrypted(
3242 AssemblePacketFromFragments(packet99));
3243 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3244 EXPECT_EQ(framer_.detailed_error(),
3245 "Underflow with gap block length 2 previous ack block start is 1.");
3246 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3247}
3248
3249// As AckBlockUnderflowGapWrap, but in this test, it's the ack
3250// component of the ack-block that causes the wrap, not the gap.
3251TEST_P(QuicFramerTest, AckBlockUnderflowAckWrap) {
3252 if (framer_.transport_version() != QUIC_VERSION_99) {
3253 // for now, only v99
3254 return;
3255 }
zhongyi546cc452019-04-12 15:27:49 -07003256 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003257 // clang-format off
3258 PacketFragments packet99 = {
3259 // type (short header, 4 byte packet number)
3260 {"",
3261 {0x43}},
3262 // connection_id
3263 {"",
3264 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3265 // packet number
3266 {"",
3267 {0x12, 0x34, 0x56, 0x78}},
3268 // frame type (IETF_ACK frame)
3269 {"",
3270 {0x02}},
3271 // largest acked
3272 {"Unable to read largest acked.",
3273 {kVarInt62OneByte + 10}},
3274 // Zero delta time.
3275 {"Unable to read ack delay time.",
3276 {kVarInt62OneByte + 0x00}},
3277 // Ack block count (1 -- 1 blocks after the first)
3278 {"Unable to read ack block count.",
3279 {kVarInt62OneByte + 1}},
3280 // first ack block length.
3281 {"Unable to read first ack block length.",
3282 {kVarInt62OneByte + 6}}, // Ack packets 4..10 (inclusive)
3283
3284 {"Unable to read gap block value.",
3285 {kVarInt62OneByte + 1}}, // Gap of 2 packets (2..3)
3286 {"Unable to read ack block value.",
3287 {kVarInt62OneByte + 9}}, // Should wrap.
3288 };
3289 // clang-format on
3290
3291 std::unique_ptr<QuicEncryptedPacket> encrypted(
3292 AssemblePacketFromFragments(packet99));
3293 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3294 EXPECT_EQ(framer_.detailed_error(),
3295 "Underflow with ack block length 10 latest ack block end is 1.");
3296 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3297}
3298
3299// An ack block that acks the entire range, 1...0x3fffffffffffffff
3300TEST_P(QuicFramerTest, AckBlockAcksEverything) {
3301 if (framer_.transport_version() != QUIC_VERSION_99) {
3302 // for now, only v99
3303 return;
3304 }
zhongyi546cc452019-04-12 15:27:49 -07003305 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003306 // clang-format off
3307 PacketFragments packet99 = {
3308 // type (short header, 4 byte packet number)
3309 {"",
3310 {0x43}},
3311 // connection_id
3312 {"",
3313 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3314 // packet number
3315 {"",
3316 {0x12, 0x34, 0x56, 0x78}},
3317 // frame type (IETF_ACK frame)
3318 {"",
3319 {0x02}},
3320 // largest acked
3321 {"Unable to read largest acked.",
3322 {kVarInt62EightBytes + 0x3f, 0xff, 0xff, 0xff,
3323 0xff, 0xff, 0xff, 0xff}},
3324 // Zero delta time.
3325 {"Unable to read ack delay time.",
3326 {kVarInt62OneByte + 0x00}},
3327 // Ack block count No additional blocks
3328 {"Unable to read ack block count.",
3329 {kVarInt62OneByte + 0}},
3330 // first ack block length.
3331 {"Unable to read first ack block length.",
3332 {kVarInt62EightBytes + 0x3f, 0xff, 0xff, 0xff,
3333 0xff, 0xff, 0xff, 0xfe}},
3334 };
3335 // clang-format on
3336
3337 std::unique_ptr<QuicEncryptedPacket> encrypted(
3338 AssemblePacketFromFragments(packet99));
3339 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3340 EXPECT_EQ(1u, visitor_.ack_frames_.size());
3341 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3342 EXPECT_EQ(1u, frame.packets.NumIntervals());
3343 EXPECT_EQ(kLargestIetfLargestObserved, LargestAcked(frame));
3344 EXPECT_EQ(kLargestIetfLargestObserved.ToUint64(),
3345 frame.packets.NumPacketsSlow());
3346}
3347
3348// This test looks for a malformed ack where
3349// - There is a largest-acked value (that is, the frame is acking
3350// something,
3351// - But the length of the first ack block is 0 saying that no frames
3352// are being acked with the largest-acked value or there are no
3353// additional ack blocks.
3354//
3355TEST_P(QuicFramerTest, AckFrameFirstAckBlockLengthZero) {
3356 if (framer_.transport_version() == QUIC_VERSION_99) {
3357 // Not applicable to version 99 -- first ack block contains the
3358 // number of packets that preceed the largest_acked packet.
3359 // A value of 0 means no packets preceed --- that the block's
3360 // length is 1. Therefore the condition that this test checks can
3361 // not arise.
3362 return;
3363 }
nharper9bb83462019-05-01 10:53:22 -07003364 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003365
3366 // clang-format off
3367 PacketFragments packet = {
3368 // public flags (8 byte connection_id)
3369 {"",
3370 { 0x2C }},
3371 // connection_id
3372 {"",
3373 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3374 // packet number
3375 {"",
3376 { 0x12, 0x34, 0x56, 0x78 }},
3377
3378 // frame type (ack frame)
3379 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3380 {"",
3381 { 0x65 }},
3382 // largest acked
3383 {"Unable to read largest acked.",
3384 { 0x12, 0x34 }},
3385 // Zero delta time.
3386 {"Unable to read ack delay time.",
3387 { 0x00, 0x00 }},
3388 // num ack blocks ranges.
3389 {"Unable to read num of ack blocks.",
3390 { 0x01 }},
3391 // first ack block length.
3392 {"Unable to read first ack block length.",
3393 { 0x00, 0x00 }},
3394 // gap to next block.
3395 { "First block length is zero.",
3396 { 0x01 }},
3397 // ack block length.
3398 { "First block length is zero.",
3399 { 0x0e, 0xaf }},
3400 // Number of timestamps.
3401 { "First block length is zero.",
3402 { 0x00 }},
3403 };
3404
3405 PacketFragments packet44 = {
3406 // type (short header, 4 byte packet number)
3407 {"",
3408 { 0x32 }},
3409 // connection_id
3410 {"",
3411 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3412 // packet number
3413 {"",
3414 { 0x12, 0x34, 0x56, 0x78 }},
3415
3416 // frame type (ack frame)
3417 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3418 {"",
3419 { 0x65 }},
3420 // largest acked
3421 {"Unable to read largest acked.",
3422 { 0x12, 0x34 }},
3423 // Zero delta time.
3424 {"Unable to read ack delay time.",
3425 { 0x00, 0x00 }},
3426 // num ack blocks ranges.
3427 {"Unable to read num of ack blocks.",
3428 { 0x01 }},
3429 // first ack block length.
3430 {"Unable to read first ack block length.",
3431 { 0x00, 0x00 }},
3432 // gap to next block.
3433 { "First block length is zero.",
3434 { 0x01 }},
3435 // ack block length.
3436 { "First block length is zero.",
3437 { 0x0e, 0xaf }},
3438 // Number of timestamps.
3439 { "First block length is zero.",
3440 { 0x00 }},
3441 };
3442
3443 PacketFragments packet46 = {
3444 // type (short header, 4 byte packet number)
3445 {"",
3446 { 0x43 }},
3447 // connection_id
3448 {"",
3449 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3450 // packet number
3451 {"",
3452 { 0x12, 0x34, 0x56, 0x78 }},
3453
3454 // frame type (ack frame)
3455 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3456 {"",
3457 { 0x65 }},
3458 // largest acked
3459 {"Unable to read largest acked.",
3460 { 0x12, 0x34 }},
3461 // Zero delta time.
3462 {"Unable to read ack delay time.",
3463 { 0x00, 0x00 }},
3464 // num ack blocks ranges.
3465 {"Unable to read num of ack blocks.",
3466 { 0x01 }},
3467 // first ack block length.
3468 {"Unable to read first ack block length.",
3469 { 0x00, 0x00 }},
3470 // gap to next block.
3471 { "First block length is zero.",
3472 { 0x01 }},
3473 // ack block length.
3474 { "First block length is zero.",
3475 { 0x0e, 0xaf }},
3476 // Number of timestamps.
3477 { "First block length is zero.",
3478 { 0x00 }},
3479 };
3480
3481 // clang-format on
3482 PacketFragments& fragments =
3483 framer_.transport_version() > QUIC_VERSION_44
3484 ? packet46
3485 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet);
3486
3487 std::unique_ptr<QuicEncryptedPacket> encrypted(
3488 AssemblePacketFromFragments(fragments));
3489
3490 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3491 EXPECT_EQ(QUIC_INVALID_ACK_DATA, framer_.error());
3492
3493 ASSERT_TRUE(visitor_.header_.get());
3494 EXPECT_TRUE(CheckDecryption(
3495 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3496 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
3497
3498 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3499 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3500
3501 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3502}
3503
3504TEST_P(QuicFramerTest, AckFrameOneAckBlockMaxLength) {
zhongyi546cc452019-04-12 15:27:49 -07003505 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003506 // clang-format off
3507 PacketFragments packet = {
3508 // public flags (8 byte connection_id)
3509 {"",
3510 {0x2C}},
3511 // connection_id
3512 {"",
3513 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3514 // packet number
3515 {"",
3516 {0x12, 0x34, 0x56, 0x78}},
3517 // frame type (ack frame)
3518 // (one ack block, 4 byte largest observed, 2 byte block length)
3519 {"",
3520 {0x49}},
3521 // largest acked
3522 {"Unable to read largest acked.",
3523 {0x12, 0x34, 0x56, 0x78}},
3524 // Zero delta time.
3525 {"Unable to read ack delay time.",
3526 {0x00, 0x00}},
3527 // first ack block length.
3528 {"Unable to read first ack block length.",
3529 {0x12, 0x34}},
3530 // num timestamps.
3531 {"Unable to read num received packets.",
3532 {0x00}}
3533 };
3534
3535 PacketFragments packet44 = {
3536 // type (short header, 4 byte packet number)
3537 {"",
3538 {0x32}},
3539 // connection_id
3540 {"",
3541 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3542 // packet number
3543 {"",
3544 {0x56, 0x78, 0x9A, 0xBC}},
3545 // frame type (ack frame)
3546 // (one ack block, 4 byte largest observed, 2 byte block length)
3547 {"",
3548 {0x49}},
3549 // largest acked
3550 {"Unable to read largest acked.",
3551 {0x12, 0x34, 0x56, 0x78}},
3552 // Zero delta time.
3553 {"Unable to read ack delay time.",
3554 {0x00, 0x00}},
3555 // first ack block length.
3556 {"Unable to read first ack block length.",
3557 {0x12, 0x34}},
3558 // num timestamps.
3559 {"Unable to read num received packets.",
3560 {0x00}}
3561 };
3562
3563 PacketFragments packet46 = {
3564 // type (short header, 4 byte packet number)
3565 {"",
3566 {0x43}},
3567 // connection_id
3568 {"",
3569 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3570 // packet number
3571 {"",
3572 {0x56, 0x78, 0x9A, 0xBC}},
3573 // frame type (ack frame)
3574 // (one ack block, 4 byte largest observed, 2 byte block length)
3575 {"",
3576 {0x49}},
3577 // largest acked
3578 {"Unable to read largest acked.",
3579 {0x12, 0x34, 0x56, 0x78}},
3580 // Zero delta time.
3581 {"Unable to read ack delay time.",
3582 {0x00, 0x00}},
3583 // first ack block length.
3584 {"Unable to read first ack block length.",
3585 {0x12, 0x34}},
3586 // num timestamps.
3587 {"Unable to read num received packets.",
3588 {0x00}}
3589 };
3590
3591 PacketFragments packet99 = {
3592 // type (short header, 4 byte packet number)
3593 {"",
3594 {0x43}},
3595 // connection_id
3596 {"",
3597 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3598 // packet number
3599 {"",
3600 {0x56, 0x78, 0x9A, 0xBC}},
3601 // frame type (IETF_ACK frame)
3602 {"",
3603 {0x02}},
3604 // largest acked
3605 {"Unable to read largest acked.",
3606 {kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78}},
3607 // Zero delta time.
3608 {"Unable to read ack delay time.",
3609 {kVarInt62OneByte + 0x00}},
3610 // Number of ack blocks after first
3611 {"Unable to read ack block count.",
3612 {kVarInt62OneByte + 0x00}},
3613 // first ack block length.
3614 {"Unable to read first ack block length.",
3615 {kVarInt62TwoBytes + 0x12, 0x33}}
3616 };
3617 // clang-format on
3618
3619 PacketFragments& fragments =
3620 framer_.transport_version() == QUIC_VERSION_99
3621 ? packet99
3622 : (framer_.transport_version() > QUIC_VERSION_44
3623 ? packet46
3624 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
3625 : packet));
3626 std::unique_ptr<QuicEncryptedPacket> encrypted(
3627 AssemblePacketFromFragments(fragments));
3628 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3629
3630 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
3631 ASSERT_TRUE(visitor_.header_.get());
3632 EXPECT_TRUE(CheckDecryption(
3633 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3634 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
3635
3636 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3637 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3638 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3639 EXPECT_EQ(kPacketNumber, LargestAcked(frame));
3640 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
3641
3642 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3643}
3644
3645// Tests ability to handle multiple ackblocks after the first ack
3646// block. Non-version-99 tests include multiple timestamps as well.
3647TEST_P(QuicFramerTest, AckFrameTwoTimeStampsMultipleAckBlocks) {
zhongyi546cc452019-04-12 15:27:49 -07003648 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003649 // clang-format off
3650 PacketFragments packet = {
3651 // public flags (8 byte connection_id)
3652 {"",
3653 { 0x2C }},
3654 // connection_id
3655 {"",
3656 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3657 // packet number
3658 {"",
3659 { 0x12, 0x34, 0x56, 0x78 }},
3660
3661 // frame type (ack frame)
3662 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3663 {"",
3664 { 0x65 }},
3665 // largest acked
3666 {"Unable to read largest acked.",
3667 { 0x12, 0x34 }},
3668 // Zero delta time.
3669 {"Unable to read ack delay time.",
3670 { 0x00, 0x00 }},
3671 // num ack blocks ranges.
3672 {"Unable to read num of ack blocks.",
3673 { 0x04 }},
3674 // first ack block length.
3675 {"Unable to read first ack block length.",
3676 { 0x00, 0x01 }},
3677 // gap to next block.
3678 { "Unable to read gap to next ack block.",
3679 { 0x01 }},
3680 // ack block length.
3681 { "Unable to ack block length.",
3682 { 0x0e, 0xaf }},
3683 // gap to next block.
3684 { "Unable to read gap to next ack block.",
3685 { 0xff }},
3686 // ack block length.
3687 { "Unable to ack block length.",
3688 { 0x00, 0x00 }},
3689 // gap to next block.
3690 { "Unable to read gap to next ack block.",
3691 { 0x91 }},
3692 // ack block length.
3693 { "Unable to ack block length.",
3694 { 0x01, 0xea }},
3695 // gap to next block.
3696 { "Unable to read gap to next ack block.",
3697 { 0x05 }},
3698 // ack block length.
3699 { "Unable to ack block length.",
3700 { 0x00, 0x04 }},
3701 // Number of timestamps.
3702 { "Unable to read num received packets.",
3703 { 0x02 }},
3704 // Delta from largest observed.
3705 { "Unable to read sequence delta in received packets.",
3706 { 0x01 }},
3707 // Delta time.
3708 { "Unable to read time delta in received packets.",
3709 { 0x76, 0x54, 0x32, 0x10 }},
3710 // Delta from largest observed.
3711 { "Unable to read sequence delta in received packets.",
3712 { 0x02 }},
3713 // Delta time.
3714 { "Unable to read incremental time delta in received packets.",
3715 { 0x32, 0x10 }},
3716 };
3717
3718 PacketFragments packet44 = {
3719 // type (short header, 4 byte packet number)
3720 {"",
3721 { 0x32 }},
3722 // connection_id
3723 {"",
3724 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3725 // packet number
3726 {"",
3727 { 0x12, 0x34, 0x56, 0x78 }},
3728
3729 // frame type (ack frame)
3730 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3731 {"",
3732 { 0x65 }},
3733 // largest acked
3734 {"Unable to read largest acked.",
3735 { 0x12, 0x34 }},
3736 // Zero delta time.
3737 {"Unable to read ack delay time.",
3738 { 0x00, 0x00 }},
3739 // num ack blocks ranges.
3740 {"Unable to read num of ack blocks.",
3741 { 0x04 }},
3742 // first ack block length.
3743 {"Unable to read first ack block length.",
3744 { 0x00, 0x01 }},
3745 // gap to next block.
3746 { "Unable to read gap to next ack block.",
3747 { 0x01 }},
3748 // ack block length.
3749 { "Unable to ack block length.",
3750 { 0x0e, 0xaf }},
3751 // gap to next block.
3752 { "Unable to read gap to next ack block.",
3753 { 0xff }},
3754 // ack block length.
3755 { "Unable to ack block length.",
3756 { 0x00, 0x00 }},
3757 // gap to next block.
3758 { "Unable to read gap to next ack block.",
3759 { 0x91 }},
3760 // ack block length.
3761 { "Unable to ack block length.",
3762 { 0x01, 0xea }},
3763 // gap to next block.
3764 { "Unable to read gap to next ack block.",
3765 { 0x05 }},
3766 // ack block length.
3767 { "Unable to ack block length.",
3768 { 0x00, 0x04 }},
3769 // Number of timestamps.
3770 { "Unable to read num received packets.",
3771 { 0x02 }},
3772 // Delta from largest observed.
3773 { "Unable to read sequence delta in received packets.",
3774 { 0x01 }},
3775 // Delta time.
3776 { "Unable to read time delta in received packets.",
3777 { 0x76, 0x54, 0x32, 0x10 }},
3778 // Delta from largest observed.
3779 { "Unable to read sequence delta in received packets.",
3780 { 0x02 }},
3781 // Delta time.
3782 { "Unable to read incremental time delta in received packets.",
3783 { 0x32, 0x10 }},
3784 };
3785
3786 PacketFragments packet46 = {
3787 // type (short header, 4 byte packet number)
3788 {"",
3789 { 0x43 }},
3790 // connection_id
3791 {"",
3792 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3793 // packet number
3794 {"",
3795 { 0x12, 0x34, 0x56, 0x78 }},
3796
3797 // frame type (ack frame)
3798 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3799 {"",
3800 { 0x65 }},
3801 // largest acked
3802 {"Unable to read largest acked.",
3803 { 0x12, 0x34 }},
3804 // Zero delta time.
3805 {"Unable to read ack delay time.",
3806 { 0x00, 0x00 }},
3807 // num ack blocks ranges.
3808 {"Unable to read num of ack blocks.",
3809 { 0x04 }},
3810 // first ack block length.
3811 {"Unable to read first ack block length.",
3812 { 0x00, 0x01 }},
3813 // gap to next block.
3814 { "Unable to read gap to next ack block.",
3815 { 0x01 }},
3816 // ack block length.
3817 { "Unable to ack block length.",
3818 { 0x0e, 0xaf }},
3819 // gap to next block.
3820 { "Unable to read gap to next ack block.",
3821 { 0xff }},
3822 // ack block length.
3823 { "Unable to ack block length.",
3824 { 0x00, 0x00 }},
3825 // gap to next block.
3826 { "Unable to read gap to next ack block.",
3827 { 0x91 }},
3828 // ack block length.
3829 { "Unable to ack block length.",
3830 { 0x01, 0xea }},
3831 // gap to next block.
3832 { "Unable to read gap to next ack block.",
3833 { 0x05 }},
3834 // ack block length.
3835 { "Unable to ack block length.",
3836 { 0x00, 0x04 }},
3837 // Number of timestamps.
3838 { "Unable to read num received packets.",
3839 { 0x02 }},
3840 // Delta from largest observed.
3841 { "Unable to read sequence delta in received packets.",
3842 { 0x01 }},
3843 // Delta time.
3844 { "Unable to read time delta in received packets.",
3845 { 0x76, 0x54, 0x32, 0x10 }},
3846 // Delta from largest observed.
3847 { "Unable to read sequence delta in received packets.",
3848 { 0x02 }},
3849 // Delta time.
3850 { "Unable to read incremental time delta in received packets.",
3851 { 0x32, 0x10 }},
3852 };
3853
3854 PacketFragments packet99 = {
3855 // type (short header, 4 byte packet number)
3856 {"",
3857 { 0x43 }},
3858 // connection_id
3859 {"",
3860 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3861 // packet number
3862 {"",
3863 { 0x12, 0x34, 0x56, 0x78 }},
3864
3865 // frame type (IETF_ACK frame)
3866 {"",
3867 { 0x02 }},
3868 // largest acked
3869 {"Unable to read largest acked.",
3870 { kVarInt62TwoBytes + 0x12, 0x34 }}, // = 4660
3871 // Zero delta time.
3872 {"Unable to read ack delay time.",
3873 { kVarInt62OneByte + 0x00 }},
3874 // number of additional ack blocks
3875 {"Unable to read ack block count.",
3876 { kVarInt62OneByte + 0x03 }},
3877 // first ack block length.
3878 {"Unable to read first ack block length.",
3879 { kVarInt62OneByte + 0x00 }}, // 1st block length = 1
3880
3881 // Additional ACK Block #1
3882 // gap to next block.
3883 { "Unable to read gap block value.",
3884 { kVarInt62OneByte + 0x00 }}, // gap of 1 packet
3885 // ack block length.
3886 { "Unable to read ack block value.",
3887 { kVarInt62TwoBytes + 0x0e, 0xae }}, // 3759
3888
3889 // pre-version-99 test includes an ack block of 0 length. this
3890 // can not happen in version 99. ergo the second block is not
3891 // present in the v99 test and the gap length of the next block
3892 // is the sum of the two gaps in the pre-version-99 tests.
3893 // Additional ACK Block #2
3894 // gap to next block.
3895 { "Unable to read gap block value.",
3896 { kVarInt62TwoBytes + 0x01, 0x8f }}, // Gap is 400 (0x190) pkts
3897 // ack block length.
3898 { "Unable to read ack block value.",
3899 { kVarInt62TwoBytes + 0x01, 0xe9 }}, // block is 389 (x1ea) pkts
3900
3901 // Additional ACK Block #3
3902 // gap to next block.
3903 { "Unable to read gap block value.",
3904 { kVarInt62OneByte + 0x04 }}, // Gap is 5 packets.
3905 // ack block length.
3906 { "Unable to read ack block value.",
3907 { kVarInt62OneByte + 0x03 }}, // block is 3 packets.
3908 };
3909
3910 // clang-format on
3911 PacketFragments& fragments =
3912 framer_.transport_version() == QUIC_VERSION_99
3913 ? packet99
3914 : (framer_.transport_version() > QUIC_VERSION_44
3915 ? packet46
3916 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
3917 : packet));
3918
3919 std::unique_ptr<QuicEncryptedPacket> encrypted(
3920 AssemblePacketFromFragments(fragments));
3921
3922 framer_.set_process_timestamps(true);
3923 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3924
3925 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
3926 ASSERT_TRUE(visitor_.header_.get());
3927 EXPECT_TRUE(CheckDecryption(
3928 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3929 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
3930
3931 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3932 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3933 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3934 EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
3935 ASSERT_EQ(4254u, frame.packets.NumPacketsSlow());
3936 EXPECT_EQ(4u, frame.packets.NumIntervals());
3937 if (framer_.transport_version() == QUIC_VERSION_99) {
3938 EXPECT_EQ(0u, frame.received_packet_times.size());
3939 } else {
3940 EXPECT_EQ(2u, frame.received_packet_times.size());
3941 }
3942 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3943}
3944
3945TEST_P(QuicFramerTest, AckFrameTimeStampDeltaTooHigh) {
nharper9bb83462019-05-01 10:53:22 -07003946 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003947 // clang-format off
3948 unsigned char packet[] = {
3949 // public flags (8 byte connection_id)
3950 0x28,
3951 // connection_id
3952 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3953 // packet number
3954 0x12, 0x34, 0x56, 0x78,
3955
3956 // frame type (ack frame)
3957 // (no ack blocks, 1 byte largest observed, 1 byte block length)
3958 0x40,
3959 // largest acked
3960 0x01,
3961 // Zero delta time.
3962 0x00, 0x00,
3963 // first ack block length.
3964 0x01,
3965 // num timestamps.
3966 0x01,
3967 // Delta from largest observed.
3968 0x01,
3969 // Delta time.
3970 0x10, 0x32, 0x54, 0x76,
3971 };
3972
3973 unsigned char packet44[] = {
3974 // type (short header, 4 byte packet number)
3975 0x32,
3976 // connection_id
3977 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3978 // packet number
3979 0x12, 0x34, 0x56, 0x78,
3980
3981 // frame type (ack frame)
3982 // (no ack blocks, 1 byte largest observed, 1 byte block length)
3983 0x40,
3984 // largest acked
3985 0x01,
3986 // Zero delta time.
3987 0x00, 0x00,
3988 // first ack block length.
3989 0x01,
3990 // num timestamps.
3991 0x01,
3992 // Delta from largest observed.
3993 0x01,
3994 // Delta time.
3995 0x10, 0x32, 0x54, 0x76,
3996 };
3997
3998 unsigned char packet46[] = {
3999 // type (short header, 4 byte packet number)
4000 0x43,
4001 // connection_id
4002 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4003 // packet number
4004 0x12, 0x34, 0x56, 0x78,
4005
4006 // frame type (ack frame)
4007 // (no ack blocks, 1 byte largest observed, 1 byte block length)
4008 0x40,
4009 // largest acked
4010 0x01,
4011 // Zero delta time.
4012 0x00, 0x00,
4013 // first ack block length.
4014 0x01,
4015 // num timestamps.
4016 0x01,
4017 // Delta from largest observed.
4018 0x01,
4019 // Delta time.
4020 0x10, 0x32, 0x54, 0x76,
4021 };
4022 // clang-format on
4023 if (framer_.transport_version() == QUIC_VERSION_99) {
4024 return;
4025 }
4026 QuicEncryptedPacket encrypted(
4027 AsChars(framer_.transport_version() > QUIC_VERSION_44
4028 ? packet46
4029 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
4030 : packet)),
4031 QUIC_ARRAYSIZE(packet), false);
4032 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
4033 EXPECT_TRUE(QuicTextUtils::StartsWith(
4034 framer_.detailed_error(), "delta_from_largest_observed too high"));
4035}
4036
4037TEST_P(QuicFramerTest, AckFrameTimeStampSecondDeltaTooHigh) {
nharper9bb83462019-05-01 10:53:22 -07004038 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004039 // clang-format off
4040 unsigned char packet[] = {
4041 // public flags (8 byte connection_id)
4042 0x28,
4043 // connection_id
4044 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4045 // packet number
4046 0x12, 0x34, 0x56, 0x78,
4047
4048 // frame type (ack frame)
4049 // (no ack blocks, 1 byte largest observed, 1 byte block length)
4050 0x40,
4051 // largest acked
4052 0x03,
4053 // Zero delta time.
4054 0x00, 0x00,
4055 // first ack block length.
4056 0x03,
4057 // num timestamps.
4058 0x02,
4059 // Delta from largest observed.
4060 0x01,
4061 // Delta time.
4062 0x10, 0x32, 0x54, 0x76,
4063 // Delta from largest observed.
4064 0x03,
4065 // Delta time.
4066 0x10, 0x32,
4067 };
4068
4069 unsigned char packet44[] = {
4070 // type (short header, 4 byte packet number)
4071 0x32,
4072 // connection_id
4073 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4074 // packet number
4075 0x12, 0x34, 0x56, 0x78,
4076
4077 // frame type (ack frame)
4078 // (no ack blocks, 1 byte largest observed, 1 byte block length)
4079 0x40,
4080 // largest acked
4081 0x03,
4082 // Zero delta time.
4083 0x00, 0x00,
4084 // first ack block length.
4085 0x03,
4086 // num timestamps.
4087 0x02,
4088 // Delta from largest observed.
4089 0x01,
4090 // Delta time.
4091 0x10, 0x32, 0x54, 0x76,
4092 // Delta from largest observed.
4093 0x03,
4094 // Delta time.
4095 0x10, 0x32,
4096 };
4097
4098 unsigned char packet46[] = {
4099 // type (short header, 4 byte packet number)
4100 0x43,
4101 // connection_id
4102 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4103 // packet number
4104 0x12, 0x34, 0x56, 0x78,
4105
4106 // frame type (ack frame)
4107 // (no ack blocks, 1 byte largest observed, 1 byte block length)
4108 0x40,
4109 // largest acked
4110 0x03,
4111 // Zero delta time.
4112 0x00, 0x00,
4113 // first ack block length.
4114 0x03,
4115 // num timestamps.
4116 0x02,
4117 // Delta from largest observed.
4118 0x01,
4119 // Delta time.
4120 0x10, 0x32, 0x54, 0x76,
4121 // Delta from largest observed.
4122 0x03,
4123 // Delta time.
4124 0x10, 0x32,
4125 };
4126 // clang-format on
4127 if (framer_.transport_version() == QUIC_VERSION_99) {
4128 return;
4129 }
4130 QuicEncryptedPacket encrypted(
4131 AsChars(framer_.transport_version() > QUIC_VERSION_44
4132 ? packet46
4133 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
4134 : packet)),
4135 QUIC_ARRAYSIZE(packet), false);
4136 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
4137 EXPECT_TRUE(QuicTextUtils::StartsWith(
4138 framer_.detailed_error(), "delta_from_largest_observed too high"));
4139}
4140
4141TEST_P(QuicFramerTest, NewStopWaitingFrame) {
4142 if (version_.transport_version == QUIC_VERSION_99) {
4143 return;
4144 }
nharper9bb83462019-05-01 10:53:22 -07004145 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004146 // clang-format off
4147 PacketFragments packet = {
4148 // public flags (8 byte connection_id)
4149 {"",
4150 {0x2C}},
4151 // connection_id
4152 {"",
4153 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4154 // packet number
4155 {"",
4156 {0x12, 0x34, 0x56, 0x78}},
4157 // frame type (stop waiting frame)
4158 {"",
4159 {0x06}},
4160 // least packet number awaiting an ack, delta from packet number.
4161 {"Unable to read least unacked delta.",
4162 {0x00, 0x00, 0x00, 0x08}}
4163 };
4164
4165 PacketFragments packet44 = {
4166 // type (short header, 4 byte packet number)
4167 {"",
4168 {0x32}},
4169 // connection_id
4170 {"",
4171 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4172 // packet number
4173 {"",
4174 {0x12, 0x34, 0x56, 0x78}},
4175 // frame type (stop waiting frame)
4176 {"",
4177 {0x06}},
4178 // least packet number awaiting an ack, delta from packet number.
4179 {"Unable to read least unacked delta.",
4180 {0x00, 0x00, 0x00, 0x08}}
4181 };
4182
4183 PacketFragments packet46 = {
4184 // type (short header, 4 byte packet number)
4185 {"",
4186 {0x43}},
4187 // connection_id
4188 {"",
4189 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4190 // packet number
4191 {"",
4192 {0x12, 0x34, 0x56, 0x78}},
4193 // frame type (stop waiting frame)
4194 {"",
4195 {0x06}},
4196 // least packet number awaiting an ack, delta from packet number.
4197 {"Unable to read least unacked delta.",
4198 {0x00, 0x00, 0x00, 0x08}}
4199 };
4200 // clang-format on
4201
4202 PacketFragments& fragments =
4203 framer_.transport_version() > QUIC_VERSION_44
4204 ? packet46
4205 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet);
4206
4207 std::unique_ptr<QuicEncryptedPacket> encrypted(
4208 AssemblePacketFromFragments(fragments));
ianswett97b690b2019-05-02 15:12:43 -07004209 if (GetQuicReloadableFlag(quic_do_not_accept_stop_waiting) &&
4210 version_.transport_version >= QUIC_VERSION_44) {
4211 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
4212 EXPECT_EQ(QUIC_INVALID_STOP_WAITING_DATA, framer_.error());
4213 EXPECT_EQ("STOP WAITING not supported in version 44+.",
4214 framer_.detailed_error());
4215 return;
4216 }
4217
QUICHE teama6ef0a62019-03-07 20:34:33 -05004218 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4219
4220 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4221 ASSERT_TRUE(visitor_.header_.get());
4222 EXPECT_TRUE(CheckDecryption(
4223 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4224 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4225
4226 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4227 ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size());
4228 const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0];
4229 EXPECT_EQ(kLeastUnacked, frame.least_unacked);
4230
4231 CheckFramingBoundaries(fragments, QUIC_INVALID_STOP_WAITING_DATA);
4232}
4233
4234TEST_P(QuicFramerTest, InvalidNewStopWaitingFrame) {
ianswett97b690b2019-05-02 15:12:43 -07004235 if (version_.transport_version == QUIC_VERSION_99 ||
4236 (GetQuicReloadableFlag(quic_do_not_accept_stop_waiting) &&
4237 version_.transport_version >= QUIC_VERSION_44)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004238 return;
4239 }
nharper9bb83462019-05-01 10:53:22 -07004240 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004241 // clang-format off
4242 unsigned char packet[] = {
4243 // public flags (8 byte connection_id)
4244 0x2C,
4245 // connection_id
4246 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4247 // packet number
4248 0x12, 0x34, 0x56, 0x78,
4249 // frame type (stop waiting frame)
4250 0x06,
4251 // least packet number awaiting an ack, delta from packet number.
4252 0x13, 0x34, 0x56, 0x78,
4253 0x9A, 0xA8,
4254 };
4255
4256 unsigned char packet44[] = {
4257 // type (short header, 4 byte packet number)
4258 0x32,
4259 // connection_id
4260 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4261 // packet number
4262 0x12, 0x34, 0x56, 0x78,
4263 // frame type (stop waiting frame)
4264 0x06,
4265 // least packet number awaiting an ack, delta from packet number.
4266 0x57, 0x78, 0x9A, 0xA8,
4267 };
4268
4269 unsigned char packet46[] = {
4270 // type (short header, 4 byte packet number)
4271 0x43,
4272 // connection_id
4273 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4274 // packet number
4275 0x12, 0x34, 0x56, 0x78,
4276 // frame type (stop waiting frame)
4277 0x06,
4278 // least packet number awaiting an ack, delta from packet number.
4279 0x57, 0x78, 0x9A, 0xA8,
4280 };
4281 // clang-format on
4282
4283 QuicEncryptedPacket encrypted(
4284 AsChars(framer_.transport_version() > QUIC_VERSION_44
4285 ? packet46
4286 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
4287 : packet)),
4288 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44)
4289 : QUIC_ARRAYSIZE(packet),
4290 false);
4291 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
4292 EXPECT_EQ(QUIC_INVALID_STOP_WAITING_DATA, framer_.error());
4293 EXPECT_EQ("Invalid unacked delta.", framer_.detailed_error());
4294}
4295
4296TEST_P(QuicFramerTest, RstStreamFrame) {
zhongyi546cc452019-04-12 15:27:49 -07004297 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004298 // clang-format off
4299 PacketFragments packet = {
4300 // public flags (8 byte connection_id)
4301 {"",
4302 {0x28}},
4303 // connection_id
4304 {"",
4305 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4306 // packet number
4307 {"",
4308 {0x12, 0x34, 0x56, 0x78}},
4309 // frame type (rst stream frame)
4310 {"",
4311 {0x01}},
4312 // stream id
4313 {"Unable to read stream_id.",
4314 {0x01, 0x02, 0x03, 0x04}},
4315 // sent byte offset
4316 {"Unable to read rst stream sent byte offset.",
4317 {0x3A, 0x98, 0xFE, 0xDC,
4318 0x32, 0x10, 0x76, 0x54}},
4319 // error code
4320 {"Unable to read rst stream error code.",
4321 {0x00, 0x00, 0x00, 0x01}}
4322 };
4323
4324 PacketFragments packet44 = {
4325 // type (short header, 4 byte packet number)
4326 {"",
4327 {0x32}},
4328 // connection_id
4329 {"",
4330 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4331 // packet number
4332 {"",
4333 {0x12, 0x34, 0x56, 0x78}},
4334 // frame type (rst stream frame)
4335 {"",
4336 {0x01}},
4337 // stream id
4338 {"Unable to read stream_id.",
4339 {0x01, 0x02, 0x03, 0x04}},
4340 // sent byte offset
4341 {"Unable to read rst stream sent byte offset.",
4342 {0x3A, 0x98, 0xFE, 0xDC,
4343 0x32, 0x10, 0x76, 0x54}},
4344 // error code
4345 {"Unable to read rst stream error code.",
4346 {0x00, 0x00, 0x00, 0x01}}
4347 };
4348
4349 PacketFragments packet46 = {
4350 // type (short header, 4 byte packet number)
4351 {"",
4352 {0x43}},
4353 // connection_id
4354 {"",
4355 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4356 // packet number
4357 {"",
4358 {0x12, 0x34, 0x56, 0x78}},
4359 // frame type (rst stream frame)
4360 {"",
4361 {0x01}},
4362 // stream id
4363 {"Unable to read stream_id.",
4364 {0x01, 0x02, 0x03, 0x04}},
4365 // sent byte offset
4366 {"Unable to read rst stream sent byte offset.",
4367 {0x3A, 0x98, 0xFE, 0xDC,
4368 0x32, 0x10, 0x76, 0x54}},
4369 // error code
4370 {"Unable to read rst stream error code.",
4371 {0x00, 0x00, 0x00, 0x01}}
4372 };
4373
4374 PacketFragments packet99 = {
4375 // type (short header, 4 byte packet number)
4376 {"",
4377 {0x43}},
4378 // connection_id
4379 {"",
4380 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4381 // packet number
4382 {"",
4383 {0x12, 0x34, 0x56, 0x78}},
4384 // frame type (IETF_RST_STREAM frame)
4385 {"",
4386 {0x04}},
4387 // stream id
4388 {"Unable to read rst stream stream id.",
4389 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4390 // application error code
4391 {"Unable to read rst stream error code.",
4392 {0x00, 0x01}}, // Not varint62 encoded
4393 // Final Offset
4394 {"Unable to read rst stream sent byte offset.",
4395 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}}
4396 };
4397 // clang-format on
4398
4399 PacketFragments& fragments =
4400 framer_.transport_version() == QUIC_VERSION_99
4401 ? packet99
4402 : (framer_.transport_version() > QUIC_VERSION_44
4403 ? packet46
4404 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
4405 : packet));
4406 std::unique_ptr<QuicEncryptedPacket> encrypted(
4407 AssemblePacketFromFragments(fragments));
4408 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4409
4410 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4411 ASSERT_TRUE(visitor_.header_.get());
4412 EXPECT_TRUE(CheckDecryption(
4413 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4414 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4415
4416 EXPECT_EQ(kStreamId, visitor_.rst_stream_frame_.stream_id);
4417 EXPECT_EQ(0x01, visitor_.rst_stream_frame_.error_code);
4418 EXPECT_EQ(kStreamOffset, visitor_.rst_stream_frame_.byte_offset);
4419 CheckFramingBoundaries(fragments, QUIC_INVALID_RST_STREAM_DATA);
4420}
4421
4422TEST_P(QuicFramerTest, ConnectionCloseFrame) {
zhongyi546cc452019-04-12 15:27:49 -07004423 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004424 // clang-format off
4425 PacketFragments packet = {
4426 // public flags (8 byte connection_id)
4427 {"",
4428 {0x28}},
4429 // connection_id
4430 {"",
4431 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4432 // packet number
4433 {"",
4434 {0x12, 0x34, 0x56, 0x78}},
4435 // frame type (connection close frame)
4436 {"",
4437 {0x02}},
4438 // error code
4439 {"Unable to read connection close error code.",
4440 {0x00, 0x00, 0x00, 0x11}},
4441 {"Unable to read connection close error details.",
4442 {
4443 // error details length
4444 0x0, 0x0d,
4445 // error details
4446 'b', 'e', 'c', 'a',
4447 'u', 's', 'e', ' ',
4448 'I', ' ', 'c', 'a',
4449 'n'}
4450 }
4451 };
4452
4453 PacketFragments packet44 = {
4454 // type (short header, 4 byte packet number)
4455 {"",
4456 {0x32}},
4457 // connection_id
4458 {"",
4459 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4460 // packet number
4461 {"",
4462 {0x12, 0x34, 0x56, 0x78}},
4463 // frame type (connection close frame)
4464 {"",
4465 {0x02}},
4466 // error code
4467 {"Unable to read connection close error code.",
4468 {0x00, 0x00, 0x00, 0x11}},
4469 {"Unable to read connection close error details.",
4470 {
4471 // error details length
4472 0x0, 0x0d,
4473 // error details
4474 'b', 'e', 'c', 'a',
4475 'u', 's', 'e', ' ',
4476 'I', ' ', 'c', 'a',
4477 'n'}
4478 }
4479 };
4480
4481 PacketFragments packet46 = {
4482 // type (short header, 4 byte packet number)
4483 {"",
4484 {0x43}},
4485 // connection_id
4486 {"",
4487 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4488 // packet number
4489 {"",
4490 {0x12, 0x34, 0x56, 0x78}},
4491 // frame type (connection close frame)
4492 {"",
4493 {0x02}},
4494 // error code
4495 {"Unable to read connection close error code.",
4496 {0x00, 0x00, 0x00, 0x11}},
4497 {"Unable to read connection close error details.",
4498 {
4499 // error details length
4500 0x0, 0x0d,
4501 // error details
4502 'b', 'e', 'c', 'a',
4503 'u', 's', 'e', ' ',
4504 'I', ' ', 'c', 'a',
4505 'n'}
4506 }
4507 };
4508
4509 PacketFragments packet99 = {
4510 // type (short header, 4 byte packet number)
4511 {"",
4512 {0x43}},
4513 // connection_id
4514 {"",
4515 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4516 // packet number
4517 {"",
4518 {0x12, 0x34, 0x56, 0x78}},
4519 // frame type (IETF_CONNECTION_CLOSE frame)
4520 {"",
4521 {0x1c}},
4522 // error code
4523 {"Unable to read connection close error code.",
4524 {0x00, 0x11}},
4525 {"Unable to read connection close frame type.",
4526 {kVarInt62TwoBytes + 0x12, 0x34 }},
4527 {"Unable to read connection close error details.",
4528 {
4529 // error details length
4530 kVarInt62OneByte + 0x0d,
4531 // error details
4532 'b', 'e', 'c', 'a',
4533 'u', 's', 'e', ' ',
4534 'I', ' ', 'c', 'a',
4535 'n'}
4536 }
4537 };
4538 // clang-format on
4539
4540 PacketFragments& fragments =
4541 framer_.transport_version() == QUIC_VERSION_99
4542 ? packet99
4543 : (framer_.transport_version() > QUIC_VERSION_44
4544 ? packet46
4545 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
4546 : packet));
4547 std::unique_ptr<QuicEncryptedPacket> encrypted(
4548 AssemblePacketFromFragments(fragments));
4549 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4550
4551 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4552 ASSERT_TRUE(visitor_.header_.get());
4553 EXPECT_TRUE(CheckDecryption(
4554 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4555 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4556
4557 EXPECT_EQ(0u, visitor_.stream_frames_.size());
zhongyiba6354a2019-04-10 16:49:25 -07004558 EXPECT_EQ(0x11u, static_cast<unsigned>(
4559 visitor_.connection_close_frame_.quic_error_code));
QUICHE teama6ef0a62019-03-07 20:34:33 -05004560 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4561 if (framer_.transport_version() == QUIC_VERSION_99) {
fkastenholze9d71a82019-04-09 05:12:13 -07004562 EXPECT_EQ(0x1234u,
4563 visitor_.connection_close_frame_.transport_close_frame_type);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004564 }
4565
4566 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4567
4568 CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4569}
4570
fkastenholz04bd4f32019-04-16 12:24:38 -07004571// Test the CONNECTION_CLOSE/Application variant.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004572TEST_P(QuicFramerTest, ApplicationCloseFrame) {
4573 if (framer_.transport_version() != QUIC_VERSION_99) {
4574 // This frame does not exist in versions other than 99.
4575 return;
4576 }
zhongyi546cc452019-04-12 15:27:49 -07004577 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004578
4579 // clang-format off
4580 PacketFragments packet99 = {
4581 // type (short header, 4 byte packet number)
4582 {"",
4583 {0x43}},
4584 // connection_id
4585 {"",
4586 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4587 // packet number
4588 {"",
4589 {0x12, 0x34, 0x56, 0x78}},
fkastenholz72f509b2019-04-10 09:17:49 -07004590 // frame type (IETF_CONNECTION_CLOSE/Application frame)
QUICHE teama6ef0a62019-03-07 20:34:33 -05004591 {"",
4592 {0x1d}},
4593 // error code
fkastenholz72f509b2019-04-10 09:17:49 -07004594 {"Unable to read connection close error code.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05004595 {0x00, 0x11}},
fkastenholz72f509b2019-04-10 09:17:49 -07004596 {"Unable to read connection close error details.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05004597 {
4598 // error details length
4599 kVarInt62OneByte + 0x0d,
4600 // error details
4601 'b', 'e', 'c', 'a',
4602 'u', 's', 'e', ' ',
4603 'I', ' ', 'c', 'a',
4604 'n'}
4605 }
4606 };
4607 // clang-format on
4608
4609 std::unique_ptr<QuicEncryptedPacket> encrypted(
4610 AssemblePacketFromFragments(packet99));
4611 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4612
4613 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4614 ASSERT_TRUE(visitor_.header_.get());
4615 EXPECT_TRUE(CheckDecryption(
4616 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4617 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4618
4619 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4620
fkastenholz72f509b2019-04-10 09:17:49 -07004621 EXPECT_EQ(IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
4622 visitor_.connection_close_frame_.close_type);
4623 EXPECT_EQ(122u, visitor_.connection_close_frame_.extracted_error_code);
4624 EXPECT_EQ(0x11, visitor_.connection_close_frame_.quic_error_code);
4625 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004626
4627 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4628
fkastenholz04bd4f32019-04-16 12:24:38 -07004629 CheckFramingBoundaries(packet99, QUIC_INVALID_CONNECTION_CLOSE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004630}
4631
4632TEST_P(QuicFramerTest, GoAwayFrame) {
4633 if (framer_.transport_version() == QUIC_VERSION_99) {
4634 // This frame is not supported in version 99.
4635 return;
4636 }
nharper9bb83462019-05-01 10:53:22 -07004637 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004638 // clang-format off
4639 PacketFragments packet = {
4640 // public flags (8 byte connection_id)
4641 {"",
4642 {0x28}},
4643 // connection_id
4644 {"",
4645 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4646 // packet number
4647 {"",
4648 {0x12, 0x34, 0x56, 0x78}},
4649 // frame type (go away frame)
4650 {"",
4651 {0x03}},
4652 // error code
4653 {"Unable to read go away error code.",
4654 {0x00, 0x00, 0x00, 0x09}},
4655 // stream id
4656 {"Unable to read last good stream id.",
4657 {0x01, 0x02, 0x03, 0x04}},
4658 // stream id
4659 {"Unable to read goaway reason.",
4660 {
4661 // error details length
4662 0x0, 0x0d,
4663 // error details
4664 'b', 'e', 'c', 'a',
4665 'u', 's', 'e', ' ',
4666 'I', ' ', 'c', 'a',
4667 'n'}
4668 }
4669 };
4670
4671 PacketFragments packet44 = {
4672 // type (short header, 4 byte packet number)
4673 {"",
4674 {0x32}},
4675 // connection_id
4676 {"",
4677 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4678 // packet number
4679 {"",
4680 {0x12, 0x34, 0x56, 0x78}},
4681 // frame type (go away frame)
4682 {"",
4683 {0x03}},
4684 // error code
4685 {"Unable to read go away error code.",
4686 {0x00, 0x00, 0x00, 0x09}},
4687 // stream id
4688 {"Unable to read last good stream id.",
4689 {0x01, 0x02, 0x03, 0x04}},
4690 // stream id
4691 {"Unable to read goaway reason.",
4692 {
4693 // error details length
4694 0x0, 0x0d,
4695 // error details
4696 'b', 'e', 'c', 'a',
4697 'u', 's', 'e', ' ',
4698 'I', ' ', 'c', 'a',
4699 'n'}
4700 }
4701 };
4702
4703 PacketFragments packet46 = {
4704 // type (short header, 4 byte packet number)
4705 {"",
4706 {0x43}},
4707 // connection_id
4708 {"",
4709 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4710 // packet number
4711 {"",
4712 {0x12, 0x34, 0x56, 0x78}},
4713 // frame type (go away frame)
4714 {"",
4715 {0x03}},
4716 // error code
4717 {"Unable to read go away error code.",
4718 {0x00, 0x00, 0x00, 0x09}},
4719 // stream id
4720 {"Unable to read last good stream id.",
4721 {0x01, 0x02, 0x03, 0x04}},
4722 // stream id
4723 {"Unable to read goaway reason.",
4724 {
4725 // error details length
4726 0x0, 0x0d,
4727 // error details
4728 'b', 'e', 'c', 'a',
4729 'u', 's', 'e', ' ',
4730 'I', ' ', 'c', 'a',
4731 'n'}
4732 }
4733 };
4734 // clang-format on
4735
4736 PacketFragments& fragments =
4737 framer_.transport_version() > QUIC_VERSION_44
4738 ? packet46
4739 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet);
4740 std::unique_ptr<QuicEncryptedPacket> encrypted(
4741 AssemblePacketFromFragments(fragments));
4742 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4743
4744 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4745 ASSERT_TRUE(visitor_.header_.get());
4746 EXPECT_TRUE(CheckDecryption(
4747 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4748 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4749
4750 EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id);
4751 EXPECT_EQ(0x9, visitor_.goaway_frame_.error_code);
4752 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase);
4753
4754 CheckFramingBoundaries(fragments, QUIC_INVALID_GOAWAY_DATA);
4755}
4756
4757TEST_P(QuicFramerTest, WindowUpdateFrame) {
4758 if (framer_.transport_version() == QUIC_VERSION_99) {
4759 // This frame is not in version 99, see MaxDataFrame and MaxStreamDataFrame
4760 // for Version 99 equivalents.
4761 return;
4762 }
nharper9bb83462019-05-01 10:53:22 -07004763 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004764 // clang-format off
4765 PacketFragments packet = {
4766 // public flags (8 byte connection_id)
4767 {"",
4768 {0x28}},
4769 // connection_id
4770 {"",
4771 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4772 // packet number
4773 {"",
4774 {0x12, 0x34, 0x56, 0x78}},
4775 // frame type (window update frame)
4776 {"",
4777 {0x04}},
4778 // stream id
4779 {"Unable to read stream_id.",
4780 {0x01, 0x02, 0x03, 0x04}},
4781 // byte offset
4782 {"Unable to read window byte_offset.",
4783 {0x3A, 0x98, 0xFE, 0xDC,
4784 0x32, 0x10, 0x76, 0x54}},
4785 };
4786
4787 PacketFragments packet44 = {
4788 // type (short header, 4 byte packet number)
4789 {"",
4790 {0x32}},
4791 // connection_id
4792 {"",
4793 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4794 // packet number
4795 {"",
4796 {0x12, 0x34, 0x56, 0x78}},
4797 // frame type (window update frame)
4798 {"",
4799 {0x04}},
4800 // stream id
4801 {"Unable to read stream_id.",
4802 {0x01, 0x02, 0x03, 0x04}},
4803 // byte offset
4804 {"Unable to read window byte_offset.",
4805 {0x3A, 0x98, 0xFE, 0xDC,
4806 0x32, 0x10, 0x76, 0x54}},
4807 };
4808
4809 PacketFragments packet46 = {
4810 // type (short header, 4 byte packet number)
4811 {"",
4812 {0x43}},
4813 // connection_id
4814 {"",
4815 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4816 // packet number
4817 {"",
4818 {0x12, 0x34, 0x56, 0x78}},
4819 // frame type (window update frame)
4820 {"",
4821 {0x04}},
4822 // stream id
4823 {"Unable to read stream_id.",
4824 {0x01, 0x02, 0x03, 0x04}},
4825 // byte offset
4826 {"Unable to read window byte_offset.",
4827 {0x3A, 0x98, 0xFE, 0xDC,
4828 0x32, 0x10, 0x76, 0x54}},
4829 };
4830
4831 // clang-format on
4832
4833 PacketFragments& fragments =
4834 framer_.transport_version() > QUIC_VERSION_44
4835 ? packet46
4836 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet);
4837 std::unique_ptr<QuicEncryptedPacket> encrypted(
4838 AssemblePacketFromFragments(fragments));
4839 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4840
4841 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4842 ASSERT_TRUE(visitor_.header_.get());
4843 EXPECT_TRUE(CheckDecryption(
4844 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4845 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4846
4847 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
4848 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.byte_offset);
4849
4850 CheckFramingBoundaries(fragments, QUIC_INVALID_WINDOW_UPDATE_DATA);
4851}
4852
4853TEST_P(QuicFramerTest, MaxDataFrame) {
4854 if (framer_.transport_version() != QUIC_VERSION_99) {
4855 // This frame is available only in version 99.
4856 return;
4857 }
zhongyi546cc452019-04-12 15:27:49 -07004858 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004859 // clang-format off
4860 PacketFragments packet99 = {
4861 // type (short header, 4 byte packet number)
4862 {"",
4863 {0x43}},
4864 // connection_id
4865 {"",
4866 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4867 // packet number
4868 {"",
4869 {0x12, 0x34, 0x56, 0x78}},
4870 // frame type (IETF_MAX_DATA frame)
4871 {"",
4872 {0x10}},
4873 // byte offset
4874 {"Can not read MAX_DATA byte-offset",
4875 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
4876 0x32, 0x10, 0x76, 0x54}},
4877 };
4878 // clang-format on
4879
4880 std::unique_ptr<QuicEncryptedPacket> encrypted(
4881 AssemblePacketFromFragments(packet99));
4882 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4883
4884 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4885 ASSERT_TRUE(visitor_.header_.get());
4886 EXPECT_TRUE(CheckDecryption(
4887 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4888 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4889
4890 EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
4891 visitor_.window_update_frame_.stream_id);
4892 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.byte_offset);
4893
4894 CheckFramingBoundaries(packet99, QUIC_INVALID_MAX_DATA_FRAME_DATA);
4895}
4896
4897TEST_P(QuicFramerTest, MaxStreamDataFrame) {
4898 if (framer_.transport_version() != QUIC_VERSION_99) {
4899 // This frame available only in version 99.
4900 return;
4901 }
zhongyi546cc452019-04-12 15:27:49 -07004902 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004903 // clang-format off
4904 PacketFragments packet99 = {
4905 // type (short header, 4 byte packet number)
4906 {"",
4907 {0x43}},
4908 // connection_id
4909 {"",
4910 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4911 // packet number
4912 {"",
4913 {0x12, 0x34, 0x56, 0x78}},
4914 // frame type (IETF_MAX_STREAM_DATA frame)
4915 {"",
4916 {0x11}},
4917 // stream id
4918 {"Can not read MAX_STREAM_DATA stream id",
4919 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4920 // byte offset
4921 {"Can not read MAX_STREAM_DATA byte-count",
4922 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
4923 0x32, 0x10, 0x76, 0x54}},
4924 };
4925 // clang-format on
4926
4927 std::unique_ptr<QuicEncryptedPacket> encrypted(
4928 AssemblePacketFromFragments(packet99));
4929 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4930
4931 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4932 ASSERT_TRUE(visitor_.header_.get());
4933 EXPECT_TRUE(CheckDecryption(
4934 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4935 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4936
4937 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
4938 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.byte_offset);
4939
4940 CheckFramingBoundaries(packet99, QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA);
4941}
4942
4943TEST_P(QuicFramerTest, BlockedFrame) {
zhongyi546cc452019-04-12 15:27:49 -07004944 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004945 // clang-format off
4946 PacketFragments packet = {
4947 // public flags (8 byte connection_id)
4948 {"",
4949 {0x28}},
4950 // connection_id
4951 {"",
4952 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4953 // packet number
4954 {"",
4955 {0x12, 0x34, 0x56, 0x78}},
4956 // frame type (blocked frame)
4957 {"",
4958 {0x05}},
4959 // stream id
4960 {"Unable to read stream_id.",
4961 {0x01, 0x02, 0x03, 0x04}},
4962 };
4963
4964 PacketFragments packet44 = {
4965 // type (short header, 4 byte packet number)
4966 {"",
4967 {0x32}},
4968 // connection_id
4969 {"",
4970 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4971 // packet number
4972 {"",
4973 {0x12, 0x34, 0x56, 0x78}},
4974 // frame type (blocked frame)
4975 {"",
4976 {0x05}},
4977 // stream id
4978 {"Unable to read stream_id.",
4979 {0x01, 0x02, 0x03, 0x04}},
4980 };
4981
4982 PacketFragments packet46 = {
4983 // type (short header, 4 byte packet number)
4984 {"",
4985 {0x43}},
4986 // connection_id
4987 {"",
4988 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4989 // packet number
4990 {"",
4991 {0x12, 0x34, 0x56, 0x78}},
4992 // frame type (blocked frame)
4993 {"",
4994 {0x05}},
4995 // stream id
4996 {"Unable to read stream_id.",
4997 {0x01, 0x02, 0x03, 0x04}},
4998 };
4999
5000 PacketFragments packet99 = {
5001 // type (short header, 4 byte packet number)
5002 {"",
5003 {0x43}},
5004 // connection_id
5005 {"",
5006 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5007 // packet number
5008 {"",
5009 {0x12, 0x34, 0x56, 0x78}},
5010 // frame type (IETF_STREAM_BLOCKED frame)
5011 {"",
5012 {0x15}},
5013 // stream id
5014 {"Can not read stream blocked stream id.",
5015 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
5016 // Offset
5017 {"Can not read stream blocked offset.",
5018 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
5019 };
5020 // clang-format on
5021
5022 PacketFragments& fragments =
5023 framer_.transport_version() == QUIC_VERSION_99
5024 ? packet99
5025 : (framer_.transport_version() > QUIC_VERSION_44
5026 ? packet46
5027 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
5028 : packet));
5029 std::unique_ptr<QuicEncryptedPacket> encrypted(
5030 AssemblePacketFromFragments(fragments));
5031 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5032
5033 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
5034 ASSERT_TRUE(visitor_.header_.get());
5035 EXPECT_TRUE(CheckDecryption(
5036 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5037 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
5038
5039 if (framer_.transport_version() == QUIC_VERSION_99) {
5040 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
5041 } else {
5042 EXPECT_EQ(0u, visitor_.blocked_frame_.offset);
5043 }
5044 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
5045
5046 if (framer_.transport_version() == QUIC_VERSION_99) {
5047 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_BLOCKED_DATA);
5048 } else {
5049 CheckFramingBoundaries(fragments, QUIC_INVALID_BLOCKED_DATA);
5050 }
5051}
5052
5053TEST_P(QuicFramerTest, PingFrame) {
zhongyi546cc452019-04-12 15:27:49 -07005054 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005055 // clang-format off
5056 unsigned char packet[] = {
5057 // public flags (8 byte connection_id)
5058 0x28,
5059 // connection_id
5060 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5061 // packet number
5062 0x12, 0x34, 0x56, 0x78,
5063
5064 // frame type (ping frame)
5065 0x07,
5066 };
5067
5068 unsigned char packet44[] = {
5069 // type (short header, 4 byte packet number)
5070 0x32,
5071 // connection_id
5072 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5073 // packet number
5074 0x12, 0x34, 0x56, 0x78,
5075
5076 // frame type
5077 0x07,
5078 };
5079
5080 unsigned char packet46[] = {
5081 // type (short header, 4 byte packet number)
5082 0x43,
5083 // connection_id
5084 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5085 // packet number
5086 0x12, 0x34, 0x56, 0x78,
5087
5088 // frame type
5089 0x07,
5090 };
5091
5092 unsigned char packet99[] = {
5093 // type (short header, 4 byte packet number)
5094 0x43,
5095 // connection_id
5096 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5097 // packet number
5098 0x12, 0x34, 0x56, 0x78,
5099
5100 // frame type (IETF_PING frame)
5101 0x01,
5102 };
5103 // clang-format on
5104
5105 QuicEncryptedPacket encrypted(
5106 AsChars(framer_.transport_version() == QUIC_VERSION_99
5107 ? packet99
5108 : (framer_.transport_version() > QUIC_VERSION_44
5109 ? packet46
5110 : framer_.transport_version() > QUIC_VERSION_43
5111 ? packet44
5112 : packet)),
5113 framer_.transport_version() == QUIC_VERSION_99
5114 ? QUIC_ARRAYSIZE(packet99)
5115 : (framer_.transport_version() > QUIC_VERSION_44
5116 ? QUIC_ARRAYSIZE(packet46)
5117 : framer_.transport_version() > QUIC_VERSION_43
5118 ? QUIC_ARRAYSIZE(packet44)
5119 : QUIC_ARRAYSIZE(packet)),
5120 false);
5121 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5122
5123 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
5124 ASSERT_TRUE(visitor_.header_.get());
5125 EXPECT_TRUE(CheckDecryption(
5126 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5127 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
5128
5129 EXPECT_EQ(1u, visitor_.ping_frames_.size());
5130
5131 // No need to check the PING frame boundaries because it has no payload.
5132}
5133
5134TEST_P(QuicFramerTest, MessageFrame) {
5135 if (framer_.transport_version() <= QUIC_VERSION_44) {
5136 return;
5137 }
zhongyi546cc452019-04-12 15:27:49 -07005138 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005139 // clang-format off
5140 PacketFragments packet45 = {
5141 // type (short header, 4 byte packet number)
5142 {"",
5143 {0x32}},
5144 // connection_id
5145 {"",
5146 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5147 // packet number
5148 {"",
5149 {0x12, 0x34, 0x56, 0x78}},
5150 // message frame type.
5151 {"",
5152 { 0x21 }},
5153 // message length
5154 {"Unable to read message length",
5155 {0x07}},
5156 // message data
5157 {"Unable to read message data",
5158 {'m', 'e', 's', 's', 'a', 'g', 'e'}},
5159 // message frame no length.
5160 {"",
5161 { 0x20 }},
5162 // message data
5163 {{},
5164 {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
5165 };
5166
5167 PacketFragments packet46 = {
5168 // type (short header, 4 byte packet number)
5169 {"",
5170 {0x43}},
5171 // connection_id
5172 {"",
5173 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5174 // packet number
5175 {"",
5176 {0x12, 0x34, 0x56, 0x78}},
5177 // message frame type.
5178 {"",
5179 { 0x21 }},
5180 // message length
5181 {"Unable to read message length",
5182 {0x07}},
5183 // message data
5184 {"Unable to read message data",
5185 {'m', 'e', 's', 's', 'a', 'g', 'e'}},
5186 // message frame no length.
5187 {"",
5188 { 0x20 }},
5189 // message data
5190 {{},
5191 {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
5192 };
5193 // clang-format on
5194
5195 std::unique_ptr<QuicEncryptedPacket> encrypted(AssemblePacketFromFragments(
5196 framer_.transport_version() > QUIC_VERSION_44 ? packet46 : packet45));
5197 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5198
5199 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
5200 ASSERT_TRUE(visitor_.header_.get());
5201 EXPECT_TRUE(CheckDecryption(
5202 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5203 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
5204
5205 ASSERT_EQ(2u, visitor_.message_frames_.size());
5206 EXPECT_EQ(7u, visitor_.message_frames_[0]->message_length);
5207 EXPECT_EQ(8u, visitor_.message_frames_[1]->message_length);
5208
5209 CheckFramingBoundaries(
5210 framer_.transport_version() > QUIC_VERSION_44 ? packet46 : packet45,
5211 QUIC_INVALID_MESSAGE_DATA);
5212}
5213
5214TEST_P(QuicFramerTest, PublicResetPacketV33) {
5215 // clang-format off
5216 PacketFragments packet = {
5217 // public flags (public reset, 8 byte connection_id)
5218 {"",
5219 {0x0A}},
5220 // connection_id
5221 {"",
5222 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5223 {"Unable to read reset message.",
5224 {
5225 // message tag (kPRST)
5226 'P', 'R', 'S', 'T',
5227 // num_entries (2) + padding
5228 0x02, 0x00, 0x00, 0x00,
5229 // tag kRNON
5230 'R', 'N', 'O', 'N',
5231 // end offset 8
5232 0x08, 0x00, 0x00, 0x00,
5233 // tag kRSEQ
5234 'R', 'S', 'E', 'Q',
5235 // end offset 16
5236 0x10, 0x00, 0x00, 0x00,
5237 // nonce proof
5238 0x89, 0x67, 0x45, 0x23,
5239 0x01, 0xEF, 0xCD, 0xAB,
5240 // rejected packet number
5241 0xBC, 0x9A, 0x78, 0x56,
5242 0x34, 0x12, 0x00, 0x00,
5243 }
5244 }
5245 };
5246 // clang-format on
5247 if (framer_.transport_version() > QUIC_VERSION_43) {
5248 return;
5249 }
5250
5251 std::unique_ptr<QuicEncryptedPacket> encrypted(
5252 AssemblePacketFromFragments(packet));
5253 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5254 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5255 ASSERT_TRUE(visitor_.public_reset_packet_.get());
5256 EXPECT_EQ(FramerTestConnectionId(),
5257 visitor_.public_reset_packet_->connection_id);
5258 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof);
5259 EXPECT_EQ(
5260 IpAddressFamily::IP_UNSPEC,
5261 visitor_.public_reset_packet_->client_address.host().address_family());
5262
5263 CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
5264}
5265
5266TEST_P(QuicFramerTest, PublicResetPacket) {
5267 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5268
5269 // clang-format off
5270 PacketFragments packet = {
5271 // public flags (public reset, 8 byte connection_id)
5272 {"",
5273 {0x0E}},
5274 // connection_id
5275 {"",
5276 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5277 {"Unable to read reset message.",
5278 {
5279 // message tag (kPRST)
5280 'P', 'R', 'S', 'T',
5281 // num_entries (2) + padding
5282 0x02, 0x00, 0x00, 0x00,
5283 // tag kRNON
5284 'R', 'N', 'O', 'N',
5285 // end offset 8
5286 0x08, 0x00, 0x00, 0x00,
5287 // tag kRSEQ
5288 'R', 'S', 'E', 'Q',
5289 // end offset 16
5290 0x10, 0x00, 0x00, 0x00,
5291 // nonce proof
5292 0x89, 0x67, 0x45, 0x23,
5293 0x01, 0xEF, 0xCD, 0xAB,
5294 // rejected packet number
5295 0xBC, 0x9A, 0x78, 0x56,
5296 0x34, 0x12, 0x00, 0x00,
5297 }
5298 }
5299 };
5300 // clang-format on
5301
5302 if (framer_.transport_version() > QUIC_VERSION_43) {
5303 return;
5304 }
5305
5306 std::unique_ptr<QuicEncryptedPacket> encrypted(
5307 AssemblePacketFromFragments(packet));
5308 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5309 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5310 ASSERT_TRUE(visitor_.public_reset_packet_.get());
5311 EXPECT_EQ(FramerTestConnectionId(),
5312 visitor_.public_reset_packet_->connection_id);
5313 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof);
5314 EXPECT_EQ(
5315 IpAddressFamily::IP_UNSPEC,
5316 visitor_.public_reset_packet_->client_address.host().address_family());
5317
5318 CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
5319}
5320
5321TEST_P(QuicFramerTest, PublicResetPacketWithTrailingJunk) {
5322 // clang-format off
5323 unsigned char packet[] = {
5324 // public flags (public reset, 8 byte connection_id)
5325 0x0A,
5326 // connection_id
5327 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5328 // message tag (kPRST)
5329 'P', 'R', 'S', 'T',
5330 // num_entries (2) + padding
5331 0x02, 0x00, 0x00, 0x00,
5332 // tag kRNON
5333 'R', 'N', 'O', 'N',
5334 // end offset 8
5335 0x08, 0x00, 0x00, 0x00,
5336 // tag kRSEQ
5337 'R', 'S', 'E', 'Q',
5338 // end offset 16
5339 0x10, 0x00, 0x00, 0x00,
5340 // nonce proof
5341 0x89, 0x67, 0x45, 0x23,
5342 0x01, 0xEF, 0xCD, 0xAB,
5343 // rejected packet number
5344 0xBC, 0x9A, 0x78, 0x56,
5345 0x34, 0x12, 0x00, 0x00,
5346 // trailing junk
5347 'j', 'u', 'n', 'k',
5348 };
5349 // clang-format on
5350 if (framer_.transport_version() > QUIC_VERSION_43) {
5351 return;
5352 }
5353
5354 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5355 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5356 ASSERT_EQ(QUIC_INVALID_PUBLIC_RST_PACKET, framer_.error());
5357 EXPECT_EQ("Unable to read reset message.", framer_.detailed_error());
5358}
5359
5360TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) {
5361 // clang-format off
5362 PacketFragments packet = {
5363 // public flags (public reset, 8 byte connection_id)
5364 {"",
5365 {0x0A}},
5366 // connection_id
5367 {"",
5368 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5369 {"Unable to read reset message.",
5370 {
5371 // message tag (kPRST)
5372 'P', 'R', 'S', 'T',
5373 // num_entries (2) + padding
5374 0x03, 0x00, 0x00, 0x00,
5375 // tag kRNON
5376 'R', 'N', 'O', 'N',
5377 // end offset 8
5378 0x08, 0x00, 0x00, 0x00,
5379 // tag kRSEQ
5380 'R', 'S', 'E', 'Q',
5381 // end offset 16
5382 0x10, 0x00, 0x00, 0x00,
5383 // tag kCADR
5384 'C', 'A', 'D', 'R',
5385 // end offset 24
5386 0x18, 0x00, 0x00, 0x00,
5387 // nonce proof
5388 0x89, 0x67, 0x45, 0x23,
5389 0x01, 0xEF, 0xCD, 0xAB,
5390 // rejected packet number
5391 0xBC, 0x9A, 0x78, 0x56,
5392 0x34, 0x12, 0x00, 0x00,
5393 // client address: 4.31.198.44:443
5394 0x02, 0x00,
5395 0x04, 0x1F, 0xC6, 0x2C,
5396 0xBB, 0x01,
5397 }
5398 }
5399 };
5400 // clang-format on
5401 if (framer_.transport_version() > QUIC_VERSION_43) {
5402 return;
5403 }
5404
5405 std::unique_ptr<QuicEncryptedPacket> encrypted(
5406 AssemblePacketFromFragments(packet));
5407 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5408 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5409 ASSERT_TRUE(visitor_.public_reset_packet_.get());
5410 EXPECT_EQ(FramerTestConnectionId(),
5411 visitor_.public_reset_packet_->connection_id);
5412 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof);
5413 EXPECT_EQ("4.31.198.44",
5414 visitor_.public_reset_packet_->client_address.host().ToString());
5415 EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port());
5416
5417 CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
5418}
5419
5420TEST_P(QuicFramerTest, IetfStatelessResetPacket) {
5421 // clang-format off
5422 unsigned char packet[] = {
5423 // type (short packet, 1 byte packet number)
5424 0x50,
5425 // connection_id
5426 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5427 // 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,
5432 // stateless reset token
5433 0xB5, 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 }
5440 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005441 decrypter_ = new test::TestDecrypter();
zhongyi546cc452019-04-12 15:27:49 -07005442 if (framer_.version().KnowsWhichDecrypterToUse()) {
5443 framer_.InstallDecrypter(ENCRYPTION_INITIAL, QuicMakeUnique<NullDecrypter>(
5444 Perspective::IS_CLIENT));
5445 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
5446 std::unique_ptr<QuicDecrypter>(decrypter_));
5447 } else {
5448 framer_.SetDecrypter(ENCRYPTION_INITIAL,
5449 QuicMakeUnique<NullDecrypter>(Perspective::IS_CLIENT));
5450 framer_.SetAlternativeDecrypter(
5451 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
5452 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005453 // This packet cannot be decrypted because diversification nonce is missing.
5454 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5455 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5456 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5457 ASSERT_TRUE(visitor_.stateless_reset_packet_.get());
5458 EXPECT_EQ(kTestStatelessResetToken,
5459 visitor_.stateless_reset_packet_->stateless_reset_token);
5460}
5461
5462TEST_P(QuicFramerTest, IetfStatelessResetPacketInvalidStatelessResetToken) {
5463 // clang-format off
5464 unsigned char packet[] = {
5465 // type (short packet, 1 byte packet number)
5466 0x50,
5467 // connection_id
5468 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5469 // stateless reset token
5470 0xB6, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
5471 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5472 };
5473 // clang-format on
5474 if (framer_.transport_version() <= QUIC_VERSION_43) {
5475 return;
5476 }
5477 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005478 decrypter_ = new test::TestDecrypter();
zhongyi546cc452019-04-12 15:27:49 -07005479 if (framer_.version().KnowsWhichDecrypterToUse()) {
5480 framer_.InstallDecrypter(ENCRYPTION_INITIAL, QuicMakeUnique<NullDecrypter>(
5481 Perspective::IS_CLIENT));
5482 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
5483 std::unique_ptr<QuicDecrypter>(decrypter_));
5484 } else {
5485 framer_.SetDecrypter(ENCRYPTION_INITIAL,
5486 QuicMakeUnique<NullDecrypter>(Perspective::IS_CLIENT));
5487 framer_.SetAlternativeDecrypter(
5488 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
5489 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005490 // This packet cannot be decrypted because diversification nonce is missing.
5491 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5492 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5493 EXPECT_EQ(QUIC_DECRYPTION_FAILURE, framer_.error());
5494 ASSERT_FALSE(visitor_.stateless_reset_packet_);
5495}
5496
dschinazi072da7c2019-05-07 17:57:42 -07005497TEST_P(QuicFramerTest, VersionNegotiationPacketClient) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005498 // clang-format off
5499 PacketFragments packet = {
5500 // public flags (version, 8 byte connection_id)
5501 {"",
5502 {0x29}},
5503 // connection_id
5504 {"",
5505 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5506 // version tag
5507 {"Unable to read supported version in negotiation.",
5508 {QUIC_VERSION_BYTES,
5509 'Q', '2', '.', '0'}},
5510 };
5511
5512 PacketFragments packet44 = {
5513 // type (long header)
5514 {"",
5515 {0x8F}},
5516 // version tag
5517 {"",
5518 {0x00, 0x00, 0x00, 0x00}},
5519 {"",
5520 {0x05}},
5521 // connection_id
5522 {"",
5523 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5524 // Supported versions
5525 {"Unable to read supported version in negotiation.",
5526 {QUIC_VERSION_BYTES,
5527 'Q', '2', '.', '0'}},
5528 };
5529 // clang-format on
5530
5531 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5532
5533 PacketFragments& fragments =
5534 framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet;
5535 std::unique_ptr<QuicEncryptedPacket> encrypted(
5536 AssemblePacketFromFragments(fragments));
5537 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5538 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5539 ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
5540 EXPECT_EQ(2u, visitor_.version_negotiation_packet_->versions.size());
5541 EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]);
5542
5543 // Remove the last version from the packet so that every truncated
5544 // version of the packet is invalid, otherwise checking boundaries
5545 // is annoyingly complicated.
5546 for (size_t i = 0; i < 4; ++i) {
5547 fragments.back().fragment.pop_back();
5548 }
5549 CheckFramingBoundaries(fragments, QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
5550}
5551
dschinazi072da7c2019-05-07 17:57:42 -07005552TEST_P(QuicFramerTest, VersionNegotiationPacketServer) {
5553 if (!GetQuicRestartFlag(quic_server_drop_version_negotiation)) {
5554 return;
5555 }
5556 if (framer_.transport_version() < QUIC_VERSION_44) {
5557 return;
5558 }
5559
5560 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
5561 // clang-format off
5562 unsigned char packet[] = {
5563 // public flags (long header with all ignored bits set)
5564 0xFF,
5565 // version
5566 0x00, 0x00, 0x00, 0x00,
5567 // connection ID lengths
5568 0x50,
5569 // destination connection ID
5570 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5571 // supported versions
5572 QUIC_VERSION_BYTES,
5573 'Q', '2', '.', '0',
5574 };
5575 // clang-format on
5576
5577 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5578 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5579 EXPECT_EQ(QUIC_INVALID_VERSION_NEGOTIATION_PACKET, framer_.error());
5580 EXPECT_EQ("Server received version negotiation packet.",
5581 framer_.detailed_error());
5582 EXPECT_FALSE(visitor_.version_negotiation_packet_.get());
5583}
5584
QUICHE teama6ef0a62019-03-07 20:34:33 -05005585TEST_P(QuicFramerTest, OldVersionNegotiationPacket) {
5586 // clang-format off
5587 PacketFragments packet = {
5588 // public flags (version, 8 byte connection_id)
5589 {"",
5590 {0x2D}},
5591 // connection_id
5592 {"",
5593 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5594 // version tag
5595 {"Unable to read supported version in negotiation.",
5596 {QUIC_VERSION_BYTES,
5597 'Q', '2', '.', '0'}},
5598 };
5599 // clang-format on
5600
5601 if (framer_.transport_version() > QUIC_VERSION_43) {
5602 return;
5603 }
5604
5605 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5606
5607 std::unique_ptr<QuicEncryptedPacket> encrypted(
5608 AssemblePacketFromFragments(packet));
5609 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5610 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5611 ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
5612 EXPECT_EQ(2u, visitor_.version_negotiation_packet_->versions.size());
5613 EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]);
5614
5615 // Remove the last version from the packet so that every truncated
5616 // version of the packet is invalid, otherwise checking boundaries
5617 // is annoyingly complicated.
5618 for (size_t i = 0; i < 4; ++i) {
5619 packet.back().fragment.pop_back();
5620 }
5621 CheckFramingBoundaries(packet, QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
5622}
5623
dschinazi244f6dc2019-05-06 15:45:16 -07005624TEST_P(QuicFramerTest, ParseIetfRetryPacket) {
5625 if (!framer_.version().SupportsRetry()) {
5626 return;
5627 }
5628 // IETF RETRY is only sent from client to server.
5629 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5630 // clang-format off
5631 unsigned char packet[] = {
5632 // public flags (long header with packet type RETRY and ODCIL=8)
5633 0xF5,
5634 // version
5635 QUIC_VERSION_BYTES,
5636 // connection ID lengths
5637 0x05,
5638 // source connection ID
5639 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5640 // original destination connection ID
5641 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5642 // retry token
5643 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5644 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5645 };
5646 // clang-format on
5647
5648 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5649 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5650
5651 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
5652 ASSERT_TRUE(visitor_.header_.get());
5653
5654 ASSERT_TRUE(visitor_.retry_original_connection_id_.get());
5655 ASSERT_TRUE(visitor_.retry_new_connection_id_.get());
5656 ASSERT_TRUE(visitor_.retry_token_.get());
5657
5658 EXPECT_EQ(FramerTestConnectionId(),
5659 *visitor_.retry_original_connection_id_.get());
5660 EXPECT_EQ(FramerTestConnectionIdPlusOne(),
5661 *visitor_.retry_new_connection_id_.get());
5662 EXPECT_EQ("Hello this is RETRY!", *visitor_.retry_token_.get());
5663}
5664
5665TEST_P(QuicFramerTest, RejectIetfRetryPacketAsServer) {
5666 if (!framer_.version().SupportsRetry()) {
5667 return;
5668 }
5669 // IETF RETRY is only sent from client to server.
5670 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
5671 // clang-format off
5672 unsigned char packet[] = {
5673 // public flags (long header with packet type RETRY and ODCIL=8)
5674 0xF5,
5675 // version
5676 QUIC_VERSION_BYTES,
5677 // connection ID lengths
5678 0x05,
5679 // source connection ID
5680 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5681 // original destination connection ID
5682 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5683 // retry token
5684 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5685 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5686 };
5687 // clang-format on
5688
5689 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5690 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5691
5692 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
5693 EXPECT_EQ("Client-initiated RETRY is invalid.", framer_.detailed_error());
5694}
5695
QUICHE teama6ef0a62019-03-07 20:34:33 -05005696TEST_P(QuicFramerTest, BuildPaddingFramePacket) {
5697 QuicPacketHeader header;
5698 header.destination_connection_id = FramerTestConnectionId();
5699 header.reset_flag = false;
5700 header.version_flag = false;
5701 header.packet_number = kPacketNumber;
5702
5703 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5704
5705 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07005706 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005707 // public flags (8 byte connection_id)
5708 0x28,
5709 // connection_id
5710 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5711 // packet number
5712 0x12, 0x34, 0x56, 0x78,
5713
5714 // frame type (padding frame)
5715 0x00,
5716 0x00, 0x00, 0x00, 0x00
5717 };
5718
dschinazi66dea072019-04-09 11:41:06 -07005719 unsigned char packet44[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005720 // type (short header, 4 byte packet number)
5721 0x32,
5722 // connection_id
5723 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5724 // packet number
5725 0x12, 0x34, 0x56, 0x78,
5726
5727 // frame type (padding frame)
5728 0x00,
5729 0x00, 0x00, 0x00, 0x00
5730 };
5731
dschinazi66dea072019-04-09 11:41:06 -07005732 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005733 // type (short header, 4 byte packet number)
5734 0x43,
5735 // connection_id
5736 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5737 // packet number
5738 0x12, 0x34, 0x56, 0x78,
5739
5740 // frame type (padding frame)
5741 0x00,
5742 0x00, 0x00, 0x00, 0x00
5743 };
5744
dschinazi66dea072019-04-09 11:41:06 -07005745 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005746 // type (short header, 4 byte packet number)
5747 0x43,
5748 // connection_id
5749 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5750 // packet number
5751 0x12, 0x34, 0x56, 0x78,
5752
5753 // frame type (padding frame)
5754 0x00,
5755 0x00, 0x00, 0x00, 0x00
5756 };
5757 // clang-format on
5758
5759 unsigned char* p = packet;
5760 if (framer_.transport_version() == QUIC_VERSION_99) {
5761 p = packet99;
5762 } else if (framer_.transport_version() > QUIC_VERSION_44) {
5763 p = packet46;
5764 } else if (framer_.transport_version() > QUIC_VERSION_43) {
5765 p = packet44;
5766 }
5767
5768 uint64_t header_size = GetPacketHeaderSize(
5769 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
5770 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
5771 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
5772 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07005773 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005774
5775 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5776 ASSERT_TRUE(data != nullptr);
5777
5778 test::CompareCharArraysWithHexError(
5779 "constructed packet", data->data(), data->length(), AsChars(p),
5780 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44)
5781 : QUIC_ARRAYSIZE(packet));
5782}
5783
5784TEST_P(QuicFramerTest, BuildStreamFramePacketWithNewPaddingFrame) {
5785 QuicPacketHeader header;
5786 header.destination_connection_id = FramerTestConnectionId();
5787 header.reset_flag = false;
5788 header.version_flag = false;
5789 header.packet_number = kPacketNumber;
5790 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
5791 QuicStringPiece("hello world!"));
5792 QuicPaddingFrame padding_frame(2);
5793 QuicFrames frames = {QuicFrame(padding_frame), QuicFrame(stream_frame),
5794 QuicFrame(padding_frame)};
5795
5796 // clang-format off
5797 unsigned char packet[] = {
5798 // public flags (8 byte connection_id)
5799 0x28,
5800 // connection_id
5801 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5802 // packet number
5803 0x12, 0x34, 0x56, 0x78,
5804
5805 // paddings
5806 0x00, 0x00,
5807 // frame type (stream frame with fin)
5808 0xFF,
5809 // stream id
5810 0x01, 0x02, 0x03, 0x04,
5811 // offset
5812 0x3A, 0x98, 0xFE, 0xDC,
5813 0x32, 0x10, 0x76, 0x54,
5814 // data length
5815 0x00, 0x0c,
5816 // data
5817 'h', 'e', 'l', 'l',
5818 'o', ' ', 'w', 'o',
5819 'r', 'l', 'd', '!',
5820 // paddings
5821 0x00, 0x00,
5822 };
5823
5824 unsigned char packet44[] = {
5825 // type (short header, 4 byte packet number)
5826 0x32,
5827 // connection_id
5828 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5829 // packet number
5830 0x12, 0x34, 0x56, 0x78,
5831
5832 // paddings
5833 0x00, 0x00,
5834 // frame type (stream frame with fin)
5835 0xFF,
5836 // stream id
5837 0x01, 0x02, 0x03, 0x04,
5838 // offset
5839 0x3A, 0x98, 0xFE, 0xDC,
5840 0x32, 0x10, 0x76, 0x54,
5841 // data length
5842 0x00, 0x0c,
5843 // data
5844 'h', 'e', 'l', 'l',
5845 'o', ' ', 'w', 'o',
5846 'r', 'l', 'd', '!',
5847 // paddings
5848 0x00, 0x00,
5849 };
5850
5851 unsigned char packet46[] = {
5852 // type (short header, 4 byte packet number)
5853 0x43,
5854 // connection_id
5855 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5856 // packet number
5857 0x12, 0x34, 0x56, 0x78,
5858
5859 // paddings
5860 0x00, 0x00,
5861 // frame type (stream frame with fin)
5862 0xFF,
5863 // stream id
5864 0x01, 0x02, 0x03, 0x04,
5865 // offset
5866 0x3A, 0x98, 0xFE, 0xDC,
5867 0x32, 0x10, 0x76, 0x54,
5868 // data length
5869 0x00, 0x0c,
5870 // data
5871 'h', 'e', 'l', 'l',
5872 'o', ' ', 'w', 'o',
5873 'r', 'l', 'd', '!',
5874 // paddings
5875 0x00, 0x00,
5876 };
5877
5878 unsigned char packet99[] = {
5879 // type (short header, 4 byte packet number)
5880 0x43,
5881 // connection_id
5882 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5883 // packet number
5884 0x12, 0x34, 0x56, 0x78,
5885
5886 // paddings
5887 0x00, 0x00,
5888 // frame type (IETF_STREAM with FIN, LEN, and OFFSET bits set)
5889 0x08 | 0x01 | 0x02 | 0x04,
5890 // stream id
5891 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
5892 // offset
5893 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5894 0x32, 0x10, 0x76, 0x54,
5895 // data length
5896 kVarInt62OneByte + 0x0c,
5897 // data
5898 'h', 'e', 'l', 'l',
5899 'o', ' ', 'w', 'o',
5900 'r', 'l', 'd', '!',
5901 // paddings
5902 0x00, 0x00,
5903 };
5904 // clang-format on
5905
5906 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5907 ASSERT_TRUE(data != nullptr);
5908
5909 unsigned char* p = packet;
5910 size_t p_size = QUIC_ARRAYSIZE(packet);
5911 if (framer_.transport_version() == QUIC_VERSION_99) {
5912 p = packet99;
5913 p_size = QUIC_ARRAYSIZE(packet99);
5914 } else if (framer_.transport_version() > QUIC_VERSION_44) {
5915 p = packet46;
5916 p_size = QUIC_ARRAYSIZE(packet46);
5917 } else if (framer_.transport_version() > QUIC_VERSION_43) {
5918 p = packet44;
5919 p_size = QUIC_ARRAYSIZE(packet44);
5920 }
5921 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
5922
5923 test::CompareCharArraysWithHexError("constructed packet", data->data(),
5924 data->length(), AsChars(p), p_size);
5925}
5926
5927TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) {
5928 QuicPacketHeader header;
5929 header.destination_connection_id = FramerTestConnectionId();
5930 header.reset_flag = false;
5931 header.version_flag = false;
5932 header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
5933 header.packet_number = kPacketNumber;
5934
5935 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5936
5937 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07005938 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005939 // public flags (8 byte connection_id and 4 byte packet number)
5940 0x28,
5941 // connection_id
5942 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5943 // packet number
5944 0x12, 0x34, 0x56, 0x78,
5945
5946 // frame type (padding frame)
5947 0x00,
5948 0x00, 0x00, 0x00, 0x00
5949 };
5950
dschinazi66dea072019-04-09 11:41:06 -07005951 unsigned char packet44[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005952 // type (short header, 4 byte packet number)
5953 0x32,
5954 // connection_id
5955 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5956 // packet number
5957 0x12, 0x34, 0x56, 0x78,
5958
5959 // frame type (padding frame)
5960 0x00,
5961 0x00, 0x00, 0x00, 0x00
5962 };
5963
dschinazi66dea072019-04-09 11:41:06 -07005964 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005965 // type (short header, 4 byte packet number)
5966 0x43,
5967 // connection_id
5968 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5969 // packet number
5970 0x12, 0x34, 0x56, 0x78,
5971
5972 // frame type (padding frame)
5973 0x00,
5974 0x00, 0x00, 0x00, 0x00
5975 };
5976
dschinazi66dea072019-04-09 11:41:06 -07005977 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005978 // type (short header, 4 byte packet number)
5979 0x43,
5980 // connection_id
5981 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5982 // packet number
5983 0x12, 0x34, 0x56, 0x78,
5984
5985 // frame type (padding frame)
5986 0x00,
5987 0x00, 0x00, 0x00, 0x00
5988 };
5989 // clang-format on
5990
5991 unsigned char* p = packet;
5992 if (framer_.transport_version() == QUIC_VERSION_99) {
5993 p = packet99;
5994 } else if (framer_.transport_version() > QUIC_VERSION_44) {
5995 p = packet46;
5996 } else if (framer_.transport_version() > QUIC_VERSION_43) {
5997 p = packet44;
5998 }
5999
6000 uint64_t header_size = GetPacketHeaderSize(
6001 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
6002 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
6003 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
6004 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07006005 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006006
6007 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6008 ASSERT_TRUE(data != nullptr);
6009
6010 test::CompareCharArraysWithHexError(
6011 "constructed packet", data->data(), data->length(), AsChars(p),
6012 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44)
6013 : QUIC_ARRAYSIZE(packet));
6014}
6015
6016TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) {
6017 QuicPacketHeader header;
6018 header.destination_connection_id = FramerTestConnectionId();
6019 header.reset_flag = false;
6020 header.version_flag = false;
6021 header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
6022 header.packet_number = kPacketNumber;
6023
6024 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
6025
6026 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07006027 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006028 // public flags (8 byte connection_id and 2 byte packet number)
6029 0x18,
6030 // connection_id
6031 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6032 // packet number
6033 0x56, 0x78,
6034
6035 // frame type (padding frame)
6036 0x00,
6037 0x00, 0x00, 0x00, 0x00
6038 };
6039
dschinazi66dea072019-04-09 11:41:06 -07006040 unsigned char packet44[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006041 // type (short header, 2 byte packet number)
6042 0x31,
6043 // connection_id
6044 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6045 // packet number
6046 0x56, 0x78,
6047
6048 // frame type (padding frame)
6049 0x00,
6050 0x00, 0x00, 0x00, 0x00
6051 };
6052
dschinazi66dea072019-04-09 11:41:06 -07006053 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006054 // type (short header, 2 byte packet number)
6055 0x41,
6056 // connection_id
6057 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6058 // packet number
6059 0x56, 0x78,
6060
6061 // frame type (padding frame)
6062 0x00,
6063 0x00, 0x00, 0x00, 0x00
6064 };
6065
dschinazi66dea072019-04-09 11:41:06 -07006066 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006067 // type (short header, 2 byte packet number)
6068 0x41,
6069 // connection_id
6070 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6071 // packet number
6072 0x56, 0x78,
6073
6074 // frame type (padding frame)
6075 0x00,
6076 0x00, 0x00, 0x00, 0x00
6077 };
6078 // clang-format on
6079
6080 unsigned char* p = packet;
6081 if (framer_.transport_version() == QUIC_VERSION_99) {
6082 p = packet99;
6083 } else if (framer_.transport_version() > QUIC_VERSION_44) {
6084 p = packet46;
6085 } else if (framer_.transport_version() > QUIC_VERSION_43) {
6086 p = packet44;
6087 }
6088
6089 uint64_t header_size = GetPacketHeaderSize(
6090 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
6091 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
6092 !kIncludeDiversificationNonce, PACKET_2BYTE_PACKET_NUMBER,
6093 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07006094 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006095
6096 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6097 ASSERT_TRUE(data != nullptr);
6098
6099 test::CompareCharArraysWithHexError(
6100 "constructed packet", data->data(), data->length(), AsChars(p),
6101 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44)
6102 : QUIC_ARRAYSIZE(packet));
6103}
6104
6105TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) {
6106 QuicPacketHeader header;
6107 header.destination_connection_id = FramerTestConnectionId();
6108 header.reset_flag = false;
6109 header.version_flag = false;
6110 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
6111 header.packet_number = kPacketNumber;
6112
6113 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
6114
6115 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07006116 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006117 // public flags (8 byte connection_id and 1 byte packet number)
6118 0x08,
6119 // connection_id
6120 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6121 // packet number
6122 0x78,
6123
6124 // frame type (padding frame)
6125 0x00,
6126 0x00, 0x00, 0x00, 0x00
6127 };
6128
dschinazi66dea072019-04-09 11:41:06 -07006129 unsigned char packet44[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006130 // type (short header, 1 byte packet number)
6131 0x30,
6132 // connection_id
6133 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6134 // packet number
6135 0x78,
6136
6137 // frame type (padding frame)
6138 0x00,
6139 0x00, 0x00, 0x00, 0x00
6140 };
6141
dschinazi66dea072019-04-09 11:41:06 -07006142 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006143 // type (short header, 1 byte packet number)
6144 0x40,
6145 // connection_id
6146 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6147 // packet number
6148 0x78,
6149
6150 // frame type (padding frame)
6151 0x00,
6152 0x00, 0x00, 0x00, 0x00
6153 };
6154
dschinazi66dea072019-04-09 11:41:06 -07006155 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006156 // type (short header, 1 byte packet number)
6157 0x40,
6158 // connection_id
6159 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6160 // packet number
6161 0x78,
6162
6163 // frame type (padding frame)
6164 0x00,
6165 0x00, 0x00, 0x00, 0x00
6166 };
6167 // clang-format on
6168
6169 unsigned char* p = packet;
6170 if (framer_.transport_version() == QUIC_VERSION_99) {
6171 p = packet99;
6172 } else if (framer_.transport_version() > QUIC_VERSION_44) {
6173 p = packet46;
6174 } else if (framer_.transport_version() > QUIC_VERSION_43) {
6175 p = packet44;
6176 }
6177
6178 uint64_t header_size = GetPacketHeaderSize(
6179 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
6180 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
6181 !kIncludeDiversificationNonce, PACKET_1BYTE_PACKET_NUMBER,
6182 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07006183 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006184
6185 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6186 ASSERT_TRUE(data != nullptr);
6187
6188 test::CompareCharArraysWithHexError(
6189 "constructed packet", data->data(), data->length(), AsChars(p),
6190 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44)
6191 : QUIC_ARRAYSIZE(packet));
6192}
6193
6194TEST_P(QuicFramerTest, BuildStreamFramePacket) {
6195 QuicPacketHeader header;
6196 header.destination_connection_id = FramerTestConnectionId();
6197 header.reset_flag = false;
6198 header.version_flag = false;
6199 header.packet_number = kPacketNumber;
6200 if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
6201 header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
6202 }
6203
6204 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
6205 QuicStringPiece("hello world!"));
6206
6207 QuicFrames frames = {QuicFrame(stream_frame)};
6208
6209 // clang-format off
6210 unsigned char packet[] = {
6211 // public flags (8 byte connection_id)
6212 0x28,
6213 // connection_id
6214 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6215 // packet number
6216 0x12, 0x34, 0x56, 0x78,
6217
6218 // frame type (stream frame with fin and no length)
6219 0xDF,
6220 // stream id
6221 0x01, 0x02, 0x03, 0x04,
6222 // offset
6223 0x3A, 0x98, 0xFE, 0xDC,
6224 0x32, 0x10, 0x76, 0x54,
6225 // data
6226 'h', 'e', 'l', 'l',
6227 'o', ' ', 'w', 'o',
6228 'r', 'l', 'd', '!',
6229 };
6230
6231 unsigned char packet44[] = {
6232 // type (short header, 4 byte packet number)
6233 0x32,
6234 // connection_id
6235 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6236 // packet number
6237 0x12, 0x34, 0x56, 0x78,
6238
6239 // frame type (stream frame with fin and no length)
6240 0xDF,
6241 // stream id
6242 0x01, 0x02, 0x03, 0x04,
6243 // offset
6244 0x3A, 0x98, 0xFE, 0xDC,
6245 0x32, 0x10, 0x76, 0x54,
6246 // data
6247 'h', 'e', 'l', 'l',
6248 'o', ' ', 'w', 'o',
6249 'r', 'l', 'd', '!',
6250 };
6251
6252 unsigned char packet46[] = {
6253 // type (short header, 4 byte packet number)
6254 0x43,
6255 // connection_id
6256 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6257 // packet number
6258 0x12, 0x34, 0x56, 0x78,
6259
6260 // frame type (stream frame with fin and no length)
6261 0xDF,
6262 // stream id
6263 0x01, 0x02, 0x03, 0x04,
6264 // offset
6265 0x3A, 0x98, 0xFE, 0xDC,
6266 0x32, 0x10, 0x76, 0x54,
6267 // data
6268 'h', 'e', 'l', 'l',
6269 'o', ' ', 'w', 'o',
6270 'r', 'l', 'd', '!',
6271 };
6272
6273 unsigned char packet99[] = {
6274 // type (short header, 4 byte packet number)
6275 0x43,
6276 // connection_id
6277 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6278 // packet number
6279 0x12, 0x34, 0x56, 0x78,
6280
6281 // frame type (IETF_STREAM frame with FIN and OFFSET, no length)
6282 0x08 | 0x01 | 0x04,
6283 // stream id
6284 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
6285 // offset
6286 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6287 0x32, 0x10, 0x76, 0x54,
6288 // data
6289 'h', 'e', 'l', 'l',
6290 'o', ' ', 'w', 'o',
6291 'r', 'l', 'd', '!',
6292 };
6293 // clang-format on
6294
6295 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6296 ASSERT_TRUE(data != nullptr);
6297
6298 unsigned char* p = packet;
6299 size_t p_size = QUIC_ARRAYSIZE(packet);
6300 if (framer_.transport_version() == QUIC_VERSION_99) {
6301 p = packet99;
6302 p_size = QUIC_ARRAYSIZE(packet99);
6303 } else if (framer_.transport_version() > QUIC_VERSION_44) {
6304 p = packet46;
6305 p_size = QUIC_ARRAYSIZE(packet46);
6306 } else if (framer_.transport_version() > QUIC_VERSION_43) {
6307 p = packet44;
6308 p_size = QUIC_ARRAYSIZE(packet44);
6309 }
6310 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6311 data->length(), AsChars(p), p_size);
6312}
6313
6314TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) {
6315 QuicPacketHeader header;
6316 header.destination_connection_id = FramerTestConnectionId();
6317 header.reset_flag = false;
6318 header.version_flag = true;
6319 if (framer_.transport_version() > QUIC_VERSION_43) {
6320 header.long_packet_type = ZERO_RTT_PROTECTED;
6321 }
6322 header.packet_number = kPacketNumber;
6323 if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
6324 header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
6325 }
6326
6327 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
6328 QuicStringPiece("hello world!"));
6329 QuicFrames frames = {QuicFrame(stream_frame)};
6330
6331 // clang-format off
6332 unsigned char packet[] = {
6333 // public flags (version, 8 byte connection_id)
6334 0x2D,
6335 // connection_id
6336 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6337 // version tag
6338 QUIC_VERSION_BYTES,
6339 // packet number
6340 0x12, 0x34, 0x56, 0x78,
6341
6342 // frame type (stream frame with fin and no length)
6343 0xDF,
6344 // stream id
6345 0x01, 0x02, 0x03, 0x04,
6346 // offset
6347 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6348 // data
6349 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6350 };
6351
6352 unsigned char packet44[] = {
6353 // type (long header with packet type ZERO_RTT_PROTECTED)
6354 0xFC,
6355 // version tag
6356 QUIC_VERSION_BYTES,
6357 // connection_id length
6358 0x50,
6359 // connection_id
6360 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6361 // packet number
6362 0x12, 0x34, 0x56, 0x78,
6363
6364 // frame type (stream frame with fin and no length)
6365 0xDF,
6366 // stream id
6367 0x01, 0x02, 0x03, 0x04,
6368 // offset
6369 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6370 // data
6371 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6372 };
6373
6374 unsigned char packet46[] = {
6375 // type (long header with packet type ZERO_RTT_PROTECTED)
6376 0xD3,
6377 // version tag
6378 QUIC_VERSION_BYTES,
6379 // connection_id length
6380 0x50,
6381 // connection_id
6382 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6383 // packet number
6384 0x12, 0x34, 0x56, 0x78,
6385
6386 // frame type (stream frame with fin and no length)
6387 0xDF,
6388 // stream id
6389 0x01, 0x02, 0x03, 0x04,
6390 // offset
6391 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6392 // data
6393 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6394 };
6395
6396 unsigned char packet99[] = {
6397 // type (long header with packet type ZERO_RTT_PROTECTED)
6398 0xD3,
6399 // version tag
6400 QUIC_VERSION_BYTES,
6401 // connection_id length
6402 0x50,
6403 // connection_id
6404 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6405 // length
6406 0x40, 0x1D,
6407 // packet number
6408 0x12, 0x34, 0x56, 0x78,
6409
6410 // frame type (IETF_STREAM frame with fin and offset, no length)
6411 0x08 | 0x01 | 0x04,
6412 // stream id
6413 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
6414 // offset
6415 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6416 // data
6417 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6418 };
6419 // clang-format on
6420
6421 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6422 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6423 ASSERT_TRUE(data != nullptr);
6424
6425 unsigned char* p = packet;
6426 size_t p_size = QUIC_ARRAYSIZE(packet);
6427 if (framer_.transport_version() == QUIC_VERSION_99) {
6428 p = packet99;
6429 p_size = QUIC_ARRAYSIZE(packet99);
6430 } else if (framer_.transport_version() > QUIC_VERSION_44) {
6431 p = packet46;
6432 p_size = QUIC_ARRAYSIZE(packet46);
6433 } else if (framer_.transport_version() > QUIC_VERSION_43) {
6434 p = packet44;
6435 p_size = QUIC_ARRAYSIZE(packet44);
6436 }
6437 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6438 data->length(), AsChars(p), p_size);
6439}
6440
6441TEST_P(QuicFramerTest, BuildCryptoFramePacket) {
6442 if (framer_.transport_version() < QUIC_VERSION_99) {
6443 // CRYPTO frames aren't supported prior to v46.
6444 return;
6445 }
6446 QuicPacketHeader header;
6447 header.destination_connection_id = FramerTestConnectionId();
6448 header.reset_flag = false;
6449 header.version_flag = false;
6450 header.packet_number = kPacketNumber;
6451
6452 SimpleDataProducer data_producer;
6453 framer_.set_data_producer(&data_producer);
6454
6455 QuicStringPiece crypto_frame_contents("hello world!");
QUICHE team6987b4a2019-03-15 16:23:04 -07006456 QuicCryptoFrame crypto_frame(ENCRYPTION_INITIAL, kStreamOffset,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006457 crypto_frame_contents.length());
QUICHE team6987b4a2019-03-15 16:23:04 -07006458 data_producer.SaveCryptoData(ENCRYPTION_INITIAL, kStreamOffset,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006459 crypto_frame_contents);
6460
6461 QuicFrames frames = {QuicFrame(&crypto_frame)};
6462
6463 // clang-format off
6464 unsigned char packet[] = {
6465 // type (short header, 4 byte packet number)
6466 0x43,
6467 // connection_id
6468 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6469 // packet number
6470 0x12, 0x34, 0x56, 0x78,
6471
6472 // frame type (IETF_CRYPTO frame)
6473 0x06,
6474 // offset
6475 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6476 0x32, 0x10, 0x76, 0x54,
6477 // length
6478 kVarInt62OneByte + 12,
6479 // data
6480 'h', 'e', 'l', 'l',
6481 'o', ' ', 'w', 'o',
6482 'r', 'l', 'd', '!',
6483 };
6484 // clang-format on
6485
6486 size_t packet_size = QUIC_ARRAYSIZE(packet);
6487
6488 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6489 ASSERT_TRUE(data != nullptr);
6490 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6491 data->length(), AsChars(packet),
6492 packet_size);
6493}
6494
6495TEST_P(QuicFramerTest, CryptoFrame) {
6496 if (framer_.transport_version() < QUIC_VERSION_99) {
6497 // CRYPTO frames aren't supported prior to v46.
6498 return;
6499 }
zhongyi546cc452019-04-12 15:27:49 -07006500 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006501
6502 // clang-format off
6503 PacketFragments packet = {
6504 // type (short header, 4 byte packet number)
6505 {"",
6506 {0x43}},
6507 // connection_id
6508 {"",
6509 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
6510 // packet number
6511 {"",
6512 {0x12, 0x34, 0x56, 0x78}},
6513 // frame type (IETF_CRYPTO frame)
6514 {"",
6515 {0x06}},
6516 // offset
6517 {"",
6518 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6519 0x32, 0x10, 0x76, 0x54}},
6520 // data length
6521 {"Invalid data length.",
6522 {kVarInt62OneByte + 12}},
6523 // data
6524 {"Unable to read frame data.",
6525 {'h', 'e', 'l', 'l',
6526 'o', ' ', 'w', 'o',
6527 'r', 'l', 'd', '!'}},
6528 };
6529 // clang-format on
6530
6531 std::unique_ptr<QuicEncryptedPacket> encrypted(
6532 AssemblePacketFromFragments(packet));
6533 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6534
6535 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
6536 ASSERT_TRUE(visitor_.header_.get());
6537 EXPECT_TRUE(CheckDecryption(
6538 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
6539 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
6540 ASSERT_EQ(1u, visitor_.crypto_frames_.size());
6541 QuicCryptoFrame* frame = visitor_.crypto_frames_[0].get();
6542 EXPECT_EQ(kStreamOffset, frame->offset);
vasilvvc48c8712019-03-11 13:38:16 -07006543 EXPECT_EQ("hello world!",
6544 std::string(frame->data_buffer, frame->data_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05006545
6546 CheckFramingBoundaries(packet, QUIC_INVALID_FRAME_DATA);
6547}
6548
6549TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) {
6550 // clang-format off
6551 unsigned char packet[] = {
6552 // public flags (version, 8 byte connection_id)
6553 0x0D,
6554 // connection_id
6555 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6556 // version tag
6557 QUIC_VERSION_BYTES,
6558 };
6559 unsigned char packet44[] = {
6560 // type (long header)
6561 0x80,
6562 // version tag
6563 0x00, 0x00, 0x00, 0x00,
6564 // connection_id length
6565 0x05,
6566 // connection_id
6567 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6568 // version tag
6569 QUIC_VERSION_BYTES,
6570 };
6571 // clang-format on
6572 unsigned char* p = packet;
6573 size_t p_size = QUIC_ARRAYSIZE(packet);
6574 if (framer_.transport_version() > QUIC_VERSION_43) {
6575 p = packet44;
6576 p_size = QUIC_ARRAYSIZE(packet44);
6577 }
6578
6579 QuicConnectionId connection_id = FramerTestConnectionId();
6580 std::unique_ptr<QuicEncryptedPacket> data(
6581 framer_.BuildVersionNegotiationPacket(
6582 connection_id, framer_.transport_version() > QUIC_VERSION_43,
6583 SupportedVersions(GetParam())));
6584 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6585 data->length(), AsChars(p), p_size);
6586}
6587
6588TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlock) {
6589 QuicPacketHeader header;
6590 header.destination_connection_id = FramerTestConnectionId();
6591 header.reset_flag = false;
6592 header.version_flag = false;
6593 header.packet_number = kPacketNumber;
6594
6595 // Use kSmallLargestObserved to make this test finished in a short time.
6596 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6597 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6598
6599 QuicFrames frames = {QuicFrame(&ack_frame)};
6600
6601 // clang-format off
6602 unsigned char packet[] = {
6603 // public flags (8 byte connection_id)
6604 0x28,
6605 // connection_id
6606 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6607 // packet number
6608 0x12, 0x34, 0x56, 0x78,
6609
6610 // frame type (ack frame)
6611 // (no ack blocks, 2 byte largest observed, 2 byte block length)
6612 0x45,
6613 // largest acked
6614 0x12, 0x34,
6615 // Zero delta time.
6616 0x00, 0x00,
6617 // first ack block length.
6618 0x12, 0x34,
6619 // num timestamps.
6620 0x00,
6621 };
6622
6623 unsigned char packet44[] = {
6624 // type (short header, 4 byte packet number)
6625 0x32,
6626 // connection_id
6627 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6628 // packet number
6629 0x12, 0x34, 0x56, 0x78,
6630
6631 // frame type (ack frame)
6632 // (no ack blocks, 2 byte largest observed, 2 byte block length)
6633 0x45,
6634 // largest acked
6635 0x12, 0x34,
6636 // Zero delta time.
6637 0x00, 0x00,
6638 // first ack block length.
6639 0x12, 0x34,
6640 // num timestamps.
6641 0x00,
6642 };
6643
6644 unsigned char packet46[] = {
6645 // type (short header, 4 byte packet number)
6646 0x43,
6647 // connection_id
6648 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6649 // packet number
6650 0x12, 0x34, 0x56, 0x78,
6651
6652 // frame type (ack frame)
6653 // (no ack blocks, 2 byte largest observed, 2 byte block length)
6654 0x45,
6655 // largest acked
6656 0x12, 0x34,
6657 // Zero delta time.
6658 0x00, 0x00,
6659 // first ack block length.
6660 0x12, 0x34,
6661 // num timestamps.
6662 0x00,
6663 };
6664
6665 unsigned char packet99[] = {
6666 // type (short header, 4 byte packet number)
6667 0x43,
6668 // connection_id
6669 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6670 // packet number
6671 0x12, 0x34, 0x56, 0x78,
6672
6673 // frame type (IETF_ACK frame)
6674 0x02,
6675 // largest acked
6676 kVarInt62TwoBytes + 0x12, 0x34,
6677 // Zero delta time.
6678 kVarInt62OneByte + 0x00,
6679 // Number of additional ack blocks.
6680 kVarInt62OneByte + 0x00,
6681 // first ack block length.
6682 kVarInt62TwoBytes + 0x12, 0x33,
6683 };
6684 // clang-format on
6685 unsigned char* p = packet;
6686 size_t p_size = QUIC_ARRAYSIZE(packet);
6687 if (framer_.transport_version() == QUIC_VERSION_99) {
6688 p = packet99;
6689 p_size = QUIC_ARRAYSIZE(packet99);
6690 } else if (framer_.transport_version() > QUIC_VERSION_44) {
6691 p = packet46;
6692 p_size = QUIC_ARRAYSIZE(packet46);
6693 } else if (framer_.transport_version() > QUIC_VERSION_43) {
6694 p = packet44;
6695 p_size = QUIC_ARRAYSIZE(packet44);
6696 }
6697
6698 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6699 ASSERT_TRUE(data != nullptr);
6700 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6701 data->length(), AsChars(p), p_size);
6702}
6703
6704TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlockMaxLength) {
6705 QuicPacketHeader header;
6706 header.destination_connection_id = FramerTestConnectionId();
6707 header.reset_flag = false;
6708 header.version_flag = false;
6709 header.packet_number = kPacketNumber;
6710
6711 QuicAckFrame ack_frame = InitAckFrame(kPacketNumber);
6712 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6713
6714 QuicFrames frames = {QuicFrame(&ack_frame)};
6715
6716 // clang-format off
6717 unsigned char packet[] = {
6718 // public flags (8 byte connection_id)
6719 0x28,
6720 // connection_id
6721 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6722 // packet number
6723 0x12, 0x34, 0x56, 0x78,
6724
6725 // frame type (ack frame)
6726 // (no ack blocks, 4 byte largest observed, 4 byte block length)
6727 0x4A,
6728 // largest acked
6729 0x12, 0x34, 0x56, 0x78,
6730 // Zero delta time.
6731 0x00, 0x00,
6732 // first ack block length.
6733 0x12, 0x34, 0x56, 0x78,
6734 // num timestamps.
6735 0x00,
6736 };
6737
6738 unsigned char packet44[] = {
6739 // type (short header, 4 byte packet number)
6740 0x32,
6741 // connection_id
6742 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6743 // packet number
6744 0x12, 0x34, 0x56, 0x78,
6745
6746 // frame type (ack frame)
6747 // (no ack blocks, 4 byte largest observed, 4 byte block length)
6748 0x4A,
6749 // largest acked
6750 0x12, 0x34, 0x56, 0x78,
6751 // Zero delta time.
6752 0x00, 0x00,
6753 // first ack block length.
6754 0x12, 0x34, 0x56, 0x78,
6755 // num timestamps.
6756 0x00,
6757 };
6758
6759 unsigned char packet46[] = {
6760 // type (short header, 4 byte packet number)
6761 0x43,
6762 // connection_id
6763 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6764 // packet number
6765 0x12, 0x34, 0x56, 0x78,
6766
6767 // frame type (ack frame)
6768 // (no ack blocks, 4 byte largest observed, 4 byte block length)
6769 0x4A,
6770 // largest acked
6771 0x12, 0x34, 0x56, 0x78,
6772 // Zero delta time.
6773 0x00, 0x00,
6774 // first ack block length.
6775 0x12, 0x34, 0x56, 0x78,
6776 // num timestamps.
6777 0x00,
6778 };
6779
6780
6781 unsigned char packet99[] = {
6782 // type (short header, 4 byte packet number)
6783 0x43,
6784 // connection_id
6785 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6786 // packet number
6787 0x12, 0x34, 0x56, 0x78,
6788
6789 // frame type (IETF_ACK frame)
6790 0x02,
6791 // largest acked
6792 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
6793 // Zero delta time.
6794 kVarInt62OneByte + 0x00,
6795 // Nr. of additional ack blocks
6796 kVarInt62OneByte + 0x00,
6797 // first ack block length.
6798 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
6799 };
6800 // clang-format on
6801 unsigned char* p = packet;
6802 size_t p_size = QUIC_ARRAYSIZE(packet);
6803 if (framer_.transport_version() == QUIC_VERSION_99) {
6804 p = packet99;
6805 p_size = QUIC_ARRAYSIZE(packet99);
6806 } else if (framer_.transport_version() > QUIC_VERSION_44) {
6807 p = packet46;
6808 p_size = QUIC_ARRAYSIZE(packet46);
6809 } else if (framer_.transport_version() > QUIC_VERSION_43) {
6810 p = packet44;
6811 p_size = QUIC_ARRAYSIZE(packet44);
6812 }
6813
6814 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6815 ASSERT_TRUE(data != nullptr);
6816 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6817 data->length(), AsChars(p), p_size);
6818}
6819
6820TEST_P(QuicFramerTest, BuildAckFramePacketMultipleAckBlocks) {
6821 QuicPacketHeader header;
6822 header.destination_connection_id = FramerTestConnectionId();
6823 header.reset_flag = false;
6824 header.version_flag = false;
6825 header.packet_number = kPacketNumber;
6826
6827 // Use kSmallLargestObserved to make this test finished in a short time.
6828 QuicAckFrame ack_frame =
6829 InitAckFrame({{QuicPacketNumber(1), QuicPacketNumber(5)},
6830 {QuicPacketNumber(10), QuicPacketNumber(500)},
6831 {QuicPacketNumber(900), kSmallMissingPacket},
6832 {kSmallMissingPacket + 1, kSmallLargestObserved + 1}});
6833 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6834
6835 QuicFrames frames = {QuicFrame(&ack_frame)};
6836
6837 // clang-format off
6838 unsigned char packet[] = {
6839 // public flags (8 byte connection_id)
6840 0x28,
6841 // connection_id
6842 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6843 // packet number
6844 0x12, 0x34, 0x56, 0x78,
6845
6846 // frame type (ack frame)
6847 // (has ack blocks, 2 byte largest observed, 2 byte block length)
6848 0x65,
6849 // largest acked
6850 0x12, 0x34,
6851 // Zero delta time.
6852 0x00, 0x00,
6853 // num ack blocks ranges.
6854 0x04,
6855 // first ack block length.
6856 0x00, 0x01,
6857 // gap to next block.
6858 0x01,
6859 // ack block length.
6860 0x0e, 0xaf,
6861 // gap to next block.
6862 0xff,
6863 // ack block length.
6864 0x00, 0x00,
6865 // gap to next block.
6866 0x91,
6867 // ack block length.
6868 0x01, 0xea,
6869 // gap to next block.
6870 0x05,
6871 // ack block length.
6872 0x00, 0x04,
6873 // num timestamps.
6874 0x00,
6875 };
6876
6877 unsigned char packet44[] = {
6878 // type (short header, 4 byte packet number)
6879 0x32,
6880 // connection_id
6881 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6882 // packet number
6883 0x12, 0x34, 0x56, 0x78,
6884
6885 // frame type (ack frame)
6886 // (has ack blocks, 2 byte largest observed, 2 byte block length)
6887 0x65,
6888 // largest acked
6889 0x12, 0x34,
6890 // Zero delta time.
6891 0x00, 0x00,
6892 // num ack blocks ranges.
6893 0x04,
6894 // first ack block length.
6895 0x00, 0x01,
6896 // gap to next block.
6897 0x01,
6898 // ack block length.
6899 0x0e, 0xaf,
6900 // gap to next block.
6901 0xff,
6902 // ack block length.
6903 0x00, 0x00,
6904 // gap to next block.
6905 0x91,
6906 // ack block length.
6907 0x01, 0xea,
6908 // gap to next block.
6909 0x05,
6910 // ack block length.
6911 0x00, 0x04,
6912 // num timestamps.
6913 0x00,
6914 };
6915
6916 unsigned char packet46[] = {
6917 // type (short header, 4 byte packet number)
6918 0x43,
6919 // connection_id
6920 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6921 // packet number
6922 0x12, 0x34, 0x56, 0x78,
6923
6924 // frame type (ack frame)
6925 // (has ack blocks, 2 byte largest observed, 2 byte block length)
6926 0x65,
6927 // largest acked
6928 0x12, 0x34,
6929 // Zero delta time.
6930 0x00, 0x00,
6931 // num ack blocks ranges.
6932 0x04,
6933 // first ack block length.
6934 0x00, 0x01,
6935 // gap to next block.
6936 0x01,
6937 // ack block length.
6938 0x0e, 0xaf,
6939 // gap to next block.
6940 0xff,
6941 // ack block length.
6942 0x00, 0x00,
6943 // gap to next block.
6944 0x91,
6945 // ack block length.
6946 0x01, 0xea,
6947 // gap to next block.
6948 0x05,
6949 // ack block length.
6950 0x00, 0x04,
6951 // num timestamps.
6952 0x00,
6953 };
6954
6955 unsigned char packet99[] = {
6956 // type (short header, 4 byte packet number)
6957 0x43,
6958 // connection_id
6959 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6960 // packet number
6961 0x12, 0x34, 0x56, 0x78,
6962
6963 // frame type (IETF_ACK frame)
6964 0x02,
6965 // largest acked
6966 kVarInt62TwoBytes + 0x12, 0x34,
6967 // Zero delta time.
6968 kVarInt62OneByte + 0x00,
6969 // num additional ack blocks.
6970 kVarInt62OneByte + 0x03,
6971 // first ack block length.
6972 kVarInt62OneByte + 0x00,
6973
6974 // gap to next block.
6975 kVarInt62OneByte + 0x00,
6976 // ack block length.
6977 kVarInt62TwoBytes + 0x0e, 0xae,
6978
6979 // gap to next block.
6980 kVarInt62TwoBytes + 0x01, 0x8f,
6981 // ack block length.
6982 kVarInt62TwoBytes + 0x01, 0xe9,
6983
6984 // gap to next block.
6985 kVarInt62OneByte + 0x04,
6986 // ack block length.
6987 kVarInt62OneByte + 0x03,
6988 };
6989 // clang-format on
6990 unsigned char* p = packet;
6991 size_t p_size = QUIC_ARRAYSIZE(packet);
6992 if (framer_.transport_version() == QUIC_VERSION_99) {
6993 p = packet99;
6994 p_size = QUIC_ARRAYSIZE(packet99);
6995 } else if (framer_.transport_version() > QUIC_VERSION_44) {
6996 p = packet46;
6997 p_size = QUIC_ARRAYSIZE(packet46);
6998 } else if (framer_.transport_version() > QUIC_VERSION_43) {
6999 p = packet44;
7000 p_size = QUIC_ARRAYSIZE(packet44);
7001 }
7002
7003 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7004 ASSERT_TRUE(data != nullptr);
7005
7006 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7007 data->length(), AsChars(p), p_size);
7008}
7009
7010TEST_P(QuicFramerTest, BuildAckFramePacketMaxAckBlocks) {
7011 QuicPacketHeader header;
7012 header.destination_connection_id = FramerTestConnectionId();
7013 header.reset_flag = false;
7014 header.version_flag = false;
7015 header.packet_number = kPacketNumber;
7016
7017 // Use kSmallLargestObservedto make this test finished in a short time.
7018 QuicAckFrame ack_frame;
7019 ack_frame.largest_acked = kSmallLargestObserved;
7020 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
7021 // 300 ack blocks.
7022 for (size_t i = 2; i < 2 * 300; i += 2) {
7023 ack_frame.packets.Add(QuicPacketNumber(i));
7024 }
7025 ack_frame.packets.AddRange(QuicPacketNumber(600), kSmallLargestObserved + 1);
7026
7027 QuicFrames frames = {QuicFrame(&ack_frame)};
7028
7029 // clang-format off
7030 unsigned char packet[] = {
7031 // public flags (8 byte connection_id)
7032 0x28,
7033 // connection_id
7034 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7035 // packet number
7036 0x12, 0x34, 0x56, 0x78,
7037 // frame type (ack frame)
7038 // (has ack blocks, 2 byte largest observed, 2 byte block length)
7039 0x65,
7040 // largest acked
7041 0x12, 0x34,
7042 // Zero delta time.
7043 0x00, 0x00,
7044 // num ack blocks ranges.
7045 0xff,
7046 // first ack block length.
7047 0x0f, 0xdd,
7048 // 255 = 4 * 63 + 3
7049 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7050 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
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
7060 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7061 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
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
7071 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7072 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
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, 0x01, 0x00, 0x01,
7077 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7078 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7079 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7080 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7081
7082 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7083 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7084 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7085 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7086 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7087 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7088 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7089 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7090 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7091 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7092
7093 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7094 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7095 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7096 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7097 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7098 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7099 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
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
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 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
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
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,
7119 // num timestamps.
7120 0x00,
7121 };
7122
7123 unsigned char packet44[] = {
7124 // type (short header, 4 byte packet number)
7125 0x32,
7126 // connection_id
7127 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7128 // packet number
7129 0x12, 0x34, 0x56, 0x78,
7130 // frame type (ack frame)
7131 // (has ack blocks, 2 byte largest observed, 2 byte block length)
7132 0x65,
7133 // largest acked
7134 0x12, 0x34,
7135 // Zero delta time.
7136 0x00, 0x00,
7137 // num ack blocks ranges.
7138 0xff,
7139 // first ack block length.
7140 0x0f, 0xdd,
7141 // 255 = 4 * 63 + 3
7142 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7143 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
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
7153 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7154 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
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
7164 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7165 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
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, 0x01, 0x00, 0x01,
7170 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7171 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7172 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7173 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7174
7175 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7176 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7177 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7178 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7179 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7180 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7181 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7182 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7183 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7184 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7185
7186 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7187 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7188 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7189 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7190 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7191 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7192 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7193 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7194 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7195 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7196
7197 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7198 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7199 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7200 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7201 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7202 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7203 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7204 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7205 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7206 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7207
7208 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7209 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7210 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7211 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7212 // num timestamps.
7213 0x00,
7214 };
7215
7216 unsigned char packet46[] = {
7217 // type (short header, 4 byte packet number)
7218 0x43,
7219 // connection_id
7220 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7221 // packet number
7222 0x12, 0x34, 0x56, 0x78,
7223 // frame type (ack frame)
7224 // (has ack blocks, 2 byte largest observed, 2 byte block length)
7225 0x65,
7226 // largest acked
7227 0x12, 0x34,
7228 // Zero delta time.
7229 0x00, 0x00,
7230 // num ack blocks ranges.
7231 0xff,
7232 // first ack block length.
7233 0x0f, 0xdd,
7234 // 255 = 4 * 63 + 3
7235 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7236 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7237 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7238 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7239 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7240 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7241 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7242 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7243 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7244 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7245
7246 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7247 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7248 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7249 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7250 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7251 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7252 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7253 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7254 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7255 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7256
7257 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7258 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7259 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7260 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7261 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7262 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7263 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7264 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7265 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7266 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7267
7268 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7269 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7270 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7271 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7272 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7273 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7274 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7275 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7276 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7277 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7278
7279 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7280 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7281 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7282 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7283 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7284 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7285 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7286 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7287 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7288 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7289
7290 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7291 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7292 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7293 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7294 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7295 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7296 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7297 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7298 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7299 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7300
7301 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7302 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7303 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7304 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7305 // num timestamps.
7306 0x00,
7307 };
7308
7309 unsigned char packet99[] = {
7310 // type (short header, 4 byte packet number)
7311 0x43,
7312 // connection_id
7313 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7314 // packet number
7315 0x12, 0x34, 0x56, 0x78,
7316 // frame type (IETF_ACK frame)
7317 0x02,
7318 // largest acked
7319 kVarInt62TwoBytes + 0x12, 0x34,
7320 // Zero delta time.
7321 kVarInt62OneByte + 0x00,
7322 // num ack blocks ranges.
7323 kVarInt62TwoBytes + 0x01, 0x2b,
7324 // first ack block length.
7325 kVarInt62TwoBytes + 0x0f, 0xdc,
7326 // 255 added blocks of gap_size == 1, ack_size == 1
7327#define V99AddedBLOCK kVarInt62OneByte + 0x00, kVarInt62OneByte + 0x00
7328 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7329 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7330 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7331 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7332 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7333 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7334 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7335 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7336 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7337 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7338 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7339 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7340 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7341 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7342 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7343 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7344 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7345 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7346 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7347 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7348
7349 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7350 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7351 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7352 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7353 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7354 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7355 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7356 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7357 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7358 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7359 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7360 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7361 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7362 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7363 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7364 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7365 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7366 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7367 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7368 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7369
7370 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7371 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7372 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7373 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7374 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7375 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7376 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7377 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7378 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7379 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7380 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7381 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7382 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7383 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7384 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7385 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7386 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7387 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7388 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7389 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7390
7391#undef V99AddedBLOCK
7392 };
7393 // clang-format on
7394 unsigned char* p = packet;
7395 size_t p_size = QUIC_ARRAYSIZE(packet);
7396 if (framer_.transport_version() == QUIC_VERSION_99) {
7397 p = packet99;
7398 p_size = QUIC_ARRAYSIZE(packet99);
7399 } else if (framer_.transport_version() > QUIC_VERSION_44) {
7400 p = packet46;
7401 p_size = QUIC_ARRAYSIZE(packet46);
7402 } else if (framer_.transport_version() > QUIC_VERSION_43) {
7403 p = packet44;
7404 p_size = QUIC_ARRAYSIZE(packet44);
7405 }
7406
7407 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7408 ASSERT_TRUE(data != nullptr);
7409
7410 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7411 data->length(), AsChars(p), p_size);
7412}
7413
7414TEST_P(QuicFramerTest, BuildNewStopWaitingPacket) {
7415 if (version_.transport_version > QUIC_VERSION_43) {
7416 return;
7417 }
7418 QuicPacketHeader header;
7419 header.destination_connection_id = FramerTestConnectionId();
7420 header.reset_flag = false;
7421 header.version_flag = false;
7422 header.packet_number = kPacketNumber;
7423
7424 QuicStopWaitingFrame stop_waiting_frame;
7425 stop_waiting_frame.least_unacked = kLeastUnacked;
7426
7427 QuicFrames frames = {QuicFrame(stop_waiting_frame)};
7428
7429 // clang-format off
7430 unsigned char packet[] = {
7431 // public flags (8 byte connection_id)
7432 0x28,
7433 // connection_id
7434 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7435 // packet number
7436 0x12, 0x34, 0x56, 0x78,
7437
7438 // frame type (stop waiting frame)
7439 0x06,
7440 // least packet number awaiting an ack, delta from packet number.
7441 0x00, 0x00, 0x00, 0x08,
7442 };
7443
7444 // clang-format on
7445
7446 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7447 ASSERT_TRUE(data != nullptr);
7448
7449 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7450 data->length(), AsChars(packet),
7451 QUIC_ARRAYSIZE(packet));
7452}
7453
7454TEST_P(QuicFramerTest, BuildRstFramePacketQuic) {
7455 QuicPacketHeader header;
7456 header.destination_connection_id = FramerTestConnectionId();
7457 header.reset_flag = false;
7458 header.version_flag = false;
7459 header.packet_number = kPacketNumber;
7460
7461 QuicRstStreamFrame rst_frame;
7462 rst_frame.stream_id = kStreamId;
7463 if (framer_.transport_version() == QUIC_VERSION_99) {
7464 rst_frame.ietf_error_code = 0x01;
7465 } else {
7466 rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708);
7467 }
7468 rst_frame.byte_offset = 0x0807060504030201;
7469
7470 // clang-format off
7471 unsigned char packet[] = {
7472 // public flags (8 byte connection_id)
7473 0x28,
7474 // connection_id
7475 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7476 // packet number
7477 0x12, 0x34, 0x56, 0x78,
7478
7479 // frame type (rst stream frame)
7480 0x01,
7481 // stream id
7482 0x01, 0x02, 0x03, 0x04,
7483 // sent byte offset
7484 0x08, 0x07, 0x06, 0x05,
7485 0x04, 0x03, 0x02, 0x01,
7486 // error code
7487 0x05, 0x06, 0x07, 0x08,
7488 };
7489
7490 unsigned char packet44[] = {
7491 // type (short packet, 4 byte packet number)
7492 0x32,
7493 // connection_id
7494 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7495 // packet number
7496 0x12, 0x34, 0x56, 0x78,
7497
7498 // frame type (rst stream frame)
7499 0x01,
7500 // stream id
7501 0x01, 0x02, 0x03, 0x04,
7502 // sent byte offset
7503 0x08, 0x07, 0x06, 0x05,
7504 0x04, 0x03, 0x02, 0x01,
7505 // error code
7506 0x05, 0x06, 0x07, 0x08,
7507 };
7508
7509 unsigned char packet46[] = {
7510 // type (short packet, 4 byte packet number)
7511 0x43,
7512 // connection_id
7513 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7514 // packet number
7515 0x12, 0x34, 0x56, 0x78,
7516
7517 // frame type (rst stream frame)
7518 0x01,
7519 // stream id
7520 0x01, 0x02, 0x03, 0x04,
7521 // sent byte offset
7522 0x08, 0x07, 0x06, 0x05,
7523 0x04, 0x03, 0x02, 0x01,
7524 // error code
7525 0x05, 0x06, 0x07, 0x08,
7526 };
7527
7528 unsigned char packet99[] = {
7529 // type (short packet, 4 byte packet number)
7530 0x43,
7531 // connection_id
7532 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7533 // packet number
7534 0x12, 0x34, 0x56, 0x78,
7535
7536 // frame type (IETF_RST_STREAM frame)
7537 0x04,
7538 // stream id
7539 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
7540 // error code (not VarInt32 encoded)
7541 0x00, 0x01,
7542 // sent byte offset
7543 kVarInt62EightBytes + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01
7544 };
7545 // clang-format on
7546
7547 QuicFrames frames = {QuicFrame(&rst_frame)};
7548
7549 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7550 ASSERT_TRUE(data != nullptr);
7551
7552 unsigned char* p = packet;
7553 size_t p_size = QUIC_ARRAYSIZE(packet);
7554 if (framer_.transport_version() == QUIC_VERSION_99) {
7555 p = packet99;
7556 p_size = QUIC_ARRAYSIZE(packet99);
7557 } else if (framer_.transport_version() > QUIC_VERSION_44) {
7558 p = packet46;
7559 p_size = QUIC_ARRAYSIZE(packet46);
7560 } else if (framer_.transport_version() > QUIC_VERSION_43) {
7561 p = packet44;
7562 p_size = QUIC_ARRAYSIZE(packet44);
7563 }
7564 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
7565
7566 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7567 data->length(), AsChars(p), p_size);
7568}
7569
7570TEST_P(QuicFramerTest, BuildCloseFramePacket) {
7571 QuicPacketHeader header;
7572 header.destination_connection_id = FramerTestConnectionId();
7573 header.reset_flag = false;
7574 header.version_flag = false;
7575 header.packet_number = kPacketNumber;
7576
7577 QuicConnectionCloseFrame close_frame;
7578 if (framer_.transport_version() == QUIC_VERSION_99) {
fkastenholze9d71a82019-04-09 05:12:13 -07007579 close_frame.transport_error_code =
QUICHE teama6ef0a62019-03-07 20:34:33 -05007580 static_cast<QuicIetfTransportErrorCodes>(0x11);
fkastenholze9d71a82019-04-09 05:12:13 -07007581 close_frame.transport_close_frame_type = 0x05;
fkastenholz72f509b2019-04-10 09:17:49 -07007582 close_frame.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -05007583 } else {
fkastenholze9d71a82019-04-09 05:12:13 -07007584 close_frame.quic_error_code = static_cast<QuicErrorCode>(0x05060708);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007585 }
7586 close_frame.error_details = "because I can";
7587
7588 QuicFrames frames = {QuicFrame(&close_frame)};
7589
7590 // clang-format off
7591 unsigned char packet[] = {
7592 // public flags (8 byte connection_id)
7593 0x28,
7594 // connection_id
7595 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7596 // packet number
7597 0x12, 0x34, 0x56, 0x78,
7598
7599 // frame type (connection close frame)
7600 0x02,
7601 // error code
7602 0x05, 0x06, 0x07, 0x08,
7603 // error details length
7604 0x00, 0x0d,
7605 // error details
7606 'b', 'e', 'c', 'a',
7607 'u', 's', 'e', ' ',
7608 'I', ' ', 'c', 'a',
7609 'n',
7610 };
7611
7612 unsigned char packet44[] = {
7613 // type (short header, 4 byte packet number)
7614 0x32,
7615 // connection_id
7616 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7617 // packet number
7618 0x12, 0x34, 0x56, 0x78,
7619
7620 // frame type (connection close frame)
7621 0x02,
7622 // error code
7623 0x05, 0x06, 0x07, 0x08,
7624 // error details length
7625 0x00, 0x0d,
7626 // error details
7627 'b', 'e', 'c', 'a',
7628 'u', 's', 'e', ' ',
7629 'I', ' ', 'c', 'a',
7630 'n',
7631 };
7632
7633 unsigned char packet46[] = {
7634 // type (short header, 4 byte packet number)
7635 0x43,
7636 // connection_id
7637 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7638 // packet number
7639 0x12, 0x34, 0x56, 0x78,
7640
7641 // frame type (connection close frame)
7642 0x02,
7643 // error code
7644 0x05, 0x06, 0x07, 0x08,
7645 // error details length
7646 0x00, 0x0d,
7647 // error details
7648 'b', 'e', 'c', 'a',
7649 'u', 's', 'e', ' ',
7650 'I', ' ', 'c', 'a',
7651 'n',
7652 };
7653
7654 unsigned char packet99[] = {
7655 // type (short header, 4 byte packet number)
7656 0x43,
7657 // connection_id
7658 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7659 // packet number
7660 0x12, 0x34, 0x56, 0x78,
7661
7662 // frame type (IETF_CONNECTION_CLOSE frame)
7663 0x1c,
7664 // error code
7665 0x00, 0x11,
7666 // Frame type within the CONNECTION_CLOSE frame
7667 kVarInt62OneByte + 0x05,
7668 // error details length
7669 kVarInt62OneByte + 0x0d,
7670 // error details
7671 'b', 'e', 'c', 'a',
7672 'u', 's', 'e', ' ',
7673 'I', ' ', 'c', 'a',
7674 'n',
7675 };
7676 // clang-format on
7677
7678 unsigned char* p = packet;
7679 size_t p_size = QUIC_ARRAYSIZE(packet);
7680 if (framer_.transport_version() == QUIC_VERSION_99) {
7681 p = packet99;
7682 p_size = QUIC_ARRAYSIZE(packet99);
7683 } else if (framer_.transport_version() > QUIC_VERSION_44) {
7684 p = packet46;
7685 p_size = QUIC_ARRAYSIZE(packet46);
7686 } else if (framer_.transport_version() > QUIC_VERSION_43) {
7687 p = packet44;
7688 p_size = QUIC_ARRAYSIZE(packet44);
7689 }
7690
7691 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7692 ASSERT_TRUE(data != nullptr);
7693
7694 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7695 data->length(), AsChars(p), p_size);
7696}
7697
7698TEST_P(QuicFramerTest, BuildTruncatedCloseFramePacket) {
7699 QuicPacketHeader header;
7700 header.destination_connection_id = FramerTestConnectionId();
7701 header.reset_flag = false;
7702 header.version_flag = false;
7703 header.packet_number = kPacketNumber;
7704
7705 QuicConnectionCloseFrame close_frame;
7706 if (framer_.transport_version() == QUIC_VERSION_99) {
fkastenholze9d71a82019-04-09 05:12:13 -07007707 close_frame.transport_error_code = PROTOCOL_VIOLATION; // value is 0x0a
7708 EXPECT_EQ(0u, close_frame.transport_close_frame_type);
fkastenholz72f509b2019-04-10 09:17:49 -07007709 close_frame.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -05007710 } else {
fkastenholze9d71a82019-04-09 05:12:13 -07007711 close_frame.quic_error_code = static_cast<QuicErrorCode>(0x05060708);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007712 }
vasilvvc48c8712019-03-11 13:38:16 -07007713 close_frame.error_details = std::string(2048, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -05007714 QuicFrames frames = {QuicFrame(&close_frame)};
7715
7716 // clang-format off
7717 unsigned char packet[] = {
7718 // public flags (8 byte connection_id)
7719 0x28,
7720 // connection_id
7721 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7722 // packet number
7723 0x12, 0x34, 0x56, 0x78,
7724
7725 // frame type (connection close frame)
7726 0x02,
7727 // error code
7728 0x05, 0x06, 0x07, 0x08,
7729 // error details length
7730 0x01, 0x00,
7731 // error details (truncated to 256 bytes)
7732 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7733 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7734 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7735 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7736 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7737 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7738 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7739 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7740 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7741 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7742 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7743 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7744 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7745 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7746 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7747 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7748 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7749 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7750 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
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 };
7765
7766 unsigned char packet44[] = {
7767 // type (short header, 4 byte packet number)
7768 0x32,
7769 // connection_id
7770 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7771 // packet number
7772 0x12, 0x34, 0x56, 0x78,
7773
7774 // frame type (connection close frame)
7775 0x02,
7776 // error code
7777 0x05, 0x06, 0x07, 0x08,
7778 // error details length
7779 0x01, 0x00,
7780 // error details (truncated to 256 bytes)
7781 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7782 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7783 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7784 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7785 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7786 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7787 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7788 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7789 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7790 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7791 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7792 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7793 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7794 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7795 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7796 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7797 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7798 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7799 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7800 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7801 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7802 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7803 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7804 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7805 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7806 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7807 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7808 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7809 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7810 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7811 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7812 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7813 };
7814
7815 unsigned char packet46[] = {
7816 // type (short header, 4 byte packet number)
7817 0x43,
7818 // connection_id
7819 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7820 // packet number
7821 0x12, 0x34, 0x56, 0x78,
7822
7823 // frame type (connection close frame)
7824 0x02,
7825 // error code
7826 0x05, 0x06, 0x07, 0x08,
7827 // error details length
7828 0x01, 0x00,
7829 // error details (truncated to 256 bytes)
7830 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7831 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7832 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7833 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7834 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7835 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7836 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7837 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7838 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7839 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7840 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7841 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7842 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7843 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7844 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7845 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7846 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7847 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7848 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7849 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7850 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7851 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7852 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7853 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7854 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7855 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7856 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7857 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7858 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7859 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7860 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7861 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7862 };
7863
7864 unsigned char packet99[] = {
7865 // type (short header, 4 byte packet number)
7866 0x43,
7867 // connection_id
7868 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7869 // packet number
7870 0x12, 0x34, 0x56, 0x78,
7871
7872 // frame type (IETF_CONNECTION_CLOSE frame)
7873 0x1c,
7874 // error code
7875 0x00, 0x0a,
7876 // Frame type within the CONNECTION_CLOSE frame
7877 kVarInt62OneByte + 0x00,
7878 // error details length
7879 kVarInt62TwoBytes + 0x01, 0x00,
7880 // error details (truncated to 256 bytes)
7881 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7882 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7883 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7884 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7885 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7886 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7887 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7888 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7889 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7890 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7891 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7892 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7893 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
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 };
7914 // clang-format on
7915
7916 unsigned char* p = packet;
7917 size_t p_size = QUIC_ARRAYSIZE(packet);
7918 if (framer_.transport_version() == QUIC_VERSION_99) {
7919 p = packet99;
7920 p_size = QUIC_ARRAYSIZE(packet99);
7921 } else if (framer_.transport_version() > QUIC_VERSION_44) {
7922 p = packet46;
7923 p_size = QUIC_ARRAYSIZE(packet46);
7924 } else if (framer_.transport_version() > QUIC_VERSION_43) {
7925 p = packet44;
7926 p_size = QUIC_ARRAYSIZE(packet44);
7927 }
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(p), p_size);
7934}
7935
7936TEST_P(QuicFramerTest, BuildApplicationCloseFramePacket) {
7937 if (framer_.transport_version() != QUIC_VERSION_99) {
7938 // Versions other than 99 do not have ApplicationClose
7939 return;
7940 }
7941 QuicPacketHeader header;
7942 header.destination_connection_id = FramerTestConnectionId();
7943 header.reset_flag = false;
7944 header.version_flag = false;
7945 header.packet_number = kPacketNumber;
7946
fkastenholz72f509b2019-04-10 09:17:49 -07007947 QuicConnectionCloseFrame app_close_frame;
7948 app_close_frame.quic_error_code = static_cast<QuicErrorCode>(0x11);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007949 app_close_frame.error_details = "because I can";
fkastenholz72f509b2019-04-10 09:17:49 -07007950 app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -05007951
7952 QuicFrames frames = {QuicFrame(&app_close_frame)};
7953
7954 // clang-format off
7955
7956 unsigned char packet99[] = {
7957 // type (short header, 4 byte packet number)
7958 0x43,
7959 // connection_id
7960 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7961 // packet number
7962 0x12, 0x34, 0x56, 0x78,
7963
7964 // frame type (IETF_APPLICATION_CLOSE frame)
7965 0x1d,
7966 // error code
7967 0x00, 0x11,
7968 // error details length
7969 kVarInt62OneByte + 0x0d,
7970 // error details
7971 'b', 'e', 'c', 'a',
7972 'u', 's', 'e', ' ',
7973 'I', ' ', 'c', 'a',
7974 'n',
7975 };
7976 // clang-format on
7977
7978 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7979 ASSERT_TRUE(data != nullptr);
7980
7981 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7982 data->length(), AsChars(packet99),
7983 QUIC_ARRAYSIZE(packet99));
7984}
7985
7986TEST_P(QuicFramerTest, BuildTruncatedApplicationCloseFramePacket) {
7987 if (framer_.transport_version() != QUIC_VERSION_99) {
7988 // Versions other than 99 do not have this frame.
7989 return;
7990 }
7991 QuicPacketHeader header;
7992 header.destination_connection_id = FramerTestConnectionId();
7993 header.reset_flag = false;
7994 header.version_flag = false;
7995 header.packet_number = kPacketNumber;
7996
fkastenholz72f509b2019-04-10 09:17:49 -07007997 QuicConnectionCloseFrame app_close_frame;
7998 app_close_frame.quic_error_code = static_cast<QuicErrorCode>(0x11);
vasilvvc48c8712019-03-11 13:38:16 -07007999 app_close_frame.error_details = std::string(2048, 'A');
fkastenholz72f509b2019-04-10 09:17:49 -07008000 app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008001
8002 QuicFrames frames = {QuicFrame(&app_close_frame)};
8003
8004 // clang-format off
8005 unsigned char packet99[] = {
8006 // type (short header, 4 byte packet number)
8007 0x43,
8008 // connection_id
8009 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8010 // packet number
8011 0x12, 0x34, 0x56, 0x78,
8012
8013 // frame type (IETF_APPLICATION_CLOSE frame)
8014 0x1d,
8015 // error code
8016 0x00, 0x11,
8017 // error details length
8018 kVarInt62TwoBytes + 0x01, 0x00,
8019 // error details (truncated to 256 bytes)
8020 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8021 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8022 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8023 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8024 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8025 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8026 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8027 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8028 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8029 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8030 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8031 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8032 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8033 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8034 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8035 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8036 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8037 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8038 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8039 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8040 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8041 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8042 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8043 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8044 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8045 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8046 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8047 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8048 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8049 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8050 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8051 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8052 };
8053 // clang-format on
8054
8055 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8056 ASSERT_TRUE(data != nullptr);
8057
8058 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8059 data->length(), AsChars(packet99),
8060 QUIC_ARRAYSIZE(packet99));
8061}
8062
8063TEST_P(QuicFramerTest, BuildGoAwayPacket) {
8064 if (framer_.transport_version() == QUIC_VERSION_99) {
8065 // This frame type is not supported in version 99.
8066 return;
8067 }
8068 QuicPacketHeader header;
8069 header.destination_connection_id = FramerTestConnectionId();
8070 header.reset_flag = false;
8071 header.version_flag = false;
8072 header.packet_number = kPacketNumber;
8073
8074 QuicGoAwayFrame goaway_frame;
8075 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
8076 goaway_frame.last_good_stream_id = kStreamId;
8077 goaway_frame.reason_phrase = "because I can";
8078
8079 QuicFrames frames = {QuicFrame(&goaway_frame)};
8080
8081 // clang-format off
8082 unsigned char packet[] = {
8083 // public flags (8 byte connection_id)
8084 0x28,
8085 // connection_id
8086 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8087 // packet number
8088 0x12, 0x34, 0x56, 0x78,
8089
8090 // frame type (go away frame)
8091 0x03,
8092 // error code
8093 0x05, 0x06, 0x07, 0x08,
8094 // stream id
8095 0x01, 0x02, 0x03, 0x04,
8096 // error details length
8097 0x00, 0x0d,
8098 // error details
8099 'b', 'e', 'c', 'a',
8100 'u', 's', 'e', ' ',
8101 'I', ' ', 'c', 'a',
8102 'n',
8103 };
8104
8105 unsigned char packet44[] = {
8106 // type (short header, 4 byte packet number)
8107 0x32,
8108 // connection_id
8109 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8110 // packet number
8111 0x12, 0x34, 0x56, 0x78,
8112
8113 // frame type (go away frame)
8114 0x03,
8115 // error code
8116 0x05, 0x06, 0x07, 0x08,
8117 // stream id
8118 0x01, 0x02, 0x03, 0x04,
8119 // error details length
8120 0x00, 0x0d,
8121 // error details
8122 'b', 'e', 'c', 'a',
8123 'u', 's', 'e', ' ',
8124 'I', ' ', 'c', 'a',
8125 'n',
8126 };
8127
8128 unsigned char packet46[] = {
8129 // type (short header, 4 byte packet number)
8130 0x43,
8131 // connection_id
8132 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8133 // packet number
8134 0x12, 0x34, 0x56, 0x78,
8135
8136 // frame type (go away frame)
8137 0x03,
8138 // error code
8139 0x05, 0x06, 0x07, 0x08,
8140 // stream id
8141 0x01, 0x02, 0x03, 0x04,
8142 // error details length
8143 0x00, 0x0d,
8144 // error details
8145 'b', 'e', 'c', 'a',
8146 'u', 's', 'e', ' ',
8147 'I', ' ', 'c', 'a',
8148 'n',
8149 };
8150
8151 // clang-format on
8152
8153 unsigned char* p = packet;
8154 size_t p_size = QUIC_ARRAYSIZE(packet);
8155 if (framer_.transport_version() > QUIC_VERSION_44) {
8156 p = packet46;
8157 p_size = QUIC_ARRAYSIZE(packet46);
8158 } else if (framer_.transport_version() > QUIC_VERSION_43) {
8159 p = packet44;
8160 p_size = QUIC_ARRAYSIZE(packet44);
8161 }
8162
8163 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8164 ASSERT_TRUE(data != nullptr);
8165
8166 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8167 data->length(), AsChars(p), p_size);
8168}
8169
8170TEST_P(QuicFramerTest, BuildTruncatedGoAwayPacket) {
8171 if (framer_.transport_version() == QUIC_VERSION_99) {
8172 // This frame type is not supported in version 99.
8173 return;
8174 }
8175 QuicPacketHeader header;
8176 header.destination_connection_id = FramerTestConnectionId();
8177 header.reset_flag = false;
8178 header.version_flag = false;
8179 header.packet_number = kPacketNumber;
8180
8181 QuicGoAwayFrame goaway_frame;
8182 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
8183 goaway_frame.last_good_stream_id = kStreamId;
vasilvvc48c8712019-03-11 13:38:16 -07008184 goaway_frame.reason_phrase = std::string(2048, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -05008185
8186 QuicFrames frames = {QuicFrame(&goaway_frame)};
8187
8188 // clang-format off
8189 unsigned char packet[] = {
8190 // public flags (8 byte connection_id)
8191 0x28,
8192 // connection_id
8193 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8194 // packet number
8195 0x12, 0x34, 0x56, 0x78,
8196
8197 // frame type (go away frame)
8198 0x03,
8199 // error code
8200 0x05, 0x06, 0x07, 0x08,
8201 // stream id
8202 0x01, 0x02, 0x03, 0x04,
8203 // error details length
8204 0x01, 0x00,
8205 // error details (truncated to 256 bytes)
8206 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8207 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8208 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8209 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8210 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8211 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8212 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8213 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8214 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8215 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8216 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8217 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8218 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8219 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8220 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8221 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8222 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8223 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8224 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8225 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8226 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8227 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8228 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8229 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8230 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8231 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8232 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8233 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8234 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8235 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8236 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8237 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8238 };
8239
8240 unsigned char packet44[] = {
8241 // type (short header, 4 byte packet number)
8242 0x32,
8243 // connection_id
8244 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8245 // packet number
8246 0x12, 0x34, 0x56, 0x78,
8247
8248 // frame type (go away frame)
8249 0x03,
8250 // error code
8251 0x05, 0x06, 0x07, 0x08,
8252 // stream id
8253 0x01, 0x02, 0x03, 0x04,
8254 // error details length
8255 0x01, 0x00,
8256 // error details (truncated to 256 bytes)
8257 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8258 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8259 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8260 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8261 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8262 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8263 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8264 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8265 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8266 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8267 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8268 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8269 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8270 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8271 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8272 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8273 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8274 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8275 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8276 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8277 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8278 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8279 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8280 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8281 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8282 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8283 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8284 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8285 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8286 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8287 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8288 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8289 };
8290
8291 unsigned char packet46[] = {
8292 // type (short header, 4 byte packet number)
8293 0x43,
8294 // connection_id
8295 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8296 // packet number
8297 0x12, 0x34, 0x56, 0x78,
8298
8299 // frame type (go away frame)
8300 0x03,
8301 // error code
8302 0x05, 0x06, 0x07, 0x08,
8303 // stream id
8304 0x01, 0x02, 0x03, 0x04,
8305 // error details length
8306 0x01, 0x00,
8307 // error details (truncated to 256 bytes)
8308 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8309 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8310 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8311 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8312 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8313 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8314 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8315 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8316 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8317 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8318 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8319 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8320 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8321 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8322 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8323 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8324 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8325 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8326 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8327 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8328 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8329 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8330 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8331 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8332 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8333 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8334 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8335 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8336 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8337 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8338 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8339 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8340 };
8341 // clang-format on
8342
8343 unsigned char* p = packet;
8344 size_t p_size = QUIC_ARRAYSIZE(packet);
8345 if (framer_.transport_version() > QUIC_VERSION_44) {
8346 p = packet46;
8347 p_size = QUIC_ARRAYSIZE(packet46);
8348 } else if (framer_.transport_version() > QUIC_VERSION_43) {
8349 p = packet44;
8350 p_size = QUIC_ARRAYSIZE(packet44);
8351 }
8352
8353 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8354 ASSERT_TRUE(data != nullptr);
8355
8356 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8357 data->length(), AsChars(p), p_size);
8358}
8359
8360TEST_P(QuicFramerTest, BuildWindowUpdatePacket) {
8361 QuicPacketHeader header;
8362 header.destination_connection_id = FramerTestConnectionId();
8363 header.reset_flag = false;
8364 header.version_flag = false;
8365 header.packet_number = kPacketNumber;
8366
8367 QuicWindowUpdateFrame window_update_frame;
8368 window_update_frame.stream_id = kStreamId;
8369 window_update_frame.byte_offset = 0x1122334455667788;
8370
8371 QuicFrames frames = {QuicFrame(&window_update_frame)};
8372
8373 // clang-format off
8374 unsigned char packet[] = {
8375 // public flags (8 byte connection_id)
8376 0x28,
8377 // connection_id
8378 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8379 // packet number
8380 0x12, 0x34, 0x56, 0x78,
8381
8382 // frame type (window update frame)
8383 0x04,
8384 // stream id
8385 0x01, 0x02, 0x03, 0x04,
8386 // byte offset
8387 0x11, 0x22, 0x33, 0x44,
8388 0x55, 0x66, 0x77, 0x88,
8389 };
8390
8391 unsigned char packet44[] = {
8392 // type (short header, 4 byte packet number)
8393 0x32,
8394 // connection_id
8395 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8396 // packet number
8397 0x12, 0x34, 0x56, 0x78,
8398
8399 // frame type (window update frame)
8400 0x04,
8401 // stream id
8402 0x01, 0x02, 0x03, 0x04,
8403 // byte offset
8404 0x11, 0x22, 0x33, 0x44,
8405 0x55, 0x66, 0x77, 0x88,
8406 };
8407
8408 unsigned char packet46[] = {
8409 // type (short header, 4 byte packet number)
8410 0x43,
8411 // connection_id
8412 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8413 // packet number
8414 0x12, 0x34, 0x56, 0x78,
8415
8416 // frame type (window update frame)
8417 0x04,
8418 // stream id
8419 0x01, 0x02, 0x03, 0x04,
8420 // byte offset
8421 0x11, 0x22, 0x33, 0x44,
8422 0x55, 0x66, 0x77, 0x88,
8423 };
8424
8425 unsigned char packet99[] = {
8426 // type (short header, 4 byte packet number)
8427 0x43,
8428 // connection_id
8429 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8430 // packet number
8431 0x12, 0x34, 0x56, 0x78,
8432
8433 // frame type (IETF_MAX_STREAM_DATA frame)
8434 0x11,
8435 // stream id
8436 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
8437 // byte offset
8438 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
8439 0x55, 0x66, 0x77, 0x88,
8440 };
8441 // clang-format on
8442
8443 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8444 ASSERT_TRUE(data != nullptr);
8445
8446 unsigned char* p = packet;
8447 size_t p_size = QUIC_ARRAYSIZE(packet);
8448 if (framer_.transport_version() == QUIC_VERSION_99) {
8449 p = packet99;
8450 p_size = QUIC_ARRAYSIZE(packet99);
8451 } else if (framer_.transport_version() > QUIC_VERSION_44) {
8452 p = packet46;
8453 p_size = QUIC_ARRAYSIZE(packet46);
8454 } else if (framer_.transport_version() > QUIC_VERSION_43) {
8455 p = packet44;
8456 p_size = QUIC_ARRAYSIZE(packet44);
8457 }
8458
8459 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8460 data->length(), AsChars(p), p_size);
8461}
8462
8463TEST_P(QuicFramerTest, BuildMaxStreamDataPacket) {
8464 if (framer_.transport_version() != QUIC_VERSION_99) {
8465 // This frame is available only in this version.
8466 return;
8467 }
8468 QuicPacketHeader header;
8469 header.destination_connection_id = FramerTestConnectionId();
8470 header.reset_flag = false;
8471 header.version_flag = false;
8472 header.packet_number = kPacketNumber;
8473
8474 QuicWindowUpdateFrame window_update_frame;
8475 window_update_frame.stream_id = kStreamId;
8476 window_update_frame.byte_offset = 0x1122334455667788;
8477
8478 QuicFrames frames = {QuicFrame(&window_update_frame)};
8479
8480 // clang-format off
8481 unsigned char packet99[] = {
8482 // type (short header, 4 byte packet number)
8483 0x43,
8484 // connection_id
8485 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8486 // packet number
8487 0x12, 0x34, 0x56, 0x78,
8488
8489 // frame type (IETF_MAX_STREAM_DATA frame)
8490 0x11,
8491 // stream id
8492 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
8493 // byte offset
8494 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
8495 0x55, 0x66, 0x77, 0x88,
8496 };
8497 // clang-format on
8498
8499 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8500 ASSERT_TRUE(data != nullptr);
8501
8502 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8503 data->length(), AsChars(packet99),
8504 QUIC_ARRAYSIZE(packet99));
8505}
8506
8507TEST_P(QuicFramerTest, BuildMaxDataPacket) {
8508 if (framer_.transport_version() != QUIC_VERSION_99) {
8509 // This frame is available only in this version.
8510 return;
8511 }
8512 QuicPacketHeader header;
8513 header.destination_connection_id = FramerTestConnectionId();
8514 header.reset_flag = false;
8515 header.version_flag = false;
8516 header.packet_number = kPacketNumber;
8517
8518 QuicWindowUpdateFrame window_update_frame;
8519 window_update_frame.stream_id =
8520 QuicUtils::GetInvalidStreamId(framer_.transport_version());
8521 window_update_frame.byte_offset = 0x1122334455667788;
8522
8523 QuicFrames frames = {QuicFrame(&window_update_frame)};
8524
8525 // clang-format off
8526 unsigned char packet99[] = {
8527 // type (short header, 4 byte packet number)
8528 0x43,
8529 // connection_id
8530 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8531 // packet number
8532 0x12, 0x34, 0x56, 0x78,
8533
8534 // frame type (IETF_MAX_DATA frame)
8535 0x10,
8536 // byte offset
8537 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
8538 0x55, 0x66, 0x77, 0x88,
8539 };
8540 // clang-format on
8541
8542 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8543 ASSERT_TRUE(data != nullptr);
8544
8545 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8546 data->length(), AsChars(packet99),
8547 QUIC_ARRAYSIZE(packet99));
8548}
8549
8550TEST_P(QuicFramerTest, BuildBlockedPacket) {
8551 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 QuicBlockedFrame blocked_frame;
8558 if (framer_.transport_version() == QUIC_VERSION_99) {
8559 // For V99, the stream ID must be <invalid> for the frame
8560 // to be a BLOCKED frame. if it's valid, it will be a
8561 // STREAM_BLOCKED frame.
8562 blocked_frame.stream_id =
8563 QuicUtils::GetInvalidStreamId(framer_.transport_version());
8564 } else {
8565 blocked_frame.stream_id = kStreamId;
8566 }
8567 blocked_frame.offset = kStreamOffset;
8568
8569 QuicFrames frames = {QuicFrame(&blocked_frame)};
8570
8571 // clang-format off
8572 unsigned char packet[] = {
8573 // public flags (8 byte connection_id)
8574 0x28,
8575 // connection_id
8576 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8577 // packet number
8578 0x12, 0x34, 0x56, 0x78,
8579
8580 // frame type (blocked frame)
8581 0x05,
8582 // stream id
8583 0x01, 0x02, 0x03, 0x04,
8584 };
8585
8586 unsigned char packet44[] = {
8587 // type (short packet, 4 byte packet number)
8588 0x32,
8589 // connection_id
8590 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8591 // packet number
8592 0x12, 0x34, 0x56, 0x78,
8593
8594 // frame type (blocked frame)
8595 0x05,
8596 // stream id
8597 0x01, 0x02, 0x03, 0x04,
8598 };
8599
8600 unsigned char packet46[] = {
8601 // type (short packet, 4 byte packet number)
8602 0x43,
8603 // connection_id
8604 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8605 // packet number
8606 0x12, 0x34, 0x56, 0x78,
8607
8608 // frame type (blocked frame)
8609 0x05,
8610 // stream id
8611 0x01, 0x02, 0x03, 0x04,
8612 };
8613
8614 unsigned char packet99[] = {
8615 // type (short packet, 4 byte packet number)
8616 0x43,
8617 // connection_id
8618 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8619 // packet number
8620 0x12, 0x34, 0x56, 0x78,
8621
8622 // frame type (IETF_BLOCKED frame)
8623 0x14,
8624 // Offset
8625 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
8626 };
8627 // clang-format on
8628
8629 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8630 ASSERT_TRUE(data != nullptr);
8631
8632 unsigned char* p = packet;
8633 size_t p_size = QUIC_ARRAYSIZE(packet);
8634 if (framer_.transport_version() == QUIC_VERSION_99) {
8635 p = packet99;
8636 p_size = QUIC_ARRAYSIZE(packet99);
8637 } else if (framer_.transport_version() > QUIC_VERSION_44) {
8638 p = packet46;
8639 p_size = QUIC_ARRAYSIZE(packet46);
8640 } else if (framer_.transport_version() > QUIC_VERSION_43) {
8641 p = packet44;
8642 p_size = QUIC_ARRAYSIZE(packet44);
8643 }
8644
8645 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8646 data->length(), AsChars(p), p_size);
8647}
8648
8649TEST_P(QuicFramerTest, BuildPingPacket) {
8650 QuicPacketHeader header;
8651 header.destination_connection_id = FramerTestConnectionId();
8652 header.reset_flag = false;
8653 header.version_flag = false;
8654 header.packet_number = kPacketNumber;
8655
8656 QuicFrames frames = {QuicFrame(QuicPingFrame())};
8657
8658 // clang-format off
8659 unsigned char packet[] = {
8660 // public flags (8 byte connection_id)
8661 0x28,
8662 // connection_id
8663 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8664 // packet number
8665 0x12, 0x34, 0x56, 0x78,
8666
8667 // frame type (ping frame)
8668 0x07,
8669 };
8670
8671 unsigned char packet44[] = {
8672 // type (short header, 4 byte packet number)
8673 0x32,
8674 // connection_id
8675 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8676 // packet number
8677 0x12, 0x34, 0x56, 0x78,
8678
8679 // frame type
8680 0x07,
8681 };
8682
8683 unsigned char packet46[] = {
8684 // type (short header, 4 byte packet number)
8685 0x43,
8686 // connection_id
8687 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8688 // packet number
8689 0x12, 0x34, 0x56, 0x78,
8690
8691 // frame type
8692 0x07,
8693 };
8694
8695 unsigned char packet99[] = {
8696 // type (short header, 4 byte packet number)
8697 0x43,
8698 // connection_id
8699 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8700 // packet number
8701 0x12, 0x34, 0x56, 0x78,
8702
8703 // frame type (IETF_PING frame)
8704 0x01,
8705 };
8706 // clang-format on
8707
8708 unsigned char* p = packet;
8709 if (framer_.transport_version() == QUIC_VERSION_99) {
8710 p = packet99;
8711 } else if (framer_.transport_version() > QUIC_VERSION_44) {
8712 p = packet46;
8713 } else if (framer_.transport_version() > QUIC_VERSION_43) {
8714 p = packet44;
8715 }
8716
8717 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8718 ASSERT_TRUE(data != nullptr);
8719
8720 test::CompareCharArraysWithHexError(
8721 "constructed packet", data->data(), data->length(), AsChars(p),
8722 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44)
8723 : QUIC_ARRAYSIZE(packet));
8724}
8725
8726TEST_P(QuicFramerTest, BuildMessagePacket) {
8727 if (framer_.transport_version() <= QUIC_VERSION_44) {
8728 return;
8729 }
8730 QuicPacketHeader header;
8731 header.destination_connection_id = FramerTestConnectionId();
8732 header.reset_flag = false;
8733 header.version_flag = false;
8734 header.packet_number = kPacketNumber;
8735 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
8736
wub553a9662019-03-28 20:13:23 -07008737 QuicMessageFrame frame(1, MakeSpan(&allocator_, "message", &storage));
8738 QuicMessageFrame frame2(2, MakeSpan(&allocator_, "message2", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05008739 QuicFrames frames = {QuicFrame(&frame), QuicFrame(&frame2)};
8740
8741 // clang-format off
8742 unsigned char packet45[] = {
8743 // type (short header, 4 byte packet number)
8744 0x32,
8745 // connection_id
8746 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8747 // packet number
8748 0x12, 0x34, 0x56, 0x78,
8749
8750 // frame type (message frame)
8751 0x21,
8752 // Length
8753 0x07,
8754 // Message Data
8755 'm', 'e', 's', 's', 'a', 'g', 'e',
8756 // frame type (message frame no length)
8757 0x20,
8758 // Message Data
8759 'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8760 };
8761
8762 unsigned char packet46[] = {
8763 // type (short header, 4 byte packet number)
8764 0x43,
8765 // connection_id
8766 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8767 // packet number
8768 0x12, 0x34, 0x56, 0x78,
8769
8770 // frame type (message frame)
8771 0x21,
8772 // Length
8773 0x07,
8774 // Message Data
8775 'm', 'e', 's', 's', 'a', 'g', 'e',
8776 // frame type (message frame no length)
8777 0x20,
8778 // Message Data
8779 'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8780 };
8781
8782 unsigned char packet99[] = {
8783 // type (short header, 4 byte packet number)
8784 0x43,
8785 // connection_id
8786 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8787 // packet number
8788 0x12, 0x34, 0x56, 0x78,
8789
8790 // frame type (IETF_MESSAGE frame)
8791 0x21,
8792 // Length
8793 0x07,
8794 // Message Data
8795 'm', 'e', 's', 's', 'a', 'g', 'e',
8796 // frame type (message frame no length)
8797 0x20,
8798 // Message Data
8799 'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8800 };
8801 // clang-format on
8802
8803 unsigned char* p = packet45;
8804 if (framer_.transport_version() == QUIC_VERSION_99) {
8805 p = packet99;
8806 } else if (framer_.transport_version() > QUIC_VERSION_44) {
8807 p = packet46;
8808 }
8809
8810 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8811 ASSERT_TRUE(data != nullptr);
8812
8813 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8814 data->length(), AsChars(p),
8815 QUIC_ARRAYSIZE(packet45));
8816}
8817
8818// Test that the connectivity probing packet is serialized correctly as a
8819// padded PING packet.
8820TEST_P(QuicFramerTest, BuildConnectivityProbingPacket) {
8821 QuicPacketHeader header;
8822 header.destination_connection_id = FramerTestConnectionId();
8823 header.reset_flag = false;
8824 header.version_flag = false;
8825 header.packet_number = kPacketNumber;
8826
8827 // clang-format off
8828 unsigned char packet[] = {
8829 // public flags (8 byte connection_id)
8830 0x28,
8831 // connection_id
8832 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8833 // packet number
8834 0x12, 0x34, 0x56, 0x78,
8835
8836 // frame type (ping frame)
8837 0x07,
8838 // frame type (padding frame)
8839 0x00,
8840 0x00, 0x00, 0x00, 0x00
8841 };
8842
8843 unsigned char packet44[] = {
8844 // type (short header, 4 byte packet number)
8845 0x32,
8846 // connection_id
8847 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8848 // packet number
8849 0x12, 0x34, 0x56, 0x78,
8850
8851 // frame type
8852 0x07,
8853 // frame type (padding frame)
8854 0x00,
8855 0x00, 0x00, 0x00, 0x00
8856 };
8857
8858 unsigned char packet46[] = {
8859 // type (short header, 4 byte packet number)
8860 0x43,
8861 // connection_id
8862 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8863 // packet number
8864 0x12, 0x34, 0x56, 0x78,
8865
8866 // frame type
8867 0x07,
8868 // frame type (padding frame)
8869 0x00,
8870 0x00, 0x00, 0x00, 0x00
8871 };
8872
8873 unsigned char packet99[] = {
8874 // type (short header, 4 byte packet number)
8875 0x43,
8876 // connection_id
8877 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8878 // packet number
8879 0x12, 0x34, 0x56, 0x78,
8880
8881 // frame type (IETF_PING frame)
8882 0x01,
8883 // frame type (padding frame)
8884 0x00,
8885 0x00, 0x00, 0x00, 0x00
8886 };
8887 // clang-format on
8888
8889 unsigned char* p = packet;
8890 size_t packet_size = QUIC_ARRAYSIZE(packet);
8891 if (framer_.transport_version() == QUIC_VERSION_99) {
8892 p = packet99;
8893 packet_size = QUIC_ARRAYSIZE(packet99);
8894 } else if (framer_.transport_version() > QUIC_VERSION_44) {
8895 p = packet46;
8896 packet_size = QUIC_ARRAYSIZE(packet46);
8897 } else if (framer_.transport_version() > QUIC_VERSION_43) {
8898 p = packet44;
8899 packet_size = QUIC_ARRAYSIZE(packet44);
8900 }
8901
dschinazi66dea072019-04-09 11:41:06 -07008902 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008903
8904 size_t length = framer_.BuildConnectivityProbingPacket(
QUICHE team6987b4a2019-03-15 16:23:04 -07008905 header, buffer.get(), packet_size, ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008906
8907 EXPECT_NE(0u, length);
8908 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
8909 header);
8910
8911 test::CompareCharArraysWithHexError("constructed packet", data.data(),
8912 data.length(), AsChars(p), packet_size);
8913}
8914
8915// Test that the path challenge connectivity probing packet is serialized
8916// correctly as a padded PATH CHALLENGE packet.
8917TEST_P(QuicFramerTest, BuildPaddedPathChallengePacket) {
8918 if (framer_.transport_version() != QUIC_VERSION_99) {
8919 return;
8920 }
8921
8922 QuicPacketHeader header;
8923 header.destination_connection_id = FramerTestConnectionId();
8924 header.reset_flag = false;
8925 header.version_flag = false;
8926 header.packet_number = kPacketNumber;
8927 QuicPathFrameBuffer payload;
8928
8929 // clang-format off
8930 unsigned char packet[] = {
8931 // type (short header, 4 byte packet number)
8932 0x43,
8933 // connection_id
8934 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8935 // packet number
8936 0x12, 0x34, 0x56, 0x78,
8937
8938 // Path Challenge Frame type (IETF_PATH_CHALLENGE)
8939 0x1a,
8940 // 8 "random" bytes, MockRandom makes lots of r's
8941 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r',
8942 // frame type (padding frame)
8943 0x00,
8944 0x00, 0x00, 0x00, 0x00
8945 };
8946 // clang-format on
8947
dschinazi66dea072019-04-09 11:41:06 -07008948 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008949 MockRandom randomizer;
8950
8951 size_t length = framer_.BuildPaddedPathChallengePacket(
8952 header, buffer.get(), QUIC_ARRAYSIZE(packet), &payload, &randomizer,
QUICHE team6987b4a2019-03-15 16:23:04 -07008953 ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008954 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
8955
8956 // Payload has the random bytes that were generated. Copy them into packet,
8957 // above, before checking that the generated packet is correct.
8958 EXPECT_EQ(kQuicPathFrameBufferSize, payload.size());
8959
8960 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
8961 header);
8962
8963 test::CompareCharArraysWithHexError("constructed packet", data.data(),
8964 data.length(), AsChars(packet),
8965 QUIC_ARRAYSIZE(packet));
8966}
8967
8968// Several tests that the path response connectivity probing packet is
8969// serialized correctly as either a padded and unpadded PATH RESPONSE
8970// packet. Also generates packets with 1 and 3 PATH_RESPONSES in them to
8971// exercised the single- and multiple- payload cases.
8972TEST_P(QuicFramerTest, BuildPathResponsePacket1ResponseUnpadded) {
8973 if (framer_.transport_version() != QUIC_VERSION_99) {
8974 return;
8975 }
8976
8977 QuicPacketHeader header;
8978 header.destination_connection_id = FramerTestConnectionId();
8979 header.reset_flag = false;
8980 header.version_flag = false;
8981 header.packet_number = kPacketNumber;
8982 QuicPathFrameBuffer payload0 = {
8983 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
8984
8985 // Build 1 PATH RESPONSE, not padded
8986 // clang-format off
8987 unsigned char packet[] = {
8988 // type (short header, 4 byte packet number)
8989 0x43,
8990 // connection_id
8991 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8992 // packet number
8993 0x12, 0x34, 0x56, 0x78,
8994
8995 // Path Response Frame type (IETF_PATH_RESPONSE)
8996 0x1b,
8997 // 8 "random" bytes
8998 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
8999 };
9000 // clang-format on
dschinazi66dea072019-04-09 11:41:06 -07009001 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009002 QuicDeque<QuicPathFrameBuffer> payloads;
9003 payloads.push_back(payload0);
9004 size_t length = framer_.BuildPathResponsePacket(
9005 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
QUICHE team6987b4a2019-03-15 16:23:04 -07009006 /*is_padded=*/false, ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009007 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
9008 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
9009 header);
9010
9011 test::CompareCharArraysWithHexError("constructed packet", data.data(),
9012 data.length(), AsChars(packet),
9013 QUIC_ARRAYSIZE(packet));
9014}
9015
9016TEST_P(QuicFramerTest, BuildPathResponsePacket1ResponsePadded) {
9017 if (framer_.transport_version() != QUIC_VERSION_99) {
9018 return;
9019 }
9020
9021 QuicPacketHeader header;
9022 header.destination_connection_id = FramerTestConnectionId();
9023 header.reset_flag = false;
9024 header.version_flag = false;
9025 header.packet_number = kPacketNumber;
9026 QuicPathFrameBuffer payload0 = {
9027 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
9028
9029 // Build 1 PATH RESPONSE, padded
9030 // clang-format off
9031 unsigned char packet[] = {
9032 // type (short header, 4 byte packet number)
9033 0x43,
9034 // connection_id
9035 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9036 // packet number
9037 0x12, 0x34, 0x56, 0x78,
9038
9039 // Path Response Frame type (IETF_PATH_RESPONSE)
9040 0x1b,
9041 // 8 "random" bytes
9042 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
9043 // Padding type and pad
9044 0x00, 0x00, 0x00, 0x00, 0x00
9045 };
9046 // clang-format on
dschinazi66dea072019-04-09 11:41:06 -07009047 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009048 QuicDeque<QuicPathFrameBuffer> payloads;
9049 payloads.push_back(payload0);
9050 size_t length = framer_.BuildPathResponsePacket(
9051 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
QUICHE team6987b4a2019-03-15 16:23:04 -07009052 /*is_padded=*/true, ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009053 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
9054 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
9055 header);
9056
9057 test::CompareCharArraysWithHexError("constructed packet", data.data(),
9058 data.length(), AsChars(packet),
9059 QUIC_ARRAYSIZE(packet));
9060}
9061
9062TEST_P(QuicFramerTest, BuildPathResponsePacket3ResponsesUnpadded) {
9063 if (framer_.transport_version() != QUIC_VERSION_99) {
9064 return;
9065 }
9066
9067 QuicPacketHeader header;
9068 header.destination_connection_id = FramerTestConnectionId();
9069 header.reset_flag = false;
9070 header.version_flag = false;
9071 header.packet_number = kPacketNumber;
9072 QuicPathFrameBuffer payload0 = {
9073 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
9074 QuicPathFrameBuffer payload1 = {
9075 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
9076 QuicPathFrameBuffer payload2 = {
9077 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
9078
9079 // Build one packet with 3 PATH RESPONSES, no padding
9080 // clang-format off
9081 unsigned char packet[] = {
9082 // type (short header, 4 byte packet number)
9083 0x43,
9084 // connection_id
9085 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9086 // packet number
9087 0x12, 0x34, 0x56, 0x78,
9088
9089 // 3 path response frames (IETF_PATH_RESPONSE type byte and payload)
9090 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
9091 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
9092 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
9093 };
9094 // clang-format on
9095
dschinazi66dea072019-04-09 11:41:06 -07009096 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009097 QuicDeque<QuicPathFrameBuffer> payloads;
9098 payloads.push_back(payload0);
9099 payloads.push_back(payload1);
9100 payloads.push_back(payload2);
9101 size_t length = framer_.BuildPathResponsePacket(
9102 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
QUICHE team6987b4a2019-03-15 16:23:04 -07009103 /*is_padded=*/false, ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009104 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
9105 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
9106 header);
9107
9108 test::CompareCharArraysWithHexError("constructed packet", data.data(),
9109 data.length(), AsChars(packet),
9110 QUIC_ARRAYSIZE(packet));
9111}
9112
9113TEST_P(QuicFramerTest, BuildPathResponsePacket3ResponsesPadded) {
9114 if (framer_.transport_version() != QUIC_VERSION_99) {
9115 return;
9116 }
9117
9118 QuicPacketHeader header;
9119 header.destination_connection_id = FramerTestConnectionId();
9120 header.reset_flag = false;
9121 header.version_flag = false;
9122 header.packet_number = kPacketNumber;
9123 QuicPathFrameBuffer payload0 = {
9124 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
9125 QuicPathFrameBuffer payload1 = {
9126 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
9127 QuicPathFrameBuffer payload2 = {
9128 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
9129
9130 // Build one packet with 3 PATH RESPONSES, with padding
9131 // clang-format off
9132 unsigned char packet[] = {
9133 // type (short header, 4 byte packet number)
9134 0x43,
9135 // connection_id
9136 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9137 // packet number
9138 0x12, 0x34, 0x56, 0x78,
9139
9140 // 3 path response frames (IETF_PATH_RESPONSE byte and payload)
9141 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
9142 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
9143 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
9144 // Padding
9145 0x00, 0x00, 0x00, 0x00, 0x00
9146 };
9147 // clang-format on
9148
dschinazi66dea072019-04-09 11:41:06 -07009149 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009150 QuicDeque<QuicPathFrameBuffer> payloads;
9151 payloads.push_back(payload0);
9152 payloads.push_back(payload1);
9153 payloads.push_back(payload2);
9154 size_t length = framer_.BuildPathResponsePacket(
9155 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
QUICHE team6987b4a2019-03-15 16:23:04 -07009156 /*is_padded=*/true, ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009157 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
9158 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
9159 header);
9160
9161 test::CompareCharArraysWithHexError("constructed packet", data.data(),
9162 data.length(), AsChars(packet),
9163 QUIC_ARRAYSIZE(packet));
9164}
9165
9166// Test that the MTU discovery packet is serialized correctly as a PING packet.
9167TEST_P(QuicFramerTest, BuildMtuDiscoveryPacket) {
9168 QuicPacketHeader header;
9169 header.destination_connection_id = FramerTestConnectionId();
9170 header.reset_flag = false;
9171 header.version_flag = false;
9172 header.packet_number = kPacketNumber;
9173
9174 QuicFrames frames = {QuicFrame(QuicMtuDiscoveryFrame())};
9175
9176 // clang-format off
9177 unsigned char packet[] = {
9178 // public flags (8 byte connection_id)
9179 0x28,
9180 // connection_id
9181 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9182 // packet number
9183 0x12, 0x34, 0x56, 0x78,
9184
9185 // frame type (ping frame)
9186 0x07,
9187 };
9188
9189 unsigned char packet44[] = {
9190 // type (short header, 4 byte packet number)
9191 0x32,
9192 // connection_id
9193 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9194 // packet number
9195 0x12, 0x34, 0x56, 0x78,
9196
9197 // frame type
9198 0x07,
9199 };
9200
9201 unsigned char packet46[] = {
9202 // type (short header, 4 byte packet number)
9203 0x43,
9204 // connection_id
9205 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9206 // packet number
9207 0x12, 0x34, 0x56, 0x78,
9208
9209 // frame type
9210 0x07,
9211 };
9212
9213 unsigned char packet99[] = {
9214 // type (short header, 4 byte packet number)
9215 0x43,
9216 // connection_id
9217 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9218 // packet number
9219 0x12, 0x34, 0x56, 0x78,
9220
9221 // frame type (IETF_PING frame)
9222 0x01,
9223 };
9224 // clang-format on
9225
9226 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9227 ASSERT_TRUE(data != nullptr);
9228
9229 unsigned char* p = packet;
9230 if (framer_.transport_version() == QUIC_VERSION_99) {
9231 p = packet99;
9232 } else if (framer_.transport_version() > QUIC_VERSION_44) {
9233 p = packet46;
9234 } else if (framer_.transport_version() > QUIC_VERSION_43) {
9235 p = packet44;
9236 }
9237
9238 test::CompareCharArraysWithHexError(
9239 "constructed packet", data->data(), data->length(), AsChars(p),
9240 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44)
9241 : QUIC_ARRAYSIZE(packet));
9242}
9243
9244TEST_P(QuicFramerTest, BuildPublicResetPacket) {
9245 QuicPublicResetPacket reset_packet;
9246 reset_packet.connection_id = FramerTestConnectionId();
9247 reset_packet.nonce_proof = kNonceProof;
9248
9249 // clang-format off
9250 unsigned char packet[] = {
9251 // public flags (public reset, 8 byte ConnectionId)
9252 0x0E,
9253 // connection_id
9254 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9255 // message tag (kPRST)
9256 'P', 'R', 'S', 'T',
9257 // num_entries (1) + padding
9258 0x01, 0x00, 0x00, 0x00,
9259 // tag kRNON
9260 'R', 'N', 'O', 'N',
9261 // end offset 8
9262 0x08, 0x00, 0x00, 0x00,
9263 // nonce proof
9264 0x89, 0x67, 0x45, 0x23,
9265 0x01, 0xEF, 0xCD, 0xAB,
9266 };
9267 // clang-format on
9268
9269 if (framer_.transport_version() > QUIC_VERSION_43) {
9270 return;
9271 }
9272
9273 std::unique_ptr<QuicEncryptedPacket> data(
9274 framer_.BuildPublicResetPacket(reset_packet));
9275 ASSERT_TRUE(data != nullptr);
9276 test::CompareCharArraysWithHexError("constructed packet", data->data(),
9277 data->length(), AsChars(packet),
9278 QUIC_ARRAYSIZE(packet));
9279}
9280
9281TEST_P(QuicFramerTest, BuildPublicResetPacketWithClientAddress) {
9282 QuicPublicResetPacket reset_packet;
9283 reset_packet.connection_id = FramerTestConnectionId();
9284 reset_packet.nonce_proof = kNonceProof;
9285 reset_packet.client_address =
9286 QuicSocketAddress(QuicIpAddress::Loopback4(), 0x1234);
9287
9288 // clang-format off
9289 unsigned char packet[] = {
9290 // public flags (public reset, 8 byte ConnectionId)
9291 0x0E,
9292 // connection_id
9293 0xFE, 0xDC, 0xBA, 0x98,
9294 0x76, 0x54, 0x32, 0x10,
9295 // message tag (kPRST)
9296 'P', 'R', 'S', 'T',
9297 // num_entries (2) + padding
9298 0x02, 0x00, 0x00, 0x00,
9299 // tag kRNON
9300 'R', 'N', 'O', 'N',
9301 // end offset 8
9302 0x08, 0x00, 0x00, 0x00,
9303 // tag kCADR
9304 'C', 'A', 'D', 'R',
9305 // end offset 16
9306 0x10, 0x00, 0x00, 0x00,
9307 // nonce proof
9308 0x89, 0x67, 0x45, 0x23,
9309 0x01, 0xEF, 0xCD, 0xAB,
9310 // client address
9311 0x02, 0x00,
9312 0x7F, 0x00, 0x00, 0x01,
9313 0x34, 0x12,
9314 };
9315 // clang-format on
9316
9317 if (framer_.transport_version() > QUIC_VERSION_43) {
9318 return;
9319 }
9320
9321 std::unique_ptr<QuicEncryptedPacket> data(
9322 framer_.BuildPublicResetPacket(reset_packet));
9323 ASSERT_TRUE(data != nullptr);
9324
9325 test::CompareCharArraysWithHexError("constructed packet", data->data(),
9326 data->length(), AsChars(packet),
9327 QUIC_ARRAYSIZE(packet));
9328}
9329
9330TEST_P(QuicFramerTest, BuildPublicResetPacketWithEndpointId) {
9331 QuicPublicResetPacket reset_packet;
9332 reset_packet.connection_id = FramerTestConnectionId();
9333 reset_packet.nonce_proof = kNonceProof;
9334 reset_packet.endpoint_id = "FakeServerId";
9335
9336 // The tag value map in CryptoHandshakeMessage is a std::map, so the two tags
9337 // in the packet, kRNON and kEPID, have unspecified ordering w.r.t each other.
9338 // clang-format off
9339 unsigned char packet_variant1[] = {
9340 // public flags (public reset, 8 byte ConnectionId)
9341 0x0E,
9342 // connection_id
9343 0xFE, 0xDC, 0xBA, 0x98,
9344 0x76, 0x54, 0x32, 0x10,
9345 // message tag (kPRST)
9346 'P', 'R', 'S', 'T',
9347 // num_entries (2) + padding
9348 0x02, 0x00, 0x00, 0x00,
9349 // tag kRNON
9350 'R', 'N', 'O', 'N',
9351 // end offset 8
9352 0x08, 0x00, 0x00, 0x00,
9353 // tag kEPID
9354 'E', 'P', 'I', 'D',
9355 // end offset 20
9356 0x14, 0x00, 0x00, 0x00,
9357 // nonce proof
9358 0x89, 0x67, 0x45, 0x23,
9359 0x01, 0xEF, 0xCD, 0xAB,
9360 // Endpoint ID
9361 'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
9362 };
9363 unsigned char packet_variant2[] = {
9364 // public flags (public reset, 8 byte ConnectionId)
9365 0x0E,
9366 // connection_id
9367 0xFE, 0xDC, 0xBA, 0x98,
9368 0x76, 0x54, 0x32, 0x10,
9369 // message tag (kPRST)
9370 'P', 'R', 'S', 'T',
9371 // num_entries (2) + padding
9372 0x02, 0x00, 0x00, 0x00,
9373 // tag kEPID
9374 'E', 'P', 'I', 'D',
9375 // end offset 12
9376 0x0C, 0x00, 0x00, 0x00,
9377 // tag kRNON
9378 'R', 'N', 'O', 'N',
9379 // end offset 20
9380 0x14, 0x00, 0x00, 0x00,
9381 // Endpoint ID
9382 'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
9383 // nonce proof
9384 0x89, 0x67, 0x45, 0x23,
9385 0x01, 0xEF, 0xCD, 0xAB,
9386 };
9387 // clang-format on
9388
9389 if (framer_.transport_version() > QUIC_VERSION_43) {
9390 return;
9391 }
9392
9393 std::unique_ptr<QuicEncryptedPacket> data(
9394 framer_.BuildPublicResetPacket(reset_packet));
9395 ASSERT_TRUE(data != nullptr);
9396
9397 // Variant 1 ends with char 'd'. Variant 1 ends with char 0xAB.
9398 if ('d' == data->data()[data->length() - 1]) {
9399 test::CompareCharArraysWithHexError(
9400 "constructed packet", data->data(), data->length(),
9401 AsChars(packet_variant1), QUIC_ARRAYSIZE(packet_variant1));
9402 } else {
9403 test::CompareCharArraysWithHexError(
9404 "constructed packet", data->data(), data->length(),
9405 AsChars(packet_variant2), QUIC_ARRAYSIZE(packet_variant2));
9406 }
9407}
9408
9409TEST_P(QuicFramerTest, BuildIetfStatelessResetPacket) {
9410 // clang-format off
9411 unsigned char packet44[] = {
9412 // type (short header, 1 byte packet number)
9413 0x70,
9414 // random packet number
9415 0xFE,
9416 // stateless reset token
9417 0xB5, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
9418 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9419 };
9420 // clang-format on
9421
9422 std::unique_ptr<QuicEncryptedPacket> data(
9423 framer_.BuildIetfStatelessResetPacket(FramerTestConnectionId(),
9424 kTestStatelessResetToken));
9425 ASSERT_TRUE(data != nullptr);
9426 // Skip packet number byte which is random in stateless reset packet.
9427 test::CompareCharArraysWithHexError("constructed packet", data->data(), 1,
9428 AsChars(packet44), 1);
9429 const size_t random_bytes_length =
9430 data->length() - kPacketHeaderTypeSize - sizeof(kTestStatelessResetToken);
9431 EXPECT_EQ(kMinRandomBytesLengthInStatelessReset, random_bytes_length);
9432 // Verify stateless reset token is correct.
9433 test::CompareCharArraysWithHexError(
9434 "constructed packet",
9435 data->data() + data->length() - sizeof(kTestStatelessResetToken),
9436 sizeof(kTestStatelessResetToken),
9437 AsChars(packet44) + QUIC_ARRAYSIZE(packet44) -
9438 sizeof(kTestStatelessResetToken),
9439 sizeof(kTestStatelessResetToken));
9440}
9441
9442TEST_P(QuicFramerTest, EncryptPacket) {
9443 QuicPacketNumber packet_number = kPacketNumber;
9444 // clang-format off
9445 unsigned char packet[] = {
9446 // public flags (8 byte connection_id)
9447 0x28,
9448 // connection_id
9449 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9450 // packet number
9451 0x12, 0x34, 0x56, 0x78,
9452
9453 // redundancy
9454 'a', 'b', 'c', 'd',
9455 'e', 'f', 'g', 'h',
9456 'i', 'j', 'k', 'l',
9457 'm', 'n', 'o', 'p',
9458 };
9459
9460 unsigned char packet44[] = {
9461 // type (short header, 4 byte packet number)
9462 0x32,
9463 // connection_id
9464 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9465 // packet number
9466 0x12, 0x34, 0x56, 0x78,
9467
9468 // redundancy
9469 'a', 'b', 'c', 'd',
9470 'e', 'f', 'g', 'h',
9471 'i', 'j', 'k', 'l',
9472 'm', 'n', 'o', 'p',
9473 };
9474
9475 unsigned char packet46[] = {
9476 // type (short header, 4 byte packet number)
9477 0x43,
9478 // connection_id
9479 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9480 // packet number
9481 0x12, 0x34, 0x56, 0x78,
9482
9483 // redundancy
9484 'a', 'b', 'c', 'd',
9485 'e', 'f', 'g', 'h',
9486 'i', 'j', 'k', 'l',
9487 'm', 'n', 'o', 'p',
9488 };
9489
9490 unsigned char packet99[] = {
9491 // type (short header, 4 byte packet number)
9492 0x43,
9493 // connection_id
9494 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9495 // packet number
9496 0x12, 0x34, 0x56, 0x78,
9497
9498 // redundancy
9499 'a', 'b', 'c', 'd',
9500 'e', 'f', 'g', 'h',
9501 'i', 'j', 'k', 'l',
9502 'm', 'n', 'o', 'p',
nharper55fa6132019-05-07 19:37:21 -07009503 'q', 'r', 's', 't',
QUICHE teama6ef0a62019-03-07 20:34:33 -05009504 };
9505 // clang-format on
9506
9507 unsigned char* p = packet;
nharper55fa6132019-05-07 19:37:21 -07009508 size_t p_size = QUIC_ARRAYSIZE(packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009509 if (framer_.transport_version() == QUIC_VERSION_99) {
9510 p = packet99;
nharper55fa6132019-05-07 19:37:21 -07009511 p_size = QUIC_ARRAYSIZE(packet99);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009512 } else if (framer_.transport_version() > QUIC_VERSION_44) {
9513 p = packet46;
9514 } else if (framer_.transport_version() > QUIC_VERSION_43) {
9515 p = packet44;
9516 }
9517
9518 std::unique_ptr<QuicPacket> raw(new QuicPacket(
nharper55fa6132019-05-07 19:37:21 -07009519 AsChars(p), p_size, false, PACKET_8BYTE_CONNECTION_ID,
QUICHE teama6ef0a62019-03-07 20:34:33 -05009520 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
9521 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
9522 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0));
dschinazi66dea072019-04-09 11:41:06 -07009523 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009524 size_t encrypted_length = framer_.EncryptPayload(
dschinazi66dea072019-04-09 11:41:06 -07009525 ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009526
9527 ASSERT_NE(0u, encrypted_length);
9528 EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
9529}
9530
9531TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) {
nharper55fa6132019-05-07 19:37:21 -07009532 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009533 QuicPacketNumber packet_number = kPacketNumber;
9534 // clang-format off
9535 unsigned char packet[] = {
9536 // public flags (version, 8 byte connection_id)
9537 0x29,
9538 // connection_id
9539 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9540 // version tag
9541 'Q', '.', '1', '0',
9542 // packet number
9543 0x12, 0x34, 0x56, 0x78,
9544
9545 // redundancy
9546 'a', 'b', 'c', 'd',
9547 'e', 'f', 'g', 'h',
9548 'i', 'j', 'k', 'l',
9549 'm', 'n', 'o', 'p',
9550 };
9551
9552 unsigned char packet44[] = {
9553 // type (long header with packet type ZERO_RTT_PROTECTED)
9554 0xFC,
9555 // version tag
9556 'Q', '.', '1', '0',
9557 // connection_id length
9558 0x50,
9559 // connection_id
9560 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9561 // packet number
9562 0x12, 0x34, 0x56, 0x78,
9563
9564 // redundancy
9565 'a', 'b', 'c', 'd',
9566 'e', 'f', 'g', 'h',
9567 'i', 'j', 'k', 'l',
9568 'm', 'n', 'o', 'p',
9569 };
9570
9571 unsigned char packet46[] = {
9572 // type (long header with packet type ZERO_RTT_PROTECTED)
9573 0xD3,
9574 // version tag
9575 'Q', '.', '1', '0',
9576 // connection_id length
9577 0x50,
9578 // connection_id
9579 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9580 // packet number
9581 0x12, 0x34, 0x56, 0x78,
9582
9583 // redundancy
9584 'a', 'b', 'c', 'd',
9585 'e', 'f', 'g', 'h',
9586 'i', 'j', 'k', 'l',
9587 'm', 'n', 'o', 'p',
9588 };
9589
9590 unsigned char packet99[] = {
9591 // type (long header with packet type ZERO_RTT_PROTECTED)
9592 0xD3,
9593 // version tag
9594 'Q', '.', '1', '0',
9595 // connection_id length
9596 0x50,
9597 // connection_id
9598 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9599 // packet number
9600 0x12, 0x34, 0x56, 0x78,
9601
9602 // redundancy
9603 'a', 'b', 'c', 'd',
9604 'e', 'f', 'g', 'h',
9605 'i', 'j', 'k', 'l',
9606 'm', 'n', 'o', 'p',
nharper55fa6132019-05-07 19:37:21 -07009607 'q', 'r', 's', 't',
QUICHE teama6ef0a62019-03-07 20:34:33 -05009608 };
9609 // clang-format on
9610
9611 unsigned char* p = packet;
nharper55fa6132019-05-07 19:37:21 -07009612 size_t p_size = QUIC_ARRAYSIZE(packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009613 if (framer_.transport_version() == QUIC_VERSION_99) {
9614 p = packet99;
nharper55fa6132019-05-07 19:37:21 -07009615 p_size = QUIC_ARRAYSIZE(packet99);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009616 } else if (framer_.transport_version() > QUIC_VERSION_44) {
9617 p = packet46;
nharper55fa6132019-05-07 19:37:21 -07009618 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009619 } else if (framer_.transport_version() > QUIC_VERSION_43) {
9620 p = packet44;
nharper55fa6132019-05-07 19:37:21 -07009621 p_size = QUIC_ARRAYSIZE(packet44);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009622 }
9623
9624 std::unique_ptr<QuicPacket> raw(new QuicPacket(
nharper55fa6132019-05-07 19:37:21 -07009625 AsChars(p), p_size, false, PACKET_8BYTE_CONNECTION_ID,
9626 PACKET_0BYTE_CONNECTION_ID, kIncludeVersion,
9627 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
9628 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0));
dschinazi66dea072019-04-09 11:41:06 -07009629 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009630 size_t encrypted_length = framer_.EncryptPayload(
dschinazi66dea072019-04-09 11:41:06 -07009631 ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009632
9633 ASSERT_NE(0u, encrypted_length);
9634 EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
9635}
9636
9637TEST_P(QuicFramerTest, AckTruncationLargePacket) {
9638 if (framer_.transport_version() == QUIC_VERSION_99) {
9639 // This test is not applicable to this version; the range count is
9640 // effectively unlimited
9641 return;
9642 }
nharper9bb83462019-05-01 10:53:22 -07009643 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009644
9645 QuicPacketHeader header;
9646 header.destination_connection_id = FramerTestConnectionId();
9647 header.reset_flag = false;
9648 header.version_flag = false;
9649 header.packet_number = kPacketNumber;
9650
9651 QuicAckFrame ack_frame;
9652 // Create a packet with just the ack.
9653 ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
9654 QuicFrames frames = {QuicFrame(&ack_frame)};
9655
9656 // Build an ack packet with truncation due to limit in number of nack ranges.
9657 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9658 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
9659 ASSERT_TRUE(raw_ack_packet != nullptr);
dschinazi66dea072019-04-09 11:41:06 -07009660 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009661 size_t encrypted_length =
QUICHE team6987b4a2019-03-15 16:23:04 -07009662 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
dschinazi66dea072019-04-09 11:41:06 -07009663 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009664 ASSERT_NE(0u, encrypted_length);
9665 // Now make sure we can turn our ack packet back into an ack frame.
9666 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
9667 ASSERT_TRUE(framer_.ProcessPacket(
9668 QuicEncryptedPacket(buffer, encrypted_length, false)));
9669 ASSERT_EQ(1u, visitor_.ack_frames_.size());
9670 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
9671 EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
9672 ASSERT_EQ(256u, processed_ack_frame.packets.NumPacketsSlow());
9673 EXPECT_EQ(QuicPacketNumber(90u), processed_ack_frame.packets.Min());
9674 EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
9675}
9676
9677TEST_P(QuicFramerTest, AckTruncationSmallPacket) {
9678 if (framer_.transport_version() == QUIC_VERSION_99) {
9679 // This test is not applicable to this version; the range count is
9680 // effectively unlimited
9681 return;
9682 }
nharper9bb83462019-05-01 10:53:22 -07009683 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009684
9685 QuicPacketHeader header;
9686 header.destination_connection_id = FramerTestConnectionId();
9687 header.reset_flag = false;
9688 header.version_flag = false;
9689 header.packet_number = kPacketNumber;
9690
9691 // Create a packet with just the ack.
9692 QuicAckFrame ack_frame;
9693 ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
9694 QuicFrames frames = {QuicFrame(&ack_frame)};
9695
9696 // Build an ack packet with truncation due to limit in number of nack ranges.
9697 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9698 std::unique_ptr<QuicPacket> raw_ack_packet(
9699 BuildDataPacket(header, frames, 500));
9700 ASSERT_TRUE(raw_ack_packet != nullptr);
dschinazi66dea072019-04-09 11:41:06 -07009701 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009702 size_t encrypted_length =
QUICHE team6987b4a2019-03-15 16:23:04 -07009703 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
dschinazi66dea072019-04-09 11:41:06 -07009704 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009705 ASSERT_NE(0u, encrypted_length);
9706 // Now make sure we can turn our ack packet back into an ack frame.
9707 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
9708 ASSERT_TRUE(framer_.ProcessPacket(
9709 QuicEncryptedPacket(buffer, encrypted_length, false)));
9710 ASSERT_EQ(1u, visitor_.ack_frames_.size());
9711 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
9712 EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
9713 ASSERT_EQ(240u, processed_ack_frame.packets.NumPacketsSlow());
9714 EXPECT_EQ(QuicPacketNumber(122u), processed_ack_frame.packets.Min());
9715 EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
9716}
9717
9718TEST_P(QuicFramerTest, CleanTruncation) {
9719 if (framer_.transport_version() == QUIC_VERSION_99) {
9720 // This test is not applicable to this version; the range count is
9721 // effectively unlimited
9722 return;
9723 }
nharper9bb83462019-05-01 10:53:22 -07009724 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009725
9726 QuicPacketHeader header;
9727 header.destination_connection_id = FramerTestConnectionId();
9728 header.reset_flag = false;
9729 header.version_flag = false;
9730 header.packet_number = kPacketNumber;
9731
9732 QuicAckFrame ack_frame = InitAckFrame(201);
9733
9734 // Create a packet with just the ack.
9735 QuicFrames frames = {QuicFrame(&ack_frame)};
9736 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9737 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
9738 ASSERT_TRUE(raw_ack_packet != nullptr);
9739
dschinazi66dea072019-04-09 11:41:06 -07009740 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009741 size_t encrypted_length =
QUICHE team6987b4a2019-03-15 16:23:04 -07009742 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
dschinazi66dea072019-04-09 11:41:06 -07009743 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009744 ASSERT_NE(0u, encrypted_length);
9745
9746 // Now make sure we can turn our ack packet back into an ack frame.
9747 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
9748 ASSERT_TRUE(framer_.ProcessPacket(
9749 QuicEncryptedPacket(buffer, encrypted_length, false)));
9750
9751 // Test for clean truncation of the ack by comparing the length of the
9752 // original packets to the re-serialized packets.
9753 frames.clear();
9754 frames.push_back(QuicFrame(visitor_.ack_frames_[0].get()));
9755
9756 size_t original_raw_length = raw_ack_packet->length();
9757 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9758 raw_ack_packet = BuildDataPacket(header, frames);
9759 ASSERT_TRUE(raw_ack_packet != nullptr);
9760 EXPECT_EQ(original_raw_length, raw_ack_packet->length());
9761 ASSERT_TRUE(raw_ack_packet != nullptr);
9762}
9763
9764TEST_P(QuicFramerTest, StopPacketProcessing) {
zhongyi546cc452019-04-12 15:27:49 -07009765 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009766 // clang-format off
9767 unsigned char packet[] = {
9768 // public flags (8 byte connection_id)
9769 0x28,
9770 // connection_id
9771 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9772 // packet number
9773 0x12, 0x34, 0x56, 0x78,
9774
9775 // frame type (stream frame with fin)
9776 0xFF,
9777 // stream id
9778 0x01, 0x02, 0x03, 0x04,
9779 // offset
9780 0x3A, 0x98, 0xFE, 0xDC,
9781 0x32, 0x10, 0x76, 0x54,
9782 // data length
9783 0x00, 0x0c,
9784 // data
9785 'h', 'e', 'l', 'l',
9786 'o', ' ', 'w', 'o',
9787 'r', 'l', 'd', '!',
9788
9789 // frame type (ack frame)
9790 0x40,
9791 // least packet number awaiting an ack
9792 0x12, 0x34, 0x56, 0x78,
9793 0x9A, 0xA0,
9794 // largest observed packet number
9795 0x12, 0x34, 0x56, 0x78,
9796 0x9A, 0xBF,
9797 // num missing packets
9798 0x01,
9799 // missing packet
9800 0x12, 0x34, 0x56, 0x78,
9801 0x9A, 0xBE,
9802 };
9803
9804 unsigned char packet44[] = {
9805 // type (short header, 4 byte packet number)
9806 0x32,
9807 // connection_id
9808 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9809 // packet number
9810 0x12, 0x34, 0x56, 0x78,
9811
9812 // frame type (stream frame with fin)
9813 0xFF,
9814 // stream id
9815 0x01, 0x02, 0x03, 0x04,
9816 // offset
9817 0x3A, 0x98, 0xFE, 0xDC,
9818 0x32, 0x10, 0x76, 0x54,
9819 // data length
9820 0x00, 0x0c,
9821 // data
9822 'h', 'e', 'l', 'l',
9823 'o', ' ', 'w', 'o',
9824 'r', 'l', 'd', '!',
9825
9826 // frame type (ack frame)
9827 0x40,
9828 // least packet number awaiting an ack
9829 0x12, 0x34, 0x56, 0x78,
9830 0x9A, 0xA0,
9831 // largest observed packet number
9832 0x12, 0x34, 0x56, 0x78,
9833 0x9A, 0xBF,
9834 // num missing packets
9835 0x01,
9836 // missing packet
9837 0x12, 0x34, 0x56, 0x78,
9838 0x9A, 0xBE,
9839 };
9840
9841 unsigned char packet46[] = {
9842 // type (short header, 4 byte packet number)
9843 0x43,
9844 // connection_id
9845 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9846 // packet number
9847 0x12, 0x34, 0x56, 0x78,
9848
9849 // frame type (stream frame with fin)
9850 0xFF,
9851 // stream id
9852 0x01, 0x02, 0x03, 0x04,
9853 // offset
9854 0x3A, 0x98, 0xFE, 0xDC,
9855 0x32, 0x10, 0x76, 0x54,
9856 // data length
9857 0x00, 0x0c,
9858 // data
9859 'h', 'e', 'l', 'l',
9860 'o', ' ', 'w', 'o',
9861 'r', 'l', 'd', '!',
9862
9863 // frame type (ack frame)
9864 0x40,
9865 // least packet number awaiting an ack
9866 0x12, 0x34, 0x56, 0x78,
9867 0x9A, 0xA0,
9868 // largest observed packet number
9869 0x12, 0x34, 0x56, 0x78,
9870 0x9A, 0xBF,
9871 // num missing packets
9872 0x01,
9873 // missing packet
9874 0x12, 0x34, 0x56, 0x78,
9875 0x9A, 0xBE,
9876 };
9877
9878 unsigned char packet99[] = {
9879 // type (short header, 4 byte packet number)
9880 0x43,
9881 // connection_id
9882 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9883 // packet number
9884 0x12, 0x34, 0x56, 0x78,
9885
9886 // frame type (IETF_STREAM frame with fin, length, and offset bits set)
9887 0x08 | 0x01 | 0x02 | 0x04,
9888 // stream id
9889 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
9890 // offset
9891 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
9892 0x32, 0x10, 0x76, 0x54,
9893 // data length
9894 kVarInt62TwoBytes + 0x00, 0x0c,
9895 // data
9896 'h', 'e', 'l', 'l',
9897 'o', ' ', 'w', 'o',
9898 'r', 'l', 'd', '!',
9899
9900 // frame type (ack frame)
9901 0x0d,
9902 // largest observed packet number
9903 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
9904 // Delta time
9905 kVarInt62OneByte + 0x00,
9906 // Ack Block count
9907 kVarInt62OneByte + 0x01,
9908 // First block size (one packet)
9909 kVarInt62OneByte + 0x00,
9910
9911 // Next gap size & ack. Missing all preceding packets
9912 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
9913 kVarInt62OneByte + 0x00,
9914 };
9915 // clang-format on
9916
9917 MockFramerVisitor visitor;
9918 framer_.set_visitor(&visitor);
9919 EXPECT_CALL(visitor, OnPacket());
9920 EXPECT_CALL(visitor, OnPacketHeader(_));
9921 EXPECT_CALL(visitor, OnStreamFrame(_)).WillOnce(Return(false));
9922 EXPECT_CALL(visitor, OnPacketComplete());
9923 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true));
9924 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_)).WillOnce(Return(true));
9925 EXPECT_CALL(visitor, OnDecryptedPacket(_));
9926
9927 unsigned char* p = packet;
9928 size_t p_size = QUIC_ARRAYSIZE(packet);
9929 if (framer_.transport_version() == QUIC_VERSION_99) {
9930 p = packet99;
9931 p_size = QUIC_ARRAYSIZE(packet99);
9932 } else if (framer_.transport_version() > QUIC_VERSION_44) {
9933 p = packet46;
9934 p_size = QUIC_ARRAYSIZE(packet46);
9935 } else if (framer_.transport_version() > QUIC_VERSION_43) {
9936 p = packet44;
9937 p_size = QUIC_ARRAYSIZE(packet44);
9938 }
9939 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
9940 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9941 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
9942}
9943
9944static char kTestString[] = "At least 20 characters.";
9945static QuicStreamId kTestQuicStreamId = 1;
9946static bool ExpectedStreamFrame(const QuicStreamFrame& frame) {
9947 return (frame.stream_id == kTestQuicStreamId ||
9948 frame.stream_id == QuicUtils::GetCryptoStreamId(QUIC_VERSION_99)) &&
9949 !frame.fin && frame.offset == 0 &&
vasilvvc48c8712019-03-11 13:38:16 -07009950 std::string(frame.data_buffer, frame.data_length) == kTestString;
QUICHE teama6ef0a62019-03-07 20:34:33 -05009951 // FIN is hard-coded false in ConstructEncryptedPacket.
9952 // Offset 0 is hard-coded in ConstructEncryptedPacket.
9953}
9954
9955// Verify that the packet returned by ConstructEncryptedPacket() can be properly
9956// parsed by the framer.
9957TEST_P(QuicFramerTest, ConstructEncryptedPacket) {
9958 // Since we are using ConstructEncryptedPacket, we have to set the framer's
9959 // crypto to be Null.
zhongyi546cc452019-04-12 15:27:49 -07009960 if (framer_.version().KnowsWhichDecrypterToUse()) {
9961 framer_.InstallDecrypter(
9962 ENCRYPTION_FORWARD_SECURE,
9963 QuicMakeUnique<NullDecrypter>(framer_.perspective()));
9964 } else {
9965 framer_.SetDecrypter(ENCRYPTION_INITIAL,
9966 QuicMakeUnique<NullDecrypter>(framer_.perspective()));
9967 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05009968 ParsedQuicVersionVector versions;
9969 versions.push_back(framer_.version());
9970 std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket(
9971 TestConnectionId(), EmptyQuicConnectionId(), false, false,
9972 kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
9973 CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, &versions));
9974
9975 MockFramerVisitor visitor;
9976 framer_.set_visitor(&visitor);
9977 EXPECT_CALL(visitor, OnPacket()).Times(1);
9978 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
9979 .Times(1)
9980 .WillOnce(Return(true));
9981 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
9982 .Times(1)
9983 .WillOnce(Return(true));
9984 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1).WillOnce(Return(true));
9985 EXPECT_CALL(visitor, OnDecryptedPacket(_)).Times(1);
9986 EXPECT_CALL(visitor, OnError(_)).Times(0);
9987 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
QUICHE teamea740082019-03-11 17:58:43 -07009988 if (!QuicVersionUsesCryptoFrames(framer_.version().transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009989 EXPECT_CALL(visitor, OnStreamFrame(Truly(ExpectedStreamFrame))).Times(1);
9990 } else {
9991 EXPECT_CALL(visitor, OnCryptoFrame(_)).Times(1);
9992 }
9993 EXPECT_CALL(visitor, OnPacketComplete()).Times(1);
9994
9995 EXPECT_TRUE(framer_.ProcessPacket(*packet));
9996 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
9997}
9998
9999// Verify that the packet returned by ConstructMisFramedEncryptedPacket()
10000// does cause the framer to return an error.
10001TEST_P(QuicFramerTest, ConstructMisFramedEncryptedPacket) {
10002 // Since we are using ConstructEncryptedPacket, we have to set the framer's
10003 // crypto to be Null.
zhongyi546cc452019-04-12 15:27:49 -070010004 if (framer_.version().KnowsWhichDecrypterToUse()) {
nharper9bb83462019-05-01 10:53:22 -070010005 framer_.InstallDecrypter(
10006 ENCRYPTION_FORWARD_SECURE,
10007 QuicMakeUnique<NullDecrypter>(framer_.perspective()));
zhongyi546cc452019-04-12 15:27:49 -070010008 } else {
10009 framer_.SetDecrypter(ENCRYPTION_INITIAL,
10010 QuicMakeUnique<NullDecrypter>(framer_.perspective()));
10011 }
QUICHE team6987b4a2019-03-15 16:23:04 -070010012 framer_.SetEncrypter(ENCRYPTION_INITIAL,
QUICHE teama6ef0a62019-03-07 20:34:33 -050010013 QuicMakeUnique<NullEncrypter>(framer_.perspective()));
10014 ParsedQuicVersionVector versions;
10015 versions.push_back(framer_.version());
10016 std::unique_ptr<QuicEncryptedPacket> packet(ConstructMisFramedEncryptedPacket(
10017 TestConnectionId(), EmptyQuicConnectionId(), false, false,
10018 kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
10019 CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, &versions,
10020 Perspective::IS_CLIENT));
10021
10022 MockFramerVisitor visitor;
10023 framer_.set_visitor(&visitor);
10024 EXPECT_CALL(visitor, OnPacket()).Times(1);
10025 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
10026 .Times(1)
10027 .WillOnce(Return(true));
10028 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
10029 .Times(1)
10030 .WillOnce(Return(true));
10031 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1);
10032 EXPECT_CALL(visitor, OnDecryptedPacket(_)).Times(1);
10033 EXPECT_CALL(visitor, OnError(_)).Times(1);
10034 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
10035 EXPECT_CALL(visitor, OnPacketComplete()).Times(0);
10036
10037 EXPECT_FALSE(framer_.ProcessPacket(*packet));
10038 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
10039}
10040
10041// Tests for fuzzing with Dr. Fuzz
10042// Xref http://www.chromium.org/developers/testing/dr-fuzz for more details.
10043#ifdef __cplusplus
10044extern "C" {
10045#endif
10046
10047// target function to be fuzzed by Dr. Fuzz
10048void QuicFramerFuzzFunc(unsigned char* data,
10049 size_t size,
10050 const ParsedQuicVersion& version) {
10051 QuicFramer framer(AllSupportedVersions(), QuicTime::Zero(),
10052 Perspective::IS_SERVER, kQuicDefaultConnectionIdLength);
10053 ASSERT_EQ(GetQuicFlag(FLAGS_quic_supports_tls_handshake), true);
10054 const char* const packet_bytes = reinterpret_cast<const char*>(data);
10055
10056 // Test the CryptoFramer.
10057 QuicStringPiece crypto_input(packet_bytes, size);
10058 std::unique_ptr<CryptoHandshakeMessage> handshake_message(
10059 CryptoFramer::ParseMessage(crypto_input));
10060
10061 // Test the regular QuicFramer with the same input.
10062 NoOpFramerVisitor visitor;
10063 framer.set_visitor(&visitor);
10064 framer.set_version(version);
10065 QuicEncryptedPacket packet(packet_bytes, size);
10066 framer.ProcessPacket(packet);
10067}
10068
10069#ifdef __cplusplus
10070}
10071#endif
10072
10073TEST_P(QuicFramerTest, FramerFuzzTest) {
10074 // clang-format off
10075 unsigned char packet[] = {
10076 // public flags (8 byte connection_id)
10077 0x2C,
10078 // connection_id
10079 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10080 // packet number
10081 0x12, 0x34, 0x56, 0x78,
10082 // private flags
10083 0x00,
10084
10085 // frame type (stream frame with fin)
10086 0xFF,
10087 // stream id
10088 0x01, 0x02, 0x03, 0x04,
10089 // offset
10090 0x3A, 0x98, 0xFE, 0xDC,
10091 0x32, 0x10, 0x76, 0x54,
10092 // data length
10093 0x00, 0x0c,
10094 // data
10095 'h', 'e', 'l', 'l',
10096 'o', ' ', 'w', 'o',
10097 'r', 'l', 'd', '!',
10098 };
10099
10100 unsigned char packet44[] = {
10101 // type (short header, 4 byte packet number)
10102 0x32,
10103 // packet number
10104 0x12, 0x34, 0x56, 0x78,
10105
10106 // frame type (stream frame with fin, length, and offset bits set)
10107 0x10 | 0x01 | 0x02 | 0x04,
10108 // stream id
10109 0x01, 0x02, 0x03, 0x04,
10110 // offset
10111 0x3A, 0x98, 0xFE, 0xDC,
10112 0x32, 0x10, 0x76, 0x54,
10113 // data length
10114 0x00, 0x0c,
10115 // data
10116 'h', 'e', 'l', 'l',
10117 'o', ' ', 'w', 'o',
10118 'r', 'l', 'd', '!',
10119 };
10120
10121 unsigned char packet46[] = {
10122 // type (short header, 4 byte packet number)
10123 0x43,
10124 // packet number
10125 0x12, 0x34, 0x56, 0x78,
10126
10127 // frame type (stream frame with fin, length, and offset bits set)
10128 0x10 | 0x01 | 0x02 | 0x04,
10129 // stream id
10130 0x01, 0x02, 0x03, 0x04,
10131 // offset
10132 0x3A, 0x98, 0xFE, 0xDC,
10133 0x32, 0x10, 0x76, 0x54,
10134 // data length
10135 0x00, 0x0c,
10136 // data
10137 'h', 'e', 'l', 'l',
10138 'o', ' ', 'w', 'o',
10139 'r', 'l', 'd', '!',
10140 };
10141
10142 unsigned char packet99[] = {
10143 // type (short header, 4 byte packet number)
10144 0x43,
10145 // packet number
10146 0x12, 0x34, 0x56, 0x78,
10147
10148 // frame type (IETF_STREAM frame with fin, length, and offset bits set)
10149 0x08 | 0x01 | 0x02 | 0x04,
10150 // stream id
10151 0x01, 0x02, 0x03, 0x04,
10152 // offset
10153 0x3A, 0x98, 0xFE, 0xDC,
10154 0x32, 0x10, 0x76, 0x54,
10155 // data length
10156 0x00, 0x0c,
10157 // data
10158 'h', 'e', 'l', 'l',
10159 'o', ' ', 'w', 'o',
10160 'r', 'l', 'd', '!',
10161 };
10162 // clang-format on
10163
10164 unsigned char* p = packet;
10165 if (framer_.transport_version() == QUIC_VERSION_99) {
10166 p = packet99;
10167 } else if (framer_.transport_version() > QUIC_VERSION_44) {
10168 p = packet46;
10169 } else if (framer_.transport_version() > QUIC_VERSION_43) {
10170 p = packet44;
10171 }
10172 QuicFramerFuzzFunc(p,
10173 framer_.transport_version() > QUIC_VERSION_43
10174 ? QUIC_ARRAYSIZE(packet44)
10175 : QUIC_ARRAYSIZE(packet),
10176 framer_.version());
10177}
10178
QUICHE teama6ef0a62019-03-07 20:34:33 -050010179TEST_P(QuicFramerTest, IetfBlockedFrame) {
10180 // This test only for version 99.
10181 if (framer_.transport_version() != QUIC_VERSION_99) {
10182 return;
10183 }
zhongyi546cc452019-04-12 15:27:49 -070010184 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010185
10186 // clang-format off
10187 PacketFragments packet99 = {
10188 // type (short header, 4 byte packet number)
10189 {"",
10190 {0x43}},
10191 // connection_id
10192 {"",
10193 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10194 // packet number
10195 {"",
10196 {0x12, 0x34, 0x9A, 0xBC}},
10197 // frame type (IETF_BLOCKED)
10198 {"",
10199 {0x14}},
10200 // blocked offset
10201 {"Can not read blocked offset.",
10202 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
10203 };
10204 // clang-format on
10205
10206 std::unique_ptr<QuicEncryptedPacket> encrypted(
10207 AssemblePacketFromFragments(packet99));
10208 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10209
10210 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10211 ASSERT_TRUE(visitor_.header_.get());
10212 EXPECT_TRUE(CheckDecryption(
10213 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10214 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10215
10216 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
10217
10218 CheckFramingBoundaries(packet99, QUIC_INVALID_BLOCKED_DATA);
10219}
10220
10221TEST_P(QuicFramerTest, BuildIetfBlockedPacket) {
10222 // This test only for version 99.
10223 if (framer_.transport_version() != QUIC_VERSION_99) {
10224 return;
10225 }
10226
10227 QuicPacketHeader header;
10228 header.destination_connection_id = FramerTestConnectionId();
10229 header.reset_flag = false;
10230 header.version_flag = false;
10231 header.packet_number = kPacketNumber;
10232
10233 QuicBlockedFrame frame;
10234 frame.stream_id = QuicUtils::GetInvalidStreamId(framer_.transport_version());
10235 frame.offset = kStreamOffset;
10236 QuicFrames frames = {QuicFrame(&frame)};
10237
10238 // clang-format off
10239 unsigned char packet99[] = {
10240 // type (short header, 4 byte packet number)
10241 0x43,
10242 // connection_id
10243 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10244 // packet number
10245 0x12, 0x34, 0x56, 0x78,
10246
10247 // frame type (IETF_BLOCKED)
10248 0x14,
10249 // Offset
10250 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
10251 };
10252 // clang-format on
10253
10254 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10255 ASSERT_TRUE(data != nullptr);
10256
10257 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10258 data->length(), AsChars(packet99),
10259 QUIC_ARRAYSIZE(packet99));
10260}
10261
10262TEST_P(QuicFramerTest, IetfStreamBlockedFrame) {
10263 // This test only for version 99.
10264 if (framer_.transport_version() != QUIC_VERSION_99) {
10265 return;
10266 }
zhongyi546cc452019-04-12 15:27:49 -070010267 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010268
10269 // clang-format off
10270 PacketFragments packet99 = {
10271 // type (short header, 4 byte packet number)
10272 {"",
10273 {0x43}},
10274 // connection_id
10275 {"",
10276 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10277 // packet number
10278 {"",
10279 {0x12, 0x34, 0x9A, 0xBC}},
10280 // frame type (IETF_STREAM_BLOCKED)
10281 {"",
10282 {0x15}},
10283 // blocked offset
10284 {"Can not read stream blocked stream id.",
10285 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
10286 {"Can not read stream blocked offset.",
10287 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
10288 };
10289 // clang-format on
10290
10291 std::unique_ptr<QuicEncryptedPacket> encrypted(
10292 AssemblePacketFromFragments(packet99));
10293 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10294
10295 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10296 ASSERT_TRUE(visitor_.header_.get());
10297 EXPECT_TRUE(CheckDecryption(
10298 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10299 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10300
10301 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
10302 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
10303
10304 CheckFramingBoundaries(packet99, QUIC_INVALID_STREAM_BLOCKED_DATA);
10305}
10306
10307TEST_P(QuicFramerTest, BuildIetfStreamBlockedPacket) {
10308 // This test only for version 99.
10309 if (framer_.transport_version() != QUIC_VERSION_99) {
10310 return;
10311 }
10312
10313 QuicPacketHeader header;
10314 header.destination_connection_id = FramerTestConnectionId();
10315 header.reset_flag = false;
10316 header.version_flag = false;
10317 header.packet_number = kPacketNumber;
10318
10319 QuicBlockedFrame frame;
10320 frame.stream_id = kStreamId;
10321 frame.offset = kStreamOffset;
10322 QuicFrames frames = {QuicFrame(&frame)};
10323
10324 // clang-format off
10325 unsigned char packet99[] = {
10326 // type (short header, 4 byte packet number)
10327 0x43,
10328 // connection_id
10329 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10330 // packet number
10331 0x12, 0x34, 0x56, 0x78,
10332
10333 // frame type (IETF_STREAM_BLOCKED)
10334 0x15,
10335 // Stream ID
10336 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
10337 // Offset
10338 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
10339 };
10340 // clang-format on
10341
10342 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10343 ASSERT_TRUE(data != nullptr);
10344
10345 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10346 data->length(), AsChars(packet99),
10347 QUIC_ARRAYSIZE(packet99));
10348}
10349
fkastenholz3c4eabf2019-04-22 07:49:59 -070010350TEST_P(QuicFramerTest, BiDiMaxStreamsFrame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010351 // This test only for version 99.
10352 if (framer_.transport_version() != QUIC_VERSION_99) {
10353 return;
10354 }
zhongyi546cc452019-04-12 15:27:49 -070010355 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010356
10357 // clang-format off
10358 PacketFragments packet99 = {
10359 // type (short header, 4 byte packet number)
10360 {"",
10361 {0x43}},
10362 // connection_id
10363 {"",
10364 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10365 // packet number
10366 {"",
10367 {0x12, 0x34, 0x9A, 0xBC}},
10368 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
10369 {"",
10370 {0x12}},
10371 // max. streams
10372 {"Can not read MAX_STREAMS stream count.",
10373 {kVarInt62OneByte + 0x03}},
10374 };
10375 // clang-format on
10376
10377 std::unique_ptr<QuicEncryptedPacket> encrypted(
10378 AssemblePacketFromFragments(packet99));
10379 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10380
10381 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10382 ASSERT_TRUE(visitor_.header_.get());
10383 EXPECT_TRUE(CheckDecryption(
10384 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10385 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10386
fkastenholz3c4eabf2019-04-22 07:49:59 -070010387 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
10388 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
10389 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010390}
10391
fkastenholz3c4eabf2019-04-22 07:49:59 -070010392TEST_P(QuicFramerTest, UniDiMaxStreamsFrame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010393 // This test only for version 99.
10394 if (framer_.transport_version() != QUIC_VERSION_99) {
10395 return;
10396 }
zhongyi546cc452019-04-12 15:27:49 -070010397 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010398
10399 // clang-format off
10400 PacketFragments packet99 = {
10401 // type (short header, 4 byte packet number)
10402 {"",
10403 {0x43}},
10404 // Test runs in client mode, no connection id
10405 // packet number
10406 {"",
10407 {0x12, 0x34, 0x9A, 0xBC}},
fkastenholz3c4eabf2019-04-22 07:49:59 -070010408 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
QUICHE teama6ef0a62019-03-07 20:34:33 -050010409 {"",
fkastenholz3c4eabf2019-04-22 07:49:59 -070010410 {0x13}},
QUICHE teama6ef0a62019-03-07 20:34:33 -050010411 // max. streams
10412 {"Can not read MAX_STREAMS stream count.",
10413 {kVarInt62OneByte + 0x03}},
10414 };
10415 // clang-format on
10416
10417 std::unique_ptr<QuicEncryptedPacket> encrypted(
10418 AssemblePacketFromFragments(packet99));
10419 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10420 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10421
10422 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10423 ASSERT_TRUE(visitor_.header_.get());
10424 EXPECT_TRUE(CheckDecryption(
10425 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10426 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10427
fkastenholz3c4eabf2019-04-22 07:49:59 -070010428 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
10429 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
10430 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010431}
10432
10433TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrame) {
10434 // This test only for version 99.
10435 if (framer_.transport_version() != QUIC_VERSION_99) {
10436 return;
10437 }
zhongyi546cc452019-04-12 15:27:49 -070010438 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010439
10440 // clang-format off
10441 PacketFragments packet99 = {
10442 // type (short header, 4 byte packet number)
10443 {"",
10444 {0x43}},
10445 // connection_id
10446 {"",
10447 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10448 // packet number
10449 {"",
10450 {0x12, 0x34, 0x9A, 0xBC}},
10451 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
10452 {"",
10453 {0x13}},
10454 // max. streams
10455 {"Can not read MAX_STREAMS stream count.",
10456 {kVarInt62OneByte + 0x03}},
10457 };
10458 // clang-format on
10459
10460 std::unique_ptr<QuicEncryptedPacket> encrypted(
10461 AssemblePacketFromFragments(packet99));
10462 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10463
10464 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10465 ASSERT_TRUE(visitor_.header_.get());
10466 EXPECT_TRUE(CheckDecryption(
10467 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10468 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10469
fkastenholz3c4eabf2019-04-22 07:49:59 -070010470 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
10471 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
10472 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010473}
10474
10475TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrame) {
10476 // This test only for version 99.
10477 if (framer_.transport_version() != QUIC_VERSION_99) {
10478 return;
10479 }
zhongyi546cc452019-04-12 15:27:49 -070010480 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010481
10482 // clang-format off
10483 PacketFragments packet99 = {
10484 // type (short header, 4 byte packet number)
10485 {"",
10486 {0x43}},
10487 // Test runs in client mode, no connection id
10488 // packet number
10489 {"",
10490 {0x12, 0x34, 0x9A, 0xBC}},
10491 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
10492 {"",
10493 {0x13}},
10494 // max. streams
10495 {"Can not read MAX_STREAMS stream count.",
10496 {kVarInt62OneByte + 0x03}},
10497 };
10498 // clang-format on
10499
10500 std::unique_ptr<QuicEncryptedPacket> encrypted(
10501 AssemblePacketFromFragments(packet99));
10502 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10503 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10504
10505 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10506 ASSERT_TRUE(visitor_.header_.get());
10507 EXPECT_TRUE(CheckDecryption(
10508 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10509 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10510
fkastenholz3c4eabf2019-04-22 07:49:59 -070010511 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
10512 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
10513 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010514}
10515
10516// The following four tests ensure that the framer can deserialize a stream
10517// count that is large enough to cause the resulting stream ID to exceed the
10518// current implementation limit(32 bits). The intent is that when this happens,
10519// the stream limit is pegged to the maximum supported value. There are four
10520// tests, for the four combinations of uni- and bi-directional, server- and
10521// client- initiated.
fkastenholz3c4eabf2019-04-22 07:49:59 -070010522TEST_P(QuicFramerTest, BiDiMaxStreamsFrameTooBig) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010523 // This test only for version 99.
10524 if (framer_.transport_version() != QUIC_VERSION_99) {
10525 return;
10526 }
zhongyi546cc452019-04-12 15:27:49 -070010527 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010528
10529 // clang-format off
10530 unsigned char packet99[] = {
10531 // type (short header, 4 byte packet number)
10532 0x43,
10533 // connection_id
10534 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10535 // packet number
10536 0x12, 0x34, 0x9A, 0xBC,
10537 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
10538 0x12,
10539
10540 // max. streams. Max stream ID allowed is 0xffffffff
10541 // This encodes a count of 0x40000000, leading to stream
10542 // IDs in the range 0x1 00000000 to 0x1 00000003.
10543 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
10544 };
10545 // clang-format on
10546
10547 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
10548 false);
10549 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
10550 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10551 ASSERT_TRUE(visitor_.header_.get());
10552 EXPECT_TRUE(CheckDecryption(
10553 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10554 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10555
fkastenholz465220f2019-04-23 07:56:27 -070010556 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -070010557 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010558}
10559
10560TEST_P(QuicFramerTest, ClientBiDiMaxStreamsFrameTooBig) {
10561 // This test only for version 99.
10562 if (framer_.transport_version() != QUIC_VERSION_99) {
10563 return;
10564 }
zhongyi546cc452019-04-12 15:27:49 -070010565 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010566
10567 // clang-format off
10568 unsigned char packet99[] = {
10569 // type (short header, 4 byte packet number)
10570 0x43,
10571 // Test runs in client mode, no connection id
10572 // packet number
10573 0x12, 0x34, 0x9A, 0xBC,
10574 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
10575 0x12,
10576
10577 // max. streams. Max stream ID allowed is 0xffffffff
10578 // This encodes a count of 0x40000000, leading to stream
10579 // IDs in the range 0x1 00000000 to 0x1 00000003.
10580 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
10581 };
10582 // clang-format on
10583
10584 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
10585 false);
10586 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10587 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
10588
10589 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10590 ASSERT_TRUE(visitor_.header_.get());
10591 EXPECT_TRUE(CheckDecryption(
10592 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10593 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10594
fkastenholz465220f2019-04-23 07:56:27 -070010595 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -070010596 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010597}
10598
10599TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrameTooBig) {
10600 // This test only for version 99.
10601 if (framer_.transport_version() != QUIC_VERSION_99) {
10602 return;
10603 }
zhongyi546cc452019-04-12 15:27:49 -070010604 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010605
10606 // clang-format off
10607 unsigned char packet99[] = {
10608 // type (short header, 4 byte packet number)
10609 0x43,
10610 // connection_id
10611 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10612 // packet number
10613 0x12, 0x34, 0x9A, 0xBC,
10614 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
10615 0x13,
10616
10617 // max. streams. Max stream ID allowed is 0xffffffff
10618 // This encodes a count of 0x40000000, leading to stream
10619 // IDs in the range 0x1 00000000 to 0x1 00000003.
10620 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
10621 };
10622 // clang-format on
10623
10624 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
10625 false);
10626 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
10627
10628 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10629 ASSERT_TRUE(visitor_.header_.get());
10630 EXPECT_TRUE(CheckDecryption(
10631 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10632 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10633
fkastenholz465220f2019-04-23 07:56:27 -070010634 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -070010635 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010636}
10637
10638TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrameTooBig) {
10639 // This test only for version 99.
10640 if (framer_.transport_version() != QUIC_VERSION_99) {
10641 return;
10642 }
zhongyi546cc452019-04-12 15:27:49 -070010643 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010644
10645 // clang-format off
10646 unsigned char packet99[] = {
10647 // type (short header, 4 byte packet number)
10648 0x43,
10649 // Test runs in client mode, no connection id
10650 // packet number
10651 0x12, 0x34, 0x9A, 0xBC,
10652 // frame type (IETF_MAX_STREAMS_UNDIRECTIONAL)
10653 0x13,
10654
10655 // max. streams. Max stream ID allowed is 0xffffffff
10656 // This encodes a count of 0x40000000, leading to stream
10657 // IDs in the range 0x1 00000000 to 0x1 00000003.
10658 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
10659 };
10660 // clang-format on
10661
10662 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
10663 false);
10664 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10665 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
10666
10667 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10668 ASSERT_TRUE(visitor_.header_.get());
10669 EXPECT_TRUE(CheckDecryption(
10670 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10671 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10672
fkastenholz465220f2019-04-23 07:56:27 -070010673 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -070010674 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010675}
10676
fkastenholz3c4eabf2019-04-22 07:49:59 -070010677// Specifically test that count==0 is accepted.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010678TEST_P(QuicFramerTest, MaxStreamsFrameZeroCount) {
10679 // This test only for version 99.
10680 if (framer_.transport_version() != QUIC_VERSION_99) {
10681 return;
10682 }
zhongyi546cc452019-04-12 15:27:49 -070010683 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010684
10685 // clang-format off
10686 unsigned char packet99[] = {
10687 // type (short header, 4 byte packet number)
10688 0x43,
10689 // connection_id
10690 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10691 // packet number
10692 0x12, 0x34, 0x9A, 0xBC,
10693 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
10694 0x12,
10695 // max. streams == 0.
10696 kVarInt62OneByte + 0x00
10697 };
10698 // clang-format on
10699
10700 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
10701 false);
fkastenholz3c4eabf2019-04-22 07:49:59 -070010702 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010703}
10704
10705TEST_P(QuicFramerTest, ServerBiDiStreamsBlockedFrame) {
10706 // This test only for version 99.
10707 if (framer_.transport_version() != QUIC_VERSION_99) {
10708 return;
10709 }
zhongyi546cc452019-04-12 15:27:49 -070010710 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010711
10712 // clang-format off
10713 PacketFragments packet99 = {
10714 // type (short header, 4 byte packet number)
10715 {"",
10716 {0x43}},
10717 // connection_id
10718 {"",
10719 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10720 // packet number
10721 {"",
10722 {0x12, 0x34, 0x9A, 0xBC}},
fkastenholz3c4eabf2019-04-22 07:49:59 -070010723 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
10724 {"",
10725 {0x13}},
10726 // stream count
10727 {"Can not read MAX_STREAMS stream count.",
10728 {kVarInt62OneByte + 0x00}},
10729 };
10730 // clang-format on
10731
10732 std::unique_ptr<QuicEncryptedPacket> encrypted(
10733 AssemblePacketFromFragments(packet99));
10734 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10735
10736 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10737 ASSERT_TRUE(visitor_.header_.get());
10738 EXPECT_TRUE(CheckDecryption(
10739 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10740 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10741
10742 EXPECT_EQ(0u, visitor_.max_streams_frame_.stream_count);
10743 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
10744
10745 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
10746}
10747
10748TEST_P(QuicFramerTest, BiDiStreamsBlockedFrame) {
10749 // This test only for version 99.
10750 if (framer_.transport_version() != QUIC_VERSION_99) {
10751 return;
10752 }
10753 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10754
10755 // clang-format off
10756 PacketFragments packet99 = {
10757 // type (short header, 4 byte packet number)
10758 {"",
10759 {0x43}},
10760 // connection_id
10761 {"",
10762 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10763 // packet number
10764 {"",
10765 {0x12, 0x34, 0x9A, 0xBC}},
QUICHE teama6ef0a62019-03-07 20:34:33 -050010766 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
10767 {"",
10768 {0x16}},
10769 // stream id
fkastenholz3c4eabf2019-04-22 07:49:59 -070010770 {"Can not read STREAMS_BLOCKED stream count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010771 {kVarInt62OneByte + 0x03}},
10772 };
10773 // clang-format on
10774
10775 std::unique_ptr<QuicEncryptedPacket> encrypted(
10776 AssemblePacketFromFragments(packet99));
10777 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10778
10779 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10780 ASSERT_TRUE(visitor_.header_.get());
10781 EXPECT_TRUE(CheckDecryption(
10782 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10783 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10784
fkastenholz3c4eabf2019-04-22 07:49:59 -070010785 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
10786 EXPECT_FALSE(visitor_.streams_blocked_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010787
fkastenholz3c4eabf2019-04-22 07:49:59 -070010788 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010789}
10790
fkastenholz3c4eabf2019-04-22 07:49:59 -070010791TEST_P(QuicFramerTest, UniDiStreamsBlockedFrame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010792 // This test only for version 99.
10793 if (framer_.transport_version() != QUIC_VERSION_99) {
10794 return;
10795 }
zhongyi546cc452019-04-12 15:27:49 -070010796 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010797
10798 // clang-format off
10799 PacketFragments packet99 = {
10800 // type (short header, 4 byte packet number)
10801 {"",
10802 {0x43}},
10803 // connection_id
10804 {"",
10805 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10806 // packet number
10807 {"",
10808 {0x12, 0x34, 0x9A, 0xBC}},
10809 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10810 {"",
10811 {0x17}},
10812 // stream id
fkastenholz3c4eabf2019-04-22 07:49:59 -070010813 {"Can not read STREAMS_BLOCKED stream count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010814 {kVarInt62OneByte + 0x03}},
10815 };
10816 // clang-format on
10817
10818 std::unique_ptr<QuicEncryptedPacket> encrypted(
10819 AssemblePacketFromFragments(packet99));
10820 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10821
10822 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10823 ASSERT_TRUE(visitor_.header_.get());
10824 EXPECT_TRUE(CheckDecryption(
10825 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10826 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10827
fkastenholz3c4eabf2019-04-22 07:49:59 -070010828 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
10829 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
10830 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010831}
10832
10833TEST_P(QuicFramerTest, ClientUniDiStreamsBlockedFrame) {
10834 // This test only for version 99.
10835 if (framer_.transport_version() != QUIC_VERSION_99) {
10836 return;
10837 }
zhongyi546cc452019-04-12 15:27:49 -070010838 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010839
10840 // clang-format off
10841 PacketFragments packet99 = {
10842 // type (short header, 4 byte packet number)
10843 {"",
10844 {0x43}},
10845 // Test runs in client mode, no connection id
10846 // packet number
10847 {"",
10848 {0x12, 0x34, 0x9A, 0xBC}},
10849 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10850 {"",
10851 {0x17}},
10852 // stream id
fkastenholz3c4eabf2019-04-22 07:49:59 -070010853 {"Can not read STREAMS_BLOCKED stream count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010854 {kVarInt62OneByte + 0x03}},
10855 };
10856 // clang-format on
10857
10858 std::unique_ptr<QuicEncryptedPacket> encrypted(
10859 AssemblePacketFromFragments(packet99));
10860 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10861 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10862
10863 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10864 ASSERT_TRUE(visitor_.header_.get());
10865 EXPECT_TRUE(CheckDecryption(
10866 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10867 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10868
fkastenholz3c4eabf2019-04-22 07:49:59 -070010869 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
10870 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
10871 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010872}
10873
10874// Check that when we get a STREAMS_BLOCKED frame that specifies too large
10875// a stream count, we reject with an appropriate error. There is no need to
10876// check for different combinations of Uni/Bi directional and client/server
10877// initiated; the logic does not take these into account.
10878TEST_P(QuicFramerTest, StreamsBlockedFrameTooBig) {
10879 // This test only for version 99.
10880 if (framer_.transport_version() != QUIC_VERSION_99) {
10881 return;
10882 }
zhongyi546cc452019-04-12 15:27:49 -070010883 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010884
10885 // clang-format off
10886 unsigned char packet99[] = {
10887 // type (short header, 4 byte packet number)
10888 0x43,
10889 // Test runs in client mode, no connection id
10890 // packet number
10891 0x12, 0x34, 0x9A, 0xBC,
10892 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL)
fkastenholz3c4eabf2019-04-22 07:49:59 -070010893 0x16,
QUICHE teama6ef0a62019-03-07 20:34:33 -050010894
10895 // max. streams. Max stream ID allowed is 0xffffffff
10896 // This encodes a count of 0x40000000, leading to stream
10897 // IDs in the range 0x1 00000000 to 0x1 00000003.
10898 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01
10899 };
10900 // clang-format on
10901
10902 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
10903 false);
10904 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10905 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
10906
fkastenholz3c4eabf2019-04-22 07:49:59 -070010907 EXPECT_EQ(QUIC_STREAMS_BLOCKED_DATA, framer_.error());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010908 EXPECT_EQ(framer_.detailed_error(),
10909 "STREAMS_BLOCKED stream count exceeds implementation limit.");
10910}
10911
fkastenholz3c4eabf2019-04-22 07:49:59 -070010912// Specifically test that count==0 is accepted.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010913TEST_P(QuicFramerTest, StreamsBlockedFrameZeroCount) {
10914 // This test only for version 99.
10915 if (framer_.transport_version() != QUIC_VERSION_99) {
10916 return;
10917 }
fkastenholz3c4eabf2019-04-22 07:49:59 -070010918
zhongyi546cc452019-04-12 15:27:49 -070010919 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010920
10921 // clang-format off
fkastenholz3c4eabf2019-04-22 07:49:59 -070010922 PacketFragments packet99 = {
10923 // type (short header, 4 byte packet number)
10924 {"",
10925 {0x43}},
10926 // connection_id
10927 {"",
10928 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10929 // packet number
10930 {"",
10931 {0x12, 0x34, 0x9A, 0xBC}},
10932 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10933 {"",
10934 {0x17}},
10935 // stream id
10936 {"Can not read STREAMS_BLOCKED stream count.",
10937 {kVarInt62OneByte + 0x00}},
QUICHE teama6ef0a62019-03-07 20:34:33 -050010938 };
10939 // clang-format on
10940
fkastenholz3c4eabf2019-04-22 07:49:59 -070010941 std::unique_ptr<QuicEncryptedPacket> encrypted(
10942 AssemblePacketFromFragments(packet99));
10943 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010944
fkastenholz3c4eabf2019-04-22 07:49:59 -070010945 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10946 ASSERT_TRUE(visitor_.header_.get());
10947 EXPECT_TRUE(CheckDecryption(
10948 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10949 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10950
10951 EXPECT_EQ(0u, visitor_.streams_blocked_frame_.stream_count);
10952 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
10953
10954 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010955}
10956
fkastenholz3c4eabf2019-04-22 07:49:59 -070010957TEST_P(QuicFramerTest, BuildBiDiStreamsBlockedPacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010958 // This test only for version 99.
10959 if (framer_.transport_version() != QUIC_VERSION_99) {
10960 return;
10961 }
10962
10963 QuicPacketHeader header;
10964 header.destination_connection_id = FramerTestConnectionId();
10965 header.reset_flag = false;
10966 header.version_flag = false;
10967 header.packet_number = kPacketNumber;
10968
fkastenholz3c4eabf2019-04-22 07:49:59 -070010969 QuicStreamsBlockedFrame frame;
10970 frame.stream_count = 3;
10971 frame.unidirectional = false;
QUICHE teama6ef0a62019-03-07 20:34:33 -050010972
10973 QuicFrames frames = {QuicFrame(frame)};
10974
10975 // clang-format off
10976 unsigned char packet99[] = {
10977 // type (short header, 4 byte packet number)
10978 0x43,
10979 // connection_id
10980 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10981 // packet number
10982 0x12, 0x34, 0x56, 0x78,
10983
10984 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
10985 0x16,
10986 // Stream count
10987 kVarInt62OneByte + 0x03
10988 };
10989 // clang-format on
10990
10991 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10992 ASSERT_TRUE(data != nullptr);
10993
10994 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10995 data->length(), AsChars(packet99),
10996 QUIC_ARRAYSIZE(packet99));
10997}
10998
fkastenholz3c4eabf2019-04-22 07:49:59 -070010999TEST_P(QuicFramerTest, BuildUniStreamsBlockedPacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011000 // This test only for version 99.
11001 if (framer_.transport_version() != QUIC_VERSION_99) {
11002 return;
11003 }
11004
11005 QuicPacketHeader header;
11006 header.destination_connection_id = FramerTestConnectionId();
11007 header.reset_flag = false;
11008 header.version_flag = false;
11009 header.packet_number = kPacketNumber;
11010
fkastenholz3c4eabf2019-04-22 07:49:59 -070011011 QuicStreamsBlockedFrame frame;
11012 frame.stream_count = 3;
11013 frame.unidirectional = true;
11014
QUICHE teama6ef0a62019-03-07 20:34:33 -050011015 QuicFrames frames = {QuicFrame(frame)};
11016
11017 // clang-format off
11018 unsigned char packet99[] = {
11019 // type (short header, 4 byte packet number)
11020 0x43,
11021 // connection_id
11022 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11023 // packet number
11024 0x12, 0x34, 0x56, 0x78,
11025
11026 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
11027 0x17,
11028 // Stream count
11029 kVarInt62OneByte + 0x03
11030 };
11031 // clang-format on
11032
11033 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11034 ASSERT_TRUE(data != nullptr);
11035
11036 test::CompareCharArraysWithHexError("constructed packet", data->data(),
11037 data->length(), AsChars(packet99),
11038 QUIC_ARRAYSIZE(packet99));
11039}
11040
fkastenholz3c4eabf2019-04-22 07:49:59 -070011041TEST_P(QuicFramerTest, BuildBiDiMaxStreamsPacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011042 // This test only for version 99.
11043 if (framer_.transport_version() != QUIC_VERSION_99) {
11044 return;
11045 }
11046
11047 QuicPacketHeader header;
11048 header.destination_connection_id = FramerTestConnectionId();
11049 header.reset_flag = false;
11050 header.version_flag = false;
11051 header.packet_number = kPacketNumber;
11052
fkastenholz3c4eabf2019-04-22 07:49:59 -070011053 QuicMaxStreamsFrame frame;
11054 frame.stream_count = 3;
11055 frame.unidirectional = false;
11056
QUICHE teama6ef0a62019-03-07 20:34:33 -050011057 QuicFrames frames = {QuicFrame(frame)};
11058
11059 // clang-format off
11060 unsigned char packet99[] = {
11061 // type (short header, 4 byte packet number)
11062 0x43,
11063 // connection_id
11064 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11065 // packet number
11066 0x12, 0x34, 0x56, 0x78,
11067
11068 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL frame)
11069 0x12,
11070 // Stream count
11071 kVarInt62OneByte + 0x03
11072 };
11073 // clang-format on
11074
11075 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11076 ASSERT_TRUE(data != nullptr);
11077
11078 test::CompareCharArraysWithHexError("constructed packet", data->data(),
11079 data->length(), AsChars(packet99),
11080 QUIC_ARRAYSIZE(packet99));
11081}
11082
fkastenholz3c4eabf2019-04-22 07:49:59 -070011083TEST_P(QuicFramerTest, BuildUniDiMaxStreamsPacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011084 // This test only for version 99.
11085 if (framer_.transport_version() != QUIC_VERSION_99) {
11086 return;
11087 }
11088
11089 // This test runs in client mode.
11090 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
11091
11092 QuicPacketHeader header;
11093 header.destination_connection_id = FramerTestConnectionId();
11094 header.reset_flag = false;
11095 header.version_flag = false;
11096 header.packet_number = kPacketNumber;
11097
fkastenholz3c4eabf2019-04-22 07:49:59 -070011098 QuicMaxStreamsFrame frame;
11099 frame.stream_count = 3;
11100 frame.unidirectional = true;
QUICHE teama6ef0a62019-03-07 20:34:33 -050011101
QUICHE teama6ef0a62019-03-07 20:34:33 -050011102 QuicFrames frames = {QuicFrame(frame)};
11103
11104 // clang-format off
11105 unsigned char packet99[] = {
11106 // type (short header, 4 byte packet number)
11107 0x43,
11108 // connection_id
11109 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11110 // packet number
11111 0x12, 0x34, 0x56, 0x78,
11112
11113 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
11114 0x13,
11115 // Stream count
11116 kVarInt62OneByte + 0x03
11117 };
11118 // clang-format on
11119
11120 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11121 ASSERT_TRUE(data != nullptr);
11122
11123 test::CompareCharArraysWithHexError("constructed packet", data->data(),
11124 data->length(), AsChars(packet99),
11125 QUIC_ARRAYSIZE(packet99));
11126}
11127
11128TEST_P(QuicFramerTest, NewConnectionIdFrame) {
11129 if (framer_.transport_version() != QUIC_VERSION_99) {
11130 // This frame is only for version 99.
11131 return;
11132 }
zhongyi546cc452019-04-12 15:27:49 -070011133 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011134 // clang-format off
11135 PacketFragments packet99 = {
11136 // type (short header, 4 byte packet number)
11137 {"",
11138 {0x43}},
11139 // connection_id
11140 {"",
11141 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11142 // packet number
11143 {"",
11144 {0x12, 0x34, 0x56, 0x78}},
11145 // frame type (IETF_NEW_CONNECTION_ID frame)
11146 {"",
11147 {0x18}},
11148 // error code
11149 {"Unable to read new connection ID frame sequence number.",
11150 {kVarInt62OneByte + 0x11}},
11151 {"Unable to read new connection ID frame connection id length.",
11152 {0x08}}, // connection ID length
11153 {"Unable to read new connection ID frame connection id.",
11154 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11}},
11155 {"Can not read new connection ID frame reset token.",
11156 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
11157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
11158 };
11159 // clang-format on
11160
11161 std::unique_ptr<QuicEncryptedPacket> encrypted(
11162 AssemblePacketFromFragments(packet99));
11163 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11164
11165 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
11166 ASSERT_TRUE(visitor_.header_.get());
11167 EXPECT_TRUE(CheckDecryption(
11168 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11169 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11170
11171 EXPECT_EQ(0u, visitor_.stream_frames_.size());
11172
11173 EXPECT_EQ(FramerTestConnectionIdPlusOne(),
11174 visitor_.new_connection_id_.connection_id);
11175 EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
11176 EXPECT_EQ(kTestStatelessResetToken,
11177 visitor_.new_connection_id_.stateless_reset_token);
11178
11179 ASSERT_EQ(0u, visitor_.ack_frames_.size());
11180
11181 CheckFramingBoundaries(packet99, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
11182}
11183
QUICHE team8e2e4532019-03-14 14:37:56 -070011184TEST_P(QuicFramerTest, NewConnectionIdFrameVariableLength) {
QUICHE team9b41c972019-03-21 11:22:48 -070011185 if (framer_.transport_version() != QUIC_VERSION_99) {
11186 // This frame is only for version 99.
QUICHE team8e2e4532019-03-14 14:37:56 -070011187 return;
11188 }
zhongyi546cc452019-04-12 15:27:49 -070011189 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE team8e2e4532019-03-14 14:37:56 -070011190 // clang-format off
11191 PacketFragments packet99 = {
11192 // type (short header, 4 byte packet number)
11193 {"",
11194 {0x43}},
11195 // connection_id
11196 {"",
11197 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11198 // packet number
11199 {"",
11200 {0x12, 0x34, 0x56, 0x78}},
11201 // frame type (IETF_NEW_CONNECTION_ID frame)
11202 {"",
11203 {0x18}},
11204 // error code
11205 {"Unable to read new connection ID frame sequence number.",
11206 {kVarInt62OneByte + 0x11}},
11207 {"Unable to read new connection ID frame connection id length.",
11208 {0x09}}, // connection ID length
11209 {"Unable to read new connection ID frame connection id.",
11210 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
11211 {"Can not read new connection ID frame reset token.",
11212 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
11213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
11214 };
11215 // clang-format on
11216
11217 std::unique_ptr<QuicEncryptedPacket> encrypted(
11218 AssemblePacketFromFragments(packet99));
11219 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11220
11221 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
11222 ASSERT_TRUE(visitor_.header_.get());
11223 EXPECT_TRUE(CheckDecryption(
11224 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11225 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11226
11227 EXPECT_EQ(0u, visitor_.stream_frames_.size());
11228
11229 EXPECT_EQ(FramerTestConnectionIdNineBytes(),
11230 visitor_.new_connection_id_.connection_id);
11231 EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
11232 EXPECT_EQ(kTestStatelessResetToken,
11233 visitor_.new_connection_id_.stateless_reset_token);
11234
11235 ASSERT_EQ(0u, visitor_.ack_frames_.size());
11236
11237 CheckFramingBoundaries(packet99, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
11238}
11239
QUICHE team0131a5b2019-03-20 15:23:27 -070011240// Verifies that parsing a NEW_CONNECTION_ID frame with a length above the
11241// specified maximum fails.
11242TEST_P(QuicFramerTest, InvalidLongNewConnectionIdFrame) {
11243 if (framer_.transport_version() != QUIC_VERSION_99) {
11244 // The NEW_CONNECTION_ID frame is only for version 99.
11245 return;
11246 }
zhongyi546cc452019-04-12 15:27:49 -070011247 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE team0131a5b2019-03-20 15:23:27 -070011248 // clang-format off
11249 PacketFragments packet99 = {
11250 // type (short header, 4 byte packet number)
11251 {"",
11252 {0x43}},
11253 // connection_id
11254 {"",
11255 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11256 // packet number
11257 {"",
11258 {0x12, 0x34, 0x56, 0x78}},
11259 // frame type (IETF_NEW_CONNECTION_ID frame)
11260 {"",
11261 {0x18}},
11262 // error code
11263 {"Unable to read new connection ID frame sequence number.",
11264 {kVarInt62OneByte + 0x11}},
11265 {"Unable to read new connection ID frame connection id length.",
11266 {0x13}}, // connection ID length
11267 {"Unable to read new connection ID frame connection id.",
11268 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11269 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
11270 0x42, 0x33, 0x42}},
11271 {"Can not read new connection ID frame reset token.",
11272 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
11273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
11274 };
11275 // clang-format on
11276
11277 std::unique_ptr<QuicEncryptedPacket> encrypted(
11278 AssemblePacketFromFragments(packet99));
11279 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11280 EXPECT_EQ(QUIC_INVALID_NEW_CONNECTION_ID_DATA, framer_.error());
11281 EXPECT_EQ("New connection ID length too high.", framer_.detailed_error());
11282}
11283
QUICHE teama6ef0a62019-03-07 20:34:33 -050011284TEST_P(QuicFramerTest, BuildNewConnectionIdFramePacket) {
11285 if (framer_.transport_version() != QUIC_VERSION_99) {
11286 // This frame is only for version 99.
11287 return;
11288 }
11289 QuicPacketHeader header;
11290 header.destination_connection_id = FramerTestConnectionId();
11291 header.reset_flag = false;
11292 header.version_flag = false;
11293 header.packet_number = kPacketNumber;
11294
11295 QuicNewConnectionIdFrame frame;
11296 frame.sequence_number = 0x11;
11297 // Use this value to force a 4-byte encoded variable length connection ID
11298 // in the frame.
11299 frame.connection_id = FramerTestConnectionIdPlusOne();
11300 frame.stateless_reset_token = kTestStatelessResetToken;
11301
11302 QuicFrames frames = {QuicFrame(&frame)};
11303
11304 // clang-format off
11305 unsigned char packet99[] = {
11306 // type (short header, 4 byte packet number)
11307 0x43,
11308 // connection_id
11309 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11310 // packet number
11311 0x12, 0x34, 0x56, 0x78,
11312
11313 // frame type (IETF_NEW_CONNECTION_ID frame)
11314 0x18,
11315 // sequence number
11316 kVarInt62OneByte + 0x11,
11317 // new connection id length
11318 0x08,
11319 // new connection id
11320 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
11321 // stateless reset token
11322 0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
11323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11324 };
11325 // clang-format on
11326
11327 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11328 ASSERT_TRUE(data != nullptr);
11329
11330 test::CompareCharArraysWithHexError("constructed packet", data->data(),
11331 data->length(), AsChars(packet99),
11332 QUIC_ARRAYSIZE(packet99));
11333}
11334
11335TEST_P(QuicFramerTest, NewTokenFrame) {
11336 if (framer_.transport_version() != QUIC_VERSION_99) {
11337 // This frame is only for version 99.
11338 return;
11339 }
zhongyi546cc452019-04-12 15:27:49 -070011340 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011341 // clang-format off
11342 PacketFragments packet = {
11343 // type (short header, 4 byte packet number)
11344 {"",
11345 {0x43}},
11346 // connection_id
11347 {"",
11348 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11349 // packet number
11350 {"",
11351 {0x12, 0x34, 0x56, 0x78}},
11352 // frame type (IETF_NEW_TOKEN frame)
11353 {"",
11354 {0x07}},
11355 // Length
11356 {"Unable to read new token length.",
11357 {kVarInt62OneByte + 0x08}},
11358 {"Unable to read new token data.",
11359 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}}
11360 };
11361 // clang-format on
11362 uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
11363 0x04, 0x05, 0x06, 0x07};
11364
11365 std::unique_ptr<QuicEncryptedPacket> encrypted(
11366 AssemblePacketFromFragments(packet));
11367 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11368
11369 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
11370 ASSERT_TRUE(visitor_.header_.get());
11371 EXPECT_TRUE(CheckDecryption(
11372 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11373 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11374
11375 EXPECT_EQ(0u, visitor_.stream_frames_.size());
11376
11377 EXPECT_EQ(sizeof(expected_token_value), visitor_.new_token_.token.length());
11378 EXPECT_EQ(0, memcmp(expected_token_value, visitor_.new_token_.token.data(),
11379 sizeof(expected_token_value)));
11380
11381 CheckFramingBoundaries(packet, QUIC_INVALID_NEW_TOKEN);
11382}
11383
11384TEST_P(QuicFramerTest, BuildNewTokenFramePacket) {
11385 if (framer_.transport_version() != QUIC_VERSION_99) {
11386 // This frame is only for version 99.
11387 return;
11388 }
11389 QuicPacketHeader header;
11390 header.destination_connection_id = FramerTestConnectionId();
11391 header.reset_flag = false;
11392 header.version_flag = false;
11393 header.packet_number = kPacketNumber;
11394
11395 uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
11396 0x04, 0x05, 0x06, 0x07};
11397
vasilvvc48c8712019-03-11 13:38:16 -070011398 QuicNewTokenFrame frame(0, std::string((const char*)(expected_token_value),
11399 sizeof(expected_token_value)));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011400
11401 QuicFrames frames = {QuicFrame(&frame)};
11402
11403 // clang-format off
11404 unsigned char packet[] = {
11405 // type (short header, 4 byte packet number)
11406 0x43,
11407 // connection_id
11408 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11409 // packet number
11410 0x12, 0x34, 0x56, 0x78,
11411
11412 // frame type (IETF_NEW_TOKEN frame)
11413 0x07,
11414 // Length and token
11415 kVarInt62OneByte + 0x08,
11416 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
11417 };
11418 // clang-format on
11419
11420 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11421 ASSERT_TRUE(data != nullptr);
11422
11423 test::CompareCharArraysWithHexError("constructed packet", data->data(),
11424 data->length(), AsChars(packet),
11425 QUIC_ARRAYSIZE(packet));
11426}
11427
11428TEST_P(QuicFramerTest, IetfStopSendingFrame) {
11429 // This test is only for version 99.
11430 if (framer_.transport_version() != QUIC_VERSION_99) {
11431 return;
11432 }
zhongyi546cc452019-04-12 15:27:49 -070011433 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011434
11435 // clang-format off
11436 PacketFragments packet99 = {
11437 // type (short header, 4 byte packet number)
11438 {"",
11439 {0x43}},
11440 // connection_id
11441 {"",
11442 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11443 // packet number
11444 {"",
11445 {0x12, 0x34, 0x9A, 0xBC}},
11446 // frame type (IETF_STOP_SENDING frame)
11447 {"",
11448 {0x05}},
11449 // stream id
11450 {"Unable to read stop sending stream id.",
11451 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
11452 {"Unable to read stop sending application error code.",
11453 {0x76, 0x54}},
11454 };
11455 // clang-format on
11456
11457 std::unique_ptr<QuicEncryptedPacket> encrypted(
11458 AssemblePacketFromFragments(packet99));
11459 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11460
11461 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
11462 ASSERT_TRUE(visitor_.header_.get());
11463 EXPECT_TRUE(CheckDecryption(
11464 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11465 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11466
11467 EXPECT_EQ(kStreamId, visitor_.stop_sending_frame_.stream_id);
11468 EXPECT_EQ(0x7654, visitor_.stop_sending_frame_.application_error_code);
11469
11470 CheckFramingBoundaries(packet99, QUIC_INVALID_STOP_SENDING_FRAME_DATA);
11471}
11472
11473TEST_P(QuicFramerTest, BuildIetfStopSendingPacket) {
11474 // This test is only for version 99.
11475 if (framer_.transport_version() != QUIC_VERSION_99) {
11476 return;
11477 }
11478
11479 QuicPacketHeader header;
11480 header.destination_connection_id = FramerTestConnectionId();
11481 header.reset_flag = false;
11482 header.version_flag = false;
11483 header.packet_number = kPacketNumber;
11484
11485 QuicStopSendingFrame frame;
11486 frame.stream_id = kStreamId;
11487 frame.application_error_code = 0xffff;
11488 QuicFrames frames = {QuicFrame(&frame)};
11489
11490 // clang-format off
11491 unsigned char packet99[] = {
11492 // type (short header, 4 byte packet number)
11493 0x43,
11494 // connection_id
11495 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11496 // packet number
11497 0x12, 0x34, 0x56, 0x78,
11498
11499 // frame type (IETF_STOP_SENDING frame)
11500 0x05,
11501 // Stream ID
11502 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
11503 // Application error code
11504 0xff, 0xff
11505 };
11506 // clang-format on
11507
11508 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11509 ASSERT_TRUE(data != nullptr);
11510
11511 test::CompareCharArraysWithHexError("constructed packet", data->data(),
11512 data->length(), AsChars(packet99),
11513 QUIC_ARRAYSIZE(packet99));
11514}
11515
11516TEST_P(QuicFramerTest, IetfPathChallengeFrame) {
11517 // This test only for version 99.
11518 if (framer_.transport_version() != QUIC_VERSION_99) {
11519 return;
11520 }
zhongyi546cc452019-04-12 15:27:49 -070011521 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011522
11523 // clang-format off
11524 PacketFragments packet99 = {
11525 // type (short header, 4 byte packet number)
11526 {"",
11527 {0x43}},
11528 // connection_id
11529 {"",
11530 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11531 // packet number
11532 {"",
11533 {0x12, 0x34, 0x9A, 0xBC}},
11534 // frame type (IETF_PATH_CHALLENGE)
11535 {"",
11536 {0x1a}},
11537 // data
11538 {"Can not read path challenge data.",
11539 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
11540 };
11541 // clang-format on
11542
11543 std::unique_ptr<QuicEncryptedPacket> encrypted(
11544 AssemblePacketFromFragments(packet99));
11545 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11546
11547 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
11548 ASSERT_TRUE(visitor_.header_.get());
11549 EXPECT_TRUE(CheckDecryption(
11550 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11551 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11552
11553 EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
11554 visitor_.path_challenge_frame_.data_buffer);
11555
11556 CheckFramingBoundaries(packet99, QUIC_INVALID_PATH_CHALLENGE_DATA);
11557}
11558
11559TEST_P(QuicFramerTest, BuildIetfPathChallengePacket) {
11560 // This test only for version 99.
11561 if (framer_.transport_version() != QUIC_VERSION_99) {
11562 return;
11563 }
11564
11565 QuicPacketHeader header;
11566 header.destination_connection_id = FramerTestConnectionId();
11567 header.reset_flag = false;
11568 header.version_flag = false;
11569 header.packet_number = kPacketNumber;
11570
11571 QuicPathChallengeFrame frame;
11572 frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
11573 QuicFrames frames = {QuicFrame(&frame)};
11574
11575 // clang-format off
11576 unsigned char packet99[] = {
11577 // type (short header, 4 byte packet number)
11578 0x43,
11579 // connection_id
11580 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11581 // packet number
11582 0x12, 0x34, 0x56, 0x78,
11583
11584 // frame type (IETF_PATH_CHALLENGE)
11585 0x1a,
11586 // Data
11587 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
11588 };
11589 // clang-format on
11590
11591 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11592 ASSERT_TRUE(data != nullptr);
11593
11594 test::CompareCharArraysWithHexError("constructed packet", data->data(),
11595 data->length(), AsChars(packet99),
11596 QUIC_ARRAYSIZE(packet99));
11597}
11598
11599TEST_P(QuicFramerTest, IetfPathResponseFrame) {
11600 // This test only for version 99.
11601 if (framer_.transport_version() != QUIC_VERSION_99) {
11602 return;
11603 }
zhongyi546cc452019-04-12 15:27:49 -070011604 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011605
11606 // clang-format off
11607 PacketFragments packet99 = {
11608 // type (short header, 4 byte packet number)
11609 {"",
11610 {0x43}},
11611 // connection_id
11612 {"",
11613 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11614 // packet number
11615 {"",
11616 {0x12, 0x34, 0x9A, 0xBC}},
11617 // frame type (IETF_PATH_RESPONSE)
11618 {"",
11619 {0x1b}},
11620 // data
11621 {"Can not read path response data.",
11622 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
11623 };
11624 // clang-format on
11625
11626 std::unique_ptr<QuicEncryptedPacket> encrypted(
11627 AssemblePacketFromFragments(packet99));
11628 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11629
11630 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
11631 ASSERT_TRUE(visitor_.header_.get());
11632 EXPECT_TRUE(CheckDecryption(
11633 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11634 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11635
11636 EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
11637 visitor_.path_response_frame_.data_buffer);
11638
11639 CheckFramingBoundaries(packet99, QUIC_INVALID_PATH_RESPONSE_DATA);
11640}
11641
11642TEST_P(QuicFramerTest, BuildIetfPathResponsePacket) {
11643 // This test only for version 99.
11644 if (framer_.transport_version() != QUIC_VERSION_99) {
11645 return;
11646 }
11647
11648 QuicPacketHeader header;
11649 header.destination_connection_id = FramerTestConnectionId();
11650 header.reset_flag = false;
11651 header.version_flag = false;
11652 header.packet_number = kPacketNumber;
11653
11654 QuicPathResponseFrame frame;
11655 frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
11656 QuicFrames frames = {QuicFrame(&frame)};
11657
11658 // clang-format off
11659 unsigned char packet99[] = {
11660 // type (short header, 4 byte packet number)
11661 0x43,
11662 // connection_id
11663 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11664 // packet number
11665 0x12, 0x34, 0x56, 0x78,
11666
11667 // frame type (IETF_PATH_RESPONSE)
11668 0x1b,
11669 // Data
11670 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
11671 };
11672 // clang-format on
11673
11674 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11675 ASSERT_TRUE(data != nullptr);
11676
11677 test::CompareCharArraysWithHexError("constructed packet", data->data(),
11678 data->length(), AsChars(packet99),
11679 QUIC_ARRAYSIZE(packet99));
11680}
11681
11682TEST_P(QuicFramerTest, GetRetransmittableControlFrameSize) {
11683 QuicRstStreamFrame rst_stream(1, 3, QUIC_STREAM_CANCELLED, 1024);
11684 EXPECT_EQ(QuicFramer::GetRstStreamFrameSize(framer_.transport_version(),
11685 rst_stream),
11686 QuicFramer::GetRetransmittableControlFrameSize(
11687 framer_.transport_version(), QuicFrame(&rst_stream)));
11688
vasilvvc48c8712019-03-11 13:38:16 -070011689 std::string error_detail(2048, 'e');
QUICHE teama6ef0a62019-03-07 20:34:33 -050011690 QuicConnectionCloseFrame connection_close(QUIC_NETWORK_IDLE_TIMEOUT,
11691 error_detail);
fkastenholz72f509b2019-04-10 09:17:49 -070011692 if (framer_.transport_version() == QUIC_VERSION_99) {
11693 connection_close.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
11694 }
11695
fkastenholza037b8b2019-05-07 06:00:05 -070011696 EXPECT_EQ(QuicFramer::GetConnectionCloseFrameSize(framer_.transport_version(),
11697 connection_close),
QUICHE teama6ef0a62019-03-07 20:34:33 -050011698 QuicFramer::GetRetransmittableControlFrameSize(
11699 framer_.transport_version(), QuicFrame(&connection_close)));
11700
11701 QuicGoAwayFrame goaway(2, QUIC_PEER_GOING_AWAY, 3, error_detail);
11702 EXPECT_EQ(QuicFramer::GetMinGoAwayFrameSize() + 256,
11703 QuicFramer::GetRetransmittableControlFrameSize(
11704 framer_.transport_version(), QuicFrame(&goaway)));
11705
11706 QuicWindowUpdateFrame window_update(3, 3, 1024);
11707 EXPECT_EQ(QuicFramer::GetWindowUpdateFrameSize(framer_.transport_version(),
11708 window_update),
11709 QuicFramer::GetRetransmittableControlFrameSize(
11710 framer_.transport_version(), QuicFrame(&window_update)));
11711
11712 QuicBlockedFrame blocked(4, 3, 1024);
11713 EXPECT_EQ(
11714 QuicFramer::GetBlockedFrameSize(framer_.transport_version(), blocked),
11715 QuicFramer::GetRetransmittableControlFrameSize(
11716 framer_.transport_version(), QuicFrame(&blocked)));
11717
11718 if (framer_.transport_version() != QUIC_VERSION_99) {
11719 return;
11720 }
QUICHE teama6ef0a62019-03-07 20:34:33 -050011721
11722 QuicNewConnectionIdFrame new_connection_id(5, TestConnectionId(), 1, 101111);
11723 EXPECT_EQ(QuicFramer::GetNewConnectionIdFrameSize(new_connection_id),
11724 QuicFramer::GetRetransmittableControlFrameSize(
11725 framer_.transport_version(), QuicFrame(&new_connection_id)));
11726
fkastenholz3c4eabf2019-04-22 07:49:59 -070011727 QuicMaxStreamsFrame max_streams(6, 3, /*unidirectional=*/false);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011728 EXPECT_EQ(QuicFramer::GetMaxStreamsFrameSize(framer_.transport_version(),
fkastenholz3c4eabf2019-04-22 07:49:59 -070011729 max_streams),
QUICHE teama6ef0a62019-03-07 20:34:33 -050011730 QuicFramer::GetRetransmittableControlFrameSize(
fkastenholz3c4eabf2019-04-22 07:49:59 -070011731 framer_.transport_version(), QuicFrame(max_streams)));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011732
fkastenholz3c4eabf2019-04-22 07:49:59 -070011733 QuicStreamsBlockedFrame streams_blocked(7, 3, /*unidirectional=*/false);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011734 EXPECT_EQ(QuicFramer::GetStreamsBlockedFrameSize(framer_.transport_version(),
fkastenholz3c4eabf2019-04-22 07:49:59 -070011735 streams_blocked),
QUICHE teama6ef0a62019-03-07 20:34:33 -050011736 QuicFramer::GetRetransmittableControlFrameSize(
fkastenholz3c4eabf2019-04-22 07:49:59 -070011737 framer_.transport_version(), QuicFrame(streams_blocked)));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011738
11739 QuicPathFrameBuffer buffer = {
11740 {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
11741 QuicPathResponseFrame path_response_frame(8, buffer);
11742 EXPECT_EQ(QuicFramer::GetPathResponseFrameSize(path_response_frame),
11743 QuicFramer::GetRetransmittableControlFrameSize(
11744 framer_.transport_version(), QuicFrame(&path_response_frame)));
11745
11746 QuicPathChallengeFrame path_challenge_frame(9, buffer);
11747 EXPECT_EQ(QuicFramer::GetPathChallengeFrameSize(path_challenge_frame),
11748 QuicFramer::GetRetransmittableControlFrameSize(
11749 framer_.transport_version(), QuicFrame(&path_challenge_frame)));
11750
11751 QuicStopSendingFrame stop_sending_frame(10, 3, 20);
11752 EXPECT_EQ(QuicFramer::GetStopSendingFrameSize(stop_sending_frame),
11753 QuicFramer::GetRetransmittableControlFrameSize(
11754 framer_.transport_version(), QuicFrame(&stop_sending_frame)));
11755}
11756
11757// A set of tests to ensure that bad frame-type encodings
11758// are properly detected and handled.
11759// First, four tests to see that unknown frame types generate
11760// a QUIC_INVALID_FRAME_DATA error with detailed information
11761// "Illegal frame type." This regardless of the encoding of the type
11762// (1/2/4/8 bytes).
11763// This only for version 99.
11764TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown1Byte) {
11765 // This test only for version 99.
11766 if (framer_.transport_version() != QUIC_VERSION_99) {
11767 return;
11768 }
zhongyi546cc452019-04-12 15:27:49 -070011769 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011770 // clang-format off
11771 PacketFragments packet = {
11772 // type (short header, 4 byte packet number)
11773 {"",
11774 {0x43}},
11775 // connection_id
11776 {"",
11777 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11778 // packet number
11779 {"",
11780 {0x12, 0x34, 0x9A, 0xBC}},
11781 // frame type (unknown value, single-byte encoding)
11782 {"",
11783 {0x38}}
11784 };
11785 // clang-format on
11786
11787 std::unique_ptr<QuicEncryptedPacket> encrypted(
11788 AssemblePacketFromFragments(packet));
11789
11790 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11791
11792 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
11793 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11794}
11795
11796TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown2Bytes) {
11797 // This test only for version 99.
11798 if (framer_.transport_version() != QUIC_VERSION_99) {
11799 return;
11800 }
zhongyi546cc452019-04-12 15:27:49 -070011801 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011802
11803 // clang-format off
11804 PacketFragments packet = {
11805 // type (short header, 4 byte packet number)
11806 {"",
11807 {0x43}},
11808 // connection_id
11809 {"",
11810 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11811 // packet number
11812 {"",
11813 {0x12, 0x34, 0x9A, 0xBC}},
11814 // frame type (unknown value, two-byte encoding)
11815 {"",
11816 {kVarInt62TwoBytes + 0x01, 0x38}}
11817 };
11818 // clang-format on
11819
11820 std::unique_ptr<QuicEncryptedPacket> encrypted(
11821 AssemblePacketFromFragments(packet));
11822
11823 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11824
11825 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
11826 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11827}
11828
11829TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown4Bytes) {
11830 // This test only for version 99.
11831 if (framer_.transport_version() != QUIC_VERSION_99) {
11832 return;
11833 }
zhongyi546cc452019-04-12 15:27:49 -070011834 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011835
11836 // clang-format off
11837 PacketFragments packet = {
11838 // type (short header, 4 byte packet number)
11839 {"",
11840 {0x43}},
11841 // connection_id
11842 {"",
11843 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11844 // packet number
11845 {"",
11846 {0x12, 0x34, 0x9A, 0xBC}},
11847 // frame type (unknown value, four-byte encoding)
11848 {"",
11849 {kVarInt62FourBytes + 0x01, 0x00, 0x00, 0x38}}
11850 };
11851 // clang-format on
11852
11853 std::unique_ptr<QuicEncryptedPacket> encrypted(
11854 AssemblePacketFromFragments(packet));
11855
11856 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11857
11858 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
11859 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11860}
11861
11862TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown8Bytes) {
11863 // This test only for version 99.
11864 if (framer_.transport_version() != QUIC_VERSION_99) {
11865 return;
11866 }
zhongyi546cc452019-04-12 15:27:49 -070011867 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011868 // clang-format off
11869 PacketFragments packet = {
11870 // type (short header, 4 byte packet number)
11871 {"",
11872 {0x43}},
11873 // connection_id
11874 {"",
11875 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11876 // packet number
11877 {"",
11878 {0x12, 0x34, 0x9A, 0xBC}},
11879 // frame type (unknown value, eight-byte encoding)
11880 {"",
11881 {kVarInt62EightBytes + 0x01, 0x00, 0x00, 0x01, 0x02, 0x34, 0x56, 0x38}}
11882 };
11883 // clang-format on
11884
11885 std::unique_ptr<QuicEncryptedPacket> encrypted(
11886 AssemblePacketFromFragments(packet));
11887
11888 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11889
11890 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
11891 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11892}
11893
11894// Three tests to check that known frame types that are not minimally
11895// encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
11896// information "Frame type not minimally encoded."
11897// Look at the frame-type encoded in 2, 4, and 8 bytes.
11898TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2Bytes) {
11899 // This test only for version 99.
11900 if (framer_.transport_version() != QUIC_VERSION_99) {
11901 return;
11902 }
zhongyi546cc452019-04-12 15:27:49 -070011903 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011904
11905 // clang-format off
11906 PacketFragments packet = {
11907 // type (short header, 4 byte packet number)
11908 {"",
11909 {0x43}},
11910 // connection_id
11911 {"",
11912 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11913 // packet number
11914 {"",
11915 {0x12, 0x34, 0x9A, 0xBC}},
11916 // frame type (Blocked, two-byte encoding)
11917 {"",
11918 {kVarInt62TwoBytes + 0x00, 0x08}}
11919 };
11920 // clang-format on
11921
11922 std::unique_ptr<QuicEncryptedPacket> encrypted(
11923 AssemblePacketFromFragments(packet));
11924
11925 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11926
11927 EXPECT_EQ(IETF_QUIC_PROTOCOL_VIOLATION, framer_.error());
11928 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11929}
11930
11931TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown4Bytes) {
11932 // This test only for version 99.
11933 if (framer_.transport_version() != QUIC_VERSION_99) {
11934 return;
11935 }
zhongyi546cc452019-04-12 15:27:49 -070011936 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011937
11938 // clang-format off
11939 PacketFragments packet = {
11940 // type (short header, 4 byte packet number)
11941 {"",
11942 {0x43}},
11943 // connection_id
11944 {"",
11945 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11946 // packet number
11947 {"",
11948 {0x12, 0x34, 0x9A, 0xBC}},
11949 // frame type (Blocked, four-byte encoding)
11950 {"",
11951 {kVarInt62FourBytes + 0x00, 0x00, 0x00, 0x08}}
11952 };
11953 // clang-format on
11954
11955 std::unique_ptr<QuicEncryptedPacket> encrypted(
11956 AssemblePacketFromFragments(packet));
11957
11958 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11959
11960 EXPECT_EQ(IETF_QUIC_PROTOCOL_VIOLATION, framer_.error());
11961 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11962}
11963
11964TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown8Bytes) {
11965 // This test only for version 99.
11966 if (framer_.transport_version() != QUIC_VERSION_99) {
11967 return;
11968 }
zhongyi546cc452019-04-12 15:27:49 -070011969 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011970 // clang-format off
11971 PacketFragments packet = {
11972 // type (short header, 4 byte packet number)
11973 {"",
11974 {0x43}},
11975 // connection_id
11976 {"",
11977 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11978 // packet number
11979 {"",
11980 {0x12, 0x34, 0x9A, 0xBC}},
11981 // frame type (Blocked, eight-byte encoding)
11982 {"",
11983 {kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08}}
11984 };
11985 // clang-format on
11986
11987 std::unique_ptr<QuicEncryptedPacket> encrypted(
11988 AssemblePacketFromFragments(packet));
11989
11990 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11991
11992 EXPECT_EQ(IETF_QUIC_PROTOCOL_VIOLATION, framer_.error());
11993 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11994}
11995
11996// Tests to check that all known OETF frame types that are not minimally
11997// encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
11998// information "Frame type not minimally encoded."
11999// Just look at 2-byte encoding.
12000TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2BytesAllTypes) {
12001 // This test only for version 99.
12002 if (framer_.transport_version() != QUIC_VERSION_99) {
12003 return;
12004 }
zhongyi546cc452019-04-12 15:27:49 -070012005 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012006
12007 // clang-format off
12008 PacketFragments packets[] = {
12009 {
12010 // type (short header, 4 byte packet number)
12011 {"",
12012 {0x43}},
12013 // connection_id
12014 {"",
12015 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12016 // packet number
12017 {"",
12018 {0x12, 0x34, 0x9A, 0xBC}},
12019 // frame type (two-byte encoding)
12020 {"",
12021 {kVarInt62TwoBytes + 0x00, 0x00}}
12022 },
12023 {
12024 // type (short header, 4 byte packet number)
12025 {"",
12026 {0x43}},
12027 // connection_id
12028 {"",
12029 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12030 // packet number
12031 {"",
12032 {0x12, 0x34, 0x9A, 0xBC}},
12033 // frame type (two-byte encoding)
12034 {"",
12035 {kVarInt62TwoBytes + 0x00, 0x01}}
12036 },
12037 {
12038 // type (short header, 4 byte packet number)
12039 {"",
12040 {0x43}},
12041 // connection_id
12042 {"",
12043 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12044 // packet number
12045 {"",
12046 {0x12, 0x34, 0x9A, 0xBC}},
12047 // frame type (two-byte encoding)
12048 {"",
12049 {kVarInt62TwoBytes + 0x00, 0x02}}
12050 },
12051 {
12052 // type (short header, 4 byte packet number)
12053 {"",
12054 {0x43}},
12055 // connection_id
12056 {"",
12057 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12058 // packet number
12059 {"",
12060 {0x12, 0x34, 0x9A, 0xBC}},
12061 // frame type (two-byte encoding)
12062 {"",
12063 {kVarInt62TwoBytes + 0x00, 0x03}}
12064 },
12065 {
12066 // type (short header, 4 byte packet number)
12067 {"",
12068 {0x43}},
12069 // connection_id
12070 {"",
12071 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12072 // packet number
12073 {"",
12074 {0x12, 0x34, 0x9A, 0xBC}},
12075 // frame type (two-byte encoding)
12076 {"",
12077 {kVarInt62TwoBytes + 0x00, 0x04}}
12078 },
12079 {
12080 // type (short header, 4 byte packet number)
12081 {"",
12082 {0x43}},
12083 // connection_id
12084 {"",
12085 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12086 // packet number
12087 {"",
12088 {0x12, 0x34, 0x9A, 0xBC}},
12089 // frame type (two-byte encoding)
12090 {"",
12091 {kVarInt62TwoBytes + 0x00, 0x05}}
12092 },
12093 {
12094 // type (short header, 4 byte packet number)
12095 {"",
12096 {0x43}},
12097 // connection_id
12098 {"",
12099 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12100 // packet number
12101 {"",
12102 {0x12, 0x34, 0x9A, 0xBC}},
12103 // frame type (two-byte encoding)
12104 {"",
12105 {kVarInt62TwoBytes + 0x00, 0x06}}
12106 },
12107 {
12108 // type (short header, 4 byte packet number)
12109 {"",
12110 {0x43}},
12111 // connection_id
12112 {"",
12113 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12114 // packet number
12115 {"",
12116 {0x12, 0x34, 0x9A, 0xBC}},
12117 // frame type (two-byte encoding)
12118 {"",
12119 {kVarInt62TwoBytes + 0x00, 0x07}}
12120 },
12121 {
12122 // type (short header, 4 byte packet number)
12123 {"",
12124 {0x43}},
12125 // connection_id
12126 {"",
12127 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12128 // packet number
12129 {"",
12130 {0x12, 0x34, 0x9A, 0xBC}},
12131 // frame type (two-byte encoding)
12132 {"",
12133 {kVarInt62TwoBytes + 0x00, 0x08}}
12134 },
12135 {
12136 // type (short header, 4 byte packet number)
12137 {"",
12138 {0x43}},
12139 // connection_id
12140 {"",
12141 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12142 // packet number
12143 {"",
12144 {0x12, 0x34, 0x9A, 0xBC}},
12145 // frame type (two-byte encoding)
12146 {"",
12147 {kVarInt62TwoBytes + 0x00, 0x09}}
12148 },
12149 {
12150 // type (short header, 4 byte packet number)
12151 {"",
12152 {0x43}},
12153 // connection_id
12154 {"",
12155 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12156 // packet number
12157 {"",
12158 {0x12, 0x34, 0x9A, 0xBC}},
12159 // frame type (two-byte encoding)
12160 {"",
12161 {kVarInt62TwoBytes + 0x00, 0x0a}}
12162 },
12163 {
12164 // type (short header, 4 byte packet number)
12165 {"",
12166 {0x43}},
12167 // connection_id
12168 {"",
12169 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12170 // packet number
12171 {"",
12172 {0x12, 0x34, 0x9A, 0xBC}},
12173 // frame type (two-byte encoding)
12174 {"",
12175 {kVarInt62TwoBytes + 0x00, 0x0b}}
12176 },
12177 {
12178 // type (short header, 4 byte packet number)
12179 {"",
12180 {0x43}},
12181 // connection_id
12182 {"",
12183 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12184 // packet number
12185 {"",
12186 {0x12, 0x34, 0x9A, 0xBC}},
12187 // frame type (two-byte encoding)
12188 {"",
12189 {kVarInt62TwoBytes + 0x00, 0x0c}}
12190 },
12191 {
12192 // type (short header, 4 byte packet number)
12193 {"",
12194 {0x43}},
12195 // connection_id
12196 {"",
12197 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12198 // packet number
12199 {"",
12200 {0x12, 0x34, 0x9A, 0xBC}},
12201 // frame type (two-byte encoding)
12202 {"",
12203 {kVarInt62TwoBytes + 0x00, 0x0d}}
12204 },
12205 {
12206 // type (short header, 4 byte packet number)
12207 {"",
12208 {0x43}},
12209 // connection_id
12210 {"",
12211 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12212 // packet number
12213 {"",
12214 {0x12, 0x34, 0x9A, 0xBC}},
12215 // frame type (two-byte encoding)
12216 {"",
12217 {kVarInt62TwoBytes + 0x00, 0x0e}}
12218 },
12219 {
12220 // type (short header, 4 byte packet number)
12221 {"",
12222 {0x43}},
12223 // connection_id
12224 {"",
12225 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12226 // packet number
12227 {"",
12228 {0x12, 0x34, 0x9A, 0xBC}},
12229 // frame type (two-byte encoding)
12230 {"",
12231 {kVarInt62TwoBytes + 0x00, 0x0f}}
12232 },
12233 {
12234 // type (short header, 4 byte packet number)
12235 {"",
12236 {0x43}},
12237 // connection_id
12238 {"",
12239 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12240 // packet number
12241 {"",
12242 {0x12, 0x34, 0x9A, 0xBC}},
12243 // frame type (two-byte encoding)
12244 {"",
12245 {kVarInt62TwoBytes + 0x00, 0x10}}
12246 },
12247 {
12248 // type (short header, 4 byte packet number)
12249 {"",
12250 {0x43}},
12251 // connection_id
12252 {"",
12253 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12254 // packet number
12255 {"",
12256 {0x12, 0x34, 0x9A, 0xBC}},
12257 // frame type (two-byte encoding)
12258 {"",
12259 {kVarInt62TwoBytes + 0x00, 0x11}}
12260 },
12261 {
12262 // type (short header, 4 byte packet number)
12263 {"",
12264 {0x43}},
12265 // connection_id
12266 {"",
12267 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12268 // packet number
12269 {"",
12270 {0x12, 0x34, 0x9A, 0xBC}},
12271 // frame type (two-byte encoding)
12272 {"",
12273 {kVarInt62TwoBytes + 0x00, 0x12}}
12274 },
12275 {
12276 // type (short header, 4 byte packet number)
12277 {"",
12278 {0x43}},
12279 // connection_id
12280 {"",
12281 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12282 // packet number
12283 {"",
12284 {0x12, 0x34, 0x9A, 0xBC}},
12285 // frame type (two-byte encoding)
12286 {"",
12287 {kVarInt62TwoBytes + 0x00, 0x13}}
12288 },
12289 {
12290 // type (short header, 4 byte packet number)
12291 {"",
12292 {0x43}},
12293 // connection_id
12294 {"",
12295 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12296 // packet number
12297 {"",
12298 {0x12, 0x34, 0x9A, 0xBC}},
12299 // frame type (two-byte encoding)
12300 {"",
12301 {kVarInt62TwoBytes + 0x00, 0x14}}
12302 },
12303 {
12304 // type (short header, 4 byte packet number)
12305 {"",
12306 {0x43}},
12307 // connection_id
12308 {"",
12309 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12310 // packet number
12311 {"",
12312 {0x12, 0x34, 0x9A, 0xBC}},
12313 // frame type (two-byte encoding)
12314 {"",
12315 {kVarInt62TwoBytes + 0x00, 0x15}}
12316 },
12317 {
12318 // type (short header, 4 byte packet number)
12319 {"",
12320 {0x43}},
12321 // connection_id
12322 {"",
12323 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12324 // packet number
12325 {"",
12326 {0x12, 0x34, 0x9A, 0xBC}},
12327 // frame type (two-byte encoding)
12328 {"",
12329 {kVarInt62TwoBytes + 0x00, 0x16}}
12330 },
12331 {
12332 // type (short header, 4 byte packet number)
12333 {"",
12334 {0x43}},
12335 // connection_id
12336 {"",
12337 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12338 // packet number
12339 {"",
12340 {0x12, 0x34, 0x9A, 0xBC}},
12341 // frame type (two-byte encoding)
12342 {"",
12343 {kVarInt62TwoBytes + 0x00, 0x17}}
12344 },
12345 {
12346 // type (short header, 4 byte packet number)
12347 {"",
12348 {0x43}},
12349 // connection_id
12350 {"",
12351 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12352 // packet number
12353 {"",
12354 {0x12, 0x34, 0x9A, 0xBC}},
12355 // frame type (two-byte encoding)
12356 {"",
12357 {kVarInt62TwoBytes + 0x00, 0x18}}
12358 },
12359 {
12360 // type (short header, 4 byte packet number)
12361 {"",
12362 {0x43}},
12363 // connection_id
12364 {"",
12365 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12366 // packet number
12367 {"",
12368 {0x12, 0x34, 0x9A, 0xBC}},
12369 // frame type (two-byte encoding)
12370 {"",
12371 {kVarInt62TwoBytes + 0x00, 0x20}}
12372 },
12373 {
12374 // type (short header, 4 byte packet number)
12375 {"",
12376 {0x43}},
12377 // connection_id
12378 {"",
12379 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12380 // packet number
12381 {"",
12382 {0x12, 0x34, 0x9A, 0xBC}},
12383 // frame type (two-byte encoding)
12384 {"",
12385 {kVarInt62TwoBytes + 0x00, 0x21}}
12386 },
12387 };
12388 // clang-format on
12389
12390 for (PacketFragments& packet : packets) {
12391 std::unique_ptr<QuicEncryptedPacket> encrypted(
12392 AssemblePacketFromFragments(packet));
12393
12394 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
12395
12396 EXPECT_EQ(IETF_QUIC_PROTOCOL_VIOLATION, framer_.error());
12397 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
12398 }
12399}
12400
12401TEST_P(QuicFramerTest, RetireConnectionIdFrame) {
12402 if (framer_.transport_version() != QUIC_VERSION_99) {
12403 // This frame is only for version 99.
12404 return;
12405 }
zhongyi546cc452019-04-12 15:27:49 -070012406 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012407 // clang-format off
12408 PacketFragments packet99 = {
12409 // type (short header, 4 byte packet number)
12410 {"",
12411 {0x43}},
12412 // connection_id
12413 {"",
12414 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12415 // packet number
12416 {"",
12417 {0x12, 0x34, 0x56, 0x78}},
12418 // frame type (IETF_RETIRE_CONNECTION_ID frame)
12419 {"",
12420 {0x19}},
12421 // Sequence number
12422 {"Unable to read retire connection ID frame sequence number.",
12423 {kVarInt62TwoBytes + 0x11, 0x22}}
12424 };
12425 // clang-format on
12426
12427 std::unique_ptr<QuicEncryptedPacket> encrypted(
12428 AssemblePacketFromFragments(packet99));
12429 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
12430
12431 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
12432 ASSERT_TRUE(visitor_.header_.get());
12433 EXPECT_TRUE(CheckDecryption(
12434 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
12435 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
12436
12437 EXPECT_EQ(0u, visitor_.stream_frames_.size());
12438
12439 EXPECT_EQ(0x1122u, visitor_.retire_connection_id_.sequence_number);
12440
12441 ASSERT_EQ(0u, visitor_.ack_frames_.size());
12442
12443 CheckFramingBoundaries(packet99, QUIC_INVALID_RETIRE_CONNECTION_ID_DATA);
12444}
12445
12446TEST_P(QuicFramerTest, BuildRetireConnectionIdFramePacket) {
12447 if (framer_.transport_version() != QUIC_VERSION_99) {
12448 // This frame is only for version 99.
12449 return;
12450 }
12451 QuicPacketHeader header;
12452 header.destination_connection_id = FramerTestConnectionId();
12453 header.reset_flag = false;
12454 header.version_flag = false;
12455 header.packet_number = kPacketNumber;
12456
12457 QuicRetireConnectionIdFrame frame;
12458 frame.sequence_number = 0x1122;
12459
12460 QuicFrames frames = {QuicFrame(&frame)};
12461
12462 // clang-format off
12463 unsigned char packet99[] = {
12464 // type (short header, 4 byte packet number)
12465 0x43,
12466 // connection_id
12467 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12468 // packet number
12469 0x12, 0x34, 0x56, 0x78,
12470
12471 // frame type (IETF_RETIRE_CONNECTION_ID frame)
12472 0x19,
12473 // sequence number
12474 kVarInt62TwoBytes + 0x11, 0x22
12475 };
12476 // clang-format on
12477
12478 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
12479 ASSERT_TRUE(data != nullptr);
12480
12481 test::CompareCharArraysWithHexError("constructed packet", data->data(),
12482 data->length(), AsChars(packet99),
12483 QUIC_ARRAYSIZE(packet99));
12484}
12485
12486TEST_P(QuicFramerTest, AckFrameWithInvalidLargestObserved) {
zhongyi546cc452019-04-12 15:27:49 -070012487 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012488 // clang-format off
12489 unsigned char packet[] = {
12490 // public flags (8 byte connection_id)
12491 0x2C,
12492 // connection_id
12493 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12494 // packet number
12495 0x12, 0x34, 0x56, 0x78,
12496
12497 // frame type (ack frame)
12498 0x45,
12499 // largest observed
12500 0x00, 0x00,
12501 // Zero delta time.
12502 0x00, 0x00,
12503 // first ack block length.
12504 0x00, 0x00,
12505 // num timestamps.
12506 0x00
12507 };
12508
12509 unsigned char packet44[] = {
12510 // type (short header, 4 byte packet number)
12511 0x32,
12512 // connection_id
12513 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12514 // packet number
12515 0x12, 0x34, 0x56, 0x78,
12516
12517 // frame type (ack frame)
12518 0x45,
12519 // largest observed
12520 0x00, 0x00,
12521 // Zero delta time.
12522 0x00, 0x00,
12523 // first ack block length.
12524 0x00, 0x00,
12525 // num timestamps.
12526 0x00
12527 };
12528
12529 unsigned char packet46[] = {
12530 // type (short header, 4 byte packet number)
12531 0x43,
12532 // connection_id
12533 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12534 // packet number
12535 0x12, 0x34, 0x56, 0x78,
12536
12537 // frame type (ack frame)
12538 0x45,
12539 // largest observed
12540 0x00, 0x00,
12541 // Zero delta time.
12542 0x00, 0x00,
12543 // first ack block length.
12544 0x00, 0x00,
12545 // num timestamps.
12546 0x00
12547 };
12548
12549 unsigned char packet99[] = {
12550 // type (short header, 4 byte packet number)
12551 0x43,
12552 // connection_id
12553 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12554 // packet number
12555 0x12, 0x34, 0x56, 0x78,
12556
12557 // frame type (IETF_ACK frame)
12558 0x02,
12559 // Largest acked
12560 kVarInt62OneByte + 0x00,
12561 // Zero delta time.
12562 kVarInt62OneByte + 0x00,
12563 // Ack block count 0
12564 kVarInt62OneByte + 0x00,
12565 // First ack block length
12566 kVarInt62OneByte + 0x00,
12567 };
12568 // clang-format on
12569
12570 unsigned char* p = packet;
12571 size_t p_size = QUIC_ARRAYSIZE(packet);
12572 if (framer_.transport_version() == QUIC_VERSION_99) {
12573 p = packet99;
12574 p_size = QUIC_ARRAYSIZE(packet99);
12575 } else if (framer_.transport_version() > QUIC_VERSION_44) {
12576 p = packet46;
12577 } else if (framer_.transport_version() > QUIC_VERSION_43) {
12578 p = packet44;
12579 p_size = QUIC_ARRAYSIZE(packet44);
12580 }
12581
12582 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
12583 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12584 EXPECT_EQ(framer_.detailed_error(), "Largest acked is 0.");
12585}
12586
12587TEST_P(QuicFramerTest, FirstAckBlockJustUnderFlow) {
zhongyi546cc452019-04-12 15:27:49 -070012588 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012589 // clang-format off
12590 unsigned char packet[] = {
12591 // public flags (8 byte connection_id)
12592 0x2C,
12593 // connection_id
12594 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12595 // packet number
12596 0x12, 0x34, 0x56, 0x78,
12597
12598 // frame type (ack frame)
12599 0x45,
12600 // largest observed
12601 0x00, 0x02,
12602 // Zero delta time.
12603 0x00, 0x00,
12604 // first ack block length.
12605 0x00, 0x03,
12606 // num timestamps.
12607 0x00
12608 };
12609
12610 unsigned char packet44[] = {
12611 // type (short header, 4 byte packet number)
12612 0x32,
12613 // connection_id
12614 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12615 // packet number
12616 0x12, 0x34, 0x56, 0x78,
12617
12618 // frame type (ack frame)
12619 0x45,
12620 // largest observed
12621 0x00, 0x02,
12622 // Zero delta time.
12623 0x00, 0x00,
12624 // first ack block length.
12625 0x00, 0x03,
12626 // num timestamps.
12627 0x00
12628 };
12629
12630 unsigned char packet46[] = {
12631 // type (short header, 4 byte packet number)
12632 0x43,
12633 // connection_id
12634 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12635 // packet number
12636 0x12, 0x34, 0x56, 0x78,
12637
12638 // frame type (ack frame)
12639 0x45,
12640 // largest observed
12641 0x00, 0x02,
12642 // Zero delta time.
12643 0x00, 0x00,
12644 // first ack block length.
12645 0x00, 0x03,
12646 // num timestamps.
12647 0x00
12648 };
12649
12650 unsigned char packet99[] = {
12651 // type (short header, 4 byte packet number)
12652 0x43,
12653 // connection_id
12654 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12655 // packet number
12656 0x12, 0x34, 0x56, 0x78,
12657
12658 // frame type (IETF_ACK frame)
12659 0x02,
12660 // Largest acked
12661 kVarInt62OneByte + 0x02,
12662 // Zero delta time.
12663 kVarInt62OneByte + 0x00,
12664 // Ack block count 0
12665 kVarInt62OneByte + 0x00,
12666 // First ack block length
12667 kVarInt62OneByte + 0x02,
12668 };
12669 // clang-format on
12670
12671 unsigned char* p = packet;
12672 size_t p_size = QUIC_ARRAYSIZE(packet);
12673 if (framer_.transport_version() == QUIC_VERSION_99) {
12674 p = packet99;
12675 p_size = QUIC_ARRAYSIZE(packet99);
12676 } else if (framer_.transport_version() > QUIC_VERSION_44) {
12677 p = packet46;
12678 p_size = QUIC_ARRAYSIZE(packet46);
12679 } else if (framer_.transport_version() > QUIC_VERSION_43) {
12680 p = packet44;
12681 p_size = QUIC_ARRAYSIZE(packet44);
12682 }
12683
12684 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
12685 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12686 EXPECT_EQ(framer_.detailed_error(),
12687 "Underflow with first ack block length 3 largest acked is 2.");
12688}
12689
12690TEST_P(QuicFramerTest, ThirdAckBlockJustUnderflow) {
zhongyi546cc452019-04-12 15:27:49 -070012691 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012692 // clang-format off
12693 unsigned char packet[] = {
12694 // public flags (8 byte connection_id)
12695 0x2C,
12696 // connection_id
12697 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12698 // packet number
12699 0x12, 0x34, 0x56, 0x78,
12700
12701 // frame type (ack frame)
12702 0x60,
12703 // largest observed
12704 0x0A,
12705 // Zero delta time.
12706 0x00, 0x00,
12707 // Num of ack blocks
12708 0x02,
12709 // first ack block length.
12710 0x02,
12711 // gap to next block
12712 0x01,
12713 // ack block length
12714 0x01,
12715 // gap to next block
12716 0x01,
12717 // ack block length
12718 0x06,
12719 // num timestamps.
12720 0x00
12721 };
12722
12723 unsigned char packet44[] = {
12724 // type (short header, 4 byte packet number)
12725 0x32,
12726 // connection_id
12727 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12728 // packet number
12729 0x12, 0x34, 0x56, 0x78,
12730
12731 // frame type (ack frame)
12732 0x60,
12733 // largest observed
12734 0x0A,
12735 // Zero delta time.
12736 0x00, 0x00,
12737 // Num of ack blocks
12738 0x02,
12739 // first ack block length.
12740 0x02,
12741 // gap to next block
12742 0x01,
12743 // ack block length
12744 0x01,
12745 // gap to next block
12746 0x01,
12747 // ack block length
12748 0x06,
12749 // num timestamps.
12750 0x00
12751 };
12752
12753 unsigned char packet46[] = {
12754 // type (short header, 4 byte packet number)
12755 0x43,
12756 // connection_id
12757 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12758 // packet number
12759 0x12, 0x34, 0x56, 0x78,
12760
12761 // frame type (ack frame)
12762 0x60,
12763 // largest observed
12764 0x0A,
12765 // Zero delta time.
12766 0x00, 0x00,
12767 // Num of ack blocks
12768 0x02,
12769 // first ack block length.
12770 0x02,
12771 // gap to next block
12772 0x01,
12773 // ack block length
12774 0x01,
12775 // gap to next block
12776 0x01,
12777 // ack block length
12778 0x06,
12779 // num timestamps.
12780 0x00
12781 };
12782
12783 unsigned char packet99[] = {
12784 // type (short header, 4 byte packet number)
12785 0x43,
12786 // connection_id
12787 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12788 // packet number
12789 0x12, 0x34, 0x56, 0x78,
12790
12791 // frame type (IETF_ACK frame)
12792 0x02,
12793 // Largest acked
12794 kVarInt62OneByte + 0x0A,
12795 // Zero delta time.
12796 kVarInt62OneByte + 0x00,
12797 // Ack block count 2
12798 kVarInt62OneByte + 0x02,
12799 // First ack block length
12800 kVarInt62OneByte + 0x01,
12801 // gap to next block length
12802 kVarInt62OneByte + 0x00,
12803 // ack block length
12804 kVarInt62OneByte + 0x00,
12805 // gap to next block length
12806 kVarInt62OneByte + 0x00,
12807 // ack block length
12808 kVarInt62OneByte + 0x05,
12809 };
12810 // clang-format on
12811
12812 unsigned char* p = packet;
12813 size_t p_size = QUIC_ARRAYSIZE(packet);
12814 if (framer_.transport_version() == QUIC_VERSION_99) {
12815 p = packet99;
12816 p_size = QUIC_ARRAYSIZE(packet99);
12817 } else if (framer_.transport_version() > QUIC_VERSION_44) {
12818 p = packet46;
12819 p_size = QUIC_ARRAYSIZE(packet46);
12820 } else if (framer_.transport_version() > QUIC_VERSION_43) {
12821 p = packet44;
12822 p_size = QUIC_ARRAYSIZE(packet44);
12823 }
12824
12825 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
12826 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12827 if (framer_.transport_version() == QUIC_VERSION_99) {
12828 EXPECT_EQ(framer_.detailed_error(),
12829 "Underflow with ack block length 6 latest ack block end is 5.");
12830 } else {
12831 EXPECT_EQ(framer_.detailed_error(),
12832 "Underflow with ack block length 6, end of block is 6.");
12833 }
12834}
12835
12836TEST_P(QuicFramerTest, CoalescedPacket) {
12837 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12838 return;
12839 }
zhongyi546cc452019-04-12 15:27:49 -070012840 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012841 // clang-format off
12842 unsigned char packet[] = {
12843 // first coalesced packet
12844 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12845 // 4-byte packet number)
12846 0xD3,
12847 // version
12848 QUIC_VERSION_BYTES,
12849 // destination connection ID length
12850 0x50,
12851 // destination connection ID
12852 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12853 // long header packet length
12854 0x1E,
12855 // packet number
12856 0x12, 0x34, 0x56, 0x78,
12857 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12858 0x08 | 0x01 | 0x02 | 0x04,
12859 // stream id
12860 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12861 // offset
12862 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12863 0x32, 0x10, 0x76, 0x54,
12864 // data length
12865 kVarInt62OneByte + 0x0c,
12866 // data
12867 'h', 'e', 'l', 'l',
12868 'o', ' ', 'w', 'o',
12869 'r', 'l', 'd', '!',
12870 // second coalesced packet
12871 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12872 // 4-byte packet number)
12873 0xD3,
12874 // version
12875 QUIC_VERSION_BYTES,
12876 // destination connection ID length
12877 0x50,
12878 // destination connection ID
12879 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12880 // long header packet length
12881 0x1E,
12882 // packet number
12883 0x12, 0x34, 0x56, 0x79,
12884 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12885 0x08 | 0x01 | 0x02 | 0x04,
12886 // stream id
12887 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12888 // offset
12889 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12890 0x32, 0x10, 0x76, 0x54,
12891 // data length
12892 kVarInt62OneByte + 0x0c,
12893 // data
12894 'H', 'E', 'L', 'L',
12895 'O', '_', 'W', 'O',
12896 'R', 'L', 'D', '?',
12897 };
12898 // clang-format on
12899
12900 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
12901 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12902
12903 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
12904 ASSERT_TRUE(visitor_.header_.get());
12905
12906 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12907 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12908
12909 // Stream ID should be the last 3 bytes of kStreamId.
12910 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12911 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12912 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12913 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12914
12915 ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
12916 EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
12917
12918 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
12919 ASSERT_TRUE(visitor_.header_.get());
12920
12921 ASSERT_EQ(2u, visitor_.stream_frames_.size());
12922 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12923
12924 // Stream ID should be the last 3 bytes of kStreamId.
12925 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[1]->stream_id);
12926 EXPECT_TRUE(visitor_.stream_frames_[1]->fin);
12927 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[1]->offset);
12928 CheckStreamFrameData("HELLO_WORLD?", visitor_.stream_frames_[1].get());
12929}
12930
12931TEST_P(QuicFramerTest, MismatchedCoalescedPacket) {
12932 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12933 return;
12934 }
zhongyi546cc452019-04-12 15:27:49 -070012935 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012936 // clang-format off
12937 unsigned char packet[] = {
12938 // first coalesced packet
12939 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12940 // 4-byte packet number)
12941 0xD3,
12942 // version
12943 QUIC_VERSION_BYTES,
12944 // destination connection ID length
12945 0x50,
12946 // destination connection ID
12947 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12948 // long header packet length
12949 0x1E,
12950 // packet number
12951 0x12, 0x34, 0x56, 0x78,
12952 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12953 0x08 | 0x01 | 0x02 | 0x04,
12954 // stream id
12955 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12956 // offset
12957 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12958 0x32, 0x10, 0x76, 0x54,
12959 // data length
12960 kVarInt62OneByte + 0x0c,
12961 // data
12962 'h', 'e', 'l', 'l',
12963 'o', ' ', 'w', 'o',
12964 'r', 'l', 'd', '!',
12965 // second coalesced packet
12966 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12967 // 4-byte packet number)
12968 0xD3,
12969 // version
12970 QUIC_VERSION_BYTES,
12971 // destination connection ID length
12972 0x50,
12973 // destination connection ID
12974 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
12975 // long header packet length
12976 0x1E,
12977 // packet number
12978 0x12, 0x34, 0x56, 0x79,
12979 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12980 0x08 | 0x01 | 0x02 | 0x04,
12981 // stream id
12982 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12983 // offset
12984 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12985 0x32, 0x10, 0x76, 0x54,
12986 // data length
12987 kVarInt62OneByte + 0x0c,
12988 // data
12989 'H', 'E', 'L', 'L',
12990 'O', '_', 'W', 'O',
12991 'R', 'L', 'D', '?',
12992 };
12993 // clang-format on
12994
12995 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
12996 EXPECT_QUIC_PEER_BUG(EXPECT_TRUE(framer_.ProcessPacket(encrypted)),
12997 "Server: Received mismatched coalesced header.*");
12998
12999 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
13000 ASSERT_TRUE(visitor_.header_.get());
13001
13002 ASSERT_EQ(1u, visitor_.stream_frames_.size());
13003 EXPECT_EQ(0u, visitor_.ack_frames_.size());
13004
13005 // Stream ID should be the last 3 bytes of kStreamId.
13006 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
13007 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
13008 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
13009 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
13010
13011 ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
13012}
13013
13014TEST_P(QuicFramerTest, InvalidCoalescedPacket) {
13015 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
13016 return;
13017 }
zhongyi546cc452019-04-12 15:27:49 -070013018 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050013019 // clang-format off
13020 unsigned char packet[] = {
13021 // first coalesced packet
13022 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13023 // 4-byte packet number)
13024 0xD3,
13025 // version
13026 QUIC_VERSION_BYTES,
13027 // destination connection ID length
13028 0x50,
13029 // destination connection ID
13030 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13031 // long header packet length
13032 0x1E,
13033 // packet number
13034 0x12, 0x34, 0x56, 0x78,
13035 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
13036 0x08 | 0x01 | 0x02 | 0x04,
13037 // stream id
13038 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
13039 // offset
13040 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
13041 0x32, 0x10, 0x76, 0x54,
13042 // data length
13043 kVarInt62OneByte + 0x0c,
13044 // data
13045 'h', 'e', 'l', 'l',
13046 'o', ' ', 'w', 'o',
13047 'r', 'l', 'd', '!',
13048 // second coalesced packet
13049 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13050 // 4-byte packet number)
13051 0xD3,
13052 // version would be here but we cut off the invalid coalesced header.
13053 };
13054 // clang-format on
13055
13056 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
13057 EXPECT_QUIC_PEER_BUG(EXPECT_TRUE(framer_.ProcessPacket(encrypted)),
13058 "Server: Failed to parse received coalesced header.*");
13059
13060 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
13061 ASSERT_TRUE(visitor_.header_.get());
13062
13063 ASSERT_EQ(1u, visitor_.stream_frames_.size());
13064 EXPECT_EQ(0u, visitor_.ack_frames_.size());
13065
13066 // Stream ID should be the last 3 bytes of kStreamId.
13067 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
13068 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
13069 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
13070 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
13071
13072 ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
13073}
13074
dschinazie0df3f72019-05-06 16:37:51 -070013075TEST_P(QuicFramerTest, ClientReceivesInvalidVersion) {
13076 if (framer_.transport_version() < QUIC_VERSION_44) {
13077 return;
13078 }
13079 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13080
13081 // clang-format off
13082 unsigned char packet[] = {
13083 // public flags (long header with packet type INITIAL)
13084 0xFF,
13085 // version that is different from the framer's version
13086 'Q', '0', '4', '3',
13087 // connection ID lengths
13088 0x05,
13089 // source connection ID
13090 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13091 // packet number
13092 0x01,
13093 // padding frame
13094 0x00,
13095 };
13096 // clang-format on
13097
13098 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
13099 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
13100
13101 EXPECT_EQ(QUIC_INVALID_VERSION, framer_.error());
13102 EXPECT_EQ("Client received unexpected version.", framer_.detailed_error());
13103}
13104
QUICHE teama6ef0a62019-03-07 20:34:33 -050013105TEST_P(QuicFramerTest, PacketHeaderWithVariableLengthConnectionId) {
13106 if (framer_.transport_version() < QUIC_VERSION_46) {
13107 return;
13108 }
zhongyi546cc452019-04-12 15:27:49 -070013109 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050013110 char connection_id_bytes[9] = {0xFE, 0xDC, 0xBA, 0x98, 0x76,
13111 0x54, 0x32, 0x10, 0x42};
13112 QuicConnectionId connection_id(connection_id_bytes,
13113 sizeof(connection_id_bytes));
13114 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
13115 QuicFramerPeer::SetExpectedConnectionIDLength(&framer_,
13116 connection_id.length());
13117
13118 // clang-format off
13119 PacketFragments packet = {
13120 // type (8 byte connection_id and 1 byte packet number)
13121 {"Unable to read type.",
13122 {0x40}},
13123 // connection_id
13124 {"Unable to read Destination ConnectionId.",
13125 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
13126 // packet number
13127 {"Unable to read packet number.",
13128 {0x78}},
13129 };
nharper55fa6132019-05-07 19:37:21 -070013130
13131 PacketFragments packet_with_padding = {
13132 // type (8 byte connection_id and 1 byte packet number)
13133 {"Unable to read type.",
13134 {0x40}},
13135 // connection_id
13136 {"Unable to read Destination ConnectionId.",
13137 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
13138 // packet number
13139 {"",
13140 {0x78}},
13141 // padding
13142 {"", {0x00, 0x00, 0x00}},
13143 };
QUICHE teama6ef0a62019-03-07 20:34:33 -050013144 // clang-format on
13145
nharper55fa6132019-05-07 19:37:21 -070013146 PacketFragments& fragments =
13147 framer_.version().HasHeaderProtection() ? packet_with_padding : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -050013148 std::unique_ptr<QuicEncryptedPacket> encrypted(
nharper55fa6132019-05-07 19:37:21 -070013149 AssemblePacketFromFragments(fragments));
13150 if (framer_.version().HasHeaderProtection()) {
13151 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13152 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
13153 } else {
13154 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13155 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
13156 }
QUICHE teama6ef0a62019-03-07 20:34:33 -050013157 ASSERT_TRUE(visitor_.header_.get());
13158 EXPECT_EQ(connection_id, visitor_.header_->destination_connection_id);
13159 EXPECT_FALSE(visitor_.header_->reset_flag);
13160 EXPECT_FALSE(visitor_.header_->version_flag);
13161 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
13162 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
13163
nharper55fa6132019-05-07 19:37:21 -070013164 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
QUICHE teama6ef0a62019-03-07 20:34:33 -050013165}
13166
QUICHE team4d9d6292019-03-11 14:25:33 -070013167TEST_P(QuicFramerTest, UpdateExpectedConnectionIdLength) {
13168 if (framer_.transport_version() < QUIC_VERSION_46) {
13169 return;
13170 }
zhongyi546cc452019-04-12 15:27:49 -070013171 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE team4d9d6292019-03-11 14:25:33 -070013172 framer_.SetShouldUpdateExpectedConnectionIdLength(true);
13173
13174 // clang-format off
13175 unsigned char long_header_packet[] = {
13176 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13177 // 4-byte packet number)
13178 0xD3,
13179 // version
13180 QUIC_VERSION_BYTES,
13181 // destination connection ID length
13182 0x60,
13183 // destination connection ID
13184 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42,
13185 // packet number
13186 0x12, 0x34, 0x56, 0x78,
13187 // padding frame
13188 0x00,
13189 };
13190 unsigned char long_header_packet99[] = {
13191 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13192 // 4-byte packet number)
13193 0xD3,
13194 // version
13195 QUIC_VERSION_BYTES,
13196 // destination connection ID length
13197 0x60,
13198 // destination connection ID
13199 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42,
13200 // long header packet length
13201 0x05,
13202 // packet number
13203 0x12, 0x34, 0x56, 0x78,
13204 // padding frame
13205 0x00,
13206 };
13207 // clang-format on
13208
13209 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
13210 EXPECT_TRUE(framer_.ProcessPacket(
13211 QuicEncryptedPacket(AsChars(long_header_packet),
13212 QUIC_ARRAYSIZE(long_header_packet), false)));
13213 } else {
13214 EXPECT_TRUE(framer_.ProcessPacket(
13215 QuicEncryptedPacket(AsChars(long_header_packet99),
13216 QUIC_ARRAYSIZE(long_header_packet99), false)));
13217 }
13218
13219 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
13220 ASSERT_TRUE(visitor_.header_.get());
QUICHE team8e2e4532019-03-14 14:37:56 -070013221 EXPECT_EQ(visitor_.header_.get()->destination_connection_id,
13222 FramerTestConnectionIdNineBytes());
QUICHE team4d9d6292019-03-11 14:25:33 -070013223 EXPECT_EQ(visitor_.header_.get()->packet_number,
13224 QuicPacketNumber(UINT64_C(0x12345678)));
13225
zhongyi546cc452019-04-12 15:27:49 -070013226 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE team4d9d6292019-03-11 14:25:33 -070013227 // clang-format off
13228 unsigned char short_header_packet[] = {
13229 // type (short header, 4 byte packet number)
13230 0x43,
13231 // connection_id
13232 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42,
13233 // packet number
13234 0x13, 0x37, 0x42, 0x33,
13235 // padding frame
13236 0x00,
13237 };
13238 // clang-format on
13239
13240 QuicEncryptedPacket short_header_encrypted(
13241 AsChars(short_header_packet), QUIC_ARRAYSIZE(short_header_packet), false);
13242 EXPECT_TRUE(framer_.ProcessPacket(short_header_encrypted));
13243
13244 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
13245 ASSERT_TRUE(visitor_.header_.get());
QUICHE team8e2e4532019-03-14 14:37:56 -070013246 EXPECT_EQ(visitor_.header_.get()->destination_connection_id,
13247 FramerTestConnectionIdNineBytes());
QUICHE team4d9d6292019-03-11 14:25:33 -070013248 EXPECT_EQ(visitor_.header_.get()->packet_number,
13249 QuicPacketNumber(UINT64_C(0x13374233)));
13250}
13251
QUICHE team10b22a12019-03-21 15:31:42 -070013252TEST_P(QuicFramerTest, MultiplePacketNumberSpaces) {
13253 if (framer_.transport_version() < QUIC_VERSION_46) {
13254 return;
13255 }
13256 framer_.SetShouldUpdateExpectedConnectionIdLength(true);
13257 framer_.EnableMultiplePacketNumberSpacesSupport();
13258
13259 // clang-format off
13260 unsigned char long_header_packet[] = {
13261 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13262 // 4-byte packet number)
13263 0xD3,
13264 // version
13265 QUIC_VERSION_BYTES,
13266 // destination connection ID length
13267 0x60,
13268 // destination connection ID
13269 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42,
13270 // packet number
13271 0x12, 0x34, 0x56, 0x78,
13272 // padding frame
13273 0x00,
13274 };
13275 unsigned char long_header_packet99[] = {
13276 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13277 // 4-byte packet number)
13278 0xD3,
13279 // version
13280 QUIC_VERSION_BYTES,
13281 // destination connection ID length
13282 0x60,
13283 // destination connection ID
13284 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42,
13285 // long header packet length
13286 0x05,
13287 // packet number
13288 0x12, 0x34, 0x56, 0x78,
13289 // padding frame
13290 0x00,
13291 };
13292 // clang-format on
13293
zhongyi546cc452019-04-12 15:27:49 -070013294 if (framer_.version().KnowsWhichDecrypterToUse()) {
13295 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
13296 QuicMakeUnique<TestDecrypter>());
13297 framer_.RemoveDecrypter(ENCRYPTION_INITIAL);
13298 } else {
13299 framer_.SetDecrypter(ENCRYPTION_ZERO_RTT, QuicMakeUnique<TestDecrypter>());
13300 }
QUICHE team10b22a12019-03-21 15:31:42 -070013301 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
13302 EXPECT_TRUE(framer_.ProcessPacket(
13303 QuicEncryptedPacket(AsChars(long_header_packet),
13304 QUIC_ARRAYSIZE(long_header_packet), false)));
13305 } else {
13306 EXPECT_TRUE(framer_.ProcessPacket(
13307 QuicEncryptedPacket(AsChars(long_header_packet99),
13308 QUIC_ARRAYSIZE(long_header_packet99), false)));
13309 }
13310
13311 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
13312 EXPECT_FALSE(
13313 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
13314 .IsInitialized());
13315 EXPECT_FALSE(
13316 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
13317 .IsInitialized());
13318 EXPECT_EQ(kPacketNumber, QuicFramerPeer::GetLargestDecryptedPacketNumber(
13319 &framer_, APPLICATION_DATA));
13320
13321 // clang-format off
13322 unsigned char short_header_packet[] = {
13323 // type (short header, 1 byte packet number)
13324 0x40,
13325 // connection_id
13326 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42,
13327 // packet number
13328 0x79,
13329 // padding frame
nharper55fa6132019-05-07 19:37:21 -070013330 0x00, 0x00, 0x00,
QUICHE team10b22a12019-03-21 15:31:42 -070013331 };
13332 // clang-format on
13333
13334 QuicEncryptedPacket short_header_encrypted(
13335 AsChars(short_header_packet), QUIC_ARRAYSIZE(short_header_packet), false);
zhongyi546cc452019-04-12 15:27:49 -070013336 if (framer_.version().KnowsWhichDecrypterToUse()) {
13337 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13338 QuicMakeUnique<TestDecrypter>());
13339 framer_.RemoveDecrypter(ENCRYPTION_ZERO_RTT);
13340 } else {
13341 framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
13342 QuicMakeUnique<TestDecrypter>());
13343 }
QUICHE team10b22a12019-03-21 15:31:42 -070013344 EXPECT_TRUE(framer_.ProcessPacket(short_header_encrypted));
13345
13346 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
13347 EXPECT_FALSE(
13348 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
13349 .IsInitialized());
13350 EXPECT_FALSE(
13351 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
13352 .IsInitialized());
13353 EXPECT_EQ(kPacketNumber + 1, QuicFramerPeer::GetLargestDecryptedPacketNumber(
13354 &framer_, APPLICATION_DATA));
13355}
13356
nharper2ceb97c2019-04-19 11:38:59 -070013357TEST_P(QuicFramerTest, IetfRetryPacketRejected) {
dschinazi244f6dc2019-05-06 15:45:16 -070013358 if (!framer_.version().KnowsWhichDecrypterToUse() ||
13359 framer_.version().SupportsRetry()) {
nharper2ceb97c2019-04-19 11:38:59 -070013360 return;
13361 }
13362
13363 // clang-format off
13364 PacketFragments packet = {
13365 // public flags (IETF Retry packet, 0-length original destination CID)
13366 {"Unable to read type.",
13367 {0xf0}},
13368 // version tag
13369 {"Unable to read protocol version.",
13370 {QUIC_VERSION_BYTES}},
13371 // connection_id length
nharper9bb83462019-05-01 10:53:22 -070013372 {"Illegal long header type value.",
13373 {0x00}},
13374 };
13375 // clang-format on
13376
13377 // clang-format off
13378 PacketFragments packet45 = {
13379 // public flags (IETF Retry packet, 0-length original destination CID)
13380 {"Unable to read type.",
13381 {0xf0}},
13382 // version tag
13383 {"Unable to read protocol version.",
13384 {QUIC_VERSION_BYTES}},
13385 // connection_id length
dschinazi244f6dc2019-05-06 15:45:16 -070013386 {"RETRY not supported in this version.",
nharper2ceb97c2019-04-19 11:38:59 -070013387 {0x00}},
13388 };
13389 // clang-format on
13390
nharper9bb83462019-05-01 10:53:22 -070013391 PacketFragments& fragments =
13392 framer_.transport_version() > QUIC_VERSION_44 ? packet45 : packet;
nharper2ceb97c2019-04-19 11:38:59 -070013393 std::unique_ptr<QuicEncryptedPacket> encrypted(
nharper9bb83462019-05-01 10:53:22 -070013394 AssemblePacketFromFragments(fragments));
nharper2ceb97c2019-04-19 11:38:59 -070013395
13396 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13397 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
nharper9bb83462019-05-01 10:53:22 -070013398 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
nharper2ceb97c2019-04-19 11:38:59 -070013399}
13400
13401TEST_P(QuicFramerTest, RetryPacketRejectedWithMultiplePacketNumberSpaces) {
dschinazi244f6dc2019-05-06 15:45:16 -070013402 if (framer_.transport_version() < QUIC_VERSION_46 ||
13403 framer_.version().SupportsRetry()) {
nharper2ceb97c2019-04-19 11:38:59 -070013404 return;
13405 }
13406 framer_.EnableMultiplePacketNumberSpacesSupport();
13407
13408 // clang-format off
13409 PacketFragments packet = {
13410 // public flags (IETF Retry packet, 0-length original destination CID)
13411 {"Unable to read type.",
13412 {0xf0}},
13413 // version tag
13414 {"Unable to read protocol version.",
13415 {QUIC_VERSION_BYTES}},
13416 // connection_id length
dschinazi244f6dc2019-05-06 15:45:16 -070013417 {"RETRY not supported in this version.",
nharper2ceb97c2019-04-19 11:38:59 -070013418 {0x00}},
13419 };
13420 // clang-format on
13421
13422 std::unique_ptr<QuicEncryptedPacket> encrypted(
13423 AssemblePacketFromFragments(packet));
13424
13425 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13426 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
13427 CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
13428}
13429
nharpera745e392019-04-19 12:05:15 -070013430TEST_P(QuicFramerTest, ProcessPublicHeaderNoVersionInferredType) {
13431 // The framer needs to have Perspective::IS_SERVER and configured to infer the
13432 // packet header type from the packet (not the version). The framer's version
13433 // needs to be one that uses the IETF packet format.
13434 if (!framer_.version().KnowsWhichDecrypterToUse()) {
13435 return;
13436 }
13437 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13438
13439 // Prepare a packet that uses the Google QUIC packet header but has no version
13440 // field.
13441
13442 // clang-format off
13443 PacketFragments packet = {
13444 // public flags (1-byte packet number, 8-byte connection_id, no version)
13445 {"Unable to read public flags.",
13446 {0x08}},
13447 // connection_id
13448 {"Unable to read ConnectionId.",
13449 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
13450 // packet number
13451 {"Unable to read packet number.",
13452 {0x01}},
13453 // padding
13454 {"Invalid public header type for expected version.",
13455 {0x00}},
13456 };
13457 // clang-format on
13458
13459 PacketFragments& fragments = packet;
13460
13461 std::unique_ptr<QuicEncryptedPacket> encrypted(
13462 AssemblePacketFromFragments(fragments));
13463
13464 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13465 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
nharper8b6d63a2019-05-03 10:34:53 -070013466 EXPECT_EQ("Invalid public header type for expected version.",
13467 framer_.detailed_error());
nharpera745e392019-04-19 12:05:15 -070013468 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
13469}
13470
nharper3f283562019-05-02 16:37:12 -070013471TEST_P(QuicFramerTest, ProcessMismatchedHeaderVersion) {
13472 // The framer needs to have Perspective::IS_SERVER and configured to infer the
13473 // packet header type from the packet (not the version). The framer's version
13474 // needs to be one that uses the IETF packet format.
13475 if (!framer_.version().KnowsWhichDecrypterToUse()) {
13476 return;
13477 }
13478 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13479
13480 // clang-format off
13481 PacketFragments packet = {
dschinazi072da7c2019-05-07 17:57:42 -070013482 // public flags (Google QUIC header with version present)
nharper3f283562019-05-02 16:37:12 -070013483 {"Unable to read public flags.",
13484 {0x09}},
13485 // connection_id
13486 {"Unable to read ConnectionId.",
13487 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
13488 // version tag
13489 {"Unable to read protocol version.",
13490 {QUIC_VERSION_BYTES}},
13491 // packet number
13492 {"Unable to read packet number.",
13493 {0x01}},
13494 };
13495 // clang-format on
13496
13497 std::unique_ptr<QuicEncryptedPacket> encrypted(
13498 AssemblePacketFromFragments(packet));
13499 framer_.ProcessPacket(*encrypted);
13500
13501 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13502 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
nharper8b6d63a2019-05-03 10:34:53 -070013503 EXPECT_EQ("Invalid public header type for expected version.",
13504 framer_.detailed_error());
nharper3f283562019-05-02 16:37:12 -070013505 CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
13506}
13507
QUICHE teama6ef0a62019-03-07 20:34:33 -050013508} // namespace
13509} // namespace test
13510} // namespace quic