blob: 3082a94bdc3a9d808a257ae08dda9614df96dd31 [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 };
1016 // clang-format on
1017
1018 PacketFragments& fragments =
1019 framer_.transport_version() > QUIC_VERSION_44
1020 ? packet46
1021 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet);
1022 std::unique_ptr<QuicEncryptedPacket> encrypted(
1023 AssemblePacketFromFragments(fragments));
1024 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1025 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1026 ASSERT_TRUE(visitor_.header_.get());
1027 EXPECT_EQ(FramerTestConnectionId(),
1028 visitor_.header_->destination_connection_id);
1029 EXPECT_FALSE(visitor_.header_->reset_flag);
1030 EXPECT_FALSE(visitor_.header_->version_flag);
1031 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1032
1033 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1034}
1035
1036TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) {
zhongyi546cc452019-04-12 15:27:49 -07001037 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001038 // clang-format off
1039 PacketFragments packet = {
1040 // public flags (0 byte connection_id)
1041 {"Unable to read public flags.",
1042 {0x29}},
1043 // connection_id
1044 {"Unable to read ConnectionId.",
1045 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1046 // version tag
1047 {"Unable to read protocol version.",
1048 {QUIC_VERSION_BYTES}},
1049 // packet number
1050 {"Unable to read packet number.",
1051 {0x12, 0x34, 0x56, 0x78}},
1052 };
1053
1054 PacketFragments packet44 = {
1055 // type (long header with packet type ZERO_RTT_PROTECTED)
1056 {"Unable to read type.",
1057 {0xFC}},
1058 // version tag
1059 {"Unable to read protocol version.",
1060 {QUIC_VERSION_BYTES}},
1061 // connection_id length
1062 {"Unable to read ConnectionId length.",
1063 {0x50}},
1064 // connection_id
1065 {"Unable to read Destination ConnectionId.",
1066 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1067 // packet number
1068 {"Unable to read packet number.",
1069 {0x12, 0x34, 0x56, 0x78}},
1070 };
1071
1072 PacketFragments packet46 = {
1073 // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1074 // packet number)
1075 {"Unable to read type.",
1076 {0xD3}},
1077 // version tag
1078 {"Unable to read protocol version.",
1079 {QUIC_VERSION_BYTES}},
1080 // connection_id length
1081 {"Unable to read ConnectionId length.",
1082 {0x50}},
1083 // connection_id
1084 {"Unable to read Destination ConnectionId.",
1085 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1086 // packet number
1087 {"Unable to read packet number.",
1088 {0x12, 0x34, 0x56, 0x78}},
1089 };
1090
1091 PacketFragments packet99 = {
1092 // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1093 // packet number)
1094 {"Unable to read type.",
1095 {0xD3}},
1096 // version tag
1097 {"Unable to read protocol version.",
1098 {QUIC_VERSION_BYTES}},
1099 // connection_id length
1100 {"Unable to read ConnectionId length.",
1101 {0x50}},
1102 // connection_id
1103 {"Unable to read Destination ConnectionId.",
1104 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1105 // long header packet length
1106 {"Unable to read long header payload length.",
1107 {0x04}},
1108 // packet number
1109 {"Long header payload length longer than packet.",
1110 {0x12, 0x34, 0x56, 0x78}},
1111 };
1112 // clang-format on
1113
1114 PacketFragments& fragments =
1115 framer_.transport_version() == QUIC_VERSION_99
1116 ? packet99
1117 : framer_.transport_version() > QUIC_VERSION_44
1118 ? packet46
1119 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
1120 : packet);
1121 std::unique_ptr<QuicEncryptedPacket> encrypted(
1122 AssemblePacketFromFragments(fragments));
1123 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1124 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1125 ASSERT_TRUE(visitor_.header_.get());
1126 EXPECT_EQ(FramerTestConnectionId(),
1127 visitor_.header_->destination_connection_id);
1128 EXPECT_FALSE(visitor_.header_->reset_flag);
1129 EXPECT_TRUE(visitor_.header_->version_flag);
1130 EXPECT_EQ(GetParam(), visitor_.header_->version);
1131 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1132
1133 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1134}
1135
1136TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) {
zhongyi546cc452019-04-12 15:27:49 -07001137 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001138 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1139
1140 // clang-format off
1141 PacketFragments packet = {
1142 // public flags (8 byte connection_id and 4 byte packet number)
1143 {"Unable to read public flags.",
1144 {0x28}},
1145 // connection_id
1146 {"Unable to read ConnectionId.",
1147 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1148 // packet number
1149 {"Unable to read packet number.",
1150 {0x12, 0x34, 0x56, 0x78}},
1151 };
1152
1153 PacketFragments packet44 = {
1154 // type (short header, 4 byte packet number)
1155 {"Unable to read type.",
1156 {0x32}},
1157 // connection_id
1158 {"Unable to read Destination ConnectionId.",
1159 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1160 // packet number
1161 {"Unable to read packet number.",
1162 {0x12, 0x34, 0x56, 0x78}},
1163 };
1164
1165 PacketFragments packet46 = {
1166 // type (short header, 4 byte packet number)
1167 {"Unable to read type.",
1168 {0x43}},
1169 // connection_id
1170 {"Unable to read Destination ConnectionId.",
1171 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1172 // packet number
1173 {"Unable to read packet number.",
1174 {0x12, 0x34, 0x56, 0x78}},
1175 };
1176 // clang-format on
1177
1178 PacketFragments& fragments =
1179 framer_.transport_version() > QUIC_VERSION_44
1180 ? packet46
1181 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet);
1182 std::unique_ptr<QuicEncryptedPacket> encrypted(
1183 AssemblePacketFromFragments(fragments));
1184 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1185 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1186 ASSERT_TRUE(visitor_.header_.get());
1187 EXPECT_EQ(FramerTestConnectionId(),
1188 visitor_.header_->destination_connection_id);
1189 EXPECT_FALSE(visitor_.header_->reset_flag);
1190 EXPECT_FALSE(visitor_.header_->version_flag);
1191 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1192
1193 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1194}
1195
1196TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) {
zhongyi546cc452019-04-12 15:27:49 -07001197 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001198 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1199
1200 // clang-format off
1201 PacketFragments packet = {
1202 // public flags (8 byte connection_id and 2 byte packet number)
1203 {"Unable to read public flags.",
1204 {0x18}},
1205 // connection_id
1206 {"Unable to read ConnectionId.",
1207 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1208 // packet number
1209 {"Unable to read packet number.",
1210 {0x56, 0x78}},
1211 };
1212
1213 PacketFragments packet44 = {
1214 // type (short header, 2 byte packet number)
1215 {"Unable to read type.",
1216 {0x31}},
1217 // connection_id
1218 {"Unable to read Destination ConnectionId.",
1219 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1220 // packet number
1221 {"Unable to read packet number.",
1222 {0x56, 0x78}},
1223 };
1224
1225 PacketFragments packet46 = {
1226 // type (short header, 2 byte packet number)
1227 {"Unable to read type.",
1228 {0x41}},
1229 // connection_id
1230 {"Unable to read Destination ConnectionId.",
1231 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1232 // packet number
1233 {"Unable to read packet number.",
1234 {0x56, 0x78}},
1235 };
1236 // clang-format on
1237
1238 PacketFragments& fragments =
1239 framer_.transport_version() > QUIC_VERSION_44
1240 ? packet46
1241 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet);
1242 std::unique_ptr<QuicEncryptedPacket> encrypted(
1243 AssemblePacketFromFragments(fragments));
1244 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1245 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1246 ASSERT_TRUE(visitor_.header_.get());
1247 EXPECT_EQ(FramerTestConnectionId(),
1248 visitor_.header_->destination_connection_id);
1249 EXPECT_FALSE(visitor_.header_->reset_flag);
1250 EXPECT_FALSE(visitor_.header_->version_flag);
1251 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1252 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1253
1254 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1255}
1256
1257TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) {
zhongyi546cc452019-04-12 15:27:49 -07001258 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001259 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1260
1261 // clang-format off
1262 PacketFragments packet = {
1263 // public flags (8 byte connection_id and 1 byte packet number)
1264 {"Unable to read public flags.",
1265 {0x08}},
1266 // connection_id
1267 {"Unable to read ConnectionId.",
1268 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1269 // packet number
1270 {"Unable to read packet number.",
1271 {0x78}},
1272 };
1273
1274 PacketFragments packet44 = {
1275 // type (8 byte connection_id and 1 byte packet number)
1276 {"Unable to read type.",
1277 {0x30}},
1278 // connection_id
1279 {"Unable to read Destination ConnectionId.",
1280 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1281 // packet number
1282 {"Unable to read packet number.",
1283 {0x78}},
1284 };
1285
1286 PacketFragments packet46 = {
1287 // type (8 byte connection_id and 1 byte packet number)
1288 {"Unable to read type.",
1289 {0x40}},
1290 // connection_id
1291 {"Unable to read Destination ConnectionId.",
1292 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1293 // packet number
1294 {"Unable to read packet number.",
1295 {0x78}},
1296 };
1297
1298 // clang-format on
1299
1300 PacketFragments& fragments =
1301 framer_.transport_version() > QUIC_VERSION_44
1302 ? packet46
1303 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet);
1304 std::unique_ptr<QuicEncryptedPacket> encrypted(
1305 AssemblePacketFromFragments(fragments));
1306 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1307 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1308 ASSERT_TRUE(visitor_.header_.get());
1309 EXPECT_EQ(FramerTestConnectionId(),
1310 visitor_.header_->destination_connection_id);
1311 EXPECT_FALSE(visitor_.header_->reset_flag);
1312 EXPECT_FALSE(visitor_.header_->version_flag);
1313 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1314 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1315
1316 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1317}
1318
1319TEST_P(QuicFramerTest, PacketNumberDecreasesThenIncreases) {
zhongyi546cc452019-04-12 15:27:49 -07001320 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001321 // Test the case when a packet is received from the past and future packet
1322 // numbers are still calculated relative to the largest received packet.
1323 QuicPacketHeader header;
1324 header.destination_connection_id = FramerTestConnectionId();
1325 header.reset_flag = false;
1326 header.version_flag = false;
1327 header.packet_number = kPacketNumber - 2;
1328
1329 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
1330 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1331 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
1332 ASSERT_TRUE(data != nullptr);
1333
1334 QuicEncryptedPacket encrypted(data->data(), data->length(), false);
1335 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1336 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1337 ASSERT_TRUE(visitor_.header_.get());
1338 EXPECT_EQ(FramerTestConnectionId(),
1339 visitor_.header_->destination_connection_id);
1340 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1341 EXPECT_EQ(kPacketNumber - 2, visitor_.header_->packet_number);
1342
1343 // Receive a 1 byte packet number.
1344 header.packet_number = kPacketNumber;
1345 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1346 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1347 data = BuildDataPacket(header, frames);
1348 QuicEncryptedPacket encrypted1(data->data(), data->length(), false);
1349 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1350 EXPECT_TRUE(framer_.ProcessPacket(encrypted1));
1351 ASSERT_TRUE(visitor_.header_.get());
1352 EXPECT_EQ(FramerTestConnectionId(),
1353 visitor_.header_->destination_connection_id);
1354 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1355 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1356
1357 // Process a 2 byte packet number 256 packets ago.
1358 header.packet_number = kPacketNumber - 256;
1359 header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
1360 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1361 data = BuildDataPacket(header, frames);
1362 QuicEncryptedPacket encrypted2(data->data(), data->length(), false);
1363 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1364 EXPECT_TRUE(framer_.ProcessPacket(encrypted2));
1365 ASSERT_TRUE(visitor_.header_.get());
1366 EXPECT_EQ(FramerTestConnectionId(),
1367 visitor_.header_->destination_connection_id);
1368 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1369 EXPECT_EQ(kPacketNumber - 256, visitor_.header_->packet_number);
1370
1371 // Process another 1 byte packet number and ensure it works.
1372 header.packet_number = kPacketNumber - 1;
1373 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1374 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1375 data = BuildDataPacket(header, frames);
1376 QuicEncryptedPacket encrypted3(data->data(), data->length(), false);
1377 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1378 EXPECT_TRUE(framer_.ProcessPacket(encrypted3));
1379 ASSERT_TRUE(visitor_.header_.get());
1380 EXPECT_EQ(FramerTestConnectionId(),
1381 visitor_.header_->destination_connection_id);
1382 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1383 EXPECT_EQ(kPacketNumber - 1, visitor_.header_->packet_number);
1384}
1385
1386TEST_P(QuicFramerTest, PacketWithDiversificationNonce) {
zhongyi546cc452019-04-12 15:27:49 -07001387 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001388 // clang-format off
1389 unsigned char packet[] = {
1390 // public flags: includes nonce flag
1391 0x2C,
1392 // connection_id
1393 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1394 // nonce
1395 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1396 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1397 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1398 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1399 // packet number
1400 0x12, 0x34, 0x56, 0x78,
1401
1402 // frame type (padding)
1403 0x00,
1404 0x00, 0x00, 0x00, 0x00
1405 };
1406
1407 unsigned char packet44[] = {
1408 // type: Long header with packet type ZERO_RTT_PROTECTED
1409 0xFC,
1410 // version tag
1411 QUIC_VERSION_BYTES,
1412 // connection_id length
1413 0x05,
1414 // connection_id
1415 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1416 // packet number
1417 0x12, 0x34, 0x56, 0x78,
1418 // nonce
1419 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1420 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1421 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1422 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1423
1424 // frame type (padding)
1425 0x00,
1426 0x00, 0x00, 0x00, 0x00
1427 };
1428
1429 unsigned char packet46[] = {
1430 // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1431 // number.
1432 0xD0,
1433 // version tag
1434 QUIC_VERSION_BYTES,
1435 // connection_id length
1436 0x05,
1437 // connection_id
1438 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1439 // packet number
1440 0x78,
1441 // nonce
1442 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1443 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1444 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1445 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1446
1447 // frame type (padding)
1448 0x00,
1449 0x00, 0x00, 0x00, 0x00
1450 };
1451
1452 unsigned char packet99[] = {
1453 // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1454 // number.
1455 0xD0,
1456 // version tag
1457 QUIC_VERSION_BYTES,
1458 // connection_id length
1459 0x05,
1460 // connection_id
1461 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1462 // long header packet length
1463 0x26,
1464 // packet number
1465 0x78,
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
1472 // frame type (padding)
1473 0x00,
1474 0x00, 0x00, 0x00, 0x00
1475 };
1476 // clang-format on
1477
1478 if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
1479 return;
1480 }
1481
1482 unsigned char* p = packet;
1483 size_t p_size = QUIC_ARRAYSIZE(packet);
1484 if (framer_.transport_version() == QUIC_VERSION_99) {
1485 p = packet99;
1486 p_size = QUIC_ARRAYSIZE(packet99);
1487 } else if (framer_.transport_version() > QUIC_VERSION_44) {
1488 p = packet46;
1489 p_size = QUIC_ARRAYSIZE(packet46);
1490 } else if (framer_.transport_version() > QUIC_VERSION_43) {
1491 p = packet44;
1492 p_size = QUIC_ARRAYSIZE(packet44);
1493 }
1494
1495 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1496 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1497 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1498 ASSERT_TRUE(visitor_.header_->nonce != nullptr);
1499 for (char i = 0; i < 32; ++i) {
1500 EXPECT_EQ(i, (*visitor_.header_->nonce)[static_cast<size_t>(i)]);
1501 }
1502 EXPECT_EQ(1u, visitor_.padding_frames_.size());
1503 EXPECT_EQ(5, visitor_.padding_frames_[0]->num_padding_bytes);
1504}
1505
1506TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) {
1507 // clang-format off
1508 unsigned char packet[] = {
1509 // public flags (8 byte connection_id, version flag and an unknown flag)
1510 0x29,
1511 // connection_id
1512 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1513 // version tag
1514 'Q', '0', '0', '0',
1515 // packet number
1516 0x12, 0x34, 0x56, 0x78,
1517
1518 // frame type (padding frame)
1519 0x00,
1520 0x00, 0x00, 0x00, 0x00
1521 };
1522
1523 unsigned char packet44[] = {
1524 // type (long header with packet type ZERO_RTT_PROTECTED)
1525 0xFC,
1526 // version tag
1527 'Q', '0', '0', '0',
1528 // connection_id length
1529 0x50,
1530 // connection_id
1531 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1532 // packet number
1533 0x12, 0x34, 0x56, 0x78,
1534
1535 // frame type (padding frame)
1536 0x00,
1537 0x00, 0x00, 0x00, 0x00
1538 };
1539 // clang-format on
1540
1541 QuicEncryptedPacket encrypted(
1542 AsChars(framer_.transport_version() > QUIC_VERSION_43 ? packet44
1543 : packet),
1544 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44)
1545 : QUIC_ARRAYSIZE(packet),
1546 false);
1547 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1548 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1549 ASSERT_TRUE(visitor_.header_.get());
1550 EXPECT_EQ(0, visitor_.frame_count_);
1551 EXPECT_EQ(1, visitor_.version_mismatch_);
1552 EXPECT_EQ(1u, visitor_.padding_frames_.size());
1553 EXPECT_EQ(5, visitor_.padding_frames_[0]->num_padding_bytes);
1554}
1555
1556TEST_P(QuicFramerTest, PaddingFrame) {
zhongyi546cc452019-04-12 15:27:49 -07001557 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001558 // clang-format off
1559 unsigned char packet[] = {
1560 // public flags (8 byte connection_id)
1561 0x28,
1562 // connection_id
1563 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1564 // packet number
1565 0x12, 0x34, 0x56, 0x78,
1566
1567 // paddings
1568 0x00, 0x00,
1569 // frame type (stream frame with fin)
1570 0xFF,
1571 // stream id
1572 0x01, 0x02, 0x03, 0x04,
1573 // offset
1574 0x3A, 0x98, 0xFE, 0xDC,
1575 0x32, 0x10, 0x76, 0x54,
1576 // data length
1577 0x00, 0x0c,
1578 // data
1579 'h', 'e', 'l', 'l',
1580 'o', ' ', 'w', 'o',
1581 'r', 'l', 'd', '!',
1582 // paddings
1583 0x00, 0x00,
1584 };
1585
1586 unsigned char packet44[] = {
1587 // type (short header, 4 byte packet number)
1588 0x32,
1589 // connection_id
1590 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1591 // packet number
1592 0x12, 0x34, 0x56, 0x78,
1593
1594 // paddings
1595 0x00, 0x00,
1596 // frame type (stream frame with fin)
1597 0xFF,
1598 // stream id
1599 0x01, 0x02, 0x03, 0x04,
1600 // offset
1601 0x3A, 0x98, 0xFE, 0xDC,
1602 0x32, 0x10, 0x76, 0x54,
1603 // data length
1604 0x00, 0x0c,
1605 // data
1606 'h', 'e', 'l', 'l',
1607 'o', ' ', 'w', 'o',
1608 'r', 'l', 'd', '!',
1609 // paddings
1610 0x00, 0x00,
1611 };
1612
1613 unsigned char packet46[] = {
1614 // type (short header, 4 byte packet number)
1615 0x43,
1616 // connection_id
1617 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1618 // packet number
1619 0x12, 0x34, 0x56, 0x78,
1620
1621 // paddings
1622 0x00, 0x00,
1623 // frame type (stream frame with fin)
1624 0xFF,
1625 // stream id
1626 0x01, 0x02, 0x03, 0x04,
1627 // offset
1628 0x3A, 0x98, 0xFE, 0xDC,
1629 0x32, 0x10, 0x76, 0x54,
1630 // data length
1631 0x00, 0x0c,
1632 // data
1633 'h', 'e', 'l', 'l',
1634 'o', ' ', 'w', 'o',
1635 'r', 'l', 'd', '!',
1636 // paddings
1637 0x00, 0x00,
1638 };
1639
1640 unsigned char packet99[] = {
1641 // type (short header, 4 byte packet number)
1642 0x43,
1643 // connection_id
1644 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1645 // packet number
1646 0x12, 0x34, 0x56, 0x78,
1647
1648 // paddings
1649 0x00, 0x00,
1650 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
1651 0x08 | 0x01 | 0x02 | 0x04,
1652
1653 // stream id
1654 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
1655 // offset
1656 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
1657 0x32, 0x10, 0x76, 0x54,
1658 // data length
1659 kVarInt62OneByte + 0x0c,
1660 // data
1661 'h', 'e', 'l', 'l',
1662 'o', ' ', 'w', 'o',
1663 'r', 'l', 'd', '!',
1664 // paddings
1665 0x00, 0x00,
1666 };
1667 // clang-format on
1668
1669 unsigned char* p = packet;
1670 size_t p_size = QUIC_ARRAYSIZE(packet);
1671 if (framer_.transport_version() == QUIC_VERSION_99) {
1672 p = packet99;
1673 p_size = QUIC_ARRAYSIZE(packet99);
1674 } else if (framer_.transport_version() > QUIC_VERSION_44) {
1675 p = packet46;
1676 p_size = QUIC_ARRAYSIZE(packet46);
1677 } else if (framer_.transport_version() > QUIC_VERSION_43) {
1678 p = packet44;
1679 p_size = QUIC_ARRAYSIZE(packet44);
1680 }
1681
1682 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1683 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1684 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1685 ASSERT_TRUE(visitor_.header_.get());
1686 EXPECT_TRUE(CheckDecryption(
1687 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
1688 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
1689
1690 ASSERT_EQ(1u, visitor_.stream_frames_.size());
1691 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1692 EXPECT_EQ(2u, visitor_.padding_frames_.size());
1693 EXPECT_EQ(2, visitor_.padding_frames_[0]->num_padding_bytes);
1694 EXPECT_EQ(2, visitor_.padding_frames_[1]->num_padding_bytes);
1695 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
1696 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
1697 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
1698 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
1699}
1700
1701TEST_P(QuicFramerTest, StreamFrame) {
zhongyi546cc452019-04-12 15:27:49 -07001702 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001703 // clang-format off
1704 PacketFragments packet = {
1705 // public flags (8 byte connection_id)
1706 {"",
1707 {0x28}},
1708 // connection_id
1709 {"",
1710 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1711 // packet number
1712 {"",
1713 {0x12, 0x34, 0x56, 0x78}},
1714 // frame type (stream frame with fin)
1715 {"",
1716 {0xFF}},
1717 // stream id
1718 {"Unable to read stream_id.",
1719 {0x01, 0x02, 0x03, 0x04}},
1720 // offset
1721 {"Unable to read offset.",
1722 {0x3A, 0x98, 0xFE, 0xDC,
1723 0x32, 0x10, 0x76, 0x54}},
1724 {"Unable to read frame data.",
1725 {
1726 // data length
1727 0x00, 0x0c,
1728 // data
1729 'h', 'e', 'l', 'l',
1730 'o', ' ', 'w', 'o',
1731 'r', 'l', 'd', '!'}},
1732 };
1733
1734 PacketFragments packet44 = {
1735 // type (short header, 4 byte packet number)
1736 {"",
1737 {0x32}},
1738 // connection_id
1739 {"",
1740 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1741 // packet number
1742 {"",
1743 {0x12, 0x34, 0x56, 0x78}},
1744 // frame type (stream frame with fin)
1745 {"",
1746 {0xFF}},
1747 // stream id
1748 {"Unable to read stream_id.",
1749 {0x01, 0x02, 0x03, 0x04}},
1750 // offset
1751 {"Unable to read offset.",
1752 {0x3A, 0x98, 0xFE, 0xDC,
1753 0x32, 0x10, 0x76, 0x54}},
1754 {"Unable to read frame data.",
1755 {
1756 // data length
1757 0x00, 0x0c,
1758 // data
1759 'h', 'e', 'l', 'l',
1760 'o', ' ', 'w', 'o',
1761 'r', 'l', 'd', '!'}},
1762 };
1763
1764 PacketFragments packet46 = {
1765 // type (short header, 4 byte packet number)
1766 {"",
1767 {0x43}},
1768 // connection_id
1769 {"",
1770 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1771 // packet number
1772 {"",
1773 {0x12, 0x34, 0x56, 0x78}},
1774 // frame type (stream frame with fin)
1775 {"",
1776 {0xFF}},
1777 // stream id
1778 {"Unable to read stream_id.",
1779 {0x01, 0x02, 0x03, 0x04}},
1780 // offset
1781 {"Unable to read offset.",
1782 {0x3A, 0x98, 0xFE, 0xDC,
1783 0x32, 0x10, 0x76, 0x54}},
1784 {"Unable to read frame data.",
1785 {
1786 // data length
1787 0x00, 0x0c,
1788 // data
1789 'h', 'e', 'l', 'l',
1790 'o', ' ', 'w', 'o',
1791 'r', 'l', 'd', '!'}},
1792 };
1793
1794 PacketFragments packet99 = {
1795 // type (short header, 4 byte packet number)
1796 {"",
1797 {0x43}},
1798 // connection_id
1799 {"",
1800 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1801 // packet number
1802 {"",
1803 {0x12, 0x34, 0x56, 0x78}},
1804 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
1805 {"",
1806 { 0x08 | 0x01 | 0x02 | 0x04 }},
1807 // stream id
1808 {"Unable to read stream_id.",
1809 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
1810 // offset
1811 {"Unable to read stream data offset.",
1812 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
1813 0x32, 0x10, 0x76, 0x54}},
1814 // data length
1815 {"Unable to read stream data length.",
1816 {kVarInt62OneByte + 0x0c}},
1817 // data
1818 {"Unable to read frame data.",
1819 { 'h', 'e', 'l', 'l',
1820 'o', ' ', 'w', 'o',
1821 'r', 'l', 'd', '!'}},
1822 };
1823 // clang-format on
1824
1825 PacketFragments& fragments =
1826 framer_.transport_version() == QUIC_VERSION_99
1827 ? packet99
1828 : (framer_.transport_version() > QUIC_VERSION_44
1829 ? packet46
1830 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
1831 : packet));
1832 std::unique_ptr<QuicEncryptedPacket> encrypted(
1833 AssemblePacketFromFragments(fragments));
1834 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
1835
1836 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1837 ASSERT_TRUE(visitor_.header_.get());
1838 EXPECT_TRUE(CheckDecryption(
1839 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
1840 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
1841
1842 ASSERT_EQ(1u, visitor_.stream_frames_.size());
1843 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1844 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
1845 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
1846 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
1847 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
1848
1849 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
1850}
1851
1852// Test an empty (no data) stream frame.
1853TEST_P(QuicFramerTest, EmptyStreamFrame) {
1854 // Only the IETF QUIC spec explicitly says that empty
1855 // stream frames are supported.
1856 if (framer_.transport_version() != QUIC_VERSION_99) {
1857 return;
1858 }
zhongyi546cc452019-04-12 15:27:49 -07001859 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001860 // clang-format off
1861 PacketFragments packet = {
1862 // type (short header, 4 byte packet number)
1863 {"",
1864 {0x43}},
1865 // connection_id
1866 {"",
1867 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1868 // packet number
1869 {"",
1870 {0x12, 0x34, 0x56, 0x78}},
1871 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
1872 {"",
1873 { 0x08 | 0x01 | 0x02 | 0x04 }},
1874 // stream id
1875 {"Unable to read stream_id.",
1876 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
1877 // offset
1878 {"Unable to read stream data offset.",
1879 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
1880 0x32, 0x10, 0x76, 0x54}},
1881 // data length
1882 {"Unable to read stream data length.",
1883 {kVarInt62OneByte + 0x00}},
1884 };
1885 // clang-format on
1886
1887 std::unique_ptr<QuicEncryptedPacket> encrypted(
1888 AssemblePacketFromFragments(packet));
1889 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
1890
1891 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1892 ASSERT_TRUE(visitor_.header_.get());
1893 EXPECT_TRUE(CheckDecryption(
1894 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
1895 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
1896
1897 ASSERT_EQ(1u, visitor_.stream_frames_.size());
1898 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1899 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
1900 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
1901 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
1902 EXPECT_EQ(visitor_.stream_frames_[0].get()->data_length, 0u);
1903
1904 CheckFramingBoundaries(packet, QUIC_INVALID_STREAM_DATA);
1905}
1906
1907TEST_P(QuicFramerTest, MissingDiversificationNonce) {
QUICHE team8e2e4532019-03-14 14:37:56 -07001908 if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
1909 // TLS does not use diversification nonces.
1910 return;
1911 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001912 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001913 decrypter_ = new test::TestDecrypter();
zhongyi546cc452019-04-12 15:27:49 -07001914 if (framer_.version().KnowsWhichDecrypterToUse()) {
1915 framer_.InstallDecrypter(ENCRYPTION_INITIAL, QuicMakeUnique<NullDecrypter>(
1916 Perspective::IS_CLIENT));
1917 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
1918 std::unique_ptr<QuicDecrypter>(decrypter_));
1919 } else {
1920 framer_.SetDecrypter(ENCRYPTION_INITIAL,
1921 QuicMakeUnique<NullDecrypter>(Perspective::IS_CLIENT));
1922 framer_.SetAlternativeDecrypter(
1923 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
1924 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001925
1926 // clang-format off
1927 unsigned char packet[] = {
1928 // public flags (8 byte connection_id)
1929 0x28,
1930 // connection_id
1931 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
1932 // packet number
1933 0x12, 0x34, 0x56, 0x78,
QUICHE team8e2e4532019-03-14 14:37:56 -07001934 // padding frame
1935 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001936 };
1937
1938 unsigned char packet44[] = {
QUICHE team8e2e4532019-03-14 14:37:56 -07001939 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
QUICHE teama6ef0a62019-03-07 20:34:33 -05001940 0xFC,
1941 // version tag
1942 QUIC_VERSION_BYTES,
1943 // connection_id length
QUICHE team8e2e4532019-03-14 14:37:56 -07001944 0x05,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001945 // connection_id
1946 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
1947 // packet number
1948 0x12, 0x34, 0x56, 0x78,
QUICHE team8e2e4532019-03-14 14:37:56 -07001949 // padding frame
1950 0x00,
1951 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001952
QUICHE team8e2e4532019-03-14 14:37:56 -07001953 unsigned char packet46[] = {
1954 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
1955 0xD3,
1956 // version tag
1957 QUIC_VERSION_BYTES,
1958 // connection_id length
1959 0x05,
1960 // connection_id
1961 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
1962 // packet number
1963 0x12, 0x34, 0x56, 0x78,
1964 // padding frame
1965 0x00,
1966 };
1967
1968 unsigned char packet99[] = {
1969 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
1970 0xD3,
1971 // version tag
1972 QUIC_VERSION_BYTES,
1973 // connection_id length
1974 0x05,
1975 // connection_id
1976 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
1977 // IETF long header payload length
1978 0x05,
1979 // packet number
1980 0x12, 0x34, 0x56, 0x78,
1981 // padding frame
1982 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001983 };
1984 // clang-format on
1985
1986 unsigned char* p = packet;
QUICHE team8e2e4532019-03-14 14:37:56 -07001987 size_t p_length = QUIC_ARRAYSIZE(packet);
1988 if (framer_.transport_version() == QUIC_VERSION_99) {
1989 p = packet99;
1990 p_length = QUIC_ARRAYSIZE(packet99);
1991 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
1992 p = packet46;
1993 p_length = QUIC_ARRAYSIZE(packet46);
1994 } else if (framer_.transport_version() >= QUIC_VERSION_44) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001995 p = packet44;
QUICHE team8e2e4532019-03-14 14:37:56 -07001996 p_length = QUIC_ARRAYSIZE(packet44);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001997 }
QUICHE team8e2e4532019-03-14 14:37:56 -07001998 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001999 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
QUICHE team8e2e4532019-03-14 14:37:56 -07002000 if (framer_.transport_version() >= QUIC_VERSION_44) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002001 // Cannot read diversification nonce.
2002 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
QUICHE team8e2e4532019-03-14 14:37:56 -07002003 EXPECT_EQ("Unable to read nonce.", framer_.detailed_error());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002004 } else {
2005 EXPECT_EQ(QUIC_DECRYPTION_FAILURE, framer_.error());
2006 }
2007}
2008
2009TEST_P(QuicFramerTest, StreamFrame3ByteStreamId) {
2010 if (framer_.transport_version() > QUIC_VERSION_43) {
2011 // This test is nonsensical for IETF Quic.
2012 return;
2013 }
2014 // clang-format off
2015 PacketFragments packet = {
2016 // public flags (8 byte connection_id)
2017 {"",
2018 {0x28}},
2019 // connection_id
2020 {"",
2021 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2022 // packet number
2023 {"",
2024 {0x12, 0x34, 0x56, 0x78}},
2025 // frame type (stream frame with fin)
2026 {"",
2027 {0xFE}},
2028 // stream id
2029 {"Unable to read stream_id.",
2030 {0x02, 0x03, 0x04}},
2031 // offset
2032 {"Unable to read offset.",
2033 {0x3A, 0x98, 0xFE, 0xDC,
2034 0x32, 0x10, 0x76, 0x54}},
2035 {"Unable to read frame data.",
2036 {
2037 // data length
2038 0x00, 0x0c,
2039 // data
2040 'h', 'e', 'l', 'l',
2041 'o', ' ', 'w', 'o',
2042 'r', 'l', 'd', '!'}},
2043 };
2044 // clang-format on
2045
2046 PacketFragments& fragments = packet;
2047 std::unique_ptr<QuicEncryptedPacket> encrypted(
2048 AssemblePacketFromFragments(fragments));
2049 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2050
2051 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2052 ASSERT_TRUE(visitor_.header_.get());
2053 EXPECT_TRUE(CheckDecryption(
2054 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2055 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2056
2057 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2058 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2059 // Stream ID should be the last 3 bytes of kStreamId.
2060 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2061 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2062 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2063 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2064
2065 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2066}
2067
2068TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) {
zhongyi546cc452019-04-12 15:27:49 -07002069 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002070 // clang-format off
2071 PacketFragments packet = {
2072 // public flags (8 byte connection_id)
2073 {"",
2074 {0x28}},
2075 // connection_id
2076 {"",
2077 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2078 // packet number
2079 {"",
2080 {0x12, 0x34, 0x56, 0x78}},
2081 // frame type (stream frame with fin)
2082 {"",
2083 {0xFD}},
2084 // stream id
2085 {"Unable to read stream_id.",
2086 {0x03, 0x04}},
2087 // offset
2088 {"Unable to read offset.",
2089 {0x3A, 0x98, 0xFE, 0xDC,
2090 0x32, 0x10, 0x76, 0x54}},
2091 {"Unable to read frame data.",
2092 {
2093 // data length
2094 0x00, 0x0c,
2095 // data
2096 'h', 'e', 'l', 'l',
2097 'o', ' ', 'w', 'o',
2098 'r', 'l', 'd', '!'}},
2099 };
2100
2101 PacketFragments packet44 = {
2102 // type (short header, 4 byte packet number)
2103 {"",
2104 {0x32}},
2105 // connection_id
2106 {"",
2107 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2108 // packet number
2109 {"",
2110 {0x12, 0x34, 0x56, 0x78}},
2111 // frame type (stream frame with fin)
2112 {"",
2113 {0xFD}},
2114 // stream id
2115 {"Unable to read stream_id.",
2116 {0x03, 0x04}},
2117 // offset
2118 {"Unable to read offset.",
2119 {0x3A, 0x98, 0xFE, 0xDC,
2120 0x32, 0x10, 0x76, 0x54}},
2121 {"Unable to read frame data.",
2122 {
2123 // data length
2124 0x00, 0x0c,
2125 // data
2126 'h', 'e', 'l', 'l',
2127 'o', ' ', 'w', 'o',
2128 'r', 'l', 'd', '!'}},
2129 };
2130
2131 PacketFragments packet46 = {
2132 // type (short header, 4 byte packet number)
2133 {"",
2134 {0x43}},
2135 // connection_id
2136 {"",
2137 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2138 // packet number
2139 {"",
2140 {0x12, 0x34, 0x56, 0x78}},
2141 // frame type (stream frame with fin)
2142 {"",
2143 {0xFD}},
2144 // stream id
2145 {"Unable to read stream_id.",
2146 {0x03, 0x04}},
2147 // offset
2148 {"Unable to read offset.",
2149 {0x3A, 0x98, 0xFE, 0xDC,
2150 0x32, 0x10, 0x76, 0x54}},
2151 {"Unable to read frame data.",
2152 {
2153 // data length
2154 0x00, 0x0c,
2155 // data
2156 'h', 'e', 'l', 'l',
2157 'o', ' ', 'w', 'o',
2158 'r', 'l', 'd', '!'}},
2159 };
2160
2161 PacketFragments packet99 = {
2162 // type (short header, 4 byte packet number)
2163 {"",
2164 {0x43}},
2165 // connection_id
2166 {"",
2167 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2168 // packet number
2169 {"",
2170 {0x12, 0x34, 0x56, 0x78}},
2171 // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2172 {"",
2173 {0x08 | 0x01 | 0x02 | 0x04}},
2174 // stream id
2175 {"Unable to read stream_id.",
2176 {kVarInt62TwoBytes + 0x03, 0x04}},
2177 // offset
2178 {"Unable to read stream data offset.",
2179 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2180 0x32, 0x10, 0x76, 0x54}},
2181 // data length
2182 {"Unable to read stream data length.",
2183 {kVarInt62OneByte + 0x0c}},
2184 // data
2185 {"Unable to read frame data.",
2186 { 'h', 'e', 'l', 'l',
2187 'o', ' ', 'w', 'o',
2188 'r', 'l', 'd', '!'}},
2189 };
2190 // clang-format on
2191
2192 PacketFragments& fragments =
2193 framer_.transport_version() == QUIC_VERSION_99
2194 ? packet99
2195 : (framer_.transport_version() > QUIC_VERSION_44
2196 ? packet46
2197 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
2198 : packet));
2199 std::unique_ptr<QuicEncryptedPacket> encrypted(
2200 AssemblePacketFromFragments(fragments));
2201 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2202
2203 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2204 ASSERT_TRUE(visitor_.header_.get());
2205 EXPECT_TRUE(CheckDecryption(
2206 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2207 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2208
2209 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2210 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2211 // Stream ID should be the last 2 bytes of kStreamId.
2212 EXPECT_EQ(0x0000FFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2213 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2214 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2215 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2216
2217 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2218}
2219
2220TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) {
zhongyi546cc452019-04-12 15:27:49 -07002221 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002222 // clang-format off
2223 PacketFragments packet = {
2224 // public flags (8 byte connection_id)
2225 {"",
2226 {0x28}},
2227 // connection_id
2228 {"",
2229 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2230 // packet number
2231 {"",
2232 {0x12, 0x34, 0x56, 0x78}},
2233 // frame type (stream frame with fin)
2234 {"",
2235 {0xFC}},
2236 // stream id
2237 {"Unable to read stream_id.",
2238 {0x04}},
2239 // offset
2240 {"Unable to read offset.",
2241 {0x3A, 0x98, 0xFE, 0xDC,
2242 0x32, 0x10, 0x76, 0x54}},
2243 {"Unable to read frame data.",
2244 {
2245 // data length
2246 0x00, 0x0c,
2247 // data
2248 'h', 'e', 'l', 'l',
2249 'o', ' ', 'w', 'o',
2250 'r', 'l', 'd', '!'}},
2251 };
2252
2253 PacketFragments packet44 = {
2254 // type (short header, 4 byte packet number)
2255 {"",
2256 {0x32}},
2257 // connection_id
2258 {"",
2259 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2260 // packet number
2261 {"",
2262 {0x12, 0x34, 0x56, 0x78}},
2263 // frame type (stream frame with fin)
2264 {"",
2265 {0xFC}},
2266 // stream id
2267 {"Unable to read stream_id.",
2268 {0x04}},
2269 // offset
2270 {"Unable to read offset.",
2271 {0x3A, 0x98, 0xFE, 0xDC,
2272 0x32, 0x10, 0x76, 0x54}},
2273 {"Unable to read frame data.",
2274 {
2275 // data length
2276 0x00, 0x0c,
2277 // data
2278 'h', 'e', 'l', 'l',
2279 'o', ' ', 'w', 'o',
2280 'r', 'l', 'd', '!'}},
2281 };
2282
2283 PacketFragments packet46 = {
2284 // type (short header, 4 byte packet number)
2285 {"",
2286 {0x43}},
2287 // connection_id
2288 {"",
2289 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2290 // packet number
2291 {"",
2292 {0x12, 0x34, 0x56, 0x78}},
2293 // frame type (stream frame with fin)
2294 {"",
2295 {0xFC}},
2296 // stream id
2297 {"Unable to read stream_id.",
2298 {0x04}},
2299 // offset
2300 {"Unable to read offset.",
2301 {0x3A, 0x98, 0xFE, 0xDC,
2302 0x32, 0x10, 0x76, 0x54}},
2303 {"Unable to read frame data.",
2304 {
2305 // data length
2306 0x00, 0x0c,
2307 // data
2308 'h', 'e', 'l', 'l',
2309 'o', ' ', 'w', 'o',
2310 'r', 'l', 'd', '!'}},
2311 };
2312
2313 PacketFragments packet99 = {
2314 // type (short header, 4 byte packet number)
2315 {"",
2316 {0x43}},
2317 // connection_id
2318 {"",
2319 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2320 // packet number
2321 {"",
2322 {0x12, 0x34, 0x56, 0x78}},
2323 // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2324 {"",
2325 {0x08 | 0x01 | 0x02 | 0x04}},
2326 // stream id
2327 {"Unable to read stream_id.",
2328 {kVarInt62OneByte + 0x04}},
2329 // offset
2330 {"Unable to read stream data offset.",
2331 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2332 0x32, 0x10, 0x76, 0x54}},
2333 // data length
2334 {"Unable to read stream data length.",
2335 {kVarInt62OneByte + 0x0c}},
2336 // data
2337 {"Unable to read frame data.",
2338 { 'h', 'e', 'l', 'l',
2339 'o', ' ', 'w', 'o',
2340 'r', 'l', 'd', '!'}},
2341 };
2342 // clang-format on
2343
2344 PacketFragments& fragments =
2345 framer_.transport_version() == QUIC_VERSION_99
2346 ? packet99
2347 : (framer_.transport_version() > QUIC_VERSION_44
2348 ? packet46
2349 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
2350 : packet));
2351 std::unique_ptr<QuicEncryptedPacket> encrypted(
2352 AssemblePacketFromFragments(fragments));
2353 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2354
2355 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2356 ASSERT_TRUE(visitor_.header_.get());
2357 EXPECT_TRUE(CheckDecryption(
2358 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2359 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2360
2361 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2362 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2363 // Stream ID should be the last 1 byte of kStreamId.
2364 EXPECT_EQ(0x000000FF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2365 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2366 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2367 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2368
2369 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2370}
2371
2372TEST_P(QuicFramerTest, StreamFrameWithVersion) {
zhongyi546cc452019-04-12 15:27:49 -07002373 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002374 // clang-format off
2375 PacketFragments packet = {
2376 // public flags (version, 8 byte connection_id)
2377 {"",
2378 {0x29}},
2379 // connection_id
2380 {"",
2381 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2382 // version tag
2383 {"",
2384 {QUIC_VERSION_BYTES}},
2385 // packet number
2386 {"",
2387 {0x12, 0x34, 0x56, 0x78}},
2388 // frame type (stream frame with fin)
2389 {"",
2390 {0xFE}},
2391 // stream id
2392 {"Unable to read stream_id.",
2393 {0x02, 0x03, 0x04}},
2394 // offset
2395 {"Unable to read offset.",
2396 {0x3A, 0x98, 0xFE, 0xDC,
2397 0x32, 0x10, 0x76, 0x54}},
2398 {"Unable to read frame data.",
2399 {
2400 // data length
2401 0x00, 0x0c,
2402 // data
2403 'h', 'e', 'l', 'l',
2404 'o', ' ', 'w', 'o',
2405 'r', 'l', 'd', '!'}},
2406 };
2407
2408 PacketFragments packet44 = {
2409 // public flags (long header with packet type ZERO_RTT_PROTECTED)
2410 {"",
2411 {0xFC}},
2412 // version tag
2413 {"",
2414 {QUIC_VERSION_BYTES}},
2415 // connection_id length
2416 {"",
2417 {0x50}},
2418 // connection_id
2419 {"",
2420 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2421 // packet number
2422 {"",
2423 {0x12, 0x34, 0x56, 0x78}},
2424 // frame type (stream frame with fin)
2425 {"",
2426 {0xFE}},
2427 // stream id
2428 {"Unable to read stream_id.",
2429 {0x02, 0x03, 0x04}},
2430 // offset
2431 {"Unable to read offset.",
2432 {0x3A, 0x98, 0xFE, 0xDC,
2433 0x32, 0x10, 0x76, 0x54}},
2434 {"Unable to read frame data.",
2435 {
2436 // data length
2437 0x00, 0x0c,
2438 // data
2439 'h', 'e', 'l', 'l',
2440 'o', ' ', 'w', 'o',
2441 'r', 'l', 'd', '!'}},
2442 };
2443
2444 PacketFragments packet46 = {
2445 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2446 // 4-byte packet number)
2447 {"",
2448 {0xD3}},
2449 // version tag
2450 {"",
2451 {QUIC_VERSION_BYTES}},
2452 // connection_id length
2453 {"",
2454 {0x50}},
2455 // connection_id
2456 {"",
2457 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2458 // packet number
2459 {"",
2460 {0x12, 0x34, 0x56, 0x78}},
2461 // frame type (stream frame with fin)
2462 {"",
2463 {0xFE}},
2464 // stream id
2465 {"Unable to read stream_id.",
2466 {0x02, 0x03, 0x04}},
2467 // offset
2468 {"Unable to read offset.",
2469 {0x3A, 0x98, 0xFE, 0xDC,
2470 0x32, 0x10, 0x76, 0x54}},
2471 {"Unable to read frame data.",
2472 {
2473 // data length
2474 0x00, 0x0c,
2475 // data
2476 'h', 'e', 'l', 'l',
2477 'o', ' ', 'w', 'o',
2478 'r', 'l', 'd', '!'}},
2479 };
2480
2481 PacketFragments packet99 = {
2482 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2483 // 4-byte packet number)
2484 {"",
2485 {0xD3}},
2486 // version tag
2487 {"",
2488 {QUIC_VERSION_BYTES}},
2489 // connection_id length
2490 {"",
2491 {0x50}},
2492 // connection_id
2493 {"",
2494 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2495 // long header packet length
2496 {"",
2497 {0x1E}},
2498 // packet number
2499 {"",
2500 {0x12, 0x34, 0x56, 0x78}},
2501 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
2502 {"",
2503 {0x08 | 0x01 | 0x02 | 0x04}},
2504 // stream id
2505 {"Long header payload length longer than packet.",
2506 {kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04}},
2507 // offset
2508 {"Long header payload length longer than packet.",
2509 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2510 0x32, 0x10, 0x76, 0x54}},
2511 // data length
2512 {"Long header payload length longer than packet.",
2513 {kVarInt62OneByte + 0x0c}},
2514 // data
2515 {"Long header payload length longer than packet.",
2516 { 'h', 'e', 'l', 'l',
2517 'o', ' ', 'w', 'o',
2518 'r', 'l', 'd', '!'}},
2519 };
2520 // clang-format on
2521
2522 QuicVariableLengthIntegerLength retry_token_length_length =
2523 VARIABLE_LENGTH_INTEGER_LENGTH_0;
2524 size_t retry_token_length = 0;
2525 QuicVariableLengthIntegerLength length_length =
2526 QuicVersionHasLongHeaderLengths(framer_.transport_version())
2527 ? VARIABLE_LENGTH_INTEGER_LENGTH_1
2528 : VARIABLE_LENGTH_INTEGER_LENGTH_0;
2529
2530 PacketFragments& fragments =
2531 framer_.transport_version() == QUIC_VERSION_99
2532 ? packet99
2533 : (framer_.transport_version() > QUIC_VERSION_44
2534 ? packet46
2535 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
2536 : packet));
2537 std::unique_ptr<QuicEncryptedPacket> encrypted(
2538 AssemblePacketFromFragments(fragments));
2539 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2540
2541 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2542 ASSERT_TRUE(visitor_.header_.get());
2543 EXPECT_TRUE(CheckDecryption(
2544 *encrypted, kIncludeVersion, !kIncludeDiversificationNonce,
2545 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID,
2546 retry_token_length_length, retry_token_length, length_length));
2547
2548 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2549 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2550 // Stream ID should be the last 3 bytes of kStreamId.
2551 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2552 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2553 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2554 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2555
2556 CheckFramingBoundaries(fragments,
2557 framer_.transport_version() == QUIC_VERSION_99
2558 ? QUIC_INVALID_PACKET_HEADER
2559 : QUIC_INVALID_STREAM_DATA);
2560}
2561
2562TEST_P(QuicFramerTest, RejectPacket) {
zhongyi546cc452019-04-12 15:27:49 -07002563 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002564 visitor_.accept_packet_ = false;
2565
2566 // clang-format off
2567 unsigned char packet[] = {
2568 // public flags (8 byte connection_id)
2569 0x28,
2570 // connection_id
2571 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2572 // packet number
2573 0x12, 0x34, 0x56, 0x78,
2574
2575 // frame type (stream frame with fin)
2576 0xFF,
2577 // stream id
2578 0x01, 0x02, 0x03, 0x04,
2579 // offset
2580 0x3A, 0x98, 0xFE, 0xDC,
2581 0x32, 0x10, 0x76, 0x54,
2582 // data length
2583 0x00, 0x0c,
2584 // data
2585 'h', 'e', 'l', 'l',
2586 'o', ' ', 'w', 'o',
2587 'r', 'l', 'd', '!',
2588 };
2589
2590 unsigned char packet44[] = {
2591 // type (short header, 4 byte packet number)
2592 0x32,
2593 // connection_id
2594 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2595 // packet number
2596 0x12, 0x34, 0x56, 0x78,
2597
2598 // frame type (STREAM Frame with FIN, LEN, and OFFSET bits set)
2599 0x10 | 0x01 | 0x02 | 0x04,
2600 // stream id
2601 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
2602 // offset
2603 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2604 0x32, 0x10, 0x76, 0x54,
2605 // data length
2606 kVarInt62OneByte + 0x0c,
2607 // data
2608 'h', 'e', 'l', 'l',
2609 'o', ' ', 'w', 'o',
2610 'r', 'l', 'd', '!',
2611 };
2612
2613 unsigned char packet46[] = {
2614 // type (short header, 4 byte packet number)
2615 0x43,
2616 // connection_id
2617 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2618 // packet number
2619 0x12, 0x34, 0x56, 0x78,
2620
2621 // frame type (STREAM Frame with FIN, LEN, and OFFSET bits set)
2622 0x10 | 0x01 | 0x02 | 0x04,
2623 // stream id
2624 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
2625 // offset
2626 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2627 0x32, 0x10, 0x76, 0x54,
2628 // data length
2629 kVarInt62OneByte + 0x0c,
2630 // data
2631 'h', 'e', 'l', 'l',
2632 'o', ' ', 'w', 'o',
2633 'r', 'l', 'd', '!',
2634 };
2635 // clang-format on
2636
2637 unsigned char* p = packet;
2638 if (framer_.transport_version() > QUIC_VERSION_44) {
2639 p = packet46;
2640 } else if (framer_.transport_version() > QUIC_VERSION_43) {
2641 p = packet44;
2642 }
2643 QuicEncryptedPacket encrypted(AsChars(p),
2644 framer_.transport_version() > QUIC_VERSION_43
2645 ? QUIC_ARRAYSIZE(packet44)
2646 : QUIC_ARRAYSIZE(packet),
2647 false);
2648 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2649
2650 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2651 ASSERT_TRUE(visitor_.header_.get());
2652 EXPECT_TRUE(CheckDecryption(
2653 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2654 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2655
2656 ASSERT_EQ(0u, visitor_.stream_frames_.size());
2657 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2658}
2659
2660TEST_P(QuicFramerTest, RejectPublicHeader) {
2661 visitor_.accept_public_header_ = false;
2662
2663 // clang-format off
2664 unsigned char packet[] = {
2665 // public flags (8 byte connection_id)
2666 0x28,
2667 // connection_id
2668 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2669 };
2670
2671 unsigned char packet44[] = {
2672 // type (short header, 1 byte packet number)
2673 0x30,
2674 // connection_id
2675 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2676 // packet number
2677 0x01,
2678 };
2679
2680 unsigned char packet46[] = {
2681 // type (short header, 1 byte packet number)
2682 0x40,
2683 // connection_id
2684 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2685 // packet number
2686 0x01,
2687 };
2688 // clang-format on
2689
2690 QuicEncryptedPacket encrypted(
2691 framer_.transport_version() > QUIC_VERSION_44
2692 ? AsChars(packet46)
2693 : (framer_.transport_version() > QUIC_VERSION_43 ? AsChars(packet44)
2694 : AsChars(packet)),
2695 framer_.transport_version() > QUIC_VERSION_44
2696 ? QUIC_ARRAYSIZE(packet46)
2697 : (framer_.transport_version() > QUIC_VERSION_43
2698 ? QUIC_ARRAYSIZE(packet44)
2699 : QUIC_ARRAYSIZE(packet)),
2700 false);
2701 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2702
2703 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2704 ASSERT_TRUE(visitor_.header_.get());
2705 EXPECT_FALSE(visitor_.header_->packet_number.IsInitialized());
2706}
2707
2708TEST_P(QuicFramerTest, AckFrameOneAckBlock) {
zhongyi546cc452019-04-12 15:27:49 -07002709 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002710 // clang-format off
2711 PacketFragments packet = {
2712 // public flags (8 byte connection_id)
2713 {"",
2714 {0x2C}},
2715 // connection_id
2716 {"",
2717 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2718 // packet number
2719 {"",
2720 {0x12, 0x34, 0x56, 0x78}},
2721 // frame type (ack frame)
2722 // (one ack block, 2 byte largest observed, 2 byte block length)
2723 {"",
2724 {0x45}},
2725 // largest acked
2726 {"Unable to read largest acked.",
2727 {0x12, 0x34}},
2728 // Zero delta time.
2729 {"Unable to read ack delay time.",
2730 {0x00, 0x00}},
2731 // first ack block length.
2732 {"Unable to read first ack block length.",
2733 {0x12, 0x34}},
2734 // num timestamps.
2735 {"Unable to read num received packets.",
2736 {0x00}}
2737 };
2738
2739 PacketFragments packet44 = {
2740 // type (short packet, 4 byte packet number)
2741 {"",
2742 {0x32}},
2743 // connection_id
2744 {"",
2745 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2746 // packet number
2747 {"",
2748 {0x12, 0x34, 0x56, 0x78}},
2749 // frame type (ack frame)
2750 // (one ack block, 2 byte largest observed, 2 byte block length)
2751 {"",
2752 {0x45}},
2753 // largest acked
2754 {"Unable to read largest acked.",
2755 {0x12, 0x34}},
2756 // Zero delta time.
2757 {"Unable to read ack delay time.",
2758 {0x00, 0x00}},
2759 // first ack block length.
2760 {"Unable to read first ack block length.",
2761 {0x12, 0x34}},
2762 // num timestamps.
2763 {"Unable to read num received packets.",
2764 {0x00}}
2765 };
2766
2767 PacketFragments packet46 = {
2768 // type (short packet, 4 byte packet number)
2769 {"",
2770 {0x43}},
2771 // connection_id
2772 {"",
2773 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2774 // packet number
2775 {"",
2776 {0x12, 0x34, 0x56, 0x78}},
2777 // frame type (ack frame)
2778 // (one ack block, 2 byte largest observed, 2 byte block length)
2779 {"",
2780 {0x45}},
2781 // largest acked
2782 {"Unable to read largest acked.",
2783 {0x12, 0x34}},
2784 // Zero delta time.
2785 {"Unable to read ack delay time.",
2786 {0x00, 0x00}},
2787 // first ack block length.
2788 {"Unable to read first ack block length.",
2789 {0x12, 0x34}},
2790 // num timestamps.
2791 {"Unable to read num received packets.",
2792 {0x00}}
2793 };
2794
2795 PacketFragments packet99 = {
2796 // type (short packet, 4 byte packet number)
2797 {"",
2798 {0x43}},
2799 // connection_id
2800 {"",
2801 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2802 // packet number
2803 {"",
2804 {0x12, 0x34, 0x56, 0x78}},
2805 // frame type (IETF_ACK)
2806 // (one ack block, 2 byte largest observed, 2 byte block length)
2807 // IETF-Quic ignores the bit-fields in the ack type, all of
2808 // that information is encoded elsewhere in the frame.
2809 {"",
2810 {0x02}},
2811 // largest acked
2812 {"Unable to read largest acked.",
2813 {kVarInt62TwoBytes + 0x12, 0x34}},
2814 // Zero delta time.
2815 {"Unable to read ack delay time.",
2816 {kVarInt62OneByte + 0x00}},
2817 // Ack block count (0 -- no blocks after the first)
2818 {"Unable to read ack block count.",
2819 {kVarInt62OneByte + 0x00}},
2820 // first ack block length - 1.
2821 // IETF Quic defines the ack block's value as the "number of
2822 // packets that preceed the largest packet number in the block"
2823 // which for the 1st ack block is the largest acked field,
2824 // above. This means that if we are acking just packet 0x1234
2825 // then the 1st ack block will be 0.
2826 {"Unable to read first ack block length.",
2827 {kVarInt62TwoBytes + 0x12, 0x33}}
2828 };
2829 // clang-format on
2830
2831 PacketFragments& fragments =
2832 framer_.transport_version() == QUIC_VERSION_99
2833 ? packet99
2834 : (framer_.transport_version() > QUIC_VERSION_44
2835 ? packet46
2836 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
2837 : packet));
2838 std::unique_ptr<QuicEncryptedPacket> encrypted(
2839 AssemblePacketFromFragments(fragments));
2840 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2841
2842 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2843 ASSERT_TRUE(visitor_.header_.get());
2844 EXPECT_TRUE(CheckDecryption(
2845 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2846 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2847
2848 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2849 ASSERT_EQ(1u, visitor_.ack_frames_.size());
2850 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
2851 EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
2852 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
2853
2854 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
2855}
2856
2857// This test checks that the ack frame processor correctly identifies
2858// and handles the case where the first ack block is larger than the
2859// largest_acked packet.
2860TEST_P(QuicFramerTest, FirstAckFrameUnderflow) {
zhongyi546cc452019-04-12 15:27:49 -07002861 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002862 // clang-format off
2863 PacketFragments packet = {
2864 // public flags (8 byte connection_id)
2865 {"",
2866 {0x2C}},
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 {0x88, 0x88}},
2886 // num timestamps.
2887 {"Underflow with first ack block length 34952 largest acked is 4660.",
2888 {0x00}}
2889 };
2890
2891 PacketFragments packet44 = {
2892 // type (short header, 4 byte packet number)
2893 {"",
2894 {0x32}},
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 (ack frame)
2902 // (one ack block, 2 byte largest observed, 2 byte block length)
2903 {"",
2904 {0x45}},
2905 // largest acked
2906 {"Unable to read largest acked.",
2907 {0x12, 0x34}},
2908 // Zero delta time.
2909 {"Unable to read ack delay time.",
2910 {0x00, 0x00}},
2911 // first ack block length.
2912 {"Unable to read first ack block length.",
2913 {0x88, 0x88}},
2914 // num timestamps.
2915 {"Underflow with first ack block length 34952 largest acked is 4660.",
2916 {0x00}}
2917 };
2918
2919 PacketFragments packet46 = {
2920 // type (short header, 4 byte packet number)
2921 {"",
2922 {0x43}},
2923 // connection_id
2924 {"",
2925 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2926 // packet number
2927 {"",
2928 {0x12, 0x34, 0x56, 0x78}},
2929 // frame type (ack frame)
2930 // (one ack block, 2 byte largest observed, 2 byte block length)
2931 {"",
2932 {0x45}},
2933 // largest acked
2934 {"Unable to read largest acked.",
2935 {0x12, 0x34}},
2936 // Zero delta time.
2937 {"Unable to read ack delay time.",
2938 {0x00, 0x00}},
2939 // first ack block length.
2940 {"Unable to read first ack block length.",
2941 {0x88, 0x88}},
2942 // num timestamps.
2943 {"Underflow with first ack block length 34952 largest acked is 4660.",
2944 {0x00}}
2945 };
2946
2947 PacketFragments packet99 = {
2948 // type (short header, 4 byte packet number)
2949 {"",
2950 {0x43}},
2951 // connection_id
2952 {"",
2953 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2954 // packet number
2955 {"",
2956 {0x12, 0x34, 0x56, 0x78}},
2957 // frame type (IETF_ACK)
2958 {"",
2959 {0x02}},
2960 // largest acked
2961 {"Unable to read largest acked.",
2962 {kVarInt62TwoBytes + 0x12, 0x34}},
2963 // Zero delta time.
2964 {"Unable to read ack delay time.",
2965 {kVarInt62OneByte + 0x00}},
2966 // Ack block count (0 -- no blocks after the first)
2967 {"Unable to read ack block count.",
2968 {kVarInt62OneByte + 0x00}},
2969 // first ack block length.
2970 {"Unable to read first ack block length.",
2971 {kVarInt62TwoBytes + 0x28, 0x88}}
2972 };
2973 // clang-format on
2974
2975 PacketFragments& fragments =
2976 framer_.transport_version() == QUIC_VERSION_99
2977 ? packet99
2978 : (framer_.transport_version() > QUIC_VERSION_44
2979 ? packet46
2980 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
2981 : packet));
2982 std::unique_ptr<QuicEncryptedPacket> encrypted(
2983 AssemblePacketFromFragments(fragments));
2984 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
2985 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
2986}
2987
2988// This test checks that the ack frame processor correctly identifies
2989// and handles the case where the third ack block's gap is larger than the
2990// available space in the ack range.
2991TEST_P(QuicFramerTest, ThirdAckBlockUnderflowGap) {
2992 if (framer_.transport_version() != QUIC_VERSION_99) {
2993 // for now, only v99
2994 return;
2995 }
zhongyi546cc452019-04-12 15:27:49 -07002996 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002997 // clang-format off
2998 PacketFragments packet99 = {
2999 // type (short header, 4 byte packet number)
3000 {"",
3001 {0x43}},
3002 // connection_id
3003 {"",
3004 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3005 // packet number
3006 {"",
3007 {0x12, 0x34, 0x56, 0x78}},
3008 // frame type (IETF_ACK frame)
3009 {"",
3010 {0x02}},
3011 // largest acked
3012 {"Unable to read largest acked.",
3013 {kVarInt62OneByte + 63}},
3014 // Zero delta time.
3015 {"Unable to read ack delay time.",
3016 {kVarInt62OneByte + 0x00}},
3017 // Ack block count (2 -- 2 blocks after the first)
3018 {"Unable to read ack block count.",
3019 {kVarInt62OneByte + 0x02}},
3020 // first ack block length.
3021 {"Unable to read first ack block length.",
3022 {kVarInt62OneByte + 13}}, // Ack 14 packets, range 50..63 (inclusive)
3023
3024 {"Unable to read gap block value.",
3025 {kVarInt62OneByte + 9}}, // Gap 10 packets, 40..49 (inclusive)
3026 {"Unable to read ack block value.",
3027 {kVarInt62OneByte + 9}}, // Ack 10 packets, 30..39 (inclusive)
3028 {"Unable to read gap block value.",
3029 {kVarInt62OneByte + 29}}, // A gap of 30 packets (0..29 inclusive)
3030 // should be too big, leaving no room
3031 // for the ack.
3032 {"Underflow with gap block length 30 previous ack block start is 30.",
3033 {kVarInt62OneByte + 10}}, // Don't care
3034 };
3035 // clang-format on
3036
3037 std::unique_ptr<QuicEncryptedPacket> encrypted(
3038 AssemblePacketFromFragments(packet99));
3039 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3040 EXPECT_EQ(
3041 framer_.detailed_error(),
3042 "Underflow with gap block length 30 previous ack block start is 30.");
3043 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3044}
3045
3046// This test checks that the ack frame processor correctly identifies
3047// and handles the case where the third ack block's length is larger than the
3048// available space in the ack range.
3049TEST_P(QuicFramerTest, ThirdAckBlockUnderflowAck) {
3050 if (framer_.transport_version() != QUIC_VERSION_99) {
3051 // for now, only v99
3052 return;
3053 }
zhongyi546cc452019-04-12 15:27:49 -07003054 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003055 // clang-format off
3056 PacketFragments packet99 = {
3057 // type (short header, 4 byte packet number)
3058 {"",
3059 {0x43}},
3060 // connection_id
3061 {"",
3062 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3063 // packet number
3064 {"",
3065 {0x12, 0x34, 0x56, 0x78}},
3066 // frame type (IETF_ACK frame)
3067 {"",
3068 {0x02}},
3069 // largest acked
3070 {"Unable to read largest acked.",
3071 {kVarInt62OneByte + 63}},
3072 // Zero delta time.
3073 {"Unable to read ack delay time.",
3074 {kVarInt62OneByte + 0x00}},
3075 // Ack block count (2 -- 2 blocks after the first)
3076 {"Unable to read ack block count.",
3077 {kVarInt62OneByte + 0x02}},
3078 // first ack block length.
3079 {"Unable to read first ack block length.",
3080 {kVarInt62OneByte + 13}}, // only 50 packet numbers "left"
3081
3082 {"Unable to read gap block value.",
3083 {kVarInt62OneByte + 10}}, // Only 40 packet numbers left
3084 {"Unable to read ack block value.",
3085 {kVarInt62OneByte + 10}}, // only 30 packet numbers left.
3086 {"Unable to read gap block value.",
3087 {kVarInt62OneByte + 1}}, // Gap is OK, 29 packet numbers left
3088 {"Unable to read ack block value.",
3089 {kVarInt62OneByte + 30}}, // Use up all 30, should be an error
3090 };
3091 // clang-format on
3092
3093 std::unique_ptr<QuicEncryptedPacket> encrypted(
3094 AssemblePacketFromFragments(packet99));
3095 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3096 EXPECT_EQ(framer_.detailed_error(),
3097 "Underflow with ack block length 31 latest ack block end is 25.");
3098 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3099}
3100
3101// Tests a variety of ack block wrap scenarios. For example, if the
3102// N-1th block causes packet 0 to be acked, then a gap would wrap
3103// around to 0x3fffffff ffffffff... Make sure we detect this
3104// condition.
3105TEST_P(QuicFramerTest, AckBlockUnderflowGapWrap) {
3106 if (framer_.transport_version() != QUIC_VERSION_99) {
3107 // for now, only v99
3108 return;
3109 }
zhongyi546cc452019-04-12 15:27:49 -07003110 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003111 // clang-format off
3112 PacketFragments packet99 = {
3113 // type (short header, 4 byte packet number)
3114 {"",
3115 {0x43}},
3116 // connection_id
3117 {"",
3118 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3119 // packet number
3120 {"",
3121 {0x12, 0x34, 0x56, 0x78}},
3122 // frame type (IETF_ACK frame)
3123 {"",
3124 {0x02}},
3125 // largest acked
3126 {"Unable to read largest acked.",
3127 {kVarInt62OneByte + 10}},
3128 // Zero delta time.
3129 {"Unable to read ack delay time.",
3130 {kVarInt62OneByte + 0x00}},
3131 // Ack block count (1 -- 1 blocks after the first)
3132 {"Unable to read ack block count.",
3133 {kVarInt62OneByte + 1}},
3134 // first ack block length.
3135 {"Unable to read first ack block length.",
3136 {kVarInt62OneByte + 9}}, // Ack packets 1..10 (inclusive)
3137
3138 {"Unable to read gap block value.",
3139 {kVarInt62OneByte + 1}}, // Gap of 2 packets (-1...0), should wrap
3140 {"Underflow with gap block length 2 previous ack block start is 1.",
3141 {kVarInt62OneByte + 9}}, // irrelevant
3142 };
3143 // clang-format on
3144
3145 std::unique_ptr<QuicEncryptedPacket> encrypted(
3146 AssemblePacketFromFragments(packet99));
3147 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3148 EXPECT_EQ(framer_.detailed_error(),
3149 "Underflow with gap block length 2 previous ack block start is 1.");
3150 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3151}
3152
3153// As AckBlockUnderflowGapWrap, but in this test, it's the ack
3154// component of the ack-block that causes the wrap, not the gap.
3155TEST_P(QuicFramerTest, AckBlockUnderflowAckWrap) {
3156 if (framer_.transport_version() != QUIC_VERSION_99) {
3157 // for now, only v99
3158 return;
3159 }
zhongyi546cc452019-04-12 15:27:49 -07003160 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003161 // clang-format off
3162 PacketFragments packet99 = {
3163 // type (short header, 4 byte packet number)
3164 {"",
3165 {0x43}},
3166 // connection_id
3167 {"",
3168 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3169 // packet number
3170 {"",
3171 {0x12, 0x34, 0x56, 0x78}},
3172 // frame type (IETF_ACK frame)
3173 {"",
3174 {0x02}},
3175 // largest acked
3176 {"Unable to read largest acked.",
3177 {kVarInt62OneByte + 10}},
3178 // Zero delta time.
3179 {"Unable to read ack delay time.",
3180 {kVarInt62OneByte + 0x00}},
3181 // Ack block count (1 -- 1 blocks after the first)
3182 {"Unable to read ack block count.",
3183 {kVarInt62OneByte + 1}},
3184 // first ack block length.
3185 {"Unable to read first ack block length.",
3186 {kVarInt62OneByte + 6}}, // Ack packets 4..10 (inclusive)
3187
3188 {"Unable to read gap block value.",
3189 {kVarInt62OneByte + 1}}, // Gap of 2 packets (2..3)
3190 {"Unable to read ack block value.",
3191 {kVarInt62OneByte + 9}}, // Should wrap.
3192 };
3193 // clang-format on
3194
3195 std::unique_ptr<QuicEncryptedPacket> encrypted(
3196 AssemblePacketFromFragments(packet99));
3197 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3198 EXPECT_EQ(framer_.detailed_error(),
3199 "Underflow with ack block length 10 latest ack block end is 1.");
3200 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3201}
3202
3203// An ack block that acks the entire range, 1...0x3fffffffffffffff
3204TEST_P(QuicFramerTest, AckBlockAcksEverything) {
3205 if (framer_.transport_version() != QUIC_VERSION_99) {
3206 // for now, only v99
3207 return;
3208 }
zhongyi546cc452019-04-12 15:27:49 -07003209 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003210 // clang-format off
3211 PacketFragments packet99 = {
3212 // type (short header, 4 byte packet number)
3213 {"",
3214 {0x43}},
3215 // connection_id
3216 {"",
3217 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3218 // packet number
3219 {"",
3220 {0x12, 0x34, 0x56, 0x78}},
3221 // frame type (IETF_ACK frame)
3222 {"",
3223 {0x02}},
3224 // largest acked
3225 {"Unable to read largest acked.",
3226 {kVarInt62EightBytes + 0x3f, 0xff, 0xff, 0xff,
3227 0xff, 0xff, 0xff, 0xff}},
3228 // Zero delta time.
3229 {"Unable to read ack delay time.",
3230 {kVarInt62OneByte + 0x00}},
3231 // Ack block count No additional blocks
3232 {"Unable to read ack block count.",
3233 {kVarInt62OneByte + 0}},
3234 // first ack block length.
3235 {"Unable to read first ack block length.",
3236 {kVarInt62EightBytes + 0x3f, 0xff, 0xff, 0xff,
3237 0xff, 0xff, 0xff, 0xfe}},
3238 };
3239 // clang-format on
3240
3241 std::unique_ptr<QuicEncryptedPacket> encrypted(
3242 AssemblePacketFromFragments(packet99));
3243 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3244 EXPECT_EQ(1u, visitor_.ack_frames_.size());
3245 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3246 EXPECT_EQ(1u, frame.packets.NumIntervals());
3247 EXPECT_EQ(kLargestIetfLargestObserved, LargestAcked(frame));
3248 EXPECT_EQ(kLargestIetfLargestObserved.ToUint64(),
3249 frame.packets.NumPacketsSlow());
3250}
3251
3252// This test looks for a malformed ack where
3253// - There is a largest-acked value (that is, the frame is acking
3254// something,
3255// - But the length of the first ack block is 0 saying that no frames
3256// are being acked with the largest-acked value or there are no
3257// additional ack blocks.
3258//
3259TEST_P(QuicFramerTest, AckFrameFirstAckBlockLengthZero) {
3260 if (framer_.transport_version() == QUIC_VERSION_99) {
3261 // Not applicable to version 99 -- first ack block contains the
3262 // number of packets that preceed the largest_acked packet.
3263 // A value of 0 means no packets preceed --- that the block's
3264 // length is 1. Therefore the condition that this test checks can
3265 // not arise.
3266 return;
3267 }
nharper9bb83462019-05-01 10:53:22 -07003268 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003269
3270 // clang-format off
3271 PacketFragments packet = {
3272 // public flags (8 byte connection_id)
3273 {"",
3274 { 0x2C }},
3275 // connection_id
3276 {"",
3277 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3278 // packet number
3279 {"",
3280 { 0x12, 0x34, 0x56, 0x78 }},
3281
3282 // frame type (ack frame)
3283 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3284 {"",
3285 { 0x65 }},
3286 // largest acked
3287 {"Unable to read largest acked.",
3288 { 0x12, 0x34 }},
3289 // Zero delta time.
3290 {"Unable to read ack delay time.",
3291 { 0x00, 0x00 }},
3292 // num ack blocks ranges.
3293 {"Unable to read num of ack blocks.",
3294 { 0x01 }},
3295 // first ack block length.
3296 {"Unable to read first ack block length.",
3297 { 0x00, 0x00 }},
3298 // gap to next block.
3299 { "First block length is zero.",
3300 { 0x01 }},
3301 // ack block length.
3302 { "First block length is zero.",
3303 { 0x0e, 0xaf }},
3304 // Number of timestamps.
3305 { "First block length is zero.",
3306 { 0x00 }},
3307 };
3308
3309 PacketFragments packet44 = {
3310 // type (short header, 4 byte packet number)
3311 {"",
3312 { 0x32 }},
3313 // connection_id
3314 {"",
3315 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3316 // packet number
3317 {"",
3318 { 0x12, 0x34, 0x56, 0x78 }},
3319
3320 // frame type (ack frame)
3321 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3322 {"",
3323 { 0x65 }},
3324 // largest acked
3325 {"Unable to read largest acked.",
3326 { 0x12, 0x34 }},
3327 // Zero delta time.
3328 {"Unable to read ack delay time.",
3329 { 0x00, 0x00 }},
3330 // num ack blocks ranges.
3331 {"Unable to read num of ack blocks.",
3332 { 0x01 }},
3333 // first ack block length.
3334 {"Unable to read first ack block length.",
3335 { 0x00, 0x00 }},
3336 // gap to next block.
3337 { "First block length is zero.",
3338 { 0x01 }},
3339 // ack block length.
3340 { "First block length is zero.",
3341 { 0x0e, 0xaf }},
3342 // Number of timestamps.
3343 { "First block length is zero.",
3344 { 0x00 }},
3345 };
3346
3347 PacketFragments packet46 = {
3348 // type (short header, 4 byte packet number)
3349 {"",
3350 { 0x43 }},
3351 // connection_id
3352 {"",
3353 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3354 // packet number
3355 {"",
3356 { 0x12, 0x34, 0x56, 0x78 }},
3357
3358 // frame type (ack frame)
3359 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3360 {"",
3361 { 0x65 }},
3362 // largest acked
3363 {"Unable to read largest acked.",
3364 { 0x12, 0x34 }},
3365 // Zero delta time.
3366 {"Unable to read ack delay time.",
3367 { 0x00, 0x00 }},
3368 // num ack blocks ranges.
3369 {"Unable to read num of ack blocks.",
3370 { 0x01 }},
3371 // first ack block length.
3372 {"Unable to read first ack block length.",
3373 { 0x00, 0x00 }},
3374 // gap to next block.
3375 { "First block length is zero.",
3376 { 0x01 }},
3377 // ack block length.
3378 { "First block length is zero.",
3379 { 0x0e, 0xaf }},
3380 // Number of timestamps.
3381 { "First block length is zero.",
3382 { 0x00 }},
3383 };
3384
3385 // clang-format on
3386 PacketFragments& fragments =
3387 framer_.transport_version() > QUIC_VERSION_44
3388 ? packet46
3389 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet);
3390
3391 std::unique_ptr<QuicEncryptedPacket> encrypted(
3392 AssemblePacketFromFragments(fragments));
3393
3394 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3395 EXPECT_EQ(QUIC_INVALID_ACK_DATA, framer_.error());
3396
3397 ASSERT_TRUE(visitor_.header_.get());
3398 EXPECT_TRUE(CheckDecryption(
3399 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3400 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
3401
3402 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3403 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3404
3405 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3406}
3407
3408TEST_P(QuicFramerTest, AckFrameOneAckBlockMaxLength) {
zhongyi546cc452019-04-12 15:27:49 -07003409 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003410 // clang-format off
3411 PacketFragments packet = {
3412 // public flags (8 byte connection_id)
3413 {"",
3414 {0x2C}},
3415 // connection_id
3416 {"",
3417 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3418 // packet number
3419 {"",
3420 {0x12, 0x34, 0x56, 0x78}},
3421 // frame type (ack frame)
3422 // (one ack block, 4 byte largest observed, 2 byte block length)
3423 {"",
3424 {0x49}},
3425 // largest acked
3426 {"Unable to read largest acked.",
3427 {0x12, 0x34, 0x56, 0x78}},
3428 // Zero delta time.
3429 {"Unable to read ack delay time.",
3430 {0x00, 0x00}},
3431 // first ack block length.
3432 {"Unable to read first ack block length.",
3433 {0x12, 0x34}},
3434 // num timestamps.
3435 {"Unable to read num received packets.",
3436 {0x00}}
3437 };
3438
3439 PacketFragments packet44 = {
3440 // type (short header, 4 byte packet number)
3441 {"",
3442 {0x32}},
3443 // connection_id
3444 {"",
3445 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3446 // packet number
3447 {"",
3448 {0x56, 0x78, 0x9A, 0xBC}},
3449 // frame type (ack frame)
3450 // (one ack block, 4 byte largest observed, 2 byte block length)
3451 {"",
3452 {0x49}},
3453 // largest acked
3454 {"Unable to read largest acked.",
3455 {0x12, 0x34, 0x56, 0x78}},
3456 // Zero delta time.
3457 {"Unable to read ack delay time.",
3458 {0x00, 0x00}},
3459 // first ack block length.
3460 {"Unable to read first ack block length.",
3461 {0x12, 0x34}},
3462 // num timestamps.
3463 {"Unable to read num received packets.",
3464 {0x00}}
3465 };
3466
3467 PacketFragments packet46 = {
3468 // type (short header, 4 byte packet number)
3469 {"",
3470 {0x43}},
3471 // connection_id
3472 {"",
3473 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3474 // packet number
3475 {"",
3476 {0x56, 0x78, 0x9A, 0xBC}},
3477 // frame type (ack frame)
3478 // (one ack block, 4 byte largest observed, 2 byte block length)
3479 {"",
3480 {0x49}},
3481 // largest acked
3482 {"Unable to read largest acked.",
3483 {0x12, 0x34, 0x56, 0x78}},
3484 // Zero delta time.
3485 {"Unable to read ack delay time.",
3486 {0x00, 0x00}},
3487 // first ack block length.
3488 {"Unable to read first ack block length.",
3489 {0x12, 0x34}},
3490 // num timestamps.
3491 {"Unable to read num received packets.",
3492 {0x00}}
3493 };
3494
3495 PacketFragments packet99 = {
3496 // type (short header, 4 byte packet number)
3497 {"",
3498 {0x43}},
3499 // connection_id
3500 {"",
3501 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3502 // packet number
3503 {"",
3504 {0x56, 0x78, 0x9A, 0xBC}},
3505 // frame type (IETF_ACK frame)
3506 {"",
3507 {0x02}},
3508 // largest acked
3509 {"Unable to read largest acked.",
3510 {kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78}},
3511 // Zero delta time.
3512 {"Unable to read ack delay time.",
3513 {kVarInt62OneByte + 0x00}},
3514 // Number of ack blocks after first
3515 {"Unable to read ack block count.",
3516 {kVarInt62OneByte + 0x00}},
3517 // first ack block length.
3518 {"Unable to read first ack block length.",
3519 {kVarInt62TwoBytes + 0x12, 0x33}}
3520 };
3521 // clang-format on
3522
3523 PacketFragments& fragments =
3524 framer_.transport_version() == QUIC_VERSION_99
3525 ? packet99
3526 : (framer_.transport_version() > QUIC_VERSION_44
3527 ? packet46
3528 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
3529 : packet));
3530 std::unique_ptr<QuicEncryptedPacket> encrypted(
3531 AssemblePacketFromFragments(fragments));
3532 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3533
3534 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
3535 ASSERT_TRUE(visitor_.header_.get());
3536 EXPECT_TRUE(CheckDecryption(
3537 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3538 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
3539
3540 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3541 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3542 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3543 EXPECT_EQ(kPacketNumber, LargestAcked(frame));
3544 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
3545
3546 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3547}
3548
3549// Tests ability to handle multiple ackblocks after the first ack
3550// block. Non-version-99 tests include multiple timestamps as well.
3551TEST_P(QuicFramerTest, AckFrameTwoTimeStampsMultipleAckBlocks) {
zhongyi546cc452019-04-12 15:27:49 -07003552 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003553 // clang-format off
3554 PacketFragments packet = {
3555 // public flags (8 byte connection_id)
3556 {"",
3557 { 0x2C }},
3558 // connection_id
3559 {"",
3560 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3561 // packet number
3562 {"",
3563 { 0x12, 0x34, 0x56, 0x78 }},
3564
3565 // frame type (ack frame)
3566 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3567 {"",
3568 { 0x65 }},
3569 // largest acked
3570 {"Unable to read largest acked.",
3571 { 0x12, 0x34 }},
3572 // Zero delta time.
3573 {"Unable to read ack delay time.",
3574 { 0x00, 0x00 }},
3575 // num ack blocks ranges.
3576 {"Unable to read num of ack blocks.",
3577 { 0x04 }},
3578 // first ack block length.
3579 {"Unable to read first ack block length.",
3580 { 0x00, 0x01 }},
3581 // gap to next block.
3582 { "Unable to read gap to next ack block.",
3583 { 0x01 }},
3584 // ack block length.
3585 { "Unable to ack block length.",
3586 { 0x0e, 0xaf }},
3587 // gap to next block.
3588 { "Unable to read gap to next ack block.",
3589 { 0xff }},
3590 // ack block length.
3591 { "Unable to ack block length.",
3592 { 0x00, 0x00 }},
3593 // gap to next block.
3594 { "Unable to read gap to next ack block.",
3595 { 0x91 }},
3596 // ack block length.
3597 { "Unable to ack block length.",
3598 { 0x01, 0xea }},
3599 // gap to next block.
3600 { "Unable to read gap to next ack block.",
3601 { 0x05 }},
3602 // ack block length.
3603 { "Unable to ack block length.",
3604 { 0x00, 0x04 }},
3605 // Number of timestamps.
3606 { "Unable to read num received packets.",
3607 { 0x02 }},
3608 // Delta from largest observed.
3609 { "Unable to read sequence delta in received packets.",
3610 { 0x01 }},
3611 // Delta time.
3612 { "Unable to read time delta in received packets.",
3613 { 0x76, 0x54, 0x32, 0x10 }},
3614 // Delta from largest observed.
3615 { "Unable to read sequence delta in received packets.",
3616 { 0x02 }},
3617 // Delta time.
3618 { "Unable to read incremental time delta in received packets.",
3619 { 0x32, 0x10 }},
3620 };
3621
3622 PacketFragments packet44 = {
3623 // type (short header, 4 byte packet number)
3624 {"",
3625 { 0x32 }},
3626 // connection_id
3627 {"",
3628 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3629 // packet number
3630 {"",
3631 { 0x12, 0x34, 0x56, 0x78 }},
3632
3633 // frame type (ack frame)
3634 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3635 {"",
3636 { 0x65 }},
3637 // largest acked
3638 {"Unable to read largest acked.",
3639 { 0x12, 0x34 }},
3640 // Zero delta time.
3641 {"Unable to read ack delay time.",
3642 { 0x00, 0x00 }},
3643 // num ack blocks ranges.
3644 {"Unable to read num of ack blocks.",
3645 { 0x04 }},
3646 // first ack block length.
3647 {"Unable to read first ack block length.",
3648 { 0x00, 0x01 }},
3649 // gap to next block.
3650 { "Unable to read gap to next ack block.",
3651 { 0x01 }},
3652 // ack block length.
3653 { "Unable to ack block length.",
3654 { 0x0e, 0xaf }},
3655 // gap to next block.
3656 { "Unable to read gap to next ack block.",
3657 { 0xff }},
3658 // ack block length.
3659 { "Unable to ack block length.",
3660 { 0x00, 0x00 }},
3661 // gap to next block.
3662 { "Unable to read gap to next ack block.",
3663 { 0x91 }},
3664 // ack block length.
3665 { "Unable to ack block length.",
3666 { 0x01, 0xea }},
3667 // gap to next block.
3668 { "Unable to read gap to next ack block.",
3669 { 0x05 }},
3670 // ack block length.
3671 { "Unable to ack block length.",
3672 { 0x00, 0x04 }},
3673 // Number of timestamps.
3674 { "Unable to read num received packets.",
3675 { 0x02 }},
3676 // Delta from largest observed.
3677 { "Unable to read sequence delta in received packets.",
3678 { 0x01 }},
3679 // Delta time.
3680 { "Unable to read time delta in received packets.",
3681 { 0x76, 0x54, 0x32, 0x10 }},
3682 // Delta from largest observed.
3683 { "Unable to read sequence delta in received packets.",
3684 { 0x02 }},
3685 // Delta time.
3686 { "Unable to read incremental time delta in received packets.",
3687 { 0x32, 0x10 }},
3688 };
3689
3690 PacketFragments packet46 = {
3691 // type (short header, 4 byte packet number)
3692 {"",
3693 { 0x43 }},
3694 // connection_id
3695 {"",
3696 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3697 // packet number
3698 {"",
3699 { 0x12, 0x34, 0x56, 0x78 }},
3700
3701 // frame type (ack frame)
3702 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3703 {"",
3704 { 0x65 }},
3705 // largest acked
3706 {"Unable to read largest acked.",
3707 { 0x12, 0x34 }},
3708 // Zero delta time.
3709 {"Unable to read ack delay time.",
3710 { 0x00, 0x00 }},
3711 // num ack blocks ranges.
3712 {"Unable to read num of ack blocks.",
3713 { 0x04 }},
3714 // first ack block length.
3715 {"Unable to read first ack block length.",
3716 { 0x00, 0x01 }},
3717 // gap to next block.
3718 { "Unable to read gap to next ack block.",
3719 { 0x01 }},
3720 // ack block length.
3721 { "Unable to ack block length.",
3722 { 0x0e, 0xaf }},
3723 // gap to next block.
3724 { "Unable to read gap to next ack block.",
3725 { 0xff }},
3726 // ack block length.
3727 { "Unable to ack block length.",
3728 { 0x00, 0x00 }},
3729 // gap to next block.
3730 { "Unable to read gap to next ack block.",
3731 { 0x91 }},
3732 // ack block length.
3733 { "Unable to ack block length.",
3734 { 0x01, 0xea }},
3735 // gap to next block.
3736 { "Unable to read gap to next ack block.",
3737 { 0x05 }},
3738 // ack block length.
3739 { "Unable to ack block length.",
3740 { 0x00, 0x04 }},
3741 // Number of timestamps.
3742 { "Unable to read num received packets.",
3743 { 0x02 }},
3744 // Delta from largest observed.
3745 { "Unable to read sequence delta in received packets.",
3746 { 0x01 }},
3747 // Delta time.
3748 { "Unable to read time delta in received packets.",
3749 { 0x76, 0x54, 0x32, 0x10 }},
3750 // Delta from largest observed.
3751 { "Unable to read sequence delta in received packets.",
3752 { 0x02 }},
3753 // Delta time.
3754 { "Unable to read incremental time delta in received packets.",
3755 { 0x32, 0x10 }},
3756 };
3757
3758 PacketFragments packet99 = {
3759 // type (short header, 4 byte packet number)
3760 {"",
3761 { 0x43 }},
3762 // connection_id
3763 {"",
3764 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3765 // packet number
3766 {"",
3767 { 0x12, 0x34, 0x56, 0x78 }},
3768
3769 // frame type (IETF_ACK frame)
3770 {"",
3771 { 0x02 }},
3772 // largest acked
3773 {"Unable to read largest acked.",
3774 { kVarInt62TwoBytes + 0x12, 0x34 }}, // = 4660
3775 // Zero delta time.
3776 {"Unable to read ack delay time.",
3777 { kVarInt62OneByte + 0x00 }},
3778 // number of additional ack blocks
3779 {"Unable to read ack block count.",
3780 { kVarInt62OneByte + 0x03 }},
3781 // first ack block length.
3782 {"Unable to read first ack block length.",
3783 { kVarInt62OneByte + 0x00 }}, // 1st block length = 1
3784
3785 // Additional ACK Block #1
3786 // gap to next block.
3787 { "Unable to read gap block value.",
3788 { kVarInt62OneByte + 0x00 }}, // gap of 1 packet
3789 // ack block length.
3790 { "Unable to read ack block value.",
3791 { kVarInt62TwoBytes + 0x0e, 0xae }}, // 3759
3792
3793 // pre-version-99 test includes an ack block of 0 length. this
3794 // can not happen in version 99. ergo the second block is not
3795 // present in the v99 test and the gap length of the next block
3796 // is the sum of the two gaps in the pre-version-99 tests.
3797 // Additional ACK Block #2
3798 // gap to next block.
3799 { "Unable to read gap block value.",
3800 { kVarInt62TwoBytes + 0x01, 0x8f }}, // Gap is 400 (0x190) pkts
3801 // ack block length.
3802 { "Unable to read ack block value.",
3803 { kVarInt62TwoBytes + 0x01, 0xe9 }}, // block is 389 (x1ea) pkts
3804
3805 // Additional ACK Block #3
3806 // gap to next block.
3807 { "Unable to read gap block value.",
3808 { kVarInt62OneByte + 0x04 }}, // Gap is 5 packets.
3809 // ack block length.
3810 { "Unable to read ack block value.",
3811 { kVarInt62OneByte + 0x03 }}, // block is 3 packets.
3812 };
3813
3814 // clang-format on
3815 PacketFragments& fragments =
3816 framer_.transport_version() == QUIC_VERSION_99
3817 ? packet99
3818 : (framer_.transport_version() > QUIC_VERSION_44
3819 ? packet46
3820 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
3821 : packet));
3822
3823 std::unique_ptr<QuicEncryptedPacket> encrypted(
3824 AssemblePacketFromFragments(fragments));
3825
3826 framer_.set_process_timestamps(true);
3827 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3828
3829 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
3830 ASSERT_TRUE(visitor_.header_.get());
3831 EXPECT_TRUE(CheckDecryption(
3832 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3833 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
3834
3835 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3836 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3837 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3838 EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
3839 ASSERT_EQ(4254u, frame.packets.NumPacketsSlow());
3840 EXPECT_EQ(4u, frame.packets.NumIntervals());
3841 if (framer_.transport_version() == QUIC_VERSION_99) {
3842 EXPECT_EQ(0u, frame.received_packet_times.size());
3843 } else {
3844 EXPECT_EQ(2u, frame.received_packet_times.size());
3845 }
3846 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3847}
3848
3849TEST_P(QuicFramerTest, AckFrameTimeStampDeltaTooHigh) {
nharper9bb83462019-05-01 10:53:22 -07003850 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003851 // clang-format off
3852 unsigned char packet[] = {
3853 // public flags (8 byte connection_id)
3854 0x28,
3855 // connection_id
3856 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3857 // packet number
3858 0x12, 0x34, 0x56, 0x78,
3859
3860 // frame type (ack frame)
3861 // (no ack blocks, 1 byte largest observed, 1 byte block length)
3862 0x40,
3863 // largest acked
3864 0x01,
3865 // Zero delta time.
3866 0x00, 0x00,
3867 // first ack block length.
3868 0x01,
3869 // num timestamps.
3870 0x01,
3871 // Delta from largest observed.
3872 0x01,
3873 // Delta time.
3874 0x10, 0x32, 0x54, 0x76,
3875 };
3876
3877 unsigned char packet44[] = {
3878 // type (short header, 4 byte packet number)
3879 0x32,
3880 // connection_id
3881 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3882 // packet number
3883 0x12, 0x34, 0x56, 0x78,
3884
3885 // frame type (ack frame)
3886 // (no ack blocks, 1 byte largest observed, 1 byte block length)
3887 0x40,
3888 // largest acked
3889 0x01,
3890 // Zero delta time.
3891 0x00, 0x00,
3892 // first ack block length.
3893 0x01,
3894 // num timestamps.
3895 0x01,
3896 // Delta from largest observed.
3897 0x01,
3898 // Delta time.
3899 0x10, 0x32, 0x54, 0x76,
3900 };
3901
3902 unsigned char packet46[] = {
3903 // type (short header, 4 byte packet number)
3904 0x43,
3905 // connection_id
3906 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3907 // packet number
3908 0x12, 0x34, 0x56, 0x78,
3909
3910 // frame type (ack frame)
3911 // (no ack blocks, 1 byte largest observed, 1 byte block length)
3912 0x40,
3913 // largest acked
3914 0x01,
3915 // Zero delta time.
3916 0x00, 0x00,
3917 // first ack block length.
3918 0x01,
3919 // num timestamps.
3920 0x01,
3921 // Delta from largest observed.
3922 0x01,
3923 // Delta time.
3924 0x10, 0x32, 0x54, 0x76,
3925 };
3926 // clang-format on
3927 if (framer_.transport_version() == QUIC_VERSION_99) {
3928 return;
3929 }
3930 QuicEncryptedPacket encrypted(
3931 AsChars(framer_.transport_version() > QUIC_VERSION_44
3932 ? packet46
3933 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
3934 : packet)),
3935 QUIC_ARRAYSIZE(packet), false);
3936 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
3937 EXPECT_TRUE(QuicTextUtils::StartsWith(
3938 framer_.detailed_error(), "delta_from_largest_observed too high"));
3939}
3940
3941TEST_P(QuicFramerTest, AckFrameTimeStampSecondDeltaTooHigh) {
nharper9bb83462019-05-01 10:53:22 -07003942 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003943 // clang-format off
3944 unsigned char packet[] = {
3945 // public flags (8 byte connection_id)
3946 0x28,
3947 // connection_id
3948 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3949 // packet number
3950 0x12, 0x34, 0x56, 0x78,
3951
3952 // frame type (ack frame)
3953 // (no ack blocks, 1 byte largest observed, 1 byte block length)
3954 0x40,
3955 // largest acked
3956 0x03,
3957 // Zero delta time.
3958 0x00, 0x00,
3959 // first ack block length.
3960 0x03,
3961 // num timestamps.
3962 0x02,
3963 // Delta from largest observed.
3964 0x01,
3965 // Delta time.
3966 0x10, 0x32, 0x54, 0x76,
3967 // Delta from largest observed.
3968 0x03,
3969 // Delta time.
3970 0x10, 0x32,
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 0x03,
3986 // Zero delta time.
3987 0x00, 0x00,
3988 // first ack block length.
3989 0x03,
3990 // num timestamps.
3991 0x02,
3992 // Delta from largest observed.
3993 0x01,
3994 // Delta time.
3995 0x10, 0x32, 0x54, 0x76,
3996 // Delta from largest observed.
3997 0x03,
3998 // Delta time.
3999 0x10, 0x32,
4000 };
4001
4002 unsigned char packet46[] = {
4003 // type (short header, 4 byte packet number)
4004 0x43,
4005 // connection_id
4006 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4007 // packet number
4008 0x12, 0x34, 0x56, 0x78,
4009
4010 // frame type (ack frame)
4011 // (no ack blocks, 1 byte largest observed, 1 byte block length)
4012 0x40,
4013 // largest acked
4014 0x03,
4015 // Zero delta time.
4016 0x00, 0x00,
4017 // first ack block length.
4018 0x03,
4019 // num timestamps.
4020 0x02,
4021 // Delta from largest observed.
4022 0x01,
4023 // Delta time.
4024 0x10, 0x32, 0x54, 0x76,
4025 // Delta from largest observed.
4026 0x03,
4027 // Delta time.
4028 0x10, 0x32,
4029 };
4030 // clang-format on
4031 if (framer_.transport_version() == QUIC_VERSION_99) {
4032 return;
4033 }
4034 QuicEncryptedPacket encrypted(
4035 AsChars(framer_.transport_version() > QUIC_VERSION_44
4036 ? packet46
4037 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
4038 : packet)),
4039 QUIC_ARRAYSIZE(packet), false);
4040 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
4041 EXPECT_TRUE(QuicTextUtils::StartsWith(
4042 framer_.detailed_error(), "delta_from_largest_observed too high"));
4043}
4044
4045TEST_P(QuicFramerTest, NewStopWaitingFrame) {
4046 if (version_.transport_version == QUIC_VERSION_99) {
4047 return;
4048 }
nharper9bb83462019-05-01 10:53:22 -07004049 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004050 // clang-format off
4051 PacketFragments packet = {
4052 // public flags (8 byte connection_id)
4053 {"",
4054 {0x2C}},
4055 // connection_id
4056 {"",
4057 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4058 // packet number
4059 {"",
4060 {0x12, 0x34, 0x56, 0x78}},
4061 // frame type (stop waiting frame)
4062 {"",
4063 {0x06}},
4064 // least packet number awaiting an ack, delta from packet number.
4065 {"Unable to read least unacked delta.",
4066 {0x00, 0x00, 0x00, 0x08}}
4067 };
4068
4069 PacketFragments packet44 = {
4070 // type (short header, 4 byte packet number)
4071 {"",
4072 {0x32}},
4073 // connection_id
4074 {"",
4075 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4076 // packet number
4077 {"",
4078 {0x12, 0x34, 0x56, 0x78}},
4079 // frame type (stop waiting frame)
4080 {"",
4081 {0x06}},
4082 // least packet number awaiting an ack, delta from packet number.
4083 {"Unable to read least unacked delta.",
4084 {0x00, 0x00, 0x00, 0x08}}
4085 };
4086
4087 PacketFragments packet46 = {
4088 // type (short header, 4 byte packet number)
4089 {"",
4090 {0x43}},
4091 // connection_id
4092 {"",
4093 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4094 // packet number
4095 {"",
4096 {0x12, 0x34, 0x56, 0x78}},
4097 // frame type (stop waiting frame)
4098 {"",
4099 {0x06}},
4100 // least packet number awaiting an ack, delta from packet number.
4101 {"Unable to read least unacked delta.",
4102 {0x00, 0x00, 0x00, 0x08}}
4103 };
4104 // clang-format on
4105
4106 PacketFragments& fragments =
4107 framer_.transport_version() > QUIC_VERSION_44
4108 ? packet46
4109 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet);
4110
4111 std::unique_ptr<QuicEncryptedPacket> encrypted(
4112 AssemblePacketFromFragments(fragments));
ianswett97b690b2019-05-02 15:12:43 -07004113 if (GetQuicReloadableFlag(quic_do_not_accept_stop_waiting) &&
4114 version_.transport_version >= QUIC_VERSION_44) {
4115 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
4116 EXPECT_EQ(QUIC_INVALID_STOP_WAITING_DATA, framer_.error());
4117 EXPECT_EQ("STOP WAITING not supported in version 44+.",
4118 framer_.detailed_error());
4119 return;
4120 }
4121
QUICHE teama6ef0a62019-03-07 20:34:33 -05004122 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4123
4124 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4125 ASSERT_TRUE(visitor_.header_.get());
4126 EXPECT_TRUE(CheckDecryption(
4127 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4128 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4129
4130 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4131 ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size());
4132 const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0];
4133 EXPECT_EQ(kLeastUnacked, frame.least_unacked);
4134
4135 CheckFramingBoundaries(fragments, QUIC_INVALID_STOP_WAITING_DATA);
4136}
4137
4138TEST_P(QuicFramerTest, InvalidNewStopWaitingFrame) {
ianswett97b690b2019-05-02 15:12:43 -07004139 if (version_.transport_version == QUIC_VERSION_99 ||
4140 (GetQuicReloadableFlag(quic_do_not_accept_stop_waiting) &&
4141 version_.transport_version >= QUIC_VERSION_44)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004142 return;
4143 }
nharper9bb83462019-05-01 10:53:22 -07004144 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004145 // clang-format off
4146 unsigned char packet[] = {
4147 // public flags (8 byte connection_id)
4148 0x2C,
4149 // connection_id
4150 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4151 // packet number
4152 0x12, 0x34, 0x56, 0x78,
4153 // frame type (stop waiting frame)
4154 0x06,
4155 // least packet number awaiting an ack, delta from packet number.
4156 0x13, 0x34, 0x56, 0x78,
4157 0x9A, 0xA8,
4158 };
4159
4160 unsigned char packet44[] = {
4161 // type (short header, 4 byte packet number)
4162 0x32,
4163 // connection_id
4164 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4165 // packet number
4166 0x12, 0x34, 0x56, 0x78,
4167 // frame type (stop waiting frame)
4168 0x06,
4169 // least packet number awaiting an ack, delta from packet number.
4170 0x57, 0x78, 0x9A, 0xA8,
4171 };
4172
4173 unsigned char packet46[] = {
4174 // type (short header, 4 byte packet number)
4175 0x43,
4176 // connection_id
4177 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4178 // packet number
4179 0x12, 0x34, 0x56, 0x78,
4180 // frame type (stop waiting frame)
4181 0x06,
4182 // least packet number awaiting an ack, delta from packet number.
4183 0x57, 0x78, 0x9A, 0xA8,
4184 };
4185 // clang-format on
4186
4187 QuicEncryptedPacket encrypted(
4188 AsChars(framer_.transport_version() > QUIC_VERSION_44
4189 ? packet46
4190 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
4191 : packet)),
4192 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44)
4193 : QUIC_ARRAYSIZE(packet),
4194 false);
4195 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
4196 EXPECT_EQ(QUIC_INVALID_STOP_WAITING_DATA, framer_.error());
4197 EXPECT_EQ("Invalid unacked delta.", framer_.detailed_error());
4198}
4199
4200TEST_P(QuicFramerTest, RstStreamFrame) {
zhongyi546cc452019-04-12 15:27:49 -07004201 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004202 // clang-format off
4203 PacketFragments packet = {
4204 // public flags (8 byte connection_id)
4205 {"",
4206 {0x28}},
4207 // connection_id
4208 {"",
4209 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4210 // packet number
4211 {"",
4212 {0x12, 0x34, 0x56, 0x78}},
4213 // frame type (rst stream frame)
4214 {"",
4215 {0x01}},
4216 // stream id
4217 {"Unable to read stream_id.",
4218 {0x01, 0x02, 0x03, 0x04}},
4219 // sent byte offset
4220 {"Unable to read rst stream sent byte offset.",
4221 {0x3A, 0x98, 0xFE, 0xDC,
4222 0x32, 0x10, 0x76, 0x54}},
4223 // error code
4224 {"Unable to read rst stream error code.",
4225 {0x00, 0x00, 0x00, 0x01}}
4226 };
4227
4228 PacketFragments packet44 = {
4229 // type (short header, 4 byte packet number)
4230 {"",
4231 {0x32}},
4232 // connection_id
4233 {"",
4234 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4235 // packet number
4236 {"",
4237 {0x12, 0x34, 0x56, 0x78}},
4238 // frame type (rst stream frame)
4239 {"",
4240 {0x01}},
4241 // stream id
4242 {"Unable to read stream_id.",
4243 {0x01, 0x02, 0x03, 0x04}},
4244 // sent byte offset
4245 {"Unable to read rst stream sent byte offset.",
4246 {0x3A, 0x98, 0xFE, 0xDC,
4247 0x32, 0x10, 0x76, 0x54}},
4248 // error code
4249 {"Unable to read rst stream error code.",
4250 {0x00, 0x00, 0x00, 0x01}}
4251 };
4252
4253 PacketFragments packet46 = {
4254 // type (short header, 4 byte packet number)
4255 {"",
4256 {0x43}},
4257 // connection_id
4258 {"",
4259 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4260 // packet number
4261 {"",
4262 {0x12, 0x34, 0x56, 0x78}},
4263 // frame type (rst stream frame)
4264 {"",
4265 {0x01}},
4266 // stream id
4267 {"Unable to read stream_id.",
4268 {0x01, 0x02, 0x03, 0x04}},
4269 // sent byte offset
4270 {"Unable to read rst stream sent byte offset.",
4271 {0x3A, 0x98, 0xFE, 0xDC,
4272 0x32, 0x10, 0x76, 0x54}},
4273 // error code
4274 {"Unable to read rst stream error code.",
4275 {0x00, 0x00, 0x00, 0x01}}
4276 };
4277
4278 PacketFragments packet99 = {
4279 // type (short header, 4 byte packet number)
4280 {"",
4281 {0x43}},
4282 // connection_id
4283 {"",
4284 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4285 // packet number
4286 {"",
4287 {0x12, 0x34, 0x56, 0x78}},
4288 // frame type (IETF_RST_STREAM frame)
4289 {"",
4290 {0x04}},
4291 // stream id
4292 {"Unable to read rst stream stream id.",
4293 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4294 // application error code
4295 {"Unable to read rst stream error code.",
4296 {0x00, 0x01}}, // Not varint62 encoded
4297 // Final Offset
4298 {"Unable to read rst stream sent byte offset.",
4299 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}}
4300 };
4301 // clang-format on
4302
4303 PacketFragments& fragments =
4304 framer_.transport_version() == QUIC_VERSION_99
4305 ? packet99
4306 : (framer_.transport_version() > QUIC_VERSION_44
4307 ? packet46
4308 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
4309 : packet));
4310 std::unique_ptr<QuicEncryptedPacket> encrypted(
4311 AssemblePacketFromFragments(fragments));
4312 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4313
4314 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4315 ASSERT_TRUE(visitor_.header_.get());
4316 EXPECT_TRUE(CheckDecryption(
4317 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4318 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4319
4320 EXPECT_EQ(kStreamId, visitor_.rst_stream_frame_.stream_id);
4321 EXPECT_EQ(0x01, visitor_.rst_stream_frame_.error_code);
4322 EXPECT_EQ(kStreamOffset, visitor_.rst_stream_frame_.byte_offset);
4323 CheckFramingBoundaries(fragments, QUIC_INVALID_RST_STREAM_DATA);
4324}
4325
4326TEST_P(QuicFramerTest, ConnectionCloseFrame) {
zhongyi546cc452019-04-12 15:27:49 -07004327 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004328 // clang-format off
4329 PacketFragments packet = {
4330 // public flags (8 byte connection_id)
4331 {"",
4332 {0x28}},
4333 // connection_id
4334 {"",
4335 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4336 // packet number
4337 {"",
4338 {0x12, 0x34, 0x56, 0x78}},
4339 // frame type (connection close frame)
4340 {"",
4341 {0x02}},
4342 // error code
4343 {"Unable to read connection close error code.",
4344 {0x00, 0x00, 0x00, 0x11}},
4345 {"Unable to read connection close error details.",
4346 {
4347 // error details length
4348 0x0, 0x0d,
4349 // error details
4350 'b', 'e', 'c', 'a',
4351 'u', 's', 'e', ' ',
4352 'I', ' ', 'c', 'a',
4353 'n'}
4354 }
4355 };
4356
4357 PacketFragments packet44 = {
4358 // type (short header, 4 byte packet number)
4359 {"",
4360 {0x32}},
4361 // connection_id
4362 {"",
4363 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4364 // packet number
4365 {"",
4366 {0x12, 0x34, 0x56, 0x78}},
4367 // frame type (connection close frame)
4368 {"",
4369 {0x02}},
4370 // error code
4371 {"Unable to read connection close error code.",
4372 {0x00, 0x00, 0x00, 0x11}},
4373 {"Unable to read connection close error details.",
4374 {
4375 // error details length
4376 0x0, 0x0d,
4377 // error details
4378 'b', 'e', 'c', 'a',
4379 'u', 's', 'e', ' ',
4380 'I', ' ', 'c', 'a',
4381 'n'}
4382 }
4383 };
4384
4385 PacketFragments packet46 = {
4386 // type (short header, 4 byte packet number)
4387 {"",
4388 {0x43}},
4389 // connection_id
4390 {"",
4391 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4392 // packet number
4393 {"",
4394 {0x12, 0x34, 0x56, 0x78}},
4395 // frame type (connection close frame)
4396 {"",
4397 {0x02}},
4398 // error code
4399 {"Unable to read connection close error code.",
4400 {0x00, 0x00, 0x00, 0x11}},
4401 {"Unable to read connection close error details.",
4402 {
4403 // error details length
4404 0x0, 0x0d,
4405 // error details
4406 'b', 'e', 'c', 'a',
4407 'u', 's', 'e', ' ',
4408 'I', ' ', 'c', 'a',
4409 'n'}
4410 }
4411 };
4412
4413 PacketFragments packet99 = {
4414 // type (short header, 4 byte packet number)
4415 {"",
4416 {0x43}},
4417 // connection_id
4418 {"",
4419 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4420 // packet number
4421 {"",
4422 {0x12, 0x34, 0x56, 0x78}},
4423 // frame type (IETF_CONNECTION_CLOSE frame)
4424 {"",
4425 {0x1c}},
4426 // error code
4427 {"Unable to read connection close error code.",
4428 {0x00, 0x11}},
4429 {"Unable to read connection close frame type.",
4430 {kVarInt62TwoBytes + 0x12, 0x34 }},
4431 {"Unable to read connection close error details.",
4432 {
4433 // error details length
4434 kVarInt62OneByte + 0x0d,
4435 // error details
4436 'b', 'e', 'c', 'a',
4437 'u', 's', 'e', ' ',
4438 'I', ' ', 'c', 'a',
4439 'n'}
4440 }
4441 };
4442 // clang-format on
4443
4444 PacketFragments& fragments =
4445 framer_.transport_version() == QUIC_VERSION_99
4446 ? packet99
4447 : (framer_.transport_version() > QUIC_VERSION_44
4448 ? packet46
4449 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
4450 : packet));
4451 std::unique_ptr<QuicEncryptedPacket> encrypted(
4452 AssemblePacketFromFragments(fragments));
4453 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4454
4455 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4456 ASSERT_TRUE(visitor_.header_.get());
4457 EXPECT_TRUE(CheckDecryption(
4458 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4459 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4460
4461 EXPECT_EQ(0u, visitor_.stream_frames_.size());
zhongyiba6354a2019-04-10 16:49:25 -07004462 EXPECT_EQ(0x11u, static_cast<unsigned>(
4463 visitor_.connection_close_frame_.quic_error_code));
QUICHE teama6ef0a62019-03-07 20:34:33 -05004464 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4465 if (framer_.transport_version() == QUIC_VERSION_99) {
fkastenholze9d71a82019-04-09 05:12:13 -07004466 EXPECT_EQ(0x1234u,
4467 visitor_.connection_close_frame_.transport_close_frame_type);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004468 }
4469
4470 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4471
4472 CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4473}
4474
fkastenholz04bd4f32019-04-16 12:24:38 -07004475// Test the CONNECTION_CLOSE/Application variant.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004476TEST_P(QuicFramerTest, ApplicationCloseFrame) {
4477 if (framer_.transport_version() != QUIC_VERSION_99) {
4478 // This frame does not exist in versions other than 99.
4479 return;
4480 }
zhongyi546cc452019-04-12 15:27:49 -07004481 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004482
4483 // clang-format off
4484 PacketFragments packet99 = {
4485 // type (short header, 4 byte packet number)
4486 {"",
4487 {0x43}},
4488 // connection_id
4489 {"",
4490 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4491 // packet number
4492 {"",
4493 {0x12, 0x34, 0x56, 0x78}},
fkastenholz72f509b2019-04-10 09:17:49 -07004494 // frame type (IETF_CONNECTION_CLOSE/Application frame)
QUICHE teama6ef0a62019-03-07 20:34:33 -05004495 {"",
4496 {0x1d}},
4497 // error code
fkastenholz72f509b2019-04-10 09:17:49 -07004498 {"Unable to read connection close error code.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05004499 {0x00, 0x11}},
fkastenholz72f509b2019-04-10 09:17:49 -07004500 {"Unable to read connection close error details.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05004501 {
4502 // error details length
4503 kVarInt62OneByte + 0x0d,
4504 // error details
4505 'b', 'e', 'c', 'a',
4506 'u', 's', 'e', ' ',
4507 'I', ' ', 'c', 'a',
4508 'n'}
4509 }
4510 };
4511 // clang-format on
4512
4513 std::unique_ptr<QuicEncryptedPacket> encrypted(
4514 AssemblePacketFromFragments(packet99));
4515 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4516
4517 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4518 ASSERT_TRUE(visitor_.header_.get());
4519 EXPECT_TRUE(CheckDecryption(
4520 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4521 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4522
4523 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4524
fkastenholz72f509b2019-04-10 09:17:49 -07004525 EXPECT_EQ(IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
4526 visitor_.connection_close_frame_.close_type);
4527 EXPECT_EQ(122u, visitor_.connection_close_frame_.extracted_error_code);
4528 EXPECT_EQ(0x11, visitor_.connection_close_frame_.quic_error_code);
4529 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004530
4531 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4532
fkastenholz04bd4f32019-04-16 12:24:38 -07004533 CheckFramingBoundaries(packet99, QUIC_INVALID_CONNECTION_CLOSE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004534}
4535
4536TEST_P(QuicFramerTest, GoAwayFrame) {
4537 if (framer_.transport_version() == QUIC_VERSION_99) {
4538 // This frame is not supported in version 99.
4539 return;
4540 }
nharper9bb83462019-05-01 10:53:22 -07004541 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004542 // clang-format off
4543 PacketFragments packet = {
4544 // public flags (8 byte connection_id)
4545 {"",
4546 {0x28}},
4547 // connection_id
4548 {"",
4549 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4550 // packet number
4551 {"",
4552 {0x12, 0x34, 0x56, 0x78}},
4553 // frame type (go away frame)
4554 {"",
4555 {0x03}},
4556 // error code
4557 {"Unable to read go away error code.",
4558 {0x00, 0x00, 0x00, 0x09}},
4559 // stream id
4560 {"Unable to read last good stream id.",
4561 {0x01, 0x02, 0x03, 0x04}},
4562 // stream id
4563 {"Unable to read goaway reason.",
4564 {
4565 // error details length
4566 0x0, 0x0d,
4567 // error details
4568 'b', 'e', 'c', 'a',
4569 'u', 's', 'e', ' ',
4570 'I', ' ', 'c', 'a',
4571 'n'}
4572 }
4573 };
4574
4575 PacketFragments packet44 = {
4576 // type (short header, 4 byte packet number)
4577 {"",
4578 {0x32}},
4579 // connection_id
4580 {"",
4581 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4582 // packet number
4583 {"",
4584 {0x12, 0x34, 0x56, 0x78}},
4585 // frame type (go away frame)
4586 {"",
4587 {0x03}},
4588 // error code
4589 {"Unable to read go away error code.",
4590 {0x00, 0x00, 0x00, 0x09}},
4591 // stream id
4592 {"Unable to read last good stream id.",
4593 {0x01, 0x02, 0x03, 0x04}},
4594 // stream id
4595 {"Unable to read goaway reason.",
4596 {
4597 // error details length
4598 0x0, 0x0d,
4599 // error details
4600 'b', 'e', 'c', 'a',
4601 'u', 's', 'e', ' ',
4602 'I', ' ', 'c', 'a',
4603 'n'}
4604 }
4605 };
4606
4607 PacketFragments packet46 = {
4608 // type (short header, 4 byte packet number)
4609 {"",
4610 {0x43}},
4611 // connection_id
4612 {"",
4613 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4614 // packet number
4615 {"",
4616 {0x12, 0x34, 0x56, 0x78}},
4617 // frame type (go away frame)
4618 {"",
4619 {0x03}},
4620 // error code
4621 {"Unable to read go away error code.",
4622 {0x00, 0x00, 0x00, 0x09}},
4623 // stream id
4624 {"Unable to read last good stream id.",
4625 {0x01, 0x02, 0x03, 0x04}},
4626 // stream id
4627 {"Unable to read goaway reason.",
4628 {
4629 // error details length
4630 0x0, 0x0d,
4631 // error details
4632 'b', 'e', 'c', 'a',
4633 'u', 's', 'e', ' ',
4634 'I', ' ', 'c', 'a',
4635 'n'}
4636 }
4637 };
4638 // clang-format on
4639
4640 PacketFragments& fragments =
4641 framer_.transport_version() > QUIC_VERSION_44
4642 ? packet46
4643 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet);
4644 std::unique_ptr<QuicEncryptedPacket> encrypted(
4645 AssemblePacketFromFragments(fragments));
4646 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4647
4648 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4649 ASSERT_TRUE(visitor_.header_.get());
4650 EXPECT_TRUE(CheckDecryption(
4651 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4652 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4653
4654 EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id);
4655 EXPECT_EQ(0x9, visitor_.goaway_frame_.error_code);
4656 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase);
4657
4658 CheckFramingBoundaries(fragments, QUIC_INVALID_GOAWAY_DATA);
4659}
4660
4661TEST_P(QuicFramerTest, WindowUpdateFrame) {
4662 if (framer_.transport_version() == QUIC_VERSION_99) {
4663 // This frame is not in version 99, see MaxDataFrame and MaxStreamDataFrame
4664 // for Version 99 equivalents.
4665 return;
4666 }
nharper9bb83462019-05-01 10:53:22 -07004667 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004668 // clang-format off
4669 PacketFragments packet = {
4670 // public flags (8 byte connection_id)
4671 {"",
4672 {0x28}},
4673 // connection_id
4674 {"",
4675 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4676 // packet number
4677 {"",
4678 {0x12, 0x34, 0x56, 0x78}},
4679 // frame type (window update frame)
4680 {"",
4681 {0x04}},
4682 // stream id
4683 {"Unable to read stream_id.",
4684 {0x01, 0x02, 0x03, 0x04}},
4685 // byte offset
4686 {"Unable to read window byte_offset.",
4687 {0x3A, 0x98, 0xFE, 0xDC,
4688 0x32, 0x10, 0x76, 0x54}},
4689 };
4690
4691 PacketFragments packet44 = {
4692 // type (short header, 4 byte packet number)
4693 {"",
4694 {0x32}},
4695 // connection_id
4696 {"",
4697 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4698 // packet number
4699 {"",
4700 {0x12, 0x34, 0x56, 0x78}},
4701 // frame type (window update frame)
4702 {"",
4703 {0x04}},
4704 // stream id
4705 {"Unable to read stream_id.",
4706 {0x01, 0x02, 0x03, 0x04}},
4707 // byte offset
4708 {"Unable to read window byte_offset.",
4709 {0x3A, 0x98, 0xFE, 0xDC,
4710 0x32, 0x10, 0x76, 0x54}},
4711 };
4712
4713 PacketFragments packet46 = {
4714 // type (short header, 4 byte packet number)
4715 {"",
4716 {0x43}},
4717 // connection_id
4718 {"",
4719 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4720 // packet number
4721 {"",
4722 {0x12, 0x34, 0x56, 0x78}},
4723 // frame type (window update frame)
4724 {"",
4725 {0x04}},
4726 // stream id
4727 {"Unable to read stream_id.",
4728 {0x01, 0x02, 0x03, 0x04}},
4729 // byte offset
4730 {"Unable to read window byte_offset.",
4731 {0x3A, 0x98, 0xFE, 0xDC,
4732 0x32, 0x10, 0x76, 0x54}},
4733 };
4734
4735 // clang-format on
4736
4737 PacketFragments& fragments =
4738 framer_.transport_version() > QUIC_VERSION_44
4739 ? packet46
4740 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet);
4741 std::unique_ptr<QuicEncryptedPacket> encrypted(
4742 AssemblePacketFromFragments(fragments));
4743 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4744
4745 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4746 ASSERT_TRUE(visitor_.header_.get());
4747 EXPECT_TRUE(CheckDecryption(
4748 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4749 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4750
4751 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
4752 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.byte_offset);
4753
4754 CheckFramingBoundaries(fragments, QUIC_INVALID_WINDOW_UPDATE_DATA);
4755}
4756
4757TEST_P(QuicFramerTest, MaxDataFrame) {
4758 if (framer_.transport_version() != QUIC_VERSION_99) {
4759 // This frame is available only in version 99.
4760 return;
4761 }
zhongyi546cc452019-04-12 15:27:49 -07004762 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004763 // clang-format off
4764 PacketFragments packet99 = {
4765 // type (short header, 4 byte packet number)
4766 {"",
4767 {0x43}},
4768 // connection_id
4769 {"",
4770 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4771 // packet number
4772 {"",
4773 {0x12, 0x34, 0x56, 0x78}},
4774 // frame type (IETF_MAX_DATA frame)
4775 {"",
4776 {0x10}},
4777 // byte offset
4778 {"Can not read MAX_DATA byte-offset",
4779 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
4780 0x32, 0x10, 0x76, 0x54}},
4781 };
4782 // clang-format on
4783
4784 std::unique_ptr<QuicEncryptedPacket> encrypted(
4785 AssemblePacketFromFragments(packet99));
4786 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4787
4788 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4789 ASSERT_TRUE(visitor_.header_.get());
4790 EXPECT_TRUE(CheckDecryption(
4791 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4792 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4793
4794 EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
4795 visitor_.window_update_frame_.stream_id);
4796 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.byte_offset);
4797
4798 CheckFramingBoundaries(packet99, QUIC_INVALID_MAX_DATA_FRAME_DATA);
4799}
4800
4801TEST_P(QuicFramerTest, MaxStreamDataFrame) {
4802 if (framer_.transport_version() != QUIC_VERSION_99) {
4803 // This frame available only in version 99.
4804 return;
4805 }
zhongyi546cc452019-04-12 15:27:49 -07004806 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004807 // clang-format off
4808 PacketFragments packet99 = {
4809 // type (short header, 4 byte packet number)
4810 {"",
4811 {0x43}},
4812 // connection_id
4813 {"",
4814 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4815 // packet number
4816 {"",
4817 {0x12, 0x34, 0x56, 0x78}},
4818 // frame type (IETF_MAX_STREAM_DATA frame)
4819 {"",
4820 {0x11}},
4821 // stream id
4822 {"Can not read MAX_STREAM_DATA stream id",
4823 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4824 // byte offset
4825 {"Can not read MAX_STREAM_DATA byte-count",
4826 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
4827 0x32, 0x10, 0x76, 0x54}},
4828 };
4829 // clang-format on
4830
4831 std::unique_ptr<QuicEncryptedPacket> encrypted(
4832 AssemblePacketFromFragments(packet99));
4833 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4834
4835 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4836 ASSERT_TRUE(visitor_.header_.get());
4837 EXPECT_TRUE(CheckDecryption(
4838 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4839 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4840
4841 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
4842 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.byte_offset);
4843
4844 CheckFramingBoundaries(packet99, QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA);
4845}
4846
4847TEST_P(QuicFramerTest, BlockedFrame) {
zhongyi546cc452019-04-12 15:27:49 -07004848 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004849 // clang-format off
4850 PacketFragments packet = {
4851 // public flags (8 byte connection_id)
4852 {"",
4853 {0x28}},
4854 // connection_id
4855 {"",
4856 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4857 // packet number
4858 {"",
4859 {0x12, 0x34, 0x56, 0x78}},
4860 // frame type (blocked frame)
4861 {"",
4862 {0x05}},
4863 // stream id
4864 {"Unable to read stream_id.",
4865 {0x01, 0x02, 0x03, 0x04}},
4866 };
4867
4868 PacketFragments packet44 = {
4869 // type (short header, 4 byte packet number)
4870 {"",
4871 {0x32}},
4872 // connection_id
4873 {"",
4874 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4875 // packet number
4876 {"",
4877 {0x12, 0x34, 0x56, 0x78}},
4878 // frame type (blocked frame)
4879 {"",
4880 {0x05}},
4881 // stream id
4882 {"Unable to read stream_id.",
4883 {0x01, 0x02, 0x03, 0x04}},
4884 };
4885
4886 PacketFragments packet46 = {
4887 // type (short header, 4 byte packet number)
4888 {"",
4889 {0x43}},
4890 // connection_id
4891 {"",
4892 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4893 // packet number
4894 {"",
4895 {0x12, 0x34, 0x56, 0x78}},
4896 // frame type (blocked frame)
4897 {"",
4898 {0x05}},
4899 // stream id
4900 {"Unable to read stream_id.",
4901 {0x01, 0x02, 0x03, 0x04}},
4902 };
4903
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_STREAM_BLOCKED frame)
4915 {"",
4916 {0x15}},
4917 // stream id
4918 {"Can not read stream blocked stream id.",
4919 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4920 // Offset
4921 {"Can not read stream blocked offset.",
4922 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
4923 };
4924 // clang-format on
4925
4926 PacketFragments& fragments =
4927 framer_.transport_version() == QUIC_VERSION_99
4928 ? packet99
4929 : (framer_.transport_version() > QUIC_VERSION_44
4930 ? packet46
4931 : (framer_.transport_version() > QUIC_VERSION_43 ? packet44
4932 : packet));
4933 std::unique_ptr<QuicEncryptedPacket> encrypted(
4934 AssemblePacketFromFragments(fragments));
4935 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4936
4937 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4938 ASSERT_TRUE(visitor_.header_.get());
4939 EXPECT_TRUE(CheckDecryption(
4940 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4941 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4942
4943 if (framer_.transport_version() == QUIC_VERSION_99) {
4944 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
4945 } else {
4946 EXPECT_EQ(0u, visitor_.blocked_frame_.offset);
4947 }
4948 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
4949
4950 if (framer_.transport_version() == QUIC_VERSION_99) {
4951 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_BLOCKED_DATA);
4952 } else {
4953 CheckFramingBoundaries(fragments, QUIC_INVALID_BLOCKED_DATA);
4954 }
4955}
4956
4957TEST_P(QuicFramerTest, PingFrame) {
zhongyi546cc452019-04-12 15:27:49 -07004958 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004959 // clang-format off
4960 unsigned char packet[] = {
4961 // public flags (8 byte connection_id)
4962 0x28,
4963 // connection_id
4964 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4965 // packet number
4966 0x12, 0x34, 0x56, 0x78,
4967
4968 // frame type (ping frame)
4969 0x07,
4970 };
4971
4972 unsigned char packet44[] = {
4973 // type (short header, 4 byte packet number)
4974 0x32,
4975 // connection_id
4976 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4977 // packet number
4978 0x12, 0x34, 0x56, 0x78,
4979
4980 // frame type
4981 0x07,
4982 };
4983
4984 unsigned char packet46[] = {
4985 // type (short header, 4 byte packet number)
4986 0x43,
4987 // connection_id
4988 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4989 // packet number
4990 0x12, 0x34, 0x56, 0x78,
4991
4992 // frame type
4993 0x07,
4994 };
4995
4996 unsigned char packet99[] = {
4997 // type (short header, 4 byte packet number)
4998 0x43,
4999 // connection_id
5000 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5001 // packet number
5002 0x12, 0x34, 0x56, 0x78,
5003
5004 // frame type (IETF_PING frame)
5005 0x01,
5006 };
5007 // clang-format on
5008
5009 QuicEncryptedPacket encrypted(
5010 AsChars(framer_.transport_version() == QUIC_VERSION_99
5011 ? packet99
5012 : (framer_.transport_version() > QUIC_VERSION_44
5013 ? packet46
5014 : framer_.transport_version() > QUIC_VERSION_43
5015 ? packet44
5016 : packet)),
5017 framer_.transport_version() == QUIC_VERSION_99
5018 ? QUIC_ARRAYSIZE(packet99)
5019 : (framer_.transport_version() > QUIC_VERSION_44
5020 ? QUIC_ARRAYSIZE(packet46)
5021 : framer_.transport_version() > QUIC_VERSION_43
5022 ? QUIC_ARRAYSIZE(packet44)
5023 : QUIC_ARRAYSIZE(packet)),
5024 false);
5025 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5026
5027 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
5028 ASSERT_TRUE(visitor_.header_.get());
5029 EXPECT_TRUE(CheckDecryption(
5030 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5031 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
5032
5033 EXPECT_EQ(1u, visitor_.ping_frames_.size());
5034
5035 // No need to check the PING frame boundaries because it has no payload.
5036}
5037
5038TEST_P(QuicFramerTest, MessageFrame) {
5039 if (framer_.transport_version() <= QUIC_VERSION_44) {
5040 return;
5041 }
zhongyi546cc452019-04-12 15:27:49 -07005042 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005043 // clang-format off
5044 PacketFragments packet45 = {
5045 // type (short header, 4 byte packet number)
5046 {"",
5047 {0x32}},
5048 // connection_id
5049 {"",
5050 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5051 // packet number
5052 {"",
5053 {0x12, 0x34, 0x56, 0x78}},
5054 // message frame type.
5055 {"",
5056 { 0x21 }},
5057 // message length
5058 {"Unable to read message length",
5059 {0x07}},
5060 // message data
5061 {"Unable to read message data",
5062 {'m', 'e', 's', 's', 'a', 'g', 'e'}},
5063 // message frame no length.
5064 {"",
5065 { 0x20 }},
5066 // message data
5067 {{},
5068 {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
5069 };
5070
5071 PacketFragments packet46 = {
5072 // type (short header, 4 byte packet number)
5073 {"",
5074 {0x43}},
5075 // connection_id
5076 {"",
5077 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5078 // packet number
5079 {"",
5080 {0x12, 0x34, 0x56, 0x78}},
5081 // message frame type.
5082 {"",
5083 { 0x21 }},
5084 // message length
5085 {"Unable to read message length",
5086 {0x07}},
5087 // message data
5088 {"Unable to read message data",
5089 {'m', 'e', 's', 's', 'a', 'g', 'e'}},
5090 // message frame no length.
5091 {"",
5092 { 0x20 }},
5093 // message data
5094 {{},
5095 {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
5096 };
5097 // clang-format on
5098
5099 std::unique_ptr<QuicEncryptedPacket> encrypted(AssemblePacketFromFragments(
5100 framer_.transport_version() > QUIC_VERSION_44 ? packet46 : packet45));
5101 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5102
5103 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
5104 ASSERT_TRUE(visitor_.header_.get());
5105 EXPECT_TRUE(CheckDecryption(
5106 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5107 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
5108
5109 ASSERT_EQ(2u, visitor_.message_frames_.size());
5110 EXPECT_EQ(7u, visitor_.message_frames_[0]->message_length);
5111 EXPECT_EQ(8u, visitor_.message_frames_[1]->message_length);
5112
5113 CheckFramingBoundaries(
5114 framer_.transport_version() > QUIC_VERSION_44 ? packet46 : packet45,
5115 QUIC_INVALID_MESSAGE_DATA);
5116}
5117
5118TEST_P(QuicFramerTest, PublicResetPacketV33) {
5119 // clang-format off
5120 PacketFragments packet = {
5121 // public flags (public reset, 8 byte connection_id)
5122 {"",
5123 {0x0A}},
5124 // connection_id
5125 {"",
5126 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5127 {"Unable to read reset message.",
5128 {
5129 // message tag (kPRST)
5130 'P', 'R', 'S', 'T',
5131 // num_entries (2) + padding
5132 0x02, 0x00, 0x00, 0x00,
5133 // tag kRNON
5134 'R', 'N', 'O', 'N',
5135 // end offset 8
5136 0x08, 0x00, 0x00, 0x00,
5137 // tag kRSEQ
5138 'R', 'S', 'E', 'Q',
5139 // end offset 16
5140 0x10, 0x00, 0x00, 0x00,
5141 // nonce proof
5142 0x89, 0x67, 0x45, 0x23,
5143 0x01, 0xEF, 0xCD, 0xAB,
5144 // rejected packet number
5145 0xBC, 0x9A, 0x78, 0x56,
5146 0x34, 0x12, 0x00, 0x00,
5147 }
5148 }
5149 };
5150 // clang-format on
5151 if (framer_.transport_version() > QUIC_VERSION_43) {
5152 return;
5153 }
5154
5155 std::unique_ptr<QuicEncryptedPacket> encrypted(
5156 AssemblePacketFromFragments(packet));
5157 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5158 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5159 ASSERT_TRUE(visitor_.public_reset_packet_.get());
5160 EXPECT_EQ(FramerTestConnectionId(),
5161 visitor_.public_reset_packet_->connection_id);
5162 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof);
5163 EXPECT_EQ(
5164 IpAddressFamily::IP_UNSPEC,
5165 visitor_.public_reset_packet_->client_address.host().address_family());
5166
5167 CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
5168}
5169
5170TEST_P(QuicFramerTest, PublicResetPacket) {
5171 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5172
5173 // clang-format off
5174 PacketFragments packet = {
5175 // public flags (public reset, 8 byte connection_id)
5176 {"",
5177 {0x0E}},
5178 // connection_id
5179 {"",
5180 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5181 {"Unable to read reset message.",
5182 {
5183 // message tag (kPRST)
5184 'P', 'R', 'S', 'T',
5185 // num_entries (2) + padding
5186 0x02, 0x00, 0x00, 0x00,
5187 // tag kRNON
5188 'R', 'N', 'O', 'N',
5189 // end offset 8
5190 0x08, 0x00, 0x00, 0x00,
5191 // tag kRSEQ
5192 'R', 'S', 'E', 'Q',
5193 // end offset 16
5194 0x10, 0x00, 0x00, 0x00,
5195 // nonce proof
5196 0x89, 0x67, 0x45, 0x23,
5197 0x01, 0xEF, 0xCD, 0xAB,
5198 // rejected packet number
5199 0xBC, 0x9A, 0x78, 0x56,
5200 0x34, 0x12, 0x00, 0x00,
5201 }
5202 }
5203 };
5204 // clang-format on
5205
5206 if (framer_.transport_version() > QUIC_VERSION_43) {
5207 return;
5208 }
5209
5210 std::unique_ptr<QuicEncryptedPacket> encrypted(
5211 AssemblePacketFromFragments(packet));
5212 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5213 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5214 ASSERT_TRUE(visitor_.public_reset_packet_.get());
5215 EXPECT_EQ(FramerTestConnectionId(),
5216 visitor_.public_reset_packet_->connection_id);
5217 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof);
5218 EXPECT_EQ(
5219 IpAddressFamily::IP_UNSPEC,
5220 visitor_.public_reset_packet_->client_address.host().address_family());
5221
5222 CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
5223}
5224
5225TEST_P(QuicFramerTest, PublicResetPacketWithTrailingJunk) {
5226 // clang-format off
5227 unsigned char packet[] = {
5228 // public flags (public reset, 8 byte connection_id)
5229 0x0A,
5230 // connection_id
5231 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5232 // message tag (kPRST)
5233 'P', 'R', 'S', 'T',
5234 // num_entries (2) + padding
5235 0x02, 0x00, 0x00, 0x00,
5236 // tag kRNON
5237 'R', 'N', 'O', 'N',
5238 // end offset 8
5239 0x08, 0x00, 0x00, 0x00,
5240 // tag kRSEQ
5241 'R', 'S', 'E', 'Q',
5242 // end offset 16
5243 0x10, 0x00, 0x00, 0x00,
5244 // nonce proof
5245 0x89, 0x67, 0x45, 0x23,
5246 0x01, 0xEF, 0xCD, 0xAB,
5247 // rejected packet number
5248 0xBC, 0x9A, 0x78, 0x56,
5249 0x34, 0x12, 0x00, 0x00,
5250 // trailing junk
5251 'j', 'u', 'n', 'k',
5252 };
5253 // clang-format on
5254 if (framer_.transport_version() > QUIC_VERSION_43) {
5255 return;
5256 }
5257
5258 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5259 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5260 ASSERT_EQ(QUIC_INVALID_PUBLIC_RST_PACKET, framer_.error());
5261 EXPECT_EQ("Unable to read reset message.", framer_.detailed_error());
5262}
5263
5264TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) {
5265 // clang-format off
5266 PacketFragments packet = {
5267 // public flags (public reset, 8 byte connection_id)
5268 {"",
5269 {0x0A}},
5270 // connection_id
5271 {"",
5272 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5273 {"Unable to read reset message.",
5274 {
5275 // message tag (kPRST)
5276 'P', 'R', 'S', 'T',
5277 // num_entries (2) + padding
5278 0x03, 0x00, 0x00, 0x00,
5279 // tag kRNON
5280 'R', 'N', 'O', 'N',
5281 // end offset 8
5282 0x08, 0x00, 0x00, 0x00,
5283 // tag kRSEQ
5284 'R', 'S', 'E', 'Q',
5285 // end offset 16
5286 0x10, 0x00, 0x00, 0x00,
5287 // tag kCADR
5288 'C', 'A', 'D', 'R',
5289 // end offset 24
5290 0x18, 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 // client address: 4.31.198.44:443
5298 0x02, 0x00,
5299 0x04, 0x1F, 0xC6, 0x2C,
5300 0xBB, 0x01,
5301 }
5302 }
5303 };
5304 // clang-format on
5305 if (framer_.transport_version() > QUIC_VERSION_43) {
5306 return;
5307 }
5308
5309 std::unique_ptr<QuicEncryptedPacket> encrypted(
5310 AssemblePacketFromFragments(packet));
5311 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5312 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5313 ASSERT_TRUE(visitor_.public_reset_packet_.get());
5314 EXPECT_EQ(FramerTestConnectionId(),
5315 visitor_.public_reset_packet_->connection_id);
5316 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof);
5317 EXPECT_EQ("4.31.198.44",
5318 visitor_.public_reset_packet_->client_address.host().ToString());
5319 EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port());
5320
5321 CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
5322}
5323
5324TEST_P(QuicFramerTest, IetfStatelessResetPacket) {
5325 // clang-format off
5326 unsigned char packet[] = {
5327 // type (short packet, 1 byte packet number)
5328 0x50,
5329 // connection_id
5330 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5331 // Random bytes
5332 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5333 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5334 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5335 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5336 // stateless reset token
5337 0xB5, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
5338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5339 };
5340 // clang-format on
5341 if (framer_.transport_version() <= QUIC_VERSION_43) {
5342 return;
5343 }
5344 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005345 decrypter_ = new test::TestDecrypter();
zhongyi546cc452019-04-12 15:27:49 -07005346 if (framer_.version().KnowsWhichDecrypterToUse()) {
5347 framer_.InstallDecrypter(ENCRYPTION_INITIAL, QuicMakeUnique<NullDecrypter>(
5348 Perspective::IS_CLIENT));
5349 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
5350 std::unique_ptr<QuicDecrypter>(decrypter_));
5351 } else {
5352 framer_.SetDecrypter(ENCRYPTION_INITIAL,
5353 QuicMakeUnique<NullDecrypter>(Perspective::IS_CLIENT));
5354 framer_.SetAlternativeDecrypter(
5355 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
5356 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005357 // This packet cannot be decrypted because diversification nonce is missing.
5358 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5359 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5360 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5361 ASSERT_TRUE(visitor_.stateless_reset_packet_.get());
5362 EXPECT_EQ(kTestStatelessResetToken,
5363 visitor_.stateless_reset_packet_->stateless_reset_token);
5364}
5365
5366TEST_P(QuicFramerTest, IetfStatelessResetPacketInvalidStatelessResetToken) {
5367 // clang-format off
5368 unsigned char packet[] = {
5369 // type (short packet, 1 byte packet number)
5370 0x50,
5371 // connection_id
5372 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5373 // stateless reset token
5374 0xB6, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
5375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5376 };
5377 // clang-format on
5378 if (framer_.transport_version() <= QUIC_VERSION_43) {
5379 return;
5380 }
5381 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005382 decrypter_ = new test::TestDecrypter();
zhongyi546cc452019-04-12 15:27:49 -07005383 if (framer_.version().KnowsWhichDecrypterToUse()) {
5384 framer_.InstallDecrypter(ENCRYPTION_INITIAL, QuicMakeUnique<NullDecrypter>(
5385 Perspective::IS_CLIENT));
5386 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
5387 std::unique_ptr<QuicDecrypter>(decrypter_));
5388 } else {
5389 framer_.SetDecrypter(ENCRYPTION_INITIAL,
5390 QuicMakeUnique<NullDecrypter>(Perspective::IS_CLIENT));
5391 framer_.SetAlternativeDecrypter(
5392 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
5393 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005394 // This packet cannot be decrypted because diversification nonce is missing.
5395 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5396 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5397 EXPECT_EQ(QUIC_DECRYPTION_FAILURE, framer_.error());
5398 ASSERT_FALSE(visitor_.stateless_reset_packet_);
5399}
5400
dschinazi072da7c2019-05-07 17:57:42 -07005401TEST_P(QuicFramerTest, VersionNegotiationPacketClient) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005402 // clang-format off
5403 PacketFragments packet = {
5404 // public flags (version, 8 byte connection_id)
5405 {"",
5406 {0x29}},
5407 // connection_id
5408 {"",
5409 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5410 // version tag
5411 {"Unable to read supported version in negotiation.",
5412 {QUIC_VERSION_BYTES,
5413 'Q', '2', '.', '0'}},
5414 };
5415
5416 PacketFragments packet44 = {
5417 // type (long header)
5418 {"",
5419 {0x8F}},
5420 // version tag
5421 {"",
5422 {0x00, 0x00, 0x00, 0x00}},
5423 {"",
5424 {0x05}},
5425 // connection_id
5426 {"",
5427 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5428 // Supported versions
5429 {"Unable to read supported version in negotiation.",
5430 {QUIC_VERSION_BYTES,
5431 'Q', '2', '.', '0'}},
5432 };
5433 // clang-format on
5434
5435 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5436
5437 PacketFragments& fragments =
5438 framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet;
5439 std::unique_ptr<QuicEncryptedPacket> encrypted(
5440 AssemblePacketFromFragments(fragments));
5441 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5442 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5443 ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
5444 EXPECT_EQ(2u, visitor_.version_negotiation_packet_->versions.size());
5445 EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]);
5446
5447 // Remove the last version from the packet so that every truncated
5448 // version of the packet is invalid, otherwise checking boundaries
5449 // is annoyingly complicated.
5450 for (size_t i = 0; i < 4; ++i) {
5451 fragments.back().fragment.pop_back();
5452 }
5453 CheckFramingBoundaries(fragments, QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
5454}
5455
dschinazi072da7c2019-05-07 17:57:42 -07005456TEST_P(QuicFramerTest, VersionNegotiationPacketServer) {
5457 if (!GetQuicRestartFlag(quic_server_drop_version_negotiation)) {
5458 return;
5459 }
5460 if (framer_.transport_version() < QUIC_VERSION_44) {
5461 return;
5462 }
5463
5464 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
5465 // clang-format off
5466 unsigned char packet[] = {
5467 // public flags (long header with all ignored bits set)
5468 0xFF,
5469 // version
5470 0x00, 0x00, 0x00, 0x00,
5471 // connection ID lengths
5472 0x50,
5473 // destination connection ID
5474 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5475 // supported versions
5476 QUIC_VERSION_BYTES,
5477 'Q', '2', '.', '0',
5478 };
5479 // clang-format on
5480
5481 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5482 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5483 EXPECT_EQ(QUIC_INVALID_VERSION_NEGOTIATION_PACKET, framer_.error());
5484 EXPECT_EQ("Server received version negotiation packet.",
5485 framer_.detailed_error());
5486 EXPECT_FALSE(visitor_.version_negotiation_packet_.get());
5487}
5488
QUICHE teama6ef0a62019-03-07 20:34:33 -05005489TEST_P(QuicFramerTest, OldVersionNegotiationPacket) {
5490 // clang-format off
5491 PacketFragments packet = {
5492 // public flags (version, 8 byte connection_id)
5493 {"",
5494 {0x2D}},
5495 // connection_id
5496 {"",
5497 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5498 // version tag
5499 {"Unable to read supported version in negotiation.",
5500 {QUIC_VERSION_BYTES,
5501 'Q', '2', '.', '0'}},
5502 };
5503 // clang-format on
5504
5505 if (framer_.transport_version() > QUIC_VERSION_43) {
5506 return;
5507 }
5508
5509 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5510
5511 std::unique_ptr<QuicEncryptedPacket> encrypted(
5512 AssemblePacketFromFragments(packet));
5513 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5514 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5515 ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
5516 EXPECT_EQ(2u, visitor_.version_negotiation_packet_->versions.size());
5517 EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]);
5518
5519 // Remove the last version from the packet so that every truncated
5520 // version of the packet is invalid, otherwise checking boundaries
5521 // is annoyingly complicated.
5522 for (size_t i = 0; i < 4; ++i) {
5523 packet.back().fragment.pop_back();
5524 }
5525 CheckFramingBoundaries(packet, QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
5526}
5527
dschinazi244f6dc2019-05-06 15:45:16 -07005528TEST_P(QuicFramerTest, ParseIetfRetryPacket) {
5529 if (!framer_.version().SupportsRetry()) {
5530 return;
5531 }
5532 // IETF RETRY is only sent from client to server.
5533 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5534 // clang-format off
5535 unsigned char packet[] = {
5536 // public flags (long header with packet type RETRY and ODCIL=8)
5537 0xF5,
5538 // version
5539 QUIC_VERSION_BYTES,
5540 // connection ID lengths
5541 0x05,
5542 // source connection ID
5543 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5544 // original destination connection ID
5545 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5546 // retry token
5547 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5548 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5549 };
5550 // clang-format on
5551
5552 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5553 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5554
5555 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
5556 ASSERT_TRUE(visitor_.header_.get());
5557
5558 ASSERT_TRUE(visitor_.retry_original_connection_id_.get());
5559 ASSERT_TRUE(visitor_.retry_new_connection_id_.get());
5560 ASSERT_TRUE(visitor_.retry_token_.get());
5561
5562 EXPECT_EQ(FramerTestConnectionId(),
5563 *visitor_.retry_original_connection_id_.get());
5564 EXPECT_EQ(FramerTestConnectionIdPlusOne(),
5565 *visitor_.retry_new_connection_id_.get());
5566 EXPECT_EQ("Hello this is RETRY!", *visitor_.retry_token_.get());
5567}
5568
5569TEST_P(QuicFramerTest, RejectIetfRetryPacketAsServer) {
5570 if (!framer_.version().SupportsRetry()) {
5571 return;
5572 }
5573 // IETF RETRY is only sent from client to server.
5574 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
5575 // clang-format off
5576 unsigned char packet[] = {
5577 // public flags (long header with packet type RETRY and ODCIL=8)
5578 0xF5,
5579 // version
5580 QUIC_VERSION_BYTES,
5581 // connection ID lengths
5582 0x05,
5583 // source connection ID
5584 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5585 // original destination connection ID
5586 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5587 // retry token
5588 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5589 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5590 };
5591 // clang-format on
5592
5593 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5594 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5595
5596 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
5597 EXPECT_EQ("Client-initiated RETRY is invalid.", framer_.detailed_error());
5598}
5599
QUICHE teama6ef0a62019-03-07 20:34:33 -05005600TEST_P(QuicFramerTest, BuildPaddingFramePacket) {
5601 QuicPacketHeader header;
5602 header.destination_connection_id = FramerTestConnectionId();
5603 header.reset_flag = false;
5604 header.version_flag = false;
5605 header.packet_number = kPacketNumber;
5606
5607 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5608
5609 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07005610 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005611 // public flags (8 byte connection_id)
5612 0x28,
5613 // connection_id
5614 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5615 // packet number
5616 0x12, 0x34, 0x56, 0x78,
5617
5618 // frame type (padding frame)
5619 0x00,
5620 0x00, 0x00, 0x00, 0x00
5621 };
5622
dschinazi66dea072019-04-09 11:41:06 -07005623 unsigned char packet44[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005624 // type (short header, 4 byte packet number)
5625 0x32,
5626 // connection_id
5627 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5628 // packet number
5629 0x12, 0x34, 0x56, 0x78,
5630
5631 // frame type (padding frame)
5632 0x00,
5633 0x00, 0x00, 0x00, 0x00
5634 };
5635
dschinazi66dea072019-04-09 11:41:06 -07005636 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005637 // type (short header, 4 byte packet number)
5638 0x43,
5639 // connection_id
5640 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5641 // packet number
5642 0x12, 0x34, 0x56, 0x78,
5643
5644 // frame type (padding frame)
5645 0x00,
5646 0x00, 0x00, 0x00, 0x00
5647 };
5648
dschinazi66dea072019-04-09 11:41:06 -07005649 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005650 // type (short header, 4 byte packet number)
5651 0x43,
5652 // connection_id
5653 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5654 // packet number
5655 0x12, 0x34, 0x56, 0x78,
5656
5657 // frame type (padding frame)
5658 0x00,
5659 0x00, 0x00, 0x00, 0x00
5660 };
5661 // clang-format on
5662
5663 unsigned char* p = packet;
5664 if (framer_.transport_version() == QUIC_VERSION_99) {
5665 p = packet99;
5666 } else if (framer_.transport_version() > QUIC_VERSION_44) {
5667 p = packet46;
5668 } else if (framer_.transport_version() > QUIC_VERSION_43) {
5669 p = packet44;
5670 }
5671
5672 uint64_t header_size = GetPacketHeaderSize(
5673 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
5674 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
5675 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
5676 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07005677 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005678
5679 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5680 ASSERT_TRUE(data != nullptr);
5681
5682 test::CompareCharArraysWithHexError(
5683 "constructed packet", data->data(), data->length(), AsChars(p),
5684 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44)
5685 : QUIC_ARRAYSIZE(packet));
5686}
5687
5688TEST_P(QuicFramerTest, BuildStreamFramePacketWithNewPaddingFrame) {
5689 QuicPacketHeader header;
5690 header.destination_connection_id = FramerTestConnectionId();
5691 header.reset_flag = false;
5692 header.version_flag = false;
5693 header.packet_number = kPacketNumber;
5694 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
5695 QuicStringPiece("hello world!"));
5696 QuicPaddingFrame padding_frame(2);
5697 QuicFrames frames = {QuicFrame(padding_frame), QuicFrame(stream_frame),
5698 QuicFrame(padding_frame)};
5699
5700 // clang-format off
5701 unsigned char packet[] = {
5702 // public flags (8 byte connection_id)
5703 0x28,
5704 // connection_id
5705 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5706 // packet number
5707 0x12, 0x34, 0x56, 0x78,
5708
5709 // paddings
5710 0x00, 0x00,
5711 // frame type (stream frame with fin)
5712 0xFF,
5713 // stream id
5714 0x01, 0x02, 0x03, 0x04,
5715 // offset
5716 0x3A, 0x98, 0xFE, 0xDC,
5717 0x32, 0x10, 0x76, 0x54,
5718 // data length
5719 0x00, 0x0c,
5720 // data
5721 'h', 'e', 'l', 'l',
5722 'o', ' ', 'w', 'o',
5723 'r', 'l', 'd', '!',
5724 // paddings
5725 0x00, 0x00,
5726 };
5727
5728 unsigned char packet44[] = {
5729 // type (short header, 4 byte packet number)
5730 0x32,
5731 // connection_id
5732 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5733 // packet number
5734 0x12, 0x34, 0x56, 0x78,
5735
5736 // paddings
5737 0x00, 0x00,
5738 // frame type (stream frame with fin)
5739 0xFF,
5740 // stream id
5741 0x01, 0x02, 0x03, 0x04,
5742 // offset
5743 0x3A, 0x98, 0xFE, 0xDC,
5744 0x32, 0x10, 0x76, 0x54,
5745 // data length
5746 0x00, 0x0c,
5747 // data
5748 'h', 'e', 'l', 'l',
5749 'o', ' ', 'w', 'o',
5750 'r', 'l', 'd', '!',
5751 // paddings
5752 0x00, 0x00,
5753 };
5754
5755 unsigned char packet46[] = {
5756 // type (short header, 4 byte packet number)
5757 0x43,
5758 // connection_id
5759 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5760 // packet number
5761 0x12, 0x34, 0x56, 0x78,
5762
5763 // paddings
5764 0x00, 0x00,
5765 // frame type (stream frame with fin)
5766 0xFF,
5767 // stream id
5768 0x01, 0x02, 0x03, 0x04,
5769 // offset
5770 0x3A, 0x98, 0xFE, 0xDC,
5771 0x32, 0x10, 0x76, 0x54,
5772 // data length
5773 0x00, 0x0c,
5774 // data
5775 'h', 'e', 'l', 'l',
5776 'o', ' ', 'w', 'o',
5777 'r', 'l', 'd', '!',
5778 // paddings
5779 0x00, 0x00,
5780 };
5781
5782 unsigned char packet99[] = {
5783 // type (short header, 4 byte packet number)
5784 0x43,
5785 // connection_id
5786 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5787 // packet number
5788 0x12, 0x34, 0x56, 0x78,
5789
5790 // paddings
5791 0x00, 0x00,
5792 // frame type (IETF_STREAM with FIN, LEN, and OFFSET bits set)
5793 0x08 | 0x01 | 0x02 | 0x04,
5794 // stream id
5795 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
5796 // offset
5797 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5798 0x32, 0x10, 0x76, 0x54,
5799 // data length
5800 kVarInt62OneByte + 0x0c,
5801 // data
5802 'h', 'e', 'l', 'l',
5803 'o', ' ', 'w', 'o',
5804 'r', 'l', 'd', '!',
5805 // paddings
5806 0x00, 0x00,
5807 };
5808 // clang-format on
5809
5810 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5811 ASSERT_TRUE(data != nullptr);
5812
5813 unsigned char* p = packet;
5814 size_t p_size = QUIC_ARRAYSIZE(packet);
5815 if (framer_.transport_version() == QUIC_VERSION_99) {
5816 p = packet99;
5817 p_size = QUIC_ARRAYSIZE(packet99);
5818 } else if (framer_.transport_version() > QUIC_VERSION_44) {
5819 p = packet46;
5820 p_size = QUIC_ARRAYSIZE(packet46);
5821 } else if (framer_.transport_version() > QUIC_VERSION_43) {
5822 p = packet44;
5823 p_size = QUIC_ARRAYSIZE(packet44);
5824 }
5825 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
5826
5827 test::CompareCharArraysWithHexError("constructed packet", data->data(),
5828 data->length(), AsChars(p), p_size);
5829}
5830
5831TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) {
5832 QuicPacketHeader header;
5833 header.destination_connection_id = FramerTestConnectionId();
5834 header.reset_flag = false;
5835 header.version_flag = false;
5836 header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
5837 header.packet_number = kPacketNumber;
5838
5839 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5840
5841 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07005842 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005843 // public flags (8 byte connection_id and 4 byte packet number)
5844 0x28,
5845 // connection_id
5846 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5847 // packet number
5848 0x12, 0x34, 0x56, 0x78,
5849
5850 // frame type (padding frame)
5851 0x00,
5852 0x00, 0x00, 0x00, 0x00
5853 };
5854
dschinazi66dea072019-04-09 11:41:06 -07005855 unsigned char packet44[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005856 // type (short header, 4 byte packet number)
5857 0x32,
5858 // connection_id
5859 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5860 // packet number
5861 0x12, 0x34, 0x56, 0x78,
5862
5863 // frame type (padding frame)
5864 0x00,
5865 0x00, 0x00, 0x00, 0x00
5866 };
5867
dschinazi66dea072019-04-09 11:41:06 -07005868 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005869 // type (short header, 4 byte packet number)
5870 0x43,
5871 // connection_id
5872 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5873 // packet number
5874 0x12, 0x34, 0x56, 0x78,
5875
5876 // frame type (padding frame)
5877 0x00,
5878 0x00, 0x00, 0x00, 0x00
5879 };
5880
dschinazi66dea072019-04-09 11:41:06 -07005881 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005882 // type (short header, 4 byte packet number)
5883 0x43,
5884 // connection_id
5885 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5886 // packet number
5887 0x12, 0x34, 0x56, 0x78,
5888
5889 // frame type (padding frame)
5890 0x00,
5891 0x00, 0x00, 0x00, 0x00
5892 };
5893 // clang-format on
5894
5895 unsigned char* p = packet;
5896 if (framer_.transport_version() == QUIC_VERSION_99) {
5897 p = packet99;
5898 } else if (framer_.transport_version() > QUIC_VERSION_44) {
5899 p = packet46;
5900 } else if (framer_.transport_version() > QUIC_VERSION_43) {
5901 p = packet44;
5902 }
5903
5904 uint64_t header_size = GetPacketHeaderSize(
5905 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
5906 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
5907 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
5908 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07005909 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005910
5911 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5912 ASSERT_TRUE(data != nullptr);
5913
5914 test::CompareCharArraysWithHexError(
5915 "constructed packet", data->data(), data->length(), AsChars(p),
5916 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44)
5917 : QUIC_ARRAYSIZE(packet));
5918}
5919
5920TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) {
5921 QuicPacketHeader header;
5922 header.destination_connection_id = FramerTestConnectionId();
5923 header.reset_flag = false;
5924 header.version_flag = false;
5925 header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
5926 header.packet_number = kPacketNumber;
5927
5928 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5929
5930 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07005931 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005932 // public flags (8 byte connection_id and 2 byte packet number)
5933 0x18,
5934 // connection_id
5935 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5936 // packet number
5937 0x56, 0x78,
5938
5939 // frame type (padding frame)
5940 0x00,
5941 0x00, 0x00, 0x00, 0x00
5942 };
5943
dschinazi66dea072019-04-09 11:41:06 -07005944 unsigned char packet44[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005945 // type (short header, 2 byte packet number)
5946 0x31,
5947 // connection_id
5948 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5949 // packet number
5950 0x56, 0x78,
5951
5952 // frame type (padding frame)
5953 0x00,
5954 0x00, 0x00, 0x00, 0x00
5955 };
5956
dschinazi66dea072019-04-09 11:41:06 -07005957 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005958 // type (short header, 2 byte packet number)
5959 0x41,
5960 // connection_id
5961 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5962 // packet number
5963 0x56, 0x78,
5964
5965 // frame type (padding frame)
5966 0x00,
5967 0x00, 0x00, 0x00, 0x00
5968 };
5969
dschinazi66dea072019-04-09 11:41:06 -07005970 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005971 // type (short header, 2 byte packet number)
5972 0x41,
5973 // connection_id
5974 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5975 // packet number
5976 0x56, 0x78,
5977
5978 // frame type (padding frame)
5979 0x00,
5980 0x00, 0x00, 0x00, 0x00
5981 };
5982 // clang-format on
5983
5984 unsigned char* p = packet;
5985 if (framer_.transport_version() == QUIC_VERSION_99) {
5986 p = packet99;
5987 } else if (framer_.transport_version() > QUIC_VERSION_44) {
5988 p = packet46;
5989 } else if (framer_.transport_version() > QUIC_VERSION_43) {
5990 p = packet44;
5991 }
5992
5993 uint64_t header_size = GetPacketHeaderSize(
5994 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
5995 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
5996 !kIncludeDiversificationNonce, PACKET_2BYTE_PACKET_NUMBER,
5997 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07005998 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005999
6000 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6001 ASSERT_TRUE(data != nullptr);
6002
6003 test::CompareCharArraysWithHexError(
6004 "constructed packet", data->data(), data->length(), AsChars(p),
6005 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44)
6006 : QUIC_ARRAYSIZE(packet));
6007}
6008
6009TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) {
6010 QuicPacketHeader header;
6011 header.destination_connection_id = FramerTestConnectionId();
6012 header.reset_flag = false;
6013 header.version_flag = false;
6014 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
6015 header.packet_number = kPacketNumber;
6016
6017 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
6018
6019 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07006020 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006021 // public flags (8 byte connection_id and 1 byte packet number)
6022 0x08,
6023 // connection_id
6024 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6025 // packet number
6026 0x78,
6027
6028 // frame type (padding frame)
6029 0x00,
6030 0x00, 0x00, 0x00, 0x00
6031 };
6032
dschinazi66dea072019-04-09 11:41:06 -07006033 unsigned char packet44[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006034 // type (short header, 1 byte packet number)
6035 0x30,
6036 // connection_id
6037 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6038 // packet number
6039 0x78,
6040
6041 // frame type (padding frame)
6042 0x00,
6043 0x00, 0x00, 0x00, 0x00
6044 };
6045
dschinazi66dea072019-04-09 11:41:06 -07006046 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006047 // type (short header, 1 byte packet number)
6048 0x40,
6049 // connection_id
6050 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6051 // packet number
6052 0x78,
6053
6054 // frame type (padding frame)
6055 0x00,
6056 0x00, 0x00, 0x00, 0x00
6057 };
6058
dschinazi66dea072019-04-09 11:41:06 -07006059 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006060 // type (short header, 1 byte packet number)
6061 0x40,
6062 // connection_id
6063 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6064 // packet number
6065 0x78,
6066
6067 // frame type (padding frame)
6068 0x00,
6069 0x00, 0x00, 0x00, 0x00
6070 };
6071 // clang-format on
6072
6073 unsigned char* p = packet;
6074 if (framer_.transport_version() == QUIC_VERSION_99) {
6075 p = packet99;
6076 } else if (framer_.transport_version() > QUIC_VERSION_44) {
6077 p = packet46;
6078 } else if (framer_.transport_version() > QUIC_VERSION_43) {
6079 p = packet44;
6080 }
6081
6082 uint64_t header_size = GetPacketHeaderSize(
6083 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
6084 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
6085 !kIncludeDiversificationNonce, PACKET_1BYTE_PACKET_NUMBER,
6086 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07006087 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006088
6089 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6090 ASSERT_TRUE(data != nullptr);
6091
6092 test::CompareCharArraysWithHexError(
6093 "constructed packet", data->data(), data->length(), AsChars(p),
6094 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44)
6095 : QUIC_ARRAYSIZE(packet));
6096}
6097
6098TEST_P(QuicFramerTest, BuildStreamFramePacket) {
6099 QuicPacketHeader header;
6100 header.destination_connection_id = FramerTestConnectionId();
6101 header.reset_flag = false;
6102 header.version_flag = false;
6103 header.packet_number = kPacketNumber;
6104 if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
6105 header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
6106 }
6107
6108 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
6109 QuicStringPiece("hello world!"));
6110
6111 QuicFrames frames = {QuicFrame(stream_frame)};
6112
6113 // clang-format off
6114 unsigned char packet[] = {
6115 // public flags (8 byte connection_id)
6116 0x28,
6117 // connection_id
6118 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6119 // packet number
6120 0x12, 0x34, 0x56, 0x78,
6121
6122 // frame type (stream frame with fin and no length)
6123 0xDF,
6124 // stream id
6125 0x01, 0x02, 0x03, 0x04,
6126 // offset
6127 0x3A, 0x98, 0xFE, 0xDC,
6128 0x32, 0x10, 0x76, 0x54,
6129 // data
6130 'h', 'e', 'l', 'l',
6131 'o', ' ', 'w', 'o',
6132 'r', 'l', 'd', '!',
6133 };
6134
6135 unsigned char packet44[] = {
6136 // type (short header, 4 byte packet number)
6137 0x32,
6138 // connection_id
6139 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6140 // packet number
6141 0x12, 0x34, 0x56, 0x78,
6142
6143 // frame type (stream frame with fin and no length)
6144 0xDF,
6145 // stream id
6146 0x01, 0x02, 0x03, 0x04,
6147 // offset
6148 0x3A, 0x98, 0xFE, 0xDC,
6149 0x32, 0x10, 0x76, 0x54,
6150 // data
6151 'h', 'e', 'l', 'l',
6152 'o', ' ', 'w', 'o',
6153 'r', 'l', 'd', '!',
6154 };
6155
6156 unsigned char packet46[] = {
6157 // type (short header, 4 byte packet number)
6158 0x43,
6159 // connection_id
6160 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6161 // packet number
6162 0x12, 0x34, 0x56, 0x78,
6163
6164 // frame type (stream frame with fin and no length)
6165 0xDF,
6166 // stream id
6167 0x01, 0x02, 0x03, 0x04,
6168 // offset
6169 0x3A, 0x98, 0xFE, 0xDC,
6170 0x32, 0x10, 0x76, 0x54,
6171 // data
6172 'h', 'e', 'l', 'l',
6173 'o', ' ', 'w', 'o',
6174 'r', 'l', 'd', '!',
6175 };
6176
6177 unsigned char packet99[] = {
6178 // type (short header, 4 byte packet number)
6179 0x43,
6180 // connection_id
6181 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6182 // packet number
6183 0x12, 0x34, 0x56, 0x78,
6184
6185 // frame type (IETF_STREAM frame with FIN and OFFSET, no length)
6186 0x08 | 0x01 | 0x04,
6187 // stream id
6188 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
6189 // offset
6190 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6191 0x32, 0x10, 0x76, 0x54,
6192 // data
6193 'h', 'e', 'l', 'l',
6194 'o', ' ', 'w', 'o',
6195 'r', 'l', 'd', '!',
6196 };
6197 // clang-format on
6198
6199 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6200 ASSERT_TRUE(data != nullptr);
6201
6202 unsigned char* p = packet;
6203 size_t p_size = QUIC_ARRAYSIZE(packet);
6204 if (framer_.transport_version() == QUIC_VERSION_99) {
6205 p = packet99;
6206 p_size = QUIC_ARRAYSIZE(packet99);
6207 } else if (framer_.transport_version() > QUIC_VERSION_44) {
6208 p = packet46;
6209 p_size = QUIC_ARRAYSIZE(packet46);
6210 } else if (framer_.transport_version() > QUIC_VERSION_43) {
6211 p = packet44;
6212 p_size = QUIC_ARRAYSIZE(packet44);
6213 }
6214 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6215 data->length(), AsChars(p), p_size);
6216}
6217
6218TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) {
6219 QuicPacketHeader header;
6220 header.destination_connection_id = FramerTestConnectionId();
6221 header.reset_flag = false;
6222 header.version_flag = true;
6223 if (framer_.transport_version() > QUIC_VERSION_43) {
6224 header.long_packet_type = ZERO_RTT_PROTECTED;
6225 }
6226 header.packet_number = kPacketNumber;
6227 if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
6228 header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
6229 }
6230
6231 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
6232 QuicStringPiece("hello world!"));
6233 QuicFrames frames = {QuicFrame(stream_frame)};
6234
6235 // clang-format off
6236 unsigned char packet[] = {
6237 // public flags (version, 8 byte connection_id)
6238 0x2D,
6239 // connection_id
6240 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6241 // version tag
6242 QUIC_VERSION_BYTES,
6243 // packet number
6244 0x12, 0x34, 0x56, 0x78,
6245
6246 // frame type (stream frame with fin and no length)
6247 0xDF,
6248 // stream id
6249 0x01, 0x02, 0x03, 0x04,
6250 // offset
6251 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6252 // data
6253 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6254 };
6255
6256 unsigned char packet44[] = {
6257 // type (long header with packet type ZERO_RTT_PROTECTED)
6258 0xFC,
6259 // version tag
6260 QUIC_VERSION_BYTES,
6261 // connection_id length
6262 0x50,
6263 // connection_id
6264 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6265 // packet number
6266 0x12, 0x34, 0x56, 0x78,
6267
6268 // frame type (stream frame with fin and no length)
6269 0xDF,
6270 // stream id
6271 0x01, 0x02, 0x03, 0x04,
6272 // offset
6273 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6274 // data
6275 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6276 };
6277
6278 unsigned char packet46[] = {
6279 // type (long header with packet type ZERO_RTT_PROTECTED)
6280 0xD3,
6281 // version tag
6282 QUIC_VERSION_BYTES,
6283 // connection_id length
6284 0x50,
6285 // connection_id
6286 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6287 // packet number
6288 0x12, 0x34, 0x56, 0x78,
6289
6290 // frame type (stream frame with fin and no length)
6291 0xDF,
6292 // stream id
6293 0x01, 0x02, 0x03, 0x04,
6294 // offset
6295 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6296 // data
6297 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6298 };
6299
6300 unsigned char packet99[] = {
6301 // type (long header with packet type ZERO_RTT_PROTECTED)
6302 0xD3,
6303 // version tag
6304 QUIC_VERSION_BYTES,
6305 // connection_id length
6306 0x50,
6307 // connection_id
6308 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6309 // length
6310 0x40, 0x1D,
6311 // packet number
6312 0x12, 0x34, 0x56, 0x78,
6313
6314 // frame type (IETF_STREAM frame with fin and offset, no length)
6315 0x08 | 0x01 | 0x04,
6316 // stream id
6317 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
6318 // offset
6319 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6320 // data
6321 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6322 };
6323 // clang-format on
6324
6325 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6326 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6327 ASSERT_TRUE(data != nullptr);
6328
6329 unsigned char* p = packet;
6330 size_t p_size = QUIC_ARRAYSIZE(packet);
6331 if (framer_.transport_version() == QUIC_VERSION_99) {
6332 p = packet99;
6333 p_size = QUIC_ARRAYSIZE(packet99);
6334 } else if (framer_.transport_version() > QUIC_VERSION_44) {
6335 p = packet46;
6336 p_size = QUIC_ARRAYSIZE(packet46);
6337 } else if (framer_.transport_version() > QUIC_VERSION_43) {
6338 p = packet44;
6339 p_size = QUIC_ARRAYSIZE(packet44);
6340 }
6341 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6342 data->length(), AsChars(p), p_size);
6343}
6344
6345TEST_P(QuicFramerTest, BuildCryptoFramePacket) {
6346 if (framer_.transport_version() < QUIC_VERSION_99) {
6347 // CRYPTO frames aren't supported prior to v46.
6348 return;
6349 }
6350 QuicPacketHeader header;
6351 header.destination_connection_id = FramerTestConnectionId();
6352 header.reset_flag = false;
6353 header.version_flag = false;
6354 header.packet_number = kPacketNumber;
6355
6356 SimpleDataProducer data_producer;
6357 framer_.set_data_producer(&data_producer);
6358
6359 QuicStringPiece crypto_frame_contents("hello world!");
QUICHE team6987b4a2019-03-15 16:23:04 -07006360 QuicCryptoFrame crypto_frame(ENCRYPTION_INITIAL, kStreamOffset,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006361 crypto_frame_contents.length());
QUICHE team6987b4a2019-03-15 16:23:04 -07006362 data_producer.SaveCryptoData(ENCRYPTION_INITIAL, kStreamOffset,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006363 crypto_frame_contents);
6364
6365 QuicFrames frames = {QuicFrame(&crypto_frame)};
6366
6367 // clang-format off
6368 unsigned char packet[] = {
6369 // type (short header, 4 byte packet number)
6370 0x43,
6371 // connection_id
6372 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6373 // packet number
6374 0x12, 0x34, 0x56, 0x78,
6375
6376 // frame type (IETF_CRYPTO frame)
6377 0x06,
6378 // offset
6379 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6380 0x32, 0x10, 0x76, 0x54,
6381 // length
6382 kVarInt62OneByte + 12,
6383 // data
6384 'h', 'e', 'l', 'l',
6385 'o', ' ', 'w', 'o',
6386 'r', 'l', 'd', '!',
6387 };
6388 // clang-format on
6389
6390 size_t packet_size = QUIC_ARRAYSIZE(packet);
6391
6392 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6393 ASSERT_TRUE(data != nullptr);
6394 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6395 data->length(), AsChars(packet),
6396 packet_size);
6397}
6398
6399TEST_P(QuicFramerTest, CryptoFrame) {
6400 if (framer_.transport_version() < QUIC_VERSION_99) {
6401 // CRYPTO frames aren't supported prior to v46.
6402 return;
6403 }
zhongyi546cc452019-04-12 15:27:49 -07006404 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006405
6406 // clang-format off
6407 PacketFragments packet = {
6408 // type (short header, 4 byte packet number)
6409 {"",
6410 {0x43}},
6411 // connection_id
6412 {"",
6413 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
6414 // packet number
6415 {"",
6416 {0x12, 0x34, 0x56, 0x78}},
6417 // frame type (IETF_CRYPTO frame)
6418 {"",
6419 {0x06}},
6420 // offset
6421 {"",
6422 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6423 0x32, 0x10, 0x76, 0x54}},
6424 // data length
6425 {"Invalid data length.",
6426 {kVarInt62OneByte + 12}},
6427 // data
6428 {"Unable to read frame data.",
6429 {'h', 'e', 'l', 'l',
6430 'o', ' ', 'w', 'o',
6431 'r', 'l', 'd', '!'}},
6432 };
6433 // clang-format on
6434
6435 std::unique_ptr<QuicEncryptedPacket> encrypted(
6436 AssemblePacketFromFragments(packet));
6437 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6438
6439 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
6440 ASSERT_TRUE(visitor_.header_.get());
6441 EXPECT_TRUE(CheckDecryption(
6442 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
6443 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
6444 ASSERT_EQ(1u, visitor_.crypto_frames_.size());
6445 QuicCryptoFrame* frame = visitor_.crypto_frames_[0].get();
6446 EXPECT_EQ(kStreamOffset, frame->offset);
vasilvvc48c8712019-03-11 13:38:16 -07006447 EXPECT_EQ("hello world!",
6448 std::string(frame->data_buffer, frame->data_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05006449
6450 CheckFramingBoundaries(packet, QUIC_INVALID_FRAME_DATA);
6451}
6452
6453TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) {
6454 // clang-format off
6455 unsigned char packet[] = {
6456 // public flags (version, 8 byte connection_id)
6457 0x0D,
6458 // connection_id
6459 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6460 // version tag
6461 QUIC_VERSION_BYTES,
6462 };
6463 unsigned char packet44[] = {
6464 // type (long header)
6465 0x80,
6466 // version tag
6467 0x00, 0x00, 0x00, 0x00,
6468 // connection_id length
6469 0x05,
6470 // connection_id
6471 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6472 // version tag
6473 QUIC_VERSION_BYTES,
6474 };
6475 // clang-format on
6476 unsigned char* p = packet;
6477 size_t p_size = QUIC_ARRAYSIZE(packet);
6478 if (framer_.transport_version() > QUIC_VERSION_43) {
6479 p = packet44;
6480 p_size = QUIC_ARRAYSIZE(packet44);
6481 }
6482
6483 QuicConnectionId connection_id = FramerTestConnectionId();
6484 std::unique_ptr<QuicEncryptedPacket> data(
6485 framer_.BuildVersionNegotiationPacket(
6486 connection_id, framer_.transport_version() > QUIC_VERSION_43,
6487 SupportedVersions(GetParam())));
6488 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6489 data->length(), AsChars(p), p_size);
6490}
6491
6492TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlock) {
6493 QuicPacketHeader header;
6494 header.destination_connection_id = FramerTestConnectionId();
6495 header.reset_flag = false;
6496 header.version_flag = false;
6497 header.packet_number = kPacketNumber;
6498
6499 // Use kSmallLargestObserved to make this test finished in a short time.
6500 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6501 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6502
6503 QuicFrames frames = {QuicFrame(&ack_frame)};
6504
6505 // clang-format off
6506 unsigned char packet[] = {
6507 // public flags (8 byte connection_id)
6508 0x28,
6509 // connection_id
6510 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6511 // packet number
6512 0x12, 0x34, 0x56, 0x78,
6513
6514 // frame type (ack frame)
6515 // (no ack blocks, 2 byte largest observed, 2 byte block length)
6516 0x45,
6517 // largest acked
6518 0x12, 0x34,
6519 // Zero delta time.
6520 0x00, 0x00,
6521 // first ack block length.
6522 0x12, 0x34,
6523 // num timestamps.
6524 0x00,
6525 };
6526
6527 unsigned char packet44[] = {
6528 // type (short header, 4 byte packet number)
6529 0x32,
6530 // connection_id
6531 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6532 // packet number
6533 0x12, 0x34, 0x56, 0x78,
6534
6535 // frame type (ack frame)
6536 // (no ack blocks, 2 byte largest observed, 2 byte block length)
6537 0x45,
6538 // largest acked
6539 0x12, 0x34,
6540 // Zero delta time.
6541 0x00, 0x00,
6542 // first ack block length.
6543 0x12, 0x34,
6544 // num timestamps.
6545 0x00,
6546 };
6547
6548 unsigned char packet46[] = {
6549 // type (short header, 4 byte packet number)
6550 0x43,
6551 // connection_id
6552 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6553 // packet number
6554 0x12, 0x34, 0x56, 0x78,
6555
6556 // frame type (ack frame)
6557 // (no ack blocks, 2 byte largest observed, 2 byte block length)
6558 0x45,
6559 // largest acked
6560 0x12, 0x34,
6561 // Zero delta time.
6562 0x00, 0x00,
6563 // first ack block length.
6564 0x12, 0x34,
6565 // num timestamps.
6566 0x00,
6567 };
6568
6569 unsigned char packet99[] = {
6570 // type (short header, 4 byte packet number)
6571 0x43,
6572 // connection_id
6573 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6574 // packet number
6575 0x12, 0x34, 0x56, 0x78,
6576
6577 // frame type (IETF_ACK frame)
6578 0x02,
6579 // largest acked
6580 kVarInt62TwoBytes + 0x12, 0x34,
6581 // Zero delta time.
6582 kVarInt62OneByte + 0x00,
6583 // Number of additional ack blocks.
6584 kVarInt62OneByte + 0x00,
6585 // first ack block length.
6586 kVarInt62TwoBytes + 0x12, 0x33,
6587 };
6588 // clang-format on
6589 unsigned char* p = packet;
6590 size_t p_size = QUIC_ARRAYSIZE(packet);
6591 if (framer_.transport_version() == QUIC_VERSION_99) {
6592 p = packet99;
6593 p_size = QUIC_ARRAYSIZE(packet99);
6594 } else if (framer_.transport_version() > QUIC_VERSION_44) {
6595 p = packet46;
6596 p_size = QUIC_ARRAYSIZE(packet46);
6597 } else if (framer_.transport_version() > QUIC_VERSION_43) {
6598 p = packet44;
6599 p_size = QUIC_ARRAYSIZE(packet44);
6600 }
6601
6602 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6603 ASSERT_TRUE(data != nullptr);
6604 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6605 data->length(), AsChars(p), p_size);
6606}
6607
6608TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlockMaxLength) {
6609 QuicPacketHeader header;
6610 header.destination_connection_id = FramerTestConnectionId();
6611 header.reset_flag = false;
6612 header.version_flag = false;
6613 header.packet_number = kPacketNumber;
6614
6615 QuicAckFrame ack_frame = InitAckFrame(kPacketNumber);
6616 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6617
6618 QuicFrames frames = {QuicFrame(&ack_frame)};
6619
6620 // clang-format off
6621 unsigned char packet[] = {
6622 // public flags (8 byte connection_id)
6623 0x28,
6624 // connection_id
6625 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6626 // packet number
6627 0x12, 0x34, 0x56, 0x78,
6628
6629 // frame type (ack frame)
6630 // (no ack blocks, 4 byte largest observed, 4 byte block length)
6631 0x4A,
6632 // largest acked
6633 0x12, 0x34, 0x56, 0x78,
6634 // Zero delta time.
6635 0x00, 0x00,
6636 // first ack block length.
6637 0x12, 0x34, 0x56, 0x78,
6638 // num timestamps.
6639 0x00,
6640 };
6641
6642 unsigned char packet44[] = {
6643 // type (short header, 4 byte packet number)
6644 0x32,
6645 // connection_id
6646 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6647 // packet number
6648 0x12, 0x34, 0x56, 0x78,
6649
6650 // frame type (ack frame)
6651 // (no ack blocks, 4 byte largest observed, 4 byte block length)
6652 0x4A,
6653 // largest acked
6654 0x12, 0x34, 0x56, 0x78,
6655 // Zero delta time.
6656 0x00, 0x00,
6657 // first ack block length.
6658 0x12, 0x34, 0x56, 0x78,
6659 // num timestamps.
6660 0x00,
6661 };
6662
6663 unsigned char packet46[] = {
6664 // type (short header, 4 byte packet number)
6665 0x43,
6666 // connection_id
6667 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6668 // packet number
6669 0x12, 0x34, 0x56, 0x78,
6670
6671 // frame type (ack frame)
6672 // (no ack blocks, 4 byte largest observed, 4 byte block length)
6673 0x4A,
6674 // largest acked
6675 0x12, 0x34, 0x56, 0x78,
6676 // Zero delta time.
6677 0x00, 0x00,
6678 // first ack block length.
6679 0x12, 0x34, 0x56, 0x78,
6680 // num timestamps.
6681 0x00,
6682 };
6683
6684
6685 unsigned char packet99[] = {
6686 // type (short header, 4 byte packet number)
6687 0x43,
6688 // connection_id
6689 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6690 // packet number
6691 0x12, 0x34, 0x56, 0x78,
6692
6693 // frame type (IETF_ACK frame)
6694 0x02,
6695 // largest acked
6696 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
6697 // Zero delta time.
6698 kVarInt62OneByte + 0x00,
6699 // Nr. of additional ack blocks
6700 kVarInt62OneByte + 0x00,
6701 // first ack block length.
6702 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
6703 };
6704 // clang-format on
6705 unsigned char* p = packet;
6706 size_t p_size = QUIC_ARRAYSIZE(packet);
6707 if (framer_.transport_version() == QUIC_VERSION_99) {
6708 p = packet99;
6709 p_size = QUIC_ARRAYSIZE(packet99);
6710 } else if (framer_.transport_version() > QUIC_VERSION_44) {
6711 p = packet46;
6712 p_size = QUIC_ARRAYSIZE(packet46);
6713 } else if (framer_.transport_version() > QUIC_VERSION_43) {
6714 p = packet44;
6715 p_size = QUIC_ARRAYSIZE(packet44);
6716 }
6717
6718 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6719 ASSERT_TRUE(data != nullptr);
6720 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6721 data->length(), AsChars(p), p_size);
6722}
6723
6724TEST_P(QuicFramerTest, BuildAckFramePacketMultipleAckBlocks) {
6725 QuicPacketHeader header;
6726 header.destination_connection_id = FramerTestConnectionId();
6727 header.reset_flag = false;
6728 header.version_flag = false;
6729 header.packet_number = kPacketNumber;
6730
6731 // Use kSmallLargestObserved to make this test finished in a short time.
6732 QuicAckFrame ack_frame =
6733 InitAckFrame({{QuicPacketNumber(1), QuicPacketNumber(5)},
6734 {QuicPacketNumber(10), QuicPacketNumber(500)},
6735 {QuicPacketNumber(900), kSmallMissingPacket},
6736 {kSmallMissingPacket + 1, kSmallLargestObserved + 1}});
6737 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6738
6739 QuicFrames frames = {QuicFrame(&ack_frame)};
6740
6741 // clang-format off
6742 unsigned char packet[] = {
6743 // public flags (8 byte connection_id)
6744 0x28,
6745 // connection_id
6746 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6747 // packet number
6748 0x12, 0x34, 0x56, 0x78,
6749
6750 // frame type (ack frame)
6751 // (has ack blocks, 2 byte largest observed, 2 byte block length)
6752 0x65,
6753 // largest acked
6754 0x12, 0x34,
6755 // Zero delta time.
6756 0x00, 0x00,
6757 // num ack blocks ranges.
6758 0x04,
6759 // first ack block length.
6760 0x00, 0x01,
6761 // gap to next block.
6762 0x01,
6763 // ack block length.
6764 0x0e, 0xaf,
6765 // gap to next block.
6766 0xff,
6767 // ack block length.
6768 0x00, 0x00,
6769 // gap to next block.
6770 0x91,
6771 // ack block length.
6772 0x01, 0xea,
6773 // gap to next block.
6774 0x05,
6775 // ack block length.
6776 0x00, 0x04,
6777 // num timestamps.
6778 0x00,
6779 };
6780
6781 unsigned char packet44[] = {
6782 // type (short header, 4 byte packet number)
6783 0x32,
6784 // connection_id
6785 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6786 // packet number
6787 0x12, 0x34, 0x56, 0x78,
6788
6789 // frame type (ack frame)
6790 // (has ack blocks, 2 byte largest observed, 2 byte block length)
6791 0x65,
6792 // largest acked
6793 0x12, 0x34,
6794 // Zero delta time.
6795 0x00, 0x00,
6796 // num ack blocks ranges.
6797 0x04,
6798 // first ack block length.
6799 0x00, 0x01,
6800 // gap to next block.
6801 0x01,
6802 // ack block length.
6803 0x0e, 0xaf,
6804 // gap to next block.
6805 0xff,
6806 // ack block length.
6807 0x00, 0x00,
6808 // gap to next block.
6809 0x91,
6810 // ack block length.
6811 0x01, 0xea,
6812 // gap to next block.
6813 0x05,
6814 // ack block length.
6815 0x00, 0x04,
6816 // num timestamps.
6817 0x00,
6818 };
6819
6820 unsigned char packet46[] = {
6821 // type (short header, 4 byte packet number)
6822 0x43,
6823 // connection_id
6824 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6825 // packet number
6826 0x12, 0x34, 0x56, 0x78,
6827
6828 // frame type (ack frame)
6829 // (has ack blocks, 2 byte largest observed, 2 byte block length)
6830 0x65,
6831 // largest acked
6832 0x12, 0x34,
6833 // Zero delta time.
6834 0x00, 0x00,
6835 // num ack blocks ranges.
6836 0x04,
6837 // first ack block length.
6838 0x00, 0x01,
6839 // gap to next block.
6840 0x01,
6841 // ack block length.
6842 0x0e, 0xaf,
6843 // gap to next block.
6844 0xff,
6845 // ack block length.
6846 0x00, 0x00,
6847 // gap to next block.
6848 0x91,
6849 // ack block length.
6850 0x01, 0xea,
6851 // gap to next block.
6852 0x05,
6853 // ack block length.
6854 0x00, 0x04,
6855 // num timestamps.
6856 0x00,
6857 };
6858
6859 unsigned char packet99[] = {
6860 // type (short header, 4 byte packet number)
6861 0x43,
6862 // connection_id
6863 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6864 // packet number
6865 0x12, 0x34, 0x56, 0x78,
6866
6867 // frame type (IETF_ACK frame)
6868 0x02,
6869 // largest acked
6870 kVarInt62TwoBytes + 0x12, 0x34,
6871 // Zero delta time.
6872 kVarInt62OneByte + 0x00,
6873 // num additional ack blocks.
6874 kVarInt62OneByte + 0x03,
6875 // first ack block length.
6876 kVarInt62OneByte + 0x00,
6877
6878 // gap to next block.
6879 kVarInt62OneByte + 0x00,
6880 // ack block length.
6881 kVarInt62TwoBytes + 0x0e, 0xae,
6882
6883 // gap to next block.
6884 kVarInt62TwoBytes + 0x01, 0x8f,
6885 // ack block length.
6886 kVarInt62TwoBytes + 0x01, 0xe9,
6887
6888 // gap to next block.
6889 kVarInt62OneByte + 0x04,
6890 // ack block length.
6891 kVarInt62OneByte + 0x03,
6892 };
6893 // clang-format on
6894 unsigned char* p = packet;
6895 size_t p_size = QUIC_ARRAYSIZE(packet);
6896 if (framer_.transport_version() == QUIC_VERSION_99) {
6897 p = packet99;
6898 p_size = QUIC_ARRAYSIZE(packet99);
6899 } else if (framer_.transport_version() > QUIC_VERSION_44) {
6900 p = packet46;
6901 p_size = QUIC_ARRAYSIZE(packet46);
6902 } else if (framer_.transport_version() > QUIC_VERSION_43) {
6903 p = packet44;
6904 p_size = QUIC_ARRAYSIZE(packet44);
6905 }
6906
6907 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6908 ASSERT_TRUE(data != nullptr);
6909
6910 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6911 data->length(), AsChars(p), p_size);
6912}
6913
6914TEST_P(QuicFramerTest, BuildAckFramePacketMaxAckBlocks) {
6915 QuicPacketHeader header;
6916 header.destination_connection_id = FramerTestConnectionId();
6917 header.reset_flag = false;
6918 header.version_flag = false;
6919 header.packet_number = kPacketNumber;
6920
6921 // Use kSmallLargestObservedto make this test finished in a short time.
6922 QuicAckFrame ack_frame;
6923 ack_frame.largest_acked = kSmallLargestObserved;
6924 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6925 // 300 ack blocks.
6926 for (size_t i = 2; i < 2 * 300; i += 2) {
6927 ack_frame.packets.Add(QuicPacketNumber(i));
6928 }
6929 ack_frame.packets.AddRange(QuicPacketNumber(600), kSmallLargestObserved + 1);
6930
6931 QuicFrames frames = {QuicFrame(&ack_frame)};
6932
6933 // clang-format off
6934 unsigned char packet[] = {
6935 // public flags (8 byte connection_id)
6936 0x28,
6937 // connection_id
6938 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6939 // packet number
6940 0x12, 0x34, 0x56, 0x78,
6941 // frame type (ack frame)
6942 // (has ack blocks, 2 byte largest observed, 2 byte block length)
6943 0x65,
6944 // largest acked
6945 0x12, 0x34,
6946 // Zero delta time.
6947 0x00, 0x00,
6948 // num ack blocks ranges.
6949 0xff,
6950 // first ack block length.
6951 0x0f, 0xdd,
6952 // 255 = 4 * 63 + 3
6953 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6954 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6955 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6956 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6957 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6958 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6959 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6960 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6961 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6962 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6963
6964 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6965 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6966 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6967 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6968 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6969 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6970 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6971 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6972 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6973 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6974
6975 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6976 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6977 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6978 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6979 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6980 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6981 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6982 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6983 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6984 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6985
6986 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6987 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6988 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6989 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6990 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6991 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6992 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6993 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6994 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6995 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6996
6997 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6998 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6999 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7000 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7001 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7002 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7003 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7004 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7005 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7006 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7007
7008 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7009 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7010 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7011 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7012 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7013 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7014 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7015 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7016 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7017 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7018
7019 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7020 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7021 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7022 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7023 // num timestamps.
7024 0x00,
7025 };
7026
7027 unsigned char packet44[] = {
7028 // type (short header, 4 byte packet number)
7029 0x32,
7030 // connection_id
7031 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7032 // packet number
7033 0x12, 0x34, 0x56, 0x78,
7034 // frame type (ack frame)
7035 // (has ack blocks, 2 byte largest observed, 2 byte block length)
7036 0x65,
7037 // largest acked
7038 0x12, 0x34,
7039 // Zero delta time.
7040 0x00, 0x00,
7041 // num ack blocks ranges.
7042 0xff,
7043 // first ack block length.
7044 0x0f, 0xdd,
7045 // 255 = 4 * 63 + 3
7046 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7047 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7048 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7049 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7050 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
7057 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7058 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7059 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7060 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7061 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
7068 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7069 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7070 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7071 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7072 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
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 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
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
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 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
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
7101 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7102 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7103 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7104 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7105 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7106 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7107 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7108 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7109 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7110 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7111
7112 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7113 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7114 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7115 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7116 // num timestamps.
7117 0x00,
7118 };
7119
7120 unsigned char packet46[] = {
7121 // type (short header, 4 byte packet number)
7122 0x43,
7123 // connection_id
7124 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7125 // packet number
7126 0x12, 0x34, 0x56, 0x78,
7127 // frame type (ack frame)
7128 // (has ack blocks, 2 byte largest observed, 2 byte block length)
7129 0x65,
7130 // largest acked
7131 0x12, 0x34,
7132 // Zero delta time.
7133 0x00, 0x00,
7134 // num ack blocks ranges.
7135 0xff,
7136 // first ack block length.
7137 0x0f, 0xdd,
7138 // 255 = 4 * 63 + 3
7139 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7140 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7141 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7142 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7143 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
7150 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7151 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7152 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7153 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7154 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
7161 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7162 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7163 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7164 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7165 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
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 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
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
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 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
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
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 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
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
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 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7208 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7209 // num timestamps.
7210 0x00,
7211 };
7212
7213 unsigned char packet99[] = {
7214 // type (short header, 4 byte packet number)
7215 0x43,
7216 // connection_id
7217 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7218 // packet number
7219 0x12, 0x34, 0x56, 0x78,
7220 // frame type (IETF_ACK frame)
7221 0x02,
7222 // largest acked
7223 kVarInt62TwoBytes + 0x12, 0x34,
7224 // Zero delta time.
7225 kVarInt62OneByte + 0x00,
7226 // num ack blocks ranges.
7227 kVarInt62TwoBytes + 0x01, 0x2b,
7228 // first ack block length.
7229 kVarInt62TwoBytes + 0x0f, 0xdc,
7230 // 255 added blocks of gap_size == 1, ack_size == 1
7231#define V99AddedBLOCK kVarInt62OneByte + 0x00, kVarInt62OneByte + 0x00
7232 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7233 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7234 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7235 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7236 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7237 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7238 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7239 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7240 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7241 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7242 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7243 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7244 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7245 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7246 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7247 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7248 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7249 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7250 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7251 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7252
7253 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7254 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7255 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7256 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7257 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7258 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7259 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7260 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7261 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7262 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7263 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7264 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7265 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7266 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7267 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7268 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7269 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7270 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7271 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7272 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7273
7274 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7275 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7276 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7277 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7278 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7279 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7280 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7281 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7282 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7283 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7284 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7285 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7286 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7287 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7288 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7289 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7290 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7291 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7292 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7293 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7294
7295#undef V99AddedBLOCK
7296 };
7297 // clang-format on
7298 unsigned char* p = packet;
7299 size_t p_size = QUIC_ARRAYSIZE(packet);
7300 if (framer_.transport_version() == QUIC_VERSION_99) {
7301 p = packet99;
7302 p_size = QUIC_ARRAYSIZE(packet99);
7303 } else if (framer_.transport_version() > QUIC_VERSION_44) {
7304 p = packet46;
7305 p_size = QUIC_ARRAYSIZE(packet46);
7306 } else if (framer_.transport_version() > QUIC_VERSION_43) {
7307 p = packet44;
7308 p_size = QUIC_ARRAYSIZE(packet44);
7309 }
7310
7311 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7312 ASSERT_TRUE(data != nullptr);
7313
7314 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7315 data->length(), AsChars(p), p_size);
7316}
7317
7318TEST_P(QuicFramerTest, BuildNewStopWaitingPacket) {
7319 if (version_.transport_version > QUIC_VERSION_43) {
7320 return;
7321 }
7322 QuicPacketHeader header;
7323 header.destination_connection_id = FramerTestConnectionId();
7324 header.reset_flag = false;
7325 header.version_flag = false;
7326 header.packet_number = kPacketNumber;
7327
7328 QuicStopWaitingFrame stop_waiting_frame;
7329 stop_waiting_frame.least_unacked = kLeastUnacked;
7330
7331 QuicFrames frames = {QuicFrame(stop_waiting_frame)};
7332
7333 // clang-format off
7334 unsigned char packet[] = {
7335 // public flags (8 byte connection_id)
7336 0x28,
7337 // connection_id
7338 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7339 // packet number
7340 0x12, 0x34, 0x56, 0x78,
7341
7342 // frame type (stop waiting frame)
7343 0x06,
7344 // least packet number awaiting an ack, delta from packet number.
7345 0x00, 0x00, 0x00, 0x08,
7346 };
7347
7348 // clang-format on
7349
7350 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7351 ASSERT_TRUE(data != nullptr);
7352
7353 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7354 data->length(), AsChars(packet),
7355 QUIC_ARRAYSIZE(packet));
7356}
7357
7358TEST_P(QuicFramerTest, BuildRstFramePacketQuic) {
7359 QuicPacketHeader header;
7360 header.destination_connection_id = FramerTestConnectionId();
7361 header.reset_flag = false;
7362 header.version_flag = false;
7363 header.packet_number = kPacketNumber;
7364
7365 QuicRstStreamFrame rst_frame;
7366 rst_frame.stream_id = kStreamId;
7367 if (framer_.transport_version() == QUIC_VERSION_99) {
7368 rst_frame.ietf_error_code = 0x01;
7369 } else {
7370 rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708);
7371 }
7372 rst_frame.byte_offset = 0x0807060504030201;
7373
7374 // clang-format off
7375 unsigned char packet[] = {
7376 // public flags (8 byte connection_id)
7377 0x28,
7378 // connection_id
7379 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7380 // packet number
7381 0x12, 0x34, 0x56, 0x78,
7382
7383 // frame type (rst stream frame)
7384 0x01,
7385 // stream id
7386 0x01, 0x02, 0x03, 0x04,
7387 // sent byte offset
7388 0x08, 0x07, 0x06, 0x05,
7389 0x04, 0x03, 0x02, 0x01,
7390 // error code
7391 0x05, 0x06, 0x07, 0x08,
7392 };
7393
7394 unsigned char packet44[] = {
7395 // type (short packet, 4 byte packet number)
7396 0x32,
7397 // connection_id
7398 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7399 // packet number
7400 0x12, 0x34, 0x56, 0x78,
7401
7402 // frame type (rst stream frame)
7403 0x01,
7404 // stream id
7405 0x01, 0x02, 0x03, 0x04,
7406 // sent byte offset
7407 0x08, 0x07, 0x06, 0x05,
7408 0x04, 0x03, 0x02, 0x01,
7409 // error code
7410 0x05, 0x06, 0x07, 0x08,
7411 };
7412
7413 unsigned char packet46[] = {
7414 // type (short packet, 4 byte packet number)
7415 0x43,
7416 // connection_id
7417 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7418 // packet number
7419 0x12, 0x34, 0x56, 0x78,
7420
7421 // frame type (rst stream frame)
7422 0x01,
7423 // stream id
7424 0x01, 0x02, 0x03, 0x04,
7425 // sent byte offset
7426 0x08, 0x07, 0x06, 0x05,
7427 0x04, 0x03, 0x02, 0x01,
7428 // error code
7429 0x05, 0x06, 0x07, 0x08,
7430 };
7431
7432 unsigned char packet99[] = {
7433 // type (short packet, 4 byte packet number)
7434 0x43,
7435 // connection_id
7436 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7437 // packet number
7438 0x12, 0x34, 0x56, 0x78,
7439
7440 // frame type (IETF_RST_STREAM frame)
7441 0x04,
7442 // stream id
7443 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
7444 // error code (not VarInt32 encoded)
7445 0x00, 0x01,
7446 // sent byte offset
7447 kVarInt62EightBytes + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01
7448 };
7449 // clang-format on
7450
7451 QuicFrames frames = {QuicFrame(&rst_frame)};
7452
7453 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7454 ASSERT_TRUE(data != nullptr);
7455
7456 unsigned char* p = packet;
7457 size_t p_size = QUIC_ARRAYSIZE(packet);
7458 if (framer_.transport_version() == QUIC_VERSION_99) {
7459 p = packet99;
7460 p_size = QUIC_ARRAYSIZE(packet99);
7461 } else if (framer_.transport_version() > QUIC_VERSION_44) {
7462 p = packet46;
7463 p_size = QUIC_ARRAYSIZE(packet46);
7464 } else if (framer_.transport_version() > QUIC_VERSION_43) {
7465 p = packet44;
7466 p_size = QUIC_ARRAYSIZE(packet44);
7467 }
7468 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
7469
7470 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7471 data->length(), AsChars(p), p_size);
7472}
7473
7474TEST_P(QuicFramerTest, BuildCloseFramePacket) {
7475 QuicPacketHeader header;
7476 header.destination_connection_id = FramerTestConnectionId();
7477 header.reset_flag = false;
7478 header.version_flag = false;
7479 header.packet_number = kPacketNumber;
7480
7481 QuicConnectionCloseFrame close_frame;
7482 if (framer_.transport_version() == QUIC_VERSION_99) {
fkastenholze9d71a82019-04-09 05:12:13 -07007483 close_frame.transport_error_code =
QUICHE teama6ef0a62019-03-07 20:34:33 -05007484 static_cast<QuicIetfTransportErrorCodes>(0x11);
fkastenholze9d71a82019-04-09 05:12:13 -07007485 close_frame.transport_close_frame_type = 0x05;
fkastenholz72f509b2019-04-10 09:17:49 -07007486 close_frame.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -05007487 } else {
fkastenholze9d71a82019-04-09 05:12:13 -07007488 close_frame.quic_error_code = static_cast<QuicErrorCode>(0x05060708);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007489 }
7490 close_frame.error_details = "because I can";
7491
7492 QuicFrames frames = {QuicFrame(&close_frame)};
7493
7494 // clang-format off
7495 unsigned char packet[] = {
7496 // public flags (8 byte connection_id)
7497 0x28,
7498 // connection_id
7499 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7500 // packet number
7501 0x12, 0x34, 0x56, 0x78,
7502
7503 // frame type (connection close frame)
7504 0x02,
7505 // error code
7506 0x05, 0x06, 0x07, 0x08,
7507 // error details length
7508 0x00, 0x0d,
7509 // error details
7510 'b', 'e', 'c', 'a',
7511 'u', 's', 'e', ' ',
7512 'I', ' ', 'c', 'a',
7513 'n',
7514 };
7515
7516 unsigned char packet44[] = {
7517 // type (short header, 4 byte packet number)
7518 0x32,
7519 // connection_id
7520 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7521 // packet number
7522 0x12, 0x34, 0x56, 0x78,
7523
7524 // frame type (connection close frame)
7525 0x02,
7526 // error code
7527 0x05, 0x06, 0x07, 0x08,
7528 // error details length
7529 0x00, 0x0d,
7530 // error details
7531 'b', 'e', 'c', 'a',
7532 'u', 's', 'e', ' ',
7533 'I', ' ', 'c', 'a',
7534 'n',
7535 };
7536
7537 unsigned char packet46[] = {
7538 // type (short header, 4 byte packet number)
7539 0x43,
7540 // connection_id
7541 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7542 // packet number
7543 0x12, 0x34, 0x56, 0x78,
7544
7545 // frame type (connection close frame)
7546 0x02,
7547 // error code
7548 0x05, 0x06, 0x07, 0x08,
7549 // error details length
7550 0x00, 0x0d,
7551 // error details
7552 'b', 'e', 'c', 'a',
7553 'u', 's', 'e', ' ',
7554 'I', ' ', 'c', 'a',
7555 'n',
7556 };
7557
7558 unsigned char packet99[] = {
7559 // type (short header, 4 byte packet number)
7560 0x43,
7561 // connection_id
7562 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7563 // packet number
7564 0x12, 0x34, 0x56, 0x78,
7565
7566 // frame type (IETF_CONNECTION_CLOSE frame)
7567 0x1c,
7568 // error code
7569 0x00, 0x11,
7570 // Frame type within the CONNECTION_CLOSE frame
7571 kVarInt62OneByte + 0x05,
7572 // error details length
7573 kVarInt62OneByte + 0x0d,
7574 // error details
7575 'b', 'e', 'c', 'a',
7576 'u', 's', 'e', ' ',
7577 'I', ' ', 'c', 'a',
7578 'n',
7579 };
7580 // clang-format on
7581
7582 unsigned char* p = packet;
7583 size_t p_size = QUIC_ARRAYSIZE(packet);
7584 if (framer_.transport_version() == QUIC_VERSION_99) {
7585 p = packet99;
7586 p_size = QUIC_ARRAYSIZE(packet99);
7587 } else if (framer_.transport_version() > QUIC_VERSION_44) {
7588 p = packet46;
7589 p_size = QUIC_ARRAYSIZE(packet46);
7590 } else if (framer_.transport_version() > QUIC_VERSION_43) {
7591 p = packet44;
7592 p_size = QUIC_ARRAYSIZE(packet44);
7593 }
7594
7595 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7596 ASSERT_TRUE(data != nullptr);
7597
7598 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7599 data->length(), AsChars(p), p_size);
7600}
7601
7602TEST_P(QuicFramerTest, BuildTruncatedCloseFramePacket) {
7603 QuicPacketHeader header;
7604 header.destination_connection_id = FramerTestConnectionId();
7605 header.reset_flag = false;
7606 header.version_flag = false;
7607 header.packet_number = kPacketNumber;
7608
7609 QuicConnectionCloseFrame close_frame;
7610 if (framer_.transport_version() == QUIC_VERSION_99) {
fkastenholze9d71a82019-04-09 05:12:13 -07007611 close_frame.transport_error_code = PROTOCOL_VIOLATION; // value is 0x0a
7612 EXPECT_EQ(0u, close_frame.transport_close_frame_type);
fkastenholz72f509b2019-04-10 09:17:49 -07007613 close_frame.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -05007614 } else {
fkastenholze9d71a82019-04-09 05:12:13 -07007615 close_frame.quic_error_code = static_cast<QuicErrorCode>(0x05060708);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007616 }
vasilvvc48c8712019-03-11 13:38:16 -07007617 close_frame.error_details = std::string(2048, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -05007618 QuicFrames frames = {QuicFrame(&close_frame)};
7619
7620 // clang-format off
7621 unsigned char packet[] = {
7622 // public flags (8 byte connection_id)
7623 0x28,
7624 // connection_id
7625 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7626 // packet number
7627 0x12, 0x34, 0x56, 0x78,
7628
7629 // frame type (connection close frame)
7630 0x02,
7631 // error code
7632 0x05, 0x06, 0x07, 0x08,
7633 // error details length
7634 0x01, 0x00,
7635 // error details (truncated to 256 bytes)
7636 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7637 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7638 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7639 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7640 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7641 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7642 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7643 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7644 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7645 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7646 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7647 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7648 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7649 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7650 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7651 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7652 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7653 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7654 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7655 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7656 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7657 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7658 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7659 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7660 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7661 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7662 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7663 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7664 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7665 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7666 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7667 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7668 };
7669
7670 unsigned char packet44[] = {
7671 // type (short header, 4 byte packet number)
7672 0x32,
7673 // connection_id
7674 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7675 // packet number
7676 0x12, 0x34, 0x56, 0x78,
7677
7678 // frame type (connection close frame)
7679 0x02,
7680 // error code
7681 0x05, 0x06, 0x07, 0x08,
7682 // error details length
7683 0x01, 0x00,
7684 // error details (truncated to 256 bytes)
7685 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7686 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7687 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7688 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7689 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7690 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7691 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7692 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7693 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7694 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7695 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7696 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7697 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7698 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7699 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7700 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7701 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7702 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7703 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7704 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7705 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7706 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7707 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7708 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7709 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7710 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7711 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7712 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7713 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7714 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7715 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7716 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7717 };
7718
7719 unsigned char packet46[] = {
7720 // type (short header, 4 byte packet number)
7721 0x43,
7722 // connection_id
7723 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7724 // packet number
7725 0x12, 0x34, 0x56, 0x78,
7726
7727 // frame type (connection close frame)
7728 0x02,
7729 // error code
7730 0x05, 0x06, 0x07, 0x08,
7731 // error details length
7732 0x01, 0x00,
7733 // error details (truncated to 256 bytes)
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 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7765 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7766 };
7767
7768 unsigned char packet99[] = {
7769 // type (short header, 4 byte packet number)
7770 0x43,
7771 // connection_id
7772 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7773 // packet number
7774 0x12, 0x34, 0x56, 0x78,
7775
7776 // frame type (IETF_CONNECTION_CLOSE frame)
7777 0x1c,
7778 // error code
7779 0x00, 0x0a,
7780 // Frame type within the CONNECTION_CLOSE frame
7781 kVarInt62OneByte + 0x00,
7782 // error details length
7783 kVarInt62TwoBytes + 0x01, 0x00,
7784 // error details (truncated to 256 bytes)
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 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7814 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7815 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7816 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7817 };
7818 // clang-format on
7819
7820 unsigned char* p = packet;
7821 size_t p_size = QUIC_ARRAYSIZE(packet);
7822 if (framer_.transport_version() == QUIC_VERSION_99) {
7823 p = packet99;
7824 p_size = QUIC_ARRAYSIZE(packet99);
7825 } else if (framer_.transport_version() > QUIC_VERSION_44) {
7826 p = packet46;
7827 p_size = QUIC_ARRAYSIZE(packet46);
7828 } else if (framer_.transport_version() > QUIC_VERSION_43) {
7829 p = packet44;
7830 p_size = QUIC_ARRAYSIZE(packet44);
7831 }
7832
7833 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7834 ASSERT_TRUE(data != nullptr);
7835
7836 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7837 data->length(), AsChars(p), p_size);
7838}
7839
7840TEST_P(QuicFramerTest, BuildApplicationCloseFramePacket) {
7841 if (framer_.transport_version() != QUIC_VERSION_99) {
7842 // Versions other than 99 do not have ApplicationClose
7843 return;
7844 }
7845 QuicPacketHeader header;
7846 header.destination_connection_id = FramerTestConnectionId();
7847 header.reset_flag = false;
7848 header.version_flag = false;
7849 header.packet_number = kPacketNumber;
7850
fkastenholz72f509b2019-04-10 09:17:49 -07007851 QuicConnectionCloseFrame app_close_frame;
7852 app_close_frame.quic_error_code = static_cast<QuicErrorCode>(0x11);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007853 app_close_frame.error_details = "because I can";
fkastenholz72f509b2019-04-10 09:17:49 -07007854 app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -05007855
7856 QuicFrames frames = {QuicFrame(&app_close_frame)};
7857
7858 // clang-format off
7859
7860 unsigned char packet99[] = {
7861 // type (short header, 4 byte packet number)
7862 0x43,
7863 // connection_id
7864 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7865 // packet number
7866 0x12, 0x34, 0x56, 0x78,
7867
7868 // frame type (IETF_APPLICATION_CLOSE frame)
7869 0x1d,
7870 // error code
7871 0x00, 0x11,
7872 // error details length
7873 kVarInt62OneByte + 0x0d,
7874 // error details
7875 'b', 'e', 'c', 'a',
7876 'u', 's', 'e', ' ',
7877 'I', ' ', 'c', 'a',
7878 'n',
7879 };
7880 // clang-format on
7881
7882 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7883 ASSERT_TRUE(data != nullptr);
7884
7885 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7886 data->length(), AsChars(packet99),
7887 QUIC_ARRAYSIZE(packet99));
7888}
7889
7890TEST_P(QuicFramerTest, BuildTruncatedApplicationCloseFramePacket) {
7891 if (framer_.transport_version() != QUIC_VERSION_99) {
7892 // Versions other than 99 do not have this frame.
7893 return;
7894 }
7895 QuicPacketHeader header;
7896 header.destination_connection_id = FramerTestConnectionId();
7897 header.reset_flag = false;
7898 header.version_flag = false;
7899 header.packet_number = kPacketNumber;
7900
fkastenholz72f509b2019-04-10 09:17:49 -07007901 QuicConnectionCloseFrame app_close_frame;
7902 app_close_frame.quic_error_code = static_cast<QuicErrorCode>(0x11);
vasilvvc48c8712019-03-11 13:38:16 -07007903 app_close_frame.error_details = std::string(2048, 'A');
fkastenholz72f509b2019-04-10 09:17:49 -07007904 app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -05007905
7906 QuicFrames frames = {QuicFrame(&app_close_frame)};
7907
7908 // clang-format off
7909 unsigned char packet99[] = {
7910 // type (short header, 4 byte packet number)
7911 0x43,
7912 // connection_id
7913 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7914 // packet number
7915 0x12, 0x34, 0x56, 0x78,
7916
7917 // frame type (IETF_APPLICATION_CLOSE frame)
7918 0x1d,
7919 // error code
7920 0x00, 0x11,
7921 // error details length
7922 kVarInt62TwoBytes + 0x01, 0x00,
7923 // error details (truncated to 256 bytes)
7924 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7925 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7926 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7927 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7928 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7929 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7930 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7931 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7932 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7933 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7934 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7935 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7936 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7937 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7938 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7939 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7940 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7941 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7942 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7943 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7944 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7945 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7946 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7947 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7948 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7949 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7950 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7951 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7952 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7953 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7954 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7955 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7956 };
7957 // clang-format on
7958
7959 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7960 ASSERT_TRUE(data != nullptr);
7961
7962 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7963 data->length(), AsChars(packet99),
7964 QUIC_ARRAYSIZE(packet99));
7965}
7966
7967TEST_P(QuicFramerTest, BuildGoAwayPacket) {
7968 if (framer_.transport_version() == QUIC_VERSION_99) {
7969 // This frame type is not supported in version 99.
7970 return;
7971 }
7972 QuicPacketHeader header;
7973 header.destination_connection_id = FramerTestConnectionId();
7974 header.reset_flag = false;
7975 header.version_flag = false;
7976 header.packet_number = kPacketNumber;
7977
7978 QuicGoAwayFrame goaway_frame;
7979 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
7980 goaway_frame.last_good_stream_id = kStreamId;
7981 goaway_frame.reason_phrase = "because I can";
7982
7983 QuicFrames frames = {QuicFrame(&goaway_frame)};
7984
7985 // clang-format off
7986 unsigned char packet[] = {
7987 // public flags (8 byte connection_id)
7988 0x28,
7989 // connection_id
7990 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7991 // packet number
7992 0x12, 0x34, 0x56, 0x78,
7993
7994 // frame type (go away frame)
7995 0x03,
7996 // error code
7997 0x05, 0x06, 0x07, 0x08,
7998 // stream id
7999 0x01, 0x02, 0x03, 0x04,
8000 // error details length
8001 0x00, 0x0d,
8002 // error details
8003 'b', 'e', 'c', 'a',
8004 'u', 's', 'e', ' ',
8005 'I', ' ', 'c', 'a',
8006 'n',
8007 };
8008
8009 unsigned char packet44[] = {
8010 // type (short header, 4 byte packet number)
8011 0x32,
8012 // connection_id
8013 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8014 // packet number
8015 0x12, 0x34, 0x56, 0x78,
8016
8017 // frame type (go away frame)
8018 0x03,
8019 // error code
8020 0x05, 0x06, 0x07, 0x08,
8021 // stream id
8022 0x01, 0x02, 0x03, 0x04,
8023 // error details length
8024 0x00, 0x0d,
8025 // error details
8026 'b', 'e', 'c', 'a',
8027 'u', 's', 'e', ' ',
8028 'I', ' ', 'c', 'a',
8029 'n',
8030 };
8031
8032 unsigned char packet46[] = {
8033 // type (short header, 4 byte packet number)
8034 0x43,
8035 // connection_id
8036 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8037 // packet number
8038 0x12, 0x34, 0x56, 0x78,
8039
8040 // frame type (go away frame)
8041 0x03,
8042 // error code
8043 0x05, 0x06, 0x07, 0x08,
8044 // stream id
8045 0x01, 0x02, 0x03, 0x04,
8046 // error details length
8047 0x00, 0x0d,
8048 // error details
8049 'b', 'e', 'c', 'a',
8050 'u', 's', 'e', ' ',
8051 'I', ' ', 'c', 'a',
8052 'n',
8053 };
8054
8055 // clang-format on
8056
8057 unsigned char* p = packet;
8058 size_t p_size = QUIC_ARRAYSIZE(packet);
8059 if (framer_.transport_version() > QUIC_VERSION_44) {
8060 p = packet46;
8061 p_size = QUIC_ARRAYSIZE(packet46);
8062 } else if (framer_.transport_version() > QUIC_VERSION_43) {
8063 p = packet44;
8064 p_size = QUIC_ARRAYSIZE(packet44);
8065 }
8066
8067 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8068 ASSERT_TRUE(data != nullptr);
8069
8070 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8071 data->length(), AsChars(p), p_size);
8072}
8073
8074TEST_P(QuicFramerTest, BuildTruncatedGoAwayPacket) {
8075 if (framer_.transport_version() == QUIC_VERSION_99) {
8076 // This frame type is not supported in version 99.
8077 return;
8078 }
8079 QuicPacketHeader header;
8080 header.destination_connection_id = FramerTestConnectionId();
8081 header.reset_flag = false;
8082 header.version_flag = false;
8083 header.packet_number = kPacketNumber;
8084
8085 QuicGoAwayFrame goaway_frame;
8086 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
8087 goaway_frame.last_good_stream_id = kStreamId;
vasilvvc48c8712019-03-11 13:38:16 -07008088 goaway_frame.reason_phrase = std::string(2048, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -05008089
8090 QuicFrames frames = {QuicFrame(&goaway_frame)};
8091
8092 // clang-format off
8093 unsigned char packet[] = {
8094 // public flags (8 byte connection_id)
8095 0x28,
8096 // connection_id
8097 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8098 // packet number
8099 0x12, 0x34, 0x56, 0x78,
8100
8101 // frame type (go away frame)
8102 0x03,
8103 // error code
8104 0x05, 0x06, 0x07, 0x08,
8105 // stream id
8106 0x01, 0x02, 0x03, 0x04,
8107 // error details length
8108 0x01, 0x00,
8109 // error details (truncated to 256 bytes)
8110 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8111 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8112 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8113 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8114 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8115 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8116 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8117 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8118 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8119 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8120 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8121 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8122 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8123 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8124 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8125 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8126 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8127 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8128 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8129 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8130 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8131 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8132 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8133 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8134 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8135 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8136 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8137 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8138 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8139 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8140 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8141 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8142 };
8143
8144 unsigned char packet44[] = {
8145 // type (short header, 4 byte packet number)
8146 0x32,
8147 // connection_id
8148 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8149 // packet number
8150 0x12, 0x34, 0x56, 0x78,
8151
8152 // frame type (go away frame)
8153 0x03,
8154 // error code
8155 0x05, 0x06, 0x07, 0x08,
8156 // stream id
8157 0x01, 0x02, 0x03, 0x04,
8158 // error details length
8159 0x01, 0x00,
8160 // error details (truncated to 256 bytes)
8161 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8162 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8163 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8164 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8165 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8166 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8167 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8168 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8169 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8170 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8171 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8172 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8173 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8174 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8175 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8176 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8177 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8178 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8179 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8180 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8181 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8182 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8183 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8184 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8185 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8186 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8187 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8188 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8189 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8190 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8191 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8192 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8193 };
8194
8195 unsigned char packet46[] = {
8196 // type (short header, 4 byte packet number)
8197 0x43,
8198 // connection_id
8199 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8200 // packet number
8201 0x12, 0x34, 0x56, 0x78,
8202
8203 // frame type (go away frame)
8204 0x03,
8205 // error code
8206 0x05, 0x06, 0x07, 0x08,
8207 // stream id
8208 0x01, 0x02, 0x03, 0x04,
8209 // error details length
8210 0x01, 0x00,
8211 // error details (truncated to 256 bytes)
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 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8239 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8240 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8241 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8242 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8243 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8244 };
8245 // clang-format on
8246
8247 unsigned char* p = packet;
8248 size_t p_size = QUIC_ARRAYSIZE(packet);
8249 if (framer_.transport_version() > QUIC_VERSION_44) {
8250 p = packet46;
8251 p_size = QUIC_ARRAYSIZE(packet46);
8252 } else if (framer_.transport_version() > QUIC_VERSION_43) {
8253 p = packet44;
8254 p_size = QUIC_ARRAYSIZE(packet44);
8255 }
8256
8257 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8258 ASSERT_TRUE(data != nullptr);
8259
8260 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8261 data->length(), AsChars(p), p_size);
8262}
8263
8264TEST_P(QuicFramerTest, BuildWindowUpdatePacket) {
8265 QuicPacketHeader header;
8266 header.destination_connection_id = FramerTestConnectionId();
8267 header.reset_flag = false;
8268 header.version_flag = false;
8269 header.packet_number = kPacketNumber;
8270
8271 QuicWindowUpdateFrame window_update_frame;
8272 window_update_frame.stream_id = kStreamId;
8273 window_update_frame.byte_offset = 0x1122334455667788;
8274
8275 QuicFrames frames = {QuicFrame(&window_update_frame)};
8276
8277 // clang-format off
8278 unsigned char packet[] = {
8279 // public flags (8 byte connection_id)
8280 0x28,
8281 // connection_id
8282 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8283 // packet number
8284 0x12, 0x34, 0x56, 0x78,
8285
8286 // frame type (window update frame)
8287 0x04,
8288 // stream id
8289 0x01, 0x02, 0x03, 0x04,
8290 // byte offset
8291 0x11, 0x22, 0x33, 0x44,
8292 0x55, 0x66, 0x77, 0x88,
8293 };
8294
8295 unsigned char packet44[] = {
8296 // type (short header, 4 byte packet number)
8297 0x32,
8298 // connection_id
8299 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8300 // packet number
8301 0x12, 0x34, 0x56, 0x78,
8302
8303 // frame type (window update frame)
8304 0x04,
8305 // stream id
8306 0x01, 0x02, 0x03, 0x04,
8307 // byte offset
8308 0x11, 0x22, 0x33, 0x44,
8309 0x55, 0x66, 0x77, 0x88,
8310 };
8311
8312 unsigned char packet46[] = {
8313 // type (short header, 4 byte packet number)
8314 0x43,
8315 // connection_id
8316 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8317 // packet number
8318 0x12, 0x34, 0x56, 0x78,
8319
8320 // frame type (window update frame)
8321 0x04,
8322 // stream id
8323 0x01, 0x02, 0x03, 0x04,
8324 // byte offset
8325 0x11, 0x22, 0x33, 0x44,
8326 0x55, 0x66, 0x77, 0x88,
8327 };
8328
8329 unsigned char packet99[] = {
8330 // type (short header, 4 byte packet number)
8331 0x43,
8332 // connection_id
8333 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8334 // packet number
8335 0x12, 0x34, 0x56, 0x78,
8336
8337 // frame type (IETF_MAX_STREAM_DATA frame)
8338 0x11,
8339 // stream id
8340 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
8341 // byte offset
8342 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
8343 0x55, 0x66, 0x77, 0x88,
8344 };
8345 // clang-format on
8346
8347 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8348 ASSERT_TRUE(data != nullptr);
8349
8350 unsigned char* p = packet;
8351 size_t p_size = QUIC_ARRAYSIZE(packet);
8352 if (framer_.transport_version() == QUIC_VERSION_99) {
8353 p = packet99;
8354 p_size = QUIC_ARRAYSIZE(packet99);
8355 } else if (framer_.transport_version() > QUIC_VERSION_44) {
8356 p = packet46;
8357 p_size = QUIC_ARRAYSIZE(packet46);
8358 } else if (framer_.transport_version() > QUIC_VERSION_43) {
8359 p = packet44;
8360 p_size = QUIC_ARRAYSIZE(packet44);
8361 }
8362
8363 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8364 data->length(), AsChars(p), p_size);
8365}
8366
8367TEST_P(QuicFramerTest, BuildMaxStreamDataPacket) {
8368 if (framer_.transport_version() != QUIC_VERSION_99) {
8369 // This frame is available only in this version.
8370 return;
8371 }
8372 QuicPacketHeader header;
8373 header.destination_connection_id = FramerTestConnectionId();
8374 header.reset_flag = false;
8375 header.version_flag = false;
8376 header.packet_number = kPacketNumber;
8377
8378 QuicWindowUpdateFrame window_update_frame;
8379 window_update_frame.stream_id = kStreamId;
8380 window_update_frame.byte_offset = 0x1122334455667788;
8381
8382 QuicFrames frames = {QuicFrame(&window_update_frame)};
8383
8384 // clang-format off
8385 unsigned char packet99[] = {
8386 // type (short header, 4 byte packet number)
8387 0x43,
8388 // connection_id
8389 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8390 // packet number
8391 0x12, 0x34, 0x56, 0x78,
8392
8393 // frame type (IETF_MAX_STREAM_DATA frame)
8394 0x11,
8395 // stream id
8396 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
8397 // byte offset
8398 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
8399 0x55, 0x66, 0x77, 0x88,
8400 };
8401 // clang-format on
8402
8403 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8404 ASSERT_TRUE(data != nullptr);
8405
8406 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8407 data->length(), AsChars(packet99),
8408 QUIC_ARRAYSIZE(packet99));
8409}
8410
8411TEST_P(QuicFramerTest, BuildMaxDataPacket) {
8412 if (framer_.transport_version() != QUIC_VERSION_99) {
8413 // This frame is available only in this version.
8414 return;
8415 }
8416 QuicPacketHeader header;
8417 header.destination_connection_id = FramerTestConnectionId();
8418 header.reset_flag = false;
8419 header.version_flag = false;
8420 header.packet_number = kPacketNumber;
8421
8422 QuicWindowUpdateFrame window_update_frame;
8423 window_update_frame.stream_id =
8424 QuicUtils::GetInvalidStreamId(framer_.transport_version());
8425 window_update_frame.byte_offset = 0x1122334455667788;
8426
8427 QuicFrames frames = {QuicFrame(&window_update_frame)};
8428
8429 // clang-format off
8430 unsigned char packet99[] = {
8431 // type (short header, 4 byte packet number)
8432 0x43,
8433 // connection_id
8434 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8435 // packet number
8436 0x12, 0x34, 0x56, 0x78,
8437
8438 // frame type (IETF_MAX_DATA frame)
8439 0x10,
8440 // byte offset
8441 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
8442 0x55, 0x66, 0x77, 0x88,
8443 };
8444 // clang-format on
8445
8446 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8447 ASSERT_TRUE(data != nullptr);
8448
8449 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8450 data->length(), AsChars(packet99),
8451 QUIC_ARRAYSIZE(packet99));
8452}
8453
8454TEST_P(QuicFramerTest, BuildBlockedPacket) {
8455 QuicPacketHeader header;
8456 header.destination_connection_id = FramerTestConnectionId();
8457 header.reset_flag = false;
8458 header.version_flag = false;
8459 header.packet_number = kPacketNumber;
8460
8461 QuicBlockedFrame blocked_frame;
8462 if (framer_.transport_version() == QUIC_VERSION_99) {
8463 // For V99, the stream ID must be <invalid> for the frame
8464 // to be a BLOCKED frame. if it's valid, it will be a
8465 // STREAM_BLOCKED frame.
8466 blocked_frame.stream_id =
8467 QuicUtils::GetInvalidStreamId(framer_.transport_version());
8468 } else {
8469 blocked_frame.stream_id = kStreamId;
8470 }
8471 blocked_frame.offset = kStreamOffset;
8472
8473 QuicFrames frames = {QuicFrame(&blocked_frame)};
8474
8475 // clang-format off
8476 unsigned char packet[] = {
8477 // public flags (8 byte connection_id)
8478 0x28,
8479 // connection_id
8480 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8481 // packet number
8482 0x12, 0x34, 0x56, 0x78,
8483
8484 // frame type (blocked frame)
8485 0x05,
8486 // stream id
8487 0x01, 0x02, 0x03, 0x04,
8488 };
8489
8490 unsigned char packet44[] = {
8491 // type (short packet, 4 byte packet number)
8492 0x32,
8493 // connection_id
8494 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8495 // packet number
8496 0x12, 0x34, 0x56, 0x78,
8497
8498 // frame type (blocked frame)
8499 0x05,
8500 // stream id
8501 0x01, 0x02, 0x03, 0x04,
8502 };
8503
8504 unsigned char packet46[] = {
8505 // type (short packet, 4 byte packet number)
8506 0x43,
8507 // connection_id
8508 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8509 // packet number
8510 0x12, 0x34, 0x56, 0x78,
8511
8512 // frame type (blocked frame)
8513 0x05,
8514 // stream id
8515 0x01, 0x02, 0x03, 0x04,
8516 };
8517
8518 unsigned char packet99[] = {
8519 // type (short packet, 4 byte packet number)
8520 0x43,
8521 // connection_id
8522 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8523 // packet number
8524 0x12, 0x34, 0x56, 0x78,
8525
8526 // frame type (IETF_BLOCKED frame)
8527 0x14,
8528 // Offset
8529 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
8530 };
8531 // clang-format on
8532
8533 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8534 ASSERT_TRUE(data != nullptr);
8535
8536 unsigned char* p = packet;
8537 size_t p_size = QUIC_ARRAYSIZE(packet);
8538 if (framer_.transport_version() == QUIC_VERSION_99) {
8539 p = packet99;
8540 p_size = QUIC_ARRAYSIZE(packet99);
8541 } else if (framer_.transport_version() > QUIC_VERSION_44) {
8542 p = packet46;
8543 p_size = QUIC_ARRAYSIZE(packet46);
8544 } else if (framer_.transport_version() > QUIC_VERSION_43) {
8545 p = packet44;
8546 p_size = QUIC_ARRAYSIZE(packet44);
8547 }
8548
8549 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8550 data->length(), AsChars(p), p_size);
8551}
8552
8553TEST_P(QuicFramerTest, BuildPingPacket) {
8554 QuicPacketHeader header;
8555 header.destination_connection_id = FramerTestConnectionId();
8556 header.reset_flag = false;
8557 header.version_flag = false;
8558 header.packet_number = kPacketNumber;
8559
8560 QuicFrames frames = {QuicFrame(QuicPingFrame())};
8561
8562 // clang-format off
8563 unsigned char packet[] = {
8564 // public flags (8 byte connection_id)
8565 0x28,
8566 // connection_id
8567 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8568 // packet number
8569 0x12, 0x34, 0x56, 0x78,
8570
8571 // frame type (ping frame)
8572 0x07,
8573 };
8574
8575 unsigned char packet44[] = {
8576 // type (short header, 4 byte packet number)
8577 0x32,
8578 // connection_id
8579 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8580 // packet number
8581 0x12, 0x34, 0x56, 0x78,
8582
8583 // frame type
8584 0x07,
8585 };
8586
8587 unsigned char packet46[] = {
8588 // type (short header, 4 byte packet number)
8589 0x43,
8590 // connection_id
8591 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8592 // packet number
8593 0x12, 0x34, 0x56, 0x78,
8594
8595 // frame type
8596 0x07,
8597 };
8598
8599 unsigned char packet99[] = {
8600 // type (short header, 4 byte packet number)
8601 0x43,
8602 // connection_id
8603 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8604 // packet number
8605 0x12, 0x34, 0x56, 0x78,
8606
8607 // frame type (IETF_PING frame)
8608 0x01,
8609 };
8610 // clang-format on
8611
8612 unsigned char* p = packet;
8613 if (framer_.transport_version() == QUIC_VERSION_99) {
8614 p = packet99;
8615 } else if (framer_.transport_version() > QUIC_VERSION_44) {
8616 p = packet46;
8617 } else if (framer_.transport_version() > QUIC_VERSION_43) {
8618 p = packet44;
8619 }
8620
8621 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8622 ASSERT_TRUE(data != nullptr);
8623
8624 test::CompareCharArraysWithHexError(
8625 "constructed packet", data->data(), data->length(), AsChars(p),
8626 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44)
8627 : QUIC_ARRAYSIZE(packet));
8628}
8629
8630TEST_P(QuicFramerTest, BuildMessagePacket) {
8631 if (framer_.transport_version() <= QUIC_VERSION_44) {
8632 return;
8633 }
8634 QuicPacketHeader header;
8635 header.destination_connection_id = FramerTestConnectionId();
8636 header.reset_flag = false;
8637 header.version_flag = false;
8638 header.packet_number = kPacketNumber;
8639 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
8640
wub553a9662019-03-28 20:13:23 -07008641 QuicMessageFrame frame(1, MakeSpan(&allocator_, "message", &storage));
8642 QuicMessageFrame frame2(2, MakeSpan(&allocator_, "message2", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05008643 QuicFrames frames = {QuicFrame(&frame), QuicFrame(&frame2)};
8644
8645 // clang-format off
8646 unsigned char packet45[] = {
8647 // type (short header, 4 byte packet number)
8648 0x32,
8649 // connection_id
8650 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8651 // packet number
8652 0x12, 0x34, 0x56, 0x78,
8653
8654 // frame type (message frame)
8655 0x21,
8656 // Length
8657 0x07,
8658 // Message Data
8659 'm', 'e', 's', 's', 'a', 'g', 'e',
8660 // frame type (message frame no length)
8661 0x20,
8662 // Message Data
8663 'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8664 };
8665
8666 unsigned char packet46[] = {
8667 // type (short header, 4 byte packet number)
8668 0x43,
8669 // connection_id
8670 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8671 // packet number
8672 0x12, 0x34, 0x56, 0x78,
8673
8674 // frame type (message frame)
8675 0x21,
8676 // Length
8677 0x07,
8678 // Message Data
8679 'm', 'e', 's', 's', 'a', 'g', 'e',
8680 // frame type (message frame no length)
8681 0x20,
8682 // Message Data
8683 'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8684 };
8685
8686 unsigned char packet99[] = {
8687 // type (short header, 4 byte packet number)
8688 0x43,
8689 // connection_id
8690 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8691 // packet number
8692 0x12, 0x34, 0x56, 0x78,
8693
8694 // frame type (IETF_MESSAGE frame)
8695 0x21,
8696 // Length
8697 0x07,
8698 // Message Data
8699 'm', 'e', 's', 's', 'a', 'g', 'e',
8700 // frame type (message frame no length)
8701 0x20,
8702 // Message Data
8703 'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8704 };
8705 // clang-format on
8706
8707 unsigned char* p = packet45;
8708 if (framer_.transport_version() == QUIC_VERSION_99) {
8709 p = packet99;
8710 } else if (framer_.transport_version() > QUIC_VERSION_44) {
8711 p = packet46;
8712 }
8713
8714 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8715 ASSERT_TRUE(data != nullptr);
8716
8717 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8718 data->length(), AsChars(p),
8719 QUIC_ARRAYSIZE(packet45));
8720}
8721
8722// Test that the connectivity probing packet is serialized correctly as a
8723// padded PING packet.
8724TEST_P(QuicFramerTest, BuildConnectivityProbingPacket) {
8725 QuicPacketHeader header;
8726 header.destination_connection_id = FramerTestConnectionId();
8727 header.reset_flag = false;
8728 header.version_flag = false;
8729 header.packet_number = kPacketNumber;
8730
8731 // clang-format off
8732 unsigned char packet[] = {
8733 // public flags (8 byte connection_id)
8734 0x28,
8735 // connection_id
8736 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8737 // packet number
8738 0x12, 0x34, 0x56, 0x78,
8739
8740 // frame type (ping frame)
8741 0x07,
8742 // frame type (padding frame)
8743 0x00,
8744 0x00, 0x00, 0x00, 0x00
8745 };
8746
8747 unsigned char packet44[] = {
8748 // type (short header, 4 byte packet number)
8749 0x32,
8750 // connection_id
8751 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8752 // packet number
8753 0x12, 0x34, 0x56, 0x78,
8754
8755 // frame type
8756 0x07,
8757 // frame type (padding frame)
8758 0x00,
8759 0x00, 0x00, 0x00, 0x00
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
8771 0x07,
8772 // frame type (padding frame)
8773 0x00,
8774 0x00, 0x00, 0x00, 0x00
8775 };
8776
8777 unsigned char packet99[] = {
8778 // type (short header, 4 byte packet number)
8779 0x43,
8780 // connection_id
8781 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8782 // packet number
8783 0x12, 0x34, 0x56, 0x78,
8784
8785 // frame type (IETF_PING frame)
8786 0x01,
8787 // frame type (padding frame)
8788 0x00,
8789 0x00, 0x00, 0x00, 0x00
8790 };
8791 // clang-format on
8792
8793 unsigned char* p = packet;
8794 size_t packet_size = QUIC_ARRAYSIZE(packet);
8795 if (framer_.transport_version() == QUIC_VERSION_99) {
8796 p = packet99;
8797 packet_size = QUIC_ARRAYSIZE(packet99);
8798 } else if (framer_.transport_version() > QUIC_VERSION_44) {
8799 p = packet46;
8800 packet_size = QUIC_ARRAYSIZE(packet46);
8801 } else if (framer_.transport_version() > QUIC_VERSION_43) {
8802 p = packet44;
8803 packet_size = QUIC_ARRAYSIZE(packet44);
8804 }
8805
dschinazi66dea072019-04-09 11:41:06 -07008806 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008807
8808 size_t length = framer_.BuildConnectivityProbingPacket(
QUICHE team6987b4a2019-03-15 16:23:04 -07008809 header, buffer.get(), packet_size, ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008810
8811 EXPECT_NE(0u, length);
8812 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
8813 header);
8814
8815 test::CompareCharArraysWithHexError("constructed packet", data.data(),
8816 data.length(), AsChars(p), packet_size);
8817}
8818
8819// Test that the path challenge connectivity probing packet is serialized
8820// correctly as a padded PATH CHALLENGE packet.
8821TEST_P(QuicFramerTest, BuildPaddedPathChallengePacket) {
8822 if (framer_.transport_version() != QUIC_VERSION_99) {
8823 return;
8824 }
8825
8826 QuicPacketHeader header;
8827 header.destination_connection_id = FramerTestConnectionId();
8828 header.reset_flag = false;
8829 header.version_flag = false;
8830 header.packet_number = kPacketNumber;
8831 QuicPathFrameBuffer payload;
8832
8833 // clang-format off
8834 unsigned char packet[] = {
8835 // type (short header, 4 byte packet number)
8836 0x43,
8837 // connection_id
8838 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8839 // packet number
8840 0x12, 0x34, 0x56, 0x78,
8841
8842 // Path Challenge Frame type (IETF_PATH_CHALLENGE)
8843 0x1a,
8844 // 8 "random" bytes, MockRandom makes lots of r's
8845 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r',
8846 // frame type (padding frame)
8847 0x00,
8848 0x00, 0x00, 0x00, 0x00
8849 };
8850 // clang-format on
8851
dschinazi66dea072019-04-09 11:41:06 -07008852 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008853 MockRandom randomizer;
8854
8855 size_t length = framer_.BuildPaddedPathChallengePacket(
8856 header, buffer.get(), QUIC_ARRAYSIZE(packet), &payload, &randomizer,
QUICHE team6987b4a2019-03-15 16:23:04 -07008857 ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008858 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
8859
8860 // Payload has the random bytes that were generated. Copy them into packet,
8861 // above, before checking that the generated packet is correct.
8862 EXPECT_EQ(kQuicPathFrameBufferSize, payload.size());
8863
8864 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
8865 header);
8866
8867 test::CompareCharArraysWithHexError("constructed packet", data.data(),
8868 data.length(), AsChars(packet),
8869 QUIC_ARRAYSIZE(packet));
8870}
8871
8872// Several tests that the path response connectivity probing packet is
8873// serialized correctly as either a padded and unpadded PATH RESPONSE
8874// packet. Also generates packets with 1 and 3 PATH_RESPONSES in them to
8875// exercised the single- and multiple- payload cases.
8876TEST_P(QuicFramerTest, BuildPathResponsePacket1ResponseUnpadded) {
8877 if (framer_.transport_version() != QUIC_VERSION_99) {
8878 return;
8879 }
8880
8881 QuicPacketHeader header;
8882 header.destination_connection_id = FramerTestConnectionId();
8883 header.reset_flag = false;
8884 header.version_flag = false;
8885 header.packet_number = kPacketNumber;
8886 QuicPathFrameBuffer payload0 = {
8887 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
8888
8889 // Build 1 PATH RESPONSE, not padded
8890 // clang-format off
8891 unsigned char packet[] = {
8892 // type (short header, 4 byte packet number)
8893 0x43,
8894 // connection_id
8895 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8896 // packet number
8897 0x12, 0x34, 0x56, 0x78,
8898
8899 // Path Response Frame type (IETF_PATH_RESPONSE)
8900 0x1b,
8901 // 8 "random" bytes
8902 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
8903 };
8904 // clang-format on
dschinazi66dea072019-04-09 11:41:06 -07008905 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008906 QuicDeque<QuicPathFrameBuffer> payloads;
8907 payloads.push_back(payload0);
8908 size_t length = framer_.BuildPathResponsePacket(
8909 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
QUICHE team6987b4a2019-03-15 16:23:04 -07008910 /*is_padded=*/false, ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008911 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
8912 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
8913 header);
8914
8915 test::CompareCharArraysWithHexError("constructed packet", data.data(),
8916 data.length(), AsChars(packet),
8917 QUIC_ARRAYSIZE(packet));
8918}
8919
8920TEST_P(QuicFramerTest, BuildPathResponsePacket1ResponsePadded) {
8921 if (framer_.transport_version() != QUIC_VERSION_99) {
8922 return;
8923 }
8924
8925 QuicPacketHeader header;
8926 header.destination_connection_id = FramerTestConnectionId();
8927 header.reset_flag = false;
8928 header.version_flag = false;
8929 header.packet_number = kPacketNumber;
8930 QuicPathFrameBuffer payload0 = {
8931 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
8932
8933 // Build 1 PATH RESPONSE, padded
8934 // clang-format off
8935 unsigned char packet[] = {
8936 // type (short header, 4 byte packet number)
8937 0x43,
8938 // connection_id
8939 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8940 // packet number
8941 0x12, 0x34, 0x56, 0x78,
8942
8943 // Path Response Frame type (IETF_PATH_RESPONSE)
8944 0x1b,
8945 // 8 "random" bytes
8946 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
8947 // Padding type and pad
8948 0x00, 0x00, 0x00, 0x00, 0x00
8949 };
8950 // clang-format on
dschinazi66dea072019-04-09 11:41:06 -07008951 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008952 QuicDeque<QuicPathFrameBuffer> payloads;
8953 payloads.push_back(payload0);
8954 size_t length = framer_.BuildPathResponsePacket(
8955 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
QUICHE team6987b4a2019-03-15 16:23:04 -07008956 /*is_padded=*/true, ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008957 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
8958 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
8959 header);
8960
8961 test::CompareCharArraysWithHexError("constructed packet", data.data(),
8962 data.length(), AsChars(packet),
8963 QUIC_ARRAYSIZE(packet));
8964}
8965
8966TEST_P(QuicFramerTest, BuildPathResponsePacket3ResponsesUnpadded) {
8967 if (framer_.transport_version() != QUIC_VERSION_99) {
8968 return;
8969 }
8970
8971 QuicPacketHeader header;
8972 header.destination_connection_id = FramerTestConnectionId();
8973 header.reset_flag = false;
8974 header.version_flag = false;
8975 header.packet_number = kPacketNumber;
8976 QuicPathFrameBuffer payload0 = {
8977 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
8978 QuicPathFrameBuffer payload1 = {
8979 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
8980 QuicPathFrameBuffer payload2 = {
8981 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
8982
8983 // Build one packet with 3 PATH RESPONSES, no padding
8984 // clang-format off
8985 unsigned char packet[] = {
8986 // type (short header, 4 byte packet number)
8987 0x43,
8988 // connection_id
8989 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8990 // packet number
8991 0x12, 0x34, 0x56, 0x78,
8992
8993 // 3 path response frames (IETF_PATH_RESPONSE type byte and payload)
8994 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
8995 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
8996 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
8997 };
8998 // clang-format on
8999
dschinazi66dea072019-04-09 11:41:06 -07009000 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009001 QuicDeque<QuicPathFrameBuffer> payloads;
9002 payloads.push_back(payload0);
9003 payloads.push_back(payload1);
9004 payloads.push_back(payload2);
9005 size_t length = framer_.BuildPathResponsePacket(
9006 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
QUICHE team6987b4a2019-03-15 16:23:04 -07009007 /*is_padded=*/false, ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009008 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
9009 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
9010 header);
9011
9012 test::CompareCharArraysWithHexError("constructed packet", data.data(),
9013 data.length(), AsChars(packet),
9014 QUIC_ARRAYSIZE(packet));
9015}
9016
9017TEST_P(QuicFramerTest, BuildPathResponsePacket3ResponsesPadded) {
9018 if (framer_.transport_version() != QUIC_VERSION_99) {
9019 return;
9020 }
9021
9022 QuicPacketHeader header;
9023 header.destination_connection_id = FramerTestConnectionId();
9024 header.reset_flag = false;
9025 header.version_flag = false;
9026 header.packet_number = kPacketNumber;
9027 QuicPathFrameBuffer payload0 = {
9028 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
9029 QuicPathFrameBuffer payload1 = {
9030 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
9031 QuicPathFrameBuffer payload2 = {
9032 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
9033
9034 // Build one packet with 3 PATH RESPONSES, with padding
9035 // clang-format off
9036 unsigned char packet[] = {
9037 // type (short header, 4 byte packet number)
9038 0x43,
9039 // connection_id
9040 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9041 // packet number
9042 0x12, 0x34, 0x56, 0x78,
9043
9044 // 3 path response frames (IETF_PATH_RESPONSE byte and payload)
9045 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
9046 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
9047 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
9048 // Padding
9049 0x00, 0x00, 0x00, 0x00, 0x00
9050 };
9051 // clang-format on
9052
dschinazi66dea072019-04-09 11:41:06 -07009053 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009054 QuicDeque<QuicPathFrameBuffer> payloads;
9055 payloads.push_back(payload0);
9056 payloads.push_back(payload1);
9057 payloads.push_back(payload2);
9058 size_t length = framer_.BuildPathResponsePacket(
9059 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
QUICHE team6987b4a2019-03-15 16:23:04 -07009060 /*is_padded=*/true, ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009061 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
9062 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
9063 header);
9064
9065 test::CompareCharArraysWithHexError("constructed packet", data.data(),
9066 data.length(), AsChars(packet),
9067 QUIC_ARRAYSIZE(packet));
9068}
9069
9070// Test that the MTU discovery packet is serialized correctly as a PING packet.
9071TEST_P(QuicFramerTest, BuildMtuDiscoveryPacket) {
9072 QuicPacketHeader header;
9073 header.destination_connection_id = FramerTestConnectionId();
9074 header.reset_flag = false;
9075 header.version_flag = false;
9076 header.packet_number = kPacketNumber;
9077
9078 QuicFrames frames = {QuicFrame(QuicMtuDiscoveryFrame())};
9079
9080 // clang-format off
9081 unsigned char packet[] = {
9082 // public flags (8 byte connection_id)
9083 0x28,
9084 // connection_id
9085 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9086 // packet number
9087 0x12, 0x34, 0x56, 0x78,
9088
9089 // frame type (ping frame)
9090 0x07,
9091 };
9092
9093 unsigned char packet44[] = {
9094 // type (short header, 4 byte packet number)
9095 0x32,
9096 // connection_id
9097 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9098 // packet number
9099 0x12, 0x34, 0x56, 0x78,
9100
9101 // frame type
9102 0x07,
9103 };
9104
9105 unsigned char packet46[] = {
9106 // type (short header, 4 byte packet number)
9107 0x43,
9108 // connection_id
9109 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9110 // packet number
9111 0x12, 0x34, 0x56, 0x78,
9112
9113 // frame type
9114 0x07,
9115 };
9116
9117 unsigned char packet99[] = {
9118 // type (short header, 4 byte packet number)
9119 0x43,
9120 // connection_id
9121 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9122 // packet number
9123 0x12, 0x34, 0x56, 0x78,
9124
9125 // frame type (IETF_PING frame)
9126 0x01,
9127 };
9128 // clang-format on
9129
9130 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9131 ASSERT_TRUE(data != nullptr);
9132
9133 unsigned char* p = packet;
9134 if (framer_.transport_version() == QUIC_VERSION_99) {
9135 p = packet99;
9136 } else if (framer_.transport_version() > QUIC_VERSION_44) {
9137 p = packet46;
9138 } else if (framer_.transport_version() > QUIC_VERSION_43) {
9139 p = packet44;
9140 }
9141
9142 test::CompareCharArraysWithHexError(
9143 "constructed packet", data->data(), data->length(), AsChars(p),
9144 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44)
9145 : QUIC_ARRAYSIZE(packet));
9146}
9147
9148TEST_P(QuicFramerTest, BuildPublicResetPacket) {
9149 QuicPublicResetPacket reset_packet;
9150 reset_packet.connection_id = FramerTestConnectionId();
9151 reset_packet.nonce_proof = kNonceProof;
9152
9153 // clang-format off
9154 unsigned char packet[] = {
9155 // public flags (public reset, 8 byte ConnectionId)
9156 0x0E,
9157 // connection_id
9158 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9159 // message tag (kPRST)
9160 'P', 'R', 'S', 'T',
9161 // num_entries (1) + padding
9162 0x01, 0x00, 0x00, 0x00,
9163 // tag kRNON
9164 'R', 'N', 'O', 'N',
9165 // end offset 8
9166 0x08, 0x00, 0x00, 0x00,
9167 // nonce proof
9168 0x89, 0x67, 0x45, 0x23,
9169 0x01, 0xEF, 0xCD, 0xAB,
9170 };
9171 // clang-format on
9172
9173 if (framer_.transport_version() > QUIC_VERSION_43) {
9174 return;
9175 }
9176
9177 std::unique_ptr<QuicEncryptedPacket> data(
9178 framer_.BuildPublicResetPacket(reset_packet));
9179 ASSERT_TRUE(data != nullptr);
9180 test::CompareCharArraysWithHexError("constructed packet", data->data(),
9181 data->length(), AsChars(packet),
9182 QUIC_ARRAYSIZE(packet));
9183}
9184
9185TEST_P(QuicFramerTest, BuildPublicResetPacketWithClientAddress) {
9186 QuicPublicResetPacket reset_packet;
9187 reset_packet.connection_id = FramerTestConnectionId();
9188 reset_packet.nonce_proof = kNonceProof;
9189 reset_packet.client_address =
9190 QuicSocketAddress(QuicIpAddress::Loopback4(), 0x1234);
9191
9192 // clang-format off
9193 unsigned char packet[] = {
9194 // public flags (public reset, 8 byte ConnectionId)
9195 0x0E,
9196 // connection_id
9197 0xFE, 0xDC, 0xBA, 0x98,
9198 0x76, 0x54, 0x32, 0x10,
9199 // message tag (kPRST)
9200 'P', 'R', 'S', 'T',
9201 // num_entries (2) + padding
9202 0x02, 0x00, 0x00, 0x00,
9203 // tag kRNON
9204 'R', 'N', 'O', 'N',
9205 // end offset 8
9206 0x08, 0x00, 0x00, 0x00,
9207 // tag kCADR
9208 'C', 'A', 'D', 'R',
9209 // end offset 16
9210 0x10, 0x00, 0x00, 0x00,
9211 // nonce proof
9212 0x89, 0x67, 0x45, 0x23,
9213 0x01, 0xEF, 0xCD, 0xAB,
9214 // client address
9215 0x02, 0x00,
9216 0x7F, 0x00, 0x00, 0x01,
9217 0x34, 0x12,
9218 };
9219 // clang-format on
9220
9221 if (framer_.transport_version() > QUIC_VERSION_43) {
9222 return;
9223 }
9224
9225 std::unique_ptr<QuicEncryptedPacket> data(
9226 framer_.BuildPublicResetPacket(reset_packet));
9227 ASSERT_TRUE(data != nullptr);
9228
9229 test::CompareCharArraysWithHexError("constructed packet", data->data(),
9230 data->length(), AsChars(packet),
9231 QUIC_ARRAYSIZE(packet));
9232}
9233
9234TEST_P(QuicFramerTest, BuildPublicResetPacketWithEndpointId) {
9235 QuicPublicResetPacket reset_packet;
9236 reset_packet.connection_id = FramerTestConnectionId();
9237 reset_packet.nonce_proof = kNonceProof;
9238 reset_packet.endpoint_id = "FakeServerId";
9239
9240 // The tag value map in CryptoHandshakeMessage is a std::map, so the two tags
9241 // in the packet, kRNON and kEPID, have unspecified ordering w.r.t each other.
9242 // clang-format off
9243 unsigned char packet_variant1[] = {
9244 // public flags (public reset, 8 byte ConnectionId)
9245 0x0E,
9246 // connection_id
9247 0xFE, 0xDC, 0xBA, 0x98,
9248 0x76, 0x54, 0x32, 0x10,
9249 // message tag (kPRST)
9250 'P', 'R', 'S', 'T',
9251 // num_entries (2) + padding
9252 0x02, 0x00, 0x00, 0x00,
9253 // tag kRNON
9254 'R', 'N', 'O', 'N',
9255 // end offset 8
9256 0x08, 0x00, 0x00, 0x00,
9257 // tag kEPID
9258 'E', 'P', 'I', 'D',
9259 // end offset 20
9260 0x14, 0x00, 0x00, 0x00,
9261 // nonce proof
9262 0x89, 0x67, 0x45, 0x23,
9263 0x01, 0xEF, 0xCD, 0xAB,
9264 // Endpoint ID
9265 'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
9266 };
9267 unsigned char packet_variant2[] = {
9268 // public flags (public reset, 8 byte ConnectionId)
9269 0x0E,
9270 // connection_id
9271 0xFE, 0xDC, 0xBA, 0x98,
9272 0x76, 0x54, 0x32, 0x10,
9273 // message tag (kPRST)
9274 'P', 'R', 'S', 'T',
9275 // num_entries (2) + padding
9276 0x02, 0x00, 0x00, 0x00,
9277 // tag kEPID
9278 'E', 'P', 'I', 'D',
9279 // end offset 12
9280 0x0C, 0x00, 0x00, 0x00,
9281 // tag kRNON
9282 'R', 'N', 'O', 'N',
9283 // end offset 20
9284 0x14, 0x00, 0x00, 0x00,
9285 // Endpoint ID
9286 'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
9287 // nonce proof
9288 0x89, 0x67, 0x45, 0x23,
9289 0x01, 0xEF, 0xCD, 0xAB,
9290 };
9291 // clang-format on
9292
9293 if (framer_.transport_version() > QUIC_VERSION_43) {
9294 return;
9295 }
9296
9297 std::unique_ptr<QuicEncryptedPacket> data(
9298 framer_.BuildPublicResetPacket(reset_packet));
9299 ASSERT_TRUE(data != nullptr);
9300
9301 // Variant 1 ends with char 'd'. Variant 1 ends with char 0xAB.
9302 if ('d' == data->data()[data->length() - 1]) {
9303 test::CompareCharArraysWithHexError(
9304 "constructed packet", data->data(), data->length(),
9305 AsChars(packet_variant1), QUIC_ARRAYSIZE(packet_variant1));
9306 } else {
9307 test::CompareCharArraysWithHexError(
9308 "constructed packet", data->data(), data->length(),
9309 AsChars(packet_variant2), QUIC_ARRAYSIZE(packet_variant2));
9310 }
9311}
9312
9313TEST_P(QuicFramerTest, BuildIetfStatelessResetPacket) {
9314 // clang-format off
9315 unsigned char packet44[] = {
9316 // type (short header, 1 byte packet number)
9317 0x70,
9318 // random packet number
9319 0xFE,
9320 // stateless reset token
9321 0xB5, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
9322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9323 };
9324 // clang-format on
9325
9326 std::unique_ptr<QuicEncryptedPacket> data(
9327 framer_.BuildIetfStatelessResetPacket(FramerTestConnectionId(),
9328 kTestStatelessResetToken));
9329 ASSERT_TRUE(data != nullptr);
9330 // Skip packet number byte which is random in stateless reset packet.
9331 test::CompareCharArraysWithHexError("constructed packet", data->data(), 1,
9332 AsChars(packet44), 1);
9333 const size_t random_bytes_length =
9334 data->length() - kPacketHeaderTypeSize - sizeof(kTestStatelessResetToken);
9335 EXPECT_EQ(kMinRandomBytesLengthInStatelessReset, random_bytes_length);
9336 // Verify stateless reset token is correct.
9337 test::CompareCharArraysWithHexError(
9338 "constructed packet",
9339 data->data() + data->length() - sizeof(kTestStatelessResetToken),
9340 sizeof(kTestStatelessResetToken),
9341 AsChars(packet44) + QUIC_ARRAYSIZE(packet44) -
9342 sizeof(kTestStatelessResetToken),
9343 sizeof(kTestStatelessResetToken));
9344}
9345
9346TEST_P(QuicFramerTest, EncryptPacket) {
9347 QuicPacketNumber packet_number = kPacketNumber;
9348 // clang-format off
9349 unsigned char packet[] = {
9350 // public flags (8 byte connection_id)
9351 0x28,
9352 // connection_id
9353 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9354 // packet number
9355 0x12, 0x34, 0x56, 0x78,
9356
9357 // redundancy
9358 'a', 'b', 'c', 'd',
9359 'e', 'f', 'g', 'h',
9360 'i', 'j', 'k', 'l',
9361 'm', 'n', 'o', 'p',
9362 };
9363
9364 unsigned char packet44[] = {
9365 // type (short header, 4 byte packet number)
9366 0x32,
9367 // connection_id
9368 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9369 // packet number
9370 0x12, 0x34, 0x56, 0x78,
9371
9372 // redundancy
9373 'a', 'b', 'c', 'd',
9374 'e', 'f', 'g', 'h',
9375 'i', 'j', 'k', 'l',
9376 'm', 'n', 'o', 'p',
9377 };
9378
9379 unsigned char packet46[] = {
9380 // type (short header, 4 byte packet number)
9381 0x43,
9382 // connection_id
9383 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9384 // packet number
9385 0x12, 0x34, 0x56, 0x78,
9386
9387 // redundancy
9388 'a', 'b', 'c', 'd',
9389 'e', 'f', 'g', 'h',
9390 'i', 'j', 'k', 'l',
9391 'm', 'n', 'o', 'p',
9392 };
9393
9394 unsigned char packet99[] = {
9395 // type (short header, 4 byte packet number)
9396 0x43,
9397 // connection_id
9398 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9399 // packet number
9400 0x12, 0x34, 0x56, 0x78,
9401
9402 // redundancy
9403 'a', 'b', 'c', 'd',
9404 'e', 'f', 'g', 'h',
9405 'i', 'j', 'k', 'l',
9406 'm', 'n', 'o', 'p',
9407 };
9408 // clang-format on
9409
9410 unsigned char* p = packet;
9411 if (framer_.transport_version() == QUIC_VERSION_99) {
9412 p = packet99;
9413 } else if (framer_.transport_version() > QUIC_VERSION_44) {
9414 p = packet46;
9415 } else if (framer_.transport_version() > QUIC_VERSION_43) {
9416 p = packet44;
9417 }
9418
9419 std::unique_ptr<QuicPacket> raw(new QuicPacket(
9420 AsChars(p), QUIC_ARRAYSIZE(packet), false, PACKET_8BYTE_CONNECTION_ID,
9421 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
9422 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
9423 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0));
dschinazi66dea072019-04-09 11:41:06 -07009424 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009425 size_t encrypted_length = framer_.EncryptPayload(
dschinazi66dea072019-04-09 11:41:06 -07009426 ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009427
9428 ASSERT_NE(0u, encrypted_length);
9429 EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
9430}
9431
9432TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) {
9433 QuicPacketNumber packet_number = kPacketNumber;
9434 // clang-format off
9435 unsigned char packet[] = {
9436 // public flags (version, 8 byte connection_id)
9437 0x29,
9438 // connection_id
9439 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9440 // version tag
9441 'Q', '.', '1', '0',
9442 // packet number
9443 0x12, 0x34, 0x56, 0x78,
9444
9445 // redundancy
9446 'a', 'b', 'c', 'd',
9447 'e', 'f', 'g', 'h',
9448 'i', 'j', 'k', 'l',
9449 'm', 'n', 'o', 'p',
9450 };
9451
9452 unsigned char packet44[] = {
9453 // type (long header with packet type ZERO_RTT_PROTECTED)
9454 0xFC,
9455 // version tag
9456 'Q', '.', '1', '0',
9457 // connection_id length
9458 0x50,
9459 // connection_id
9460 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9461 // packet number
9462 0x12, 0x34, 0x56, 0x78,
9463
9464 // redundancy
9465 'a', 'b', 'c', 'd',
9466 'e', 'f', 'g', 'h',
9467 'i', 'j', 'k', 'l',
9468 'm', 'n', 'o', 'p',
9469 };
9470
9471 unsigned char packet46[] = {
9472 // type (long header with packet type ZERO_RTT_PROTECTED)
9473 0xD3,
9474 // version tag
9475 'Q', '.', '1', '0',
9476 // connection_id length
9477 0x50,
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 (long header with packet type ZERO_RTT_PROTECTED)
9492 0xD3,
9493 // version tag
9494 'Q', '.', '1', '0',
9495 // connection_id length
9496 0x50,
9497 // connection_id
9498 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9499 // packet number
9500 0x12, 0x34, 0x56, 0x78,
9501
9502 // redundancy
9503 'a', 'b', 'c', 'd',
9504 'e', 'f', 'g', 'h',
9505 'i', 'j', 'k', 'l',
9506 'm', 'n', 'o', 'p',
9507 };
9508 // clang-format on
9509
9510 unsigned char* p = packet;
9511 if (framer_.transport_version() == QUIC_VERSION_99) {
9512 p = packet99;
9513 } else if (framer_.transport_version() > QUIC_VERSION_44) {
9514 p = packet46;
9515 } else if (framer_.transport_version() > QUIC_VERSION_43) {
9516 p = packet44;
9517 }
9518
9519 std::unique_ptr<QuicPacket> raw(new QuicPacket(
9520 AsChars(p),
9521 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44)
9522 : QUIC_ARRAYSIZE(packet),
9523 false, PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID,
9524 kIncludeVersion, !kIncludeDiversificationNonce,
9525 PACKET_4BYTE_PACKET_NUMBER, VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
9526 VARIABLE_LENGTH_INTEGER_LENGTH_0));
dschinazi66dea072019-04-09 11:41:06 -07009527 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009528 size_t encrypted_length = framer_.EncryptPayload(
dschinazi66dea072019-04-09 11:41:06 -07009529 ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009530
9531 ASSERT_NE(0u, encrypted_length);
9532 EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
9533}
9534
9535TEST_P(QuicFramerTest, AckTruncationLargePacket) {
9536 if (framer_.transport_version() == QUIC_VERSION_99) {
9537 // This test is not applicable to this version; the range count is
9538 // effectively unlimited
9539 return;
9540 }
nharper9bb83462019-05-01 10:53:22 -07009541 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009542
9543 QuicPacketHeader header;
9544 header.destination_connection_id = FramerTestConnectionId();
9545 header.reset_flag = false;
9546 header.version_flag = false;
9547 header.packet_number = kPacketNumber;
9548
9549 QuicAckFrame ack_frame;
9550 // Create a packet with just the ack.
9551 ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
9552 QuicFrames frames = {QuicFrame(&ack_frame)};
9553
9554 // Build an ack packet with truncation due to limit in number of nack ranges.
9555 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9556 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
9557 ASSERT_TRUE(raw_ack_packet != nullptr);
dschinazi66dea072019-04-09 11:41:06 -07009558 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009559 size_t encrypted_length =
QUICHE team6987b4a2019-03-15 16:23:04 -07009560 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
dschinazi66dea072019-04-09 11:41:06 -07009561 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009562 ASSERT_NE(0u, encrypted_length);
9563 // Now make sure we can turn our ack packet back into an ack frame.
9564 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
9565 ASSERT_TRUE(framer_.ProcessPacket(
9566 QuicEncryptedPacket(buffer, encrypted_length, false)));
9567 ASSERT_EQ(1u, visitor_.ack_frames_.size());
9568 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
9569 EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
9570 ASSERT_EQ(256u, processed_ack_frame.packets.NumPacketsSlow());
9571 EXPECT_EQ(QuicPacketNumber(90u), processed_ack_frame.packets.Min());
9572 EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
9573}
9574
9575TEST_P(QuicFramerTest, AckTruncationSmallPacket) {
9576 if (framer_.transport_version() == QUIC_VERSION_99) {
9577 // This test is not applicable to this version; the range count is
9578 // effectively unlimited
9579 return;
9580 }
nharper9bb83462019-05-01 10:53:22 -07009581 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009582
9583 QuicPacketHeader header;
9584 header.destination_connection_id = FramerTestConnectionId();
9585 header.reset_flag = false;
9586 header.version_flag = false;
9587 header.packet_number = kPacketNumber;
9588
9589 // Create a packet with just the ack.
9590 QuicAckFrame ack_frame;
9591 ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
9592 QuicFrames frames = {QuicFrame(&ack_frame)};
9593
9594 // Build an ack packet with truncation due to limit in number of nack ranges.
9595 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9596 std::unique_ptr<QuicPacket> raw_ack_packet(
9597 BuildDataPacket(header, frames, 500));
9598 ASSERT_TRUE(raw_ack_packet != nullptr);
dschinazi66dea072019-04-09 11:41:06 -07009599 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009600 size_t encrypted_length =
QUICHE team6987b4a2019-03-15 16:23:04 -07009601 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
dschinazi66dea072019-04-09 11:41:06 -07009602 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009603 ASSERT_NE(0u, encrypted_length);
9604 // Now make sure we can turn our ack packet back into an ack frame.
9605 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
9606 ASSERT_TRUE(framer_.ProcessPacket(
9607 QuicEncryptedPacket(buffer, encrypted_length, false)));
9608 ASSERT_EQ(1u, visitor_.ack_frames_.size());
9609 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
9610 EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
9611 ASSERT_EQ(240u, processed_ack_frame.packets.NumPacketsSlow());
9612 EXPECT_EQ(QuicPacketNumber(122u), processed_ack_frame.packets.Min());
9613 EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
9614}
9615
9616TEST_P(QuicFramerTest, CleanTruncation) {
9617 if (framer_.transport_version() == QUIC_VERSION_99) {
9618 // This test is not applicable to this version; the range count is
9619 // effectively unlimited
9620 return;
9621 }
nharper9bb83462019-05-01 10:53:22 -07009622 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009623
9624 QuicPacketHeader header;
9625 header.destination_connection_id = FramerTestConnectionId();
9626 header.reset_flag = false;
9627 header.version_flag = false;
9628 header.packet_number = kPacketNumber;
9629
9630 QuicAckFrame ack_frame = InitAckFrame(201);
9631
9632 // Create a packet with just the ack.
9633 QuicFrames frames = {QuicFrame(&ack_frame)};
9634 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9635 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
9636 ASSERT_TRUE(raw_ack_packet != nullptr);
9637
dschinazi66dea072019-04-09 11:41:06 -07009638 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009639 size_t encrypted_length =
QUICHE team6987b4a2019-03-15 16:23:04 -07009640 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
dschinazi66dea072019-04-09 11:41:06 -07009641 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009642 ASSERT_NE(0u, encrypted_length);
9643
9644 // Now make sure we can turn our ack packet back into an ack frame.
9645 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
9646 ASSERT_TRUE(framer_.ProcessPacket(
9647 QuicEncryptedPacket(buffer, encrypted_length, false)));
9648
9649 // Test for clean truncation of the ack by comparing the length of the
9650 // original packets to the re-serialized packets.
9651 frames.clear();
9652 frames.push_back(QuicFrame(visitor_.ack_frames_[0].get()));
9653
9654 size_t original_raw_length = raw_ack_packet->length();
9655 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9656 raw_ack_packet = BuildDataPacket(header, frames);
9657 ASSERT_TRUE(raw_ack_packet != nullptr);
9658 EXPECT_EQ(original_raw_length, raw_ack_packet->length());
9659 ASSERT_TRUE(raw_ack_packet != nullptr);
9660}
9661
9662TEST_P(QuicFramerTest, StopPacketProcessing) {
zhongyi546cc452019-04-12 15:27:49 -07009663 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009664 // clang-format off
9665 unsigned char packet[] = {
9666 // public flags (8 byte connection_id)
9667 0x28,
9668 // connection_id
9669 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9670 // packet number
9671 0x12, 0x34, 0x56, 0x78,
9672
9673 // frame type (stream frame with fin)
9674 0xFF,
9675 // stream id
9676 0x01, 0x02, 0x03, 0x04,
9677 // offset
9678 0x3A, 0x98, 0xFE, 0xDC,
9679 0x32, 0x10, 0x76, 0x54,
9680 // data length
9681 0x00, 0x0c,
9682 // data
9683 'h', 'e', 'l', 'l',
9684 'o', ' ', 'w', 'o',
9685 'r', 'l', 'd', '!',
9686
9687 // frame type (ack frame)
9688 0x40,
9689 // least packet number awaiting an ack
9690 0x12, 0x34, 0x56, 0x78,
9691 0x9A, 0xA0,
9692 // largest observed packet number
9693 0x12, 0x34, 0x56, 0x78,
9694 0x9A, 0xBF,
9695 // num missing packets
9696 0x01,
9697 // missing packet
9698 0x12, 0x34, 0x56, 0x78,
9699 0x9A, 0xBE,
9700 };
9701
9702 unsigned char packet44[] = {
9703 // type (short header, 4 byte packet number)
9704 0x32,
9705 // connection_id
9706 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9707 // packet number
9708 0x12, 0x34, 0x56, 0x78,
9709
9710 // frame type (stream frame with fin)
9711 0xFF,
9712 // stream id
9713 0x01, 0x02, 0x03, 0x04,
9714 // offset
9715 0x3A, 0x98, 0xFE, 0xDC,
9716 0x32, 0x10, 0x76, 0x54,
9717 // data length
9718 0x00, 0x0c,
9719 // data
9720 'h', 'e', 'l', 'l',
9721 'o', ' ', 'w', 'o',
9722 'r', 'l', 'd', '!',
9723
9724 // frame type (ack frame)
9725 0x40,
9726 // least packet number awaiting an ack
9727 0x12, 0x34, 0x56, 0x78,
9728 0x9A, 0xA0,
9729 // largest observed packet number
9730 0x12, 0x34, 0x56, 0x78,
9731 0x9A, 0xBF,
9732 // num missing packets
9733 0x01,
9734 // missing packet
9735 0x12, 0x34, 0x56, 0x78,
9736 0x9A, 0xBE,
9737 };
9738
9739 unsigned char packet46[] = {
9740 // type (short header, 4 byte packet number)
9741 0x43,
9742 // connection_id
9743 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9744 // packet number
9745 0x12, 0x34, 0x56, 0x78,
9746
9747 // frame type (stream frame with fin)
9748 0xFF,
9749 // stream id
9750 0x01, 0x02, 0x03, 0x04,
9751 // offset
9752 0x3A, 0x98, 0xFE, 0xDC,
9753 0x32, 0x10, 0x76, 0x54,
9754 // data length
9755 0x00, 0x0c,
9756 // data
9757 'h', 'e', 'l', 'l',
9758 'o', ' ', 'w', 'o',
9759 'r', 'l', 'd', '!',
9760
9761 // frame type (ack frame)
9762 0x40,
9763 // least packet number awaiting an ack
9764 0x12, 0x34, 0x56, 0x78,
9765 0x9A, 0xA0,
9766 // largest observed packet number
9767 0x12, 0x34, 0x56, 0x78,
9768 0x9A, 0xBF,
9769 // num missing packets
9770 0x01,
9771 // missing packet
9772 0x12, 0x34, 0x56, 0x78,
9773 0x9A, 0xBE,
9774 };
9775
9776 unsigned char packet99[] = {
9777 // type (short header, 4 byte packet number)
9778 0x43,
9779 // connection_id
9780 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9781 // packet number
9782 0x12, 0x34, 0x56, 0x78,
9783
9784 // frame type (IETF_STREAM frame with fin, length, and offset bits set)
9785 0x08 | 0x01 | 0x02 | 0x04,
9786 // stream id
9787 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
9788 // offset
9789 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
9790 0x32, 0x10, 0x76, 0x54,
9791 // data length
9792 kVarInt62TwoBytes + 0x00, 0x0c,
9793 // data
9794 'h', 'e', 'l', 'l',
9795 'o', ' ', 'w', 'o',
9796 'r', 'l', 'd', '!',
9797
9798 // frame type (ack frame)
9799 0x0d,
9800 // largest observed packet number
9801 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
9802 // Delta time
9803 kVarInt62OneByte + 0x00,
9804 // Ack Block count
9805 kVarInt62OneByte + 0x01,
9806 // First block size (one packet)
9807 kVarInt62OneByte + 0x00,
9808
9809 // Next gap size & ack. Missing all preceding packets
9810 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
9811 kVarInt62OneByte + 0x00,
9812 };
9813 // clang-format on
9814
9815 MockFramerVisitor visitor;
9816 framer_.set_visitor(&visitor);
9817 EXPECT_CALL(visitor, OnPacket());
9818 EXPECT_CALL(visitor, OnPacketHeader(_));
9819 EXPECT_CALL(visitor, OnStreamFrame(_)).WillOnce(Return(false));
9820 EXPECT_CALL(visitor, OnPacketComplete());
9821 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true));
9822 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_)).WillOnce(Return(true));
9823 EXPECT_CALL(visitor, OnDecryptedPacket(_));
9824
9825 unsigned char* p = packet;
9826 size_t p_size = QUIC_ARRAYSIZE(packet);
9827 if (framer_.transport_version() == QUIC_VERSION_99) {
9828 p = packet99;
9829 p_size = QUIC_ARRAYSIZE(packet99);
9830 } else if (framer_.transport_version() > QUIC_VERSION_44) {
9831 p = packet46;
9832 p_size = QUIC_ARRAYSIZE(packet46);
9833 } else if (framer_.transport_version() > QUIC_VERSION_43) {
9834 p = packet44;
9835 p_size = QUIC_ARRAYSIZE(packet44);
9836 }
9837 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
9838 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9839 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
9840}
9841
9842static char kTestString[] = "At least 20 characters.";
9843static QuicStreamId kTestQuicStreamId = 1;
9844static bool ExpectedStreamFrame(const QuicStreamFrame& frame) {
9845 return (frame.stream_id == kTestQuicStreamId ||
9846 frame.stream_id == QuicUtils::GetCryptoStreamId(QUIC_VERSION_99)) &&
9847 !frame.fin && frame.offset == 0 &&
vasilvvc48c8712019-03-11 13:38:16 -07009848 std::string(frame.data_buffer, frame.data_length) == kTestString;
QUICHE teama6ef0a62019-03-07 20:34:33 -05009849 // FIN is hard-coded false in ConstructEncryptedPacket.
9850 // Offset 0 is hard-coded in ConstructEncryptedPacket.
9851}
9852
9853// Verify that the packet returned by ConstructEncryptedPacket() can be properly
9854// parsed by the framer.
9855TEST_P(QuicFramerTest, ConstructEncryptedPacket) {
9856 // Since we are using ConstructEncryptedPacket, we have to set the framer's
9857 // crypto to be Null.
zhongyi546cc452019-04-12 15:27:49 -07009858 if (framer_.version().KnowsWhichDecrypterToUse()) {
9859 framer_.InstallDecrypter(
9860 ENCRYPTION_FORWARD_SECURE,
9861 QuicMakeUnique<NullDecrypter>(framer_.perspective()));
9862 } else {
9863 framer_.SetDecrypter(ENCRYPTION_INITIAL,
9864 QuicMakeUnique<NullDecrypter>(framer_.perspective()));
9865 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05009866 ParsedQuicVersionVector versions;
9867 versions.push_back(framer_.version());
9868 std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket(
9869 TestConnectionId(), EmptyQuicConnectionId(), false, false,
9870 kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
9871 CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, &versions));
9872
9873 MockFramerVisitor visitor;
9874 framer_.set_visitor(&visitor);
9875 EXPECT_CALL(visitor, OnPacket()).Times(1);
9876 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
9877 .Times(1)
9878 .WillOnce(Return(true));
9879 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
9880 .Times(1)
9881 .WillOnce(Return(true));
9882 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1).WillOnce(Return(true));
9883 EXPECT_CALL(visitor, OnDecryptedPacket(_)).Times(1);
9884 EXPECT_CALL(visitor, OnError(_)).Times(0);
9885 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
QUICHE teamea740082019-03-11 17:58:43 -07009886 if (!QuicVersionUsesCryptoFrames(framer_.version().transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009887 EXPECT_CALL(visitor, OnStreamFrame(Truly(ExpectedStreamFrame))).Times(1);
9888 } else {
9889 EXPECT_CALL(visitor, OnCryptoFrame(_)).Times(1);
9890 }
9891 EXPECT_CALL(visitor, OnPacketComplete()).Times(1);
9892
9893 EXPECT_TRUE(framer_.ProcessPacket(*packet));
9894 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
9895}
9896
9897// Verify that the packet returned by ConstructMisFramedEncryptedPacket()
9898// does cause the framer to return an error.
9899TEST_P(QuicFramerTest, ConstructMisFramedEncryptedPacket) {
9900 // Since we are using ConstructEncryptedPacket, we have to set the framer's
9901 // crypto to be Null.
zhongyi546cc452019-04-12 15:27:49 -07009902 if (framer_.version().KnowsWhichDecrypterToUse()) {
nharper9bb83462019-05-01 10:53:22 -07009903 framer_.InstallDecrypter(
9904 ENCRYPTION_FORWARD_SECURE,
9905 QuicMakeUnique<NullDecrypter>(framer_.perspective()));
zhongyi546cc452019-04-12 15:27:49 -07009906 } else {
9907 framer_.SetDecrypter(ENCRYPTION_INITIAL,
9908 QuicMakeUnique<NullDecrypter>(framer_.perspective()));
9909 }
QUICHE team6987b4a2019-03-15 16:23:04 -07009910 framer_.SetEncrypter(ENCRYPTION_INITIAL,
QUICHE teama6ef0a62019-03-07 20:34:33 -05009911 QuicMakeUnique<NullEncrypter>(framer_.perspective()));
9912 ParsedQuicVersionVector versions;
9913 versions.push_back(framer_.version());
9914 std::unique_ptr<QuicEncryptedPacket> packet(ConstructMisFramedEncryptedPacket(
9915 TestConnectionId(), EmptyQuicConnectionId(), false, false,
9916 kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
9917 CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, &versions,
9918 Perspective::IS_CLIENT));
9919
9920 MockFramerVisitor visitor;
9921 framer_.set_visitor(&visitor);
9922 EXPECT_CALL(visitor, OnPacket()).Times(1);
9923 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
9924 .Times(1)
9925 .WillOnce(Return(true));
9926 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
9927 .Times(1)
9928 .WillOnce(Return(true));
9929 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1);
9930 EXPECT_CALL(visitor, OnDecryptedPacket(_)).Times(1);
9931 EXPECT_CALL(visitor, OnError(_)).Times(1);
9932 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
9933 EXPECT_CALL(visitor, OnPacketComplete()).Times(0);
9934
9935 EXPECT_FALSE(framer_.ProcessPacket(*packet));
9936 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
9937}
9938
9939// Tests for fuzzing with Dr. Fuzz
9940// Xref http://www.chromium.org/developers/testing/dr-fuzz for more details.
9941#ifdef __cplusplus
9942extern "C" {
9943#endif
9944
9945// target function to be fuzzed by Dr. Fuzz
9946void QuicFramerFuzzFunc(unsigned char* data,
9947 size_t size,
9948 const ParsedQuicVersion& version) {
9949 QuicFramer framer(AllSupportedVersions(), QuicTime::Zero(),
9950 Perspective::IS_SERVER, kQuicDefaultConnectionIdLength);
9951 ASSERT_EQ(GetQuicFlag(FLAGS_quic_supports_tls_handshake), true);
9952 const char* const packet_bytes = reinterpret_cast<const char*>(data);
9953
9954 // Test the CryptoFramer.
9955 QuicStringPiece crypto_input(packet_bytes, size);
9956 std::unique_ptr<CryptoHandshakeMessage> handshake_message(
9957 CryptoFramer::ParseMessage(crypto_input));
9958
9959 // Test the regular QuicFramer with the same input.
9960 NoOpFramerVisitor visitor;
9961 framer.set_visitor(&visitor);
9962 framer.set_version(version);
9963 QuicEncryptedPacket packet(packet_bytes, size);
9964 framer.ProcessPacket(packet);
9965}
9966
9967#ifdef __cplusplus
9968}
9969#endif
9970
9971TEST_P(QuicFramerTest, FramerFuzzTest) {
9972 // clang-format off
9973 unsigned char packet[] = {
9974 // public flags (8 byte connection_id)
9975 0x2C,
9976 // connection_id
9977 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9978 // packet number
9979 0x12, 0x34, 0x56, 0x78,
9980 // private flags
9981 0x00,
9982
9983 // frame type (stream frame with fin)
9984 0xFF,
9985 // stream id
9986 0x01, 0x02, 0x03, 0x04,
9987 // offset
9988 0x3A, 0x98, 0xFE, 0xDC,
9989 0x32, 0x10, 0x76, 0x54,
9990 // data length
9991 0x00, 0x0c,
9992 // data
9993 'h', 'e', 'l', 'l',
9994 'o', ' ', 'w', 'o',
9995 'r', 'l', 'd', '!',
9996 };
9997
9998 unsigned char packet44[] = {
9999 // type (short header, 4 byte packet number)
10000 0x32,
10001 // packet number
10002 0x12, 0x34, 0x56, 0x78,
10003
10004 // frame type (stream frame with fin, length, and offset bits set)
10005 0x10 | 0x01 | 0x02 | 0x04,
10006 // stream id
10007 0x01, 0x02, 0x03, 0x04,
10008 // offset
10009 0x3A, 0x98, 0xFE, 0xDC,
10010 0x32, 0x10, 0x76, 0x54,
10011 // data length
10012 0x00, 0x0c,
10013 // data
10014 'h', 'e', 'l', 'l',
10015 'o', ' ', 'w', 'o',
10016 'r', 'l', 'd', '!',
10017 };
10018
10019 unsigned char packet46[] = {
10020 // type (short header, 4 byte packet number)
10021 0x43,
10022 // packet number
10023 0x12, 0x34, 0x56, 0x78,
10024
10025 // frame type (stream frame with fin, length, and offset bits set)
10026 0x10 | 0x01 | 0x02 | 0x04,
10027 // stream id
10028 0x01, 0x02, 0x03, 0x04,
10029 // offset
10030 0x3A, 0x98, 0xFE, 0xDC,
10031 0x32, 0x10, 0x76, 0x54,
10032 // data length
10033 0x00, 0x0c,
10034 // data
10035 'h', 'e', 'l', 'l',
10036 'o', ' ', 'w', 'o',
10037 'r', 'l', 'd', '!',
10038 };
10039
10040 unsigned char packet99[] = {
10041 // type (short header, 4 byte packet number)
10042 0x43,
10043 // packet number
10044 0x12, 0x34, 0x56, 0x78,
10045
10046 // frame type (IETF_STREAM frame with fin, length, and offset bits set)
10047 0x08 | 0x01 | 0x02 | 0x04,
10048 // stream id
10049 0x01, 0x02, 0x03, 0x04,
10050 // offset
10051 0x3A, 0x98, 0xFE, 0xDC,
10052 0x32, 0x10, 0x76, 0x54,
10053 // data length
10054 0x00, 0x0c,
10055 // data
10056 'h', 'e', 'l', 'l',
10057 'o', ' ', 'w', 'o',
10058 'r', 'l', 'd', '!',
10059 };
10060 // clang-format on
10061
10062 unsigned char* p = packet;
10063 if (framer_.transport_version() == QUIC_VERSION_99) {
10064 p = packet99;
10065 } else if (framer_.transport_version() > QUIC_VERSION_44) {
10066 p = packet46;
10067 } else if (framer_.transport_version() > QUIC_VERSION_43) {
10068 p = packet44;
10069 }
10070 QuicFramerFuzzFunc(p,
10071 framer_.transport_version() > QUIC_VERSION_43
10072 ? QUIC_ARRAYSIZE(packet44)
10073 : QUIC_ARRAYSIZE(packet),
10074 framer_.version());
10075}
10076
QUICHE teama6ef0a62019-03-07 20:34:33 -050010077TEST_P(QuicFramerTest, IetfBlockedFrame) {
10078 // This test only for version 99.
10079 if (framer_.transport_version() != QUIC_VERSION_99) {
10080 return;
10081 }
zhongyi546cc452019-04-12 15:27:49 -070010082 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010083
10084 // clang-format off
10085 PacketFragments packet99 = {
10086 // type (short header, 4 byte packet number)
10087 {"",
10088 {0x43}},
10089 // connection_id
10090 {"",
10091 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10092 // packet number
10093 {"",
10094 {0x12, 0x34, 0x9A, 0xBC}},
10095 // frame type (IETF_BLOCKED)
10096 {"",
10097 {0x14}},
10098 // blocked offset
10099 {"Can not read blocked offset.",
10100 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
10101 };
10102 // clang-format on
10103
10104 std::unique_ptr<QuicEncryptedPacket> encrypted(
10105 AssemblePacketFromFragments(packet99));
10106 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10107
10108 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10109 ASSERT_TRUE(visitor_.header_.get());
10110 EXPECT_TRUE(CheckDecryption(
10111 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10112 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10113
10114 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
10115
10116 CheckFramingBoundaries(packet99, QUIC_INVALID_BLOCKED_DATA);
10117}
10118
10119TEST_P(QuicFramerTest, BuildIetfBlockedPacket) {
10120 // This test only for version 99.
10121 if (framer_.transport_version() != QUIC_VERSION_99) {
10122 return;
10123 }
10124
10125 QuicPacketHeader header;
10126 header.destination_connection_id = FramerTestConnectionId();
10127 header.reset_flag = false;
10128 header.version_flag = false;
10129 header.packet_number = kPacketNumber;
10130
10131 QuicBlockedFrame frame;
10132 frame.stream_id = QuicUtils::GetInvalidStreamId(framer_.transport_version());
10133 frame.offset = kStreamOffset;
10134 QuicFrames frames = {QuicFrame(&frame)};
10135
10136 // clang-format off
10137 unsigned char packet99[] = {
10138 // type (short header, 4 byte packet number)
10139 0x43,
10140 // connection_id
10141 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10142 // packet number
10143 0x12, 0x34, 0x56, 0x78,
10144
10145 // frame type (IETF_BLOCKED)
10146 0x14,
10147 // Offset
10148 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
10149 };
10150 // clang-format on
10151
10152 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10153 ASSERT_TRUE(data != nullptr);
10154
10155 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10156 data->length(), AsChars(packet99),
10157 QUIC_ARRAYSIZE(packet99));
10158}
10159
10160TEST_P(QuicFramerTest, IetfStreamBlockedFrame) {
10161 // This test only for version 99.
10162 if (framer_.transport_version() != QUIC_VERSION_99) {
10163 return;
10164 }
zhongyi546cc452019-04-12 15:27:49 -070010165 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010166
10167 // clang-format off
10168 PacketFragments packet99 = {
10169 // type (short header, 4 byte packet number)
10170 {"",
10171 {0x43}},
10172 // connection_id
10173 {"",
10174 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10175 // packet number
10176 {"",
10177 {0x12, 0x34, 0x9A, 0xBC}},
10178 // frame type (IETF_STREAM_BLOCKED)
10179 {"",
10180 {0x15}},
10181 // blocked offset
10182 {"Can not read stream blocked stream id.",
10183 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
10184 {"Can not read stream blocked offset.",
10185 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
10186 };
10187 // clang-format on
10188
10189 std::unique_ptr<QuicEncryptedPacket> encrypted(
10190 AssemblePacketFromFragments(packet99));
10191 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10192
10193 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10194 ASSERT_TRUE(visitor_.header_.get());
10195 EXPECT_TRUE(CheckDecryption(
10196 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10197 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10198
10199 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
10200 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
10201
10202 CheckFramingBoundaries(packet99, QUIC_INVALID_STREAM_BLOCKED_DATA);
10203}
10204
10205TEST_P(QuicFramerTest, BuildIetfStreamBlockedPacket) {
10206 // This test only for version 99.
10207 if (framer_.transport_version() != QUIC_VERSION_99) {
10208 return;
10209 }
10210
10211 QuicPacketHeader header;
10212 header.destination_connection_id = FramerTestConnectionId();
10213 header.reset_flag = false;
10214 header.version_flag = false;
10215 header.packet_number = kPacketNumber;
10216
10217 QuicBlockedFrame frame;
10218 frame.stream_id = kStreamId;
10219 frame.offset = kStreamOffset;
10220 QuicFrames frames = {QuicFrame(&frame)};
10221
10222 // clang-format off
10223 unsigned char packet99[] = {
10224 // type (short header, 4 byte packet number)
10225 0x43,
10226 // connection_id
10227 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10228 // packet number
10229 0x12, 0x34, 0x56, 0x78,
10230
10231 // frame type (IETF_STREAM_BLOCKED)
10232 0x15,
10233 // Stream ID
10234 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
10235 // Offset
10236 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
10237 };
10238 // clang-format on
10239
10240 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10241 ASSERT_TRUE(data != nullptr);
10242
10243 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10244 data->length(), AsChars(packet99),
10245 QUIC_ARRAYSIZE(packet99));
10246}
10247
fkastenholz3c4eabf2019-04-22 07:49:59 -070010248TEST_P(QuicFramerTest, BiDiMaxStreamsFrame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010249 // This test only for version 99.
10250 if (framer_.transport_version() != QUIC_VERSION_99) {
10251 return;
10252 }
zhongyi546cc452019-04-12 15:27:49 -070010253 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010254
10255 // clang-format off
10256 PacketFragments packet99 = {
10257 // type (short header, 4 byte packet number)
10258 {"",
10259 {0x43}},
10260 // connection_id
10261 {"",
10262 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10263 // packet number
10264 {"",
10265 {0x12, 0x34, 0x9A, 0xBC}},
10266 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
10267 {"",
10268 {0x12}},
10269 // max. streams
10270 {"Can not read MAX_STREAMS stream count.",
10271 {kVarInt62OneByte + 0x03}},
10272 };
10273 // clang-format on
10274
10275 std::unique_ptr<QuicEncryptedPacket> encrypted(
10276 AssemblePacketFromFragments(packet99));
10277 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10278
10279 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10280 ASSERT_TRUE(visitor_.header_.get());
10281 EXPECT_TRUE(CheckDecryption(
10282 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10283 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10284
fkastenholz3c4eabf2019-04-22 07:49:59 -070010285 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
10286 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
10287 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010288}
10289
fkastenholz3c4eabf2019-04-22 07:49:59 -070010290TEST_P(QuicFramerTest, UniDiMaxStreamsFrame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010291 // This test only for version 99.
10292 if (framer_.transport_version() != QUIC_VERSION_99) {
10293 return;
10294 }
zhongyi546cc452019-04-12 15:27:49 -070010295 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010296
10297 // clang-format off
10298 PacketFragments packet99 = {
10299 // type (short header, 4 byte packet number)
10300 {"",
10301 {0x43}},
10302 // Test runs in client mode, no connection id
10303 // packet number
10304 {"",
10305 {0x12, 0x34, 0x9A, 0xBC}},
fkastenholz3c4eabf2019-04-22 07:49:59 -070010306 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
QUICHE teama6ef0a62019-03-07 20:34:33 -050010307 {"",
fkastenholz3c4eabf2019-04-22 07:49:59 -070010308 {0x13}},
QUICHE teama6ef0a62019-03-07 20:34:33 -050010309 // max. streams
10310 {"Can not read MAX_STREAMS stream count.",
10311 {kVarInt62OneByte + 0x03}},
10312 };
10313 // clang-format on
10314
10315 std::unique_ptr<QuicEncryptedPacket> encrypted(
10316 AssemblePacketFromFragments(packet99));
10317 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10318 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10319
10320 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10321 ASSERT_TRUE(visitor_.header_.get());
10322 EXPECT_TRUE(CheckDecryption(
10323 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10324 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10325
fkastenholz3c4eabf2019-04-22 07:49:59 -070010326 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
10327 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
10328 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010329}
10330
10331TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrame) {
10332 // This test only for version 99.
10333 if (framer_.transport_version() != QUIC_VERSION_99) {
10334 return;
10335 }
zhongyi546cc452019-04-12 15:27:49 -070010336 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010337
10338 // clang-format off
10339 PacketFragments packet99 = {
10340 // type (short header, 4 byte packet number)
10341 {"",
10342 {0x43}},
10343 // connection_id
10344 {"",
10345 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10346 // packet number
10347 {"",
10348 {0x12, 0x34, 0x9A, 0xBC}},
10349 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
10350 {"",
10351 {0x13}},
10352 // max. streams
10353 {"Can not read MAX_STREAMS stream count.",
10354 {kVarInt62OneByte + 0x03}},
10355 };
10356 // clang-format on
10357
10358 std::unique_ptr<QuicEncryptedPacket> encrypted(
10359 AssemblePacketFromFragments(packet99));
10360 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10361
10362 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10363 ASSERT_TRUE(visitor_.header_.get());
10364 EXPECT_TRUE(CheckDecryption(
10365 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10366 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10367
fkastenholz3c4eabf2019-04-22 07:49:59 -070010368 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
10369 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
10370 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010371}
10372
10373TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrame) {
10374 // This test only for version 99.
10375 if (framer_.transport_version() != QUIC_VERSION_99) {
10376 return;
10377 }
zhongyi546cc452019-04-12 15:27:49 -070010378 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010379
10380 // clang-format off
10381 PacketFragments packet99 = {
10382 // type (short header, 4 byte packet number)
10383 {"",
10384 {0x43}},
10385 // Test runs in client mode, no connection id
10386 // packet number
10387 {"",
10388 {0x12, 0x34, 0x9A, 0xBC}},
10389 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
10390 {"",
10391 {0x13}},
10392 // max. streams
10393 {"Can not read MAX_STREAMS stream count.",
10394 {kVarInt62OneByte + 0x03}},
10395 };
10396 // clang-format on
10397
10398 std::unique_ptr<QuicEncryptedPacket> encrypted(
10399 AssemblePacketFromFragments(packet99));
10400 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10401 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10402
10403 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10404 ASSERT_TRUE(visitor_.header_.get());
10405 EXPECT_TRUE(CheckDecryption(
10406 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10407 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10408
fkastenholz3c4eabf2019-04-22 07:49:59 -070010409 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
10410 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
10411 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010412}
10413
10414// The following four tests ensure that the framer can deserialize a stream
10415// count that is large enough to cause the resulting stream ID to exceed the
10416// current implementation limit(32 bits). The intent is that when this happens,
10417// the stream limit is pegged to the maximum supported value. There are four
10418// tests, for the four combinations of uni- and bi-directional, server- and
10419// client- initiated.
fkastenholz3c4eabf2019-04-22 07:49:59 -070010420TEST_P(QuicFramerTest, BiDiMaxStreamsFrameTooBig) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010421 // This test only for version 99.
10422 if (framer_.transport_version() != QUIC_VERSION_99) {
10423 return;
10424 }
zhongyi546cc452019-04-12 15:27:49 -070010425 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010426
10427 // clang-format off
10428 unsigned char packet99[] = {
10429 // type (short header, 4 byte packet number)
10430 0x43,
10431 // connection_id
10432 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10433 // packet number
10434 0x12, 0x34, 0x9A, 0xBC,
10435 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
10436 0x12,
10437
10438 // max. streams. Max stream ID allowed is 0xffffffff
10439 // This encodes a count of 0x40000000, leading to stream
10440 // IDs in the range 0x1 00000000 to 0x1 00000003.
10441 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
10442 };
10443 // clang-format on
10444
10445 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
10446 false);
10447 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
10448 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10449 ASSERT_TRUE(visitor_.header_.get());
10450 EXPECT_TRUE(CheckDecryption(
10451 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10452 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10453
fkastenholz465220f2019-04-23 07:56:27 -070010454 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -070010455 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010456}
10457
10458TEST_P(QuicFramerTest, ClientBiDiMaxStreamsFrameTooBig) {
10459 // This test only for version 99.
10460 if (framer_.transport_version() != QUIC_VERSION_99) {
10461 return;
10462 }
zhongyi546cc452019-04-12 15:27:49 -070010463 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010464
10465 // clang-format off
10466 unsigned char packet99[] = {
10467 // type (short header, 4 byte packet number)
10468 0x43,
10469 // Test runs in client mode, no connection id
10470 // packet number
10471 0x12, 0x34, 0x9A, 0xBC,
10472 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
10473 0x12,
10474
10475 // max. streams. Max stream ID allowed is 0xffffffff
10476 // This encodes a count of 0x40000000, leading to stream
10477 // IDs in the range 0x1 00000000 to 0x1 00000003.
10478 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
10479 };
10480 // clang-format on
10481
10482 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
10483 false);
10484 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10485 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
10486
10487 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10488 ASSERT_TRUE(visitor_.header_.get());
10489 EXPECT_TRUE(CheckDecryption(
10490 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10491 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10492
fkastenholz465220f2019-04-23 07:56:27 -070010493 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -070010494 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010495}
10496
10497TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrameTooBig) {
10498 // This test only for version 99.
10499 if (framer_.transport_version() != QUIC_VERSION_99) {
10500 return;
10501 }
zhongyi546cc452019-04-12 15:27:49 -070010502 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010503
10504 // clang-format off
10505 unsigned char packet99[] = {
10506 // type (short header, 4 byte packet number)
10507 0x43,
10508 // connection_id
10509 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10510 // packet number
10511 0x12, 0x34, 0x9A, 0xBC,
10512 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
10513 0x13,
10514
10515 // max. streams. Max stream ID allowed is 0xffffffff
10516 // This encodes a count of 0x40000000, leading to stream
10517 // IDs in the range 0x1 00000000 to 0x1 00000003.
10518 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
10519 };
10520 // clang-format on
10521
10522 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
10523 false);
10524 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
10525
10526 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10527 ASSERT_TRUE(visitor_.header_.get());
10528 EXPECT_TRUE(CheckDecryption(
10529 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10530 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10531
fkastenholz465220f2019-04-23 07:56:27 -070010532 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -070010533 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010534}
10535
10536TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrameTooBig) {
10537 // This test only for version 99.
10538 if (framer_.transport_version() != QUIC_VERSION_99) {
10539 return;
10540 }
zhongyi546cc452019-04-12 15:27:49 -070010541 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010542
10543 // clang-format off
10544 unsigned char packet99[] = {
10545 // type (short header, 4 byte packet number)
10546 0x43,
10547 // Test runs in client mode, no connection id
10548 // packet number
10549 0x12, 0x34, 0x9A, 0xBC,
10550 // frame type (IETF_MAX_STREAMS_UNDIRECTIONAL)
10551 0x13,
10552
10553 // max. streams. Max stream ID allowed is 0xffffffff
10554 // This encodes a count of 0x40000000, leading to stream
10555 // IDs in the range 0x1 00000000 to 0x1 00000003.
10556 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
10557 };
10558 // clang-format on
10559
10560 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
10561 false);
10562 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10563 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
10564
10565 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10566 ASSERT_TRUE(visitor_.header_.get());
10567 EXPECT_TRUE(CheckDecryption(
10568 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10569 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10570
fkastenholz465220f2019-04-23 07:56:27 -070010571 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -070010572 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010573}
10574
fkastenholz3c4eabf2019-04-22 07:49:59 -070010575// Specifically test that count==0 is accepted.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010576TEST_P(QuicFramerTest, MaxStreamsFrameZeroCount) {
10577 // This test only for version 99.
10578 if (framer_.transport_version() != QUIC_VERSION_99) {
10579 return;
10580 }
zhongyi546cc452019-04-12 15:27:49 -070010581 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010582
10583 // clang-format off
10584 unsigned char packet99[] = {
10585 // type (short header, 4 byte packet number)
10586 0x43,
10587 // connection_id
10588 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10589 // packet number
10590 0x12, 0x34, 0x9A, 0xBC,
10591 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
10592 0x12,
10593 // max. streams == 0.
10594 kVarInt62OneByte + 0x00
10595 };
10596 // clang-format on
10597
10598 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
10599 false);
fkastenholz3c4eabf2019-04-22 07:49:59 -070010600 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010601}
10602
10603TEST_P(QuicFramerTest, ServerBiDiStreamsBlockedFrame) {
10604 // This test only for version 99.
10605 if (framer_.transport_version() != QUIC_VERSION_99) {
10606 return;
10607 }
zhongyi546cc452019-04-12 15:27:49 -070010608 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010609
10610 // clang-format off
10611 PacketFragments packet99 = {
10612 // type (short header, 4 byte packet number)
10613 {"",
10614 {0x43}},
10615 // connection_id
10616 {"",
10617 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10618 // packet number
10619 {"",
10620 {0x12, 0x34, 0x9A, 0xBC}},
fkastenholz3c4eabf2019-04-22 07:49:59 -070010621 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
10622 {"",
10623 {0x13}},
10624 // stream count
10625 {"Can not read MAX_STREAMS stream count.",
10626 {kVarInt62OneByte + 0x00}},
10627 };
10628 // clang-format on
10629
10630 std::unique_ptr<QuicEncryptedPacket> encrypted(
10631 AssemblePacketFromFragments(packet99));
10632 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10633
10634 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10635 ASSERT_TRUE(visitor_.header_.get());
10636 EXPECT_TRUE(CheckDecryption(
10637 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10638 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10639
10640 EXPECT_EQ(0u, visitor_.max_streams_frame_.stream_count);
10641 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
10642
10643 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
10644}
10645
10646TEST_P(QuicFramerTest, BiDiStreamsBlockedFrame) {
10647 // This test only for version 99.
10648 if (framer_.transport_version() != QUIC_VERSION_99) {
10649 return;
10650 }
10651 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10652
10653 // clang-format off
10654 PacketFragments packet99 = {
10655 // type (short header, 4 byte packet number)
10656 {"",
10657 {0x43}},
10658 // connection_id
10659 {"",
10660 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10661 // packet number
10662 {"",
10663 {0x12, 0x34, 0x9A, 0xBC}},
QUICHE teama6ef0a62019-03-07 20:34:33 -050010664 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
10665 {"",
10666 {0x16}},
10667 // stream id
fkastenholz3c4eabf2019-04-22 07:49:59 -070010668 {"Can not read STREAMS_BLOCKED stream count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010669 {kVarInt62OneByte + 0x03}},
10670 };
10671 // clang-format on
10672
10673 std::unique_ptr<QuicEncryptedPacket> encrypted(
10674 AssemblePacketFromFragments(packet99));
10675 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10676
10677 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10678 ASSERT_TRUE(visitor_.header_.get());
10679 EXPECT_TRUE(CheckDecryption(
10680 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10681 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10682
fkastenholz3c4eabf2019-04-22 07:49:59 -070010683 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
10684 EXPECT_FALSE(visitor_.streams_blocked_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010685
fkastenholz3c4eabf2019-04-22 07:49:59 -070010686 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010687}
10688
fkastenholz3c4eabf2019-04-22 07:49:59 -070010689TEST_P(QuicFramerTest, UniDiStreamsBlockedFrame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010690 // This test only for version 99.
10691 if (framer_.transport_version() != QUIC_VERSION_99) {
10692 return;
10693 }
zhongyi546cc452019-04-12 15:27:49 -070010694 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010695
10696 // clang-format off
10697 PacketFragments packet99 = {
10698 // type (short header, 4 byte packet number)
10699 {"",
10700 {0x43}},
10701 // connection_id
10702 {"",
10703 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10704 // packet number
10705 {"",
10706 {0x12, 0x34, 0x9A, 0xBC}},
10707 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10708 {"",
10709 {0x17}},
10710 // stream id
fkastenholz3c4eabf2019-04-22 07:49:59 -070010711 {"Can not read STREAMS_BLOCKED stream count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010712 {kVarInt62OneByte + 0x03}},
10713 };
10714 // clang-format on
10715
10716 std::unique_ptr<QuicEncryptedPacket> encrypted(
10717 AssemblePacketFromFragments(packet99));
10718 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10719
10720 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10721 ASSERT_TRUE(visitor_.header_.get());
10722 EXPECT_TRUE(CheckDecryption(
10723 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10724 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10725
fkastenholz3c4eabf2019-04-22 07:49:59 -070010726 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
10727 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
10728 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010729}
10730
10731TEST_P(QuicFramerTest, ClientUniDiStreamsBlockedFrame) {
10732 // This test only for version 99.
10733 if (framer_.transport_version() != QUIC_VERSION_99) {
10734 return;
10735 }
zhongyi546cc452019-04-12 15:27:49 -070010736 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010737
10738 // clang-format off
10739 PacketFragments packet99 = {
10740 // type (short header, 4 byte packet number)
10741 {"",
10742 {0x43}},
10743 // Test runs in client mode, no connection id
10744 // packet number
10745 {"",
10746 {0x12, 0x34, 0x9A, 0xBC}},
10747 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10748 {"",
10749 {0x17}},
10750 // stream id
fkastenholz3c4eabf2019-04-22 07:49:59 -070010751 {"Can not read STREAMS_BLOCKED stream count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010752 {kVarInt62OneByte + 0x03}},
10753 };
10754 // clang-format on
10755
10756 std::unique_ptr<QuicEncryptedPacket> encrypted(
10757 AssemblePacketFromFragments(packet99));
10758 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10759 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10760
10761 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10762 ASSERT_TRUE(visitor_.header_.get());
10763 EXPECT_TRUE(CheckDecryption(
10764 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10765 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10766
fkastenholz3c4eabf2019-04-22 07:49:59 -070010767 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
10768 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
10769 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010770}
10771
10772// Check that when we get a STREAMS_BLOCKED frame that specifies too large
10773// a stream count, we reject with an appropriate error. There is no need to
10774// check for different combinations of Uni/Bi directional and client/server
10775// initiated; the logic does not take these into account.
10776TEST_P(QuicFramerTest, StreamsBlockedFrameTooBig) {
10777 // This test only for version 99.
10778 if (framer_.transport_version() != QUIC_VERSION_99) {
10779 return;
10780 }
zhongyi546cc452019-04-12 15:27:49 -070010781 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010782
10783 // clang-format off
10784 unsigned char packet99[] = {
10785 // type (short header, 4 byte packet number)
10786 0x43,
10787 // Test runs in client mode, no connection id
10788 // packet number
10789 0x12, 0x34, 0x9A, 0xBC,
10790 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL)
fkastenholz3c4eabf2019-04-22 07:49:59 -070010791 0x16,
QUICHE teama6ef0a62019-03-07 20:34:33 -050010792
10793 // max. streams. Max stream ID allowed is 0xffffffff
10794 // This encodes a count of 0x40000000, leading to stream
10795 // IDs in the range 0x1 00000000 to 0x1 00000003.
10796 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01
10797 };
10798 // clang-format on
10799
10800 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
10801 false);
10802 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10803 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
10804
fkastenholz3c4eabf2019-04-22 07:49:59 -070010805 EXPECT_EQ(QUIC_STREAMS_BLOCKED_DATA, framer_.error());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010806 EXPECT_EQ(framer_.detailed_error(),
10807 "STREAMS_BLOCKED stream count exceeds implementation limit.");
10808}
10809
fkastenholz3c4eabf2019-04-22 07:49:59 -070010810// Specifically test that count==0 is accepted.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010811TEST_P(QuicFramerTest, StreamsBlockedFrameZeroCount) {
10812 // This test only for version 99.
10813 if (framer_.transport_version() != QUIC_VERSION_99) {
10814 return;
10815 }
fkastenholz3c4eabf2019-04-22 07:49:59 -070010816
zhongyi546cc452019-04-12 15:27:49 -070010817 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010818
10819 // clang-format off
fkastenholz3c4eabf2019-04-22 07:49:59 -070010820 PacketFragments packet99 = {
10821 // type (short header, 4 byte packet number)
10822 {"",
10823 {0x43}},
10824 // connection_id
10825 {"",
10826 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10827 // packet number
10828 {"",
10829 {0x12, 0x34, 0x9A, 0xBC}},
10830 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10831 {"",
10832 {0x17}},
10833 // stream id
10834 {"Can not read STREAMS_BLOCKED stream count.",
10835 {kVarInt62OneByte + 0x00}},
QUICHE teama6ef0a62019-03-07 20:34:33 -050010836 };
10837 // clang-format on
10838
fkastenholz3c4eabf2019-04-22 07:49:59 -070010839 std::unique_ptr<QuicEncryptedPacket> encrypted(
10840 AssemblePacketFromFragments(packet99));
10841 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010842
fkastenholz3c4eabf2019-04-22 07:49:59 -070010843 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10844 ASSERT_TRUE(visitor_.header_.get());
10845 EXPECT_TRUE(CheckDecryption(
10846 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10847 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10848
10849 EXPECT_EQ(0u, visitor_.streams_blocked_frame_.stream_count);
10850 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
10851
10852 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010853}
10854
fkastenholz3c4eabf2019-04-22 07:49:59 -070010855TEST_P(QuicFramerTest, BuildBiDiStreamsBlockedPacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010856 // This test only for version 99.
10857 if (framer_.transport_version() != QUIC_VERSION_99) {
10858 return;
10859 }
10860
10861 QuicPacketHeader header;
10862 header.destination_connection_id = FramerTestConnectionId();
10863 header.reset_flag = false;
10864 header.version_flag = false;
10865 header.packet_number = kPacketNumber;
10866
fkastenholz3c4eabf2019-04-22 07:49:59 -070010867 QuicStreamsBlockedFrame frame;
10868 frame.stream_count = 3;
10869 frame.unidirectional = false;
QUICHE teama6ef0a62019-03-07 20:34:33 -050010870
10871 QuicFrames frames = {QuicFrame(frame)};
10872
10873 // clang-format off
10874 unsigned char packet99[] = {
10875 // type (short header, 4 byte packet number)
10876 0x43,
10877 // connection_id
10878 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10879 // packet number
10880 0x12, 0x34, 0x56, 0x78,
10881
10882 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
10883 0x16,
10884 // Stream count
10885 kVarInt62OneByte + 0x03
10886 };
10887 // clang-format on
10888
10889 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10890 ASSERT_TRUE(data != nullptr);
10891
10892 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10893 data->length(), AsChars(packet99),
10894 QUIC_ARRAYSIZE(packet99));
10895}
10896
fkastenholz3c4eabf2019-04-22 07:49:59 -070010897TEST_P(QuicFramerTest, BuildUniStreamsBlockedPacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010898 // This test only for version 99.
10899 if (framer_.transport_version() != QUIC_VERSION_99) {
10900 return;
10901 }
10902
10903 QuicPacketHeader header;
10904 header.destination_connection_id = FramerTestConnectionId();
10905 header.reset_flag = false;
10906 header.version_flag = false;
10907 header.packet_number = kPacketNumber;
10908
fkastenholz3c4eabf2019-04-22 07:49:59 -070010909 QuicStreamsBlockedFrame frame;
10910 frame.stream_count = 3;
10911 frame.unidirectional = true;
10912
QUICHE teama6ef0a62019-03-07 20:34:33 -050010913 QuicFrames frames = {QuicFrame(frame)};
10914
10915 // clang-format off
10916 unsigned char packet99[] = {
10917 // type (short header, 4 byte packet number)
10918 0x43,
10919 // connection_id
10920 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10921 // packet number
10922 0x12, 0x34, 0x56, 0x78,
10923
10924 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10925 0x17,
10926 // Stream count
10927 kVarInt62OneByte + 0x03
10928 };
10929 // clang-format on
10930
10931 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10932 ASSERT_TRUE(data != nullptr);
10933
10934 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10935 data->length(), AsChars(packet99),
10936 QUIC_ARRAYSIZE(packet99));
10937}
10938
fkastenholz3c4eabf2019-04-22 07:49:59 -070010939TEST_P(QuicFramerTest, BuildBiDiMaxStreamsPacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010940 // This test only for version 99.
10941 if (framer_.transport_version() != QUIC_VERSION_99) {
10942 return;
10943 }
10944
10945 QuicPacketHeader header;
10946 header.destination_connection_id = FramerTestConnectionId();
10947 header.reset_flag = false;
10948 header.version_flag = false;
10949 header.packet_number = kPacketNumber;
10950
fkastenholz3c4eabf2019-04-22 07:49:59 -070010951 QuicMaxStreamsFrame frame;
10952 frame.stream_count = 3;
10953 frame.unidirectional = false;
10954
QUICHE teama6ef0a62019-03-07 20:34:33 -050010955 QuicFrames frames = {QuicFrame(frame)};
10956
10957 // clang-format off
10958 unsigned char packet99[] = {
10959 // type (short header, 4 byte packet number)
10960 0x43,
10961 // connection_id
10962 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10963 // packet number
10964 0x12, 0x34, 0x56, 0x78,
10965
10966 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL frame)
10967 0x12,
10968 // Stream count
10969 kVarInt62OneByte + 0x03
10970 };
10971 // clang-format on
10972
10973 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10974 ASSERT_TRUE(data != nullptr);
10975
10976 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10977 data->length(), AsChars(packet99),
10978 QUIC_ARRAYSIZE(packet99));
10979}
10980
fkastenholz3c4eabf2019-04-22 07:49:59 -070010981TEST_P(QuicFramerTest, BuildUniDiMaxStreamsPacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010982 // This test only for version 99.
10983 if (framer_.transport_version() != QUIC_VERSION_99) {
10984 return;
10985 }
10986
10987 // This test runs in client mode.
10988 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10989
10990 QuicPacketHeader header;
10991 header.destination_connection_id = FramerTestConnectionId();
10992 header.reset_flag = false;
10993 header.version_flag = false;
10994 header.packet_number = kPacketNumber;
10995
fkastenholz3c4eabf2019-04-22 07:49:59 -070010996 QuicMaxStreamsFrame frame;
10997 frame.stream_count = 3;
10998 frame.unidirectional = true;
QUICHE teama6ef0a62019-03-07 20:34:33 -050010999
QUICHE teama6ef0a62019-03-07 20:34:33 -050011000 QuicFrames frames = {QuicFrame(frame)};
11001
11002 // clang-format off
11003 unsigned char packet99[] = {
11004 // type (short header, 4 byte packet number)
11005 0x43,
11006 // connection_id
11007 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11008 // packet number
11009 0x12, 0x34, 0x56, 0x78,
11010
11011 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
11012 0x13,
11013 // Stream count
11014 kVarInt62OneByte + 0x03
11015 };
11016 // clang-format on
11017
11018 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11019 ASSERT_TRUE(data != nullptr);
11020
11021 test::CompareCharArraysWithHexError("constructed packet", data->data(),
11022 data->length(), AsChars(packet99),
11023 QUIC_ARRAYSIZE(packet99));
11024}
11025
11026TEST_P(QuicFramerTest, NewConnectionIdFrame) {
11027 if (framer_.transport_version() != QUIC_VERSION_99) {
11028 // This frame is only for version 99.
11029 return;
11030 }
zhongyi546cc452019-04-12 15:27:49 -070011031 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011032 // clang-format off
11033 PacketFragments packet99 = {
11034 // type (short header, 4 byte packet number)
11035 {"",
11036 {0x43}},
11037 // connection_id
11038 {"",
11039 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11040 // packet number
11041 {"",
11042 {0x12, 0x34, 0x56, 0x78}},
11043 // frame type (IETF_NEW_CONNECTION_ID frame)
11044 {"",
11045 {0x18}},
11046 // error code
11047 {"Unable to read new connection ID frame sequence number.",
11048 {kVarInt62OneByte + 0x11}},
11049 {"Unable to read new connection ID frame connection id length.",
11050 {0x08}}, // connection ID length
11051 {"Unable to read new connection ID frame connection id.",
11052 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11}},
11053 {"Can not read new connection ID frame reset token.",
11054 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
11055 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
11056 };
11057 // clang-format on
11058
11059 std::unique_ptr<QuicEncryptedPacket> encrypted(
11060 AssemblePacketFromFragments(packet99));
11061 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11062
11063 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
11064 ASSERT_TRUE(visitor_.header_.get());
11065 EXPECT_TRUE(CheckDecryption(
11066 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11067 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11068
11069 EXPECT_EQ(0u, visitor_.stream_frames_.size());
11070
11071 EXPECT_EQ(FramerTestConnectionIdPlusOne(),
11072 visitor_.new_connection_id_.connection_id);
11073 EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
11074 EXPECT_EQ(kTestStatelessResetToken,
11075 visitor_.new_connection_id_.stateless_reset_token);
11076
11077 ASSERT_EQ(0u, visitor_.ack_frames_.size());
11078
11079 CheckFramingBoundaries(packet99, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
11080}
11081
QUICHE team8e2e4532019-03-14 14:37:56 -070011082TEST_P(QuicFramerTest, NewConnectionIdFrameVariableLength) {
QUICHE team9b41c972019-03-21 11:22:48 -070011083 if (framer_.transport_version() != QUIC_VERSION_99) {
11084 // This frame is only for version 99.
QUICHE team8e2e4532019-03-14 14:37:56 -070011085 return;
11086 }
zhongyi546cc452019-04-12 15:27:49 -070011087 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE team8e2e4532019-03-14 14:37:56 -070011088 // clang-format off
11089 PacketFragments packet99 = {
11090 // type (short header, 4 byte packet number)
11091 {"",
11092 {0x43}},
11093 // connection_id
11094 {"",
11095 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11096 // packet number
11097 {"",
11098 {0x12, 0x34, 0x56, 0x78}},
11099 // frame type (IETF_NEW_CONNECTION_ID frame)
11100 {"",
11101 {0x18}},
11102 // error code
11103 {"Unable to read new connection ID frame sequence number.",
11104 {kVarInt62OneByte + 0x11}},
11105 {"Unable to read new connection ID frame connection id length.",
11106 {0x09}}, // connection ID length
11107 {"Unable to read new connection ID frame connection id.",
11108 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
11109 {"Can not read new connection ID frame reset token.",
11110 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
11111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
11112 };
11113 // clang-format on
11114
11115 std::unique_ptr<QuicEncryptedPacket> encrypted(
11116 AssemblePacketFromFragments(packet99));
11117 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11118
11119 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
11120 ASSERT_TRUE(visitor_.header_.get());
11121 EXPECT_TRUE(CheckDecryption(
11122 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11123 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11124
11125 EXPECT_EQ(0u, visitor_.stream_frames_.size());
11126
11127 EXPECT_EQ(FramerTestConnectionIdNineBytes(),
11128 visitor_.new_connection_id_.connection_id);
11129 EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
11130 EXPECT_EQ(kTestStatelessResetToken,
11131 visitor_.new_connection_id_.stateless_reset_token);
11132
11133 ASSERT_EQ(0u, visitor_.ack_frames_.size());
11134
11135 CheckFramingBoundaries(packet99, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
11136}
11137
QUICHE team0131a5b2019-03-20 15:23:27 -070011138// Verifies that parsing a NEW_CONNECTION_ID frame with a length above the
11139// specified maximum fails.
11140TEST_P(QuicFramerTest, InvalidLongNewConnectionIdFrame) {
11141 if (framer_.transport_version() != QUIC_VERSION_99) {
11142 // The NEW_CONNECTION_ID frame is only for version 99.
11143 return;
11144 }
zhongyi546cc452019-04-12 15:27:49 -070011145 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE team0131a5b2019-03-20 15:23:27 -070011146 // clang-format off
11147 PacketFragments packet99 = {
11148 // type (short header, 4 byte packet number)
11149 {"",
11150 {0x43}},
11151 // connection_id
11152 {"",
11153 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11154 // packet number
11155 {"",
11156 {0x12, 0x34, 0x56, 0x78}},
11157 // frame type (IETF_NEW_CONNECTION_ID frame)
11158 {"",
11159 {0x18}},
11160 // error code
11161 {"Unable to read new connection ID frame sequence number.",
11162 {kVarInt62OneByte + 0x11}},
11163 {"Unable to read new connection ID frame connection id length.",
11164 {0x13}}, // connection ID length
11165 {"Unable to read new connection ID frame connection id.",
11166 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11167 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
11168 0x42, 0x33, 0x42}},
11169 {"Can not read new connection ID frame reset token.",
11170 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
11171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
11172 };
11173 // clang-format on
11174
11175 std::unique_ptr<QuicEncryptedPacket> encrypted(
11176 AssemblePacketFromFragments(packet99));
11177 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11178 EXPECT_EQ(QUIC_INVALID_NEW_CONNECTION_ID_DATA, framer_.error());
11179 EXPECT_EQ("New connection ID length too high.", framer_.detailed_error());
11180}
11181
QUICHE teama6ef0a62019-03-07 20:34:33 -050011182TEST_P(QuicFramerTest, BuildNewConnectionIdFramePacket) {
11183 if (framer_.transport_version() != QUIC_VERSION_99) {
11184 // This frame is only for version 99.
11185 return;
11186 }
11187 QuicPacketHeader header;
11188 header.destination_connection_id = FramerTestConnectionId();
11189 header.reset_flag = false;
11190 header.version_flag = false;
11191 header.packet_number = kPacketNumber;
11192
11193 QuicNewConnectionIdFrame frame;
11194 frame.sequence_number = 0x11;
11195 // Use this value to force a 4-byte encoded variable length connection ID
11196 // in the frame.
11197 frame.connection_id = FramerTestConnectionIdPlusOne();
11198 frame.stateless_reset_token = kTestStatelessResetToken;
11199
11200 QuicFrames frames = {QuicFrame(&frame)};
11201
11202 // clang-format off
11203 unsigned char packet99[] = {
11204 // type (short header, 4 byte packet number)
11205 0x43,
11206 // connection_id
11207 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11208 // packet number
11209 0x12, 0x34, 0x56, 0x78,
11210
11211 // frame type (IETF_NEW_CONNECTION_ID frame)
11212 0x18,
11213 // sequence number
11214 kVarInt62OneByte + 0x11,
11215 // new connection id length
11216 0x08,
11217 // new connection id
11218 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
11219 // stateless reset token
11220 0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
11221 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11222 };
11223 // clang-format on
11224
11225 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11226 ASSERT_TRUE(data != nullptr);
11227
11228 test::CompareCharArraysWithHexError("constructed packet", data->data(),
11229 data->length(), AsChars(packet99),
11230 QUIC_ARRAYSIZE(packet99));
11231}
11232
11233TEST_P(QuicFramerTest, NewTokenFrame) {
11234 if (framer_.transport_version() != QUIC_VERSION_99) {
11235 // This frame is only for version 99.
11236 return;
11237 }
zhongyi546cc452019-04-12 15:27:49 -070011238 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011239 // clang-format off
11240 PacketFragments packet = {
11241 // type (short header, 4 byte packet number)
11242 {"",
11243 {0x43}},
11244 // connection_id
11245 {"",
11246 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11247 // packet number
11248 {"",
11249 {0x12, 0x34, 0x56, 0x78}},
11250 // frame type (IETF_NEW_TOKEN frame)
11251 {"",
11252 {0x07}},
11253 // Length
11254 {"Unable to read new token length.",
11255 {kVarInt62OneByte + 0x08}},
11256 {"Unable to read new token data.",
11257 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}}
11258 };
11259 // clang-format on
11260 uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
11261 0x04, 0x05, 0x06, 0x07};
11262
11263 std::unique_ptr<QuicEncryptedPacket> encrypted(
11264 AssemblePacketFromFragments(packet));
11265 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11266
11267 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
11268 ASSERT_TRUE(visitor_.header_.get());
11269 EXPECT_TRUE(CheckDecryption(
11270 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11271 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11272
11273 EXPECT_EQ(0u, visitor_.stream_frames_.size());
11274
11275 EXPECT_EQ(sizeof(expected_token_value), visitor_.new_token_.token.length());
11276 EXPECT_EQ(0, memcmp(expected_token_value, visitor_.new_token_.token.data(),
11277 sizeof(expected_token_value)));
11278
11279 CheckFramingBoundaries(packet, QUIC_INVALID_NEW_TOKEN);
11280}
11281
11282TEST_P(QuicFramerTest, BuildNewTokenFramePacket) {
11283 if (framer_.transport_version() != QUIC_VERSION_99) {
11284 // This frame is only for version 99.
11285 return;
11286 }
11287 QuicPacketHeader header;
11288 header.destination_connection_id = FramerTestConnectionId();
11289 header.reset_flag = false;
11290 header.version_flag = false;
11291 header.packet_number = kPacketNumber;
11292
11293 uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
11294 0x04, 0x05, 0x06, 0x07};
11295
vasilvvc48c8712019-03-11 13:38:16 -070011296 QuicNewTokenFrame frame(0, std::string((const char*)(expected_token_value),
11297 sizeof(expected_token_value)));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011298
11299 QuicFrames frames = {QuicFrame(&frame)};
11300
11301 // clang-format off
11302 unsigned char packet[] = {
11303 // type (short header, 4 byte packet number)
11304 0x43,
11305 // connection_id
11306 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11307 // packet number
11308 0x12, 0x34, 0x56, 0x78,
11309
11310 // frame type (IETF_NEW_TOKEN frame)
11311 0x07,
11312 // Length and token
11313 kVarInt62OneByte + 0x08,
11314 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
11315 };
11316 // clang-format on
11317
11318 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11319 ASSERT_TRUE(data != nullptr);
11320
11321 test::CompareCharArraysWithHexError("constructed packet", data->data(),
11322 data->length(), AsChars(packet),
11323 QUIC_ARRAYSIZE(packet));
11324}
11325
11326TEST_P(QuicFramerTest, IetfStopSendingFrame) {
11327 // This test is only for version 99.
11328 if (framer_.transport_version() != QUIC_VERSION_99) {
11329 return;
11330 }
zhongyi546cc452019-04-12 15:27:49 -070011331 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011332
11333 // clang-format off
11334 PacketFragments packet99 = {
11335 // type (short header, 4 byte packet number)
11336 {"",
11337 {0x43}},
11338 // connection_id
11339 {"",
11340 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11341 // packet number
11342 {"",
11343 {0x12, 0x34, 0x9A, 0xBC}},
11344 // frame type (IETF_STOP_SENDING frame)
11345 {"",
11346 {0x05}},
11347 // stream id
11348 {"Unable to read stop sending stream id.",
11349 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
11350 {"Unable to read stop sending application error code.",
11351 {0x76, 0x54}},
11352 };
11353 // clang-format on
11354
11355 std::unique_ptr<QuicEncryptedPacket> encrypted(
11356 AssemblePacketFromFragments(packet99));
11357 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11358
11359 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
11360 ASSERT_TRUE(visitor_.header_.get());
11361 EXPECT_TRUE(CheckDecryption(
11362 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11363 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11364
11365 EXPECT_EQ(kStreamId, visitor_.stop_sending_frame_.stream_id);
11366 EXPECT_EQ(0x7654, visitor_.stop_sending_frame_.application_error_code);
11367
11368 CheckFramingBoundaries(packet99, QUIC_INVALID_STOP_SENDING_FRAME_DATA);
11369}
11370
11371TEST_P(QuicFramerTest, BuildIetfStopSendingPacket) {
11372 // This test is only for version 99.
11373 if (framer_.transport_version() != QUIC_VERSION_99) {
11374 return;
11375 }
11376
11377 QuicPacketHeader header;
11378 header.destination_connection_id = FramerTestConnectionId();
11379 header.reset_flag = false;
11380 header.version_flag = false;
11381 header.packet_number = kPacketNumber;
11382
11383 QuicStopSendingFrame frame;
11384 frame.stream_id = kStreamId;
11385 frame.application_error_code = 0xffff;
11386 QuicFrames frames = {QuicFrame(&frame)};
11387
11388 // clang-format off
11389 unsigned char packet99[] = {
11390 // type (short header, 4 byte packet number)
11391 0x43,
11392 // connection_id
11393 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11394 // packet number
11395 0x12, 0x34, 0x56, 0x78,
11396
11397 // frame type (IETF_STOP_SENDING frame)
11398 0x05,
11399 // Stream ID
11400 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
11401 // Application error code
11402 0xff, 0xff
11403 };
11404 // clang-format on
11405
11406 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11407 ASSERT_TRUE(data != nullptr);
11408
11409 test::CompareCharArraysWithHexError("constructed packet", data->data(),
11410 data->length(), AsChars(packet99),
11411 QUIC_ARRAYSIZE(packet99));
11412}
11413
11414TEST_P(QuicFramerTest, IetfPathChallengeFrame) {
11415 // This test only for version 99.
11416 if (framer_.transport_version() != QUIC_VERSION_99) {
11417 return;
11418 }
zhongyi546cc452019-04-12 15:27:49 -070011419 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011420
11421 // clang-format off
11422 PacketFragments packet99 = {
11423 // type (short header, 4 byte packet number)
11424 {"",
11425 {0x43}},
11426 // connection_id
11427 {"",
11428 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11429 // packet number
11430 {"",
11431 {0x12, 0x34, 0x9A, 0xBC}},
11432 // frame type (IETF_PATH_CHALLENGE)
11433 {"",
11434 {0x1a}},
11435 // data
11436 {"Can not read path challenge data.",
11437 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
11438 };
11439 // clang-format on
11440
11441 std::unique_ptr<QuicEncryptedPacket> encrypted(
11442 AssemblePacketFromFragments(packet99));
11443 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11444
11445 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
11446 ASSERT_TRUE(visitor_.header_.get());
11447 EXPECT_TRUE(CheckDecryption(
11448 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11449 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11450
11451 EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
11452 visitor_.path_challenge_frame_.data_buffer);
11453
11454 CheckFramingBoundaries(packet99, QUIC_INVALID_PATH_CHALLENGE_DATA);
11455}
11456
11457TEST_P(QuicFramerTest, BuildIetfPathChallengePacket) {
11458 // This test only for version 99.
11459 if (framer_.transport_version() != QUIC_VERSION_99) {
11460 return;
11461 }
11462
11463 QuicPacketHeader header;
11464 header.destination_connection_id = FramerTestConnectionId();
11465 header.reset_flag = false;
11466 header.version_flag = false;
11467 header.packet_number = kPacketNumber;
11468
11469 QuicPathChallengeFrame frame;
11470 frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
11471 QuicFrames frames = {QuicFrame(&frame)};
11472
11473 // clang-format off
11474 unsigned char packet99[] = {
11475 // type (short header, 4 byte packet number)
11476 0x43,
11477 // connection_id
11478 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11479 // packet number
11480 0x12, 0x34, 0x56, 0x78,
11481
11482 // frame type (IETF_PATH_CHALLENGE)
11483 0x1a,
11484 // Data
11485 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
11486 };
11487 // clang-format on
11488
11489 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11490 ASSERT_TRUE(data != nullptr);
11491
11492 test::CompareCharArraysWithHexError("constructed packet", data->data(),
11493 data->length(), AsChars(packet99),
11494 QUIC_ARRAYSIZE(packet99));
11495}
11496
11497TEST_P(QuicFramerTest, IetfPathResponseFrame) {
11498 // This test only for version 99.
11499 if (framer_.transport_version() != QUIC_VERSION_99) {
11500 return;
11501 }
zhongyi546cc452019-04-12 15:27:49 -070011502 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011503
11504 // clang-format off
11505 PacketFragments packet99 = {
11506 // type (short header, 4 byte packet number)
11507 {"",
11508 {0x43}},
11509 // connection_id
11510 {"",
11511 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11512 // packet number
11513 {"",
11514 {0x12, 0x34, 0x9A, 0xBC}},
11515 // frame type (IETF_PATH_RESPONSE)
11516 {"",
11517 {0x1b}},
11518 // data
11519 {"Can not read path response data.",
11520 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
11521 };
11522 // clang-format on
11523
11524 std::unique_ptr<QuicEncryptedPacket> encrypted(
11525 AssemblePacketFromFragments(packet99));
11526 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11527
11528 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
11529 ASSERT_TRUE(visitor_.header_.get());
11530 EXPECT_TRUE(CheckDecryption(
11531 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11532 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11533
11534 EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
11535 visitor_.path_response_frame_.data_buffer);
11536
11537 CheckFramingBoundaries(packet99, QUIC_INVALID_PATH_RESPONSE_DATA);
11538}
11539
11540TEST_P(QuicFramerTest, BuildIetfPathResponsePacket) {
11541 // This test only for version 99.
11542 if (framer_.transport_version() != QUIC_VERSION_99) {
11543 return;
11544 }
11545
11546 QuicPacketHeader header;
11547 header.destination_connection_id = FramerTestConnectionId();
11548 header.reset_flag = false;
11549 header.version_flag = false;
11550 header.packet_number = kPacketNumber;
11551
11552 QuicPathResponseFrame frame;
11553 frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
11554 QuicFrames frames = {QuicFrame(&frame)};
11555
11556 // clang-format off
11557 unsigned char packet99[] = {
11558 // type (short header, 4 byte packet number)
11559 0x43,
11560 // connection_id
11561 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11562 // packet number
11563 0x12, 0x34, 0x56, 0x78,
11564
11565 // frame type (IETF_PATH_RESPONSE)
11566 0x1b,
11567 // Data
11568 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
11569 };
11570 // clang-format on
11571
11572 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11573 ASSERT_TRUE(data != nullptr);
11574
11575 test::CompareCharArraysWithHexError("constructed packet", data->data(),
11576 data->length(), AsChars(packet99),
11577 QUIC_ARRAYSIZE(packet99));
11578}
11579
11580TEST_P(QuicFramerTest, GetRetransmittableControlFrameSize) {
11581 QuicRstStreamFrame rst_stream(1, 3, QUIC_STREAM_CANCELLED, 1024);
11582 EXPECT_EQ(QuicFramer::GetRstStreamFrameSize(framer_.transport_version(),
11583 rst_stream),
11584 QuicFramer::GetRetransmittableControlFrameSize(
11585 framer_.transport_version(), QuicFrame(&rst_stream)));
11586
vasilvvc48c8712019-03-11 13:38:16 -070011587 std::string error_detail(2048, 'e');
QUICHE teama6ef0a62019-03-07 20:34:33 -050011588 QuicConnectionCloseFrame connection_close(QUIC_NETWORK_IDLE_TIMEOUT,
11589 error_detail);
fkastenholz72f509b2019-04-10 09:17:49 -070011590 if (framer_.transport_version() == QUIC_VERSION_99) {
11591 connection_close.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
11592 }
11593
fkastenholza037b8b2019-05-07 06:00:05 -070011594 EXPECT_EQ(QuicFramer::GetConnectionCloseFrameSize(framer_.transport_version(),
11595 connection_close),
QUICHE teama6ef0a62019-03-07 20:34:33 -050011596 QuicFramer::GetRetransmittableControlFrameSize(
11597 framer_.transport_version(), QuicFrame(&connection_close)));
11598
11599 QuicGoAwayFrame goaway(2, QUIC_PEER_GOING_AWAY, 3, error_detail);
11600 EXPECT_EQ(QuicFramer::GetMinGoAwayFrameSize() + 256,
11601 QuicFramer::GetRetransmittableControlFrameSize(
11602 framer_.transport_version(), QuicFrame(&goaway)));
11603
11604 QuicWindowUpdateFrame window_update(3, 3, 1024);
11605 EXPECT_EQ(QuicFramer::GetWindowUpdateFrameSize(framer_.transport_version(),
11606 window_update),
11607 QuicFramer::GetRetransmittableControlFrameSize(
11608 framer_.transport_version(), QuicFrame(&window_update)));
11609
11610 QuicBlockedFrame blocked(4, 3, 1024);
11611 EXPECT_EQ(
11612 QuicFramer::GetBlockedFrameSize(framer_.transport_version(), blocked),
11613 QuicFramer::GetRetransmittableControlFrameSize(
11614 framer_.transport_version(), QuicFrame(&blocked)));
11615
11616 if (framer_.transport_version() != QUIC_VERSION_99) {
11617 return;
11618 }
QUICHE teama6ef0a62019-03-07 20:34:33 -050011619
11620 QuicNewConnectionIdFrame new_connection_id(5, TestConnectionId(), 1, 101111);
11621 EXPECT_EQ(QuicFramer::GetNewConnectionIdFrameSize(new_connection_id),
11622 QuicFramer::GetRetransmittableControlFrameSize(
11623 framer_.transport_version(), QuicFrame(&new_connection_id)));
11624
fkastenholz3c4eabf2019-04-22 07:49:59 -070011625 QuicMaxStreamsFrame max_streams(6, 3, /*unidirectional=*/false);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011626 EXPECT_EQ(QuicFramer::GetMaxStreamsFrameSize(framer_.transport_version(),
fkastenholz3c4eabf2019-04-22 07:49:59 -070011627 max_streams),
QUICHE teama6ef0a62019-03-07 20:34:33 -050011628 QuicFramer::GetRetransmittableControlFrameSize(
fkastenholz3c4eabf2019-04-22 07:49:59 -070011629 framer_.transport_version(), QuicFrame(max_streams)));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011630
fkastenholz3c4eabf2019-04-22 07:49:59 -070011631 QuicStreamsBlockedFrame streams_blocked(7, 3, /*unidirectional=*/false);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011632 EXPECT_EQ(QuicFramer::GetStreamsBlockedFrameSize(framer_.transport_version(),
fkastenholz3c4eabf2019-04-22 07:49:59 -070011633 streams_blocked),
QUICHE teama6ef0a62019-03-07 20:34:33 -050011634 QuicFramer::GetRetransmittableControlFrameSize(
fkastenholz3c4eabf2019-04-22 07:49:59 -070011635 framer_.transport_version(), QuicFrame(streams_blocked)));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011636
11637 QuicPathFrameBuffer buffer = {
11638 {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
11639 QuicPathResponseFrame path_response_frame(8, buffer);
11640 EXPECT_EQ(QuicFramer::GetPathResponseFrameSize(path_response_frame),
11641 QuicFramer::GetRetransmittableControlFrameSize(
11642 framer_.transport_version(), QuicFrame(&path_response_frame)));
11643
11644 QuicPathChallengeFrame path_challenge_frame(9, buffer);
11645 EXPECT_EQ(QuicFramer::GetPathChallengeFrameSize(path_challenge_frame),
11646 QuicFramer::GetRetransmittableControlFrameSize(
11647 framer_.transport_version(), QuicFrame(&path_challenge_frame)));
11648
11649 QuicStopSendingFrame stop_sending_frame(10, 3, 20);
11650 EXPECT_EQ(QuicFramer::GetStopSendingFrameSize(stop_sending_frame),
11651 QuicFramer::GetRetransmittableControlFrameSize(
11652 framer_.transport_version(), QuicFrame(&stop_sending_frame)));
11653}
11654
11655// A set of tests to ensure that bad frame-type encodings
11656// are properly detected and handled.
11657// First, four tests to see that unknown frame types generate
11658// a QUIC_INVALID_FRAME_DATA error with detailed information
11659// "Illegal frame type." This regardless of the encoding of the type
11660// (1/2/4/8 bytes).
11661// This only for version 99.
11662TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown1Byte) {
11663 // This test only for version 99.
11664 if (framer_.transport_version() != QUIC_VERSION_99) {
11665 return;
11666 }
zhongyi546cc452019-04-12 15:27:49 -070011667 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011668 // clang-format off
11669 PacketFragments packet = {
11670 // type (short header, 4 byte packet number)
11671 {"",
11672 {0x43}},
11673 // connection_id
11674 {"",
11675 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11676 // packet number
11677 {"",
11678 {0x12, 0x34, 0x9A, 0xBC}},
11679 // frame type (unknown value, single-byte encoding)
11680 {"",
11681 {0x38}}
11682 };
11683 // clang-format on
11684
11685 std::unique_ptr<QuicEncryptedPacket> encrypted(
11686 AssemblePacketFromFragments(packet));
11687
11688 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11689
11690 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
11691 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11692}
11693
11694TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown2Bytes) {
11695 // This test only for version 99.
11696 if (framer_.transport_version() != QUIC_VERSION_99) {
11697 return;
11698 }
zhongyi546cc452019-04-12 15:27:49 -070011699 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011700
11701 // clang-format off
11702 PacketFragments packet = {
11703 // type (short header, 4 byte packet number)
11704 {"",
11705 {0x43}},
11706 // connection_id
11707 {"",
11708 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11709 // packet number
11710 {"",
11711 {0x12, 0x34, 0x9A, 0xBC}},
11712 // frame type (unknown value, two-byte encoding)
11713 {"",
11714 {kVarInt62TwoBytes + 0x01, 0x38}}
11715 };
11716 // clang-format on
11717
11718 std::unique_ptr<QuicEncryptedPacket> encrypted(
11719 AssemblePacketFromFragments(packet));
11720
11721 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11722
11723 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
11724 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11725}
11726
11727TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown4Bytes) {
11728 // This test only for version 99.
11729 if (framer_.transport_version() != QUIC_VERSION_99) {
11730 return;
11731 }
zhongyi546cc452019-04-12 15:27:49 -070011732 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011733
11734 // clang-format off
11735 PacketFragments packet = {
11736 // type (short header, 4 byte packet number)
11737 {"",
11738 {0x43}},
11739 // connection_id
11740 {"",
11741 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11742 // packet number
11743 {"",
11744 {0x12, 0x34, 0x9A, 0xBC}},
11745 // frame type (unknown value, four-byte encoding)
11746 {"",
11747 {kVarInt62FourBytes + 0x01, 0x00, 0x00, 0x38}}
11748 };
11749 // clang-format on
11750
11751 std::unique_ptr<QuicEncryptedPacket> encrypted(
11752 AssemblePacketFromFragments(packet));
11753
11754 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11755
11756 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
11757 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11758}
11759
11760TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown8Bytes) {
11761 // This test only for version 99.
11762 if (framer_.transport_version() != QUIC_VERSION_99) {
11763 return;
11764 }
zhongyi546cc452019-04-12 15:27:49 -070011765 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011766 // clang-format off
11767 PacketFragments packet = {
11768 // type (short header, 4 byte packet number)
11769 {"",
11770 {0x43}},
11771 // connection_id
11772 {"",
11773 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11774 // packet number
11775 {"",
11776 {0x12, 0x34, 0x9A, 0xBC}},
11777 // frame type (unknown value, eight-byte encoding)
11778 {"",
11779 {kVarInt62EightBytes + 0x01, 0x00, 0x00, 0x01, 0x02, 0x34, 0x56, 0x38}}
11780 };
11781 // clang-format on
11782
11783 std::unique_ptr<QuicEncryptedPacket> encrypted(
11784 AssemblePacketFromFragments(packet));
11785
11786 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11787
11788 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
11789 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11790}
11791
11792// Three tests to check that known frame types that are not minimally
11793// encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
11794// information "Frame type not minimally encoded."
11795// Look at the frame-type encoded in 2, 4, and 8 bytes.
11796TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2Bytes) {
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 (Blocked, two-byte encoding)
11815 {"",
11816 {kVarInt62TwoBytes + 0x00, 0x08}}
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(IETF_QUIC_PROTOCOL_VIOLATION, framer_.error());
11826 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11827}
11828
11829TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown4Bytes) {
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 (Blocked, four-byte encoding)
11848 {"",
11849 {kVarInt62FourBytes + 0x00, 0x00, 0x00, 0x08}}
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(IETF_QUIC_PROTOCOL_VIOLATION, framer_.error());
11859 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11860}
11861
11862TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown8Bytes) {
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 (Blocked, eight-byte encoding)
11880 {"",
11881 {kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08}}
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(IETF_QUIC_PROTOCOL_VIOLATION, framer_.error());
11891 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11892}
11893
11894// Tests to check that all known OETF frame types that are not minimally
11895// encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
11896// information "Frame type not minimally encoded."
11897// Just look at 2-byte encoding.
11898TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2BytesAllTypes) {
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 packets[] = {
11907 {
11908 // type (short header, 4 byte packet number)
11909 {"",
11910 {0x43}},
11911 // connection_id
11912 {"",
11913 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11914 // packet number
11915 {"",
11916 {0x12, 0x34, 0x9A, 0xBC}},
11917 // frame type (two-byte encoding)
11918 {"",
11919 {kVarInt62TwoBytes + 0x00, 0x00}}
11920 },
11921 {
11922 // type (short header, 4 byte packet number)
11923 {"",
11924 {0x43}},
11925 // connection_id
11926 {"",
11927 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11928 // packet number
11929 {"",
11930 {0x12, 0x34, 0x9A, 0xBC}},
11931 // frame type (two-byte encoding)
11932 {"",
11933 {kVarInt62TwoBytes + 0x00, 0x01}}
11934 },
11935 {
11936 // type (short header, 4 byte packet number)
11937 {"",
11938 {0x43}},
11939 // connection_id
11940 {"",
11941 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11942 // packet number
11943 {"",
11944 {0x12, 0x34, 0x9A, 0xBC}},
11945 // frame type (two-byte encoding)
11946 {"",
11947 {kVarInt62TwoBytes + 0x00, 0x02}}
11948 },
11949 {
11950 // type (short header, 4 byte packet number)
11951 {"",
11952 {0x43}},
11953 // connection_id
11954 {"",
11955 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11956 // packet number
11957 {"",
11958 {0x12, 0x34, 0x9A, 0xBC}},
11959 // frame type (two-byte encoding)
11960 {"",
11961 {kVarInt62TwoBytes + 0x00, 0x03}}
11962 },
11963 {
11964 // type (short header, 4 byte packet number)
11965 {"",
11966 {0x43}},
11967 // connection_id
11968 {"",
11969 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11970 // packet number
11971 {"",
11972 {0x12, 0x34, 0x9A, 0xBC}},
11973 // frame type (two-byte encoding)
11974 {"",
11975 {kVarInt62TwoBytes + 0x00, 0x04}}
11976 },
11977 {
11978 // type (short header, 4 byte packet number)
11979 {"",
11980 {0x43}},
11981 // connection_id
11982 {"",
11983 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11984 // packet number
11985 {"",
11986 {0x12, 0x34, 0x9A, 0xBC}},
11987 // frame type (two-byte encoding)
11988 {"",
11989 {kVarInt62TwoBytes + 0x00, 0x05}}
11990 },
11991 {
11992 // type (short header, 4 byte packet number)
11993 {"",
11994 {0x43}},
11995 // connection_id
11996 {"",
11997 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11998 // packet number
11999 {"",
12000 {0x12, 0x34, 0x9A, 0xBC}},
12001 // frame type (two-byte encoding)
12002 {"",
12003 {kVarInt62TwoBytes + 0x00, 0x06}}
12004 },
12005 {
12006 // type (short header, 4 byte packet number)
12007 {"",
12008 {0x43}},
12009 // connection_id
12010 {"",
12011 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12012 // packet number
12013 {"",
12014 {0x12, 0x34, 0x9A, 0xBC}},
12015 // frame type (two-byte encoding)
12016 {"",
12017 {kVarInt62TwoBytes + 0x00, 0x07}}
12018 },
12019 {
12020 // type (short header, 4 byte packet number)
12021 {"",
12022 {0x43}},
12023 // connection_id
12024 {"",
12025 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12026 // packet number
12027 {"",
12028 {0x12, 0x34, 0x9A, 0xBC}},
12029 // frame type (two-byte encoding)
12030 {"",
12031 {kVarInt62TwoBytes + 0x00, 0x08}}
12032 },
12033 {
12034 // type (short header, 4 byte packet number)
12035 {"",
12036 {0x43}},
12037 // connection_id
12038 {"",
12039 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12040 // packet number
12041 {"",
12042 {0x12, 0x34, 0x9A, 0xBC}},
12043 // frame type (two-byte encoding)
12044 {"",
12045 {kVarInt62TwoBytes + 0x00, 0x09}}
12046 },
12047 {
12048 // type (short header, 4 byte packet number)
12049 {"",
12050 {0x43}},
12051 // connection_id
12052 {"",
12053 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12054 // packet number
12055 {"",
12056 {0x12, 0x34, 0x9A, 0xBC}},
12057 // frame type (two-byte encoding)
12058 {"",
12059 {kVarInt62TwoBytes + 0x00, 0x0a}}
12060 },
12061 {
12062 // type (short header, 4 byte packet number)
12063 {"",
12064 {0x43}},
12065 // connection_id
12066 {"",
12067 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12068 // packet number
12069 {"",
12070 {0x12, 0x34, 0x9A, 0xBC}},
12071 // frame type (two-byte encoding)
12072 {"",
12073 {kVarInt62TwoBytes + 0x00, 0x0b}}
12074 },
12075 {
12076 // type (short header, 4 byte packet number)
12077 {"",
12078 {0x43}},
12079 // connection_id
12080 {"",
12081 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12082 // packet number
12083 {"",
12084 {0x12, 0x34, 0x9A, 0xBC}},
12085 // frame type (two-byte encoding)
12086 {"",
12087 {kVarInt62TwoBytes + 0x00, 0x0c}}
12088 },
12089 {
12090 // type (short header, 4 byte packet number)
12091 {"",
12092 {0x43}},
12093 // connection_id
12094 {"",
12095 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12096 // packet number
12097 {"",
12098 {0x12, 0x34, 0x9A, 0xBC}},
12099 // frame type (two-byte encoding)
12100 {"",
12101 {kVarInt62TwoBytes + 0x00, 0x0d}}
12102 },
12103 {
12104 // type (short header, 4 byte packet number)
12105 {"",
12106 {0x43}},
12107 // connection_id
12108 {"",
12109 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12110 // packet number
12111 {"",
12112 {0x12, 0x34, 0x9A, 0xBC}},
12113 // frame type (two-byte encoding)
12114 {"",
12115 {kVarInt62TwoBytes + 0x00, 0x0e}}
12116 },
12117 {
12118 // type (short header, 4 byte packet number)
12119 {"",
12120 {0x43}},
12121 // connection_id
12122 {"",
12123 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12124 // packet number
12125 {"",
12126 {0x12, 0x34, 0x9A, 0xBC}},
12127 // frame type (two-byte encoding)
12128 {"",
12129 {kVarInt62TwoBytes + 0x00, 0x0f}}
12130 },
12131 {
12132 // type (short header, 4 byte packet number)
12133 {"",
12134 {0x43}},
12135 // connection_id
12136 {"",
12137 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12138 // packet number
12139 {"",
12140 {0x12, 0x34, 0x9A, 0xBC}},
12141 // frame type (two-byte encoding)
12142 {"",
12143 {kVarInt62TwoBytes + 0x00, 0x10}}
12144 },
12145 {
12146 // type (short header, 4 byte packet number)
12147 {"",
12148 {0x43}},
12149 // connection_id
12150 {"",
12151 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12152 // packet number
12153 {"",
12154 {0x12, 0x34, 0x9A, 0xBC}},
12155 // frame type (two-byte encoding)
12156 {"",
12157 {kVarInt62TwoBytes + 0x00, 0x11}}
12158 },
12159 {
12160 // type (short header, 4 byte packet number)
12161 {"",
12162 {0x43}},
12163 // connection_id
12164 {"",
12165 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12166 // packet number
12167 {"",
12168 {0x12, 0x34, 0x9A, 0xBC}},
12169 // frame type (two-byte encoding)
12170 {"",
12171 {kVarInt62TwoBytes + 0x00, 0x12}}
12172 },
12173 {
12174 // type (short header, 4 byte packet number)
12175 {"",
12176 {0x43}},
12177 // connection_id
12178 {"",
12179 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12180 // packet number
12181 {"",
12182 {0x12, 0x34, 0x9A, 0xBC}},
12183 // frame type (two-byte encoding)
12184 {"",
12185 {kVarInt62TwoBytes + 0x00, 0x13}}
12186 },
12187 {
12188 // type (short header, 4 byte packet number)
12189 {"",
12190 {0x43}},
12191 // connection_id
12192 {"",
12193 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12194 // packet number
12195 {"",
12196 {0x12, 0x34, 0x9A, 0xBC}},
12197 // frame type (two-byte encoding)
12198 {"",
12199 {kVarInt62TwoBytes + 0x00, 0x14}}
12200 },
12201 {
12202 // type (short header, 4 byte packet number)
12203 {"",
12204 {0x43}},
12205 // connection_id
12206 {"",
12207 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12208 // packet number
12209 {"",
12210 {0x12, 0x34, 0x9A, 0xBC}},
12211 // frame type (two-byte encoding)
12212 {"",
12213 {kVarInt62TwoBytes + 0x00, 0x15}}
12214 },
12215 {
12216 // type (short header, 4 byte packet number)
12217 {"",
12218 {0x43}},
12219 // connection_id
12220 {"",
12221 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12222 // packet number
12223 {"",
12224 {0x12, 0x34, 0x9A, 0xBC}},
12225 // frame type (two-byte encoding)
12226 {"",
12227 {kVarInt62TwoBytes + 0x00, 0x16}}
12228 },
12229 {
12230 // type (short header, 4 byte packet number)
12231 {"",
12232 {0x43}},
12233 // connection_id
12234 {"",
12235 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12236 // packet number
12237 {"",
12238 {0x12, 0x34, 0x9A, 0xBC}},
12239 // frame type (two-byte encoding)
12240 {"",
12241 {kVarInt62TwoBytes + 0x00, 0x17}}
12242 },
12243 {
12244 // type (short header, 4 byte packet number)
12245 {"",
12246 {0x43}},
12247 // connection_id
12248 {"",
12249 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12250 // packet number
12251 {"",
12252 {0x12, 0x34, 0x9A, 0xBC}},
12253 // frame type (two-byte encoding)
12254 {"",
12255 {kVarInt62TwoBytes + 0x00, 0x18}}
12256 },
12257 {
12258 // type (short header, 4 byte packet number)
12259 {"",
12260 {0x43}},
12261 // connection_id
12262 {"",
12263 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12264 // packet number
12265 {"",
12266 {0x12, 0x34, 0x9A, 0xBC}},
12267 // frame type (two-byte encoding)
12268 {"",
12269 {kVarInt62TwoBytes + 0x00, 0x20}}
12270 },
12271 {
12272 // type (short header, 4 byte packet number)
12273 {"",
12274 {0x43}},
12275 // connection_id
12276 {"",
12277 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12278 // packet number
12279 {"",
12280 {0x12, 0x34, 0x9A, 0xBC}},
12281 // frame type (two-byte encoding)
12282 {"",
12283 {kVarInt62TwoBytes + 0x00, 0x21}}
12284 },
12285 };
12286 // clang-format on
12287
12288 for (PacketFragments& packet : packets) {
12289 std::unique_ptr<QuicEncryptedPacket> encrypted(
12290 AssemblePacketFromFragments(packet));
12291
12292 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
12293
12294 EXPECT_EQ(IETF_QUIC_PROTOCOL_VIOLATION, framer_.error());
12295 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
12296 }
12297}
12298
12299TEST_P(QuicFramerTest, RetireConnectionIdFrame) {
12300 if (framer_.transport_version() != QUIC_VERSION_99) {
12301 // This frame is only for version 99.
12302 return;
12303 }
zhongyi546cc452019-04-12 15:27:49 -070012304 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012305 // clang-format off
12306 PacketFragments packet99 = {
12307 // type (short header, 4 byte packet number)
12308 {"",
12309 {0x43}},
12310 // connection_id
12311 {"",
12312 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12313 // packet number
12314 {"",
12315 {0x12, 0x34, 0x56, 0x78}},
12316 // frame type (IETF_RETIRE_CONNECTION_ID frame)
12317 {"",
12318 {0x19}},
12319 // Sequence number
12320 {"Unable to read retire connection ID frame sequence number.",
12321 {kVarInt62TwoBytes + 0x11, 0x22}}
12322 };
12323 // clang-format on
12324
12325 std::unique_ptr<QuicEncryptedPacket> encrypted(
12326 AssemblePacketFromFragments(packet99));
12327 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
12328
12329 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
12330 ASSERT_TRUE(visitor_.header_.get());
12331 EXPECT_TRUE(CheckDecryption(
12332 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
12333 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
12334
12335 EXPECT_EQ(0u, visitor_.stream_frames_.size());
12336
12337 EXPECT_EQ(0x1122u, visitor_.retire_connection_id_.sequence_number);
12338
12339 ASSERT_EQ(0u, visitor_.ack_frames_.size());
12340
12341 CheckFramingBoundaries(packet99, QUIC_INVALID_RETIRE_CONNECTION_ID_DATA);
12342}
12343
12344TEST_P(QuicFramerTest, BuildRetireConnectionIdFramePacket) {
12345 if (framer_.transport_version() != QUIC_VERSION_99) {
12346 // This frame is only for version 99.
12347 return;
12348 }
12349 QuicPacketHeader header;
12350 header.destination_connection_id = FramerTestConnectionId();
12351 header.reset_flag = false;
12352 header.version_flag = false;
12353 header.packet_number = kPacketNumber;
12354
12355 QuicRetireConnectionIdFrame frame;
12356 frame.sequence_number = 0x1122;
12357
12358 QuicFrames frames = {QuicFrame(&frame)};
12359
12360 // clang-format off
12361 unsigned char packet99[] = {
12362 // type (short header, 4 byte packet number)
12363 0x43,
12364 // connection_id
12365 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12366 // packet number
12367 0x12, 0x34, 0x56, 0x78,
12368
12369 // frame type (IETF_RETIRE_CONNECTION_ID frame)
12370 0x19,
12371 // sequence number
12372 kVarInt62TwoBytes + 0x11, 0x22
12373 };
12374 // clang-format on
12375
12376 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
12377 ASSERT_TRUE(data != nullptr);
12378
12379 test::CompareCharArraysWithHexError("constructed packet", data->data(),
12380 data->length(), AsChars(packet99),
12381 QUIC_ARRAYSIZE(packet99));
12382}
12383
12384TEST_P(QuicFramerTest, AckFrameWithInvalidLargestObserved) {
zhongyi546cc452019-04-12 15:27:49 -070012385 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012386 // clang-format off
12387 unsigned char packet[] = {
12388 // public flags (8 byte connection_id)
12389 0x2C,
12390 // connection_id
12391 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12392 // packet number
12393 0x12, 0x34, 0x56, 0x78,
12394
12395 // frame type (ack frame)
12396 0x45,
12397 // largest observed
12398 0x00, 0x00,
12399 // Zero delta time.
12400 0x00, 0x00,
12401 // first ack block length.
12402 0x00, 0x00,
12403 // num timestamps.
12404 0x00
12405 };
12406
12407 unsigned char packet44[] = {
12408 // type (short header, 4 byte packet number)
12409 0x32,
12410 // connection_id
12411 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12412 // packet number
12413 0x12, 0x34, 0x56, 0x78,
12414
12415 // frame type (ack frame)
12416 0x45,
12417 // largest observed
12418 0x00, 0x00,
12419 // Zero delta time.
12420 0x00, 0x00,
12421 // first ack block length.
12422 0x00, 0x00,
12423 // num timestamps.
12424 0x00
12425 };
12426
12427 unsigned char packet46[] = {
12428 // type (short header, 4 byte packet number)
12429 0x43,
12430 // connection_id
12431 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12432 // packet number
12433 0x12, 0x34, 0x56, 0x78,
12434
12435 // frame type (ack frame)
12436 0x45,
12437 // largest observed
12438 0x00, 0x00,
12439 // Zero delta time.
12440 0x00, 0x00,
12441 // first ack block length.
12442 0x00, 0x00,
12443 // num timestamps.
12444 0x00
12445 };
12446
12447 unsigned char packet99[] = {
12448 // type (short header, 4 byte packet number)
12449 0x43,
12450 // connection_id
12451 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12452 // packet number
12453 0x12, 0x34, 0x56, 0x78,
12454
12455 // frame type (IETF_ACK frame)
12456 0x02,
12457 // Largest acked
12458 kVarInt62OneByte + 0x00,
12459 // Zero delta time.
12460 kVarInt62OneByte + 0x00,
12461 // Ack block count 0
12462 kVarInt62OneByte + 0x00,
12463 // First ack block length
12464 kVarInt62OneByte + 0x00,
12465 };
12466 // clang-format on
12467
12468 unsigned char* p = packet;
12469 size_t p_size = QUIC_ARRAYSIZE(packet);
12470 if (framer_.transport_version() == QUIC_VERSION_99) {
12471 p = packet99;
12472 p_size = QUIC_ARRAYSIZE(packet99);
12473 } else if (framer_.transport_version() > QUIC_VERSION_44) {
12474 p = packet46;
12475 } else if (framer_.transport_version() > QUIC_VERSION_43) {
12476 p = packet44;
12477 p_size = QUIC_ARRAYSIZE(packet44);
12478 }
12479
12480 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
12481 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12482 EXPECT_EQ(framer_.detailed_error(), "Largest acked is 0.");
12483}
12484
12485TEST_P(QuicFramerTest, FirstAckBlockJustUnderFlow) {
zhongyi546cc452019-04-12 15:27:49 -070012486 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012487 // clang-format off
12488 unsigned char packet[] = {
12489 // public flags (8 byte connection_id)
12490 0x2C,
12491 // connection_id
12492 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12493 // packet number
12494 0x12, 0x34, 0x56, 0x78,
12495
12496 // frame type (ack frame)
12497 0x45,
12498 // largest observed
12499 0x00, 0x02,
12500 // Zero delta time.
12501 0x00, 0x00,
12502 // first ack block length.
12503 0x00, 0x03,
12504 // num timestamps.
12505 0x00
12506 };
12507
12508 unsigned char packet44[] = {
12509 // type (short header, 4 byte packet number)
12510 0x32,
12511 // connection_id
12512 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12513 // packet number
12514 0x12, 0x34, 0x56, 0x78,
12515
12516 // frame type (ack frame)
12517 0x45,
12518 // largest observed
12519 0x00, 0x02,
12520 // Zero delta time.
12521 0x00, 0x00,
12522 // first ack block length.
12523 0x00, 0x03,
12524 // num timestamps.
12525 0x00
12526 };
12527
12528 unsigned char packet46[] = {
12529 // type (short header, 4 byte packet number)
12530 0x43,
12531 // connection_id
12532 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12533 // packet number
12534 0x12, 0x34, 0x56, 0x78,
12535
12536 // frame type (ack frame)
12537 0x45,
12538 // largest observed
12539 0x00, 0x02,
12540 // Zero delta time.
12541 0x00, 0x00,
12542 // first ack block length.
12543 0x00, 0x03,
12544 // num timestamps.
12545 0x00
12546 };
12547
12548 unsigned char packet99[] = {
12549 // type (short header, 4 byte packet number)
12550 0x43,
12551 // connection_id
12552 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12553 // packet number
12554 0x12, 0x34, 0x56, 0x78,
12555
12556 // frame type (IETF_ACK frame)
12557 0x02,
12558 // Largest acked
12559 kVarInt62OneByte + 0x02,
12560 // Zero delta time.
12561 kVarInt62OneByte + 0x00,
12562 // Ack block count 0
12563 kVarInt62OneByte + 0x00,
12564 // First ack block length
12565 kVarInt62OneByte + 0x02,
12566 };
12567 // clang-format on
12568
12569 unsigned char* p = packet;
12570 size_t p_size = QUIC_ARRAYSIZE(packet);
12571 if (framer_.transport_version() == QUIC_VERSION_99) {
12572 p = packet99;
12573 p_size = QUIC_ARRAYSIZE(packet99);
12574 } else if (framer_.transport_version() > QUIC_VERSION_44) {
12575 p = packet46;
12576 p_size = QUIC_ARRAYSIZE(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(),
12585 "Underflow with first ack block length 3 largest acked is 2.");
12586}
12587
12588TEST_P(QuicFramerTest, ThirdAckBlockJustUnderflow) {
zhongyi546cc452019-04-12 15:27:49 -070012589 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012590 // clang-format off
12591 unsigned char packet[] = {
12592 // public flags (8 byte connection_id)
12593 0x2C,
12594 // connection_id
12595 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12596 // packet number
12597 0x12, 0x34, 0x56, 0x78,
12598
12599 // frame type (ack frame)
12600 0x60,
12601 // largest observed
12602 0x0A,
12603 // Zero delta time.
12604 0x00, 0x00,
12605 // Num of ack blocks
12606 0x02,
12607 // first ack block length.
12608 0x02,
12609 // gap to next block
12610 0x01,
12611 // ack block length
12612 0x01,
12613 // gap to next block
12614 0x01,
12615 // ack block length
12616 0x06,
12617 // num timestamps.
12618 0x00
12619 };
12620
12621 unsigned char packet44[] = {
12622 // type (short header, 4 byte packet number)
12623 0x32,
12624 // connection_id
12625 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12626 // packet number
12627 0x12, 0x34, 0x56, 0x78,
12628
12629 // frame type (ack frame)
12630 0x60,
12631 // largest observed
12632 0x0A,
12633 // Zero delta time.
12634 0x00, 0x00,
12635 // Num of ack blocks
12636 0x02,
12637 // first ack block length.
12638 0x02,
12639 // gap to next block
12640 0x01,
12641 // ack block length
12642 0x01,
12643 // gap to next block
12644 0x01,
12645 // ack block length
12646 0x06,
12647 // num timestamps.
12648 0x00
12649 };
12650
12651 unsigned char packet46[] = {
12652 // type (short header, 4 byte packet number)
12653 0x43,
12654 // connection_id
12655 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12656 // packet number
12657 0x12, 0x34, 0x56, 0x78,
12658
12659 // frame type (ack frame)
12660 0x60,
12661 // largest observed
12662 0x0A,
12663 // Zero delta time.
12664 0x00, 0x00,
12665 // Num of ack blocks
12666 0x02,
12667 // first ack block length.
12668 0x02,
12669 // gap to next block
12670 0x01,
12671 // ack block length
12672 0x01,
12673 // gap to next block
12674 0x01,
12675 // ack block length
12676 0x06,
12677 // num timestamps.
12678 0x00
12679 };
12680
12681 unsigned char packet99[] = {
12682 // type (short header, 4 byte packet number)
12683 0x43,
12684 // connection_id
12685 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12686 // packet number
12687 0x12, 0x34, 0x56, 0x78,
12688
12689 // frame type (IETF_ACK frame)
12690 0x02,
12691 // Largest acked
12692 kVarInt62OneByte + 0x0A,
12693 // Zero delta time.
12694 kVarInt62OneByte + 0x00,
12695 // Ack block count 2
12696 kVarInt62OneByte + 0x02,
12697 // First ack block length
12698 kVarInt62OneByte + 0x01,
12699 // gap to next block length
12700 kVarInt62OneByte + 0x00,
12701 // ack block length
12702 kVarInt62OneByte + 0x00,
12703 // gap to next block length
12704 kVarInt62OneByte + 0x00,
12705 // ack block length
12706 kVarInt62OneByte + 0x05,
12707 };
12708 // clang-format on
12709
12710 unsigned char* p = packet;
12711 size_t p_size = QUIC_ARRAYSIZE(packet);
12712 if (framer_.transport_version() == QUIC_VERSION_99) {
12713 p = packet99;
12714 p_size = QUIC_ARRAYSIZE(packet99);
12715 } else if (framer_.transport_version() > QUIC_VERSION_44) {
12716 p = packet46;
12717 p_size = QUIC_ARRAYSIZE(packet46);
12718 } else if (framer_.transport_version() > QUIC_VERSION_43) {
12719 p = packet44;
12720 p_size = QUIC_ARRAYSIZE(packet44);
12721 }
12722
12723 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
12724 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12725 if (framer_.transport_version() == QUIC_VERSION_99) {
12726 EXPECT_EQ(framer_.detailed_error(),
12727 "Underflow with ack block length 6 latest ack block end is 5.");
12728 } else {
12729 EXPECT_EQ(framer_.detailed_error(),
12730 "Underflow with ack block length 6, end of block is 6.");
12731 }
12732}
12733
12734TEST_P(QuicFramerTest, CoalescedPacket) {
12735 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12736 return;
12737 }
zhongyi546cc452019-04-12 15:27:49 -070012738 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012739 // clang-format off
12740 unsigned char packet[] = {
12741 // first coalesced packet
12742 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12743 // 4-byte packet number)
12744 0xD3,
12745 // version
12746 QUIC_VERSION_BYTES,
12747 // destination connection ID length
12748 0x50,
12749 // destination connection ID
12750 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12751 // long header packet length
12752 0x1E,
12753 // packet number
12754 0x12, 0x34, 0x56, 0x78,
12755 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12756 0x08 | 0x01 | 0x02 | 0x04,
12757 // stream id
12758 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12759 // offset
12760 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12761 0x32, 0x10, 0x76, 0x54,
12762 // data length
12763 kVarInt62OneByte + 0x0c,
12764 // data
12765 'h', 'e', 'l', 'l',
12766 'o', ' ', 'w', 'o',
12767 'r', 'l', 'd', '!',
12768 // second coalesced packet
12769 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12770 // 4-byte packet number)
12771 0xD3,
12772 // version
12773 QUIC_VERSION_BYTES,
12774 // destination connection ID length
12775 0x50,
12776 // destination connection ID
12777 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12778 // long header packet length
12779 0x1E,
12780 // packet number
12781 0x12, 0x34, 0x56, 0x79,
12782 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12783 0x08 | 0x01 | 0x02 | 0x04,
12784 // stream id
12785 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12786 // offset
12787 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12788 0x32, 0x10, 0x76, 0x54,
12789 // data length
12790 kVarInt62OneByte + 0x0c,
12791 // data
12792 'H', 'E', 'L', 'L',
12793 'O', '_', 'W', 'O',
12794 'R', 'L', 'D', '?',
12795 };
12796 // clang-format on
12797
12798 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
12799 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12800
12801 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
12802 ASSERT_TRUE(visitor_.header_.get());
12803
12804 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12805 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12806
12807 // Stream ID should be the last 3 bytes of kStreamId.
12808 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12809 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12810 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12811 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12812
12813 ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
12814 EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
12815
12816 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
12817 ASSERT_TRUE(visitor_.header_.get());
12818
12819 ASSERT_EQ(2u, visitor_.stream_frames_.size());
12820 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12821
12822 // Stream ID should be the last 3 bytes of kStreamId.
12823 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[1]->stream_id);
12824 EXPECT_TRUE(visitor_.stream_frames_[1]->fin);
12825 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[1]->offset);
12826 CheckStreamFrameData("HELLO_WORLD?", visitor_.stream_frames_[1].get());
12827}
12828
12829TEST_P(QuicFramerTest, MismatchedCoalescedPacket) {
12830 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12831 return;
12832 }
zhongyi546cc452019-04-12 15:27:49 -070012833 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012834 // clang-format off
12835 unsigned char packet[] = {
12836 // first coalesced packet
12837 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12838 // 4-byte packet number)
12839 0xD3,
12840 // version
12841 QUIC_VERSION_BYTES,
12842 // destination connection ID length
12843 0x50,
12844 // destination connection ID
12845 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12846 // long header packet length
12847 0x1E,
12848 // packet number
12849 0x12, 0x34, 0x56, 0x78,
12850 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12851 0x08 | 0x01 | 0x02 | 0x04,
12852 // stream id
12853 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12854 // offset
12855 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12856 0x32, 0x10, 0x76, 0x54,
12857 // data length
12858 kVarInt62OneByte + 0x0c,
12859 // data
12860 'h', 'e', 'l', 'l',
12861 'o', ' ', 'w', 'o',
12862 'r', 'l', 'd', '!',
12863 // second coalesced packet
12864 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12865 // 4-byte packet number)
12866 0xD3,
12867 // version
12868 QUIC_VERSION_BYTES,
12869 // destination connection ID length
12870 0x50,
12871 // destination connection ID
12872 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
12873 // long header packet length
12874 0x1E,
12875 // packet number
12876 0x12, 0x34, 0x56, 0x79,
12877 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12878 0x08 | 0x01 | 0x02 | 0x04,
12879 // stream id
12880 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12881 // offset
12882 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12883 0x32, 0x10, 0x76, 0x54,
12884 // data length
12885 kVarInt62OneByte + 0x0c,
12886 // data
12887 'H', 'E', 'L', 'L',
12888 'O', '_', 'W', 'O',
12889 'R', 'L', 'D', '?',
12890 };
12891 // clang-format on
12892
12893 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
12894 EXPECT_QUIC_PEER_BUG(EXPECT_TRUE(framer_.ProcessPacket(encrypted)),
12895 "Server: Received mismatched coalesced header.*");
12896
12897 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
12898 ASSERT_TRUE(visitor_.header_.get());
12899
12900 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12901 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12902
12903 // Stream ID should be the last 3 bytes of kStreamId.
12904 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12905 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12906 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12907 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12908
12909 ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
12910}
12911
12912TEST_P(QuicFramerTest, InvalidCoalescedPacket) {
12913 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12914 return;
12915 }
zhongyi546cc452019-04-12 15:27:49 -070012916 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012917 // clang-format off
12918 unsigned char packet[] = {
12919 // first coalesced packet
12920 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12921 // 4-byte packet number)
12922 0xD3,
12923 // version
12924 QUIC_VERSION_BYTES,
12925 // destination connection ID length
12926 0x50,
12927 // destination connection ID
12928 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12929 // long header packet length
12930 0x1E,
12931 // packet number
12932 0x12, 0x34, 0x56, 0x78,
12933 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12934 0x08 | 0x01 | 0x02 | 0x04,
12935 // stream id
12936 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12937 // offset
12938 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12939 0x32, 0x10, 0x76, 0x54,
12940 // data length
12941 kVarInt62OneByte + 0x0c,
12942 // data
12943 'h', 'e', 'l', 'l',
12944 'o', ' ', 'w', 'o',
12945 'r', 'l', 'd', '!',
12946 // second coalesced packet
12947 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12948 // 4-byte packet number)
12949 0xD3,
12950 // version would be here but we cut off the invalid coalesced header.
12951 };
12952 // clang-format on
12953
12954 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
12955 EXPECT_QUIC_PEER_BUG(EXPECT_TRUE(framer_.ProcessPacket(encrypted)),
12956 "Server: Failed to parse received coalesced header.*");
12957
12958 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
12959 ASSERT_TRUE(visitor_.header_.get());
12960
12961 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12962 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12963
12964 // Stream ID should be the last 3 bytes of kStreamId.
12965 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12966 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12967 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12968 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12969
12970 ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
12971}
12972
dschinazie0df3f72019-05-06 16:37:51 -070012973TEST_P(QuicFramerTest, ClientReceivesInvalidVersion) {
12974 if (framer_.transport_version() < QUIC_VERSION_44) {
12975 return;
12976 }
12977 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12978
12979 // clang-format off
12980 unsigned char packet[] = {
12981 // public flags (long header with packet type INITIAL)
12982 0xFF,
12983 // version that is different from the framer's version
12984 'Q', '0', '4', '3',
12985 // connection ID lengths
12986 0x05,
12987 // source connection ID
12988 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12989 // packet number
12990 0x01,
12991 // padding frame
12992 0x00,
12993 };
12994 // clang-format on
12995
12996 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
12997 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12998
12999 EXPECT_EQ(QUIC_INVALID_VERSION, framer_.error());
13000 EXPECT_EQ("Client received unexpected version.", framer_.detailed_error());
13001}
13002
QUICHE teama6ef0a62019-03-07 20:34:33 -050013003TEST_P(QuicFramerTest, PacketHeaderWithVariableLengthConnectionId) {
13004 if (framer_.transport_version() < QUIC_VERSION_46) {
13005 return;
13006 }
zhongyi546cc452019-04-12 15:27:49 -070013007 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050013008 char connection_id_bytes[9] = {0xFE, 0xDC, 0xBA, 0x98, 0x76,
13009 0x54, 0x32, 0x10, 0x42};
13010 QuicConnectionId connection_id(connection_id_bytes,
13011 sizeof(connection_id_bytes));
13012 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
13013 QuicFramerPeer::SetExpectedConnectionIDLength(&framer_,
13014 connection_id.length());
13015
13016 // clang-format off
13017 PacketFragments packet = {
13018 // type (8 byte connection_id and 1 byte packet number)
13019 {"Unable to read type.",
13020 {0x40}},
13021 // connection_id
13022 {"Unable to read Destination ConnectionId.",
13023 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
13024 // packet number
13025 {"Unable to read packet number.",
13026 {0x78}},
13027 };
13028 // clang-format on
13029
13030 std::unique_ptr<QuicEncryptedPacket> encrypted(
13031 AssemblePacketFromFragments(packet));
13032 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13033 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
13034 ASSERT_TRUE(visitor_.header_.get());
13035 EXPECT_EQ(connection_id, visitor_.header_->destination_connection_id);
13036 EXPECT_FALSE(visitor_.header_->reset_flag);
13037 EXPECT_FALSE(visitor_.header_->version_flag);
13038 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
13039 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
13040
13041 CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
13042}
13043
QUICHE team4d9d6292019-03-11 14:25:33 -070013044TEST_P(QuicFramerTest, UpdateExpectedConnectionIdLength) {
13045 if (framer_.transport_version() < QUIC_VERSION_46) {
13046 return;
13047 }
zhongyi546cc452019-04-12 15:27:49 -070013048 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE team4d9d6292019-03-11 14:25:33 -070013049 framer_.SetShouldUpdateExpectedConnectionIdLength(true);
13050
13051 // clang-format off
13052 unsigned char long_header_packet[] = {
13053 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13054 // 4-byte packet number)
13055 0xD3,
13056 // version
13057 QUIC_VERSION_BYTES,
13058 // destination connection ID length
13059 0x60,
13060 // destination connection ID
13061 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42,
13062 // packet number
13063 0x12, 0x34, 0x56, 0x78,
13064 // padding frame
13065 0x00,
13066 };
13067 unsigned char long_header_packet99[] = {
13068 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13069 // 4-byte packet number)
13070 0xD3,
13071 // version
13072 QUIC_VERSION_BYTES,
13073 // destination connection ID length
13074 0x60,
13075 // destination connection ID
13076 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42,
13077 // long header packet length
13078 0x05,
13079 // packet number
13080 0x12, 0x34, 0x56, 0x78,
13081 // padding frame
13082 0x00,
13083 };
13084 // clang-format on
13085
13086 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
13087 EXPECT_TRUE(framer_.ProcessPacket(
13088 QuicEncryptedPacket(AsChars(long_header_packet),
13089 QUIC_ARRAYSIZE(long_header_packet), false)));
13090 } else {
13091 EXPECT_TRUE(framer_.ProcessPacket(
13092 QuicEncryptedPacket(AsChars(long_header_packet99),
13093 QUIC_ARRAYSIZE(long_header_packet99), false)));
13094 }
13095
13096 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
13097 ASSERT_TRUE(visitor_.header_.get());
QUICHE team8e2e4532019-03-14 14:37:56 -070013098 EXPECT_EQ(visitor_.header_.get()->destination_connection_id,
13099 FramerTestConnectionIdNineBytes());
QUICHE team4d9d6292019-03-11 14:25:33 -070013100 EXPECT_EQ(visitor_.header_.get()->packet_number,
13101 QuicPacketNumber(UINT64_C(0x12345678)));
13102
zhongyi546cc452019-04-12 15:27:49 -070013103 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE team4d9d6292019-03-11 14:25:33 -070013104 // clang-format off
13105 unsigned char short_header_packet[] = {
13106 // type (short header, 4 byte packet number)
13107 0x43,
13108 // connection_id
13109 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42,
13110 // packet number
13111 0x13, 0x37, 0x42, 0x33,
13112 // padding frame
13113 0x00,
13114 };
13115 // clang-format on
13116
13117 QuicEncryptedPacket short_header_encrypted(
13118 AsChars(short_header_packet), QUIC_ARRAYSIZE(short_header_packet), false);
13119 EXPECT_TRUE(framer_.ProcessPacket(short_header_encrypted));
13120
13121 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
13122 ASSERT_TRUE(visitor_.header_.get());
QUICHE team8e2e4532019-03-14 14:37:56 -070013123 EXPECT_EQ(visitor_.header_.get()->destination_connection_id,
13124 FramerTestConnectionIdNineBytes());
QUICHE team4d9d6292019-03-11 14:25:33 -070013125 EXPECT_EQ(visitor_.header_.get()->packet_number,
13126 QuicPacketNumber(UINT64_C(0x13374233)));
13127}
13128
QUICHE team10b22a12019-03-21 15:31:42 -070013129TEST_P(QuicFramerTest, MultiplePacketNumberSpaces) {
13130 if (framer_.transport_version() < QUIC_VERSION_46) {
13131 return;
13132 }
13133 framer_.SetShouldUpdateExpectedConnectionIdLength(true);
13134 framer_.EnableMultiplePacketNumberSpacesSupport();
13135
13136 // clang-format off
13137 unsigned char long_header_packet[] = {
13138 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13139 // 4-byte packet number)
13140 0xD3,
13141 // version
13142 QUIC_VERSION_BYTES,
13143 // destination connection ID length
13144 0x60,
13145 // destination connection ID
13146 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42,
13147 // packet number
13148 0x12, 0x34, 0x56, 0x78,
13149 // padding frame
13150 0x00,
13151 };
13152 unsigned char long_header_packet99[] = {
13153 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13154 // 4-byte packet number)
13155 0xD3,
13156 // version
13157 QUIC_VERSION_BYTES,
13158 // destination connection ID length
13159 0x60,
13160 // destination connection ID
13161 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42,
13162 // long header packet length
13163 0x05,
13164 // packet number
13165 0x12, 0x34, 0x56, 0x78,
13166 // padding frame
13167 0x00,
13168 };
13169 // clang-format on
13170
zhongyi546cc452019-04-12 15:27:49 -070013171 if (framer_.version().KnowsWhichDecrypterToUse()) {
13172 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
13173 QuicMakeUnique<TestDecrypter>());
13174 framer_.RemoveDecrypter(ENCRYPTION_INITIAL);
13175 } else {
13176 framer_.SetDecrypter(ENCRYPTION_ZERO_RTT, QuicMakeUnique<TestDecrypter>());
13177 }
QUICHE team10b22a12019-03-21 15:31:42 -070013178 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
13179 EXPECT_TRUE(framer_.ProcessPacket(
13180 QuicEncryptedPacket(AsChars(long_header_packet),
13181 QUIC_ARRAYSIZE(long_header_packet), false)));
13182 } else {
13183 EXPECT_TRUE(framer_.ProcessPacket(
13184 QuicEncryptedPacket(AsChars(long_header_packet99),
13185 QUIC_ARRAYSIZE(long_header_packet99), false)));
13186 }
13187
13188 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
13189 EXPECT_FALSE(
13190 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
13191 .IsInitialized());
13192 EXPECT_FALSE(
13193 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
13194 .IsInitialized());
13195 EXPECT_EQ(kPacketNumber, QuicFramerPeer::GetLargestDecryptedPacketNumber(
13196 &framer_, APPLICATION_DATA));
13197
13198 // clang-format off
13199 unsigned char short_header_packet[] = {
13200 // type (short header, 1 byte packet number)
13201 0x40,
13202 // connection_id
13203 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42,
13204 // packet number
13205 0x79,
13206 // padding frame
13207 0x00,
13208 };
13209 // clang-format on
13210
13211 QuicEncryptedPacket short_header_encrypted(
13212 AsChars(short_header_packet), QUIC_ARRAYSIZE(short_header_packet), false);
zhongyi546cc452019-04-12 15:27:49 -070013213 if (framer_.version().KnowsWhichDecrypterToUse()) {
13214 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13215 QuicMakeUnique<TestDecrypter>());
13216 framer_.RemoveDecrypter(ENCRYPTION_ZERO_RTT);
13217 } else {
13218 framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
13219 QuicMakeUnique<TestDecrypter>());
13220 }
QUICHE team10b22a12019-03-21 15:31:42 -070013221 EXPECT_TRUE(framer_.ProcessPacket(short_header_encrypted));
13222
13223 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
13224 EXPECT_FALSE(
13225 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
13226 .IsInitialized());
13227 EXPECT_FALSE(
13228 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
13229 .IsInitialized());
13230 EXPECT_EQ(kPacketNumber + 1, QuicFramerPeer::GetLargestDecryptedPacketNumber(
13231 &framer_, APPLICATION_DATA));
13232}
13233
nharper2ceb97c2019-04-19 11:38:59 -070013234TEST_P(QuicFramerTest, IetfRetryPacketRejected) {
dschinazi244f6dc2019-05-06 15:45:16 -070013235 if (!framer_.version().KnowsWhichDecrypterToUse() ||
13236 framer_.version().SupportsRetry()) {
nharper2ceb97c2019-04-19 11:38:59 -070013237 return;
13238 }
13239
13240 // clang-format off
13241 PacketFragments packet = {
13242 // public flags (IETF Retry packet, 0-length original destination CID)
13243 {"Unable to read type.",
13244 {0xf0}},
13245 // version tag
13246 {"Unable to read protocol version.",
13247 {QUIC_VERSION_BYTES}},
13248 // connection_id length
nharper9bb83462019-05-01 10:53:22 -070013249 {"Illegal long header type value.",
13250 {0x00}},
13251 };
13252 // clang-format on
13253
13254 // clang-format off
13255 PacketFragments packet45 = {
13256 // public flags (IETF Retry packet, 0-length original destination CID)
13257 {"Unable to read type.",
13258 {0xf0}},
13259 // version tag
13260 {"Unable to read protocol version.",
13261 {QUIC_VERSION_BYTES}},
13262 // connection_id length
dschinazi244f6dc2019-05-06 15:45:16 -070013263 {"RETRY not supported in this version.",
nharper2ceb97c2019-04-19 11:38:59 -070013264 {0x00}},
13265 };
13266 // clang-format on
13267
nharper9bb83462019-05-01 10:53:22 -070013268 PacketFragments& fragments =
13269 framer_.transport_version() > QUIC_VERSION_44 ? packet45 : packet;
nharper2ceb97c2019-04-19 11:38:59 -070013270 std::unique_ptr<QuicEncryptedPacket> encrypted(
nharper9bb83462019-05-01 10:53:22 -070013271 AssemblePacketFromFragments(fragments));
nharper2ceb97c2019-04-19 11:38:59 -070013272
13273 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13274 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
nharper9bb83462019-05-01 10:53:22 -070013275 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
nharper2ceb97c2019-04-19 11:38:59 -070013276}
13277
13278TEST_P(QuicFramerTest, RetryPacketRejectedWithMultiplePacketNumberSpaces) {
dschinazi244f6dc2019-05-06 15:45:16 -070013279 if (framer_.transport_version() < QUIC_VERSION_46 ||
13280 framer_.version().SupportsRetry()) {
nharper2ceb97c2019-04-19 11:38:59 -070013281 return;
13282 }
13283 framer_.EnableMultiplePacketNumberSpacesSupport();
13284
13285 // clang-format off
13286 PacketFragments packet = {
13287 // public flags (IETF Retry packet, 0-length original destination CID)
13288 {"Unable to read type.",
13289 {0xf0}},
13290 // version tag
13291 {"Unable to read protocol version.",
13292 {QUIC_VERSION_BYTES}},
13293 // connection_id length
dschinazi244f6dc2019-05-06 15:45:16 -070013294 {"RETRY not supported in this version.",
nharper2ceb97c2019-04-19 11:38:59 -070013295 {0x00}},
13296 };
13297 // clang-format on
13298
13299 std::unique_ptr<QuicEncryptedPacket> encrypted(
13300 AssemblePacketFromFragments(packet));
13301
13302 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13303 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
13304 CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
13305}
13306
nharpera745e392019-04-19 12:05:15 -070013307TEST_P(QuicFramerTest, ProcessPublicHeaderNoVersionInferredType) {
13308 // The framer needs to have Perspective::IS_SERVER and configured to infer the
13309 // packet header type from the packet (not the version). The framer's version
13310 // needs to be one that uses the IETF packet format.
13311 if (!framer_.version().KnowsWhichDecrypterToUse()) {
13312 return;
13313 }
13314 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13315
13316 // Prepare a packet that uses the Google QUIC packet header but has no version
13317 // field.
13318
13319 // clang-format off
13320 PacketFragments packet = {
13321 // public flags (1-byte packet number, 8-byte connection_id, no version)
13322 {"Unable to read public flags.",
13323 {0x08}},
13324 // connection_id
13325 {"Unable to read ConnectionId.",
13326 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
13327 // packet number
13328 {"Unable to read packet number.",
13329 {0x01}},
13330 // padding
13331 {"Invalid public header type for expected version.",
13332 {0x00}},
13333 };
13334 // clang-format on
13335
13336 PacketFragments& fragments = packet;
13337
13338 std::unique_ptr<QuicEncryptedPacket> encrypted(
13339 AssemblePacketFromFragments(fragments));
13340
13341 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13342 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
nharper8b6d63a2019-05-03 10:34:53 -070013343 EXPECT_EQ("Invalid public header type for expected version.",
13344 framer_.detailed_error());
nharpera745e392019-04-19 12:05:15 -070013345 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
13346}
13347
nharper3f283562019-05-02 16:37:12 -070013348TEST_P(QuicFramerTest, ProcessMismatchedHeaderVersion) {
13349 // The framer needs to have Perspective::IS_SERVER and configured to infer the
13350 // packet header type from the packet (not the version). The framer's version
13351 // needs to be one that uses the IETF packet format.
13352 if (!framer_.version().KnowsWhichDecrypterToUse()) {
13353 return;
13354 }
13355 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13356
13357 // clang-format off
13358 PacketFragments packet = {
dschinazi072da7c2019-05-07 17:57:42 -070013359 // public flags (Google QUIC header with version present)
nharper3f283562019-05-02 16:37:12 -070013360 {"Unable to read public flags.",
13361 {0x09}},
13362 // connection_id
13363 {"Unable to read ConnectionId.",
13364 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
13365 // version tag
13366 {"Unable to read protocol version.",
13367 {QUIC_VERSION_BYTES}},
13368 // packet number
13369 {"Unable to read packet number.",
13370 {0x01}},
13371 };
13372 // clang-format on
13373
13374 std::unique_ptr<QuicEncryptedPacket> encrypted(
13375 AssemblePacketFromFragments(packet));
13376 framer_.ProcessPacket(*encrypted);
13377
13378 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13379 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
nharper8b6d63a2019-05-03 10:34:53 -070013380 EXPECT_EQ("Invalid public header type for expected version.",
13381 framer_.detailed_error());
nharper3f283562019-05-02 16:37:12 -070013382 CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
13383}
13384
QUICHE teama6ef0a62019-03-07 20:34:33 -050013385} // namespace
13386} // namespace test
13387} // namespace quic