blob: 218d9a913bc4046661071df1de35d8e0e81913e1 [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
QUICHE team5be974e2020-12-29 18:35:24 -05005#include "quic/core/quic_framer.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -05006
7#include <algorithm>
8#include <cstdint>
9#include <map>
10#include <memory>
vasilvv872e7a32019-03-12 16:42:44 -070011#include <string>
bnc463f2352019-10-10 04:49:34 -070012#include <utility>
QUICHE teama6ef0a62019-03-07 20:34:33 -050013#include <vector>
14
vasilvvbed67c62020-10-20 06:38:43 -070015#include "absl/base/macros.h"
vasilvv72b789c2020-10-27 17:39:17 -070016#include "absl/strings/escaping.h"
vasilvv89fe24d2020-10-26 14:55:28 -070017#include "absl/strings/match.h"
vasilvvc872ee42020-10-07 19:50:22 -070018#include "absl/strings/string_view.h"
QUICHE team5be974e2020-12-29 18:35:24 -050019#include "quic/core/crypto/null_decrypter.h"
20#include "quic/core/crypto/null_encrypter.h"
21#include "quic/core/crypto/quic_decrypter.h"
22#include "quic/core/crypto/quic_encrypter.h"
23#include "quic/core/quic_connection_id.h"
24#include "quic/core/quic_error_codes.h"
25#include "quic/core/quic_packets.h"
26#include "quic/core/quic_types.h"
27#include "quic/core/quic_utils.h"
28#include "quic/core/quic_versions.h"
29#include "quic/platform/api/quic_expect_bug.h"
30#include "quic/platform/api/quic_flags.h"
31#include "quic/platform/api/quic_logging.h"
32#include "quic/platform/api/quic_ptr_util.h"
33#include "quic/platform/api/quic_test.h"
34#include "quic/test_tools/quic_framer_peer.h"
35#include "quic/test_tools/quic_test_utils.h"
36#include "quic/test_tools/simple_data_producer.h"
37#include "common/platform/api/quiche_text_utils.h"
38#include "common/test_tools/quiche_test_utils.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050039
40using testing::_;
41using testing::Return;
QUICHE teama6ef0a62019-03-07 20:34:33 -050042
43namespace quic {
44namespace test {
45namespace {
46
47const uint64_t kEpoch = UINT64_C(1) << 32;
48const uint64_t kMask = kEpoch - 1;
49
50const QuicUint128 kTestStatelessResetToken = 1010101; // 0x0F69B5
51
52// Use fields in which each byte is distinct to ensure that every byte is
53// framed correctly. The values are otherwise arbitrary.
54QuicConnectionId FramerTestConnectionId() {
55 return TestConnectionId(UINT64_C(0xFEDCBA9876543210));
56}
57
58QuicConnectionId FramerTestConnectionIdPlusOne() {
59 return TestConnectionId(UINT64_C(0xFEDCBA9876543211));
60}
61
QUICHE team8e2e4532019-03-14 14:37:56 -070062QuicConnectionId FramerTestConnectionIdNineBytes() {
63 char connection_id_bytes[9] = {0xFE, 0xDC, 0xBA, 0x98, 0x76,
64 0x54, 0x32, 0x10, 0x42};
65 return QuicConnectionId(connection_id_bytes, sizeof(connection_id_bytes));
66}
67
QUICHE teama6ef0a62019-03-07 20:34:33 -050068const QuicPacketNumber kPacketNumber = QuicPacketNumber(UINT64_C(0x12345678));
69const QuicPacketNumber kSmallLargestObserved =
70 QuicPacketNumber(UINT16_C(0x1234));
71const QuicPacketNumber kSmallMissingPacket = QuicPacketNumber(UINT16_C(0x1233));
72const QuicPacketNumber kLeastUnacked = QuicPacketNumber(UINT64_C(0x012345670));
73const QuicStreamId kStreamId = UINT64_C(0x01020304);
74// Note that the high 4 bits of the stream offset must be less than 0x40
75// in order to ensure that the value can be encoded using VarInt62 encoding.
76const QuicStreamOffset kStreamOffset = UINT64_C(0x3A98FEDC32107654);
77const QuicPublicResetNonceProof kNonceProof = UINT64_C(0xABCDEF0123456789);
78
79// In testing that we can ack the full range of packets...
80// This is the largest packet number that can be represented in IETF QUIC
81// varint62 format.
82const QuicPacketNumber kLargestIetfLargestObserved =
83 QuicPacketNumber(UINT64_C(0x3fffffffffffffff));
84// Encodings for the two bits in a VarInt62 that
85// describe the length of the VarInt61. For binary packet
86// formats in this file, the convention is to code the
87// first byte as
88// kVarInt62FourBytes + 0x<value_in_that_byte>
89const uint8_t kVarInt62OneByte = 0x00;
90const uint8_t kVarInt62TwoBytes = 0x40;
91const uint8_t kVarInt62FourBytes = 0x80;
92const uint8_t kVarInt62EightBytes = 0xc0;
93
94class TestEncrypter : public QuicEncrypter {
95 public:
96 ~TestEncrypter() override {}
vasilvvc872ee42020-10-07 19:50:22 -070097 bool SetKey(absl::string_view /*key*/) override { return true; }
98 bool SetNoncePrefix(absl::string_view /*nonce_prefix*/) override {
dschinazi17d42422019-06-18 16:35:07 -070099 return true;
100 }
vasilvvc872ee42020-10-07 19:50:22 -0700101 bool SetIV(absl::string_view /*iv*/) override { return true; }
102 bool SetHeaderProtectionKey(absl::string_view /*key*/) override {
dmcardlecf0bfcf2019-12-13 08:08:21 -0800103 return true;
104 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500105 bool EncryptPacket(uint64_t packet_number,
vasilvvc872ee42020-10-07 19:50:22 -0700106 absl::string_view associated_data,
107 absl::string_view plaintext,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500108 char* output,
109 size_t* output_length,
dschinazi17d42422019-06-18 16:35:07 -0700110 size_t /*max_output_length*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500111 packet_number_ = QuicPacketNumber(packet_number);
vasilvvc48c8712019-03-11 13:38:16 -0700112 associated_data_ = std::string(associated_data);
113 plaintext_ = std::string(plaintext);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500114 memcpy(output, plaintext.data(), plaintext.length());
115 *output_length = plaintext.length();
116 return true;
117 }
dschinazi17d42422019-06-18 16:35:07 -0700118 std::string GenerateHeaderProtectionMask(
vasilvvc872ee42020-10-07 19:50:22 -0700119 absl::string_view /*sample*/) override {
QUICHE team2d187972019-03-19 16:23:47 -0700120 return std::string(5, 0);
121 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500122 size_t GetKeySize() const override { return 0; }
123 size_t GetNoncePrefixSize() const override { return 0; }
124 size_t GetIVSize() const override { return 0; }
125 size_t GetMaxPlaintextSize(size_t ciphertext_size) const override {
126 return ciphertext_size;
127 }
128 size_t GetCiphertextSize(size_t plaintext_size) const override {
129 return plaintext_size;
130 }
mattmd0744852020-10-16 14:42:01 -0700131 QuicPacketCount GetConfidentialityLimit() const override {
132 return std::numeric_limits<QuicPacketCount>::max();
133 }
vasilvvc872ee42020-10-07 19:50:22 -0700134 absl::string_view GetKey() const override { return absl::string_view(); }
135 absl::string_view GetNoncePrefix() const override {
136 return absl::string_view();
dmcardlecf0bfcf2019-12-13 08:08:21 -0800137 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500138
139 QuicPacketNumber packet_number_;
vasilvvc48c8712019-03-11 13:38:16 -0700140 std::string associated_data_;
141 std::string plaintext_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500142};
143
144class TestDecrypter : public QuicDecrypter {
145 public:
146 ~TestDecrypter() override {}
vasilvvc872ee42020-10-07 19:50:22 -0700147 bool SetKey(absl::string_view /*key*/) override { return true; }
148 bool SetNoncePrefix(absl::string_view /*nonce_prefix*/) override {
dschinazi17d42422019-06-18 16:35:07 -0700149 return true;
150 }
vasilvvc872ee42020-10-07 19:50:22 -0700151 bool SetIV(absl::string_view /*iv*/) override { return true; }
152 bool SetHeaderProtectionKey(absl::string_view /*key*/) override {
dmcardlecf0bfcf2019-12-13 08:08:21 -0800153 return true;
154 }
vasilvvc872ee42020-10-07 19:50:22 -0700155 bool SetPreliminaryKey(absl::string_view /*key*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500156 QUIC_BUG << "should not be called";
157 return false;
158 }
dschinazi17d42422019-06-18 16:35:07 -0700159 bool SetDiversificationNonce(const DiversificationNonce& /*key*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500160 return true;
161 }
162 bool DecryptPacket(uint64_t packet_number,
vasilvvc872ee42020-10-07 19:50:22 -0700163 absl::string_view associated_data,
164 absl::string_view ciphertext,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500165 char* output,
166 size_t* output_length,
dschinazi17d42422019-06-18 16:35:07 -0700167 size_t /*max_output_length*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500168 packet_number_ = QuicPacketNumber(packet_number);
vasilvvc48c8712019-03-11 13:38:16 -0700169 associated_data_ = std::string(associated_data);
170 ciphertext_ = std::string(ciphertext);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500171 memcpy(output, ciphertext.data(), ciphertext.length());
172 *output_length = ciphertext.length();
173 return true;
174 }
QUICHE team2d187972019-03-19 16:23:47 -0700175 std::string GenerateHeaderProtectionMask(
dschinazi17d42422019-06-18 16:35:07 -0700176 QuicDataReader* /*sample_reader*/) override {
QUICHE team2d187972019-03-19 16:23:47 -0700177 return std::string(5, 0);
178 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500179 size_t GetKeySize() const override { return 0; }
nharper965e5922019-09-23 22:33:54 -0700180 size_t GetNoncePrefixSize() const override { return 0; }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500181 size_t GetIVSize() const override { return 0; }
vasilvvc872ee42020-10-07 19:50:22 -0700182 absl::string_view GetKey() const override { return absl::string_view(); }
183 absl::string_view GetNoncePrefix() const override {
184 return absl::string_view();
dmcardlecf0bfcf2019-12-13 08:08:21 -0800185 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500186 // Use a distinct value starting with 0xFFFFFF, which is never used by TLS.
187 uint32_t cipher_id() const override { return 0xFFFFFFF2; }
mattm8238ffb2020-10-19 12:42:27 -0700188 QuicPacketCount GetIntegrityLimit() const override {
189 return std::numeric_limits<QuicPacketCount>::max();
190 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500191 QuicPacketNumber packet_number_;
vasilvvc48c8712019-03-11 13:38:16 -0700192 std::string associated_data_;
193 std::string ciphertext_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500194};
195
mattm072a7e32020-10-09 16:16:56 -0700196std::unique_ptr<QuicEncryptedPacket> EncryptPacketWithTagAndPhase(
197 const QuicPacket& packet,
198 uint8_t tag,
199 bool phase) {
200 std::string packet_data = std::string(packet.AsStringPiece());
201 if (phase) {
202 packet_data[0] |= FLAGS_KEY_PHASE_BIT;
203 } else {
204 packet_data[0] &= ~FLAGS_KEY_PHASE_BIT;
205 }
206
207 TaggingEncrypter crypter(tag);
208 const size_t packet_size = crypter.GetCiphertextSize(packet_data.size());
209 char* buffer = new char[packet_size];
210 size_t buf_len = 0;
vasilvvb16f7962020-10-13 10:48:38 -0700211 if (!crypter.EncryptPacket(0, absl::string_view(), packet_data, buffer,
212 &buf_len, packet_size)) {
mattm072a7e32020-10-09 16:16:56 -0700213 delete[] buffer;
214 return nullptr;
215 }
216
217 return std::make_unique<QuicEncryptedPacket>(buffer, buf_len,
218 /*owns_buffer=*/true);
219}
220
QUICHE teama6ef0a62019-03-07 20:34:33 -0500221class TestQuicVisitor : public QuicFramerVisitorInterface {
222 public:
223 TestQuicVisitor()
224 : error_count_(0),
225 version_mismatch_(0),
226 packet_count_(0),
227 frame_count_(0),
228 complete_packets_(0),
mattm072a7e32020-10-09 16:16:56 -0700229 derive_next_key_count_(0),
230 decrypted_first_packet_in_key_phase_count_(0),
QUICHE teama6ef0a62019-03-07 20:34:33 -0500231 accept_packet_(true),
232 accept_public_header_(true) {}
233
234 ~TestQuicVisitor() override {}
235
236 void OnError(QuicFramer* f) override {
237 QUIC_DLOG(INFO) << "QuicFramer Error: " << QuicErrorCodeToString(f->error())
238 << " (" << f->error() << ")";
239 ++error_count_;
240 }
241
242 void OnPacket() override {}
243
244 void OnPublicResetPacket(const QuicPublicResetPacket& packet) override {
vasilvv0fc587f2019-09-06 13:33:08 -0700245 public_reset_packet_ = std::make_unique<QuicPublicResetPacket>((packet));
fkastenholza3660102019-08-28 05:19:24 -0700246 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500247 }
248
249 void OnVersionNegotiationPacket(
250 const QuicVersionNegotiationPacket& packet) override {
251 version_negotiation_packet_ =
vasilvv0fc587f2019-09-06 13:33:08 -0700252 std::make_unique<QuicVersionNegotiationPacket>((packet));
fkastenholza3660102019-08-28 05:19:24 -0700253 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500254 }
255
dschinazi244f6dc2019-05-06 15:45:16 -0700256 void OnRetryPacket(QuicConnectionId original_connection_id,
257 QuicConnectionId new_connection_id,
vasilvvc872ee42020-10-07 19:50:22 -0700258 absl::string_view retry_token,
259 absl::string_view retry_integrity_tag,
260 absl::string_view retry_without_tag) override {
dschinazi2dd75ee2020-01-29 09:21:37 -0800261 on_retry_packet_called_ = true;
dschinazi244f6dc2019-05-06 15:45:16 -0700262 retry_original_connection_id_ =
vasilvv0fc587f2019-09-06 13:33:08 -0700263 std::make_unique<QuicConnectionId>(original_connection_id);
dschinazi244f6dc2019-05-06 15:45:16 -0700264 retry_new_connection_id_ =
vasilvv0fc587f2019-09-06 13:33:08 -0700265 std::make_unique<QuicConnectionId>(new_connection_id);
266 retry_token_ = std::make_unique<std::string>(std::string(retry_token));
dschinazi278efae2020-01-28 17:03:09 -0800267 retry_token_integrity_tag_ =
268 std::make_unique<std::string>(std::string(retry_integrity_tag));
269 retry_without_tag_ =
270 std::make_unique<std::string>(std::string(retry_without_tag));
fkastenholza3660102019-08-28 05:19:24 -0700271 EXPECT_EQ(0u, framer_->current_received_frame_type());
dschinazi244f6dc2019-05-06 15:45:16 -0700272 }
273
fayang8aba1ff2019-06-21 12:00:54 -0700274 bool OnProtocolVersionMismatch(ParsedQuicVersion received_version) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500275 QUIC_DLOG(INFO) << "QuicFramer Version Mismatch, version: "
276 << received_version;
277 ++version_mismatch_;
fkastenholza3660102019-08-28 05:19:24 -0700278 EXPECT_EQ(0u, framer_->current_received_frame_type());
dschinazi48ac9192019-07-31 00:07:26 -0700279 return false;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500280 }
281
282 bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override {
vasilvv0fc587f2019-09-06 13:33:08 -0700283 header_ = std::make_unique<QuicPacketHeader>((header));
fkastenholza3660102019-08-28 05:19:24 -0700284 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500285 return accept_public_header_;
286 }
287
dschinazi17d42422019-06-18 16:35:07 -0700288 bool OnUnauthenticatedHeader(const QuicPacketHeader& /*header*/) override {
fkastenholza3660102019-08-28 05:19:24 -0700289 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500290 return true;
291 }
292
fayang93b4e4d2020-11-25 07:56:47 -0800293 void OnDecryptedPacket(size_t /*length*/,
294 EncryptionLevel /*level*/) override {
fkastenholza3660102019-08-28 05:19:24 -0700295 EXPECT_EQ(0u, framer_->current_received_frame_type());
296 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500297
298 bool OnPacketHeader(const QuicPacketHeader& header) override {
299 ++packet_count_;
vasilvv0fc587f2019-09-06 13:33:08 -0700300 header_ = std::make_unique<QuicPacketHeader>((header));
fkastenholza3660102019-08-28 05:19:24 -0700301 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500302 return accept_packet_;
303 }
304
305 void OnCoalescedPacket(const QuicEncryptedPacket& packet) override {
dschinazi4b5a68a2019-08-15 15:45:36 -0700306 coalesced_packets_.push_back(packet.Clone());
307 }
308
309 void OnUndecryptablePacket(const QuicEncryptedPacket& packet,
310 EncryptionLevel decryption_level,
311 bool has_decryption_key) override {
312 undecryptable_packets_.push_back(packet.Clone());
313 undecryptable_decryption_levels_.push_back(decryption_level);
314 undecryptable_has_decryption_keys_.push_back(has_decryption_key);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500315 }
316
317 bool OnStreamFrame(const QuicStreamFrame& frame) override {
318 ++frame_count_;
319 // Save a copy of the data so it is valid after the packet is processed.
vasilvvc48c8712019-03-11 13:38:16 -0700320 std::string* string_data =
321 new std::string(frame.data_buffer, frame.data_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500322 stream_data_.push_back(QuicWrapUnique(string_data));
vasilvv0fc587f2019-09-06 13:33:08 -0700323 stream_frames_.push_back(std::make_unique<QuicStreamFrame>(
QUICHE teama6ef0a62019-03-07 20:34:33 -0500324 frame.stream_id, frame.fin, frame.offset, *string_data));
fkastenholza3660102019-08-28 05:19:24 -0700325 if (VersionHasIetfQuicFrames(transport_version_)) {
326 // Low order bits of type encode flags, ignore them for this test.
327 EXPECT_TRUE(IS_IETF_STREAM_FRAME(framer_->current_received_frame_type()));
328 } else {
329 EXPECT_EQ(0u, framer_->current_received_frame_type());
330 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500331 return true;
332 }
333
334 bool OnCryptoFrame(const QuicCryptoFrame& frame) override {
335 ++frame_count_;
336 // Save a copy of the data so it is valid after the packet is processed.
vasilvvc48c8712019-03-11 13:38:16 -0700337 std::string* string_data =
338 new std::string(frame.data_buffer, frame.data_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500339 crypto_data_.push_back(QuicWrapUnique(string_data));
vasilvv0fc587f2019-09-06 13:33:08 -0700340 crypto_frames_.push_back(std::make_unique<QuicCryptoFrame>(
renjietang15dfaa82020-01-03 16:13:38 -0800341 frame.level, frame.offset, *string_data));
fkastenholza3660102019-08-28 05:19:24 -0700342 if (VersionHasIetfQuicFrames(transport_version_)) {
343 EXPECT_EQ(IETF_CRYPTO, framer_->current_received_frame_type());
344 } else {
345 EXPECT_EQ(0u, framer_->current_received_frame_type());
346 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500347 return true;
348 }
349
350 bool OnAckFrameStart(QuicPacketNumber largest_acked,
351 QuicTime::Delta ack_delay_time) override {
352 ++frame_count_;
353 QuicAckFrame ack_frame;
354 ack_frame.largest_acked = largest_acked;
355 ack_frame.ack_delay_time = ack_delay_time;
vasilvv0fc587f2019-09-06 13:33:08 -0700356 ack_frames_.push_back(std::make_unique<QuicAckFrame>(ack_frame));
fkastenholza3660102019-08-28 05:19:24 -0700357 if (VersionHasIetfQuicFrames(transport_version_)) {
fayang91c23d72020-03-09 12:35:05 -0700358 EXPECT_TRUE(IETF_ACK == framer_->current_received_frame_type() ||
359 IETF_ACK_ECN == framer_->current_received_frame_type());
fkastenholza3660102019-08-28 05:19:24 -0700360 } else {
361 EXPECT_EQ(0u, framer_->current_received_frame_type());
362 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500363 return true;
364 }
365
366 bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) override {
367 DCHECK(!ack_frames_.empty());
368 ack_frames_[ack_frames_.size() - 1]->packets.AddRange(start, end);
fkastenholza3660102019-08-28 05:19:24 -0700369 if (VersionHasIetfQuicFrames(transport_version_)) {
fayang91c23d72020-03-09 12:35:05 -0700370 EXPECT_TRUE(IETF_ACK == framer_->current_received_frame_type() ||
371 IETF_ACK_ECN == framer_->current_received_frame_type());
fkastenholza3660102019-08-28 05:19:24 -0700372 } else {
373 EXPECT_EQ(0u, framer_->current_received_frame_type());
374 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500375 return true;
376 }
377
378 bool OnAckTimestamp(QuicPacketNumber packet_number,
379 QuicTime timestamp) override {
380 ack_frames_[ack_frames_.size() - 1]->received_packet_times.push_back(
381 std::make_pair(packet_number, timestamp));
fkastenholza3660102019-08-28 05:19:24 -0700382 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500383 return true;
384 }
385
386 bool OnAckFrameEnd(QuicPacketNumber /*start*/) override { return true; }
387
388 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override {
389 ++frame_count_;
vasilvv0fc587f2019-09-06 13:33:08 -0700390 stop_waiting_frames_.push_back(
391 std::make_unique<QuicStopWaitingFrame>(frame));
fkastenholza3660102019-08-28 05:19:24 -0700392 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500393 return true;
394 }
395
396 bool OnPaddingFrame(const QuicPaddingFrame& frame) override {
vasilvv0fc587f2019-09-06 13:33:08 -0700397 padding_frames_.push_back(std::make_unique<QuicPaddingFrame>(frame));
fkastenholza3660102019-08-28 05:19:24 -0700398 if (VersionHasIetfQuicFrames(transport_version_)) {
399 EXPECT_EQ(IETF_PADDING, framer_->current_received_frame_type());
400 } else {
401 EXPECT_EQ(0u, framer_->current_received_frame_type());
402 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500403 return true;
404 }
405
406 bool OnPingFrame(const QuicPingFrame& frame) override {
407 ++frame_count_;
vasilvv0fc587f2019-09-06 13:33:08 -0700408 ping_frames_.push_back(std::make_unique<QuicPingFrame>(frame));
fkastenholza3660102019-08-28 05:19:24 -0700409 if (VersionHasIetfQuicFrames(transport_version_)) {
410 EXPECT_EQ(IETF_PING, framer_->current_received_frame_type());
411 } else {
412 EXPECT_EQ(0u, framer_->current_received_frame_type());
413 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500414 return true;
415 }
416
417 bool OnMessageFrame(const QuicMessageFrame& frame) override {
418 ++frame_count_;
419 message_frames_.push_back(
vasilvv0fc587f2019-09-06 13:33:08 -0700420 std::make_unique<QuicMessageFrame>(frame.data, frame.message_length));
fkastenholza3660102019-08-28 05:19:24 -0700421 if (VersionHasIetfQuicFrames(transport_version_)) {
dschinazicd86dd12019-11-14 10:11:13 -0800422 EXPECT_TRUE(IETF_EXTENSION_MESSAGE_NO_LENGTH_V99 ==
fkastenholza3660102019-08-28 05:19:24 -0700423 framer_->current_received_frame_type() ||
dschinazicd86dd12019-11-14 10:11:13 -0800424 IETF_EXTENSION_MESSAGE_V99 ==
fkastenholza3660102019-08-28 05:19:24 -0700425 framer_->current_received_frame_type());
426 } else {
427 EXPECT_EQ(0u, framer_->current_received_frame_type());
428 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500429 return true;
430 }
431
fayang01062942020-01-22 07:23:23 -0800432 bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) override {
433 ++frame_count_;
434 handshake_done_frames_.push_back(
435 std::make_unique<QuicHandshakeDoneFrame>(frame));
436 DCHECK(VersionHasIetfQuicFrames(transport_version_));
437 EXPECT_EQ(IETF_HANDSHAKE_DONE, framer_->current_received_frame_type());
438 return true;
439 }
440
haoyuewang6a6a0ff2020-06-23 16:32:26 -0700441 bool OnAckFrequencyFrame(const QuicAckFrequencyFrame& frame) override {
442 ++frame_count_;
443 ack_frequency_frames_.emplace_back(
444 std::make_unique<QuicAckFrequencyFrame>(frame));
445 DCHECK(VersionHasIetfQuicFrames(transport_version_));
446 EXPECT_EQ(IETF_ACK_FREQUENCY, framer_->current_received_frame_type());
447 return true;
448 }
449
QUICHE teama6ef0a62019-03-07 20:34:33 -0500450 void OnPacketComplete() override { ++complete_packets_; }
451
452 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override {
453 rst_stream_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700454 if (VersionHasIetfQuicFrames(transport_version_)) {
455 EXPECT_EQ(IETF_RST_STREAM, framer_->current_received_frame_type());
456 } else {
457 EXPECT_EQ(0u, framer_->current_received_frame_type());
458 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500459 return true;
460 }
461
462 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override {
463 connection_close_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700464 if (VersionHasIetfQuicFrames(transport_version_)) {
465 EXPECT_NE(GOOGLE_QUIC_CONNECTION_CLOSE, frame.close_type);
466 if (frame.close_type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
467 EXPECT_EQ(IETF_CONNECTION_CLOSE,
468 framer_->current_received_frame_type());
469 } else {
470 EXPECT_EQ(IETF_APPLICATION_CLOSE,
471 framer_->current_received_frame_type());
472 }
473 } else {
474 EXPECT_EQ(0u, framer_->current_received_frame_type());
475 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500476 return true;
477 }
478
QUICHE teama6ef0a62019-03-07 20:34:33 -0500479 bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override {
480 stop_sending_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700481 EXPECT_EQ(IETF_STOP_SENDING, framer_->current_received_frame_type());
482 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500483 return true;
484 }
485
486 bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override {
487 path_challenge_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700488 EXPECT_EQ(IETF_PATH_CHALLENGE, framer_->current_received_frame_type());
489 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500490 return true;
491 }
492
493 bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override {
494 path_response_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700495 EXPECT_EQ(IETF_PATH_RESPONSE, framer_->current_received_frame_type());
496 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500497 return true;
498 }
499
500 bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override {
501 goaway_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700502 EXPECT_FALSE(VersionHasIetfQuicFrames(transport_version_));
503 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500504 return true;
505 }
506
fkastenholz3c4eabf2019-04-22 07:49:59 -0700507 bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& frame) override {
508 max_streams_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700509 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
510 EXPECT_TRUE(IETF_MAX_STREAMS_UNIDIRECTIONAL ==
511 framer_->current_received_frame_type() ||
512 IETF_MAX_STREAMS_BIDIRECTIONAL ==
513 framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500514 return true;
515 }
516
fkastenholz3c4eabf2019-04-22 07:49:59 -0700517 bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame) override {
518 streams_blocked_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700519 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
520 EXPECT_TRUE(IETF_STREAMS_BLOCKED_UNIDIRECTIONAL ==
521 framer_->current_received_frame_type() ||
522 IETF_STREAMS_BLOCKED_BIDIRECTIONAL ==
523 framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500524 return true;
525 }
526
527 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override {
528 window_update_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700529 if (VersionHasIetfQuicFrames(transport_version_)) {
530 EXPECT_TRUE(IETF_MAX_DATA == framer_->current_received_frame_type() ||
531 IETF_MAX_STREAM_DATA ==
532 framer_->current_received_frame_type());
533 } else {
534 EXPECT_EQ(0u, framer_->current_received_frame_type());
535 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500536 return true;
537 }
538
539 bool OnBlockedFrame(const QuicBlockedFrame& frame) override {
540 blocked_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700541 if (VersionHasIetfQuicFrames(transport_version_)) {
ianswett2f077442019-12-12 11:51:24 -0800542 EXPECT_TRUE(IETF_DATA_BLOCKED == framer_->current_received_frame_type() ||
543 IETF_STREAM_DATA_BLOCKED ==
fkastenholza3660102019-08-28 05:19:24 -0700544 framer_->current_received_frame_type());
545 } else {
546 EXPECT_EQ(0u, framer_->current_received_frame_type());
547 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500548 return true;
549 }
550
551 bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override {
552 new_connection_id_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700553 EXPECT_EQ(IETF_NEW_CONNECTION_ID, framer_->current_received_frame_type());
554 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500555 return true;
556 }
557
558 bool OnRetireConnectionIdFrame(
559 const QuicRetireConnectionIdFrame& frame) override {
fkastenholza3660102019-08-28 05:19:24 -0700560 EXPECT_EQ(IETF_RETIRE_CONNECTION_ID,
561 framer_->current_received_frame_type());
562 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500563 retire_connection_id_ = frame;
564 return true;
565 }
566
567 bool OnNewTokenFrame(const QuicNewTokenFrame& frame) override {
568 new_token_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700569 EXPECT_EQ(IETF_NEW_TOKEN, framer_->current_received_frame_type());
570 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500571 return true;
572 }
573
574 bool IsValidStatelessResetToken(QuicUint128 token) const override {
fkastenholza3660102019-08-28 05:19:24 -0700575 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500576 return token == kTestStatelessResetToken;
577 }
578
579 void OnAuthenticatedIetfStatelessResetPacket(
580 const QuicIetfStatelessResetPacket& packet) override {
581 stateless_reset_packet_ =
vasilvv0fc587f2019-09-06 13:33:08 -0700582 std::make_unique<QuicIetfStatelessResetPacket>(packet);
fkastenholza3660102019-08-28 05:19:24 -0700583 EXPECT_EQ(0u, framer_->current_received_frame_type());
584 }
585
mattm5c7090d2020-10-19 10:36:43 -0700586 void OnKeyUpdate(KeyUpdateReason reason) override {
587 key_update_reasons_.push_back(reason);
588 }
mattm072a7e32020-10-09 16:16:56 -0700589
590 void OnDecryptedFirstPacketInKeyPhase() override {
591 decrypted_first_packet_in_key_phase_count_++;
592 }
593
594 std::unique_ptr<QuicDecrypter> AdvanceKeysAndCreateCurrentOneRttDecrypter()
595 override {
596 derive_next_key_count_++;
597 return std::make_unique<StrictTaggingDecrypter>(derive_next_key_count_);
598 }
599 std::unique_ptr<QuicEncrypter> CreateCurrentOneRttEncrypter() override {
600 return std::make_unique<TaggingEncrypter>(derive_next_key_count_);
601 }
602
fkastenholza3660102019-08-28 05:19:24 -0700603 void set_framer(QuicFramer* framer) {
604 framer_ = framer;
605 transport_version_ = framer->transport_version();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500606 }
607
mattm5c7090d2020-10-19 10:36:43 -0700608 size_t key_update_count() const { return key_update_reasons_.size(); }
609
QUICHE teama6ef0a62019-03-07 20:34:33 -0500610 // Counters from the visitor_ callbacks.
611 int error_count_;
612 int version_mismatch_;
613 int packet_count_;
614 int frame_count_;
615 int complete_packets_;
mattm5c7090d2020-10-19 10:36:43 -0700616 std::vector<KeyUpdateReason> key_update_reasons_;
mattm072a7e32020-10-09 16:16:56 -0700617 int derive_next_key_count_;
618 int decrypted_first_packet_in_key_phase_count_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500619 bool accept_packet_;
620 bool accept_public_header_;
621
622 std::unique_ptr<QuicPacketHeader> header_;
623 std::unique_ptr<QuicPublicResetPacket> public_reset_packet_;
624 std::unique_ptr<QuicIetfStatelessResetPacket> stateless_reset_packet_;
625 std::unique_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_;
dschinazi244f6dc2019-05-06 15:45:16 -0700626 std::unique_ptr<QuicConnectionId> retry_original_connection_id_;
627 std::unique_ptr<QuicConnectionId> retry_new_connection_id_;
628 std::unique_ptr<std::string> retry_token_;
dschinazi278efae2020-01-28 17:03:09 -0800629 std::unique_ptr<std::string> retry_token_integrity_tag_;
630 std::unique_ptr<std::string> retry_without_tag_;
dschinazi2dd75ee2020-01-29 09:21:37 -0800631 bool on_retry_packet_called_ = false;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500632 std::vector<std::unique_ptr<QuicStreamFrame>> stream_frames_;
633 std::vector<std::unique_ptr<QuicCryptoFrame>> crypto_frames_;
634 std::vector<std::unique_ptr<QuicAckFrame>> ack_frames_;
635 std::vector<std::unique_ptr<QuicStopWaitingFrame>> stop_waiting_frames_;
636 std::vector<std::unique_ptr<QuicPaddingFrame>> padding_frames_;
637 std::vector<std::unique_ptr<QuicPingFrame>> ping_frames_;
638 std::vector<std::unique_ptr<QuicMessageFrame>> message_frames_;
fayang01062942020-01-22 07:23:23 -0800639 std::vector<std::unique_ptr<QuicHandshakeDoneFrame>> handshake_done_frames_;
haoyuewang6a6a0ff2020-06-23 16:32:26 -0700640 std::vector<std::unique_ptr<QuicAckFrequencyFrame>> ack_frequency_frames_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500641 std::vector<std::unique_ptr<QuicEncryptedPacket>> coalesced_packets_;
dschinazi4b5a68a2019-08-15 15:45:36 -0700642 std::vector<std::unique_ptr<QuicEncryptedPacket>> undecryptable_packets_;
643 std::vector<EncryptionLevel> undecryptable_decryption_levels_;
644 std::vector<bool> undecryptable_has_decryption_keys_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500645 QuicRstStreamFrame rst_stream_frame_;
646 QuicConnectionCloseFrame connection_close_frame_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500647 QuicStopSendingFrame stop_sending_frame_;
648 QuicGoAwayFrame goaway_frame_;
649 QuicPathChallengeFrame path_challenge_frame_;
650 QuicPathResponseFrame path_response_frame_;
651 QuicWindowUpdateFrame window_update_frame_;
652 QuicBlockedFrame blocked_frame_;
fkastenholz3c4eabf2019-04-22 07:49:59 -0700653 QuicStreamsBlockedFrame streams_blocked_frame_;
654 QuicMaxStreamsFrame max_streams_frame_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500655 QuicNewConnectionIdFrame new_connection_id_;
656 QuicRetireConnectionIdFrame retire_connection_id_;
657 QuicNewTokenFrame new_token_;
vasilvvc48c8712019-03-11 13:38:16 -0700658 std::vector<std::unique_ptr<std::string>> stream_data_;
659 std::vector<std::unique_ptr<std::string>> crypto_data_;
fkastenholza3660102019-08-28 05:19:24 -0700660 QuicTransportVersion transport_version_;
661 QuicFramer* framer_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500662};
663
664// Simple struct for defining a packet's content, and associated
665// parse error.
666struct PacketFragment {
vasilvvc48c8712019-03-11 13:38:16 -0700667 std::string error_if_missing;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500668 std::vector<unsigned char> fragment;
669};
670
671using PacketFragments = std::vector<struct PacketFragment>;
672
QUICHE teama6ef0a62019-03-07 20:34:33 -0500673class QuicFramerTest : public QuicTestWithParam<ParsedQuicVersion> {
674 public:
675 QuicFramerTest()
676 : encrypter_(new test::TestEncrypter()),
677 decrypter_(new test::TestDecrypter()),
678 version_(GetParam()),
679 start_(QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(0x10)),
nharperf5e68452019-05-29 17:24:18 -0700680 framer_(AllSupportedVersions(),
QUICHE teama6ef0a62019-03-07 20:34:33 -0500681 start_,
682 Perspective::IS_SERVER,
683 kQuicDefaultConnectionIdLength) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500684 framer_.set_version(version_);
zhongyi546cc452019-04-12 15:27:49 -0700685 if (framer_.version().KnowsWhichDecrypterToUse()) {
686 framer_.InstallDecrypter(ENCRYPTION_INITIAL,
687 std::unique_ptr<QuicDecrypter>(decrypter_));
688 } else {
689 framer_.SetDecrypter(ENCRYPTION_INITIAL,
690 std::unique_ptr<QuicDecrypter>(decrypter_));
691 }
QUICHE team6987b4a2019-03-15 16:23:04 -0700692 framer_.SetEncrypter(ENCRYPTION_INITIAL,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500693 std::unique_ptr<QuicEncrypter>(encrypter_));
694
695 framer_.set_visitor(&visitor_);
696 framer_.InferPacketHeaderTypeFromVersion();
fkastenholza3660102019-08-28 05:19:24 -0700697 visitor_.set_framer(&framer_);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500698 }
699
zhongyi546cc452019-04-12 15:27:49 -0700700 void SetDecrypterLevel(EncryptionLevel level) {
701 if (!framer_.version().KnowsWhichDecrypterToUse()) {
702 return;
703 }
704 decrypter_ = new TestDecrypter();
705 framer_.InstallDecrypter(level, std::unique_ptr<QuicDecrypter>(decrypter_));
706 }
707
QUICHE teama6ef0a62019-03-07 20:34:33 -0500708 // Helper function to get unsigned char representation of the handshake
rcha702be22019-08-30 15:20:12 -0700709 // protocol byte at position |pos| of the current QUIC version number.
710 unsigned char GetQuicVersionByte(int pos) {
711 return (CreateQuicVersionLabel(version_) >> 8 * (3 - pos)) & 0xff;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500712 }
713
714 bool CheckEncryption(QuicPacketNumber packet_number, QuicPacket* packet) {
715 if (packet_number != encrypter_->packet_number_) {
716 QUIC_LOG(ERROR) << "Encrypted incorrect packet number. expected "
717 << packet_number
718 << " actual: " << encrypter_->packet_number_;
719 return false;
720 }
721 if (packet->AssociatedData(framer_.transport_version()) !=
722 encrypter_->associated_data_) {
723 QUIC_LOG(ERROR) << "Encrypted incorrect associated data. expected "
724 << packet->AssociatedData(framer_.transport_version())
725 << " actual: " << encrypter_->associated_data_;
726 return false;
727 }
728 if (packet->Plaintext(framer_.transport_version()) !=
729 encrypter_->plaintext_) {
730 QUIC_LOG(ERROR) << "Encrypted incorrect plaintext data. expected "
731 << packet->Plaintext(framer_.transport_version())
732 << " actual: " << encrypter_->plaintext_;
733 return false;
734 }
735 return true;
736 }
737
738 bool CheckDecryption(const QuicEncryptedPacket& encrypted,
739 bool includes_version,
740 bool includes_diversification_nonce,
741 QuicConnectionIdLength destination_connection_id_length,
742 QuicConnectionIdLength source_connection_id_length) {
743 return CheckDecryption(
744 encrypted, includes_version, includes_diversification_nonce,
745 destination_connection_id_length, source_connection_id_length,
746 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
747 }
748
749 bool CheckDecryption(
750 const QuicEncryptedPacket& encrypted,
751 bool includes_version,
752 bool includes_diversification_nonce,
753 QuicConnectionIdLength destination_connection_id_length,
754 QuicConnectionIdLength source_connection_id_length,
755 QuicVariableLengthIntegerLength retry_token_length_length,
756 size_t retry_token_length,
757 QuicVariableLengthIntegerLength length_length) {
758 if (visitor_.header_->packet_number != decrypter_->packet_number_) {
759 QUIC_LOG(ERROR) << "Decrypted incorrect packet number. expected "
760 << visitor_.header_->packet_number
761 << " actual: " << decrypter_->packet_number_;
762 return false;
763 }
vasilvvc872ee42020-10-07 19:50:22 -0700764 absl::string_view associated_data =
QUICHE teama6ef0a62019-03-07 20:34:33 -0500765 QuicFramer::GetAssociatedDataFromEncryptedPacket(
766 framer_.transport_version(), encrypted,
767 destination_connection_id_length, source_connection_id_length,
768 includes_version, includes_diversification_nonce,
769 PACKET_4BYTE_PACKET_NUMBER, retry_token_length_length,
770 retry_token_length, length_length);
771 if (associated_data != decrypter_->associated_data_) {
772 QUIC_LOG(ERROR) << "Decrypted incorrect associated data. expected "
vasilvv72b789c2020-10-27 17:39:17 -0700773 << absl::BytesToHexString(associated_data) << " actual: "
774 << absl::BytesToHexString(decrypter_->associated_data_);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500775 return false;
776 }
vasilvvc872ee42020-10-07 19:50:22 -0700777 absl::string_view ciphertext(
QUICHE teama6ef0a62019-03-07 20:34:33 -0500778 encrypted.AsStringPiece().substr(GetStartOfEncryptedData(
779 framer_.transport_version(), destination_connection_id_length,
780 source_connection_id_length, includes_version,
781 includes_diversification_nonce, PACKET_4BYTE_PACKET_NUMBER,
782 retry_token_length_length, retry_token_length, length_length)));
783 if (ciphertext != decrypter_->ciphertext_) {
784 QUIC_LOG(ERROR) << "Decrypted incorrect ciphertext data. expected "
vasilvv72b789c2020-10-27 17:39:17 -0700785 << absl::BytesToHexString(ciphertext) << " actual: "
786 << absl::BytesToHexString(decrypter_->ciphertext_)
QUICHE teama6ef0a62019-03-07 20:34:33 -0500787 << " associated data: "
vasilvv72b789c2020-10-27 17:39:17 -0700788 << absl::BytesToHexString(associated_data);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500789 return false;
790 }
791 return true;
792 }
793
794 char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); }
795
796 // Creates a new QuicEncryptedPacket by concatenating the various
797 // packet fragments in |fragments|.
798 std::unique_ptr<QuicEncryptedPacket> AssemblePacketFromFragments(
799 const PacketFragments& fragments) {
dschinazi66dea072019-04-09 11:41:06 -0700800 char* buffer = new char[kMaxOutgoingPacketSize + 1];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500801 size_t len = 0;
802 for (const auto& fragment : fragments) {
803 memcpy(buffer + len, fragment.fragment.data(), fragment.fragment.size());
804 len += fragment.fragment.size();
805 }
vasilvv0fc587f2019-09-06 13:33:08 -0700806 return std::make_unique<QuicEncryptedPacket>(buffer, len, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500807 }
808
809 void CheckFramingBoundaries(const PacketFragments& fragments,
810 QuicErrorCode error_code) {
811 std::unique_ptr<QuicEncryptedPacket> packet(
812 AssemblePacketFromFragments(fragments));
813 // Check all the various prefixes of |packet| for the expected
814 // parse error and error code.
815 for (size_t i = 0; i < packet->length(); ++i) {
vasilvvc48c8712019-03-11 13:38:16 -0700816 std::string expected_error;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500817 size_t len = 0;
818 for (const auto& fragment : fragments) {
819 len += fragment.fragment.size();
820 if (i < len) {
821 expected_error = fragment.error_if_missing;
822 break;
823 }
824 }
825
826 if (expected_error.empty())
827 continue;
828
829 CheckProcessingFails(*packet, i, expected_error, error_code);
830 }
831 }
832
833 void CheckProcessingFails(const QuicEncryptedPacket& packet,
834 size_t len,
vasilvvc48c8712019-03-11 13:38:16 -0700835 std::string expected_error,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500836 QuicErrorCode error_code) {
837 QuicEncryptedPacket encrypted(packet.data(), len, false);
838 EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
839 EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len;
840 EXPECT_EQ(error_code, framer_.error()) << "len: " << len;
841 }
842
843 void CheckProcessingFails(unsigned char* packet,
844 size_t len,
vasilvvc48c8712019-03-11 13:38:16 -0700845 std::string expected_error,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500846 QuicErrorCode error_code) {
847 QuicEncryptedPacket encrypted(AsChars(packet), len, false);
848 EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
849 EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len;
850 EXPECT_EQ(error_code, framer_.error()) << "len: " << len;
851 }
852
853 // Checks if the supplied string matches data in the supplied StreamFrame.
vasilvvc48c8712019-03-11 13:38:16 -0700854 void CheckStreamFrameData(std::string str, QuicStreamFrame* frame) {
855 EXPECT_EQ(str, std::string(frame->data_buffer, frame->data_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500856 }
857
858 void CheckCalculatePacketNumber(uint64_t expected_packet_number,
859 QuicPacketNumber last_packet_number) {
860 uint64_t wire_packet_number = expected_packet_number & kMask;
861 EXPECT_EQ(expected_packet_number,
862 QuicFramerPeer::CalculatePacketNumberFromWire(
863 &framer_, PACKET_4BYTE_PACKET_NUMBER, last_packet_number,
864 wire_packet_number))
865 << "last_packet_number: " << last_packet_number
866 << " wire_packet_number: " << wire_packet_number;
867 }
868
869 std::unique_ptr<QuicPacket> BuildDataPacket(const QuicPacketHeader& header,
870 const QuicFrames& frames) {
871 return BuildUnsizedDataPacket(&framer_, header, frames);
872 }
873
874 std::unique_ptr<QuicPacket> BuildDataPacket(const QuicPacketHeader& header,
875 const QuicFrames& frames,
876 size_t packet_size) {
877 return BuildUnsizedDataPacket(&framer_, header, frames, packet_size);
878 }
879
880 // N starts at 1.
881 QuicStreamId GetNthStreamid(QuicTransportVersion transport_version,
882 Perspective perspective,
883 bool bidirectional,
884 int n) {
885 if (bidirectional) {
886 return QuicUtils::GetFirstBidirectionalStreamId(transport_version,
887 perspective) +
888 ((n - 1) * QuicUtils::StreamIdDelta(transport_version));
889 }
890 // Unidirectional
891 return QuicUtils::GetFirstUnidirectionalStreamId(transport_version,
892 perspective) +
893 ((n - 1) * QuicUtils::StreamIdDelta(transport_version));
894 }
895
896 test::TestEncrypter* encrypter_;
897 test::TestDecrypter* decrypter_;
898 ParsedQuicVersion version_;
899 QuicTime start_;
900 QuicFramer framer_;
901 test::TestQuicVisitor visitor_;
902 SimpleBufferAllocator allocator_;
903};
904
905// Multiple test cases of QuicFramerTest use byte arrays to define packets for
906// testing, and these byte arrays contain the QUIC version. This macro explodes
907// the 32-bit version into four bytes in network order. Since it uses methods of
908// QuicFramerTest, it is only valid to use this in a QuicFramerTest.
rcha702be22019-08-30 15:20:12 -0700909#define QUIC_VERSION_BYTES \
910 GetQuicVersionByte(0), GetQuicVersionByte(1), GetQuicVersionByte(2), \
911 GetQuicVersionByte(3)
QUICHE teama6ef0a62019-03-07 20:34:33 -0500912
913// Run all framer tests with all supported versions of QUIC.
nharperf5e68452019-05-29 17:24:18 -0700914INSTANTIATE_TEST_SUITE_P(QuicFramerTests,
915 QuicFramerTest,
dschinazi98fc8d02019-09-17 23:34:49 -0700916 ::testing::ValuesIn(AllSupportedVersions()),
917 ::testing::PrintToStringParamName());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500918
919TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochStart) {
920 // A few quick manual sanity checks.
921 CheckCalculatePacketNumber(UINT64_C(1), QuicPacketNumber());
922 CheckCalculatePacketNumber(kEpoch + 1, QuicPacketNumber(kMask));
923 CheckCalculatePacketNumber(kEpoch, QuicPacketNumber(kMask));
924 for (uint64_t j = 0; j < 10; j++) {
925 CheckCalculatePacketNumber(j, QuicPacketNumber());
926 CheckCalculatePacketNumber(kEpoch - 1 - j, QuicPacketNumber());
927 }
928
929 // Cases where the last number was close to the start of the range.
930 for (QuicPacketNumber last = QuicPacketNumber(1); last < QuicPacketNumber(10);
931 last++) {
932 // Small numbers should not wrap (even if they're out of order).
933 for (uint64_t j = 0; j < 10; j++) {
934 CheckCalculatePacketNumber(j, last);
935 }
936
937 // Large numbers should not wrap either (because we're near 0 already).
938 for (uint64_t j = 0; j < 10; j++) {
939 CheckCalculatePacketNumber(kEpoch - 1 - j, last);
940 }
941 }
942}
943
944TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochEnd) {
945 // Cases where the last number was close to the end of the range
946 for (uint64_t i = 0; i < 10; i++) {
947 QuicPacketNumber last = QuicPacketNumber(kEpoch - i);
948
949 // Small numbers should wrap.
950 for (uint64_t j = 0; j < 10; j++) {
951 CheckCalculatePacketNumber(kEpoch + j, last);
952 }
953
954 // Large numbers should not (even if they're out of order).
955 for (uint64_t j = 0; j < 10; j++) {
956 CheckCalculatePacketNumber(kEpoch - 1 - j, last);
957 }
958 }
959}
960
961// Next check where we're in a non-zero epoch to verify we handle
962// reverse wrapping, too.
963TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearPrevEpoch) {
964 const uint64_t prev_epoch = 1 * kEpoch;
965 const uint64_t cur_epoch = 2 * kEpoch;
966 // Cases where the last number was close to the start of the range
967 for (uint64_t i = 0; i < 10; i++) {
968 QuicPacketNumber last = QuicPacketNumber(cur_epoch + i);
969 // Small number should not wrap (even if they're out of order).
970 for (uint64_t j = 0; j < 10; j++) {
971 CheckCalculatePacketNumber(cur_epoch + j, last);
972 }
973
974 // But large numbers should reverse wrap.
975 for (uint64_t j = 0; j < 10; j++) {
976 uint64_t num = kEpoch - 1 - j;
977 CheckCalculatePacketNumber(prev_epoch + num, last);
978 }
979 }
980}
981
982TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextEpoch) {
983 const uint64_t cur_epoch = 2 * kEpoch;
984 const uint64_t next_epoch = 3 * kEpoch;
985 // Cases where the last number was close to the end of the range
986 for (uint64_t i = 0; i < 10; i++) {
987 QuicPacketNumber last = QuicPacketNumber(next_epoch - 1 - i);
988
989 // Small numbers should wrap.
990 for (uint64_t j = 0; j < 10; j++) {
991 CheckCalculatePacketNumber(next_epoch + j, last);
992 }
993
994 // but large numbers should not (even if they're out of order).
995 for (uint64_t j = 0; j < 10; j++) {
996 uint64_t num = kEpoch - 1 - j;
997 CheckCalculatePacketNumber(cur_epoch + num, last);
998 }
999 }
1000}
1001
1002TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextMax) {
1003 const uint64_t max_number = std::numeric_limits<uint64_t>::max();
1004 const uint64_t max_epoch = max_number & ~kMask;
1005
1006 // Cases where the last number was close to the end of the range
1007 for (uint64_t i = 0; i < 10; i++) {
1008 // Subtract 1, because the expected next packet number is 1 more than the
1009 // last packet number.
1010 QuicPacketNumber last = QuicPacketNumber(max_number - i - 1);
1011
1012 // Small numbers should not wrap, because they have nowhere to go.
1013 for (uint64_t j = 0; j < 10; j++) {
1014 CheckCalculatePacketNumber(max_epoch + j, last);
1015 }
1016
1017 // Large numbers should not wrap either.
1018 for (uint64_t j = 0; j < 10; j++) {
1019 uint64_t num = kEpoch - 1 - j;
1020 CheckCalculatePacketNumber(max_epoch + num, last);
1021 }
1022 }
1023}
1024
1025TEST_P(QuicFramerTest, EmptyPacket) {
1026 char packet[] = {0x00};
1027 QuicEncryptedPacket encrypted(packet, 0, false);
1028 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07001029 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001030}
1031
1032TEST_P(QuicFramerTest, LargePacket) {
zhongyi546cc452019-04-12 15:27:49 -07001033 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001034 // clang-format off
dschinazie8d7fa72019-04-05 14:44:40 -07001035 unsigned char packet[kMaxIncomingPacketSize + 1] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001036 // public flags (8 byte connection_id)
1037 0x28,
1038 // connection_id
1039 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1040 // packet number
1041 0x78, 0x56, 0x34, 0x12,
1042 // private flags
1043 0x00,
1044 };
dschinazie8d7fa72019-04-05 14:44:40 -07001045 unsigned char packet46[kMaxIncomingPacketSize + 1] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001046 // type (short header 4 byte packet number)
1047 0x43,
1048 // connection_id
1049 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1050 // packet number
1051 0x78, 0x56, 0x34, 0x12,
1052 };
1053 // clang-format on
1054 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07001055 size_t p_size = ABSL_ARRAYSIZE(packet);
dschinaziceed8662020-07-14 09:37:05 -07001056 if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001057 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07001058 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001059 }
1060
1061 const size_t header_size = GetPacketHeaderSize(
1062 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
1063 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
1064 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
1065 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
1066
dschinazie8d7fa72019-04-05 14:44:40 -07001067 memset(p + header_size, 0, kMaxIncomingPacketSize - header_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001068
1069 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
dschinazie8d7fa72019-04-05 14:44:40 -07001070 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001071
1072 ASSERT_TRUE(visitor_.header_.get());
1073 // Make sure we've parsed the packet header, so we can send an error.
1074 EXPECT_EQ(FramerTestConnectionId(),
1075 visitor_.header_->destination_connection_id);
1076 // Make sure the correct error is propagated.
bncf6f82b12019-10-30 07:01:01 -07001077 EXPECT_THAT(framer_.error(), IsError(QUIC_PACKET_TOO_LARGE));
dschinazie8d7fa72019-04-05 14:44:40 -07001078 EXPECT_EQ("Packet too large.", framer_.detailed_error());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001079}
1080
1081TEST_P(QuicFramerTest, PacketHeader) {
dschinaziceed8662020-07-14 09:37:05 -07001082 if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001083 return;
1084 }
1085
1086 // clang-format off
1087 PacketFragments packet = {
1088 // public flags (8 byte connection_id)
1089 {"Unable to read public flags.",
1090 {0x28}},
1091 // connection_id
1092 {"Unable to read ConnectionId.",
1093 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1094 // packet number
1095 {"Unable to read packet number.",
1096 {0x12, 0x34, 0x56, 0x78}},
1097 };
1098 // clang-format on
1099
1100 PacketFragments& fragments = packet;
1101
1102 std::unique_ptr<QuicEncryptedPacket> encrypted(
1103 AssemblePacketFromFragments(fragments));
1104
1105 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001106 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001107 ASSERT_TRUE(visitor_.header_.get());
1108 EXPECT_EQ(FramerTestConnectionId(),
1109 visitor_.header_->destination_connection_id);
1110 EXPECT_FALSE(visitor_.header_->reset_flag);
1111 EXPECT_FALSE(visitor_.header_->version_flag);
1112 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1113
1114 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
fayangccbab732019-05-13 10:11:25 -07001115
1116 PacketHeaderFormat format;
fayange3f2f7b2019-09-19 17:01:57 -07001117 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
fayangccbab732019-05-13 10:11:25 -07001118 bool version_flag;
dschinazib42a8c52019-05-30 09:45:01 -07001119 QuicConnectionId destination_connection_id, source_connection_id;
fayangccbab732019-05-13 10:11:25 -07001120 QuicVersionLabel version_label;
1121 std::string detailed_error;
dschinazibf0413d2019-10-07 14:19:53 -07001122 bool retry_token_present, use_length_prefix;
vasilvvc872ee42020-10-07 19:50:22 -07001123 absl::string_view retry_token;
dschinazibf0413d2019-10-07 14:19:53 -07001124 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1125 const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1126 *encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1127 &version_flag, &use_length_prefix, &version_label, &parsed_version,
1128 &destination_connection_id, &source_connection_id, &retry_token_present,
1129 &retry_token, &detailed_error);
1130 EXPECT_FALSE(retry_token_present);
1131 EXPECT_FALSE(use_length_prefix);
bncf6f82b12019-10-30 07:01:01 -07001132 EXPECT_THAT(error_code, IsQuicNoError());
fayangccbab732019-05-13 10:11:25 -07001133 EXPECT_EQ(GOOGLE_QUIC_PACKET, format);
1134 EXPECT_FALSE(version_flag);
dschinazib42a8c52019-05-30 09:45:01 -07001135 EXPECT_EQ(kQuicDefaultConnectionIdLength, destination_connection_id.length());
fayangccbab732019-05-13 10:11:25 -07001136 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
dschinazib42a8c52019-05-30 09:45:01 -07001137 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001138}
1139
1140TEST_P(QuicFramerTest, LongPacketHeader) {
1141 // clang-format off
QUICHE teama6ef0a62019-03-07 20:34:33 -05001142 PacketFragments packet46 = {
dschinazibf0413d2019-10-07 14:19:53 -07001143 // type (long header with packet type ZERO_RTT)
dschinazi48ac9192019-07-31 00:07:26 -07001144 {"Unable to read first byte.",
dschinazibf0413d2019-10-07 14:19:53 -07001145 {0xD3}},
QUICHE teama6ef0a62019-03-07 20:34:33 -05001146 // version tag
1147 {"Unable to read protocol version.",
1148 {QUIC_VERSION_BYTES}},
1149 // connection_id length
1150 {"Unable to read ConnectionId length.",
1151 {0x50}},
1152 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001153 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001154 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1155 // packet number
1156 {"Unable to read packet number.",
1157 {0x12, 0x34, 0x56, 0x78}},
1158 };
1159 // clang-format on
1160
dschinaziceed8662020-07-14 09:37:05 -07001161 if (!framer_.version().HasIetfInvariantHeader() ||
QUICHE teama6ef0a62019-03-07 20:34:33 -05001162 QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
1163 return;
1164 }
1165
dschinazibf0413d2019-10-07 14:19:53 -07001166 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001167 std::unique_ptr<QuicEncryptedPacket> encrypted(
fayang36825da2019-08-21 14:01:27 -07001168 AssemblePacketFromFragments(packet46));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001169
1170 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001171 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001172 ASSERT_TRUE(visitor_.header_.get());
1173 EXPECT_EQ(FramerTestConnectionId(),
1174 visitor_.header_->destination_connection_id);
1175 EXPECT_FALSE(visitor_.header_->reset_flag);
1176 EXPECT_TRUE(visitor_.header_->version_flag);
1177 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1178
fayang36825da2019-08-21 14:01:27 -07001179 CheckFramingBoundaries(packet46, QUIC_INVALID_PACKET_HEADER);
fayangccbab732019-05-13 10:11:25 -07001180
1181 PacketHeaderFormat format;
fayange3f2f7b2019-09-19 17:01:57 -07001182 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
fayangccbab732019-05-13 10:11:25 -07001183 bool version_flag;
dschinazib42a8c52019-05-30 09:45:01 -07001184 QuicConnectionId destination_connection_id, source_connection_id;
fayangccbab732019-05-13 10:11:25 -07001185 QuicVersionLabel version_label;
1186 std::string detailed_error;
dschinazibf0413d2019-10-07 14:19:53 -07001187 bool retry_token_present, use_length_prefix;
vasilvvc872ee42020-10-07 19:50:22 -07001188 absl::string_view retry_token;
dschinazibf0413d2019-10-07 14:19:53 -07001189 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1190 const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1191 *encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1192 &version_flag, &use_length_prefix, &version_label, &parsed_version,
1193 &destination_connection_id, &source_connection_id, &retry_token_present,
1194 &retry_token, &detailed_error);
bncf6f82b12019-10-30 07:01:01 -07001195 EXPECT_THAT(error_code, IsQuicNoError());
dschinazibf0413d2019-10-07 14:19:53 -07001196 EXPECT_EQ("", detailed_error);
1197 EXPECT_FALSE(retry_token_present);
1198 EXPECT_FALSE(use_length_prefix);
fayangccbab732019-05-13 10:11:25 -07001199 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1200 EXPECT_TRUE(version_flag);
dschinazib42a8c52019-05-30 09:45:01 -07001201 EXPECT_EQ(kQuicDefaultConnectionIdLength, destination_connection_id.length());
fayangccbab732019-05-13 10:11:25 -07001202 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
dschinazib42a8c52019-05-30 09:45:01 -07001203 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1204}
1205
1206TEST_P(QuicFramerTest, LongPacketHeaderWithBothConnectionIds) {
dschinaziceed8662020-07-14 09:37:05 -07001207 if (!framer_.version().HasIetfInvariantHeader()) {
dschinazib42a8c52019-05-30 09:45:01 -07001208 // This test requires an IETF long header.
1209 return;
1210 }
dschinazib42a8c52019-05-30 09:45:01 -07001211 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
dschinazib42a8c52019-05-30 09:45:01 -07001212 // clang-format off
1213 unsigned char packet[] = {
1214 // public flags (long header with packet type ZERO_RTT_PROTECTED and
1215 // 4-byte packet number)
fayang36825da2019-08-21 14:01:27 -07001216 0xD3,
dschinazib42a8c52019-05-30 09:45:01 -07001217 // version
1218 QUIC_VERSION_BYTES,
1219 // connection ID lengths
1220 0x55,
1221 // destination connection ID
1222 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1223 // source connection ID
1224 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
dschinazibf0413d2019-10-07 14:19:53 -07001225 // packet number
1226 0x12, 0x34, 0x56, 0x00,
1227 // padding frame
1228 0x00,
1229 };
1230 unsigned char packet49[] = {
1231 // public flags (long header with packet type ZERO_RTT_PROTECTED and
1232 // 4-byte packet number)
1233 0xD3,
1234 // version
1235 QUIC_VERSION_BYTES,
1236 // destination connection ID length
1237 0x08,
1238 // destination connection ID
1239 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1240 // source connection ID length
1241 0x08,
1242 // source connection ID
1243 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
dschinazib42a8c52019-05-30 09:45:01 -07001244 // long header packet length
1245 0x05,
1246 // packet number
1247 0x12, 0x34, 0x56, 0x00,
1248 // padding frame
1249 0x00,
1250 };
1251 // clang-format on
1252
dschinazibf0413d2019-10-07 14:19:53 -07001253 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07001254 size_t p_length = ABSL_ARRAYSIZE(packet);
dschinaziceed8662020-07-14 09:37:05 -07001255 if (framer_.version().HasLongHeaderLengths()) {
dschinazibf0413d2019-10-07 14:19:53 -07001256 p = packet49;
vasilvvbed67c62020-10-20 06:38:43 -07001257 p_length = ABSL_ARRAYSIZE(packet49);
dschinazibf0413d2019-10-07 14:19:53 -07001258 }
1259
1260 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
dschinazib42a8c52019-05-30 09:45:01 -07001261 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
fayange3f2f7b2019-09-19 17:01:57 -07001262 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
dschinazib42a8c52019-05-30 09:45:01 -07001263 bool version_flag = false;
1264 QuicConnectionId destination_connection_id, source_connection_id;
1265 QuicVersionLabel version_label = 0;
1266 std::string detailed_error = "";
dschinazibf0413d2019-10-07 14:19:53 -07001267 bool retry_token_present, use_length_prefix;
vasilvvc872ee42020-10-07 19:50:22 -07001268 absl::string_view retry_token;
dschinazibf0413d2019-10-07 14:19:53 -07001269 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1270 const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1271 encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1272 &version_flag, &use_length_prefix, &version_label, &parsed_version,
1273 &destination_connection_id, &source_connection_id, &retry_token_present,
1274 &retry_token, &detailed_error);
bncf6f82b12019-10-30 07:01:01 -07001275 EXPECT_THAT(error_code, IsQuicNoError());
dschinazibf0413d2019-10-07 14:19:53 -07001276 EXPECT_FALSE(retry_token_present);
1277 EXPECT_EQ(framer_.version().HasLengthPrefixedConnectionIds(),
1278 use_length_prefix);
dschinazib42a8c52019-05-30 09:45:01 -07001279 EXPECT_EQ("", detailed_error);
1280 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1281 EXPECT_TRUE(version_flag);
1282 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1283 EXPECT_EQ(FramerTestConnectionIdPlusOne(), source_connection_id);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001284}
1285
dschinazi243eabc2019-08-05 16:15:29 -07001286TEST_P(QuicFramerTest, ParsePublicHeader) {
dschinazi243eabc2019-08-05 16:15:29 -07001287 // clang-format off
1288 unsigned char packet[] = {
1289 // public flags (version included, 8-byte connection ID,
1290 // 4-byte packet number)
1291 0x29,
1292 // connection_id
1293 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1294 // version
1295 QUIC_VERSION_BYTES,
1296 // packet number
1297 0x12, 0x34, 0x56, 0x78,
1298 // padding frame
1299 0x00,
1300 };
fayang36825da2019-08-21 14:01:27 -07001301 unsigned char packet46[] = {
1302 // public flags (long header with packet type HANDSHAKE and
1303 // 4-byte packet number)
1304 0xE3,
1305 // version
1306 QUIC_VERSION_BYTES,
1307 // connection ID lengths
1308 0x50,
1309 // destination connection ID
1310 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1311 // long header packet length
1312 0x05,
1313 // packet number
1314 0x12, 0x34, 0x56, 0x78,
1315 // padding frame
1316 0x00,
dschinazi243eabc2019-08-05 16:15:29 -07001317 };
dschinazic73506e2019-09-20 13:26:46 -07001318 unsigned char packet49[] = {
dschinazi243eabc2019-08-05 16:15:29 -07001319 // public flags (long header with packet type HANDSHAKE and
1320 // 4-byte packet number)
1321 0xE3,
1322 // version
1323 QUIC_VERSION_BYTES,
1324 // destination connection ID length
1325 0x08,
1326 // destination connection ID
1327 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1328 // source connection ID length
1329 0x00,
1330 // long header packet length
1331 0x05,
1332 // packet number
1333 0x12, 0x34, 0x56, 0x78,
1334 // padding frame
1335 0x00,
1336 };
1337 // clang-format on
1338 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07001339 size_t p_length = ABSL_ARRAYSIZE(packet);
dschinaziceed8662020-07-14 09:37:05 -07001340 if (framer_.version().HasLongHeaderLengths()) {
dschinazic73506e2019-09-20 13:26:46 -07001341 p = packet49;
vasilvvbed67c62020-10-20 06:38:43 -07001342 p_length = ABSL_ARRAYSIZE(packet49);
dschinaziceed8662020-07-14 09:37:05 -07001343 } else if (framer_.version().HasIetfInvariantHeader()) {
fayang36825da2019-08-21 14:01:27 -07001344 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07001345 p_length = ABSL_ARRAYSIZE(packet46);
dschinazi243eabc2019-08-05 16:15:29 -07001346 }
1347
1348 uint8_t first_byte = 0x33;
1349 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1350 bool version_present = false, has_length_prefix = false;
1351 QuicVersionLabel version_label = 0;
1352 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1353 QuicConnectionId destination_connection_id = EmptyQuicConnectionId(),
1354 source_connection_id = EmptyQuicConnectionId();
1355 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1356 QuicVariableLengthIntegerLength retry_token_length_length =
1357 VARIABLE_LENGTH_INTEGER_LENGTH_4;
vasilvvc872ee42020-10-07 19:50:22 -07001358 absl::string_view retry_token;
dschinazi243eabc2019-08-05 16:15:29 -07001359 std::string detailed_error = "foobar";
1360
1361 QuicDataReader reader(AsChars(p), p_length);
1362 const QuicErrorCode parse_error = QuicFramer::ParsePublicHeader(
1363 &reader, kQuicDefaultConnectionIdLength,
1364 /*ietf_format=*/
dschinazicc7d40d2020-12-02 11:28:18 -08001365 framer_.version().HasIetfInvariantHeader(), &first_byte, &format,
1366 &version_present, &has_length_prefix, &version_label, &parsed_version,
1367 &destination_connection_id, &source_connection_id, &long_packet_type,
1368 &retry_token_length_length, &retry_token, &detailed_error);
bncf6f82b12019-10-30 07:01:01 -07001369 EXPECT_THAT(parse_error, IsQuicNoError());
dschinazi243eabc2019-08-05 16:15:29 -07001370 EXPECT_EQ("", detailed_error);
1371 EXPECT_EQ(p[0], first_byte);
1372 EXPECT_TRUE(version_present);
1373 EXPECT_EQ(framer_.version().HasLengthPrefixedConnectionIds(),
1374 has_length_prefix);
1375 EXPECT_EQ(CreateQuicVersionLabel(framer_.version()), version_label);
1376 EXPECT_EQ(framer_.version(), parsed_version);
1377 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1378 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1379 EXPECT_EQ(VARIABLE_LENGTH_INTEGER_LENGTH_0, retry_token_length_length);
vasilvvc872ee42020-10-07 19:50:22 -07001380 EXPECT_EQ(absl::string_view(), retry_token);
dschinazicc7d40d2020-12-02 11:28:18 -08001381 if (framer_.version().HasIetfInvariantHeader()) {
dschinazi243eabc2019-08-05 16:15:29 -07001382 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1383 EXPECT_EQ(HANDSHAKE, long_packet_type);
1384 } else {
1385 EXPECT_EQ(GOOGLE_QUIC_PACKET, format);
1386 }
1387}
1388
dschinazi81eb4e02019-09-27 17:12:17 -07001389TEST_P(QuicFramerTest, ParsePublicHeaderProxBadSourceConnectionIdLength) {
1390 if (!framer_.version().HasLengthPrefixedConnectionIds()) {
1391 return;
1392 }
dschinazi81eb4e02019-09-27 17:12:17 -07001393 // clang-format off
1394 unsigned char packet[] = {
1395 // public flags (long header with packet type HANDSHAKE and
1396 // 4-byte packet number)
1397 0xE3,
1398 // version
1399 'P', 'R', 'O', 'X',
1400 // destination connection ID length
1401 0x08,
1402 // destination connection ID
1403 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1404 // source connection ID length (bogus)
1405 0xEE,
1406 // long header packet length
1407 0x05,
1408 // packet number
1409 0x12, 0x34, 0x56, 0x78,
1410 // padding frame
1411 0x00,
1412 };
1413 // clang-format on
1414 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07001415 size_t p_length = ABSL_ARRAYSIZE(packet);
dschinazi81eb4e02019-09-27 17:12:17 -07001416
1417 uint8_t first_byte = 0x33;
1418 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1419 bool version_present = false, has_length_prefix = false;
1420 QuicVersionLabel version_label = 0;
1421 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1422 QuicConnectionId destination_connection_id = EmptyQuicConnectionId(),
1423 source_connection_id = EmptyQuicConnectionId();
1424 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1425 QuicVariableLengthIntegerLength retry_token_length_length =
1426 VARIABLE_LENGTH_INTEGER_LENGTH_4;
vasilvvc872ee42020-10-07 19:50:22 -07001427 absl::string_view retry_token;
dschinazi81eb4e02019-09-27 17:12:17 -07001428 std::string detailed_error = "foobar";
1429
1430 QuicDataReader reader(AsChars(p), p_length);
1431 const QuicErrorCode parse_error = QuicFramer::ParsePublicHeader(
1432 &reader, kQuicDefaultConnectionIdLength,
1433 /*ietf_format=*/true, &first_byte, &format, &version_present,
1434 &has_length_prefix, &version_label, &parsed_version,
1435 &destination_connection_id, &source_connection_id, &long_packet_type,
1436 &retry_token_length_length, &retry_token, &detailed_error);
bncf6f82b12019-10-30 07:01:01 -07001437 EXPECT_THAT(parse_error, IsQuicNoError());
dschinazi81eb4e02019-09-27 17:12:17 -07001438 EXPECT_EQ("", detailed_error);
1439 EXPECT_EQ(p[0], first_byte);
1440 EXPECT_TRUE(version_present);
1441 EXPECT_TRUE(has_length_prefix);
1442 EXPECT_EQ(0x50524F58u, version_label); // "PROX"
1443 EXPECT_EQ(UnsupportedQuicVersion(), parsed_version);
1444 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1445 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1446 EXPECT_EQ(VARIABLE_LENGTH_INTEGER_LENGTH_0, retry_token_length_length);
vasilvvc872ee42020-10-07 19:50:22 -07001447 EXPECT_EQ(absl::string_view(), retry_token);
dschinazi81eb4e02019-09-27 17:12:17 -07001448 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1449}
1450
dschinazi346b7ce2019-06-05 01:38:18 -07001451TEST_P(QuicFramerTest, ClientConnectionIdFromShortHeaderToClient) {
dschinazi346b7ce2019-06-05 01:38:18 -07001452 if (!framer_.version().SupportsClientConnectionIds()) {
1453 return;
1454 }
1455 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1456 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
1457 TestConnectionId(0x33));
1458 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1459 framer_.SetExpectedClientConnectionIdLength(kQuicDefaultConnectionIdLength);
1460 // clang-format off
1461 unsigned char packet[] = {
1462 // type (short header, 4 byte packet number)
1463 0x43,
1464 // connection_id
1465 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1466 // packet number
1467 0x13, 0x37, 0x42, 0x33,
1468 // padding frame
1469 0x00,
1470 };
1471 // clang-format on
vasilvvbed67c62020-10-20 06:38:43 -07001472 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
dschinazi346b7ce2019-06-05 01:38:18 -07001473 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07001474 EXPECT_THAT(framer_.error(), IsQuicNoError());
dschinazi346b7ce2019-06-05 01:38:18 -07001475 EXPECT_EQ("", framer_.detailed_error());
1476 ASSERT_TRUE(visitor_.header_.get());
1477 EXPECT_EQ(FramerTestConnectionId(),
1478 visitor_.header_->destination_connection_id);
1479 EXPECT_EQ(TestConnectionId(0x33), visitor_.header_->source_connection_id);
1480}
1481
1482// In short header packets from client to server, the client connection ID
1483// is omitted, but the framer adds it to the header struct using its
1484// last serialized client connection ID. This test ensures that this
1485// mechanism behaves as expected.
1486TEST_P(QuicFramerTest, ClientConnectionIdFromShortHeaderToServer) {
dschinazi346b7ce2019-06-05 01:38:18 -07001487 if (!framer_.version().SupportsClientConnectionIds()) {
1488 return;
1489 }
1490 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1491 QuicFramerPeer::SetLastSerializedClientConnectionId(&framer_,
1492 TestConnectionId(0x33));
1493 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1494 // clang-format off
1495 unsigned char packet[] = {
1496 // type (short header, 4 byte packet number)
1497 0x43,
1498 // connection_id
1499 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1500 // packet number
1501 0x13, 0x37, 0x42, 0x33,
1502 // padding frame
1503 0x00,
1504 };
1505 // clang-format on
vasilvvbed67c62020-10-20 06:38:43 -07001506 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
dschinazi346b7ce2019-06-05 01:38:18 -07001507 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07001508 EXPECT_THAT(framer_.error(), IsQuicNoError());
dschinazi346b7ce2019-06-05 01:38:18 -07001509 EXPECT_EQ("", framer_.detailed_error());
1510 ASSERT_TRUE(visitor_.header_.get());
1511 EXPECT_EQ(FramerTestConnectionId(),
1512 visitor_.header_->destination_connection_id);
1513 EXPECT_EQ(TestConnectionId(0x33), visitor_.header_->source_connection_id);
1514}
1515
QUICHE teama6ef0a62019-03-07 20:34:33 -05001516TEST_P(QuicFramerTest, PacketHeaderWith0ByteConnectionId) {
zhongyi546cc452019-04-12 15:27:49 -07001517 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
dschinazi7b9278c2019-05-20 07:36:21 -07001518 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
1519 FramerTestConnectionId());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001520 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1521
1522 // clang-format off
1523 PacketFragments packet = {
1524 // public flags (0 byte connection_id)
1525 {"Unable to read public flags.",
1526 {0x20}},
1527 // connection_id
1528 // packet number
1529 {"Unable to read packet number.",
1530 {0x12, 0x34, 0x56, 0x78}},
1531 };
1532
QUICHE teama6ef0a62019-03-07 20:34:33 -05001533 PacketFragments packet46 = {
1534 // type (short header, 4 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001535 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001536 {0x43}},
1537 // connection_id
1538 // packet number
1539 {"Unable to read packet number.",
1540 {0x12, 0x34, 0x56, 0x78}},
1541 };
nharper55fa6132019-05-07 19:37:21 -07001542
1543 PacketFragments packet_hp = {
1544 // type (short header, 4 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001545 {"Unable to read first byte.",
nharper55fa6132019-05-07 19:37:21 -07001546 {0x43}},
1547 // connection_id
1548 // packet number
1549 {"",
1550 {0x12, 0x34, 0x56, 0x78}},
1551 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001552 // clang-format on
1553
1554 PacketFragments& fragments =
nharper55fa6132019-05-07 19:37:21 -07001555 framer_.version().HasHeaderProtection()
1556 ? packet_hp
dschinaziceed8662020-07-14 09:37:05 -07001557 : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001558 std::unique_ptr<QuicEncryptedPacket> encrypted(
1559 AssemblePacketFromFragments(fragments));
1560 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001561 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001562 ASSERT_TRUE(visitor_.header_.get());
dschinazi5e1a7b22019-07-31 12:23:21 -07001563 EXPECT_EQ(FramerTestConnectionId(), visitor_.header_->source_connection_id);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001564 EXPECT_FALSE(visitor_.header_->reset_flag);
1565 EXPECT_FALSE(visitor_.header_->version_flag);
1566 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1567
1568 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1569}
1570
1571TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) {
zhongyi546cc452019-04-12 15:27:49 -07001572 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001573 // clang-format off
1574 PacketFragments packet = {
1575 // public flags (0 byte connection_id)
1576 {"Unable to read public flags.",
1577 {0x29}},
1578 // connection_id
1579 {"Unable to read ConnectionId.",
1580 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1581 // version tag
1582 {"Unable to read protocol version.",
1583 {QUIC_VERSION_BYTES}},
1584 // packet number
1585 {"Unable to read packet number.",
1586 {0x12, 0x34, 0x56, 0x78}},
1587 };
1588
QUICHE teama6ef0a62019-03-07 20:34:33 -05001589 PacketFragments packet46 = {
1590 // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1591 // packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001592 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001593 {0xD3}},
1594 // version tag
1595 {"Unable to read protocol version.",
1596 {QUIC_VERSION_BYTES}},
1597 // connection_id length
1598 {"Unable to read ConnectionId length.",
1599 {0x50}},
1600 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001601 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001602 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1603 // packet number
1604 {"Unable to read packet number.",
1605 {0x12, 0x34, 0x56, 0x78}},
1606 };
1607
dschinazic73506e2019-09-20 13:26:46 -07001608 PacketFragments packet49 = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001609 // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1610 // packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001611 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001612 {0xD3}},
1613 // version tag
1614 {"Unable to read protocol version.",
1615 {QUIC_VERSION_BYTES}},
dschinazi48ac9192019-07-31 00:07:26 -07001616 // destination connection ID length
1617 {"Unable to read destination connection ID.",
1618 {0x08}},
1619 // destination connection ID
1620 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001621 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
dschinazi48ac9192019-07-31 00:07:26 -07001622 // source connection ID length
1623 {"Unable to read source connection ID.",
1624 {0x00}},
QUICHE teama6ef0a62019-03-07 20:34:33 -05001625 // long header packet length
1626 {"Unable to read long header payload length.",
1627 {0x04}},
1628 // packet number
1629 {"Long header payload length longer than packet.",
1630 {0x12, 0x34, 0x56, 0x78}},
1631 };
1632 // clang-format on
1633
1634 PacketFragments& fragments =
dschinaziceed8662020-07-14 09:37:05 -07001635 framer_.version().HasLongHeaderLengths()
dschinazic73506e2019-09-20 13:26:46 -07001636 ? packet49
dschinaziceed8662020-07-14 09:37:05 -07001637 : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001638 std::unique_ptr<QuicEncryptedPacket> encrypted(
1639 AssemblePacketFromFragments(fragments));
1640 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001641 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001642 ASSERT_TRUE(visitor_.header_.get());
1643 EXPECT_EQ(FramerTestConnectionId(),
1644 visitor_.header_->destination_connection_id);
1645 EXPECT_FALSE(visitor_.header_->reset_flag);
1646 EXPECT_TRUE(visitor_.header_->version_flag);
1647 EXPECT_EQ(GetParam(), visitor_.header_->version);
1648 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1649
1650 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1651}
1652
1653TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) {
zhongyi546cc452019-04-12 15:27:49 -07001654 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001655 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1656
1657 // clang-format off
1658 PacketFragments packet = {
1659 // public flags (8 byte connection_id and 4 byte packet number)
1660 {"Unable to read public flags.",
1661 {0x28}},
1662 // connection_id
1663 {"Unable to read ConnectionId.",
1664 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1665 // packet number
1666 {"Unable to read packet number.",
1667 {0x12, 0x34, 0x56, 0x78}},
1668 };
1669
QUICHE teama6ef0a62019-03-07 20:34:33 -05001670 PacketFragments packet46 = {
1671 // type (short header, 4 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001672 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001673 {0x43}},
1674 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001675 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001676 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1677 // packet number
1678 {"Unable to read packet number.",
1679 {0x12, 0x34, 0x56, 0x78}},
1680 };
nharper55fa6132019-05-07 19:37:21 -07001681
1682 PacketFragments packet_hp = {
1683 // type (short header, 4 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001684 {"Unable to read first byte.",
nharper55fa6132019-05-07 19:37:21 -07001685 {0x43}},
1686 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001687 {"Unable to read destination connection ID.",
nharper55fa6132019-05-07 19:37:21 -07001688 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1689 // packet number
1690 {"",
1691 {0x12, 0x34, 0x56, 0x78}},
1692 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001693 // clang-format on
1694
1695 PacketFragments& fragments =
nharper55fa6132019-05-07 19:37:21 -07001696 framer_.version().HasHeaderProtection()
1697 ? packet_hp
dschinaziceed8662020-07-14 09:37:05 -07001698 : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001699 std::unique_ptr<QuicEncryptedPacket> encrypted(
1700 AssemblePacketFromFragments(fragments));
1701 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001702 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001703 ASSERT_TRUE(visitor_.header_.get());
1704 EXPECT_EQ(FramerTestConnectionId(),
1705 visitor_.header_->destination_connection_id);
1706 EXPECT_FALSE(visitor_.header_->reset_flag);
1707 EXPECT_FALSE(visitor_.header_->version_flag);
1708 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1709
1710 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1711}
1712
1713TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) {
zhongyi546cc452019-04-12 15:27:49 -07001714 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001715 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1716
1717 // clang-format off
1718 PacketFragments packet = {
1719 // public flags (8 byte connection_id and 2 byte packet number)
1720 {"Unable to read public flags.",
1721 {0x18}},
1722 // connection_id
1723 {"Unable to read ConnectionId.",
1724 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1725 // packet number
1726 {"Unable to read packet number.",
1727 {0x56, 0x78}},
1728 };
1729
QUICHE teama6ef0a62019-03-07 20:34:33 -05001730 PacketFragments packet46 = {
1731 // type (short header, 2 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001732 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001733 {0x41}},
1734 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001735 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001736 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1737 // packet number
1738 {"Unable to read packet number.",
1739 {0x56, 0x78}},
1740 };
nharper55fa6132019-05-07 19:37:21 -07001741
1742 PacketFragments packet_hp = {
1743 // type (short header, 2 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001744 {"Unable to read first byte.",
nharper55fa6132019-05-07 19:37:21 -07001745 {0x41}},
1746 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001747 {"Unable to read destination connection ID.",
nharper55fa6132019-05-07 19:37:21 -07001748 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1749 // packet number
1750 {"",
1751 {0x56, 0x78}},
1752 // padding
1753 {"", {0x00, 0x00}},
1754 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001755 // clang-format on
1756
1757 PacketFragments& fragments =
nharper55fa6132019-05-07 19:37:21 -07001758 framer_.version().HasHeaderProtection()
1759 ? packet_hp
dschinaziceed8662020-07-14 09:37:05 -07001760 : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001761 std::unique_ptr<QuicEncryptedPacket> encrypted(
1762 AssemblePacketFromFragments(fragments));
nharper55fa6132019-05-07 19:37:21 -07001763 if (framer_.version().HasHeaderProtection()) {
1764 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001765 EXPECT_THAT(framer_.error(), IsQuicNoError());
nharper55fa6132019-05-07 19:37:21 -07001766 } else {
1767 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001768 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
nharper55fa6132019-05-07 19:37:21 -07001769 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001770 ASSERT_TRUE(visitor_.header_.get());
1771 EXPECT_EQ(FramerTestConnectionId(),
1772 visitor_.header_->destination_connection_id);
1773 EXPECT_FALSE(visitor_.header_->reset_flag);
1774 EXPECT_FALSE(visitor_.header_->version_flag);
1775 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1776 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1777
1778 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1779}
1780
1781TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) {
zhongyi546cc452019-04-12 15:27:49 -07001782 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001783 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1784
1785 // clang-format off
1786 PacketFragments packet = {
1787 // public flags (8 byte connection_id and 1 byte packet number)
1788 {"Unable to read public flags.",
1789 {0x08}},
1790 // connection_id
1791 {"Unable to read ConnectionId.",
1792 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1793 // packet number
1794 {"Unable to read packet number.",
1795 {0x78}},
1796 };
1797
QUICHE teama6ef0a62019-03-07 20:34:33 -05001798 PacketFragments packet46 = {
1799 // type (8 byte connection_id and 1 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001800 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001801 {0x40}},
1802 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001803 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001804 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1805 // packet number
1806 {"Unable to read packet number.",
1807 {0x78}},
1808 };
1809
nharper55fa6132019-05-07 19:37:21 -07001810 PacketFragments packet_hp = {
1811 // type (8 byte connection_id and 1 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001812 {"Unable to read first byte.",
nharper55fa6132019-05-07 19:37:21 -07001813 {0x40}},
1814 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001815 {"Unable to read destination connection ID.",
nharper55fa6132019-05-07 19:37:21 -07001816 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1817 // packet number
1818 {"",
1819 {0x78}},
1820 // padding
1821 {"", {0x00, 0x00, 0x00}},
1822 };
1823
QUICHE teama6ef0a62019-03-07 20:34:33 -05001824 // clang-format on
1825
1826 PacketFragments& fragments =
nharper55fa6132019-05-07 19:37:21 -07001827 framer_.version().HasHeaderProtection()
1828 ? packet_hp
dschinaziceed8662020-07-14 09:37:05 -07001829 : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001830 std::unique_ptr<QuicEncryptedPacket> encrypted(
1831 AssemblePacketFromFragments(fragments));
nharper55fa6132019-05-07 19:37:21 -07001832 if (framer_.version().HasHeaderProtection()) {
1833 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001834 EXPECT_THAT(framer_.error(), IsQuicNoError());
nharper55fa6132019-05-07 19:37:21 -07001835 } else {
1836 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07001837 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
nharper55fa6132019-05-07 19:37:21 -07001838 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001839 ASSERT_TRUE(visitor_.header_.get());
1840 EXPECT_EQ(FramerTestConnectionId(),
1841 visitor_.header_->destination_connection_id);
1842 EXPECT_FALSE(visitor_.header_->reset_flag);
1843 EXPECT_FALSE(visitor_.header_->version_flag);
1844 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1845 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1846
1847 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1848}
1849
1850TEST_P(QuicFramerTest, PacketNumberDecreasesThenIncreases) {
zhongyi546cc452019-04-12 15:27:49 -07001851 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001852 // Test the case when a packet is received from the past and future packet
1853 // numbers are still calculated relative to the largest received packet.
1854 QuicPacketHeader header;
1855 header.destination_connection_id = FramerTestConnectionId();
1856 header.reset_flag = false;
1857 header.version_flag = false;
1858 header.packet_number = kPacketNumber - 2;
1859
1860 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
1861 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1862 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
1863 ASSERT_TRUE(data != nullptr);
1864
1865 QuicEncryptedPacket encrypted(data->data(), data->length(), false);
1866 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1867 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1868 ASSERT_TRUE(visitor_.header_.get());
1869 EXPECT_EQ(FramerTestConnectionId(),
1870 visitor_.header_->destination_connection_id);
1871 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1872 EXPECT_EQ(kPacketNumber - 2, visitor_.header_->packet_number);
1873
1874 // Receive a 1 byte packet number.
1875 header.packet_number = kPacketNumber;
1876 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1877 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1878 data = BuildDataPacket(header, frames);
1879 QuicEncryptedPacket encrypted1(data->data(), data->length(), false);
1880 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1881 EXPECT_TRUE(framer_.ProcessPacket(encrypted1));
1882 ASSERT_TRUE(visitor_.header_.get());
1883 EXPECT_EQ(FramerTestConnectionId(),
1884 visitor_.header_->destination_connection_id);
1885 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1886 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1887
1888 // Process a 2 byte packet number 256 packets ago.
1889 header.packet_number = kPacketNumber - 256;
1890 header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
1891 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1892 data = BuildDataPacket(header, frames);
1893 QuicEncryptedPacket encrypted2(data->data(), data->length(), false);
1894 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1895 EXPECT_TRUE(framer_.ProcessPacket(encrypted2));
1896 ASSERT_TRUE(visitor_.header_.get());
1897 EXPECT_EQ(FramerTestConnectionId(),
1898 visitor_.header_->destination_connection_id);
1899 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1900 EXPECT_EQ(kPacketNumber - 256, visitor_.header_->packet_number);
1901
1902 // Process another 1 byte packet number and ensure it works.
1903 header.packet_number = kPacketNumber - 1;
1904 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1905 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1906 data = BuildDataPacket(header, frames);
1907 QuicEncryptedPacket encrypted3(data->data(), data->length(), false);
1908 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1909 EXPECT_TRUE(framer_.ProcessPacket(encrypted3));
1910 ASSERT_TRUE(visitor_.header_.get());
1911 EXPECT_EQ(FramerTestConnectionId(),
1912 visitor_.header_->destination_connection_id);
1913 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1914 EXPECT_EQ(kPacketNumber - 1, visitor_.header_->packet_number);
1915}
1916
1917TEST_P(QuicFramerTest, PacketWithDiversificationNonce) {
zhongyi546cc452019-04-12 15:27:49 -07001918 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001919 // clang-format off
1920 unsigned char packet[] = {
1921 // public flags: includes nonce flag
1922 0x2C,
1923 // connection_id
1924 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1925 // nonce
1926 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1927 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1928 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1929 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1930 // packet number
1931 0x12, 0x34, 0x56, 0x78,
1932
1933 // frame type (padding)
1934 0x00,
1935 0x00, 0x00, 0x00, 0x00
1936 };
1937
QUICHE teama6ef0a62019-03-07 20:34:33 -05001938 unsigned char packet46[] = {
1939 // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1940 // number.
1941 0xD0,
1942 // version tag
1943 QUIC_VERSION_BYTES,
1944 // connection_id length
1945 0x05,
1946 // connection_id
1947 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1948 // packet number
1949 0x78,
1950 // nonce
1951 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1952 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1953 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1954 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1955
1956 // frame type (padding)
1957 0x00,
1958 0x00, 0x00, 0x00, 0x00
1959 };
1960
dschinazic73506e2019-09-20 13:26:46 -07001961 unsigned char packet49[] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001962 // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1963 // number.
1964 0xD0,
1965 // version tag
1966 QUIC_VERSION_BYTES,
dschinazi48ac9192019-07-31 00:07:26 -07001967 // destination connection ID length
1968 0x00,
1969 // source connection ID length
1970 0x08,
1971 // source connection ID
QUICHE teama6ef0a62019-03-07 20:34:33 -05001972 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1973 // long header packet length
1974 0x26,
1975 // packet number
1976 0x78,
1977 // nonce
1978 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1979 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1980 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1981 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1982
1983 // frame type (padding)
1984 0x00,
1985 0x00, 0x00, 0x00, 0x00
1986 };
1987 // clang-format on
1988
1989 if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
1990 return;
1991 }
1992
1993 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07001994 size_t p_size = ABSL_ARRAYSIZE(packet);
dschinaziceed8662020-07-14 09:37:05 -07001995 if (framer_.version().HasLongHeaderLengths()) {
dschinazic73506e2019-09-20 13:26:46 -07001996 p = packet49;
vasilvvbed67c62020-10-20 06:38:43 -07001997 p_size = ABSL_ARRAYSIZE(packet49);
dschinaziceed8662020-07-14 09:37:05 -07001998 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001999 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07002000 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002001 }
2002
2003 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
2004 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
2005 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2006 ASSERT_TRUE(visitor_.header_->nonce != nullptr);
2007 for (char i = 0; i < 32; ++i) {
2008 EXPECT_EQ(i, (*visitor_.header_->nonce)[static_cast<size_t>(i)]);
2009 }
2010 EXPECT_EQ(1u, visitor_.padding_frames_.size());
2011 EXPECT_EQ(5, visitor_.padding_frames_[0]->num_padding_bytes);
2012}
2013
2014TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) {
2015 // clang-format off
2016 unsigned char packet[] = {
2017 // public flags (8 byte connection_id, version flag and an unknown flag)
2018 0x29,
2019 // connection_id
2020 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2021 // version tag
2022 'Q', '0', '0', '0',
2023 // packet number
2024 0x12, 0x34, 0x56, 0x78,
2025
2026 // frame type (padding frame)
2027 0x00,
2028 0x00, 0x00, 0x00, 0x00
2029 };
2030
fayang36825da2019-08-21 14:01:27 -07002031 unsigned char packet46[] = {
nharper55fa6132019-05-07 19:37:21 -07002032 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2033 0xD3,
2034 // version tag
2035 'Q', '0', '0', '0',
2036 // connection_id length
2037 0x50,
2038 // connection_id
2039 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2040 // packet number
2041 0x12, 0x34, 0x56, 0x78,
2042
2043 // frame type (padding frame)
2044 0x00,
2045 0x00, 0x00, 0x00, 0x00
2046 };
dschinazi48ac9192019-07-31 00:07:26 -07002047
dschinazic73506e2019-09-20 13:26:46 -07002048 unsigned char packet49[] = {
dschinazi48ac9192019-07-31 00:07:26 -07002049 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2050 0xD3,
2051 // version tag
2052 'Q', '0', '0', '0',
2053 // destination connection ID length
2054 0x08,
2055 // destination connection ID
2056 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2057 // source connection ID length
2058 0x00,
2059 // packet number
2060 0x12, 0x34, 0x56, 0x78,
2061
2062 // frame type (padding frame)
2063 0x00,
2064 0x00, 0x00, 0x00, 0x00
2065 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05002066 // clang-format on
2067
nharper55fa6132019-05-07 19:37:21 -07002068 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07002069 size_t p_size = ABSL_ARRAYSIZE(packet);
dschinaziceed8662020-07-14 09:37:05 -07002070 if (framer_.version().HasLongHeaderLengths()) {
dschinazic73506e2019-09-20 13:26:46 -07002071 p = packet49;
vasilvvbed67c62020-10-20 06:38:43 -07002072 p_size = ABSL_ARRAYSIZE(packet49);
dschinaziceed8662020-07-14 09:37:05 -07002073 } else if (framer_.version().HasIetfInvariantHeader()) {
fayang36825da2019-08-21 14:01:27 -07002074 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07002075 p_size = ABSL_ARRAYSIZE(packet46);
nharper55fa6132019-05-07 19:37:21 -07002076 }
2077 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002078 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07002079 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002080 ASSERT_TRUE(visitor_.header_.get());
2081 EXPECT_EQ(0, visitor_.frame_count_);
2082 EXPECT_EQ(1, visitor_.version_mismatch_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002083}
2084
2085TEST_P(QuicFramerTest, PaddingFrame) {
zhongyi546cc452019-04-12 15:27:49 -07002086 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002087 // clang-format off
2088 unsigned char packet[] = {
2089 // public flags (8 byte connection_id)
2090 0x28,
2091 // connection_id
2092 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2093 // packet number
2094 0x12, 0x34, 0x56, 0x78,
2095
2096 // paddings
2097 0x00, 0x00,
2098 // frame type (stream frame with fin)
2099 0xFF,
2100 // stream id
2101 0x01, 0x02, 0x03, 0x04,
2102 // offset
2103 0x3A, 0x98, 0xFE, 0xDC,
2104 0x32, 0x10, 0x76, 0x54,
2105 // data length
2106 0x00, 0x0c,
2107 // data
2108 'h', 'e', 'l', 'l',
2109 'o', ' ', 'w', 'o',
2110 'r', 'l', 'd', '!',
2111 // paddings
2112 0x00, 0x00,
2113 };
2114
QUICHE teama6ef0a62019-03-07 20:34:33 -05002115 unsigned char packet46[] = {
2116 // type (short header, 4 byte packet number)
2117 0x43,
2118 // connection_id
2119 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2120 // packet number
2121 0x12, 0x34, 0x56, 0x78,
2122
2123 // paddings
2124 0x00, 0x00,
2125 // frame type (stream frame with fin)
2126 0xFF,
2127 // stream id
2128 0x01, 0x02, 0x03, 0x04,
2129 // offset
2130 0x3A, 0x98, 0xFE, 0xDC,
2131 0x32, 0x10, 0x76, 0x54,
2132 // data length
2133 0x00, 0x0c,
2134 // data
2135 'h', 'e', 'l', 'l',
2136 'o', ' ', 'w', 'o',
2137 'r', 'l', 'd', '!',
2138 // paddings
2139 0x00, 0x00,
2140 };
2141
2142 unsigned char packet99[] = {
2143 // type (short header, 4 byte packet number)
2144 0x43,
2145 // connection_id
2146 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2147 // packet number
2148 0x12, 0x34, 0x56, 0x78,
2149
2150 // paddings
2151 0x00, 0x00,
2152 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
2153 0x08 | 0x01 | 0x02 | 0x04,
2154
2155 // stream id
2156 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
2157 // offset
2158 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2159 0x32, 0x10, 0x76, 0x54,
2160 // data length
2161 kVarInt62OneByte + 0x0c,
2162 // data
2163 'h', 'e', 'l', 'l',
2164 'o', ' ', 'w', 'o',
2165 'r', 'l', 'd', '!',
2166 // paddings
2167 0x00, 0x00,
2168 };
2169 // clang-format on
2170
2171 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07002172 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07002173 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002174 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -07002175 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -07002176 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002177 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07002178 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002179 }
2180
2181 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
2182 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07002183 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002184 ASSERT_TRUE(visitor_.header_.get());
2185 EXPECT_TRUE(CheckDecryption(
2186 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2187 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2188
2189 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2190 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2191 EXPECT_EQ(2u, visitor_.padding_frames_.size());
2192 EXPECT_EQ(2, visitor_.padding_frames_[0]->num_padding_bytes);
2193 EXPECT_EQ(2, visitor_.padding_frames_[1]->num_padding_bytes);
2194 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2195 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2196 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2197 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2198}
2199
2200TEST_P(QuicFramerTest, StreamFrame) {
zhongyi546cc452019-04-12 15:27:49 -07002201 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002202 // clang-format off
2203 PacketFragments packet = {
2204 // public flags (8 byte connection_id)
2205 {"",
2206 {0x28}},
2207 // connection_id
2208 {"",
2209 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2210 // packet number
2211 {"",
2212 {0x12, 0x34, 0x56, 0x78}},
2213 // frame type (stream frame with fin)
2214 {"",
2215 {0xFF}},
2216 // stream id
2217 {"Unable to read stream_id.",
2218 {0x01, 0x02, 0x03, 0x04}},
2219 // offset
2220 {"Unable to read offset.",
2221 {0x3A, 0x98, 0xFE, 0xDC,
2222 0x32, 0x10, 0x76, 0x54}},
2223 {"Unable to read frame data.",
2224 {
2225 // data length
2226 0x00, 0x0c,
2227 // data
2228 'h', 'e', 'l', 'l',
2229 'o', ' ', 'w', 'o',
2230 'r', 'l', 'd', '!'}},
2231 };
2232
QUICHE teama6ef0a62019-03-07 20:34:33 -05002233 PacketFragments packet46 = {
2234 // type (short header, 4 byte packet number)
2235 {"",
2236 {0x43}},
2237 // connection_id
2238 {"",
2239 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2240 // packet number
2241 {"",
2242 {0x12, 0x34, 0x56, 0x78}},
2243 // frame type (stream frame with fin)
2244 {"",
2245 {0xFF}},
2246 // stream id
2247 {"Unable to read stream_id.",
2248 {0x01, 0x02, 0x03, 0x04}},
2249 // offset
2250 {"Unable to read offset.",
2251 {0x3A, 0x98, 0xFE, 0xDC,
2252 0x32, 0x10, 0x76, 0x54}},
2253 {"Unable to read frame data.",
2254 {
2255 // data length
2256 0x00, 0x0c,
2257 // data
2258 'h', 'e', 'l', 'l',
2259 'o', ' ', 'w', 'o',
2260 'r', 'l', 'd', '!'}},
2261 };
2262
2263 PacketFragments packet99 = {
2264 // type (short header, 4 byte packet number)
2265 {"",
2266 {0x43}},
2267 // connection_id
2268 {"",
2269 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2270 // packet number
2271 {"",
2272 {0x12, 0x34, 0x56, 0x78}},
2273 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
2274 {"",
2275 { 0x08 | 0x01 | 0x02 | 0x04 }},
2276 // stream id
renjietangd077f8c2020-03-23 17:22:09 -07002277 {"Unable to read IETF_STREAM frame stream id/count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05002278 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
2279 // offset
2280 {"Unable to read stream data offset.",
2281 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2282 0x32, 0x10, 0x76, 0x54}},
2283 // data length
2284 {"Unable to read stream data length.",
2285 {kVarInt62OneByte + 0x0c}},
2286 // data
2287 {"Unable to read frame data.",
2288 { 'h', 'e', 'l', 'l',
2289 'o', ' ', 'w', 'o',
2290 'r', 'l', 'd', '!'}},
2291 };
2292 // clang-format on
2293
2294 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07002295 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05002296 ? packet99
dschinaziceed8662020-07-14 09:37:05 -07002297 : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002298 std::unique_ptr<QuicEncryptedPacket> encrypted(
2299 AssemblePacketFromFragments(fragments));
2300 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2301
bncf6f82b12019-10-30 07:01:01 -07002302 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002303 ASSERT_TRUE(visitor_.header_.get());
2304 EXPECT_TRUE(CheckDecryption(
2305 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2306 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2307
2308 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2309 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2310 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2311 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2312 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2313 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2314
2315 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2316}
2317
2318// Test an empty (no data) stream frame.
2319TEST_P(QuicFramerTest, EmptyStreamFrame) {
2320 // Only the IETF QUIC spec explicitly says that empty
2321 // stream frames are supported.
fkastenholz305e1732019-06-18 05:01:22 -07002322 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002323 return;
2324 }
zhongyi546cc452019-04-12 15:27:49 -07002325 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002326 // clang-format off
2327 PacketFragments packet = {
2328 // type (short header, 4 byte packet number)
2329 {"",
2330 {0x43}},
2331 // connection_id
2332 {"",
2333 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2334 // packet number
2335 {"",
2336 {0x12, 0x34, 0x56, 0x78}},
2337 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
2338 {"",
2339 { 0x08 | 0x01 | 0x02 | 0x04 }},
2340 // stream id
renjietangd077f8c2020-03-23 17:22:09 -07002341 {"Unable to read IETF_STREAM frame stream id/count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05002342 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
2343 // offset
2344 {"Unable to read stream data offset.",
2345 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2346 0x32, 0x10, 0x76, 0x54}},
2347 // data length
2348 {"Unable to read stream data length.",
2349 {kVarInt62OneByte + 0x00}},
2350 };
2351 // clang-format on
2352
2353 std::unique_ptr<QuicEncryptedPacket> encrypted(
2354 AssemblePacketFromFragments(packet));
2355 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2356
bncf6f82b12019-10-30 07:01:01 -07002357 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002358 ASSERT_TRUE(visitor_.header_.get());
2359 EXPECT_TRUE(CheckDecryption(
2360 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2361 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2362
2363 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2364 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2365 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2366 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2367 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2368 EXPECT_EQ(visitor_.stream_frames_[0].get()->data_length, 0u);
2369
2370 CheckFramingBoundaries(packet, QUIC_INVALID_STREAM_DATA);
2371}
2372
2373TEST_P(QuicFramerTest, MissingDiversificationNonce) {
QUICHE team8e2e4532019-03-14 14:37:56 -07002374 if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
2375 // TLS does not use diversification nonces.
2376 return;
2377 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002378 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002379 decrypter_ = new test::TestDecrypter();
zhongyi546cc452019-04-12 15:27:49 -07002380 if (framer_.version().KnowsWhichDecrypterToUse()) {
vasilvv0fc587f2019-09-06 13:33:08 -07002381 framer_.InstallDecrypter(
2382 ENCRYPTION_INITIAL,
2383 std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07002384 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
2385 std::unique_ptr<QuicDecrypter>(decrypter_));
2386 } else {
vasilvv0fc587f2019-09-06 13:33:08 -07002387 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
2388 Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07002389 framer_.SetAlternativeDecrypter(
2390 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
2391 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002392
2393 // clang-format off
2394 unsigned char packet[] = {
2395 // public flags (8 byte connection_id)
2396 0x28,
2397 // connection_id
2398 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2399 // packet number
2400 0x12, 0x34, 0x56, 0x78,
QUICHE team8e2e4532019-03-14 14:37:56 -07002401 // padding frame
2402 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002403 };
2404
QUICHE team8e2e4532019-03-14 14:37:56 -07002405 unsigned char packet46[] = {
2406 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2407 0xD3,
2408 // version tag
2409 QUIC_VERSION_BYTES,
2410 // connection_id length
2411 0x05,
2412 // connection_id
2413 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2414 // packet number
2415 0x12, 0x34, 0x56, 0x78,
2416 // padding frame
2417 0x00,
2418 };
2419
dschinazic73506e2019-09-20 13:26:46 -07002420 unsigned char packet49[] = {
QUICHE team8e2e4532019-03-14 14:37:56 -07002421 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2422 0xD3,
2423 // version tag
2424 QUIC_VERSION_BYTES,
dschinazi48ac9192019-07-31 00:07:26 -07002425 // destination connection ID length
2426 0x00,
2427 // source connection ID length
2428 0x08,
2429 // source connection ID
QUICHE team8e2e4532019-03-14 14:37:56 -07002430 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2431 // IETF long header payload length
2432 0x05,
2433 // packet number
2434 0x12, 0x34, 0x56, 0x78,
2435 // padding frame
2436 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002437 };
2438 // clang-format on
2439
2440 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07002441 size_t p_length = ABSL_ARRAYSIZE(packet);
dschinaziceed8662020-07-14 09:37:05 -07002442 if (framer_.version().HasLongHeaderLengths()) {
dschinazic73506e2019-09-20 13:26:46 -07002443 p = packet49;
vasilvvbed67c62020-10-20 06:38:43 -07002444 p_length = ABSL_ARRAYSIZE(packet49);
dschinaziceed8662020-07-14 09:37:05 -07002445 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE team8e2e4532019-03-14 14:37:56 -07002446 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07002447 p_length = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002448 }
QUICHE team8e2e4532019-03-14 14:37:56 -07002449 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002450 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
nharper55fa6132019-05-07 19:37:21 -07002451 if (framer_.version().HasHeaderProtection()) {
bncf6f82b12019-10-30 07:01:01 -07002452 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
dschinazi163bda22020-04-01 13:34:43 -07002453 EXPECT_EQ("Unable to decrypt ENCRYPTION_ZERO_RTT header protection.",
2454 framer_.detailed_error());
dschinaziceed8662020-07-14 09:37:05 -07002455 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002456 // Cannot read diversification nonce.
bncf6f82b12019-10-30 07:01:01 -07002457 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
QUICHE team8e2e4532019-03-14 14:37:56 -07002458 EXPECT_EQ("Unable to read nonce.", framer_.detailed_error());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002459 } else {
bncf6f82b12019-10-30 07:01:01 -07002460 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002461 }
2462}
2463
2464TEST_P(QuicFramerTest, StreamFrame3ByteStreamId) {
dschinaziceed8662020-07-14 09:37:05 -07002465 if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002466 // This test is nonsensical for IETF Quic.
2467 return;
2468 }
2469 // clang-format off
2470 PacketFragments packet = {
2471 // public flags (8 byte connection_id)
2472 {"",
2473 {0x28}},
2474 // connection_id
2475 {"",
2476 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2477 // packet number
2478 {"",
2479 {0x12, 0x34, 0x56, 0x78}},
2480 // frame type (stream frame with fin)
2481 {"",
2482 {0xFE}},
2483 // stream id
2484 {"Unable to read stream_id.",
2485 {0x02, 0x03, 0x04}},
2486 // offset
2487 {"Unable to read offset.",
2488 {0x3A, 0x98, 0xFE, 0xDC,
2489 0x32, 0x10, 0x76, 0x54}},
2490 {"Unable to read frame data.",
2491 {
2492 // data length
2493 0x00, 0x0c,
2494 // data
2495 'h', 'e', 'l', 'l',
2496 'o', ' ', 'w', 'o',
2497 'r', 'l', 'd', '!'}},
2498 };
2499 // clang-format on
2500
2501 PacketFragments& fragments = packet;
2502 std::unique_ptr<QuicEncryptedPacket> encrypted(
2503 AssemblePacketFromFragments(fragments));
2504 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2505
bncf6f82b12019-10-30 07:01:01 -07002506 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002507 ASSERT_TRUE(visitor_.header_.get());
2508 EXPECT_TRUE(CheckDecryption(
2509 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2510 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2511
2512 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2513 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2514 // Stream ID should be the last 3 bytes of kStreamId.
2515 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2516 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2517 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2518 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2519
2520 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2521}
2522
2523TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) {
zhongyi546cc452019-04-12 15:27:49 -07002524 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002525 // clang-format off
2526 PacketFragments packet = {
2527 // public flags (8 byte connection_id)
2528 {"",
2529 {0x28}},
2530 // connection_id
2531 {"",
2532 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2533 // packet number
2534 {"",
2535 {0x12, 0x34, 0x56, 0x78}},
2536 // frame type (stream frame with fin)
2537 {"",
2538 {0xFD}},
2539 // stream id
2540 {"Unable to read stream_id.",
2541 {0x03, 0x04}},
2542 // offset
2543 {"Unable to read offset.",
2544 {0x3A, 0x98, 0xFE, 0xDC,
2545 0x32, 0x10, 0x76, 0x54}},
2546 {"Unable to read frame data.",
2547 {
2548 // data length
2549 0x00, 0x0c,
2550 // data
2551 'h', 'e', 'l', 'l',
2552 'o', ' ', 'w', 'o',
2553 'r', 'l', 'd', '!'}},
2554 };
2555
QUICHE teama6ef0a62019-03-07 20:34:33 -05002556 PacketFragments packet46 = {
2557 // type (short header, 4 byte packet number)
2558 {"",
2559 {0x43}},
2560 // connection_id
2561 {"",
2562 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2563 // packet number
2564 {"",
2565 {0x12, 0x34, 0x56, 0x78}},
2566 // frame type (stream frame with fin)
2567 {"",
2568 {0xFD}},
2569 // stream id
2570 {"Unable to read stream_id.",
2571 {0x03, 0x04}},
2572 // offset
2573 {"Unable to read offset.",
2574 {0x3A, 0x98, 0xFE, 0xDC,
2575 0x32, 0x10, 0x76, 0x54}},
2576 {"Unable to read frame data.",
2577 {
2578 // data length
2579 0x00, 0x0c,
2580 // data
2581 'h', 'e', 'l', 'l',
2582 'o', ' ', 'w', 'o',
2583 'r', 'l', 'd', '!'}},
2584 };
2585
2586 PacketFragments packet99 = {
2587 // type (short header, 4 byte packet number)
2588 {"",
2589 {0x43}},
2590 // connection_id
2591 {"",
2592 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2593 // packet number
2594 {"",
2595 {0x12, 0x34, 0x56, 0x78}},
2596 // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2597 {"",
2598 {0x08 | 0x01 | 0x02 | 0x04}},
2599 // stream id
renjietangd077f8c2020-03-23 17:22:09 -07002600 {"Unable to read IETF_STREAM frame stream id/count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05002601 {kVarInt62TwoBytes + 0x03, 0x04}},
2602 // offset
2603 {"Unable to read stream data offset.",
2604 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2605 0x32, 0x10, 0x76, 0x54}},
2606 // data length
2607 {"Unable to read stream data length.",
2608 {kVarInt62OneByte + 0x0c}},
2609 // data
2610 {"Unable to read frame data.",
2611 { 'h', 'e', 'l', 'l',
2612 'o', ' ', 'w', 'o',
2613 'r', 'l', 'd', '!'}},
2614 };
2615 // clang-format on
2616
2617 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07002618 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05002619 ? packet99
dschinaziceed8662020-07-14 09:37:05 -07002620 : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002621 std::unique_ptr<QuicEncryptedPacket> encrypted(
2622 AssemblePacketFromFragments(fragments));
2623 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2624
bncf6f82b12019-10-30 07:01:01 -07002625 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002626 ASSERT_TRUE(visitor_.header_.get());
2627 EXPECT_TRUE(CheckDecryption(
2628 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2629 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2630
2631 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2632 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2633 // Stream ID should be the last 2 bytes of kStreamId.
2634 EXPECT_EQ(0x0000FFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2635 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2636 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2637 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2638
2639 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2640}
2641
2642TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) {
zhongyi546cc452019-04-12 15:27:49 -07002643 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002644 // clang-format off
2645 PacketFragments packet = {
2646 // public flags (8 byte connection_id)
2647 {"",
2648 {0x28}},
2649 // connection_id
2650 {"",
2651 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2652 // packet number
2653 {"",
2654 {0x12, 0x34, 0x56, 0x78}},
2655 // frame type (stream frame with fin)
2656 {"",
2657 {0xFC}},
2658 // stream id
2659 {"Unable to read stream_id.",
2660 {0x04}},
2661 // offset
2662 {"Unable to read offset.",
2663 {0x3A, 0x98, 0xFE, 0xDC,
2664 0x32, 0x10, 0x76, 0x54}},
2665 {"Unable to read frame data.",
2666 {
2667 // data length
2668 0x00, 0x0c,
2669 // data
2670 'h', 'e', 'l', 'l',
2671 'o', ' ', 'w', 'o',
2672 'r', 'l', 'd', '!'}},
2673 };
2674
QUICHE teama6ef0a62019-03-07 20:34:33 -05002675 PacketFragments packet46 = {
2676 // type (short header, 4 byte packet number)
2677 {"",
2678 {0x43}},
2679 // connection_id
2680 {"",
2681 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2682 // packet number
2683 {"",
2684 {0x12, 0x34, 0x56, 0x78}},
2685 // frame type (stream frame with fin)
2686 {"",
2687 {0xFC}},
2688 // stream id
2689 {"Unable to read stream_id.",
2690 {0x04}},
2691 // offset
2692 {"Unable to read offset.",
2693 {0x3A, 0x98, 0xFE, 0xDC,
2694 0x32, 0x10, 0x76, 0x54}},
2695 {"Unable to read frame data.",
2696 {
2697 // data length
2698 0x00, 0x0c,
2699 // data
2700 'h', 'e', 'l', 'l',
2701 'o', ' ', 'w', 'o',
2702 'r', 'l', 'd', '!'}},
2703 };
2704
2705 PacketFragments packet99 = {
2706 // type (short header, 4 byte packet number)
2707 {"",
2708 {0x43}},
2709 // connection_id
2710 {"",
2711 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2712 // packet number
2713 {"",
2714 {0x12, 0x34, 0x56, 0x78}},
2715 // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2716 {"",
2717 {0x08 | 0x01 | 0x02 | 0x04}},
2718 // stream id
renjietangd077f8c2020-03-23 17:22:09 -07002719 {"Unable to read IETF_STREAM frame stream id/count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05002720 {kVarInt62OneByte + 0x04}},
2721 // offset
2722 {"Unable to read stream data offset.",
2723 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2724 0x32, 0x10, 0x76, 0x54}},
2725 // data length
2726 {"Unable to read stream data length.",
2727 {kVarInt62OneByte + 0x0c}},
2728 // data
2729 {"Unable to read frame data.",
2730 { 'h', 'e', 'l', 'l',
2731 'o', ' ', 'w', 'o',
2732 'r', 'l', 'd', '!'}},
2733 };
2734 // clang-format on
2735
2736 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07002737 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05002738 ? packet99
dschinaziceed8662020-07-14 09:37:05 -07002739 : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002740 std::unique_ptr<QuicEncryptedPacket> encrypted(
2741 AssemblePacketFromFragments(fragments));
2742 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2743
bncf6f82b12019-10-30 07:01:01 -07002744 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002745 ASSERT_TRUE(visitor_.header_.get());
2746 EXPECT_TRUE(CheckDecryption(
2747 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2748 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2749
2750 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2751 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2752 // Stream ID should be the last 1 byte of kStreamId.
2753 EXPECT_EQ(0x000000FF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2754 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2755 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2756 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2757
2758 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2759}
2760
2761TEST_P(QuicFramerTest, StreamFrameWithVersion) {
fkastenholz305e1732019-06-18 05:01:22 -07002762 // If IETF frames are in use then we must also have the IETF
2763 // header invariants.
2764 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
dschinazicc7d40d2020-12-02 11:28:18 -08002765 DCHECK(framer_.version().HasIetfInvariantHeader());
fkastenholz305e1732019-06-18 05:01:22 -07002766 }
2767
zhongyi546cc452019-04-12 15:27:49 -07002768 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002769 // clang-format off
2770 PacketFragments packet = {
2771 // public flags (version, 8 byte connection_id)
2772 {"",
2773 {0x29}},
2774 // connection_id
2775 {"",
2776 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2777 // version tag
2778 {"",
2779 {QUIC_VERSION_BYTES}},
2780 // packet number
2781 {"",
2782 {0x12, 0x34, 0x56, 0x78}},
2783 // frame type (stream frame with fin)
2784 {"",
2785 {0xFE}},
2786 // stream id
2787 {"Unable to read stream_id.",
2788 {0x02, 0x03, 0x04}},
2789 // offset
2790 {"Unable to read offset.",
2791 {0x3A, 0x98, 0xFE, 0xDC,
2792 0x32, 0x10, 0x76, 0x54}},
2793 {"Unable to read frame data.",
2794 {
2795 // data length
2796 0x00, 0x0c,
2797 // data
2798 'h', 'e', 'l', 'l',
2799 'o', ' ', 'w', 'o',
2800 'r', 'l', 'd', '!'}},
2801 };
2802
QUICHE teama6ef0a62019-03-07 20:34:33 -05002803 PacketFragments packet46 = {
2804 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2805 // 4-byte packet number)
2806 {"",
2807 {0xD3}},
2808 // version tag
2809 {"",
2810 {QUIC_VERSION_BYTES}},
2811 // connection_id length
2812 {"",
2813 {0x50}},
2814 // connection_id
2815 {"",
2816 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2817 // packet number
2818 {"",
2819 {0x12, 0x34, 0x56, 0x78}},
2820 // frame type (stream frame with fin)
2821 {"",
2822 {0xFE}},
2823 // stream id
2824 {"Unable to read stream_id.",
2825 {0x02, 0x03, 0x04}},
2826 // offset
2827 {"Unable to read offset.",
2828 {0x3A, 0x98, 0xFE, 0xDC,
2829 0x32, 0x10, 0x76, 0x54}},
2830 {"Unable to read frame data.",
2831 {
2832 // data length
2833 0x00, 0x0c,
2834 // data
2835 'h', 'e', 'l', 'l',
2836 'o', ' ', 'w', 'o',
2837 'r', 'l', 'd', '!'}},
2838 };
2839
dschinazic73506e2019-09-20 13:26:46 -07002840 PacketFragments packet49 = {
2841 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2842 // 4-byte packet number)
2843 {"",
2844 {0xD3}},
2845 // version tag
2846 {"",
2847 {QUIC_VERSION_BYTES}},
2848 // destination connection ID length
2849 {"",
2850 {0x08}},
2851 // destination connection ID
2852 {"",
2853 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2854 // source connection ID length
2855 {"",
2856 {0x00}},
2857 // long header packet length
2858 {"",
2859 {0x1E}},
2860 // packet number
2861 {"",
2862 {0x12, 0x34, 0x56, 0x78}},
2863 // frame type (stream frame with fin)
2864 {"",
2865 {0xFE}},
2866 // stream id
2867 {"Long header payload length longer than packet.",
2868 {0x02, 0x03, 0x04}},
2869 // offset
2870 {"Long header payload length longer than packet.",
2871 {0x3A, 0x98, 0xFE, 0xDC,
2872 0x32, 0x10, 0x76, 0x54}},
2873 {"Long header payload length longer than packet.",
2874 {
2875 // data length
2876 0x00, 0x0c,
2877 // data
2878 'h', 'e', 'l', 'l',
2879 'o', ' ', 'w', 'o',
2880 'r', 'l', 'd', '!'}},
2881 };
2882
QUICHE teama6ef0a62019-03-07 20:34:33 -05002883 PacketFragments packet99 = {
2884 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2885 // 4-byte packet number)
2886 {"",
2887 {0xD3}},
2888 // version tag
2889 {"",
2890 {QUIC_VERSION_BYTES}},
dschinazi48ac9192019-07-31 00:07:26 -07002891 // destination connection ID length
QUICHE teama6ef0a62019-03-07 20:34:33 -05002892 {"",
dschinazi48ac9192019-07-31 00:07:26 -07002893 {0x08}},
2894 // destination connection ID
QUICHE teama6ef0a62019-03-07 20:34:33 -05002895 {"",
2896 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
dschinazi48ac9192019-07-31 00:07:26 -07002897 // source connection ID length
2898 {"",
2899 {0x00}},
QUICHE teama6ef0a62019-03-07 20:34:33 -05002900 // long header packet length
2901 {"",
2902 {0x1E}},
2903 // packet number
2904 {"",
2905 {0x12, 0x34, 0x56, 0x78}},
2906 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
2907 {"",
2908 {0x08 | 0x01 | 0x02 | 0x04}},
2909 // stream id
2910 {"Long header payload length longer than packet.",
2911 {kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04}},
2912 // offset
2913 {"Long header payload length longer than packet.",
2914 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2915 0x32, 0x10, 0x76, 0x54}},
2916 // data length
2917 {"Long header payload length longer than packet.",
2918 {kVarInt62OneByte + 0x0c}},
2919 // data
2920 {"Long header payload length longer than packet.",
2921 { 'h', 'e', 'l', 'l',
2922 'o', ' ', 'w', 'o',
2923 'r', 'l', 'd', '!'}},
2924 };
2925 // clang-format on
2926
2927 QuicVariableLengthIntegerLength retry_token_length_length =
2928 VARIABLE_LENGTH_INTEGER_LENGTH_0;
2929 size_t retry_token_length = 0;
2930 QuicVariableLengthIntegerLength length_length =
2931 QuicVersionHasLongHeaderLengths(framer_.transport_version())
2932 ? VARIABLE_LENGTH_INTEGER_LENGTH_1
2933 : VARIABLE_LENGTH_INTEGER_LENGTH_0;
2934
2935 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07002936 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05002937 ? packet99
dschinaziceed8662020-07-14 09:37:05 -07002938 : (framer_.version().HasLongHeaderLengths()
dschinazic73506e2019-09-20 13:26:46 -07002939 ? packet49
dschinaziceed8662020-07-14 09:37:05 -07002940 : (framer_.version().HasIetfInvariantHeader() ? packet46
2941 : packet));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002942 std::unique_ptr<QuicEncryptedPacket> encrypted(
2943 AssemblePacketFromFragments(fragments));
2944 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2945
bncf6f82b12019-10-30 07:01:01 -07002946 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002947 ASSERT_TRUE(visitor_.header_.get());
2948 EXPECT_TRUE(CheckDecryption(
2949 *encrypted, kIncludeVersion, !kIncludeDiversificationNonce,
2950 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID,
2951 retry_token_length_length, retry_token_length, length_length));
2952
2953 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2954 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2955 // Stream ID should be the last 3 bytes of kStreamId.
2956 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2957 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2958 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2959 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2960
dschinaziceed8662020-07-14 09:37:05 -07002961 CheckFramingBoundaries(fragments, framer_.version().HasLongHeaderLengths()
2962 ? QUIC_INVALID_PACKET_HEADER
2963 : QUIC_INVALID_STREAM_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002964}
2965
2966TEST_P(QuicFramerTest, RejectPacket) {
zhongyi546cc452019-04-12 15:27:49 -07002967 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002968 visitor_.accept_packet_ = false;
2969
2970 // clang-format off
2971 unsigned char packet[] = {
2972 // public flags (8 byte connection_id)
2973 0x28,
2974 // connection_id
2975 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2976 // packet number
2977 0x12, 0x34, 0x56, 0x78,
2978
2979 // frame type (stream frame with fin)
2980 0xFF,
2981 // stream id
2982 0x01, 0x02, 0x03, 0x04,
2983 // offset
2984 0x3A, 0x98, 0xFE, 0xDC,
2985 0x32, 0x10, 0x76, 0x54,
2986 // data length
2987 0x00, 0x0c,
2988 // data
2989 'h', 'e', 'l', 'l',
2990 'o', ' ', 'w', 'o',
2991 'r', 'l', 'd', '!',
2992 };
2993
QUICHE teama6ef0a62019-03-07 20:34:33 -05002994 unsigned char packet46[] = {
2995 // type (short header, 4 byte packet number)
2996 0x43,
2997 // connection_id
2998 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2999 // packet number
3000 0x12, 0x34, 0x56, 0x78,
3001
3002 // frame type (STREAM Frame with FIN, LEN, and OFFSET bits set)
3003 0x10 | 0x01 | 0x02 | 0x04,
3004 // stream id
3005 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
3006 // offset
3007 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
3008 0x32, 0x10, 0x76, 0x54,
3009 // data length
3010 kVarInt62OneByte + 0x0c,
3011 // data
3012 'h', 'e', 'l', 'l',
3013 'o', ' ', 'w', 'o',
3014 'r', 'l', 'd', '!',
3015 };
3016 // clang-format on
3017
3018 unsigned char* p = packet;
dschinaziceed8662020-07-14 09:37:05 -07003019 if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003020 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05003021 }
3022 QuicEncryptedPacket encrypted(AsChars(p),
dschinaziceed8662020-07-14 09:37:05 -07003023 framer_.version().HasIetfInvariantHeader()
vasilvvbed67c62020-10-20 06:38:43 -07003024 ? ABSL_ARRAYSIZE(packet46)
3025 : ABSL_ARRAYSIZE(packet),
QUICHE teama6ef0a62019-03-07 20:34:33 -05003026 false);
3027 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
3028
bncf6f82b12019-10-30 07:01:01 -07003029 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05003030 ASSERT_TRUE(visitor_.header_.get());
3031 EXPECT_TRUE(CheckDecryption(
3032 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3033 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
3034
3035 ASSERT_EQ(0u, visitor_.stream_frames_.size());
3036 EXPECT_EQ(0u, visitor_.ack_frames_.size());
3037}
3038
3039TEST_P(QuicFramerTest, RejectPublicHeader) {
3040 visitor_.accept_public_header_ = false;
3041
3042 // clang-format off
3043 unsigned char packet[] = {
3044 // public flags (8 byte connection_id)
3045 0x28,
3046 // connection_id
3047 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3048 };
3049
QUICHE teama6ef0a62019-03-07 20:34:33 -05003050 unsigned char packet46[] = {
3051 // type (short header, 1 byte packet number)
3052 0x40,
3053 // connection_id
3054 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3055 // packet number
3056 0x01,
3057 };
3058 // clang-format on
3059
dschinaziceed8662020-07-14 09:37:05 -07003060 QuicEncryptedPacket encrypted(
3061 framer_.version().HasIetfInvariantHeader() ? AsChars(packet46)
3062 : AsChars(packet),
vasilvvbed67c62020-10-20 06:38:43 -07003063 framer_.version().HasIetfInvariantHeader() ? ABSL_ARRAYSIZE(packet46)
3064 : ABSL_ARRAYSIZE(packet),
dschinaziceed8662020-07-14 09:37:05 -07003065 false);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003066 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
3067
bncf6f82b12019-10-30 07:01:01 -07003068 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05003069 ASSERT_TRUE(visitor_.header_.get());
3070 EXPECT_FALSE(visitor_.header_->packet_number.IsInitialized());
3071}
3072
3073TEST_P(QuicFramerTest, AckFrameOneAckBlock) {
zhongyi546cc452019-04-12 15:27:49 -07003074 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003075 // clang-format off
3076 PacketFragments packet = {
3077 // public flags (8 byte connection_id)
3078 {"",
3079 {0x2C}},
3080 // connection_id
3081 {"",
3082 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3083 // packet number
3084 {"",
3085 {0x12, 0x34, 0x56, 0x78}},
3086 // frame type (ack frame)
3087 // (one ack block, 2 byte largest observed, 2 byte block length)
3088 {"",
3089 {0x45}},
3090 // largest acked
3091 {"Unable to read largest acked.",
3092 {0x12, 0x34}},
3093 // Zero delta time.
3094 {"Unable to read ack delay time.",
3095 {0x00, 0x00}},
3096 // first ack block length.
3097 {"Unable to read first ack block length.",
3098 {0x12, 0x34}},
3099 // num timestamps.
3100 {"Unable to read num received packets.",
3101 {0x00}}
3102 };
3103
QUICHE teama6ef0a62019-03-07 20:34:33 -05003104 PacketFragments packet46 = {
3105 // type (short packet, 4 byte packet number)
3106 {"",
3107 {0x43}},
3108 // connection_id
3109 {"",
3110 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3111 // packet number
3112 {"",
3113 {0x12, 0x34, 0x56, 0x78}},
3114 // frame type (ack frame)
3115 // (one ack block, 2 byte largest observed, 2 byte block length)
3116 {"",
3117 {0x45}},
3118 // largest acked
3119 {"Unable to read largest acked.",
3120 {0x12, 0x34}},
3121 // Zero delta time.
3122 {"Unable to read ack delay time.",
3123 {0x00, 0x00}},
3124 // first ack block length.
3125 {"Unable to read first ack block length.",
3126 {0x12, 0x34}},
3127 // num timestamps.
3128 {"Unable to read num received packets.",
3129 {0x00}}
3130 };
3131
3132 PacketFragments packet99 = {
3133 // type (short packet, 4 byte packet number)
3134 {"",
3135 {0x43}},
3136 // connection_id
3137 {"",
3138 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3139 // packet number
3140 {"",
3141 {0x12, 0x34, 0x56, 0x78}},
3142 // frame type (IETF_ACK)
3143 // (one ack block, 2 byte largest observed, 2 byte block length)
3144 // IETF-Quic ignores the bit-fields in the ack type, all of
3145 // that information is encoded elsewhere in the frame.
3146 {"",
3147 {0x02}},
3148 // largest acked
3149 {"Unable to read largest acked.",
3150 {kVarInt62TwoBytes + 0x12, 0x34}},
3151 // Zero delta time.
3152 {"Unable to read ack delay time.",
3153 {kVarInt62OneByte + 0x00}},
3154 // Ack block count (0 -- no blocks after the first)
3155 {"Unable to read ack block count.",
3156 {kVarInt62OneByte + 0x00}},
3157 // first ack block length - 1.
3158 // IETF Quic defines the ack block's value as the "number of
3159 // packets that preceed the largest packet number in the block"
3160 // which for the 1st ack block is the largest acked field,
3161 // above. This means that if we are acking just packet 0x1234
3162 // then the 1st ack block will be 0.
3163 {"Unable to read first ack block length.",
3164 {kVarInt62TwoBytes + 0x12, 0x33}}
3165 };
3166 // clang-format on
3167
3168 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07003169 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05003170 ? packet99
dschinaziceed8662020-07-14 09:37:05 -07003171 : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003172 std::unique_ptr<QuicEncryptedPacket> encrypted(
3173 AssemblePacketFromFragments(fragments));
3174 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3175
bncf6f82b12019-10-30 07:01:01 -07003176 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05003177 ASSERT_TRUE(visitor_.header_.get());
3178 EXPECT_TRUE(CheckDecryption(
3179 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3180 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
3181
3182 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3183 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3184 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3185 EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
3186 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
3187
3188 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3189}
3190
3191// This test checks that the ack frame processor correctly identifies
3192// and handles the case where the first ack block is larger than the
3193// largest_acked packet.
3194TEST_P(QuicFramerTest, FirstAckFrameUnderflow) {
zhongyi546cc452019-04-12 15:27:49 -07003195 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003196 // clang-format off
3197 PacketFragments packet = {
3198 // public flags (8 byte connection_id)
3199 {"",
3200 {0x2C}},
3201 // connection_id
3202 {"",
3203 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3204 // packet number
3205 {"",
3206 {0x12, 0x34, 0x56, 0x78}},
3207 // frame type (ack frame)
3208 // (one ack block, 2 byte largest observed, 2 byte block length)
3209 {"",
3210 {0x45}},
3211 // largest acked
3212 {"Unable to read largest acked.",
3213 {0x12, 0x34}},
3214 // Zero delta time.
3215 {"Unable to read ack delay time.",
3216 {0x00, 0x00}},
3217 // first ack block length.
3218 {"Unable to read first ack block length.",
3219 {0x88, 0x88}},
3220 // num timestamps.
3221 {"Underflow with first ack block length 34952 largest acked is 4660.",
3222 {0x00}}
3223 };
3224
QUICHE teama6ef0a62019-03-07 20:34:33 -05003225 PacketFragments packet46 = {
3226 // type (short header, 4 byte packet number)
3227 {"",
3228 {0x43}},
3229 // connection_id
3230 {"",
3231 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3232 // packet number
3233 {"",
3234 {0x12, 0x34, 0x56, 0x78}},
3235 // frame type (ack frame)
3236 // (one ack block, 2 byte largest observed, 2 byte block length)
3237 {"",
3238 {0x45}},
3239 // largest acked
3240 {"Unable to read largest acked.",
3241 {0x12, 0x34}},
3242 // Zero delta time.
3243 {"Unable to read ack delay time.",
3244 {0x00, 0x00}},
3245 // first ack block length.
3246 {"Unable to read first ack block length.",
3247 {0x88, 0x88}},
3248 // num timestamps.
3249 {"Underflow with first ack block length 34952 largest acked is 4660.",
3250 {0x00}}
3251 };
3252
3253 PacketFragments packet99 = {
3254 // type (short header, 4 byte packet number)
3255 {"",
3256 {0x43}},
3257 // connection_id
3258 {"",
3259 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3260 // packet number
3261 {"",
3262 {0x12, 0x34, 0x56, 0x78}},
3263 // frame type (IETF_ACK)
3264 {"",
3265 {0x02}},
3266 // largest acked
3267 {"Unable to read largest acked.",
3268 {kVarInt62TwoBytes + 0x12, 0x34}},
3269 // Zero delta time.
3270 {"Unable to read ack delay time.",
3271 {kVarInt62OneByte + 0x00}},
3272 // Ack block count (0 -- no blocks after the first)
3273 {"Unable to read ack block count.",
3274 {kVarInt62OneByte + 0x00}},
3275 // first ack block length.
3276 {"Unable to read first ack block length.",
3277 {kVarInt62TwoBytes + 0x28, 0x88}}
3278 };
3279 // clang-format on
3280
3281 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07003282 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05003283 ? packet99
dschinaziceed8662020-07-14 09:37:05 -07003284 : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003285 std::unique_ptr<QuicEncryptedPacket> encrypted(
3286 AssemblePacketFromFragments(fragments));
3287 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3288 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3289}
3290
3291// This test checks that the ack frame processor correctly identifies
3292// and handles the case where the third ack block's gap is larger than the
3293// available space in the ack range.
3294TEST_P(QuicFramerTest, ThirdAckBlockUnderflowGap) {
fkastenholz305e1732019-06-18 05:01:22 -07003295 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07003296 // Test originally written for development of IETF QUIC. The test may
3297 // also apply to Google QUIC. If so, the test should be extended to
3298 // include Google QUIC (frame formats, etc). See b/141858819.
QUICHE teama6ef0a62019-03-07 20:34:33 -05003299 return;
3300 }
zhongyi546cc452019-04-12 15:27:49 -07003301 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003302 // clang-format off
3303 PacketFragments packet99 = {
3304 // type (short header, 4 byte packet number)
3305 {"",
3306 {0x43}},
3307 // connection_id
3308 {"",
3309 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3310 // packet number
3311 {"",
3312 {0x12, 0x34, 0x56, 0x78}},
3313 // frame type (IETF_ACK frame)
3314 {"",
3315 {0x02}},
3316 // largest acked
3317 {"Unable to read largest acked.",
3318 {kVarInt62OneByte + 63}},
3319 // Zero delta time.
3320 {"Unable to read ack delay time.",
3321 {kVarInt62OneByte + 0x00}},
3322 // Ack block count (2 -- 2 blocks after the first)
3323 {"Unable to read ack block count.",
3324 {kVarInt62OneByte + 0x02}},
3325 // first ack block length.
3326 {"Unable to read first ack block length.",
3327 {kVarInt62OneByte + 13}}, // Ack 14 packets, range 50..63 (inclusive)
3328
3329 {"Unable to read gap block value.",
3330 {kVarInt62OneByte + 9}}, // Gap 10 packets, 40..49 (inclusive)
3331 {"Unable to read ack block value.",
3332 {kVarInt62OneByte + 9}}, // Ack 10 packets, 30..39 (inclusive)
3333 {"Unable to read gap block value.",
3334 {kVarInt62OneByte + 29}}, // A gap of 30 packets (0..29 inclusive)
3335 // should be too big, leaving no room
3336 // for the ack.
3337 {"Underflow with gap block length 30 previous ack block start is 30.",
3338 {kVarInt62OneByte + 10}}, // Don't care
3339 };
3340 // clang-format on
3341
3342 std::unique_ptr<QuicEncryptedPacket> encrypted(
3343 AssemblePacketFromFragments(packet99));
3344 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3345 EXPECT_EQ(
3346 framer_.detailed_error(),
3347 "Underflow with gap block length 30 previous ack block start is 30.");
3348 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3349}
3350
3351// This test checks that the ack frame processor correctly identifies
3352// and handles the case where the third ack block's length is larger than the
3353// available space in the ack range.
3354TEST_P(QuicFramerTest, ThirdAckBlockUnderflowAck) {
fkastenholz305e1732019-06-18 05:01:22 -07003355 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07003356 // Test originally written for development of IETF QUIC. The test may
3357 // also apply to Google QUIC. If so, the test should be extended to
3358 // include Google QUIC (frame formats, etc). See b/141858819.
QUICHE teama6ef0a62019-03-07 20:34:33 -05003359 return;
3360 }
zhongyi546cc452019-04-12 15:27:49 -07003361 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003362 // clang-format off
3363 PacketFragments packet99 = {
3364 // type (short header, 4 byte packet number)
3365 {"",
3366 {0x43}},
3367 // connection_id
3368 {"",
3369 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3370 // packet number
3371 {"",
3372 {0x12, 0x34, 0x56, 0x78}},
3373 // frame type (IETF_ACK frame)
3374 {"",
3375 {0x02}},
3376 // largest acked
3377 {"Unable to read largest acked.",
3378 {kVarInt62OneByte + 63}},
3379 // Zero delta time.
3380 {"Unable to read ack delay time.",
3381 {kVarInt62OneByte + 0x00}},
3382 // Ack block count (2 -- 2 blocks after the first)
3383 {"Unable to read ack block count.",
3384 {kVarInt62OneByte + 0x02}},
3385 // first ack block length.
3386 {"Unable to read first ack block length.",
3387 {kVarInt62OneByte + 13}}, // only 50 packet numbers "left"
3388
3389 {"Unable to read gap block value.",
3390 {kVarInt62OneByte + 10}}, // Only 40 packet numbers left
3391 {"Unable to read ack block value.",
3392 {kVarInt62OneByte + 10}}, // only 30 packet numbers left.
3393 {"Unable to read gap block value.",
3394 {kVarInt62OneByte + 1}}, // Gap is OK, 29 packet numbers left
3395 {"Unable to read ack block value.",
3396 {kVarInt62OneByte + 30}}, // Use up all 30, should be an error
3397 };
3398 // clang-format on
3399
3400 std::unique_ptr<QuicEncryptedPacket> encrypted(
3401 AssemblePacketFromFragments(packet99));
3402 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3403 EXPECT_EQ(framer_.detailed_error(),
3404 "Underflow with ack block length 31 latest ack block end is 25.");
3405 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3406}
3407
3408// Tests a variety of ack block wrap scenarios. For example, if the
3409// N-1th block causes packet 0 to be acked, then a gap would wrap
3410// around to 0x3fffffff ffffffff... Make sure we detect this
3411// condition.
3412TEST_P(QuicFramerTest, AckBlockUnderflowGapWrap) {
fkastenholz305e1732019-06-18 05:01:22 -07003413 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07003414 // Test originally written for development of IETF QUIC. The test may
3415 // also apply to Google QUIC. If so, the test should be extended to
3416 // include Google QUIC (frame formats, etc). See b/141858819.
QUICHE teama6ef0a62019-03-07 20:34:33 -05003417 return;
3418 }
zhongyi546cc452019-04-12 15:27:49 -07003419 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003420 // clang-format off
3421 PacketFragments packet99 = {
3422 // type (short header, 4 byte packet number)
3423 {"",
3424 {0x43}},
3425 // connection_id
3426 {"",
3427 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3428 // packet number
3429 {"",
3430 {0x12, 0x34, 0x56, 0x78}},
3431 // frame type (IETF_ACK frame)
3432 {"",
3433 {0x02}},
3434 // largest acked
3435 {"Unable to read largest acked.",
3436 {kVarInt62OneByte + 10}},
3437 // Zero delta time.
3438 {"Unable to read ack delay time.",
3439 {kVarInt62OneByte + 0x00}},
3440 // Ack block count (1 -- 1 blocks after the first)
3441 {"Unable to read ack block count.",
3442 {kVarInt62OneByte + 1}},
3443 // first ack block length.
3444 {"Unable to read first ack block length.",
3445 {kVarInt62OneByte + 9}}, // Ack packets 1..10 (inclusive)
3446
3447 {"Unable to read gap block value.",
3448 {kVarInt62OneByte + 1}}, // Gap of 2 packets (-1...0), should wrap
3449 {"Underflow with gap block length 2 previous ack block start is 1.",
3450 {kVarInt62OneByte + 9}}, // irrelevant
3451 };
3452 // clang-format on
3453
3454 std::unique_ptr<QuicEncryptedPacket> encrypted(
3455 AssemblePacketFromFragments(packet99));
3456 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3457 EXPECT_EQ(framer_.detailed_error(),
3458 "Underflow with gap block length 2 previous ack block start is 1.");
3459 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3460}
3461
3462// As AckBlockUnderflowGapWrap, but in this test, it's the ack
3463// component of the ack-block that causes the wrap, not the gap.
3464TEST_P(QuicFramerTest, AckBlockUnderflowAckWrap) {
fkastenholz305e1732019-06-18 05:01:22 -07003465 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07003466 // Test originally written for development of IETF QUIC. The test may
3467 // also apply to Google QUIC. If so, the test should be extended to
3468 // include Google QUIC (frame formats, etc). See b/141858819.
QUICHE teama6ef0a62019-03-07 20:34:33 -05003469 return;
3470 }
zhongyi546cc452019-04-12 15:27:49 -07003471 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003472 // clang-format off
3473 PacketFragments packet99 = {
3474 // type (short header, 4 byte packet number)
3475 {"",
3476 {0x43}},
3477 // connection_id
3478 {"",
3479 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3480 // packet number
3481 {"",
3482 {0x12, 0x34, 0x56, 0x78}},
3483 // frame type (IETF_ACK frame)
3484 {"",
3485 {0x02}},
3486 // largest acked
3487 {"Unable to read largest acked.",
3488 {kVarInt62OneByte + 10}},
3489 // Zero delta time.
3490 {"Unable to read ack delay time.",
3491 {kVarInt62OneByte + 0x00}},
3492 // Ack block count (1 -- 1 blocks after the first)
3493 {"Unable to read ack block count.",
3494 {kVarInt62OneByte + 1}},
3495 // first ack block length.
3496 {"Unable to read first ack block length.",
3497 {kVarInt62OneByte + 6}}, // Ack packets 4..10 (inclusive)
3498
3499 {"Unable to read gap block value.",
3500 {kVarInt62OneByte + 1}}, // Gap of 2 packets (2..3)
3501 {"Unable to read ack block value.",
3502 {kVarInt62OneByte + 9}}, // Should wrap.
3503 };
3504 // clang-format on
3505
3506 std::unique_ptr<QuicEncryptedPacket> encrypted(
3507 AssemblePacketFromFragments(packet99));
3508 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3509 EXPECT_EQ(framer_.detailed_error(),
3510 "Underflow with ack block length 10 latest ack block end is 1.");
3511 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3512}
3513
3514// An ack block that acks the entire range, 1...0x3fffffffffffffff
3515TEST_P(QuicFramerTest, AckBlockAcksEverything) {
fkastenholz305e1732019-06-18 05:01:22 -07003516 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07003517 // Test originally written for development of IETF QUIC. The test may
3518 // also apply to Google QUIC. If so, the test should be extended to
3519 // include Google QUIC (frame formats, etc). See b/141858819.
QUICHE teama6ef0a62019-03-07 20:34:33 -05003520 return;
3521 }
zhongyi546cc452019-04-12 15:27:49 -07003522 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003523 // clang-format off
3524 PacketFragments packet99 = {
3525 // type (short header, 4 byte packet number)
3526 {"",
3527 {0x43}},
3528 // connection_id
3529 {"",
3530 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3531 // packet number
3532 {"",
3533 {0x12, 0x34, 0x56, 0x78}},
3534 // frame type (IETF_ACK frame)
3535 {"",
3536 {0x02}},
3537 // largest acked
3538 {"Unable to read largest acked.",
3539 {kVarInt62EightBytes + 0x3f, 0xff, 0xff, 0xff,
3540 0xff, 0xff, 0xff, 0xff}},
3541 // Zero delta time.
3542 {"Unable to read ack delay time.",
3543 {kVarInt62OneByte + 0x00}},
3544 // Ack block count No additional blocks
3545 {"Unable to read ack block count.",
3546 {kVarInt62OneByte + 0}},
3547 // first ack block length.
3548 {"Unable to read first ack block length.",
3549 {kVarInt62EightBytes + 0x3f, 0xff, 0xff, 0xff,
3550 0xff, 0xff, 0xff, 0xfe}},
3551 };
3552 // clang-format on
3553
3554 std::unique_ptr<QuicEncryptedPacket> encrypted(
3555 AssemblePacketFromFragments(packet99));
3556 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3557 EXPECT_EQ(1u, visitor_.ack_frames_.size());
3558 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3559 EXPECT_EQ(1u, frame.packets.NumIntervals());
3560 EXPECT_EQ(kLargestIetfLargestObserved, LargestAcked(frame));
3561 EXPECT_EQ(kLargestIetfLargestObserved.ToUint64(),
3562 frame.packets.NumPacketsSlow());
3563}
3564
3565// This test looks for a malformed ack where
3566// - There is a largest-acked value (that is, the frame is acking
3567// something,
3568// - But the length of the first ack block is 0 saying that no frames
3569// are being acked with the largest-acked value or there are no
3570// additional ack blocks.
3571//
3572TEST_P(QuicFramerTest, AckFrameFirstAckBlockLengthZero) {
fkastenholz305e1732019-06-18 05:01:22 -07003573 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003574 // Not applicable to version 99 -- first ack block contains the
3575 // number of packets that preceed the largest_acked packet.
3576 // A value of 0 means no packets preceed --- that the block's
3577 // length is 1. Therefore the condition that this test checks can
3578 // not arise.
3579 return;
3580 }
nharper9bb83462019-05-01 10:53:22 -07003581 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003582
3583 // clang-format off
3584 PacketFragments packet = {
3585 // public flags (8 byte connection_id)
3586 {"",
3587 { 0x2C }},
3588 // connection_id
3589 {"",
3590 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3591 // packet number
3592 {"",
3593 { 0x12, 0x34, 0x56, 0x78 }},
3594
3595 // frame type (ack frame)
3596 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3597 {"",
3598 { 0x65 }},
3599 // largest acked
3600 {"Unable to read largest acked.",
3601 { 0x12, 0x34 }},
3602 // Zero delta time.
3603 {"Unable to read ack delay time.",
3604 { 0x00, 0x00 }},
3605 // num ack blocks ranges.
3606 {"Unable to read num of ack blocks.",
3607 { 0x01 }},
3608 // first ack block length.
3609 {"Unable to read first ack block length.",
3610 { 0x00, 0x00 }},
3611 // gap to next block.
3612 { "First block length is zero.",
3613 { 0x01 }},
3614 // ack block length.
3615 { "First block length is zero.",
3616 { 0x0e, 0xaf }},
3617 // Number of timestamps.
3618 { "First block length is zero.",
3619 { 0x00 }},
3620 };
3621
QUICHE teama6ef0a62019-03-07 20:34:33 -05003622 PacketFragments packet46 = {
3623 // type (short header, 4 byte packet number)
3624 {"",
3625 { 0x43 }},
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 { 0x01 }},
3646 // first ack block length.
3647 {"Unable to read first ack block length.",
3648 { 0x00, 0x00 }},
3649 // gap to next block.
3650 { "First block length is zero.",
3651 { 0x01 }},
3652 // ack block length.
3653 { "First block length is zero.",
3654 { 0x0e, 0xaf }},
3655 // Number of timestamps.
3656 { "First block length is zero.",
3657 { 0x00 }},
3658 };
3659
3660 // clang-format on
3661 PacketFragments& fragments =
dschinaziceed8662020-07-14 09:37:05 -07003662 framer_.version().HasIetfInvariantHeader() ? packet46 : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -05003663
3664 std::unique_ptr<QuicEncryptedPacket> encrypted(
3665 AssemblePacketFromFragments(fragments));
3666
3667 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07003668 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_ACK_DATA));
QUICHE teama6ef0a62019-03-07 20:34:33 -05003669
3670 ASSERT_TRUE(visitor_.header_.get());
3671 EXPECT_TRUE(CheckDecryption(
3672 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3673 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
3674
3675 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3676 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3677
3678 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3679}
3680
3681TEST_P(QuicFramerTest, AckFrameOneAckBlockMaxLength) {
zhongyi546cc452019-04-12 15:27:49 -07003682 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003683 // clang-format off
3684 PacketFragments packet = {
3685 // public flags (8 byte connection_id)
3686 {"",
3687 {0x2C}},
3688 // connection_id
3689 {"",
3690 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3691 // packet number
3692 {"",
3693 {0x12, 0x34, 0x56, 0x78}},
3694 // frame type (ack frame)
3695 // (one ack block, 4 byte largest observed, 2 byte block length)
3696 {"",
3697 {0x49}},
3698 // largest acked
3699 {"Unable to read largest acked.",
3700 {0x12, 0x34, 0x56, 0x78}},
3701 // Zero delta time.
3702 {"Unable to read ack delay time.",
3703 {0x00, 0x00}},
3704 // first ack block length.
3705 {"Unable to read first ack block length.",
3706 {0x12, 0x34}},
3707 // num timestamps.
3708 {"Unable to read num received packets.",
3709 {0x00}}
3710 };
3711
QUICHE teama6ef0a62019-03-07 20:34:33 -05003712 PacketFragments packet46 = {
3713 // type (short header, 4 byte packet number)
3714 {"",
3715 {0x43}},
3716 // connection_id
3717 {"",
3718 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3719 // packet number
3720 {"",
3721 {0x56, 0x78, 0x9A, 0xBC}},
3722 // frame type (ack frame)
3723 // (one ack block, 4 byte largest observed, 2 byte block length)
3724 {"",
3725 {0x49}},
3726 // largest acked
3727 {"Unable to read largest acked.",
3728 {0x12, 0x34, 0x56, 0x78}},
3729 // Zero delta time.
3730 {"Unable to read ack delay time.",
3731 {0x00, 0x00}},
3732 // first ack block length.
3733 {"Unable to read first ack block length.",
3734 {0x12, 0x34}},
3735 // num timestamps.
3736 {"Unable to read num received packets.",
3737 {0x00}}
3738 };
3739
3740 PacketFragments packet99 = {
3741 // type (short header, 4 byte packet number)
3742 {"",
3743 {0x43}},
3744 // connection_id
3745 {"",
3746 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3747 // packet number
3748 {"",
3749 {0x56, 0x78, 0x9A, 0xBC}},
3750 // frame type (IETF_ACK frame)
3751 {"",
3752 {0x02}},
3753 // largest acked
3754 {"Unable to read largest acked.",
3755 {kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78}},
3756 // Zero delta time.
3757 {"Unable to read ack delay time.",
3758 {kVarInt62OneByte + 0x00}},
3759 // Number of ack blocks after first
3760 {"Unable to read ack block count.",
3761 {kVarInt62OneByte + 0x00}},
3762 // first ack block length.
3763 {"Unable to read first ack block length.",
3764 {kVarInt62TwoBytes + 0x12, 0x33}}
3765 };
3766 // clang-format on
3767
3768 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07003769 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05003770 ? packet99
dschinaziceed8662020-07-14 09:37:05 -07003771 : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003772 std::unique_ptr<QuicEncryptedPacket> encrypted(
3773 AssemblePacketFromFragments(fragments));
3774 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3775
bncf6f82b12019-10-30 07:01:01 -07003776 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05003777 ASSERT_TRUE(visitor_.header_.get());
3778 EXPECT_TRUE(CheckDecryption(
3779 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3780 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
3781
3782 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3783 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3784 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3785 EXPECT_EQ(kPacketNumber, LargestAcked(frame));
3786 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
3787
3788 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3789}
3790
3791// Tests ability to handle multiple ackblocks after the first ack
3792// block. Non-version-99 tests include multiple timestamps as well.
3793TEST_P(QuicFramerTest, AckFrameTwoTimeStampsMultipleAckBlocks) {
zhongyi546cc452019-04-12 15:27:49 -07003794 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003795 // clang-format off
3796 PacketFragments packet = {
3797 // public flags (8 byte connection_id)
3798 {"",
3799 { 0x2C }},
3800 // connection_id
3801 {"",
3802 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3803 // packet number
3804 {"",
3805 { 0x12, 0x34, 0x56, 0x78 }},
3806
3807 // frame type (ack frame)
3808 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3809 {"",
3810 { 0x65 }},
3811 // largest acked
3812 {"Unable to read largest acked.",
3813 { 0x12, 0x34 }},
3814 // Zero delta time.
3815 {"Unable to read ack delay time.",
3816 { 0x00, 0x00 }},
3817 // num ack blocks ranges.
3818 {"Unable to read num of ack blocks.",
3819 { 0x04 }},
3820 // first ack block length.
3821 {"Unable to read first ack block length.",
3822 { 0x00, 0x01 }},
3823 // gap to next block.
3824 { "Unable to read gap to next ack block.",
3825 { 0x01 }},
3826 // ack block length.
3827 { "Unable to ack block length.",
3828 { 0x0e, 0xaf }},
3829 // gap to next block.
3830 { "Unable to read gap to next ack block.",
3831 { 0xff }},
3832 // ack block length.
3833 { "Unable to ack block length.",
3834 { 0x00, 0x00 }},
3835 // gap to next block.
3836 { "Unable to read gap to next ack block.",
3837 { 0x91 }},
3838 // ack block length.
3839 { "Unable to ack block length.",
3840 { 0x01, 0xea }},
3841 // gap to next block.
3842 { "Unable to read gap to next ack block.",
3843 { 0x05 }},
3844 // ack block length.
3845 { "Unable to ack block length.",
3846 { 0x00, 0x04 }},
3847 // Number of timestamps.
3848 { "Unable to read num received packets.",
3849 { 0x02 }},
3850 // Delta from largest observed.
3851 { "Unable to read sequence delta in received packets.",
3852 { 0x01 }},
3853 // Delta time.
3854 { "Unable to read time delta in received packets.",
3855 { 0x76, 0x54, 0x32, 0x10 }},
3856 // Delta from largest observed.
3857 { "Unable to read sequence delta in received packets.",
3858 { 0x02 }},
3859 // Delta time.
3860 { "Unable to read incremental time delta in received packets.",
3861 { 0x32, 0x10 }},
3862 };
3863
QUICHE teama6ef0a62019-03-07 20:34:33 -05003864 PacketFragments packet46 = {
3865 // type (short header, 4 byte packet number)
3866 {"",
3867 { 0x43 }},
3868 // connection_id
3869 {"",
3870 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3871 // packet number
3872 {"",
3873 { 0x12, 0x34, 0x56, 0x78 }},
3874
3875 // frame type (ack frame)
3876 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3877 {"",
3878 { 0x65 }},
3879 // largest acked
3880 {"Unable to read largest acked.",
3881 { 0x12, 0x34 }},
3882 // Zero delta time.
3883 {"Unable to read ack delay time.",
3884 { 0x00, 0x00 }},
3885 // num ack blocks ranges.
3886 {"Unable to read num of ack blocks.",
3887 { 0x04 }},
3888 // first ack block length.
3889 {"Unable to read first ack block length.",
3890 { 0x00, 0x01 }},
3891 // gap to next block.
3892 { "Unable to read gap to next ack block.",
3893 { 0x01 }},
3894 // ack block length.
3895 { "Unable to ack block length.",
3896 { 0x0e, 0xaf }},
3897 // gap to next block.
3898 { "Unable to read gap to next ack block.",
3899 { 0xff }},
3900 // ack block length.
3901 { "Unable to ack block length.",
3902 { 0x00, 0x00 }},
3903 // gap to next block.
3904 { "Unable to read gap to next ack block.",
3905 { 0x91 }},
3906 // ack block length.
3907 { "Unable to ack block length.",
3908 { 0x01, 0xea }},
3909 // gap to next block.
3910 { "Unable to read gap to next ack block.",
3911 { 0x05 }},
3912 // ack block length.
3913 { "Unable to ack block length.",
3914 { 0x00, 0x04 }},
3915 // Number of timestamps.
3916 { "Unable to read num received packets.",
3917 { 0x02 }},
3918 // Delta from largest observed.
3919 { "Unable to read sequence delta in received packets.",
3920 { 0x01 }},
3921 // Delta time.
3922 { "Unable to read time delta in received packets.",
3923 { 0x76, 0x54, 0x32, 0x10 }},
3924 // Delta from largest observed.
3925 { "Unable to read sequence delta in received packets.",
3926 { 0x02 }},
3927 // Delta time.
3928 { "Unable to read incremental time delta in received packets.",
3929 { 0x32, 0x10 }},
3930 };
3931
3932 PacketFragments packet99 = {
3933 // type (short header, 4 byte packet number)
3934 {"",
3935 { 0x43 }},
3936 // connection_id
3937 {"",
3938 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3939 // packet number
3940 {"",
3941 { 0x12, 0x34, 0x56, 0x78 }},
3942
3943 // frame type (IETF_ACK frame)
3944 {"",
3945 { 0x02 }},
3946 // largest acked
3947 {"Unable to read largest acked.",
3948 { kVarInt62TwoBytes + 0x12, 0x34 }}, // = 4660
3949 // Zero delta time.
3950 {"Unable to read ack delay time.",
3951 { kVarInt62OneByte + 0x00 }},
3952 // number of additional ack blocks
3953 {"Unable to read ack block count.",
3954 { kVarInt62OneByte + 0x03 }},
3955 // first ack block length.
3956 {"Unable to read first ack block length.",
3957 { kVarInt62OneByte + 0x00 }}, // 1st block length = 1
3958
3959 // Additional ACK Block #1
3960 // gap to next block.
3961 { "Unable to read gap block value.",
3962 { kVarInt62OneByte + 0x00 }}, // gap of 1 packet
3963 // ack block length.
3964 { "Unable to read ack block value.",
3965 { kVarInt62TwoBytes + 0x0e, 0xae }}, // 3759
3966
3967 // pre-version-99 test includes an ack block of 0 length. this
3968 // can not happen in version 99. ergo the second block is not
3969 // present in the v99 test and the gap length of the next block
3970 // is the sum of the two gaps in the pre-version-99 tests.
3971 // Additional ACK Block #2
3972 // gap to next block.
3973 { "Unable to read gap block value.",
3974 { kVarInt62TwoBytes + 0x01, 0x8f }}, // Gap is 400 (0x190) pkts
3975 // ack block length.
3976 { "Unable to read ack block value.",
3977 { kVarInt62TwoBytes + 0x01, 0xe9 }}, // block is 389 (x1ea) pkts
3978
3979 // Additional ACK Block #3
3980 // gap to next block.
3981 { "Unable to read gap block value.",
3982 { kVarInt62OneByte + 0x04 }}, // Gap is 5 packets.
3983 // ack block length.
3984 { "Unable to read ack block value.",
3985 { kVarInt62OneByte + 0x03 }}, // block is 3 packets.
3986 };
3987
3988 // clang-format on
3989 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07003990 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05003991 ? packet99
dschinaziceed8662020-07-14 09:37:05 -07003992 : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003993
3994 std::unique_ptr<QuicEncryptedPacket> encrypted(
3995 AssemblePacketFromFragments(fragments));
3996
3997 framer_.set_process_timestamps(true);
3998 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3999
bncf6f82b12019-10-30 07:01:01 -07004000 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05004001 ASSERT_TRUE(visitor_.header_.get());
4002 EXPECT_TRUE(CheckDecryption(
4003 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4004 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4005
4006 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4007 ASSERT_EQ(1u, visitor_.ack_frames_.size());
4008 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
4009 EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
4010 ASSERT_EQ(4254u, frame.packets.NumPacketsSlow());
4011 EXPECT_EQ(4u, frame.packets.NumIntervals());
fkastenholz305e1732019-06-18 05:01:22 -07004012 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004013 EXPECT_EQ(0u, frame.received_packet_times.size());
4014 } else {
4015 EXPECT_EQ(2u, frame.received_packet_times.size());
4016 }
4017 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
4018}
4019
4020TEST_P(QuicFramerTest, AckFrameTimeStampDeltaTooHigh) {
nharper9bb83462019-05-01 10:53:22 -07004021 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004022 // clang-format off
4023 unsigned char packet[] = {
4024 // public flags (8 byte connection_id)
4025 0x28,
4026 // connection_id
4027 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4028 // packet number
4029 0x12, 0x34, 0x56, 0x78,
4030
4031 // frame type (ack frame)
4032 // (no ack blocks, 1 byte largest observed, 1 byte block length)
4033 0x40,
4034 // largest acked
4035 0x01,
4036 // Zero delta time.
4037 0x00, 0x00,
4038 // first ack block length.
4039 0x01,
4040 // num timestamps.
4041 0x01,
4042 // Delta from largest observed.
4043 0x01,
4044 // Delta time.
4045 0x10, 0x32, 0x54, 0x76,
4046 };
4047
QUICHE teama6ef0a62019-03-07 20:34:33 -05004048 unsigned char packet46[] = {
4049 // type (short header, 4 byte packet number)
4050 0x43,
4051 // connection_id
4052 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4053 // packet number
4054 0x12, 0x34, 0x56, 0x78,
4055
4056 // frame type (ack frame)
4057 // (no ack blocks, 1 byte largest observed, 1 byte block length)
4058 0x40,
4059 // largest acked
4060 0x01,
4061 // Zero delta time.
4062 0x00, 0x00,
4063 // first ack block length.
4064 0x01,
4065 // num timestamps.
4066 0x01,
4067 // Delta from largest observed.
4068 0x01,
4069 // Delta time.
4070 0x10, 0x32, 0x54, 0x76,
4071 };
4072 // clang-format on
fkastenholz305e1732019-06-18 05:01:22 -07004073 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07004074 // ACK Timestamp is not a feature of IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004075 return;
4076 }
4077 QuicEncryptedPacket encrypted(
dschinaziceed8662020-07-14 09:37:05 -07004078 AsChars(framer_.version().HasIetfInvariantHeader() ? packet46 : packet),
vasilvvbed67c62020-10-20 06:38:43 -07004079 ABSL_ARRAYSIZE(packet), false);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004080 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
vasilvv89fe24d2020-10-26 14:55:28 -07004081 EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
4082 "delta_from_largest_observed too high"));
QUICHE teama6ef0a62019-03-07 20:34:33 -05004083}
4084
4085TEST_P(QuicFramerTest, AckFrameTimeStampSecondDeltaTooHigh) {
nharper9bb83462019-05-01 10:53:22 -07004086 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004087 // clang-format off
4088 unsigned char packet[] = {
4089 // public flags (8 byte connection_id)
4090 0x28,
4091 // connection_id
4092 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4093 // packet number
4094 0x12, 0x34, 0x56, 0x78,
4095
4096 // frame type (ack frame)
4097 // (no ack blocks, 1 byte largest observed, 1 byte block length)
4098 0x40,
4099 // largest acked
4100 0x03,
4101 // Zero delta time.
4102 0x00, 0x00,
4103 // first ack block length.
4104 0x03,
4105 // num timestamps.
4106 0x02,
4107 // Delta from largest observed.
4108 0x01,
4109 // Delta time.
4110 0x10, 0x32, 0x54, 0x76,
4111 // Delta from largest observed.
4112 0x03,
4113 // Delta time.
4114 0x10, 0x32,
4115 };
4116
QUICHE teama6ef0a62019-03-07 20:34:33 -05004117 unsigned char packet46[] = {
4118 // type (short header, 4 byte packet number)
4119 0x43,
4120 // connection_id
4121 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4122 // packet number
4123 0x12, 0x34, 0x56, 0x78,
4124
4125 // frame type (ack frame)
4126 // (no ack blocks, 1 byte largest observed, 1 byte block length)
4127 0x40,
4128 // largest acked
4129 0x03,
4130 // Zero delta time.
4131 0x00, 0x00,
4132 // first ack block length.
4133 0x03,
4134 // num timestamps.
4135 0x02,
4136 // Delta from largest observed.
4137 0x01,
4138 // Delta time.
4139 0x10, 0x32, 0x54, 0x76,
4140 // Delta from largest observed.
4141 0x03,
4142 // Delta time.
4143 0x10, 0x32,
4144 };
4145 // clang-format on
fkastenholz305e1732019-06-18 05:01:22 -07004146 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07004147 // ACK Timestamp is not a feature of IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004148 return;
4149 }
4150 QuicEncryptedPacket encrypted(
dschinaziceed8662020-07-14 09:37:05 -07004151 AsChars(framer_.version().HasIetfInvariantHeader() ? packet46 : packet),
vasilvvbed67c62020-10-20 06:38:43 -07004152 ABSL_ARRAYSIZE(packet), false);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004153 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
vasilvv89fe24d2020-10-26 14:55:28 -07004154 EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
4155 "delta_from_largest_observed too high"));
QUICHE teama6ef0a62019-03-07 20:34:33 -05004156}
4157
4158TEST_P(QuicFramerTest, NewStopWaitingFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07004159 if (VersionHasIetfQuicFrames(version_.transport_version)) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07004160 // The Stop Waiting frame is not in IETF QUIC
QUICHE teama6ef0a62019-03-07 20:34:33 -05004161 return;
4162 }
nharper9bb83462019-05-01 10:53:22 -07004163 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004164 // clang-format off
4165 PacketFragments packet = {
4166 // public flags (8 byte connection_id)
4167 {"",
4168 {0x2C}},
4169 // connection_id
4170 {"",
4171 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4172 // packet number
4173 {"",
4174 {0x12, 0x34, 0x56, 0x78}},
4175 // frame type (stop waiting frame)
4176 {"",
4177 {0x06}},
4178 // least packet number awaiting an ack, delta from packet number.
4179 {"Unable to read least unacked delta.",
4180 {0x00, 0x00, 0x00, 0x08}}
4181 };
4182
QUICHE teama6ef0a62019-03-07 20:34:33 -05004183 PacketFragments packet46 = {
4184 // type (short header, 4 byte packet number)
4185 {"",
4186 {0x43}},
4187 // connection_id
4188 {"",
4189 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4190 // packet number
4191 {"",
4192 {0x12, 0x34, 0x56, 0x78}},
4193 // frame type (stop waiting frame)
4194 {"",
4195 {0x06}},
4196 // least packet number awaiting an ack, delta from packet number.
4197 {"Unable to read least unacked delta.",
4198 {0x00, 0x00, 0x00, 0x08}}
4199 };
4200 // clang-format on
4201
4202 PacketFragments& fragments =
dschinaziceed8662020-07-14 09:37:05 -07004203 framer_.version().HasIetfInvariantHeader() ? packet46 : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004204
4205 std::unique_ptr<QuicEncryptedPacket> encrypted(
4206 AssemblePacketFromFragments(fragments));
ianswett97b690b2019-05-02 15:12:43 -07004207
QUICHE teama6ef0a62019-03-07 20:34:33 -05004208 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07004209 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05004210 ASSERT_TRUE(visitor_.header_.get());
4211 EXPECT_TRUE(CheckDecryption(
4212 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4213 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4214
4215 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4216 ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size());
4217 const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0];
4218 EXPECT_EQ(kLeastUnacked, frame.least_unacked);
4219
4220 CheckFramingBoundaries(fragments, QUIC_INVALID_STOP_WAITING_DATA);
4221}
4222
4223TEST_P(QuicFramerTest, InvalidNewStopWaitingFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07004224 // The Stop Waiting frame is not in IETF QUIC
ianswettd18fe672020-09-23 08:06:49 -07004225 if (VersionHasIetfQuicFrames(version_.transport_version) &&
4226 framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004227 return;
4228 }
nharper9bb83462019-05-01 10:53:22 -07004229 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004230 // clang-format off
4231 unsigned char packet[] = {
4232 // public flags (8 byte connection_id)
4233 0x2C,
4234 // connection_id
4235 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4236 // packet number
4237 0x12, 0x34, 0x56, 0x78,
4238 // frame type (stop waiting frame)
4239 0x06,
4240 // least packet number awaiting an ack, delta from packet number.
4241 0x13, 0x34, 0x56, 0x78,
4242 0x9A, 0xA8,
4243 };
4244
QUICHE teama6ef0a62019-03-07 20:34:33 -05004245 unsigned char packet46[] = {
4246 // type (short header, 4 byte packet number)
4247 0x43,
4248 // connection_id
4249 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4250 // packet number
4251 0x12, 0x34, 0x56, 0x78,
4252 // frame type (stop waiting frame)
4253 0x06,
4254 // least packet number awaiting an ack, delta from packet number.
4255 0x57, 0x78, 0x9A, 0xA8,
4256 };
4257 // clang-format on
4258
4259 QuicEncryptedPacket encrypted(
dschinaziceed8662020-07-14 09:37:05 -07004260 AsChars(framer_.version().HasIetfInvariantHeader() ? packet46 : packet),
vasilvvbed67c62020-10-20 06:38:43 -07004261 framer_.version().HasIetfInvariantHeader() ? ABSL_ARRAYSIZE(packet46)
4262 : ABSL_ARRAYSIZE(packet),
QUICHE teama6ef0a62019-03-07 20:34:33 -05004263 false);
4264 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07004265 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_STOP_WAITING_DATA));
QUICHE teama6ef0a62019-03-07 20:34:33 -05004266 EXPECT_EQ("Invalid unacked delta.", framer_.detailed_error());
4267}
4268
4269TEST_P(QuicFramerTest, RstStreamFrame) {
zhongyi546cc452019-04-12 15:27:49 -07004270 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004271 // clang-format off
4272 PacketFragments packet = {
4273 // public flags (8 byte connection_id)
4274 {"",
4275 {0x28}},
4276 // connection_id
4277 {"",
4278 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4279 // packet number
4280 {"",
4281 {0x12, 0x34, 0x56, 0x78}},
4282 // frame type (rst stream frame)
4283 {"",
4284 {0x01}},
4285 // stream id
4286 {"Unable to read stream_id.",
4287 {0x01, 0x02, 0x03, 0x04}},
4288 // sent byte offset
4289 {"Unable to read rst stream sent byte offset.",
4290 {0x3A, 0x98, 0xFE, 0xDC,
4291 0x32, 0x10, 0x76, 0x54}},
bnccb0ffbc2020-04-13 10:53:11 -07004292 // error code QUIC_STREAM_CANCELLED
QUICHE teama6ef0a62019-03-07 20:34:33 -05004293 {"Unable to read rst stream error code.",
bnccb0ffbc2020-04-13 10:53:11 -07004294 {0x00, 0x00, 0x00, 0x06}}
QUICHE teama6ef0a62019-03-07 20:34:33 -05004295 };
4296
QUICHE teama6ef0a62019-03-07 20:34:33 -05004297 PacketFragments packet46 = {
4298 // type (short header, 4 byte packet number)
4299 {"",
4300 {0x43}},
4301 // connection_id
4302 {"",
4303 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4304 // packet number
4305 {"",
4306 {0x12, 0x34, 0x56, 0x78}},
4307 // frame type (rst stream frame)
4308 {"",
4309 {0x01}},
4310 // stream id
4311 {"Unable to read stream_id.",
4312 {0x01, 0x02, 0x03, 0x04}},
4313 // sent byte offset
4314 {"Unable to read rst stream sent byte offset.",
4315 {0x3A, 0x98, 0xFE, 0xDC,
4316 0x32, 0x10, 0x76, 0x54}},
bnccb0ffbc2020-04-13 10:53:11 -07004317 // error code QUIC_STREAM_CANCELLED
QUICHE teama6ef0a62019-03-07 20:34:33 -05004318 {"Unable to read rst stream error code.",
bnccb0ffbc2020-04-13 10:53:11 -07004319 {0x00, 0x00, 0x00, 0x06}}
QUICHE teama6ef0a62019-03-07 20:34:33 -05004320 };
4321
4322 PacketFragments packet99 = {
4323 // type (short header, 4 byte packet number)
4324 {"",
4325 {0x43}},
4326 // connection_id
4327 {"",
4328 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4329 // packet number
4330 {"",
4331 {0x12, 0x34, 0x56, 0x78}},
4332 // frame type (IETF_RST_STREAM frame)
4333 {"",
4334 {0x04}},
4335 // stream id
renjietangd077f8c2020-03-23 17:22:09 -07004336 {"Unable to read IETF_RST_STREAM frame stream id/count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05004337 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
bnccb0ffbc2020-04-13 10:53:11 -07004338 // application error code H3_REQUEST_CANCELLED gets translated to
4339 // QuicRstStreamErrorCode::QUIC_STREAM_CANCELLED.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004340 {"Unable to read rst stream error code.",
bnccb0ffbc2020-04-13 10:53:11 -07004341 {kVarInt62TwoBytes + 0x01, 0x0c}},
QUICHE teama6ef0a62019-03-07 20:34:33 -05004342 // Final Offset
4343 {"Unable to read rst stream sent byte offset.",
4344 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}}
4345 };
4346 // clang-format on
4347
4348 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07004349 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05004350 ? packet99
dschinaziceed8662020-07-14 09:37:05 -07004351 : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004352 std::unique_ptr<QuicEncryptedPacket> encrypted(
4353 AssemblePacketFromFragments(fragments));
4354 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4355
bncf6f82b12019-10-30 07:01:01 -07004356 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05004357 ASSERT_TRUE(visitor_.header_.get());
4358 EXPECT_TRUE(CheckDecryption(
4359 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4360 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4361
4362 EXPECT_EQ(kStreamId, visitor_.rst_stream_frame_.stream_id);
bnccb0ffbc2020-04-13 10:53:11 -07004363 EXPECT_EQ(QUIC_STREAM_CANCELLED, visitor_.rst_stream_frame_.error_code);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004364 EXPECT_EQ(kStreamOffset, visitor_.rst_stream_frame_.byte_offset);
4365 CheckFramingBoundaries(fragments, QUIC_INVALID_RST_STREAM_DATA);
4366}
4367
4368TEST_P(QuicFramerTest, ConnectionCloseFrame) {
zhongyi546cc452019-04-12 15:27:49 -07004369 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004370 // clang-format off
4371 PacketFragments packet = {
4372 // public flags (8 byte connection_id)
4373 {"",
4374 {0x28}},
4375 // connection_id
4376 {"",
4377 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4378 // packet number
4379 {"",
4380 {0x12, 0x34, 0x56, 0x78}},
4381 // frame type (connection close frame)
4382 {"",
4383 {0x02}},
4384 // error code
4385 {"Unable to read connection close error code.",
4386 {0x00, 0x00, 0x00, 0x11}},
4387 {"Unable to read connection close error details.",
4388 {
4389 // error details length
4390 0x0, 0x0d,
4391 // error details
4392 'b', 'e', 'c', 'a',
4393 'u', 's', 'e', ' ',
4394 'I', ' ', 'c', 'a',
4395 'n'}
4396 }
4397 };
4398
QUICHE teama6ef0a62019-03-07 20:34:33 -05004399 PacketFragments packet46 = {
4400 // type (short header, 4 byte packet number)
4401 {"",
4402 {0x43}},
4403 // connection_id
4404 {"",
4405 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4406 // packet number
4407 {"",
4408 {0x12, 0x34, 0x56, 0x78}},
4409 // frame type (connection close frame)
4410 {"",
4411 {0x02}},
4412 // error code
4413 {"Unable to read connection close error code.",
4414 {0x00, 0x00, 0x00, 0x11}},
4415 {"Unable to read connection close error details.",
4416 {
4417 // error details length
4418 0x0, 0x0d,
4419 // error details
4420 'b', 'e', 'c', 'a',
4421 'u', 's', 'e', ' ',
4422 'I', ' ', 'c', 'a',
4423 'n'}
4424 }
4425 };
4426
4427 PacketFragments packet99 = {
4428 // type (short header, 4 byte packet number)
4429 {"",
4430 {0x43}},
4431 // connection_id
4432 {"",
4433 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4434 // packet number
4435 {"",
4436 {0x12, 0x34, 0x56, 0x78}},
fkastenholzb4dade72019-08-05 06:54:20 -07004437 // frame type (IETF Transport CONNECTION_CLOSE frame)
QUICHE teama6ef0a62019-03-07 20:34:33 -05004438 {"",
4439 {0x1c}},
4440 // error code
4441 {"Unable to read connection close error code.",
fkastenholzd57d3f92019-07-16 09:05:17 -07004442 {kVarInt62TwoBytes + 0x00, 0x11}},
QUICHE teama6ef0a62019-03-07 20:34:33 -05004443 {"Unable to read connection close frame type.",
4444 {kVarInt62TwoBytes + 0x12, 0x34 }},
4445 {"Unable to read connection close error details.",
4446 {
4447 // error details length
bnc40fa8302020-09-28 08:16:27 -07004448 kVarInt62OneByte + 0x11,
4449 // error details with QuicErrorCode serialized
4450 '1', '1', '5', ':',
QUICHE teama6ef0a62019-03-07 20:34:33 -05004451 'b', 'e', 'c', 'a',
4452 'u', 's', 'e', ' ',
4453 'I', ' ', 'c', 'a',
4454 'n'}
4455 }
4456 };
4457 // clang-format on
4458
4459 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07004460 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05004461 ? packet99
dschinaziceed8662020-07-14 09:37:05 -07004462 : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004463 std::unique_ptr<QuicEncryptedPacket> encrypted(
4464 AssemblePacketFromFragments(fragments));
4465 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4466
bncf6f82b12019-10-30 07:01:01 -07004467 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05004468 ASSERT_TRUE(visitor_.header_.get());
4469 EXPECT_TRUE(CheckDecryption(
4470 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4471 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4472
4473 EXPECT_EQ(0u, visitor_.stream_frames_.size());
zhongyiba6354a2019-04-10 16:49:25 -07004474 EXPECT_EQ(0x11u, static_cast<unsigned>(
bnc77e77b82020-04-05 10:36:49 -07004475 visitor_.connection_close_frame_.wire_error_code));
QUICHE teama6ef0a62019-03-07 20:34:33 -05004476 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
fkastenholz305e1732019-06-18 05:01:22 -07004477 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholze9d71a82019-04-09 05:12:13 -07004478 EXPECT_EQ(0x1234u,
4479 visitor_.connection_close_frame_.transport_close_frame_type);
bnc40fa8302020-09-28 08:16:27 -07004480 EXPECT_EQ(115u, visitor_.connection_close_frame_.quic_error_code);
fkastenholza14a7ae2019-08-07 05:21:22 -07004481 } else {
bnc77e77b82020-04-05 10:36:49 -07004482 // For Google QUIC frame, |quic_error_code| and |wire_error_code| has the
4483 // same value.
4484 EXPECT_EQ(0x11u, static_cast<unsigned>(
4485 visitor_.connection_close_frame_.quic_error_code));
fkastenholzb4dade72019-08-05 06:54:20 -07004486 }
4487
4488 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4489
4490 CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4491}
4492
bnc40fa8302020-09-28 08:16:27 -07004493TEST_P(QuicFramerTest, ConnectionCloseFrameWithUnknownErrorCode) {
4494 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4495 // clang-format off
4496 PacketFragments packet = {
4497 // public flags (8 byte connection_id)
4498 {"",
4499 {0x28}},
4500 // connection_id
4501 {"",
4502 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4503 // packet number
4504 {"",
4505 {0x12, 0x34, 0x56, 0x78}},
4506 // frame type (connection close frame)
4507 {"",
4508 {0x02}},
4509 // error code larger than QUIC_LAST_ERROR
4510 {"Unable to read connection close error code.",
4511 {0x00, 0x00, 0xC0, 0xDE}},
4512 {"Unable to read connection close error details.",
4513 {
4514 // error details length
4515 0x0, 0x0d,
4516 // error details
4517 'b', 'e', 'c', 'a',
4518 'u', 's', 'e', ' ',
4519 'I', ' ', 'c', 'a',
4520 'n'}
4521 }
4522 };
4523
4524 PacketFragments packet46 = {
4525 // type (short header, 4 byte packet number)
4526 {"",
4527 {0x43}},
4528 // connection_id
4529 {"",
4530 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4531 // packet number
4532 {"",
4533 {0x12, 0x34, 0x56, 0x78}},
4534 // frame type (connection close frame)
4535 {"",
4536 {0x02}},
4537 // error code larger than QUIC_LAST_ERROR
4538 {"Unable to read connection close error code.",
4539 {0x00, 0x00, 0xC0, 0xDE}},
4540 {"Unable to read connection close error details.",
4541 {
4542 // error details length
4543 0x0, 0x0d,
4544 // error details
4545 'b', 'e', 'c', 'a',
4546 'u', 's', 'e', ' ',
4547 'I', ' ', 'c', 'a',
4548 'n'}
4549 }
4550 };
4551
4552 PacketFragments packet99 = {
4553 // type (short header, 4 byte packet number)
4554 {"",
4555 {0x43}},
4556 // connection_id
4557 {"",
4558 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4559 // packet number
4560 {"",
4561 {0x12, 0x34, 0x56, 0x78}},
4562 // frame type (IETF Transport CONNECTION_CLOSE frame)
4563 {"",
4564 {0x1c}},
4565 // error code
4566 {"Unable to read connection close error code.",
4567 {kVarInt62FourBytes + 0x00, 0x00, 0xC0, 0xDE}},
4568 {"Unable to read connection close frame type.",
4569 {kVarInt62TwoBytes + 0x12, 0x34 }},
4570 {"Unable to read connection close error details.",
4571 {
4572 // error details length
4573 kVarInt62OneByte + 0x11,
4574 // error details with QuicErrorCode larger than QUIC_LAST_ERROR
4575 '8', '4', '9', ':',
4576 'b', 'e', 'c', 'a',
4577 'u', 's', 'e', ' ',
4578 'I', ' ', 'c', 'a',
4579 'n'}
4580 }
4581 };
4582 // clang-format on
4583
4584 PacketFragments& fragments =
4585 VersionHasIetfQuicFrames(framer_.transport_version())
4586 ? packet99
4587 : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
4588 std::unique_ptr<QuicEncryptedPacket> encrypted(
4589 AssemblePacketFromFragments(fragments));
4590 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4591
4592 EXPECT_THAT(framer_.error(), IsQuicNoError());
4593 ASSERT_TRUE(visitor_.header_.get());
4594 EXPECT_TRUE(CheckDecryption(
4595 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4596 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4597
4598 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4599 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4600 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4601 EXPECT_EQ(0x1234u,
4602 visitor_.connection_close_frame_.transport_close_frame_type);
4603 EXPECT_EQ(0xC0DEu, visitor_.connection_close_frame_.wire_error_code);
4604 EXPECT_EQ(849u, visitor_.connection_close_frame_.quic_error_code);
4605 } else {
4606 // For Google QUIC frame, |quic_error_code| and |wire_error_code| has the
4607 // same value.
4608 if (GetQuicReloadableFlag(quic_do_not_clip_received_error_code)) {
4609 EXPECT_EQ(0xC0DEu, visitor_.connection_close_frame_.wire_error_code);
4610 EXPECT_EQ(0xC0DEu, visitor_.connection_close_frame_.quic_error_code);
4611 } else {
4612 EXPECT_EQ(QUIC_LAST_ERROR,
4613 visitor_.connection_close_frame_.wire_error_code);
4614 EXPECT_EQ(QUIC_LAST_ERROR,
4615 visitor_.connection_close_frame_.quic_error_code);
4616 }
4617 }
4618
4619 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4620
4621 CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4622}
4623
fkastenholzb4dade72019-08-05 06:54:20 -07004624// As above, but checks that for Google-QUIC, if there happens
4625// to be an ErrorCode string at the start of the details, it is
4626// NOT extracted/parsed/folded/spindled/and/mutilated.
4627TEST_P(QuicFramerTest, ConnectionCloseFrameWithExtractedInfoIgnoreGCuic) {
4628 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4629
4630 // clang-format off
4631 PacketFragments packet = {
4632 // public flags (8 byte connection_id)
4633 {"",
4634 {0x28}},
4635 // connection_id
4636 {"",
4637 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4638 // packet number
4639 {"",
4640 {0x12, 0x34, 0x56, 0x78}},
4641 // frame type (connection close frame)
4642 {"",
4643 {0x02}},
4644 // error code
4645 {"Unable to read connection close error code.",
4646 {0x00, 0x00, 0x00, 0x11}},
4647 {"Unable to read connection close error details.",
4648 {
4649 // error details length
4650 0x0, 0x13,
4651 // error details
4652 '1', '7', '7', '6',
4653 '7', ':', 'b', 'e',
4654 'c', 'a', 'u', 's',
4655 'e', ' ', 'I', ' ',
4656 'c', 'a', 'n'}
4657 }
4658 };
4659
fkastenholzb4dade72019-08-05 06:54:20 -07004660 PacketFragments packet46 = {
4661 // type (short header, 4 byte packet number)
4662 {"",
4663 {0x43}},
4664 // connection_id
4665 {"",
4666 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4667 // packet number
4668 {"",
4669 {0x12, 0x34, 0x56, 0x78}},
4670 // frame type (connection close frame)
4671 {"",
4672 {0x02}},
4673 // error code
4674 {"Unable to read connection close error code.",
4675 {0x00, 0x00, 0x00, 0x11}},
4676 {"Unable to read connection close error details.",
4677 {
4678 // error details length
4679 0x0, 0x13,
4680 // error details
4681 '1', '7', '7', '6',
4682 '7', ':', 'b', 'e',
4683 'c', 'a', 'u', 's',
4684 'e', ' ', 'I', ' ',
4685 'c', 'a', 'n'}
4686 }
4687 };
4688
4689 PacketFragments packet99 = {
4690 // type (short header, 4 byte packet number)
4691 {"",
4692 {0x43}},
4693 // connection_id
4694 {"",
4695 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4696 // packet number
4697 {"",
4698 {0x12, 0x34, 0x56, 0x78}},
4699 // frame type (IETF Transport CONNECTION_CLOSE frame)
4700 {"",
4701 {0x1c}},
4702 // error code
4703 {"Unable to read connection close error code.",
4704 {kVarInt62OneByte + 0x11}},
4705 {"Unable to read connection close frame type.",
4706 {kVarInt62TwoBytes + 0x12, 0x34 }},
4707 {"Unable to read connection close error details.",
4708 {
4709 // error details length
4710 kVarInt62OneByte + 0x13,
4711 // error details
4712 '1', '7', '7', '6',
4713 '7', ':', 'b', 'e',
4714 'c', 'a', 'u', 's',
4715 'e', ' ', 'I', ' ',
4716 'c', 'a', 'n'}
4717 }
4718 };
4719 // clang-format on
4720
4721 PacketFragments& fragments =
4722 VersionHasIetfQuicFrames(framer_.transport_version())
4723 ? packet99
dschinaziceed8662020-07-14 09:37:05 -07004724 : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
fkastenholzb4dade72019-08-05 06:54:20 -07004725 std::unique_ptr<QuicEncryptedPacket> encrypted(
4726 AssemblePacketFromFragments(fragments));
4727 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4728
bncf6f82b12019-10-30 07:01:01 -07004729 EXPECT_THAT(framer_.error(), IsQuicNoError());
fkastenholzb4dade72019-08-05 06:54:20 -07004730 ASSERT_TRUE(visitor_.header_.get());
4731 EXPECT_TRUE(CheckDecryption(
4732 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4733 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4734
4735 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4736 EXPECT_EQ(0x11u, static_cast<unsigned>(
bnc77e77b82020-04-05 10:36:49 -07004737 visitor_.connection_close_frame_.wire_error_code));
fkastenholz488a4622019-08-26 06:24:46 -07004738
fkastenholzb4dade72019-08-05 06:54:20 -07004739 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4740 EXPECT_EQ(0x1234u,
4741 visitor_.connection_close_frame_.transport_close_frame_type);
bnc77e77b82020-04-05 10:36:49 -07004742 EXPECT_EQ(17767u, visitor_.connection_close_frame_.quic_error_code);
fkastenholz488a4622019-08-26 06:24:46 -07004743 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
fkastenholzb4dade72019-08-05 06:54:20 -07004744 } else {
bnc77e77b82020-04-05 10:36:49 -07004745 EXPECT_EQ(0x11u, visitor_.connection_close_frame_.quic_error_code);
fkastenholz488a4622019-08-26 06:24:46 -07004746 // Error code is not prepended in GQUIC, so it is not removed and should
4747 // remain in the reason phrase.
4748 EXPECT_EQ("17767:because I can",
4749 visitor_.connection_close_frame_.error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004750 }
4751
4752 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4753
4754 CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4755}
4756
fkastenholz04bd4f32019-04-16 12:24:38 -07004757// Test the CONNECTION_CLOSE/Application variant.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004758TEST_P(QuicFramerTest, ApplicationCloseFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07004759 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07004760 // This frame is only in IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004761 return;
4762 }
zhongyi546cc452019-04-12 15:27:49 -07004763 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004764
4765 // clang-format off
4766 PacketFragments packet99 = {
4767 // type (short header, 4 byte packet number)
4768 {"",
4769 {0x43}},
4770 // connection_id
4771 {"",
4772 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4773 // packet number
4774 {"",
4775 {0x12, 0x34, 0x56, 0x78}},
fkastenholz72f509b2019-04-10 09:17:49 -07004776 // frame type (IETF_CONNECTION_CLOSE/Application frame)
QUICHE teama6ef0a62019-03-07 20:34:33 -05004777 {"",
4778 {0x1d}},
4779 // error code
fkastenholz72f509b2019-04-10 09:17:49 -07004780 {"Unable to read connection close error code.",
fkastenholzd57d3f92019-07-16 09:05:17 -07004781 {kVarInt62TwoBytes + 0x00, 0x11}},
fkastenholz72f509b2019-04-10 09:17:49 -07004782 {"Unable to read connection close error details.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05004783 {
4784 // error details length
4785 kVarInt62OneByte + 0x0d,
4786 // error details
4787 'b', 'e', 'c', 'a',
4788 'u', 's', 'e', ' ',
4789 'I', ' ', 'c', 'a',
4790 'n'}
4791 }
4792 };
4793 // clang-format on
4794
4795 std::unique_ptr<QuicEncryptedPacket> encrypted(
4796 AssemblePacketFromFragments(packet99));
4797 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4798
bncf6f82b12019-10-30 07:01:01 -07004799 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05004800 ASSERT_TRUE(visitor_.header_.get());
4801 EXPECT_TRUE(CheckDecryption(
4802 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4803 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4804
4805 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4806
fkastenholz72f509b2019-04-10 09:17:49 -07004807 EXPECT_EQ(IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
4808 visitor_.connection_close_frame_.close_type);
bnc77e77b82020-04-05 10:36:49 -07004809 EXPECT_EQ(122u, visitor_.connection_close_frame_.quic_error_code);
4810 EXPECT_EQ(0x11u, visitor_.connection_close_frame_.wire_error_code);
fkastenholz72f509b2019-04-10 09:17:49 -07004811 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004812
4813 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4814
fkastenholz04bd4f32019-04-16 12:24:38 -07004815 CheckFramingBoundaries(packet99, QUIC_INVALID_CONNECTION_CLOSE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004816}
4817
fkastenholzb4dade72019-08-05 06:54:20 -07004818// Check that we can extract an error code from an application close.
4819TEST_P(QuicFramerTest, ApplicationCloseFrameExtract) {
4820 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07004821 // This frame is only in IETF QUIC.
fkastenholzb4dade72019-08-05 06:54:20 -07004822 return;
4823 }
4824 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4825
4826 // clang-format off
4827 PacketFragments packet99 = {
4828 // type (short header, 4 byte packet number)
4829 {"",
4830 {0x43}},
4831 // connection_id
4832 {"",
4833 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4834 // packet number
4835 {"",
4836 {0x12, 0x34, 0x56, 0x78}},
4837 // frame type (IETF_CONNECTION_CLOSE/Application frame)
4838 {"",
4839 {0x1d}},
4840 // error code
4841 {"Unable to read connection close error code.",
4842 {kVarInt62OneByte + 0x11}},
4843 {"Unable to read connection close error details.",
4844 {
4845 // error details length
4846 kVarInt62OneByte + 0x13,
4847 // error details
4848 '1', '7', '7', '6',
4849 '7', ':', 'b', 'e',
4850 'c', 'a', 'u', 's',
4851 'e', ' ', 'I', ' ',
4852 'c', 'a', 'n'}
4853 }
4854 };
4855 // clang-format on
4856
4857 std::unique_ptr<QuicEncryptedPacket> encrypted(
4858 AssemblePacketFromFragments(packet99));
4859 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4860
bncf6f82b12019-10-30 07:01:01 -07004861 EXPECT_THAT(framer_.error(), IsQuicNoError());
fkastenholzb4dade72019-08-05 06:54:20 -07004862 ASSERT_TRUE(visitor_.header_.get());
4863 EXPECT_TRUE(CheckDecryption(
4864 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4865 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4866
4867 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4868
4869 EXPECT_EQ(IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
4870 visitor_.connection_close_frame_.close_type);
bnc77e77b82020-04-05 10:36:49 -07004871 EXPECT_EQ(17767u, visitor_.connection_close_frame_.quic_error_code);
4872 EXPECT_EQ(0x11u, visitor_.connection_close_frame_.wire_error_code);
fkastenholz488a4622019-08-26 06:24:46 -07004873 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
fkastenholzb4dade72019-08-05 06:54:20 -07004874
4875 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4876
4877 CheckFramingBoundaries(packet99, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4878}
4879
QUICHE teama6ef0a62019-03-07 20:34:33 -05004880TEST_P(QuicFramerTest, GoAwayFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07004881 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07004882 // This frame is not in IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004883 return;
4884 }
nharper9bb83462019-05-01 10:53:22 -07004885 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004886 // clang-format off
4887 PacketFragments packet = {
4888 // public flags (8 byte connection_id)
4889 {"",
4890 {0x28}},
4891 // connection_id
4892 {"",
4893 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4894 // packet number
4895 {"",
4896 {0x12, 0x34, 0x56, 0x78}},
4897 // frame type (go away frame)
4898 {"",
4899 {0x03}},
4900 // error code
4901 {"Unable to read go away error code.",
4902 {0x00, 0x00, 0x00, 0x09}},
4903 // stream id
4904 {"Unable to read last good stream id.",
4905 {0x01, 0x02, 0x03, 0x04}},
4906 // stream id
4907 {"Unable to read goaway reason.",
4908 {
4909 // error details length
4910 0x0, 0x0d,
4911 // error details
4912 'b', 'e', 'c', 'a',
4913 'u', 's', 'e', ' ',
4914 'I', ' ', 'c', 'a',
4915 'n'}
4916 }
4917 };
4918
QUICHE teama6ef0a62019-03-07 20:34:33 -05004919 PacketFragments packet46 = {
4920 // type (short header, 4 byte packet number)
4921 {"",
4922 {0x43}},
4923 // connection_id
4924 {"",
4925 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4926 // packet number
4927 {"",
4928 {0x12, 0x34, 0x56, 0x78}},
4929 // frame type (go away frame)
4930 {"",
4931 {0x03}},
4932 // error code
4933 {"Unable to read go away error code.",
4934 {0x00, 0x00, 0x00, 0x09}},
4935 // stream id
4936 {"Unable to read last good stream id.",
4937 {0x01, 0x02, 0x03, 0x04}},
4938 // stream id
4939 {"Unable to read goaway reason.",
4940 {
4941 // error details length
4942 0x0, 0x0d,
4943 // error details
4944 'b', 'e', 'c', 'a',
4945 'u', 's', 'e', ' ',
4946 'I', ' ', 'c', 'a',
4947 'n'}
4948 }
4949 };
4950 // clang-format on
4951
4952 PacketFragments& fragments =
dschinaziceed8662020-07-14 09:37:05 -07004953 framer_.version().HasIetfInvariantHeader() ? packet46 : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004954 std::unique_ptr<QuicEncryptedPacket> encrypted(
4955 AssemblePacketFromFragments(fragments));
4956 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4957
bncf6f82b12019-10-30 07:01:01 -07004958 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05004959 ASSERT_TRUE(visitor_.header_.get());
4960 EXPECT_TRUE(CheckDecryption(
4961 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4962 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4963
4964 EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id);
fkastenholz88d08f42019-09-06 07:38:04 -07004965 EXPECT_EQ(0x9u, visitor_.goaway_frame_.error_code);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004966 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase);
4967
4968 CheckFramingBoundaries(fragments, QUIC_INVALID_GOAWAY_DATA);
4969}
4970
bnc40fa8302020-09-28 08:16:27 -07004971TEST_P(QuicFramerTest, GoAwayFrameWithUnknownErrorCode) {
4972 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4973 // This frame is not in IETF QUIC.
4974 return;
4975 }
4976 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4977 // clang-format off
4978 PacketFragments packet = {
4979 // public flags (8 byte connection_id)
4980 {"",
4981 {0x28}},
4982 // connection_id
4983 {"",
4984 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4985 // packet number
4986 {"",
4987 {0x12, 0x34, 0x56, 0x78}},
4988 // frame type (go away frame)
4989 {"",
4990 {0x03}},
4991 // error code larger than QUIC_LAST_ERROR
4992 {"Unable to read go away error code.",
4993 {0x00, 0x00, 0xC0, 0xDE}},
4994 // stream id
4995 {"Unable to read last good stream id.",
4996 {0x01, 0x02, 0x03, 0x04}},
4997 // stream id
4998 {"Unable to read goaway reason.",
4999 {
5000 // error details length
5001 0x0, 0x0d,
5002 // error details
5003 'b', 'e', 'c', 'a',
5004 'u', 's', 'e', ' ',
5005 'I', ' ', 'c', 'a',
5006 'n'}
5007 }
5008 };
5009
5010 PacketFragments packet46 = {
5011 // type (short header, 4 byte packet number)
5012 {"",
5013 {0x43}},
5014 // connection_id
5015 {"",
5016 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5017 // packet number
5018 {"",
5019 {0x12, 0x34, 0x56, 0x78}},
5020 // frame type (go away frame)
5021 {"",
5022 {0x03}},
5023 // error code larger than QUIC_LAST_ERROR
5024 {"Unable to read go away error code.",
5025 {0x00, 0x00, 0xC0, 0xDE}},
5026 // stream id
5027 {"Unable to read last good stream id.",
5028 {0x01, 0x02, 0x03, 0x04}},
5029 // stream id
5030 {"Unable to read goaway reason.",
5031 {
5032 // error details length
5033 0x0, 0x0d,
5034 // error details
5035 'b', 'e', 'c', 'a',
5036 'u', 's', 'e', ' ',
5037 'I', ' ', 'c', 'a',
5038 'n'}
5039 }
5040 };
5041 // clang-format on
5042
5043 PacketFragments& fragments =
5044 framer_.version().HasIetfInvariantHeader() ? packet46 : packet;
5045 std::unique_ptr<QuicEncryptedPacket> encrypted(
5046 AssemblePacketFromFragments(fragments));
5047 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5048
5049 EXPECT_THAT(framer_.error(), IsQuicNoError());
5050 ASSERT_TRUE(visitor_.header_.get());
5051 EXPECT_TRUE(CheckDecryption(
5052 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5053 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
5054
5055 EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id);
5056 if (GetQuicReloadableFlag(quic_do_not_clip_received_error_code)) {
5057 EXPECT_EQ(0xC0DE, visitor_.goaway_frame_.error_code);
5058 } else {
5059 EXPECT_EQ(QUIC_LAST_ERROR, visitor_.goaway_frame_.error_code);
5060 }
5061 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase);
5062
5063 CheckFramingBoundaries(fragments, QUIC_INVALID_GOAWAY_DATA);
5064}
5065
QUICHE teama6ef0a62019-03-07 20:34:33 -05005066TEST_P(QuicFramerTest, WindowUpdateFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07005067 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07005068 // This frame is not in IETF QUIC, see MaxDataFrame and MaxStreamDataFrame
5069 // for IETF QUIC equivalents.
QUICHE teama6ef0a62019-03-07 20:34:33 -05005070 return;
5071 }
nharper9bb83462019-05-01 10:53:22 -07005072 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005073 // clang-format off
5074 PacketFragments packet = {
5075 // public flags (8 byte connection_id)
5076 {"",
5077 {0x28}},
5078 // connection_id
5079 {"",
5080 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5081 // packet number
5082 {"",
5083 {0x12, 0x34, 0x56, 0x78}},
5084 // frame type (window update frame)
5085 {"",
5086 {0x04}},
5087 // stream id
5088 {"Unable to read stream_id.",
5089 {0x01, 0x02, 0x03, 0x04}},
5090 // byte offset
5091 {"Unable to read window byte_offset.",
5092 {0x3A, 0x98, 0xFE, 0xDC,
5093 0x32, 0x10, 0x76, 0x54}},
5094 };
5095
QUICHE teama6ef0a62019-03-07 20:34:33 -05005096 PacketFragments packet46 = {
5097 // type (short header, 4 byte packet number)
5098 {"",
5099 {0x43}},
5100 // connection_id
5101 {"",
5102 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5103 // packet number
5104 {"",
5105 {0x12, 0x34, 0x56, 0x78}},
5106 // frame type (window update frame)
5107 {"",
5108 {0x04}},
5109 // stream id
5110 {"Unable to read stream_id.",
5111 {0x01, 0x02, 0x03, 0x04}},
5112 // byte offset
5113 {"Unable to read window byte_offset.",
5114 {0x3A, 0x98, 0xFE, 0xDC,
5115 0x32, 0x10, 0x76, 0x54}},
5116 };
5117
5118 // clang-format on
5119
5120 PacketFragments& fragments =
dschinaziceed8662020-07-14 09:37:05 -07005121 framer_.version().HasIetfInvariantHeader() ? packet46 : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -05005122 std::unique_ptr<QuicEncryptedPacket> encrypted(
5123 AssemblePacketFromFragments(fragments));
5124 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5125
bncf6f82b12019-10-30 07:01:01 -07005126 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005127 ASSERT_TRUE(visitor_.header_.get());
5128 EXPECT_TRUE(CheckDecryption(
5129 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5130 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
5131
5132 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
renjietangd088eab2019-11-21 14:54:41 -08005133 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005134
5135 CheckFramingBoundaries(fragments, QUIC_INVALID_WINDOW_UPDATE_DATA);
5136}
5137
5138TEST_P(QuicFramerTest, MaxDataFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07005139 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07005140 // This frame is available only in IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05005141 return;
5142 }
zhongyi546cc452019-04-12 15:27:49 -07005143 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005144 // clang-format off
5145 PacketFragments packet99 = {
5146 // type (short header, 4 byte packet number)
5147 {"",
5148 {0x43}},
5149 // connection_id
5150 {"",
5151 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5152 // packet number
5153 {"",
5154 {0x12, 0x34, 0x56, 0x78}},
5155 // frame type (IETF_MAX_DATA frame)
5156 {"",
5157 {0x10}},
5158 // byte offset
5159 {"Can not read MAX_DATA byte-offset",
5160 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5161 0x32, 0x10, 0x76, 0x54}},
5162 };
5163 // clang-format on
5164
5165 std::unique_ptr<QuicEncryptedPacket> encrypted(
5166 AssemblePacketFromFragments(packet99));
5167 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5168
bncf6f82b12019-10-30 07:01:01 -07005169 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005170 ASSERT_TRUE(visitor_.header_.get());
5171 EXPECT_TRUE(CheckDecryption(
5172 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5173 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
5174
5175 EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
5176 visitor_.window_update_frame_.stream_id);
renjietangd088eab2019-11-21 14:54:41 -08005177 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005178
5179 CheckFramingBoundaries(packet99, QUIC_INVALID_MAX_DATA_FRAME_DATA);
5180}
5181
5182TEST_P(QuicFramerTest, MaxStreamDataFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07005183 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07005184 // This frame available only in IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05005185 return;
5186 }
zhongyi546cc452019-04-12 15:27:49 -07005187 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005188 // clang-format off
5189 PacketFragments packet99 = {
5190 // type (short header, 4 byte packet number)
5191 {"",
5192 {0x43}},
5193 // connection_id
5194 {"",
5195 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5196 // packet number
5197 {"",
5198 {0x12, 0x34, 0x56, 0x78}},
5199 // frame type (IETF_MAX_STREAM_DATA frame)
5200 {"",
5201 {0x11}},
5202 // stream id
renjietangd077f8c2020-03-23 17:22:09 -07005203 {"Unable to read IETF_MAX_STREAM_DATA frame stream id/count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05005204 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
5205 // byte offset
5206 {"Can not read MAX_STREAM_DATA byte-count",
5207 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5208 0x32, 0x10, 0x76, 0x54}},
5209 };
5210 // clang-format on
5211
5212 std::unique_ptr<QuicEncryptedPacket> encrypted(
5213 AssemblePacketFromFragments(packet99));
5214 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5215
bncf6f82b12019-10-30 07:01:01 -07005216 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005217 ASSERT_TRUE(visitor_.header_.get());
5218 EXPECT_TRUE(CheckDecryption(
5219 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5220 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
5221
5222 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
renjietangd088eab2019-11-21 14:54:41 -08005223 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005224
5225 CheckFramingBoundaries(packet99, QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA);
5226}
5227
5228TEST_P(QuicFramerTest, BlockedFrame) {
zhongyi546cc452019-04-12 15:27:49 -07005229 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005230 // clang-format off
5231 PacketFragments packet = {
5232 // public flags (8 byte connection_id)
5233 {"",
5234 {0x28}},
5235 // connection_id
5236 {"",
5237 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5238 // packet number
5239 {"",
5240 {0x12, 0x34, 0x56, 0x78}},
5241 // frame type (blocked frame)
5242 {"",
5243 {0x05}},
5244 // stream id
5245 {"Unable to read stream_id.",
5246 {0x01, 0x02, 0x03, 0x04}},
5247 };
5248
QUICHE teama6ef0a62019-03-07 20:34:33 -05005249 PacketFragments packet46 = {
5250 // type (short header, 4 byte packet number)
5251 {"",
5252 {0x43}},
5253 // connection_id
5254 {"",
5255 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5256 // packet number
5257 {"",
5258 {0x12, 0x34, 0x56, 0x78}},
5259 // frame type (blocked frame)
5260 {"",
5261 {0x05}},
5262 // stream id
5263 {"Unable to read stream_id.",
5264 {0x01, 0x02, 0x03, 0x04}},
5265 };
5266
5267 PacketFragments packet99 = {
5268 // type (short header, 4 byte packet number)
5269 {"",
5270 {0x43}},
5271 // connection_id
5272 {"",
5273 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5274 // packet number
5275 {"",
5276 {0x12, 0x34, 0x56, 0x78}},
5277 // frame type (IETF_STREAM_BLOCKED frame)
5278 {"",
5279 {0x15}},
5280 // stream id
renjietangd077f8c2020-03-23 17:22:09 -07005281 {"Unable to read IETF_STREAM_DATA_BLOCKED frame stream id/count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05005282 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
5283 // Offset
5284 {"Can not read stream blocked offset.",
5285 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
5286 };
5287 // clang-format on
5288
5289 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07005290 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05005291 ? packet99
dschinaziceed8662020-07-14 09:37:05 -07005292 : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005293 std::unique_ptr<QuicEncryptedPacket> encrypted(
5294 AssemblePacketFromFragments(fragments));
5295 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5296
bncf6f82b12019-10-30 07:01:01 -07005297 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005298 ASSERT_TRUE(visitor_.header_.get());
5299 EXPECT_TRUE(CheckDecryption(
5300 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5301 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
5302
fkastenholz305e1732019-06-18 05:01:22 -07005303 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005304 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
5305 } else {
5306 EXPECT_EQ(0u, visitor_.blocked_frame_.offset);
5307 }
5308 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
5309
fkastenholz305e1732019-06-18 05:01:22 -07005310 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005311 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_BLOCKED_DATA);
5312 } else {
5313 CheckFramingBoundaries(fragments, QUIC_INVALID_BLOCKED_DATA);
5314 }
5315}
5316
5317TEST_P(QuicFramerTest, PingFrame) {
zhongyi546cc452019-04-12 15:27:49 -07005318 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005319 // clang-format off
5320 unsigned char packet[] = {
5321 // public flags (8 byte connection_id)
5322 0x28,
5323 // connection_id
5324 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5325 // packet number
5326 0x12, 0x34, 0x56, 0x78,
5327
5328 // frame type (ping frame)
5329 0x07,
5330 };
5331
QUICHE teama6ef0a62019-03-07 20:34:33 -05005332 unsigned char packet46[] = {
5333 // type (short header, 4 byte packet number)
5334 0x43,
5335 // connection_id
5336 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5337 // packet number
5338 0x12, 0x34, 0x56, 0x78,
5339
5340 // frame type
5341 0x07,
5342 };
5343
5344 unsigned char packet99[] = {
5345 // type (short header, 4 byte packet number)
5346 0x43,
5347 // connection_id
5348 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5349 // packet number
5350 0x12, 0x34, 0x56, 0x78,
5351
5352 // frame type (IETF_PING frame)
5353 0x01,
5354 };
5355 // clang-format on
5356
5357 QuicEncryptedPacket encrypted(
fkastenholz305e1732019-06-18 05:01:22 -07005358 AsChars(VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05005359 ? packet99
dschinaziceed8662020-07-14 09:37:05 -07005360 : (framer_.version().HasIetfInvariantHeader() ? packet46
5361 : packet)),
fkastenholz305e1732019-06-18 05:01:22 -07005362 VersionHasIetfQuicFrames(framer_.transport_version())
vasilvvbed67c62020-10-20 06:38:43 -07005363 ? ABSL_ARRAYSIZE(packet99)
dschinaziceed8662020-07-14 09:37:05 -07005364 : (framer_.version().HasIetfInvariantHeader()
vasilvvbed67c62020-10-20 06:38:43 -07005365 ? ABSL_ARRAYSIZE(packet46)
5366 : ABSL_ARRAYSIZE(packet)),
QUICHE teama6ef0a62019-03-07 20:34:33 -05005367 false);
5368 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5369
bncf6f82b12019-10-30 07:01:01 -07005370 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005371 ASSERT_TRUE(visitor_.header_.get());
5372 EXPECT_TRUE(CheckDecryption(
5373 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5374 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
5375
5376 EXPECT_EQ(1u, visitor_.ping_frames_.size());
5377
5378 // No need to check the PING frame boundaries because it has no payload.
5379}
5380
fayang01062942020-01-22 07:23:23 -08005381TEST_P(QuicFramerTest, HandshakeDoneFrame) {
5382 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
5383 // clang-format off
5384 unsigned char packet[] = {
5385 // type (short header, 4 byte packet number)
5386 0x43,
5387 // connection_id
5388 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5389 // packet number
5390 0x12, 0x34, 0x56, 0x78,
5391
5392 // frame type (Handshake done frame)
5393 0x1e,
5394 };
5395 // clang-format on
5396
5397 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
5398 return;
5399 }
5400
vasilvvbed67c62020-10-20 06:38:43 -07005401 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
fayang01062942020-01-22 07:23:23 -08005402 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5403
5404 EXPECT_THAT(framer_.error(), IsQuicNoError());
5405 ASSERT_TRUE(visitor_.header_.get());
5406 EXPECT_TRUE(CheckDecryption(
5407 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5408 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
5409
5410 EXPECT_EQ(1u, visitor_.handshake_done_frames_.size());
5411}
5412
haoyuewang6a6a0ff2020-06-23 16:32:26 -07005413TEST_P(QuicFramerTest, ParseAckFrequencyFrame) {
5414 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
5415 // clang-format off
5416 unsigned char packet[] = {
5417 // type (short header, 4 byte packet number)
5418 0x43,
5419 // connection_id
5420 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5421 // packet number
5422 0x12, 0x34, 0x56, 0x78,
5423
5424 // ack frequency frame type (which needs two bytes as it is > 0x3F)
5425 0x40, 0xAF,
5426 // sequence_number
5427 0x11,
5428 // packet_tolerance
5429 0x02,
5430 // max_ack_delay_us = 2'5000 us
5431 0x80, 0x00, 0x61, 0xA8,
5432 // ignore_order
5433 0x01
5434 };
5435 // clang-format on
5436
5437 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
5438 return;
5439 }
5440
vasilvvbed67c62020-10-20 06:38:43 -07005441 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
haoyuewang6a6a0ff2020-06-23 16:32:26 -07005442 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5443
5444 EXPECT_THAT(framer_.error(), IsQuicNoError());
5445 ASSERT_TRUE(visitor_.header_.get());
5446 EXPECT_TRUE(CheckDecryption(
5447 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5448 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
5449
5450 ASSERT_EQ(1u, visitor_.ack_frequency_frames_.size());
5451 const auto& frame = visitor_.ack_frequency_frames_.front();
5452 EXPECT_EQ(17u, frame->sequence_number);
5453 EXPECT_EQ(2u, frame->packet_tolerance);
5454 EXPECT_EQ(2'5000u, frame->max_ack_delay.ToMicroseconds());
5455 EXPECT_EQ(true, frame->ignore_order);
5456}
5457
QUICHE teama6ef0a62019-03-07 20:34:33 -05005458TEST_P(QuicFramerTest, MessageFrame) {
dschinazicd86dd12019-11-14 10:11:13 -08005459 if (!VersionSupportsMessageFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005460 return;
5461 }
zhongyi546cc452019-04-12 15:27:49 -07005462 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005463 // clang-format off
QUICHE teama6ef0a62019-03-07 20:34:33 -05005464 PacketFragments packet46 = {
5465 // type (short header, 4 byte packet number)
5466 {"",
5467 {0x43}},
5468 // connection_id
5469 {"",
5470 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5471 // packet number
5472 {"",
5473 {0x12, 0x34, 0x56, 0x78}},
5474 // message frame type.
5475 {"",
5476 { 0x21 }},
5477 // message length
5478 {"Unable to read message length",
5479 {0x07}},
5480 // message data
5481 {"Unable to read message data",
5482 {'m', 'e', 's', 's', 'a', 'g', 'e'}},
5483 // message frame no length.
5484 {"",
5485 { 0x20 }},
5486 // message data
5487 {{},
5488 {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
5489 };
dschinazicd86dd12019-11-14 10:11:13 -08005490 PacketFragments packet99 = {
5491 // type (short header, 4 byte packet number)
5492 {"",
5493 {0x43}},
5494 // connection_id
5495 {"",
5496 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5497 // packet number
5498 {"",
5499 {0x12, 0x34, 0x56, 0x78}},
5500 // message frame type.
5501 {"",
5502 { 0x31 }},
5503 // message length
5504 {"Unable to read message length",
5505 {0x07}},
5506 // message data
5507 {"Unable to read message data",
5508 {'m', 'e', 's', 's', 'a', 'g', 'e'}},
5509 // message frame no length.
5510 {"",
5511 { 0x30 }},
5512 // message data
5513 {{},
5514 {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
5515 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05005516 // clang-format on
5517
dschinazicd86dd12019-11-14 10:11:13 -08005518 std::unique_ptr<QuicEncryptedPacket> encrypted;
5519 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5520 encrypted = AssemblePacketFromFragments(packet99);
5521 } else {
5522 encrypted = AssemblePacketFromFragments(packet46);
5523 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005524 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5525
bncf6f82b12019-10-30 07:01:01 -07005526 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005527 ASSERT_TRUE(visitor_.header_.get());
5528 EXPECT_TRUE(CheckDecryption(
5529 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5530 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
5531
5532 ASSERT_EQ(2u, visitor_.message_frames_.size());
5533 EXPECT_EQ(7u, visitor_.message_frames_[0]->message_length);
5534 EXPECT_EQ(8u, visitor_.message_frames_[1]->message_length);
5535
dschinazicd86dd12019-11-14 10:11:13 -08005536 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5537 CheckFramingBoundaries(packet99, QUIC_INVALID_MESSAGE_DATA);
5538 } else {
5539 CheckFramingBoundaries(packet46, QUIC_INVALID_MESSAGE_DATA);
5540 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005541}
5542
5543TEST_P(QuicFramerTest, PublicResetPacketV33) {
5544 // clang-format off
5545 PacketFragments packet = {
5546 // public flags (public reset, 8 byte connection_id)
5547 {"",
5548 {0x0A}},
5549 // connection_id
5550 {"",
5551 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5552 {"Unable to read reset message.",
5553 {
5554 // message tag (kPRST)
5555 'P', 'R', 'S', 'T',
5556 // num_entries (2) + padding
5557 0x02, 0x00, 0x00, 0x00,
5558 // tag kRNON
5559 'R', 'N', 'O', 'N',
5560 // end offset 8
5561 0x08, 0x00, 0x00, 0x00,
5562 // tag kRSEQ
5563 'R', 'S', 'E', 'Q',
5564 // end offset 16
5565 0x10, 0x00, 0x00, 0x00,
5566 // nonce proof
5567 0x89, 0x67, 0x45, 0x23,
5568 0x01, 0xEF, 0xCD, 0xAB,
5569 // rejected packet number
5570 0xBC, 0x9A, 0x78, 0x56,
5571 0x34, 0x12, 0x00, 0x00,
5572 }
5573 }
5574 };
5575 // clang-format on
dschinaziceed8662020-07-14 09:37:05 -07005576 if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005577 return;
5578 }
5579
5580 std::unique_ptr<QuicEncryptedPacket> encrypted(
5581 AssemblePacketFromFragments(packet));
5582 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07005583 ASSERT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005584 ASSERT_TRUE(visitor_.public_reset_packet_.get());
5585 EXPECT_EQ(FramerTestConnectionId(),
5586 visitor_.public_reset_packet_->connection_id);
5587 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof);
5588 EXPECT_EQ(
5589 IpAddressFamily::IP_UNSPEC,
5590 visitor_.public_reset_packet_->client_address.host().address_family());
5591
5592 CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
5593}
5594
5595TEST_P(QuicFramerTest, PublicResetPacket) {
5596 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5597
5598 // clang-format off
5599 PacketFragments packet = {
5600 // public flags (public reset, 8 byte connection_id)
5601 {"",
5602 {0x0E}},
5603 // connection_id
5604 {"",
5605 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5606 {"Unable to read reset message.",
5607 {
5608 // message tag (kPRST)
5609 'P', 'R', 'S', 'T',
5610 // num_entries (2) + padding
5611 0x02, 0x00, 0x00, 0x00,
5612 // tag kRNON
5613 'R', 'N', 'O', 'N',
5614 // end offset 8
5615 0x08, 0x00, 0x00, 0x00,
5616 // tag kRSEQ
5617 'R', 'S', 'E', 'Q',
5618 // end offset 16
5619 0x10, 0x00, 0x00, 0x00,
5620 // nonce proof
5621 0x89, 0x67, 0x45, 0x23,
5622 0x01, 0xEF, 0xCD, 0xAB,
5623 // rejected packet number
5624 0xBC, 0x9A, 0x78, 0x56,
5625 0x34, 0x12, 0x00, 0x00,
5626 }
5627 }
5628 };
5629 // clang-format on
5630
dschinaziceed8662020-07-14 09:37:05 -07005631 if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005632 return;
5633 }
5634
5635 std::unique_ptr<QuicEncryptedPacket> encrypted(
5636 AssemblePacketFromFragments(packet));
5637 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07005638 ASSERT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005639 ASSERT_TRUE(visitor_.public_reset_packet_.get());
5640 EXPECT_EQ(FramerTestConnectionId(),
5641 visitor_.public_reset_packet_->connection_id);
5642 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof);
5643 EXPECT_EQ(
5644 IpAddressFamily::IP_UNSPEC,
5645 visitor_.public_reset_packet_->client_address.host().address_family());
5646
5647 CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
5648}
5649
5650TEST_P(QuicFramerTest, PublicResetPacketWithTrailingJunk) {
5651 // clang-format off
5652 unsigned char packet[] = {
5653 // public flags (public reset, 8 byte connection_id)
5654 0x0A,
5655 // connection_id
5656 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5657 // message tag (kPRST)
5658 'P', 'R', 'S', 'T',
5659 // num_entries (2) + padding
5660 0x02, 0x00, 0x00, 0x00,
5661 // tag kRNON
5662 'R', 'N', 'O', 'N',
5663 // end offset 8
5664 0x08, 0x00, 0x00, 0x00,
5665 // tag kRSEQ
5666 'R', 'S', 'E', 'Q',
5667 // end offset 16
5668 0x10, 0x00, 0x00, 0x00,
5669 // nonce proof
5670 0x89, 0x67, 0x45, 0x23,
5671 0x01, 0xEF, 0xCD, 0xAB,
5672 // rejected packet number
5673 0xBC, 0x9A, 0x78, 0x56,
5674 0x34, 0x12, 0x00, 0x00,
5675 // trailing junk
5676 'j', 'u', 'n', 'k',
5677 };
5678 // clang-format on
dschinaziceed8662020-07-14 09:37:05 -07005679 if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005680 return;
5681 }
5682
vasilvvbed67c62020-10-20 06:38:43 -07005683 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005684 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
bncf54082a2019-11-27 10:19:47 -08005685 ASSERT_THAT(framer_.error(), IsError(QUIC_INVALID_PUBLIC_RST_PACKET));
QUICHE teama6ef0a62019-03-07 20:34:33 -05005686 EXPECT_EQ("Unable to read reset message.", framer_.detailed_error());
5687}
5688
5689TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) {
5690 // clang-format off
5691 PacketFragments packet = {
5692 // public flags (public reset, 8 byte connection_id)
5693 {"",
5694 {0x0A}},
5695 // connection_id
5696 {"",
5697 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5698 {"Unable to read reset message.",
5699 {
5700 // message tag (kPRST)
5701 'P', 'R', 'S', 'T',
5702 // num_entries (2) + padding
5703 0x03, 0x00, 0x00, 0x00,
5704 // tag kRNON
5705 'R', 'N', 'O', 'N',
5706 // end offset 8
5707 0x08, 0x00, 0x00, 0x00,
5708 // tag kRSEQ
5709 'R', 'S', 'E', 'Q',
5710 // end offset 16
5711 0x10, 0x00, 0x00, 0x00,
5712 // tag kCADR
5713 'C', 'A', 'D', 'R',
5714 // end offset 24
5715 0x18, 0x00, 0x00, 0x00,
5716 // nonce proof
5717 0x89, 0x67, 0x45, 0x23,
5718 0x01, 0xEF, 0xCD, 0xAB,
5719 // rejected packet number
5720 0xBC, 0x9A, 0x78, 0x56,
5721 0x34, 0x12, 0x00, 0x00,
5722 // client address: 4.31.198.44:443
5723 0x02, 0x00,
5724 0x04, 0x1F, 0xC6, 0x2C,
5725 0xBB, 0x01,
5726 }
5727 }
5728 };
5729 // clang-format on
dschinaziceed8662020-07-14 09:37:05 -07005730 if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005731 return;
5732 }
5733
5734 std::unique_ptr<QuicEncryptedPacket> encrypted(
5735 AssemblePacketFromFragments(packet));
5736 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07005737 ASSERT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005738 ASSERT_TRUE(visitor_.public_reset_packet_.get());
5739 EXPECT_EQ(FramerTestConnectionId(),
5740 visitor_.public_reset_packet_->connection_id);
5741 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof);
5742 EXPECT_EQ("4.31.198.44",
5743 visitor_.public_reset_packet_->client_address.host().ToString());
5744 EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port());
5745
5746 CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
5747}
5748
5749TEST_P(QuicFramerTest, IetfStatelessResetPacket) {
5750 // clang-format off
5751 unsigned char packet[] = {
5752 // type (short packet, 1 byte packet number)
5753 0x50,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005754 // Random bytes
5755 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5756 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5757 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5758 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5759 // stateless reset token
5760 0xB5, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
5761 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5762 };
5763 // clang-format on
dschinaziceed8662020-07-14 09:37:05 -07005764 if (!framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005765 return;
5766 }
5767 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
dschinazib953d022019-08-01 18:05:58 -07005768 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
5769 TestConnectionId(0x33));
QUICHE teama6ef0a62019-03-07 20:34:33 -05005770 decrypter_ = new test::TestDecrypter();
zhongyi546cc452019-04-12 15:27:49 -07005771 if (framer_.version().KnowsWhichDecrypterToUse()) {
vasilvv0fc587f2019-09-06 13:33:08 -07005772 framer_.InstallDecrypter(
5773 ENCRYPTION_INITIAL,
5774 std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07005775 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
5776 std::unique_ptr<QuicDecrypter>(decrypter_));
5777 } else {
vasilvv0fc587f2019-09-06 13:33:08 -07005778 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
5779 Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07005780 framer_.SetAlternativeDecrypter(
5781 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
5782 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005783 // This packet cannot be decrypted because diversification nonce is missing.
vasilvvbed67c62020-10-20 06:38:43 -07005784 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005785 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07005786 ASSERT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005787 ASSERT_TRUE(visitor_.stateless_reset_packet_.get());
5788 EXPECT_EQ(kTestStatelessResetToken,
5789 visitor_.stateless_reset_packet_->stateless_reset_token);
5790}
5791
5792TEST_P(QuicFramerTest, IetfStatelessResetPacketInvalidStatelessResetToken) {
5793 // clang-format off
5794 unsigned char packet[] = {
5795 // type (short packet, 1 byte packet number)
5796 0x50,
dschinazib953d022019-08-01 18:05:58 -07005797 // Random bytes
5798 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5799 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5800 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5801 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005802 // stateless reset token
5803 0xB6, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
5804 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5805 };
5806 // clang-format on
dschinaziceed8662020-07-14 09:37:05 -07005807 if (!framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005808 return;
5809 }
dschinazib953d022019-08-01 18:05:58 -07005810 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
5811 TestConnectionId(0x33));
QUICHE teama6ef0a62019-03-07 20:34:33 -05005812 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005813 decrypter_ = new test::TestDecrypter();
zhongyi546cc452019-04-12 15:27:49 -07005814 if (framer_.version().KnowsWhichDecrypterToUse()) {
vasilvv0fc587f2019-09-06 13:33:08 -07005815 framer_.InstallDecrypter(
5816 ENCRYPTION_INITIAL,
5817 std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07005818 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
5819 std::unique_ptr<QuicDecrypter>(decrypter_));
5820 } else {
vasilvv0fc587f2019-09-06 13:33:08 -07005821 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
5822 Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07005823 framer_.SetAlternativeDecrypter(
5824 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
5825 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005826 // This packet cannot be decrypted because diversification nonce is missing.
vasilvvbed67c62020-10-20 06:38:43 -07005827 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005828 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07005829 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
QUICHE teama6ef0a62019-03-07 20:34:33 -05005830 ASSERT_FALSE(visitor_.stateless_reset_packet_);
5831}
5832
dschinazi072da7c2019-05-07 17:57:42 -07005833TEST_P(QuicFramerTest, VersionNegotiationPacketClient) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005834 // clang-format off
5835 PacketFragments packet = {
5836 // public flags (version, 8 byte connection_id)
5837 {"",
5838 {0x29}},
5839 // connection_id
5840 {"",
5841 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5842 // version tag
5843 {"Unable to read supported version in negotiation.",
5844 {QUIC_VERSION_BYTES,
5845 'Q', '2', '.', '0'}},
5846 };
5847
fayang36825da2019-08-21 14:01:27 -07005848 PacketFragments packet46 = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005849 // type (long header)
5850 {"",
5851 {0x8F}},
5852 // version tag
5853 {"",
5854 {0x00, 0x00, 0x00, 0x00}},
5855 {"",
5856 {0x05}},
5857 // connection_id
5858 {"",
5859 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5860 // Supported versions
5861 {"Unable to read supported version in negotiation.",
5862 {QUIC_VERSION_BYTES,
5863 'Q', '2', '.', '0'}},
5864 };
dschinazi48ac9192019-07-31 00:07:26 -07005865
dschinazic73506e2019-09-20 13:26:46 -07005866 PacketFragments packet49 = {
dschinazi48ac9192019-07-31 00:07:26 -07005867 // type (long header)
5868 {"",
5869 {0x8F}},
5870 // version tag
5871 {"",
5872 {0x00, 0x00, 0x00, 0x00}},
5873 {"",
5874 {0x08}},
5875 // connection_id
5876 {"",
5877 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5878 {"",
5879 {0x00}},
5880 // Supported versions
5881 {"Unable to read supported version in negotiation.",
5882 {QUIC_VERSION_BYTES,
5883 'Q', '2', '.', '0'}},
5884 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05005885 // clang-format on
5886
5887 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5888
5889 PacketFragments& fragments =
dschinaziceed8662020-07-14 09:37:05 -07005890 framer_.version().HasLongHeaderLengths() ? packet49
5891 : framer_.version().HasIetfInvariantHeader() ? packet46
5892 : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -05005893 std::unique_ptr<QuicEncryptedPacket> encrypted(
5894 AssemblePacketFromFragments(fragments));
5895 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07005896 ASSERT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005897 ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
nharper4fd11052019-06-04 14:23:22 -07005898 EXPECT_EQ(1u, visitor_.version_negotiation_packet_->versions.size());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005899 EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]);
5900
5901 // Remove the last version from the packet so that every truncated
5902 // version of the packet is invalid, otherwise checking boundaries
5903 // is annoyingly complicated.
5904 for (size_t i = 0; i < 4; ++i) {
5905 fragments.back().fragment.pop_back();
5906 }
5907 CheckFramingBoundaries(fragments, QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
5908}
5909
dschinazi072da7c2019-05-07 17:57:42 -07005910TEST_P(QuicFramerTest, VersionNegotiationPacketServer) {
dschinaziceed8662020-07-14 09:37:05 -07005911 if (!framer_.version().HasIetfInvariantHeader()) {
dschinazi072da7c2019-05-07 17:57:42 -07005912 return;
5913 }
5914
5915 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
5916 // clang-format off
5917 unsigned char packet[] = {
5918 // public flags (long header with all ignored bits set)
5919 0xFF,
5920 // version
5921 0x00, 0x00, 0x00, 0x00,
5922 // connection ID lengths
5923 0x50,
5924 // destination connection ID
5925 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5926 // supported versions
5927 QUIC_VERSION_BYTES,
5928 'Q', '2', '.', '0',
5929 };
dschinazi48ac9192019-07-31 00:07:26 -07005930 unsigned char packet2[] = {
5931 // public flags (long header with all ignored bits set)
5932 0xFF,
5933 // version
5934 0x00, 0x00, 0x00, 0x00,
5935 // destination connection ID length
5936 0x08,
5937 // destination connection ID
5938 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5939 // source connection ID length
5940 0x00,
5941 // supported versions
5942 QUIC_VERSION_BYTES,
5943 'Q', '2', '.', '0',
5944 };
dschinazi072da7c2019-05-07 17:57:42 -07005945 // clang-format on
dschinazi48ac9192019-07-31 00:07:26 -07005946 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07005947 size_t p_length = ABSL_ARRAYSIZE(packet);
dschinazi48ac9192019-07-31 00:07:26 -07005948 if (framer_.version().HasLengthPrefixedConnectionIds()) {
5949 p = packet2;
vasilvvbed67c62020-10-20 06:38:43 -07005950 p_length = ABSL_ARRAYSIZE(packet2);
dschinazi48ac9192019-07-31 00:07:26 -07005951 }
dschinazi072da7c2019-05-07 17:57:42 -07005952
dschinazi48ac9192019-07-31 00:07:26 -07005953 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
dschinazi072da7c2019-05-07 17:57:42 -07005954 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07005955 EXPECT_THAT(framer_.error(),
5956 IsError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET));
dschinazi072da7c2019-05-07 17:57:42 -07005957 EXPECT_EQ("Server received version negotiation packet.",
5958 framer_.detailed_error());
5959 EXPECT_FALSE(visitor_.version_negotiation_packet_.get());
5960}
5961
QUICHE teama6ef0a62019-03-07 20:34:33 -05005962TEST_P(QuicFramerTest, OldVersionNegotiationPacket) {
5963 // clang-format off
5964 PacketFragments packet = {
5965 // public flags (version, 8 byte connection_id)
5966 {"",
5967 {0x2D}},
5968 // connection_id
5969 {"",
5970 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5971 // version tag
5972 {"Unable to read supported version in negotiation.",
5973 {QUIC_VERSION_BYTES,
5974 'Q', '2', '.', '0'}},
5975 };
5976 // clang-format on
5977
dschinaziceed8662020-07-14 09:37:05 -07005978 if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005979 return;
5980 }
5981
5982 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5983
5984 std::unique_ptr<QuicEncryptedPacket> encrypted(
5985 AssemblePacketFromFragments(packet));
5986 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -07005987 ASSERT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005988 ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
nharper4fd11052019-06-04 14:23:22 -07005989 EXPECT_EQ(1u, visitor_.version_negotiation_packet_->versions.size());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005990 EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]);
5991
5992 // Remove the last version from the packet so that every truncated
5993 // version of the packet is invalid, otherwise checking boundaries
5994 // is annoyingly complicated.
5995 for (size_t i = 0; i < 4; ++i) {
5996 packet.back().fragment.pop_back();
5997 }
5998 CheckFramingBoundaries(packet, QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
5999}
6000
dschinazi244f6dc2019-05-06 15:45:16 -07006001TEST_P(QuicFramerTest, ParseIetfRetryPacket) {
6002 if (!framer_.version().SupportsRetry()) {
6003 return;
6004 }
6005 // IETF RETRY is only sent from client to server.
6006 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6007 // clang-format off
6008 unsigned char packet[] = {
6009 // public flags (long header with packet type RETRY and ODCIL=8)
6010 0xF5,
6011 // version
6012 QUIC_VERSION_BYTES,
6013 // connection ID lengths
6014 0x05,
6015 // source connection ID
6016 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
6017 // original destination connection ID
6018 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6019 // retry token
6020 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
6021 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
6022 };
dschinazic73506e2019-09-20 13:26:46 -07006023 unsigned char packet49[] = {
dschinazi48ac9192019-07-31 00:07:26 -07006024 // public flags (long header with packet type RETRY)
6025 0xF0,
6026 // version
6027 QUIC_VERSION_BYTES,
6028 // destination connection ID length
6029 0x00,
6030 // source connection ID length
6031 0x08,
6032 // source connection ID
6033 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
6034 // original destination connection ID length
6035 0x08,
6036 // original destination connection ID
6037 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6038 // retry token
6039 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
6040 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
6041 };
dschinazi278efae2020-01-28 17:03:09 -08006042 unsigned char packet_with_tag[] = {
6043 // public flags (long header with packet type RETRY)
6044 0xF0,
6045 // version
6046 QUIC_VERSION_BYTES,
6047 // destination connection ID length
6048 0x00,
6049 // source connection ID length
6050 0x08,
6051 // source connection ID
6052 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
6053 // retry token
6054 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
6055 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
6056 // retry token integrity tag
6057 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
6058 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
6059 };
dschinazi244f6dc2019-05-06 15:45:16 -07006060 // clang-format on
6061
dschinazi48ac9192019-07-31 00:07:26 -07006062 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07006063 size_t p_length = ABSL_ARRAYSIZE(packet);
dschinazi1f6aca82020-12-04 13:20:08 -08006064 if (framer_.version().UsesTls()) {
dschinazi278efae2020-01-28 17:03:09 -08006065 p = packet_with_tag;
vasilvvbed67c62020-10-20 06:38:43 -07006066 p_length = ABSL_ARRAYSIZE(packet_with_tag);
dschinaziceed8662020-07-14 09:37:05 -07006067 } else if (framer_.version().HasLongHeaderLengths()) {
dschinazic73506e2019-09-20 13:26:46 -07006068 p = packet49;
vasilvvbed67c62020-10-20 06:38:43 -07006069 p_length = ABSL_ARRAYSIZE(packet49);
dschinazi48ac9192019-07-31 00:07:26 -07006070 }
6071 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
dschinazi244f6dc2019-05-06 15:45:16 -07006072 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
6073
bncf6f82b12019-10-30 07:01:01 -07006074 EXPECT_THAT(framer_.error(), IsQuicNoError());
dschinazi244f6dc2019-05-06 15:45:16 -07006075 ASSERT_TRUE(visitor_.header_.get());
6076
dschinazi2dd75ee2020-01-29 09:21:37 -08006077 ASSERT_TRUE(visitor_.on_retry_packet_called_);
dschinazi244f6dc2019-05-06 15:45:16 -07006078 ASSERT_TRUE(visitor_.retry_new_connection_id_.get());
6079 ASSERT_TRUE(visitor_.retry_token_.get());
6080
dschinazi1f6aca82020-12-04 13:20:08 -08006081 if (framer_.version().UsesTls()) {
dschinazi278efae2020-01-28 17:03:09 -08006082 ASSERT_TRUE(visitor_.retry_token_integrity_tag_.get());
6083 static const unsigned char expected_integrity_tag[16] = {
6084 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
6085 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
6086 };
6087 quiche::test::CompareCharArraysWithHexError(
6088 "retry integrity tag", visitor_.retry_token_integrity_tag_->data(),
6089 visitor_.retry_token_integrity_tag_->length(),
6090 reinterpret_cast<const char*>(expected_integrity_tag),
vasilvvbed67c62020-10-20 06:38:43 -07006091 ABSL_ARRAYSIZE(expected_integrity_tag));
dschinazi278efae2020-01-28 17:03:09 -08006092 ASSERT_TRUE(visitor_.retry_without_tag_.get());
6093 quiche::test::CompareCharArraysWithHexError(
6094 "retry without tag", visitor_.retry_without_tag_->data(),
6095 visitor_.retry_without_tag_->length(),
6096 reinterpret_cast<const char*>(packet_with_tag), 35);
6097 } else {
6098 ASSERT_TRUE(visitor_.retry_original_connection_id_.get());
6099 EXPECT_EQ(FramerTestConnectionId(),
6100 *visitor_.retry_original_connection_id_.get());
6101 }
6102
dschinazi244f6dc2019-05-06 15:45:16 -07006103 EXPECT_EQ(FramerTestConnectionIdPlusOne(),
6104 *visitor_.retry_new_connection_id_.get());
6105 EXPECT_EQ("Hello this is RETRY!", *visitor_.retry_token_.get());
dschinazi244f6dc2019-05-06 15:45:16 -07006106
dschinazi2dd75ee2020-01-29 09:21:37 -08006107 // IETF RETRY is only sent from client to server, the rest of this test
6108 // ensures that the server correctly drops them without acting on them.
dschinazi244f6dc2019-05-06 15:45:16 -07006109 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
dschinazi2dd75ee2020-01-29 09:21:37 -08006110 // Reset our visitor state to default settings.
6111 visitor_.retry_original_connection_id_.reset();
6112 visitor_.retry_new_connection_id_.reset();
6113 visitor_.retry_token_.reset();
6114 visitor_.retry_token_integrity_tag_.reset();
6115 visitor_.retry_without_tag_.reset();
6116 visitor_.on_retry_packet_called_ = false;
dschinazi244f6dc2019-05-06 15:45:16 -07006117
dschinazi244f6dc2019-05-06 15:45:16 -07006118 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
6119
bncf6f82b12019-10-30 07:01:01 -07006120 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
dschinazi244f6dc2019-05-06 15:45:16 -07006121 EXPECT_EQ("Client-initiated RETRY is invalid.", framer_.detailed_error());
dschinazi2dd75ee2020-01-29 09:21:37 -08006122
6123 EXPECT_FALSE(visitor_.on_retry_packet_called_);
6124 EXPECT_FALSE(visitor_.retry_new_connection_id_.get());
6125 EXPECT_FALSE(visitor_.retry_token_.get());
6126 EXPECT_FALSE(visitor_.retry_token_integrity_tag_.get());
6127 EXPECT_FALSE(visitor_.retry_without_tag_.get());
dschinazi244f6dc2019-05-06 15:45:16 -07006128}
6129
QUICHE teama6ef0a62019-03-07 20:34:33 -05006130TEST_P(QuicFramerTest, BuildPaddingFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04006131 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006132 QuicPacketHeader header;
6133 header.destination_connection_id = FramerTestConnectionId();
6134 header.reset_flag = false;
6135 header.version_flag = false;
6136 header.packet_number = kPacketNumber;
6137
6138 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
6139
6140 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07006141 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006142 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04006143 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006144 // connection_id
6145 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6146 // packet number
6147 0x12, 0x34, 0x56, 0x78,
6148
6149 // frame type (padding frame)
6150 0x00,
6151 0x00, 0x00, 0x00, 0x00
6152 };
6153
dschinazi66dea072019-04-09 11:41:06 -07006154 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006155 // type (short header, 4 byte packet number)
6156 0x43,
6157 // connection_id
6158 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6159 // packet number
6160 0x12, 0x34, 0x56, 0x78,
6161
6162 // frame type (padding frame)
6163 0x00,
6164 0x00, 0x00, 0x00, 0x00
6165 };
6166
dschinazi66dea072019-04-09 11:41:06 -07006167 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006168 // type (short header, 4 byte packet number)
6169 0x43,
6170 // connection_id
6171 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6172 // packet number
6173 0x12, 0x34, 0x56, 0x78,
6174
6175 // frame type (padding frame)
6176 0x00,
6177 0x00, 0x00, 0x00, 0x00
6178 };
6179 // clang-format on
6180
6181 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07006182 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006183 p = packet99;
dschinaziceed8662020-07-14 09:37:05 -07006184 } else if (framer_.version().HasIetfInvariantHeader()) {
fayang374888f2019-05-31 06:47:21 -07006185 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05006186 }
6187
6188 uint64_t header_size = GetPacketHeaderSize(
6189 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
6190 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
6191 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
6192 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07006193 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006194
6195 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6196 ASSERT_TRUE(data != nullptr);
6197
dmcardle8f7df532020-01-07 13:28:57 -08006198 quiche::test::CompareCharArraysWithHexError(
QUICHE teama6ef0a62019-03-07 20:34:33 -05006199 "constructed packet", data->data(), data->length(), AsChars(p),
vasilvvbed67c62020-10-20 06:38:43 -07006200 framer_.version().HasIetfInvariantHeader() ? ABSL_ARRAYSIZE(packet46)
6201 : ABSL_ARRAYSIZE(packet));
QUICHE teama6ef0a62019-03-07 20:34:33 -05006202}
6203
6204TEST_P(QuicFramerTest, BuildStreamFramePacketWithNewPaddingFrame) {
QUICHE team2252b702019-05-14 23:55:14 -04006205 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006206 QuicPacketHeader header;
6207 header.destination_connection_id = FramerTestConnectionId();
6208 header.reset_flag = false;
6209 header.version_flag = false;
6210 header.packet_number = kPacketNumber;
6211 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
vasilvvc872ee42020-10-07 19:50:22 -07006212 absl::string_view("hello world!"));
QUICHE teama6ef0a62019-03-07 20:34:33 -05006213 QuicPaddingFrame padding_frame(2);
6214 QuicFrames frames = {QuicFrame(padding_frame), QuicFrame(stream_frame),
6215 QuicFrame(padding_frame)};
6216
6217 // clang-format off
6218 unsigned char packet[] = {
6219 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04006220 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006221 // connection_id
6222 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6223 // packet number
6224 0x12, 0x34, 0x56, 0x78,
6225
6226 // paddings
6227 0x00, 0x00,
6228 // frame type (stream frame with fin)
6229 0xFF,
6230 // stream id
6231 0x01, 0x02, 0x03, 0x04,
6232 // offset
6233 0x3A, 0x98, 0xFE, 0xDC,
6234 0x32, 0x10, 0x76, 0x54,
6235 // data length
6236 0x00, 0x0c,
6237 // data
6238 'h', 'e', 'l', 'l',
6239 'o', ' ', 'w', 'o',
6240 'r', 'l', 'd', '!',
6241 // paddings
6242 0x00, 0x00,
6243 };
6244
QUICHE teama6ef0a62019-03-07 20:34:33 -05006245 unsigned char packet46[] = {
6246 // type (short header, 4 byte packet number)
6247 0x43,
6248 // connection_id
6249 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6250 // packet number
6251 0x12, 0x34, 0x56, 0x78,
6252
6253 // paddings
6254 0x00, 0x00,
6255 // frame type (stream frame with fin)
6256 0xFF,
6257 // stream id
6258 0x01, 0x02, 0x03, 0x04,
6259 // offset
6260 0x3A, 0x98, 0xFE, 0xDC,
6261 0x32, 0x10, 0x76, 0x54,
6262 // data length
6263 0x00, 0x0c,
6264 // data
6265 'h', 'e', 'l', 'l',
6266 'o', ' ', 'w', 'o',
6267 'r', 'l', 'd', '!',
6268 // paddings
6269 0x00, 0x00,
6270 };
6271
6272 unsigned char packet99[] = {
6273 // type (short header, 4 byte packet number)
6274 0x43,
6275 // connection_id
6276 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6277 // packet number
6278 0x12, 0x34, 0x56, 0x78,
6279
6280 // paddings
6281 0x00, 0x00,
6282 // frame type (IETF_STREAM with FIN, LEN, and OFFSET bits set)
6283 0x08 | 0x01 | 0x02 | 0x04,
6284 // stream id
6285 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
6286 // offset
6287 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6288 0x32, 0x10, 0x76, 0x54,
6289 // data length
6290 kVarInt62OneByte + 0x0c,
6291 // data
6292 'h', 'e', 'l', 'l',
6293 'o', ' ', 'w', 'o',
6294 'r', 'l', 'd', '!',
6295 // paddings
6296 0x00, 0x00,
6297 };
6298 // clang-format on
6299
6300 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6301 ASSERT_TRUE(data != nullptr);
6302
6303 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07006304 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07006305 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006306 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -07006307 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -07006308 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006309 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07006310 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006311 }
6312 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
6313
dmcardle8f7df532020-01-07 13:28:57 -08006314 quiche::test::CompareCharArraysWithHexError(
6315 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006316}
6317
6318TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04006319 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006320 QuicPacketHeader header;
6321 header.destination_connection_id = FramerTestConnectionId();
6322 header.reset_flag = false;
6323 header.version_flag = false;
6324 header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
6325 header.packet_number = kPacketNumber;
6326
6327 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
6328
6329 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07006330 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006331 // public flags (8 byte connection_id and 4 byte packet number)
QUICHE team2252b702019-05-14 23:55:14 -04006332 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006333 // connection_id
6334 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6335 // packet number
6336 0x12, 0x34, 0x56, 0x78,
6337
6338 // frame type (padding frame)
6339 0x00,
6340 0x00, 0x00, 0x00, 0x00
6341 };
6342
dschinazi66dea072019-04-09 11:41:06 -07006343 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006344 // type (short header, 4 byte packet number)
6345 0x43,
6346 // connection_id
6347 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6348 // packet number
6349 0x12, 0x34, 0x56, 0x78,
6350
6351 // frame type (padding frame)
6352 0x00,
6353 0x00, 0x00, 0x00, 0x00
6354 };
6355
dschinazi66dea072019-04-09 11:41:06 -07006356 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006357 // type (short header, 4 byte packet number)
6358 0x43,
6359 // connection_id
6360 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6361 // packet number
6362 0x12, 0x34, 0x56, 0x78,
6363
6364 // frame type (padding frame)
6365 0x00,
6366 0x00, 0x00, 0x00, 0x00
6367 };
6368 // clang-format on
6369
6370 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07006371 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006372 p = packet99;
dschinaziceed8662020-07-14 09:37:05 -07006373 } else if (framer_.version().HasIetfInvariantHeader()) {
fayang374888f2019-05-31 06:47:21 -07006374 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05006375 }
6376
6377 uint64_t header_size = GetPacketHeaderSize(
6378 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
6379 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
6380 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
6381 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07006382 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006383
6384 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6385 ASSERT_TRUE(data != nullptr);
6386
dmcardle8f7df532020-01-07 13:28:57 -08006387 quiche::test::CompareCharArraysWithHexError(
QUICHE teama6ef0a62019-03-07 20:34:33 -05006388 "constructed packet", data->data(), data->length(), AsChars(p),
vasilvvbed67c62020-10-20 06:38:43 -07006389 framer_.version().HasIetfInvariantHeader() ? ABSL_ARRAYSIZE(packet46)
6390 : ABSL_ARRAYSIZE(packet));
QUICHE teama6ef0a62019-03-07 20:34:33 -05006391}
6392
6393TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04006394 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006395 QuicPacketHeader header;
6396 header.destination_connection_id = FramerTestConnectionId();
6397 header.reset_flag = false;
6398 header.version_flag = false;
6399 header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
6400 header.packet_number = kPacketNumber;
6401
6402 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
6403
6404 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07006405 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006406 // public flags (8 byte connection_id and 2 byte packet number)
QUICHE team2252b702019-05-14 23:55:14 -04006407 0x1C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006408 // connection_id
6409 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6410 // packet number
6411 0x56, 0x78,
6412
6413 // frame type (padding frame)
6414 0x00,
6415 0x00, 0x00, 0x00, 0x00
6416 };
6417
dschinazi66dea072019-04-09 11:41:06 -07006418 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006419 // type (short header, 2 byte packet number)
6420 0x41,
6421 // connection_id
6422 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6423 // packet number
6424 0x56, 0x78,
6425
6426 // frame type (padding frame)
6427 0x00,
6428 0x00, 0x00, 0x00, 0x00
6429 };
6430
dschinazi66dea072019-04-09 11:41:06 -07006431 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006432 // type (short header, 2 byte packet number)
6433 0x41,
6434 // connection_id
6435 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6436 // packet number
6437 0x56, 0x78,
6438
6439 // frame type (padding frame)
6440 0x00,
6441 0x00, 0x00, 0x00, 0x00
6442 };
6443 // clang-format on
6444
6445 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07006446 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006447 p = packet99;
dschinaziceed8662020-07-14 09:37:05 -07006448 } else if (framer_.version().HasIetfInvariantHeader()) {
fayang374888f2019-05-31 06:47:21 -07006449 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05006450 }
6451
6452 uint64_t header_size = GetPacketHeaderSize(
6453 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
6454 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
6455 !kIncludeDiversificationNonce, PACKET_2BYTE_PACKET_NUMBER,
6456 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07006457 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006458
6459 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6460 ASSERT_TRUE(data != nullptr);
6461
dmcardle8f7df532020-01-07 13:28:57 -08006462 quiche::test::CompareCharArraysWithHexError(
QUICHE teama6ef0a62019-03-07 20:34:33 -05006463 "constructed packet", data->data(), data->length(), AsChars(p),
vasilvvbed67c62020-10-20 06:38:43 -07006464 framer_.version().HasIetfInvariantHeader() ? ABSL_ARRAYSIZE(packet46)
6465 : ABSL_ARRAYSIZE(packet));
QUICHE teama6ef0a62019-03-07 20:34:33 -05006466}
6467
6468TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04006469 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006470 QuicPacketHeader header;
6471 header.destination_connection_id = FramerTestConnectionId();
6472 header.reset_flag = false;
6473 header.version_flag = false;
6474 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
6475 header.packet_number = kPacketNumber;
6476
6477 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
6478
6479 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07006480 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006481 // public flags (8 byte connection_id and 1 byte packet number)
QUICHE team2252b702019-05-14 23:55:14 -04006482 0x0C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006483 // connection_id
6484 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6485 // packet number
6486 0x78,
6487
6488 // frame type (padding frame)
6489 0x00,
6490 0x00, 0x00, 0x00, 0x00
6491 };
6492
dschinazi66dea072019-04-09 11:41:06 -07006493 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006494 // type (short header, 1 byte packet number)
6495 0x40,
6496 // connection_id
6497 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6498 // packet number
6499 0x78,
6500
6501 // frame type (padding frame)
6502 0x00,
6503 0x00, 0x00, 0x00, 0x00
6504 };
6505
dschinazi66dea072019-04-09 11:41:06 -07006506 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006507 // type (short header, 1 byte packet number)
6508 0x40,
6509 // connection_id
6510 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6511 // packet number
6512 0x78,
6513
6514 // frame type (padding frame)
6515 0x00,
6516 0x00, 0x00, 0x00, 0x00
6517 };
6518 // clang-format on
6519
6520 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07006521 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006522 p = packet99;
dschinaziceed8662020-07-14 09:37:05 -07006523 } else if (framer_.version().HasIetfInvariantHeader()) {
fayang374888f2019-05-31 06:47:21 -07006524 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05006525 }
6526
6527 uint64_t header_size = GetPacketHeaderSize(
6528 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
6529 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
6530 !kIncludeDiversificationNonce, PACKET_1BYTE_PACKET_NUMBER,
6531 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07006532 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006533
6534 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6535 ASSERT_TRUE(data != nullptr);
6536
dmcardle8f7df532020-01-07 13:28:57 -08006537 quiche::test::CompareCharArraysWithHexError(
QUICHE teama6ef0a62019-03-07 20:34:33 -05006538 "constructed packet", data->data(), data->length(), AsChars(p),
vasilvvbed67c62020-10-20 06:38:43 -07006539 framer_.version().HasIetfInvariantHeader() ? ABSL_ARRAYSIZE(packet46)
6540 : ABSL_ARRAYSIZE(packet));
QUICHE teama6ef0a62019-03-07 20:34:33 -05006541}
6542
6543TEST_P(QuicFramerTest, BuildStreamFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04006544 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006545 QuicPacketHeader header;
6546 header.destination_connection_id = FramerTestConnectionId();
6547 header.reset_flag = false;
6548 header.version_flag = false;
6549 header.packet_number = kPacketNumber;
6550 if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
6551 header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
6552 }
6553
6554 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
vasilvvc872ee42020-10-07 19:50:22 -07006555 absl::string_view("hello world!"));
QUICHE teama6ef0a62019-03-07 20:34:33 -05006556
6557 QuicFrames frames = {QuicFrame(stream_frame)};
6558
6559 // clang-format off
6560 unsigned char packet[] = {
6561 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04006562 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006563 // connection_id
6564 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6565 // packet number
6566 0x12, 0x34, 0x56, 0x78,
6567
6568 // frame type (stream frame with fin and no length)
6569 0xDF,
6570 // stream id
6571 0x01, 0x02, 0x03, 0x04,
6572 // offset
6573 0x3A, 0x98, 0xFE, 0xDC,
6574 0x32, 0x10, 0x76, 0x54,
6575 // data
6576 'h', 'e', 'l', 'l',
6577 'o', ' ', 'w', 'o',
6578 'r', 'l', 'd', '!',
6579 };
6580
QUICHE teama6ef0a62019-03-07 20:34:33 -05006581 unsigned char packet46[] = {
6582 // type (short header, 4 byte packet number)
6583 0x43,
6584 // connection_id
6585 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6586 // packet number
6587 0x12, 0x34, 0x56, 0x78,
6588
6589 // frame type (stream frame with fin and no length)
6590 0xDF,
6591 // stream id
6592 0x01, 0x02, 0x03, 0x04,
6593 // offset
6594 0x3A, 0x98, 0xFE, 0xDC,
6595 0x32, 0x10, 0x76, 0x54,
6596 // data
6597 'h', 'e', 'l', 'l',
6598 'o', ' ', 'w', 'o',
6599 'r', 'l', 'd', '!',
6600 };
6601
6602 unsigned char packet99[] = {
6603 // type (short header, 4 byte packet number)
6604 0x43,
6605 // connection_id
6606 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6607 // packet number
6608 0x12, 0x34, 0x56, 0x78,
6609
6610 // frame type (IETF_STREAM frame with FIN and OFFSET, no length)
6611 0x08 | 0x01 | 0x04,
6612 // stream id
6613 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
6614 // offset
6615 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6616 0x32, 0x10, 0x76, 0x54,
6617 // data
6618 'h', 'e', 'l', 'l',
6619 'o', ' ', 'w', 'o',
6620 'r', 'l', 'd', '!',
6621 };
6622 // clang-format on
6623
6624 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6625 ASSERT_TRUE(data != nullptr);
6626
6627 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07006628 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07006629 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006630 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -07006631 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -07006632 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006633 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07006634 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006635 }
dmcardle8f7df532020-01-07 13:28:57 -08006636 quiche::test::CompareCharArraysWithHexError(
6637 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006638}
6639
6640TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) {
6641 QuicPacketHeader header;
6642 header.destination_connection_id = FramerTestConnectionId();
6643 header.reset_flag = false;
6644 header.version_flag = true;
dschinaziceed8662020-07-14 09:37:05 -07006645 if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006646 header.long_packet_type = ZERO_RTT_PROTECTED;
6647 }
6648 header.packet_number = kPacketNumber;
6649 if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
6650 header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
6651 }
6652
6653 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
vasilvvc872ee42020-10-07 19:50:22 -07006654 absl::string_view("hello world!"));
QUICHE teama6ef0a62019-03-07 20:34:33 -05006655 QuicFrames frames = {QuicFrame(stream_frame)};
6656
6657 // clang-format off
6658 unsigned char packet[] = {
6659 // public flags (version, 8 byte connection_id)
6660 0x2D,
6661 // connection_id
6662 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6663 // version tag
6664 QUIC_VERSION_BYTES,
6665 // packet number
6666 0x12, 0x34, 0x56, 0x78,
6667
6668 // frame type (stream frame with fin and no length)
6669 0xDF,
6670 // stream id
6671 0x01, 0x02, 0x03, 0x04,
6672 // offset
6673 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6674 // data
6675 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6676 };
6677
QUICHE teama6ef0a62019-03-07 20:34:33 -05006678 unsigned char packet46[] = {
6679 // type (long header with packet type ZERO_RTT_PROTECTED)
6680 0xD3,
6681 // version tag
6682 QUIC_VERSION_BYTES,
6683 // connection_id length
6684 0x50,
6685 // connection_id
6686 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6687 // packet number
6688 0x12, 0x34, 0x56, 0x78,
6689
6690 // frame type (stream frame with fin and no length)
6691 0xDF,
6692 // stream id
6693 0x01, 0x02, 0x03, 0x04,
6694 // offset
6695 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6696 // data
6697 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6698 };
6699
dschinazic73506e2019-09-20 13:26:46 -07006700 unsigned char packet49[] = {
6701 // type (long header with packet type ZERO_RTT_PROTECTED)
6702 0xD3,
6703 // version tag
6704 QUIC_VERSION_BYTES,
6705 // destination connection ID length
6706 0x08,
6707 // destination connection ID
6708 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6709 // source connection ID length
6710 0x00,
6711 // length
6712 0x40, 0x1D,
6713 // packet number
6714 0x12, 0x34, 0x56, 0x78,
6715
6716 // frame type (stream frame with fin and no length)
6717 0xDF,
6718 // stream id
6719 0x01, 0x02, 0x03, 0x04,
6720 // offset
6721 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6722 // data
6723 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6724 };
6725
QUICHE teama6ef0a62019-03-07 20:34:33 -05006726 unsigned char packet99[] = {
6727 // type (long header with packet type ZERO_RTT_PROTECTED)
6728 0xD3,
6729 // version tag
6730 QUIC_VERSION_BYTES,
dschinazi48ac9192019-07-31 00:07:26 -07006731 // destination connection ID length
6732 0x08,
6733 // destination connection ID
QUICHE teama6ef0a62019-03-07 20:34:33 -05006734 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -07006735 // source connection ID length
6736 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006737 // length
6738 0x40, 0x1D,
6739 // packet number
6740 0x12, 0x34, 0x56, 0x78,
6741
6742 // frame type (IETF_STREAM frame with fin and offset, no length)
6743 0x08 | 0x01 | 0x04,
6744 // stream id
6745 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
6746 // offset
6747 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6748 // data
6749 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6750 };
6751 // clang-format on
6752
6753 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6754 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6755 ASSERT_TRUE(data != nullptr);
6756
6757 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07006758 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07006759 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006760 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -07006761 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -07006762 } else if (framer_.version().HasLongHeaderLengths()) {
dschinazic73506e2019-09-20 13:26:46 -07006763 p = packet49;
vasilvvbed67c62020-10-20 06:38:43 -07006764 p_size = ABSL_ARRAYSIZE(packet49);
dschinaziceed8662020-07-14 09:37:05 -07006765 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006766 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07006767 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006768 }
dmcardle8f7df532020-01-07 13:28:57 -08006769 quiche::test::CompareCharArraysWithHexError(
6770 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006771}
6772
6773TEST_P(QuicFramerTest, BuildCryptoFramePacket) {
fkastenholzceae8372019-06-12 12:22:22 -07006774 if (!QuicVersionUsesCryptoFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006775 return;
6776 }
QUICHE team2252b702019-05-14 23:55:14 -04006777 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006778 QuicPacketHeader header;
6779 header.destination_connection_id = FramerTestConnectionId();
6780 header.reset_flag = false;
6781 header.version_flag = false;
6782 header.packet_number = kPacketNumber;
6783
6784 SimpleDataProducer data_producer;
6785 framer_.set_data_producer(&data_producer);
6786
vasilvvc872ee42020-10-07 19:50:22 -07006787 absl::string_view crypto_frame_contents("hello world!");
QUICHE team6987b4a2019-03-15 16:23:04 -07006788 QuicCryptoFrame crypto_frame(ENCRYPTION_INITIAL, kStreamOffset,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006789 crypto_frame_contents.length());
QUICHE team6987b4a2019-03-15 16:23:04 -07006790 data_producer.SaveCryptoData(ENCRYPTION_INITIAL, kStreamOffset,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006791 crypto_frame_contents);
6792
6793 QuicFrames frames = {QuicFrame(&crypto_frame)};
6794
6795 // clang-format off
nharper107ba5f2019-07-02 21:33:39 -07006796 unsigned char packet48[] = {
6797 // type (short header, 4 byte packet number)
6798 0x43,
6799 // connection_id
6800 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6801 // packet number
6802 0x12, 0x34, 0x56, 0x78,
6803
6804 // frame type (QuicFrameType CRYPTO_FRAME)
6805 0x08,
6806 // offset
6807 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6808 0x32, 0x10, 0x76, 0x54,
6809 // length
6810 kVarInt62OneByte + 12,
6811 // data
6812 'h', 'e', 'l', 'l',
6813 'o', ' ', 'w', 'o',
6814 'r', 'l', 'd', '!',
6815 };
6816
6817 unsigned char packet99[] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006818 // type (short header, 4 byte packet number)
6819 0x43,
6820 // connection_id
6821 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6822 // packet number
6823 0x12, 0x34, 0x56, 0x78,
6824
6825 // frame type (IETF_CRYPTO frame)
6826 0x06,
6827 // offset
6828 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6829 0x32, 0x10, 0x76, 0x54,
6830 // length
6831 kVarInt62OneByte + 12,
6832 // data
6833 'h', 'e', 'l', 'l',
6834 'o', ' ', 'w', 'o',
6835 'r', 'l', 'd', '!',
6836 };
6837 // clang-format on
6838
nharper107ba5f2019-07-02 21:33:39 -07006839 unsigned char* packet = packet48;
vasilvvbed67c62020-10-20 06:38:43 -07006840 size_t packet_size = ABSL_ARRAYSIZE(packet48);
dschinazi40f0b3d2020-02-19 17:54:05 -08006841 if (framer_.version().HasIetfQuicFrames()) {
nharper107ba5f2019-07-02 21:33:39 -07006842 packet = packet99;
vasilvvbed67c62020-10-20 06:38:43 -07006843 packet_size = ABSL_ARRAYSIZE(packet99);
nharper107ba5f2019-07-02 21:33:39 -07006844 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05006845
6846 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6847 ASSERT_TRUE(data != nullptr);
dmcardle8f7df532020-01-07 13:28:57 -08006848 quiche::test::CompareCharArraysWithHexError("constructed packet",
6849 data->data(), data->length(),
6850 AsChars(packet), packet_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006851}
6852
6853TEST_P(QuicFramerTest, CryptoFrame) {
renjietang15dfaa82020-01-03 16:13:38 -08006854 if (!QuicVersionUsesCryptoFrames(framer_.transport_version())) {
nharper107ba5f2019-07-02 21:33:39 -07006855 // CRYPTO frames aren't supported prior to v48.
QUICHE teama6ef0a62019-03-07 20:34:33 -05006856 return;
6857 }
zhongyi546cc452019-04-12 15:27:49 -07006858 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006859
6860 // clang-format off
nharper107ba5f2019-07-02 21:33:39 -07006861 PacketFragments packet48 = {
6862 // type (short header, 4 byte packet number)
6863 {"",
6864 {0x43}},
6865 // connection_id
6866 {"",
6867 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
6868 // packet number
6869 {"",
6870 {0x12, 0x34, 0x56, 0x78}},
6871 // frame type (QuicFrameType CRYPTO_FRAME)
6872 {"",
6873 {0x08}},
6874 // offset
6875 {"",
6876 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6877 0x32, 0x10, 0x76, 0x54}},
6878 // data length
6879 {"Invalid data length.",
6880 {kVarInt62OneByte + 12}},
6881 // data
6882 {"Unable to read frame data.",
6883 {'h', 'e', 'l', 'l',
6884 'o', ' ', 'w', 'o',
6885 'r', 'l', 'd', '!'}},
6886 };
6887
6888 PacketFragments packet99 = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006889 // type (short header, 4 byte packet number)
6890 {"",
6891 {0x43}},
6892 // connection_id
6893 {"",
6894 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
6895 // packet number
6896 {"",
6897 {0x12, 0x34, 0x56, 0x78}},
6898 // frame type (IETF_CRYPTO frame)
6899 {"",
6900 {0x06}},
6901 // offset
6902 {"",
6903 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6904 0x32, 0x10, 0x76, 0x54}},
6905 // data length
6906 {"Invalid data length.",
6907 {kVarInt62OneByte + 12}},
6908 // data
6909 {"Unable to read frame data.",
6910 {'h', 'e', 'l', 'l',
6911 'o', ' ', 'w', 'o',
6912 'r', 'l', 'd', '!'}},
6913 };
6914 // clang-format on
6915
nharper107ba5f2019-07-02 21:33:39 -07006916 PacketFragments& fragments =
dschinazi40f0b3d2020-02-19 17:54:05 -08006917 framer_.version().HasIetfQuicFrames() ? packet99 : packet48;
QUICHE teama6ef0a62019-03-07 20:34:33 -05006918 std::unique_ptr<QuicEncryptedPacket> encrypted(
nharper107ba5f2019-07-02 21:33:39 -07006919 AssemblePacketFromFragments(fragments));
QUICHE teama6ef0a62019-03-07 20:34:33 -05006920 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6921
bncf6f82b12019-10-30 07:01:01 -07006922 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05006923 ASSERT_TRUE(visitor_.header_.get());
6924 EXPECT_TRUE(CheckDecryption(
6925 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
6926 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
6927 ASSERT_EQ(1u, visitor_.crypto_frames_.size());
6928 QuicCryptoFrame* frame = visitor_.crypto_frames_[0].get();
renjietang15dfaa82020-01-03 16:13:38 -08006929 EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, frame->level);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006930 EXPECT_EQ(kStreamOffset, frame->offset);
vasilvvc48c8712019-03-11 13:38:16 -07006931 EXPECT_EQ("hello world!",
6932 std::string(frame->data_buffer, frame->data_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05006933
nharper107ba5f2019-07-02 21:33:39 -07006934 CheckFramingBoundaries(fragments, QUIC_INVALID_FRAME_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006935}
6936
6937TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) {
dschinazi1ac22cc2019-06-25 11:47:50 -07006938 SetQuicFlag(FLAGS_quic_disable_version_negotiation_grease_randomness, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006939 // clang-format off
6940 unsigned char packet[] = {
6941 // public flags (version, 8 byte connection_id)
6942 0x0D,
6943 // connection_id
6944 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi1ac22cc2019-06-25 11:47:50 -07006945 // supported versions
6946 0xDA, 0x5A, 0x3A, 0x3A,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006947 QUIC_VERSION_BYTES,
6948 };
fayang36825da2019-08-21 14:01:27 -07006949 unsigned char packet46[] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006950 // type (long header)
dschinazi0366de92019-06-18 20:00:27 -07006951 0xC0,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006952 // version tag
6953 0x00, 0x00, 0x00, 0x00,
6954 // connection_id length
6955 0x05,
6956 // connection_id
6957 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi1ac22cc2019-06-25 11:47:50 -07006958 // supported versions
6959 0xDA, 0x5A, 0x3A, 0x3A,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006960 QUIC_VERSION_BYTES,
6961 };
dschinazic73506e2019-09-20 13:26:46 -07006962 unsigned char packet49[] = {
dschinazi48ac9192019-07-31 00:07:26 -07006963 // type (long header)
6964 0xC0,
6965 // version tag
6966 0x00, 0x00, 0x00, 0x00,
6967 // destination connection ID length
6968 0x00,
6969 // source connection ID length
6970 0x08,
6971 // source connection ID
6972 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6973 // supported versions
6974 0xDA, 0x5A, 0x3A, 0x3A,
6975 QUIC_VERSION_BYTES,
6976 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05006977 // clang-format on
6978 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07006979 size_t p_size = ABSL_ARRAYSIZE(packet);
dschinaziceed8662020-07-14 09:37:05 -07006980 if (framer_.version().HasLongHeaderLengths()) {
dschinazic73506e2019-09-20 13:26:46 -07006981 p = packet49;
vasilvvbed67c62020-10-20 06:38:43 -07006982 p_size = ABSL_ARRAYSIZE(packet49);
dschinaziceed8662020-07-14 09:37:05 -07006983 } else if (framer_.version().HasIetfInvariantHeader()) {
fayang36825da2019-08-21 14:01:27 -07006984 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07006985 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006986 }
6987
6988 QuicConnectionId connection_id = FramerTestConnectionId();
6989 std::unique_ptr<QuicEncryptedPacket> data(
dschinazib417d602019-05-29 13:08:45 -07006990 QuicFramer::BuildVersionNegotiationPacket(
6991 connection_id, EmptyQuicConnectionId(),
dschinaziceed8662020-07-14 09:37:05 -07006992 framer_.version().HasIetfInvariantHeader(),
dschinazi48ac9192019-07-31 00:07:26 -07006993 framer_.version().HasLengthPrefixedConnectionIds(),
QUICHE teama6ef0a62019-03-07 20:34:33 -05006994 SupportedVersions(GetParam())));
dmcardle8f7df532020-01-07 13:28:57 -08006995 quiche::test::CompareCharArraysWithHexError(
6996 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006997}
6998
dschinazib417d602019-05-29 13:08:45 -07006999TEST_P(QuicFramerTest, BuildVersionNegotiationPacketWithClientConnectionId) {
dschinazi48ac9192019-07-31 00:07:26 -07007000 if (!framer_.version().SupportsClientConnectionIds()) {
dschinazib417d602019-05-29 13:08:45 -07007001 return;
7002 }
7003
dschinazi1ac22cc2019-06-25 11:47:50 -07007004 SetQuicFlag(FLAGS_quic_disable_version_negotiation_grease_randomness, true);
dschinazib417d602019-05-29 13:08:45 -07007005
dschinazib417d602019-05-29 13:08:45 -07007006 // clang-format off
7007 unsigned char packet[] = {
7008 // type (long header)
dschinazi0366de92019-06-18 20:00:27 -07007009 0xC0,
dschinazib417d602019-05-29 13:08:45 -07007010 // version tag
7011 0x00, 0x00, 0x00, 0x00,
dschinazib417d602019-05-29 13:08:45 -07007012 // client/destination connection ID
dschinazi48ac9192019-07-31 00:07:26 -07007013 0x08,
dschinazib417d602019-05-29 13:08:45 -07007014 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
7015 // server/source connection ID
dschinazi48ac9192019-07-31 00:07:26 -07007016 0x08,
dschinazib417d602019-05-29 13:08:45 -07007017 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi1ac22cc2019-06-25 11:47:50 -07007018 // supported versions
7019 0xDA, 0x5A, 0x3A, 0x3A,
dschinazib417d602019-05-29 13:08:45 -07007020 QUIC_VERSION_BYTES,
7021 };
7022 // clang-format on
7023
7024 QuicConnectionId server_connection_id = FramerTestConnectionId();
7025 QuicConnectionId client_connection_id = FramerTestConnectionIdPlusOne();
7026 std::unique_ptr<QuicEncryptedPacket> data(
dschinazi48ac9192019-07-31 00:07:26 -07007027 QuicFramer::BuildVersionNegotiationPacket(
7028 server_connection_id, client_connection_id, true, true,
7029 SupportedVersions(GetParam())));
dmcardle8f7df532020-01-07 13:28:57 -08007030 quiche::test::CompareCharArraysWithHexError(
7031 "constructed packet", data->data(), data->length(), AsChars(packet),
vasilvvbed67c62020-10-20 06:38:43 -07007032 ABSL_ARRAYSIZE(packet));
dschinazib417d602019-05-29 13:08:45 -07007033}
7034
QUICHE teama6ef0a62019-03-07 20:34:33 -05007035TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlock) {
QUICHE team2252b702019-05-14 23:55:14 -04007036 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007037 QuicPacketHeader header;
7038 header.destination_connection_id = FramerTestConnectionId();
7039 header.reset_flag = false;
7040 header.version_flag = false;
7041 header.packet_number = kPacketNumber;
7042
7043 // Use kSmallLargestObserved to make this test finished in a short time.
7044 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
7045 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
7046
7047 QuicFrames frames = {QuicFrame(&ack_frame)};
7048
7049 // clang-format off
7050 unsigned char packet[] = {
7051 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007052 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007053 // connection_id
7054 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7055 // packet number
7056 0x12, 0x34, 0x56, 0x78,
7057
7058 // frame type (ack frame)
7059 // (no ack blocks, 2 byte largest observed, 2 byte block length)
7060 0x45,
7061 // largest acked
7062 0x12, 0x34,
7063 // Zero delta time.
7064 0x00, 0x00,
7065 // first ack block length.
7066 0x12, 0x34,
7067 // num timestamps.
7068 0x00,
7069 };
7070
QUICHE teama6ef0a62019-03-07 20:34:33 -05007071 unsigned char packet46[] = {
7072 // type (short header, 4 byte packet number)
7073 0x43,
7074 // connection_id
7075 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7076 // packet number
7077 0x12, 0x34, 0x56, 0x78,
7078
7079 // frame type (ack frame)
7080 // (no ack blocks, 2 byte largest observed, 2 byte block length)
7081 0x45,
7082 // largest acked
7083 0x12, 0x34,
7084 // Zero delta time.
7085 0x00, 0x00,
7086 // first ack block length.
7087 0x12, 0x34,
7088 // num timestamps.
7089 0x00,
7090 };
7091
7092 unsigned char packet99[] = {
7093 // type (short header, 4 byte packet number)
7094 0x43,
7095 // connection_id
7096 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7097 // packet number
7098 0x12, 0x34, 0x56, 0x78,
7099
7100 // frame type (IETF_ACK frame)
7101 0x02,
7102 // largest acked
7103 kVarInt62TwoBytes + 0x12, 0x34,
7104 // Zero delta time.
7105 kVarInt62OneByte + 0x00,
7106 // Number of additional ack blocks.
7107 kVarInt62OneByte + 0x00,
7108 // first ack block length.
7109 kVarInt62TwoBytes + 0x12, 0x33,
7110 };
7111 // clang-format on
7112 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07007113 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07007114 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007115 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -07007116 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -07007117 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007118 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07007119 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007120 }
7121
7122 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7123 ASSERT_TRUE(data != nullptr);
dmcardle8f7df532020-01-07 13:28:57 -08007124 quiche::test::CompareCharArraysWithHexError(
7125 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007126}
7127
7128TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlockMaxLength) {
QUICHE team2252b702019-05-14 23:55:14 -04007129 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007130 QuicPacketHeader header;
7131 header.destination_connection_id = FramerTestConnectionId();
7132 header.reset_flag = false;
7133 header.version_flag = false;
7134 header.packet_number = kPacketNumber;
7135
7136 QuicAckFrame ack_frame = InitAckFrame(kPacketNumber);
7137 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
7138
7139 QuicFrames frames = {QuicFrame(&ack_frame)};
7140
7141 // clang-format off
7142 unsigned char packet[] = {
7143 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007144 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007145 // connection_id
7146 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7147 // packet number
7148 0x12, 0x34, 0x56, 0x78,
7149
7150 // frame type (ack frame)
7151 // (no ack blocks, 4 byte largest observed, 4 byte block length)
7152 0x4A,
7153 // largest acked
7154 0x12, 0x34, 0x56, 0x78,
7155 // Zero delta time.
7156 0x00, 0x00,
7157 // first ack block length.
7158 0x12, 0x34, 0x56, 0x78,
7159 // num timestamps.
7160 0x00,
7161 };
7162
QUICHE teama6ef0a62019-03-07 20:34:33 -05007163 unsigned char packet46[] = {
7164 // type (short header, 4 byte packet number)
7165 0x43,
7166 // connection_id
7167 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7168 // packet number
7169 0x12, 0x34, 0x56, 0x78,
7170
7171 // frame type (ack frame)
7172 // (no ack blocks, 4 byte largest observed, 4 byte block length)
7173 0x4A,
7174 // largest acked
7175 0x12, 0x34, 0x56, 0x78,
7176 // Zero delta time.
7177 0x00, 0x00,
7178 // first ack block length.
7179 0x12, 0x34, 0x56, 0x78,
7180 // num timestamps.
7181 0x00,
7182 };
7183
7184
7185 unsigned char packet99[] = {
7186 // type (short header, 4 byte packet number)
7187 0x43,
7188 // connection_id
7189 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7190 // packet number
7191 0x12, 0x34, 0x56, 0x78,
7192
7193 // frame type (IETF_ACK frame)
7194 0x02,
7195 // largest acked
7196 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
7197 // Zero delta time.
7198 kVarInt62OneByte + 0x00,
7199 // Nr. of additional ack blocks
7200 kVarInt62OneByte + 0x00,
7201 // first ack block length.
7202 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
7203 };
7204 // clang-format on
7205 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07007206 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07007207 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007208 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -07007209 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -07007210 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007211 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07007212 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007213 }
7214
7215 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7216 ASSERT_TRUE(data != nullptr);
dmcardle8f7df532020-01-07 13:28:57 -08007217 quiche::test::CompareCharArraysWithHexError(
7218 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007219}
7220
7221TEST_P(QuicFramerTest, BuildAckFramePacketMultipleAckBlocks) {
QUICHE team2252b702019-05-14 23:55:14 -04007222 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007223 QuicPacketHeader header;
7224 header.destination_connection_id = FramerTestConnectionId();
7225 header.reset_flag = false;
7226 header.version_flag = false;
7227 header.packet_number = kPacketNumber;
7228
7229 // Use kSmallLargestObserved to make this test finished in a short time.
7230 QuicAckFrame ack_frame =
7231 InitAckFrame({{QuicPacketNumber(1), QuicPacketNumber(5)},
7232 {QuicPacketNumber(10), QuicPacketNumber(500)},
7233 {QuicPacketNumber(900), kSmallMissingPacket},
7234 {kSmallMissingPacket + 1, kSmallLargestObserved + 1}});
7235 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
7236
7237 QuicFrames frames = {QuicFrame(&ack_frame)};
7238
7239 // clang-format off
7240 unsigned char packet[] = {
7241 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007242 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007243 // connection_id
7244 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7245 // packet number
7246 0x12, 0x34, 0x56, 0x78,
7247
7248 // frame type (ack frame)
7249 // (has ack blocks, 2 byte largest observed, 2 byte block length)
7250 0x65,
7251 // largest acked
7252 0x12, 0x34,
7253 // Zero delta time.
7254 0x00, 0x00,
7255 // num ack blocks ranges.
7256 0x04,
7257 // first ack block length.
7258 0x00, 0x01,
7259 // gap to next block.
7260 0x01,
7261 // ack block length.
7262 0x0e, 0xaf,
7263 // gap to next block.
7264 0xff,
7265 // ack block length.
7266 0x00, 0x00,
7267 // gap to next block.
7268 0x91,
7269 // ack block length.
7270 0x01, 0xea,
7271 // gap to next block.
7272 0x05,
7273 // ack block length.
7274 0x00, 0x04,
7275 // num timestamps.
7276 0x00,
7277 };
7278
QUICHE teama6ef0a62019-03-07 20:34:33 -05007279 unsigned char packet46[] = {
7280 // type (short header, 4 byte packet number)
7281 0x43,
7282 // connection_id
7283 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7284 // packet number
7285 0x12, 0x34, 0x56, 0x78,
7286
7287 // frame type (ack frame)
7288 // (has ack blocks, 2 byte largest observed, 2 byte block length)
7289 0x65,
7290 // largest acked
7291 0x12, 0x34,
7292 // Zero delta time.
7293 0x00, 0x00,
7294 // num ack blocks ranges.
7295 0x04,
7296 // first ack block length.
7297 0x00, 0x01,
7298 // gap to next block.
7299 0x01,
7300 // ack block length.
7301 0x0e, 0xaf,
7302 // gap to next block.
7303 0xff,
7304 // ack block length.
7305 0x00, 0x00,
7306 // gap to next block.
7307 0x91,
7308 // ack block length.
7309 0x01, 0xea,
7310 // gap to next block.
7311 0x05,
7312 // ack block length.
7313 0x00, 0x04,
7314 // num timestamps.
7315 0x00,
7316 };
7317
7318 unsigned char packet99[] = {
7319 // type (short header, 4 byte packet number)
7320 0x43,
7321 // connection_id
7322 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7323 // packet number
7324 0x12, 0x34, 0x56, 0x78,
7325
7326 // frame type (IETF_ACK frame)
7327 0x02,
7328 // largest acked
7329 kVarInt62TwoBytes + 0x12, 0x34,
7330 // Zero delta time.
7331 kVarInt62OneByte + 0x00,
7332 // num additional ack blocks.
7333 kVarInt62OneByte + 0x03,
7334 // first ack block length.
7335 kVarInt62OneByte + 0x00,
7336
7337 // gap to next block.
7338 kVarInt62OneByte + 0x00,
7339 // ack block length.
7340 kVarInt62TwoBytes + 0x0e, 0xae,
7341
7342 // gap to next block.
7343 kVarInt62TwoBytes + 0x01, 0x8f,
7344 // ack block length.
7345 kVarInt62TwoBytes + 0x01, 0xe9,
7346
7347 // gap to next block.
7348 kVarInt62OneByte + 0x04,
7349 // ack block length.
7350 kVarInt62OneByte + 0x03,
7351 };
7352 // clang-format on
7353 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07007354 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07007355 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007356 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -07007357 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -07007358 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007359 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07007360 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007361 }
7362
7363 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7364 ASSERT_TRUE(data != nullptr);
7365
dmcardle8f7df532020-01-07 13:28:57 -08007366 quiche::test::CompareCharArraysWithHexError(
7367 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007368}
7369
7370TEST_P(QuicFramerTest, BuildAckFramePacketMaxAckBlocks) {
QUICHE team2252b702019-05-14 23:55:14 -04007371 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007372 QuicPacketHeader header;
7373 header.destination_connection_id = FramerTestConnectionId();
7374 header.reset_flag = false;
7375 header.version_flag = false;
7376 header.packet_number = kPacketNumber;
7377
7378 // Use kSmallLargestObservedto make this test finished in a short time.
7379 QuicAckFrame ack_frame;
7380 ack_frame.largest_acked = kSmallLargestObserved;
7381 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
7382 // 300 ack blocks.
7383 for (size_t i = 2; i < 2 * 300; i += 2) {
7384 ack_frame.packets.Add(QuicPacketNumber(i));
7385 }
7386 ack_frame.packets.AddRange(QuicPacketNumber(600), kSmallLargestObserved + 1);
7387
7388 QuicFrames frames = {QuicFrame(&ack_frame)};
7389
7390 // clang-format off
7391 unsigned char packet[] = {
7392 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007393 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007394 // connection_id
7395 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7396 // packet number
7397 0x12, 0x34, 0x56, 0x78,
7398 // frame type (ack frame)
7399 // (has ack blocks, 2 byte largest observed, 2 byte block length)
7400 0x65,
7401 // largest acked
7402 0x12, 0x34,
7403 // Zero delta time.
7404 0x00, 0x00,
7405 // num ack blocks ranges.
7406 0xff,
7407 // first ack block length.
7408 0x0f, 0xdd,
7409 // 255 = 4 * 63 + 3
7410 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7411 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7412 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7413 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7414 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7415 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7416 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7417 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7418 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7419 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7420
7421 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7422 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7423 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7424 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7425 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7426 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7427 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7428 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7429 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7430 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7431
7432 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7433 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7434 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7435 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7436 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7437 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7438 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7439 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7440 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7441 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7442
7443 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7444 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7445 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7446 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7447 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7448 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7449 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7450 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7451 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7452 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7453
7454 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7455 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7456 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7457 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7458 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7459 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7460 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7461 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7462 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7463 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7464
7465 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7466 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7467 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7468 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7469 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7470 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7471 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7472 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7473 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7474 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7475
7476 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7477 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7478 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7479 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7480 // num timestamps.
7481 0x00,
7482 };
7483
QUICHE teama6ef0a62019-03-07 20:34:33 -05007484 unsigned char packet46[] = {
7485 // type (short header, 4 byte packet number)
7486 0x43,
7487 // connection_id
7488 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7489 // packet number
7490 0x12, 0x34, 0x56, 0x78,
7491 // frame type (ack frame)
7492 // (has ack blocks, 2 byte largest observed, 2 byte block length)
7493 0x65,
7494 // largest acked
7495 0x12, 0x34,
7496 // Zero delta time.
7497 0x00, 0x00,
7498 // num ack blocks ranges.
7499 0xff,
7500 // first ack block length.
7501 0x0f, 0xdd,
7502 // 255 = 4 * 63 + 3
7503 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7504 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7505 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7506 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7507 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7508 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7509 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7510 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7511 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7512 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7513
7514 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7515 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7516 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7517 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7518 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7519 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7520 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7521 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7522 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7523 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7524
7525 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7526 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7527 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7528 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7529 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7530 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7531 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7532 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7533 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7534 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7535
7536 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7537 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7538 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7539 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7540 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7541 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7542 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7543 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7544 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7545 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7546
7547 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7548 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7549 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7550 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7551 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7552 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7553 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7554 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7555 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7556 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7557
7558 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7559 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7560 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7561 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7562 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7563 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7564 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7565 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7566 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7567 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7568
7569 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7570 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7571 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7572 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7573 // num timestamps.
7574 0x00,
7575 };
7576
7577 unsigned char packet99[] = {
7578 // type (short header, 4 byte packet number)
7579 0x43,
7580 // connection_id
7581 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7582 // packet number
7583 0x12, 0x34, 0x56, 0x78,
7584 // frame type (IETF_ACK frame)
7585 0x02,
7586 // largest acked
7587 kVarInt62TwoBytes + 0x12, 0x34,
7588 // Zero delta time.
7589 kVarInt62OneByte + 0x00,
7590 // num ack blocks ranges.
7591 kVarInt62TwoBytes + 0x01, 0x2b,
7592 // first ack block length.
7593 kVarInt62TwoBytes + 0x0f, 0xdc,
7594 // 255 added blocks of gap_size == 1, ack_size == 1
7595#define V99AddedBLOCK kVarInt62OneByte + 0x00, kVarInt62OneByte + 0x00
7596 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7597 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7598 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7599 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7600 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7601 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7602 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7603 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7604 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7605 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7606 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7607 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7608 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7609 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7610 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7611 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7612 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7613 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7614 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7615 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7616
7617 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7618 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7619 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7620 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7621 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7622 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7623 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7624 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7625 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7626 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7627 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7628 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7629 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7630 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7631 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7632 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7633 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7634 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7635 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7636 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7637
7638 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7639 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7640 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7641 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7642 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7643 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7644 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7645 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7646 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7647 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7648 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7649 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7650 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7651 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7652 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7653 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7654 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7655 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7656 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7657 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7658
7659#undef V99AddedBLOCK
7660 };
7661 // clang-format on
7662 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07007663 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07007664 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007665 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -07007666 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -07007667 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007668 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07007669 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007670 }
7671
7672 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7673 ASSERT_TRUE(data != nullptr);
7674
dmcardle8f7df532020-01-07 13:28:57 -08007675 quiche::test::CompareCharArraysWithHexError(
7676 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007677}
7678
7679TEST_P(QuicFramerTest, BuildNewStopWaitingPacket) {
dschinaziceed8662020-07-14 09:37:05 -07007680 if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007681 return;
7682 }
QUICHE team2252b702019-05-14 23:55:14 -04007683 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007684 QuicPacketHeader header;
7685 header.destination_connection_id = FramerTestConnectionId();
7686 header.reset_flag = false;
7687 header.version_flag = false;
7688 header.packet_number = kPacketNumber;
7689
7690 QuicStopWaitingFrame stop_waiting_frame;
7691 stop_waiting_frame.least_unacked = kLeastUnacked;
7692
7693 QuicFrames frames = {QuicFrame(stop_waiting_frame)};
7694
7695 // clang-format off
7696 unsigned char packet[] = {
7697 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007698 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007699 // connection_id
7700 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7701 // packet number
7702 0x12, 0x34, 0x56, 0x78,
7703
7704 // frame type (stop waiting frame)
7705 0x06,
7706 // least packet number awaiting an ack, delta from packet number.
7707 0x00, 0x00, 0x00, 0x08,
7708 };
7709
7710 // clang-format on
7711
7712 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7713 ASSERT_TRUE(data != nullptr);
7714
dmcardle8f7df532020-01-07 13:28:57 -08007715 quiche::test::CompareCharArraysWithHexError(
7716 "constructed packet", data->data(), data->length(), AsChars(packet),
vasilvvbed67c62020-10-20 06:38:43 -07007717 ABSL_ARRAYSIZE(packet));
QUICHE teama6ef0a62019-03-07 20:34:33 -05007718}
7719
7720TEST_P(QuicFramerTest, BuildRstFramePacketQuic) {
QUICHE team2252b702019-05-14 23:55:14 -04007721 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007722 QuicPacketHeader header;
7723 header.destination_connection_id = FramerTestConnectionId();
7724 header.reset_flag = false;
7725 header.version_flag = false;
7726 header.packet_number = kPacketNumber;
7727
7728 QuicRstStreamFrame rst_frame;
7729 rst_frame.stream_id = kStreamId;
fkastenholz305e1732019-06-18 05:01:22 -07007730 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007731 rst_frame.ietf_error_code = 0x01;
7732 } else {
7733 rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708);
7734 }
7735 rst_frame.byte_offset = 0x0807060504030201;
7736
7737 // clang-format off
7738 unsigned char packet[] = {
7739 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007740 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007741 // connection_id
7742 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7743 // packet number
7744 0x12, 0x34, 0x56, 0x78,
7745
7746 // frame type (rst stream frame)
7747 0x01,
7748 // stream id
7749 0x01, 0x02, 0x03, 0x04,
7750 // sent byte offset
7751 0x08, 0x07, 0x06, 0x05,
7752 0x04, 0x03, 0x02, 0x01,
7753 // error code
7754 0x05, 0x06, 0x07, 0x08,
7755 };
7756
QUICHE teama6ef0a62019-03-07 20:34:33 -05007757 unsigned char packet46[] = {
7758 // type (short packet, 4 byte packet number)
7759 0x43,
7760 // connection_id
7761 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7762 // packet number
7763 0x12, 0x34, 0x56, 0x78,
7764
7765 // frame type (rst stream frame)
7766 0x01,
7767 // stream id
7768 0x01, 0x02, 0x03, 0x04,
7769 // sent byte offset
7770 0x08, 0x07, 0x06, 0x05,
7771 0x04, 0x03, 0x02, 0x01,
7772 // error code
7773 0x05, 0x06, 0x07, 0x08,
7774 };
7775
7776 unsigned char packet99[] = {
7777 // type (short packet, 4 byte packet number)
7778 0x43,
7779 // connection_id
7780 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7781 // packet number
7782 0x12, 0x34, 0x56, 0x78,
7783
7784 // frame type (IETF_RST_STREAM frame)
7785 0x04,
7786 // stream id
7787 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
fkastenholz07300e52019-07-16 11:51:37 -07007788 // error code
7789 kVarInt62OneByte + 0x01,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007790 // sent byte offset
7791 kVarInt62EightBytes + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01
7792 };
7793 // clang-format on
7794
7795 QuicFrames frames = {QuicFrame(&rst_frame)};
7796
7797 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7798 ASSERT_TRUE(data != nullptr);
7799
7800 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07007801 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07007802 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007803 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -07007804 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -07007805 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007806 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07007807 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007808 }
7809 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
7810
dmcardle8f7df532020-01-07 13:28:57 -08007811 quiche::test::CompareCharArraysWithHexError(
7812 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007813}
7814
7815TEST_P(QuicFramerTest, BuildCloseFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04007816 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007817 QuicPacketHeader header;
7818 header.destination_connection_id = FramerTestConnectionId();
7819 header.reset_flag = false;
7820 header.version_flag = false;
7821 header.packet_number = kPacketNumber;
7822
mattm55006b02021-01-14 15:09:54 -08007823 QuicConnectionCloseFrame close_frame(framer_.transport_version(),
7824 QUIC_INTERNAL_ERROR, NO_IETF_QUIC_ERROR,
7825 "because I can", 0x05);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007826 QuicFrames frames = {QuicFrame(&close_frame)};
7827
7828 // clang-format off
7829 unsigned char packet[] = {
7830 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007831 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007832 // connection_id
7833 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7834 // packet number
7835 0x12, 0x34, 0x56, 0x78,
7836
7837 // frame type (connection close frame)
7838 0x02,
7839 // error code
bnc77e77b82020-04-05 10:36:49 -07007840 0x00, 0x00, 0x00, 0x01,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007841 // error details length
7842 0x00, 0x0d,
7843 // error details
7844 'b', 'e', 'c', 'a',
7845 'u', 's', 'e', ' ',
7846 'I', ' ', 'c', 'a',
7847 'n',
7848 };
7849
QUICHE teama6ef0a62019-03-07 20:34:33 -05007850 unsigned char packet46[] = {
7851 // type (short header, 4 byte packet number)
7852 0x43,
7853 // connection_id
7854 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7855 // packet number
7856 0x12, 0x34, 0x56, 0x78,
7857
7858 // frame type (connection close frame)
7859 0x02,
7860 // error code
bnc77e77b82020-04-05 10:36:49 -07007861 0x00, 0x00, 0x00, 0x01,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007862 // error details length
7863 0x00, 0x0d,
7864 // error details
7865 'b', 'e', 'c', 'a',
7866 'u', 's', 'e', ' ',
7867 'I', ' ', 'c', 'a',
7868 'n',
7869 };
7870
7871 unsigned char packet99[] = {
7872 // type (short header, 4 byte packet number)
7873 0x43,
7874 // connection_id
7875 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7876 // packet number
7877 0x12, 0x34, 0x56, 0x78,
7878
7879 // frame type (IETF_CONNECTION_CLOSE frame)
7880 0x1c,
7881 // error code
bnc77e77b82020-04-05 10:36:49 -07007882 kVarInt62OneByte + 0x01,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007883 // Frame type within the CONNECTION_CLOSE frame
7884 kVarInt62OneByte + 0x05,
7885 // error details length
bnc77e77b82020-04-05 10:36:49 -07007886 kVarInt62OneByte + 0x0f,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007887 // error details
bnc77e77b82020-04-05 10:36:49 -07007888 '1', ':', 'b', 'e',
7889 'c', 'a', 'u', 's',
7890 'e', ' ', 'I', ' ',
7891 'c', 'a', 'n',
QUICHE teama6ef0a62019-03-07 20:34:33 -05007892 };
7893 // clang-format on
7894
7895 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07007896 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07007897 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007898 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -07007899 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -07007900 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007901 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07007902 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007903 }
7904
7905 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7906 ASSERT_TRUE(data != nullptr);
7907
dmcardle8f7df532020-01-07 13:28:57 -08007908 quiche::test::CompareCharArraysWithHexError(
7909 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007910}
7911
fkastenholzb4dade72019-08-05 06:54:20 -07007912TEST_P(QuicFramerTest, BuildCloseFramePacketExtendedInfo) {
7913 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7914 QuicPacketHeader header;
7915 header.destination_connection_id = FramerTestConnectionId();
7916 header.reset_flag = false;
7917 header.version_flag = false;
7918 header.packet_number = kPacketNumber;
7919
fkastenholz2d55b912019-09-10 15:57:17 -07007920 QuicConnectionCloseFrame close_frame(
7921 framer_.transport_version(),
7922 static_cast<QuicErrorCode>(
bnc745c94e2020-04-06 06:54:57 -07007923 VersionHasIetfQuicFrames(framer_.transport_version()) ? 0x01
fkastenholz2d55b912019-09-10 15:57:17 -07007924 : 0x05060708),
mattm55006b02021-01-14 15:09:54 -08007925 NO_IETF_QUIC_ERROR, "because I can", 0x05);
fkastenholzb4dade72019-08-05 06:54:20 -07007926 // Set this so that it is "there" for both Google QUIC and IETF QUIC
7927 // framing. It better not show up for Google QUIC!
bnc77e77b82020-04-05 10:36:49 -07007928 close_frame.quic_error_code = static_cast<QuicErrorCode>(0x4567);
fkastenholzb4dade72019-08-05 06:54:20 -07007929
fkastenholzb4dade72019-08-05 06:54:20 -07007930 QuicFrames frames = {QuicFrame(&close_frame)};
7931
7932 // clang-format off
7933 unsigned char packet[] = {
7934 // public flags (8 byte connection_id)
7935 0x2C,
7936 // connection_id
7937 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7938 // packet number
7939 0x12, 0x34, 0x56, 0x78,
7940
7941 // frame type (connection close frame)
7942 0x02,
7943 // error code
7944 0x05, 0x06, 0x07, 0x08,
7945 // error details length
7946 0x00, 0x0d,
7947 // error details
7948 'b', 'e', 'c', 'a',
7949 'u', 's', 'e', ' ',
7950 'I', ' ', 'c', 'a',
7951 'n',
7952 };
7953
fkastenholzb4dade72019-08-05 06:54:20 -07007954 unsigned char packet46[] = {
7955 // type (short header, 4 byte packet number)
7956 0x43,
7957 // connection_id
7958 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7959 // packet number
7960 0x12, 0x34, 0x56, 0x78,
7961
7962 // frame type (connection close frame)
7963 0x02,
7964 // error code
7965 0x05, 0x06, 0x07, 0x08,
7966 // error details length
7967 0x00, 0x0d,
7968 // error details
7969 'b', 'e', 'c', 'a',
7970 'u', 's', 'e', ' ',
7971 'I', ' ', 'c', 'a',
7972 'n',
7973 };
7974
7975 unsigned char packet99[] = {
7976 // type (short header, 4 byte packet number)
7977 0x43,
7978 // connection_id
7979 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7980 // packet number
7981 0x12, 0x34, 0x56, 0x78,
7982
7983 // frame type (IETF_CONNECTION_CLOSE frame)
7984 0x1c,
bnc745c94e2020-04-06 06:54:57 -07007985 // IETF error code INTERNAL_ERROR = 0x01 corresponding to
7986 // QuicErrorCode::QUIC_INTERNAL_ERROR = 0x01.
7987 kVarInt62OneByte + 0x01,
fkastenholzb4dade72019-08-05 06:54:20 -07007988 // Frame type within the CONNECTION_CLOSE frame
7989 kVarInt62OneByte + 0x05,
7990 // error details length
7991 kVarInt62OneByte + 0x13,
7992 // error details
7993 '1', '7', '7', '6',
7994 '7', ':', 'b', 'e',
7995 'c', 'a', 'u', 's',
7996 'e', ' ', 'I', ' ',
7997 'c', 'a', 'n'
7998 };
7999 // clang-format on
8000
8001 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07008002 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholzb4dade72019-08-05 06:54:20 -07008003 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8004 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -07008005 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -07008006 } else if (framer_.version().HasIetfInvariantHeader()) {
fkastenholzb4dade72019-08-05 06:54:20 -07008007 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07008008 p_size = ABSL_ARRAYSIZE(packet46);
fkastenholzb4dade72019-08-05 06:54:20 -07008009 }
8010
8011 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8012 ASSERT_TRUE(data != nullptr);
8013
dmcardle8f7df532020-01-07 13:28:57 -08008014 quiche::test::CompareCharArraysWithHexError(
8015 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
fkastenholzb4dade72019-08-05 06:54:20 -07008016}
8017
QUICHE teama6ef0a62019-03-07 20:34:33 -05008018TEST_P(QuicFramerTest, BuildTruncatedCloseFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04008019 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008020 QuicPacketHeader header;
8021 header.destination_connection_id = FramerTestConnectionId();
8022 header.reset_flag = false;
8023 header.version_flag = false;
8024 header.packet_number = kPacketNumber;
8025
bnc77e77b82020-04-05 10:36:49 -07008026 QuicConnectionCloseFrame close_frame(framer_.transport_version(),
mattm55006b02021-01-14 15:09:54 -08008027 QUIC_INTERNAL_ERROR, NO_IETF_QUIC_ERROR,
bnc77e77b82020-04-05 10:36:49 -07008028 std::string(2048, 'A'), 0x05);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008029 QuicFrames frames = {QuicFrame(&close_frame)};
8030
8031 // clang-format off
8032 unsigned char packet[] = {
8033 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04008034 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008035 // connection_id
8036 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8037 // packet number
8038 0x12, 0x34, 0x56, 0x78,
8039
8040 // frame type (connection close frame)
8041 0x02,
8042 // error code
bnc77e77b82020-04-05 10:36:49 -07008043 0x00, 0x00, 0x00, 0x01,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008044 // error details length
8045 0x01, 0x00,
8046 // error details (truncated to 256 bytes)
8047 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8048 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8049 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8050 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8051 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8052 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8053 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8054 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8055 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8056 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8057 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8058 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8059 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8060 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8061 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8062 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8063 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8064 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8065 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8066 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8067 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8068 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8069 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8070 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8071 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8072 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8073 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8074 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8075 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8076 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8077 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8078 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8079 };
8080
QUICHE teama6ef0a62019-03-07 20:34:33 -05008081 unsigned char packet46[] = {
8082 // type (short header, 4 byte packet number)
8083 0x43,
8084 // connection_id
8085 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8086 // packet number
8087 0x12, 0x34, 0x56, 0x78,
8088
8089 // frame type (connection close frame)
8090 0x02,
8091 // error code
bnc77e77b82020-04-05 10:36:49 -07008092 0x00, 0x00, 0x00, 0x01,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008093 // error details length
8094 0x01, 0x00,
8095 // error details (truncated to 256 bytes)
8096 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8097 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8098 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8099 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8100 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8101 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8102 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8103 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8104 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8105 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8106 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8107 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8108 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8109 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8110 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8111 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8112 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8113 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8114 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8115 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8116 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8117 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8118 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8119 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8120 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8121 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8122 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8123 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8124 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8125 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8126 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8127 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8128 };
8129
8130 unsigned char packet99[] = {
8131 // type (short header, 4 byte packet number)
8132 0x43,
8133 // connection_id
8134 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8135 // packet number
8136 0x12, 0x34, 0x56, 0x78,
8137
8138 // frame type (IETF_CONNECTION_CLOSE frame)
8139 0x1c,
8140 // error code
bnc77e77b82020-04-05 10:36:49 -07008141 kVarInt62OneByte + 0x01,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008142 // Frame type within the CONNECTION_CLOSE frame
fkastenholz2d55b912019-09-10 15:57:17 -07008143 kVarInt62OneByte + 0x05,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008144 // error details length
8145 kVarInt62TwoBytes + 0x01, 0x00,
8146 // error details (truncated to 256 bytes)
bnc77e77b82020-04-05 10:36:49 -07008147 '1', ':', 'A', 'A', 'A', 'A', 'A', 'A',
QUICHE teama6ef0a62019-03-07 20:34:33 -05008148 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8149 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8150 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8151 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8152 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8153 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8154 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8155 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8156 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8157 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8158 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8159 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8160 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
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 };
8180 // clang-format on
8181
8182 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07008183 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07008184 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008185 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -07008186 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -07008187 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008188 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07008189 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008190 }
8191
8192 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8193 ASSERT_TRUE(data != nullptr);
8194
dmcardle8f7df532020-01-07 13:28:57 -08008195 quiche::test::CompareCharArraysWithHexError(
8196 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008197}
8198
8199TEST_P(QuicFramerTest, BuildApplicationCloseFramePacket) {
fkastenholz305e1732019-06-18 05:01:22 -07008200 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07008201 // This frame is only for IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05008202 return;
8203 }
QUICHE team2252b702019-05-14 23:55:14 -04008204 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008205 QuicPacketHeader header;
8206 header.destination_connection_id = FramerTestConnectionId();
8207 header.reset_flag = false;
8208 header.version_flag = false;
8209 header.packet_number = kPacketNumber;
8210
fkastenholz72f509b2019-04-10 09:17:49 -07008211 QuicConnectionCloseFrame app_close_frame;
bnc77e77b82020-04-05 10:36:49 -07008212 app_close_frame.wire_error_code = 0x11;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008213 app_close_frame.error_details = "because I can";
fkastenholz72f509b2019-04-10 09:17:49 -07008214 app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008215
8216 QuicFrames frames = {QuicFrame(&app_close_frame)};
8217
8218 // clang-format off
8219
8220 unsigned char packet99[] = {
8221 // type (short header, 4 byte packet number)
8222 0x43,
8223 // connection_id
8224 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8225 // packet number
8226 0x12, 0x34, 0x56, 0x78,
8227
8228 // frame type (IETF_APPLICATION_CLOSE frame)
8229 0x1d,
8230 // error code
fkastenholzd57d3f92019-07-16 09:05:17 -07008231 kVarInt62OneByte + 0x11,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008232 // error details length
fkastenholz2d55b912019-09-10 15:57:17 -07008233 kVarInt62OneByte + 0x0f,
8234 // error details, note that it includes an extended error code.
8235 '0', ':', 'b', 'e',
8236 'c', 'a', 'u', 's',
8237 'e', ' ', 'I', ' ',
8238 'c', 'a', 'n',
QUICHE teama6ef0a62019-03-07 20:34:33 -05008239 };
8240 // clang-format on
8241
8242 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8243 ASSERT_TRUE(data != nullptr);
8244
dmcardle8f7df532020-01-07 13:28:57 -08008245 quiche::test::CompareCharArraysWithHexError(
8246 "constructed packet", data->data(), data->length(), AsChars(packet99),
vasilvvbed67c62020-10-20 06:38:43 -07008247 ABSL_ARRAYSIZE(packet99));
QUICHE teama6ef0a62019-03-07 20:34:33 -05008248}
8249
8250TEST_P(QuicFramerTest, BuildTruncatedApplicationCloseFramePacket) {
fkastenholz305e1732019-06-18 05:01:22 -07008251 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07008252 // This frame is only for IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05008253 return;
8254 }
QUICHE team2252b702019-05-14 23:55:14 -04008255 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008256 QuicPacketHeader header;
8257 header.destination_connection_id = FramerTestConnectionId();
8258 header.reset_flag = false;
8259 header.version_flag = false;
8260 header.packet_number = kPacketNumber;
8261
fkastenholz72f509b2019-04-10 09:17:49 -07008262 QuicConnectionCloseFrame app_close_frame;
bnc77e77b82020-04-05 10:36:49 -07008263 app_close_frame.wire_error_code = 0x11;
vasilvvc48c8712019-03-11 13:38:16 -07008264 app_close_frame.error_details = std::string(2048, 'A');
fkastenholz72f509b2019-04-10 09:17:49 -07008265 app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
fkastenholz2d55b912019-09-10 15:57:17 -07008266 // Setting to missing ensures that if it is missing, the extended
8267 // code is not added to the text message.
bnc77e77b82020-04-05 10:36:49 -07008268 app_close_frame.quic_error_code = QUIC_IETF_GQUIC_ERROR_MISSING;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008269
8270 QuicFrames frames = {QuicFrame(&app_close_frame)};
8271
8272 // clang-format off
8273 unsigned char packet99[] = {
8274 // type (short header, 4 byte packet number)
8275 0x43,
8276 // connection_id
8277 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8278 // packet number
8279 0x12, 0x34, 0x56, 0x78,
8280
8281 // frame type (IETF_APPLICATION_CLOSE frame)
8282 0x1d,
8283 // error code
fkastenholzd57d3f92019-07-16 09:05:17 -07008284 kVarInt62OneByte + 0x11,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008285 // error details length
8286 kVarInt62TwoBytes + 0x01, 0x00,
8287 // error details (truncated to 256 bytes)
8288 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8289 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8290 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8291 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8292 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8293 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8294 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8295 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8296 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8297 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8298 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8299 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8300 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8301 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8302 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8303 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8304 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8305 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8306 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8307 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8308 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8309 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8310 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8311 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8312 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8313 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8314 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8315 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8316 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8317 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8318 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8319 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8320 };
8321 // clang-format on
8322
8323 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8324 ASSERT_TRUE(data != nullptr);
8325
dmcardle8f7df532020-01-07 13:28:57 -08008326 quiche::test::CompareCharArraysWithHexError(
8327 "constructed packet", data->data(), data->length(), AsChars(packet99),
vasilvvbed67c62020-10-20 06:38:43 -07008328 ABSL_ARRAYSIZE(packet99));
QUICHE teama6ef0a62019-03-07 20:34:33 -05008329}
8330
8331TEST_P(QuicFramerTest, BuildGoAwayPacket) {
fkastenholz305e1732019-06-18 05:01:22 -07008332 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07008333 // This frame is only for Google QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05008334 return;
8335 }
QUICHE team2252b702019-05-14 23:55:14 -04008336 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008337 QuicPacketHeader header;
8338 header.destination_connection_id = FramerTestConnectionId();
8339 header.reset_flag = false;
8340 header.version_flag = false;
8341 header.packet_number = kPacketNumber;
8342
8343 QuicGoAwayFrame goaway_frame;
8344 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
8345 goaway_frame.last_good_stream_id = kStreamId;
8346 goaway_frame.reason_phrase = "because I can";
8347
8348 QuicFrames frames = {QuicFrame(&goaway_frame)};
8349
8350 // clang-format off
8351 unsigned char packet[] = {
8352 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04008353 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008354 // connection_id
8355 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8356 // packet number
8357 0x12, 0x34, 0x56, 0x78,
8358
8359 // frame type (go away frame)
8360 0x03,
8361 // error code
8362 0x05, 0x06, 0x07, 0x08,
8363 // stream id
8364 0x01, 0x02, 0x03, 0x04,
8365 // error details length
8366 0x00, 0x0d,
8367 // error details
8368 'b', 'e', 'c', 'a',
8369 'u', 's', 'e', ' ',
8370 'I', ' ', 'c', 'a',
8371 'n',
8372 };
8373
QUICHE teama6ef0a62019-03-07 20:34:33 -05008374 unsigned char packet46[] = {
8375 // type (short header, 4 byte packet number)
8376 0x43,
8377 // connection_id
8378 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8379 // packet number
8380 0x12, 0x34, 0x56, 0x78,
8381
8382 // frame type (go away frame)
8383 0x03,
8384 // error code
8385 0x05, 0x06, 0x07, 0x08,
8386 // stream id
8387 0x01, 0x02, 0x03, 0x04,
8388 // error details length
8389 0x00, 0x0d,
8390 // error details
8391 'b', 'e', 'c', 'a',
8392 'u', 's', 'e', ' ',
8393 'I', ' ', 'c', 'a',
8394 'n',
8395 };
8396
8397 // clang-format on
8398
8399 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07008400 size_t p_size = ABSL_ARRAYSIZE(packet);
dschinaziceed8662020-07-14 09:37:05 -07008401 if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008402 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07008403 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008404 }
8405
8406 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8407 ASSERT_TRUE(data != nullptr);
8408
dmcardle8f7df532020-01-07 13:28:57 -08008409 quiche::test::CompareCharArraysWithHexError(
8410 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008411}
8412
8413TEST_P(QuicFramerTest, BuildTruncatedGoAwayPacket) {
fkastenholz305e1732019-06-18 05:01:22 -07008414 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07008415 // This frame is only for Google QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05008416 return;
8417 }
QUICHE team2252b702019-05-14 23:55:14 -04008418 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008419 QuicPacketHeader header;
8420 header.destination_connection_id = FramerTestConnectionId();
8421 header.reset_flag = false;
8422 header.version_flag = false;
8423 header.packet_number = kPacketNumber;
8424
8425 QuicGoAwayFrame goaway_frame;
8426 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
8427 goaway_frame.last_good_stream_id = kStreamId;
vasilvvc48c8712019-03-11 13:38:16 -07008428 goaway_frame.reason_phrase = std::string(2048, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -05008429
8430 QuicFrames frames = {QuicFrame(&goaway_frame)};
8431
8432 // clang-format off
8433 unsigned char packet[] = {
8434 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04008435 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008436 // connection_id
8437 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8438 // packet number
8439 0x12, 0x34, 0x56, 0x78,
8440
8441 // frame type (go away frame)
8442 0x03,
8443 // error code
8444 0x05, 0x06, 0x07, 0x08,
8445 // stream id
8446 0x01, 0x02, 0x03, 0x04,
8447 // error details length
8448 0x01, 0x00,
8449 // error details (truncated to 256 bytes)
8450 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8451 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8452 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8453 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8454 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8455 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8456 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8457 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8458 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8459 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8460 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8461 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8462 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8463 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8464 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8465 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8466 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8467 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8468 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8469 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8470 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8471 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8472 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8473 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8474 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8475 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8476 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8477 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8478 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8479 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8480 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8481 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8482 };
8483
QUICHE teama6ef0a62019-03-07 20:34:33 -05008484 unsigned char packet46[] = {
8485 // type (short header, 4 byte packet number)
8486 0x43,
8487 // connection_id
8488 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8489 // packet number
8490 0x12, 0x34, 0x56, 0x78,
8491
8492 // frame type (go away frame)
8493 0x03,
8494 // error code
8495 0x05, 0x06, 0x07, 0x08,
8496 // stream id
8497 0x01, 0x02, 0x03, 0x04,
8498 // error details length
8499 0x01, 0x00,
8500 // error details (truncated to 256 bytes)
8501 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8502 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8503 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8504 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8505 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8506 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8507 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8508 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8509 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8510 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8511 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8512 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8513 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8514 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8515 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8516 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8517 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8518 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8519 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8520 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8521 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8522 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8523 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8524 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8525 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8526 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8527 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8528 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8529 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8530 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8531 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8532 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
8533 };
8534 // clang-format on
8535
8536 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07008537 size_t p_size = ABSL_ARRAYSIZE(packet);
dschinaziceed8662020-07-14 09:37:05 -07008538 if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008539 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07008540 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008541 }
8542
8543 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8544 ASSERT_TRUE(data != nullptr);
8545
dmcardle8f7df532020-01-07 13:28:57 -08008546 quiche::test::CompareCharArraysWithHexError(
8547 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008548}
8549
8550TEST_P(QuicFramerTest, BuildWindowUpdatePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04008551 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008552 QuicPacketHeader header;
8553 header.destination_connection_id = FramerTestConnectionId();
8554 header.reset_flag = false;
8555 header.version_flag = false;
8556 header.packet_number = kPacketNumber;
8557
8558 QuicWindowUpdateFrame window_update_frame;
8559 window_update_frame.stream_id = kStreamId;
renjietangd088eab2019-11-21 14:54:41 -08008560 window_update_frame.max_data = 0x1122334455667788;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008561
8562 QuicFrames frames = {QuicFrame(&window_update_frame)};
8563
8564 // clang-format off
8565 unsigned char packet[] = {
8566 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04008567 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008568 // connection_id
8569 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8570 // packet number
8571 0x12, 0x34, 0x56, 0x78,
8572
8573 // frame type (window update frame)
8574 0x04,
8575 // stream id
8576 0x01, 0x02, 0x03, 0x04,
8577 // byte offset
8578 0x11, 0x22, 0x33, 0x44,
8579 0x55, 0x66, 0x77, 0x88,
8580 };
8581
QUICHE teama6ef0a62019-03-07 20:34:33 -05008582 unsigned char packet46[] = {
8583 // type (short header, 4 byte packet number)
8584 0x43,
8585 // connection_id
8586 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8587 // packet number
8588 0x12, 0x34, 0x56, 0x78,
8589
8590 // frame type (window update frame)
8591 0x04,
8592 // stream id
8593 0x01, 0x02, 0x03, 0x04,
8594 // byte offset
8595 0x11, 0x22, 0x33, 0x44,
8596 0x55, 0x66, 0x77, 0x88,
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_MAX_STREAM_DATA frame)
8608 0x11,
8609 // stream id
8610 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
8611 // byte offset
8612 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
8613 0x55, 0x66, 0x77, 0x88,
8614 };
8615 // clang-format on
8616
8617 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8618 ASSERT_TRUE(data != nullptr);
8619
8620 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07008621 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07008622 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008623 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -07008624 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -07008625 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008626 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07008627 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008628 }
8629
dmcardle8f7df532020-01-07 13:28:57 -08008630 quiche::test::CompareCharArraysWithHexError(
8631 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008632}
8633
8634TEST_P(QuicFramerTest, BuildMaxStreamDataPacket) {
fkastenholz305e1732019-06-18 05:01:22 -07008635 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07008636 // This frame is only for IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05008637 return;
8638 }
QUICHE team2252b702019-05-14 23:55:14 -04008639 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008640 QuicPacketHeader header;
8641 header.destination_connection_id = FramerTestConnectionId();
8642 header.reset_flag = false;
8643 header.version_flag = false;
8644 header.packet_number = kPacketNumber;
8645
8646 QuicWindowUpdateFrame window_update_frame;
8647 window_update_frame.stream_id = kStreamId;
renjietangd088eab2019-11-21 14:54:41 -08008648 window_update_frame.max_data = 0x1122334455667788;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008649
8650 QuicFrames frames = {QuicFrame(&window_update_frame)};
8651
8652 // clang-format off
8653 unsigned char packet99[] = {
8654 // type (short header, 4 byte packet number)
8655 0x43,
8656 // connection_id
8657 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8658 // packet number
8659 0x12, 0x34, 0x56, 0x78,
8660
8661 // frame type (IETF_MAX_STREAM_DATA frame)
8662 0x11,
8663 // stream id
8664 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
8665 // byte offset
8666 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
8667 0x55, 0x66, 0x77, 0x88,
8668 };
8669 // clang-format on
8670
8671 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8672 ASSERT_TRUE(data != nullptr);
8673
dmcardle8f7df532020-01-07 13:28:57 -08008674 quiche::test::CompareCharArraysWithHexError(
8675 "constructed packet", data->data(), data->length(), AsChars(packet99),
vasilvvbed67c62020-10-20 06:38:43 -07008676 ABSL_ARRAYSIZE(packet99));
QUICHE teama6ef0a62019-03-07 20:34:33 -05008677}
8678
8679TEST_P(QuicFramerTest, BuildMaxDataPacket) {
fkastenholz305e1732019-06-18 05:01:22 -07008680 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07008681 // This frame is only for IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -05008682 return;
8683 }
QUICHE team2252b702019-05-14 23:55:14 -04008684 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008685 QuicPacketHeader header;
8686 header.destination_connection_id = FramerTestConnectionId();
8687 header.reset_flag = false;
8688 header.version_flag = false;
8689 header.packet_number = kPacketNumber;
8690
8691 QuicWindowUpdateFrame window_update_frame;
8692 window_update_frame.stream_id =
8693 QuicUtils::GetInvalidStreamId(framer_.transport_version());
renjietangd088eab2019-11-21 14:54:41 -08008694 window_update_frame.max_data = 0x1122334455667788;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008695
8696 QuicFrames frames = {QuicFrame(&window_update_frame)};
8697
8698 // clang-format off
8699 unsigned char packet99[] = {
8700 // type (short header, 4 byte packet number)
8701 0x43,
8702 // connection_id
8703 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8704 // packet number
8705 0x12, 0x34, 0x56, 0x78,
8706
8707 // frame type (IETF_MAX_DATA frame)
8708 0x10,
8709 // byte offset
8710 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
8711 0x55, 0x66, 0x77, 0x88,
8712 };
8713 // clang-format on
8714
8715 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8716 ASSERT_TRUE(data != nullptr);
8717
dmcardle8f7df532020-01-07 13:28:57 -08008718 quiche::test::CompareCharArraysWithHexError(
8719 "constructed packet", data->data(), data->length(), AsChars(packet99),
vasilvvbed67c62020-10-20 06:38:43 -07008720 ABSL_ARRAYSIZE(packet99));
QUICHE teama6ef0a62019-03-07 20:34:33 -05008721}
8722
8723TEST_P(QuicFramerTest, BuildBlockedPacket) {
QUICHE team2252b702019-05-14 23:55:14 -04008724 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008725 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 QuicBlockedFrame blocked_frame;
fkastenholz305e1732019-06-18 05:01:22 -07008732 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8733 // For IETF QUIC, the stream ID must be <invalid> for the frame
QUICHE teama6ef0a62019-03-07 20:34:33 -05008734 // to be a BLOCKED frame. if it's valid, it will be a
8735 // STREAM_BLOCKED frame.
8736 blocked_frame.stream_id =
8737 QuicUtils::GetInvalidStreamId(framer_.transport_version());
8738 } else {
8739 blocked_frame.stream_id = kStreamId;
8740 }
8741 blocked_frame.offset = kStreamOffset;
8742
8743 QuicFrames frames = {QuicFrame(&blocked_frame)};
8744
8745 // clang-format off
8746 unsigned char packet[] = {
8747 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04008748 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008749 // connection_id
8750 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8751 // packet number
8752 0x12, 0x34, 0x56, 0x78,
8753
8754 // frame type (blocked frame)
8755 0x05,
8756 // stream id
8757 0x01, 0x02, 0x03, 0x04,
8758 };
8759
QUICHE teama6ef0a62019-03-07 20:34:33 -05008760 unsigned char packet46[] = {
8761 // type (short packet, 4 byte packet number)
8762 0x43,
8763 // connection_id
8764 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8765 // packet number
8766 0x12, 0x34, 0x56, 0x78,
8767
8768 // frame type (blocked frame)
8769 0x05,
8770 // stream id
8771 0x01, 0x02, 0x03, 0x04,
8772 };
8773
8774 unsigned char packet99[] = {
8775 // type (short packet, 4 byte packet number)
8776 0x43,
8777 // connection_id
8778 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8779 // packet number
8780 0x12, 0x34, 0x56, 0x78,
8781
ianswett2f077442019-12-12 11:51:24 -08008782 // frame type (IETF_DATA_BLOCKED frame)
QUICHE teama6ef0a62019-03-07 20:34:33 -05008783 0x14,
8784 // Offset
8785 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
8786 };
8787 // clang-format on
8788
8789 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8790 ASSERT_TRUE(data != nullptr);
8791
8792 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07008793 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07008794 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008795 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -07008796 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -07008797 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008798 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07008799 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008800 }
8801
dmcardle8f7df532020-01-07 13:28:57 -08008802 quiche::test::CompareCharArraysWithHexError(
8803 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008804}
8805
8806TEST_P(QuicFramerTest, BuildPingPacket) {
QUICHE team2252b702019-05-14 23:55:14 -04008807 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008808 QuicPacketHeader header;
8809 header.destination_connection_id = FramerTestConnectionId();
8810 header.reset_flag = false;
8811 header.version_flag = false;
8812 header.packet_number = kPacketNumber;
8813
8814 QuicFrames frames = {QuicFrame(QuicPingFrame())};
8815
8816 // clang-format off
8817 unsigned char packet[] = {
8818 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04008819 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008820 // connection_id
8821 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8822 // packet number
8823 0x12, 0x34, 0x56, 0x78,
8824
8825 // frame type (ping frame)
8826 0x07,
8827 };
8828
QUICHE teama6ef0a62019-03-07 20:34:33 -05008829 unsigned char packet46[] = {
8830 // type (short header, 4 byte packet number)
8831 0x43,
8832 // connection_id
8833 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8834 // packet number
8835 0x12, 0x34, 0x56, 0x78,
8836
8837 // frame type
8838 0x07,
8839 };
8840
8841 unsigned char packet99[] = {
8842 // type (short header, 4 byte packet number)
8843 0x43,
8844 // connection_id
8845 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8846 // packet number
8847 0x12, 0x34, 0x56, 0x78,
8848
8849 // frame type (IETF_PING frame)
8850 0x01,
8851 };
8852 // clang-format on
8853
8854 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07008855 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008856 p = packet99;
dschinaziceed8662020-07-14 09:37:05 -07008857 } else if (framer_.version().HasIetfInvariantHeader()) {
fayang374888f2019-05-31 06:47:21 -07008858 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008859 }
8860
8861 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8862 ASSERT_TRUE(data != nullptr);
8863
dmcardle8f7df532020-01-07 13:28:57 -08008864 quiche::test::CompareCharArraysWithHexError(
QUICHE teama6ef0a62019-03-07 20:34:33 -05008865 "constructed packet", data->data(), data->length(), AsChars(p),
vasilvvbed67c62020-10-20 06:38:43 -07008866 framer_.version().HasIetfInvariantHeader() ? ABSL_ARRAYSIZE(packet46)
8867 : ABSL_ARRAYSIZE(packet));
QUICHE teama6ef0a62019-03-07 20:34:33 -05008868}
8869
fayang01062942020-01-22 07:23:23 -08008870TEST_P(QuicFramerTest, BuildHandshakeDonePacket) {
8871 QuicPacketHeader header;
8872 header.destination_connection_id = FramerTestConnectionId();
8873 header.reset_flag = false;
8874 header.version_flag = false;
8875 header.packet_number = kPacketNumber;
8876
8877 QuicFrames frames = {QuicFrame(QuicHandshakeDoneFrame())};
8878
8879 // clang-format off
8880 unsigned char packet[] = {
8881 // type (short header, 4 byte packet number)
8882 0x43,
8883 // connection_id
8884 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8885 // packet number
8886 0x12, 0x34, 0x56, 0x78,
8887
8888 // frame type (Handshake done frame)
8889 0x1e,
8890 };
8891 // clang-format on
8892 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8893 return;
8894 }
8895
8896 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8897 ASSERT_TRUE(data != nullptr);
8898
8899 quiche::test::CompareCharArraysWithHexError(
8900 "constructed packet", data->data(), data->length(), AsChars(packet),
vasilvvbed67c62020-10-20 06:38:43 -07008901 ABSL_ARRAYSIZE(packet));
fayang01062942020-01-22 07:23:23 -08008902}
8903
haoyuewang6a6a0ff2020-06-23 16:32:26 -07008904TEST_P(QuicFramerTest, BuildAckFrequencyPacket) {
8905 QuicPacketHeader header;
8906 header.destination_connection_id = FramerTestConnectionId();
8907 header.reset_flag = false;
8908 header.version_flag = false;
8909 header.packet_number = kPacketNumber;
8910
8911 QuicAckFrequencyFrame ack_frequency_frame;
8912 ack_frequency_frame.sequence_number = 3;
8913 ack_frequency_frame.packet_tolerance = 5;
8914 ack_frequency_frame.max_ack_delay = QuicTime::Delta::FromMicroseconds(0x3fff);
8915 ack_frequency_frame.ignore_order = false;
8916 QuicFrames frames = {QuicFrame(&ack_frequency_frame)};
8917
8918 // clang-format off
8919 unsigned char packet[] = {
8920 // type (short header, 4 byte packet number)
8921 0x43,
8922 // connection_id
8923 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8924 // packet number
8925 0x12, 0x34, 0x56, 0x78,
8926
8927 // frame type (Ack Frequency frame)
8928 0x40, 0xaf,
8929 // sequence number
8930 0x03,
8931 // packet tolerance
8932 0x05,
8933 // max_ack_delay_us
8934 0x7f, 0xff,
8935 // ignore_oder
8936 0x00
8937 };
8938 // clang-format on
8939 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8940 return;
8941 }
8942
8943 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8944 ASSERT_TRUE(data != nullptr);
8945
8946 quiche::test::CompareCharArraysWithHexError(
8947 "constructed packet", data->data(), data->length(), AsChars(packet),
vasilvvbed67c62020-10-20 06:38:43 -07008948 ABSL_ARRAYSIZE(packet));
haoyuewang6a6a0ff2020-06-23 16:32:26 -07008949}
8950
QUICHE teama6ef0a62019-03-07 20:34:33 -05008951TEST_P(QuicFramerTest, BuildMessagePacket) {
dschinazicd86dd12019-11-14 10:11:13 -08008952 if (!VersionSupportsMessageFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008953 return;
8954 }
QUICHE team2252b702019-05-14 23:55:14 -04008955 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008956 QuicPacketHeader header;
8957 header.destination_connection_id = FramerTestConnectionId();
8958 header.reset_flag = false;
8959 header.version_flag = false;
8960 header.packet_number = kPacketNumber;
8961 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
8962
wub553a9662019-03-28 20:13:23 -07008963 QuicMessageFrame frame(1, MakeSpan(&allocator_, "message", &storage));
8964 QuicMessageFrame frame2(2, MakeSpan(&allocator_, "message2", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05008965 QuicFrames frames = {QuicFrame(&frame), QuicFrame(&frame2)};
8966
8967 // clang-format off
QUICHE teama6ef0a62019-03-07 20:34:33 -05008968 unsigned char packet46[] = {
8969 // type (short header, 4 byte packet number)
8970 0x43,
8971 // connection_id
8972 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8973 // packet number
8974 0x12, 0x34, 0x56, 0x78,
8975
8976 // frame type (message frame)
8977 0x21,
8978 // Length
8979 0x07,
8980 // Message Data
8981 'm', 'e', 's', 's', 'a', 'g', 'e',
8982 // frame type (message frame no length)
8983 0x20,
8984 // Message Data
8985 'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8986 };
8987
8988 unsigned char packet99[] = {
8989 // type (short header, 4 byte packet number)
8990 0x43,
8991 // connection_id
8992 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8993 // packet number
8994 0x12, 0x34, 0x56, 0x78,
8995
8996 // frame type (IETF_MESSAGE frame)
dschinazicd86dd12019-11-14 10:11:13 -08008997 0x31,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008998 // Length
8999 0x07,
9000 // Message Data
9001 'm', 'e', 's', 's', 'a', 'g', 'e',
9002 // frame type (message frame no length)
dschinazicd86dd12019-11-14 10:11:13 -08009003 0x30,
QUICHE teama6ef0a62019-03-07 20:34:33 -05009004 // Message Data
9005 'm', 'e', 's', 's', 'a', 'g', 'e', '2'
9006 };
9007 // clang-format on
9008
fayang36825da2019-08-21 14:01:27 -07009009 unsigned char* p = packet46;
fkastenholz305e1732019-06-18 05:01:22 -07009010 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009011 p = packet99;
QUICHE teama6ef0a62019-03-07 20:34:33 -05009012 }
9013
9014 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9015 ASSERT_TRUE(data != nullptr);
9016
dmcardle8f7df532020-01-07 13:28:57 -08009017 quiche::test::CompareCharArraysWithHexError(
9018 "constructed packet", data->data(), data->length(), AsChars(p),
vasilvvbed67c62020-10-20 06:38:43 -07009019 ABSL_ARRAYSIZE(packet46));
QUICHE teama6ef0a62019-03-07 20:34:33 -05009020}
9021
QUICHE teama6ef0a62019-03-07 20:34:33 -05009022// Test that the MTU discovery packet is serialized correctly as a PING packet.
9023TEST_P(QuicFramerTest, BuildMtuDiscoveryPacket) {
QUICHE team2252b702019-05-14 23:55:14 -04009024 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009025 QuicPacketHeader header;
9026 header.destination_connection_id = FramerTestConnectionId();
9027 header.reset_flag = false;
9028 header.version_flag = false;
9029 header.packet_number = kPacketNumber;
9030
9031 QuicFrames frames = {QuicFrame(QuicMtuDiscoveryFrame())};
9032
9033 // clang-format off
9034 unsigned char packet[] = {
9035 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04009036 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05009037 // connection_id
9038 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9039 // packet number
9040 0x12, 0x34, 0x56, 0x78,
9041
9042 // frame type (ping frame)
9043 0x07,
9044 };
9045
QUICHE teama6ef0a62019-03-07 20:34:33 -05009046 unsigned char packet46[] = {
9047 // type (short header, 4 byte packet number)
9048 0x43,
9049 // connection_id
9050 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9051 // packet number
9052 0x12, 0x34, 0x56, 0x78,
9053
9054 // frame type
9055 0x07,
9056 };
9057
9058 unsigned char packet99[] = {
9059 // type (short header, 4 byte packet number)
9060 0x43,
9061 // connection_id
9062 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9063 // packet number
9064 0x12, 0x34, 0x56, 0x78,
9065
9066 // frame type (IETF_PING frame)
9067 0x01,
9068 };
9069 // clang-format on
9070
9071 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9072 ASSERT_TRUE(data != nullptr);
9073
9074 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07009075 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009076 p = packet99;
dschinaziceed8662020-07-14 09:37:05 -07009077 } else if (framer_.version().HasIetfInvariantHeader()) {
fayang374888f2019-05-31 06:47:21 -07009078 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05009079 }
9080
dmcardle8f7df532020-01-07 13:28:57 -08009081 quiche::test::CompareCharArraysWithHexError(
QUICHE teama6ef0a62019-03-07 20:34:33 -05009082 "constructed packet", data->data(), data->length(), AsChars(p),
vasilvvbed67c62020-10-20 06:38:43 -07009083 framer_.version().HasIetfInvariantHeader() ? ABSL_ARRAYSIZE(packet46)
9084 : ABSL_ARRAYSIZE(packet));
QUICHE teama6ef0a62019-03-07 20:34:33 -05009085}
9086
9087TEST_P(QuicFramerTest, BuildPublicResetPacket) {
9088 QuicPublicResetPacket reset_packet;
9089 reset_packet.connection_id = FramerTestConnectionId();
9090 reset_packet.nonce_proof = kNonceProof;
9091
9092 // clang-format off
9093 unsigned char packet[] = {
9094 // public flags (public reset, 8 byte ConnectionId)
9095 0x0E,
9096 // connection_id
9097 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9098 // message tag (kPRST)
9099 'P', 'R', 'S', 'T',
9100 // num_entries (1) + padding
9101 0x01, 0x00, 0x00, 0x00,
9102 // tag kRNON
9103 'R', 'N', 'O', 'N',
9104 // end offset 8
9105 0x08, 0x00, 0x00, 0x00,
9106 // nonce proof
9107 0x89, 0x67, 0x45, 0x23,
9108 0x01, 0xEF, 0xCD, 0xAB,
9109 };
9110 // clang-format on
9111
dschinaziceed8662020-07-14 09:37:05 -07009112 if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009113 return;
9114 }
9115
9116 std::unique_ptr<QuicEncryptedPacket> data(
9117 framer_.BuildPublicResetPacket(reset_packet));
9118 ASSERT_TRUE(data != nullptr);
dmcardle8f7df532020-01-07 13:28:57 -08009119 quiche::test::CompareCharArraysWithHexError(
9120 "constructed packet", data->data(), data->length(), AsChars(packet),
vasilvvbed67c62020-10-20 06:38:43 -07009121 ABSL_ARRAYSIZE(packet));
QUICHE teama6ef0a62019-03-07 20:34:33 -05009122}
9123
9124TEST_P(QuicFramerTest, BuildPublicResetPacketWithClientAddress) {
9125 QuicPublicResetPacket reset_packet;
9126 reset_packet.connection_id = FramerTestConnectionId();
9127 reset_packet.nonce_proof = kNonceProof;
9128 reset_packet.client_address =
9129 QuicSocketAddress(QuicIpAddress::Loopback4(), 0x1234);
9130
9131 // clang-format off
9132 unsigned char packet[] = {
9133 // public flags (public reset, 8 byte ConnectionId)
9134 0x0E,
9135 // connection_id
9136 0xFE, 0xDC, 0xBA, 0x98,
9137 0x76, 0x54, 0x32, 0x10,
9138 // message tag (kPRST)
9139 'P', 'R', 'S', 'T',
9140 // num_entries (2) + padding
9141 0x02, 0x00, 0x00, 0x00,
9142 // tag kRNON
9143 'R', 'N', 'O', 'N',
9144 // end offset 8
9145 0x08, 0x00, 0x00, 0x00,
9146 // tag kCADR
9147 'C', 'A', 'D', 'R',
9148 // end offset 16
9149 0x10, 0x00, 0x00, 0x00,
9150 // nonce proof
9151 0x89, 0x67, 0x45, 0x23,
9152 0x01, 0xEF, 0xCD, 0xAB,
9153 // client address
9154 0x02, 0x00,
9155 0x7F, 0x00, 0x00, 0x01,
9156 0x34, 0x12,
9157 };
9158 // clang-format on
9159
dschinaziceed8662020-07-14 09:37:05 -07009160 if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009161 return;
9162 }
9163
9164 std::unique_ptr<QuicEncryptedPacket> data(
9165 framer_.BuildPublicResetPacket(reset_packet));
9166 ASSERT_TRUE(data != nullptr);
9167
dmcardle8f7df532020-01-07 13:28:57 -08009168 quiche::test::CompareCharArraysWithHexError(
9169 "constructed packet", data->data(), data->length(), AsChars(packet),
vasilvvbed67c62020-10-20 06:38:43 -07009170 ABSL_ARRAYSIZE(packet));
QUICHE teama6ef0a62019-03-07 20:34:33 -05009171}
9172
9173TEST_P(QuicFramerTest, BuildPublicResetPacketWithEndpointId) {
9174 QuicPublicResetPacket reset_packet;
9175 reset_packet.connection_id = FramerTestConnectionId();
9176 reset_packet.nonce_proof = kNonceProof;
9177 reset_packet.endpoint_id = "FakeServerId";
9178
9179 // The tag value map in CryptoHandshakeMessage is a std::map, so the two tags
9180 // in the packet, kRNON and kEPID, have unspecified ordering w.r.t each other.
9181 // clang-format off
9182 unsigned char packet_variant1[] = {
9183 // public flags (public reset, 8 byte ConnectionId)
9184 0x0E,
9185 // connection_id
9186 0xFE, 0xDC, 0xBA, 0x98,
9187 0x76, 0x54, 0x32, 0x10,
9188 // message tag (kPRST)
9189 'P', 'R', 'S', 'T',
9190 // num_entries (2) + padding
9191 0x02, 0x00, 0x00, 0x00,
9192 // tag kRNON
9193 'R', 'N', 'O', 'N',
9194 // end offset 8
9195 0x08, 0x00, 0x00, 0x00,
9196 // tag kEPID
9197 'E', 'P', 'I', 'D',
9198 // end offset 20
9199 0x14, 0x00, 0x00, 0x00,
9200 // nonce proof
9201 0x89, 0x67, 0x45, 0x23,
9202 0x01, 0xEF, 0xCD, 0xAB,
9203 // Endpoint ID
9204 'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
9205 };
9206 unsigned char packet_variant2[] = {
9207 // public flags (public reset, 8 byte ConnectionId)
9208 0x0E,
9209 // connection_id
9210 0xFE, 0xDC, 0xBA, 0x98,
9211 0x76, 0x54, 0x32, 0x10,
9212 // message tag (kPRST)
9213 'P', 'R', 'S', 'T',
9214 // num_entries (2) + padding
9215 0x02, 0x00, 0x00, 0x00,
9216 // tag kEPID
9217 'E', 'P', 'I', 'D',
9218 // end offset 12
9219 0x0C, 0x00, 0x00, 0x00,
9220 // tag kRNON
9221 'R', 'N', 'O', 'N',
9222 // end offset 20
9223 0x14, 0x00, 0x00, 0x00,
9224 // Endpoint ID
9225 'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
9226 // nonce proof
9227 0x89, 0x67, 0x45, 0x23,
9228 0x01, 0xEF, 0xCD, 0xAB,
9229 };
9230 // clang-format on
9231
dschinaziceed8662020-07-14 09:37:05 -07009232 if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009233 return;
9234 }
9235
9236 std::unique_ptr<QuicEncryptedPacket> data(
9237 framer_.BuildPublicResetPacket(reset_packet));
9238 ASSERT_TRUE(data != nullptr);
9239
9240 // Variant 1 ends with char 'd'. Variant 1 ends with char 0xAB.
9241 if ('d' == data->data()[data->length() - 1]) {
dmcardle8f7df532020-01-07 13:28:57 -08009242 quiche::test::CompareCharArraysWithHexError(
QUICHE teama6ef0a62019-03-07 20:34:33 -05009243 "constructed packet", data->data(), data->length(),
vasilvvbed67c62020-10-20 06:38:43 -07009244 AsChars(packet_variant1), ABSL_ARRAYSIZE(packet_variant1));
QUICHE teama6ef0a62019-03-07 20:34:33 -05009245 } else {
dmcardle8f7df532020-01-07 13:28:57 -08009246 quiche::test::CompareCharArraysWithHexError(
QUICHE teama6ef0a62019-03-07 20:34:33 -05009247 "constructed packet", data->data(), data->length(),
vasilvvbed67c62020-10-20 06:38:43 -07009248 AsChars(packet_variant2), ABSL_ARRAYSIZE(packet_variant2));
QUICHE teama6ef0a62019-03-07 20:34:33 -05009249 }
9250}
9251
9252TEST_P(QuicFramerTest, BuildIetfStatelessResetPacket) {
9253 // clang-format off
fayang36825da2019-08-21 14:01:27 -07009254 unsigned char packet[] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009255 // type (short header, 1 byte packet number)
9256 0x70,
9257 // random packet number
9258 0xFE,
9259 // stateless reset token
9260 0xB5, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
9261 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9262 };
9263 // clang-format on
9264
9265 std::unique_ptr<QuicEncryptedPacket> data(
9266 framer_.BuildIetfStatelessResetPacket(FramerTestConnectionId(),
9267 kTestStatelessResetToken));
9268 ASSERT_TRUE(data != nullptr);
9269 // Skip packet number byte which is random in stateless reset packet.
dmcardle8f7df532020-01-07 13:28:57 -08009270 quiche::test::CompareCharArraysWithHexError(
9271 "constructed packet", data->data(), 1, AsChars(packet), 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009272 const size_t random_bytes_length =
9273 data->length() - kPacketHeaderTypeSize - sizeof(kTestStatelessResetToken);
9274 EXPECT_EQ(kMinRandomBytesLengthInStatelessReset, random_bytes_length);
9275 // Verify stateless reset token is correct.
dmcardle8f7df532020-01-07 13:28:57 -08009276 quiche::test::CompareCharArraysWithHexError(
QUICHE teama6ef0a62019-03-07 20:34:33 -05009277 "constructed packet",
9278 data->data() + data->length() - sizeof(kTestStatelessResetToken),
9279 sizeof(kTestStatelessResetToken),
vasilvvbed67c62020-10-20 06:38:43 -07009280 AsChars(packet) + ABSL_ARRAYSIZE(packet) -
QUICHE teama6ef0a62019-03-07 20:34:33 -05009281 sizeof(kTestStatelessResetToken),
9282 sizeof(kTestStatelessResetToken));
9283}
9284
9285TEST_P(QuicFramerTest, EncryptPacket) {
9286 QuicPacketNumber packet_number = kPacketNumber;
9287 // clang-format off
9288 unsigned char packet[] = {
9289 // public flags (8 byte connection_id)
9290 0x28,
9291 // connection_id
9292 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9293 // packet number
9294 0x12, 0x34, 0x56, 0x78,
9295
9296 // redundancy
9297 'a', 'b', 'c', 'd',
9298 'e', 'f', 'g', 'h',
9299 'i', 'j', 'k', 'l',
9300 'm', 'n', 'o', 'p',
9301 };
9302
QUICHE teama6ef0a62019-03-07 20:34:33 -05009303 unsigned char packet46[] = {
9304 // type (short header, 4 byte packet number)
9305 0x43,
9306 // connection_id
9307 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9308 // packet number
9309 0x12, 0x34, 0x56, 0x78,
9310
9311 // redundancy
9312 'a', 'b', 'c', 'd',
9313 'e', 'f', 'g', 'h',
9314 'i', 'j', 'k', 'l',
9315 'm', 'n', 'o', 'p',
9316 };
9317
nharperc32d8ab2019-10-09 11:09:06 -07009318 unsigned char packet50[] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009319 // type (short header, 4 byte packet number)
9320 0x43,
9321 // connection_id
9322 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9323 // packet number
9324 0x12, 0x34, 0x56, 0x78,
9325
9326 // redundancy
9327 'a', 'b', 'c', 'd',
9328 'e', 'f', 'g', 'h',
9329 'i', 'j', 'k', 'l',
9330 'm', 'n', 'o', 'p',
nharper55fa6132019-05-07 19:37:21 -07009331 'q', 'r', 's', 't',
QUICHE teama6ef0a62019-03-07 20:34:33 -05009332 };
9333 // clang-format on
9334
9335 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07009336 size_t p_size = ABSL_ARRAYSIZE(packet);
dschinaziceed8662020-07-14 09:37:05 -07009337 if (framer_.version().HasHeaderProtection()) {
nharperc32d8ab2019-10-09 11:09:06 -07009338 p = packet50;
vasilvvbed67c62020-10-20 06:38:43 -07009339 p_size = ABSL_ARRAYSIZE(packet50);
dschinaziceed8662020-07-14 09:37:05 -07009340 } else if (framer_.version().HasIetfInvariantHeader()) {
fayang374888f2019-05-31 06:47:21 -07009341 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05009342 }
9343
9344 std::unique_ptr<QuicPacket> raw(new QuicPacket(
nharper55fa6132019-05-07 19:37:21 -07009345 AsChars(p), p_size, false, PACKET_8BYTE_CONNECTION_ID,
QUICHE teama6ef0a62019-03-07 20:34:33 -05009346 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
9347 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
9348 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0));
dschinazi66dea072019-04-09 11:41:06 -07009349 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009350 size_t encrypted_length = framer_.EncryptPayload(
dschinazi66dea072019-04-09 11:41:06 -07009351 ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009352
9353 ASSERT_NE(0u, encrypted_length);
9354 EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
9355}
9356
wubdec17c22020-06-04 13:13:50 -07009357// Regression test for b/158014497.
9358TEST_P(QuicFramerTest, EncryptEmptyPacket) {
9359 auto packet = std::make_unique<QuicPacket>(
9360 new char[100], 0, true, PACKET_8BYTE_CONNECTION_ID,
9361 PACKET_0BYTE_CONNECTION_ID,
9362 /*includes_version=*/true,
9363 /*includes_diversification_nonce=*/true, PACKET_1BYTE_PACKET_NUMBER,
9364 VARIABLE_LENGTH_INTEGER_LENGTH_0,
9365 /*retry_token_length=*/0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
9366 char buffer[kMaxOutgoingPacketSize];
9367 size_t encrypted_length = 1;
9368 EXPECT_QUIC_BUG(encrypted_length = framer_.EncryptPayload(
9369 ENCRYPTION_INITIAL, kPacketNumber, *packet, buffer,
9370 kMaxOutgoingPacketSize),
9371 "packet is shorter than associated data length");
9372 EXPECT_EQ(0u, encrypted_length);
9373}
9374
QUICHE teama6ef0a62019-03-07 20:34:33 -05009375TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) {
nharper55fa6132019-05-07 19:37:21 -07009376 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009377 QuicPacketNumber packet_number = kPacketNumber;
9378 // clang-format off
9379 unsigned char packet[] = {
9380 // public flags (version, 8 byte connection_id)
9381 0x29,
9382 // connection_id
9383 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9384 // version tag
9385 'Q', '.', '1', '0',
9386 // packet number
9387 0x12, 0x34, 0x56, 0x78,
9388
9389 // redundancy
9390 'a', 'b', 'c', 'd',
9391 'e', 'f', 'g', 'h',
9392 'i', 'j', 'k', 'l',
9393 'm', 'n', 'o', 'p',
9394 };
9395
QUICHE teama6ef0a62019-03-07 20:34:33 -05009396 unsigned char packet46[] = {
9397 // type (long header with packet type ZERO_RTT_PROTECTED)
9398 0xD3,
9399 // version tag
9400 'Q', '.', '1', '0',
9401 // connection_id length
9402 0x50,
9403 // connection_id
9404 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9405 // packet number
9406 0x12, 0x34, 0x56, 0x78,
9407
9408 // redundancy
9409 'a', 'b', 'c', 'd',
9410 'e', 'f', 'g', 'h',
9411 'i', 'j', 'k', 'l',
9412 'm', 'n', 'o', 'p',
9413 };
9414
nharperc32d8ab2019-10-09 11:09:06 -07009415 unsigned char packet50[] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009416 // type (long header with packet type ZERO_RTT_PROTECTED)
9417 0xD3,
9418 // version tag
9419 'Q', '.', '1', '0',
dschinazi48ac9192019-07-31 00:07:26 -07009420 // destination connection ID length
9421 0x08,
9422 // destination connection ID
QUICHE teama6ef0a62019-03-07 20:34:33 -05009423 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -07009424 // source connection ID length
9425 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -05009426 // packet number
9427 0x12, 0x34, 0x56, 0x78,
9428
9429 // redundancy
9430 'a', 'b', 'c', 'd',
9431 'e', 'f', 'g', 'h',
9432 'i', 'j', 'k', 'l',
9433 'm', 'n', 'o', 'p',
nharper55fa6132019-05-07 19:37:21 -07009434 'q', 'r', 's', 't',
QUICHE teama6ef0a62019-03-07 20:34:33 -05009435 };
9436 // clang-format on
9437
9438 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07009439 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07009440 // TODO(ianswett): see todo in previous test.
dschinaziceed8662020-07-14 09:37:05 -07009441 if (framer_.version().HasHeaderProtection()) {
nharperc32d8ab2019-10-09 11:09:06 -07009442 p = packet50;
vasilvvbed67c62020-10-20 06:38:43 -07009443 p_size = ABSL_ARRAYSIZE(packet50);
dschinaziceed8662020-07-14 09:37:05 -07009444 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009445 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07009446 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009447 }
9448
9449 std::unique_ptr<QuicPacket> raw(new QuicPacket(
nharper55fa6132019-05-07 19:37:21 -07009450 AsChars(p), p_size, false, PACKET_8BYTE_CONNECTION_ID,
9451 PACKET_0BYTE_CONNECTION_ID, kIncludeVersion,
9452 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
9453 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0));
dschinazi66dea072019-04-09 11:41:06 -07009454 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009455 size_t encrypted_length = framer_.EncryptPayload(
dschinazi66dea072019-04-09 11:41:06 -07009456 ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009457
9458 ASSERT_NE(0u, encrypted_length);
9459 EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
9460}
9461
9462TEST_P(QuicFramerTest, AckTruncationLargePacket) {
fkastenholz305e1732019-06-18 05:01:22 -07009463 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009464 // This test is not applicable to this version; the range count is
9465 // effectively unlimited
9466 return;
9467 }
nharper9bb83462019-05-01 10:53:22 -07009468 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009469
9470 QuicPacketHeader header;
9471 header.destination_connection_id = FramerTestConnectionId();
9472 header.reset_flag = false;
9473 header.version_flag = false;
9474 header.packet_number = kPacketNumber;
9475
9476 QuicAckFrame ack_frame;
9477 // Create a packet with just the ack.
9478 ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
9479 QuicFrames frames = {QuicFrame(&ack_frame)};
9480
9481 // Build an ack packet with truncation due to limit in number of nack ranges.
9482 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9483 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
9484 ASSERT_TRUE(raw_ack_packet != nullptr);
dschinazi66dea072019-04-09 11:41:06 -07009485 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009486 size_t encrypted_length =
QUICHE team6987b4a2019-03-15 16:23:04 -07009487 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
dschinazi66dea072019-04-09 11:41:06 -07009488 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009489 ASSERT_NE(0u, encrypted_length);
9490 // Now make sure we can turn our ack packet back into an ack frame.
9491 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
9492 ASSERT_TRUE(framer_.ProcessPacket(
9493 QuicEncryptedPacket(buffer, encrypted_length, false)));
9494 ASSERT_EQ(1u, visitor_.ack_frames_.size());
9495 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
9496 EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
9497 ASSERT_EQ(256u, processed_ack_frame.packets.NumPacketsSlow());
9498 EXPECT_EQ(QuicPacketNumber(90u), processed_ack_frame.packets.Min());
9499 EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
9500}
9501
fayang91c23d72020-03-09 12:35:05 -07009502// Regression test for b/150386368.
9503TEST_P(QuicFramerTest, IetfAckFrameTruncation) {
9504 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9505 return;
9506 }
9507 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9508
9509 QuicPacketHeader header;
9510 header.destination_connection_id = FramerTestConnectionId();
9511 header.reset_flag = false;
9512 header.version_flag = false;
9513 header.packet_number = kPacketNumber;
9514
9515 QuicAckFrame ack_frame;
9516 // Create a packet with just the ack.
9517 ack_frame = MakeAckFrameWithGaps(/*gap_size=*/0xffffffff,
9518 /*max_num_gaps=*/200,
9519 /*largest_acked=*/kMaxIetfVarInt);
9520 ack_frame.ecn_counters_populated = true;
9521 ack_frame.ect_0_count = 100;
9522 ack_frame.ect_1_count = 10000;
9523 ack_frame.ecn_ce_count = 1000000;
9524 QuicFrames frames = {QuicFrame(&ack_frame)};
9525 // Build an ACK packet.
9526 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9527 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
9528 ASSERT_TRUE(raw_ack_packet != nullptr);
9529 char buffer[kMaxOutgoingPacketSize];
9530 size_t encrypted_length =
9531 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
9532 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
9533 ASSERT_NE(0u, encrypted_length);
9534 // Now make sure we can turn our ack packet back into an ack frame.
9535 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
9536 ASSERT_TRUE(framer_.ProcessPacket(
9537 QuicEncryptedPacket(buffer, encrypted_length, false)));
9538 ASSERT_EQ(1u, visitor_.ack_frames_.size());
9539 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
9540 EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
9541 LargestAcked(processed_ack_frame));
9542 // Verify ACK frame gets truncated.
9543 ASSERT_LT(processed_ack_frame.packets.NumPacketsSlow(),
9544 ack_frame.packets.NumIntervals());
9545 EXPECT_EQ(157u, processed_ack_frame.packets.NumPacketsSlow());
9546 EXPECT_LT(processed_ack_frame.packets.NumIntervals(),
9547 ack_frame.packets.NumIntervals());
9548 EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
9549 processed_ack_frame.packets.Max());
9550}
9551
QUICHE teama6ef0a62019-03-07 20:34:33 -05009552TEST_P(QuicFramerTest, AckTruncationSmallPacket) {
fkastenholz305e1732019-06-18 05:01:22 -07009553 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009554 // This test is not applicable to this version; the range count is
9555 // effectively unlimited
9556 return;
9557 }
nharper9bb83462019-05-01 10:53:22 -07009558 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009559
9560 QuicPacketHeader header;
9561 header.destination_connection_id = FramerTestConnectionId();
9562 header.reset_flag = false;
9563 header.version_flag = false;
9564 header.packet_number = kPacketNumber;
9565
9566 // Create a packet with just the ack.
9567 QuicAckFrame ack_frame;
9568 ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
9569 QuicFrames frames = {QuicFrame(&ack_frame)};
9570
9571 // Build an ack packet with truncation due to limit in number of nack ranges.
9572 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9573 std::unique_ptr<QuicPacket> raw_ack_packet(
9574 BuildDataPacket(header, frames, 500));
9575 ASSERT_TRUE(raw_ack_packet != nullptr);
dschinazi66dea072019-04-09 11:41:06 -07009576 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009577 size_t encrypted_length =
QUICHE team6987b4a2019-03-15 16:23:04 -07009578 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
dschinazi66dea072019-04-09 11:41:06 -07009579 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009580 ASSERT_NE(0u, encrypted_length);
9581 // Now make sure we can turn our ack packet back into an ack frame.
9582 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
9583 ASSERT_TRUE(framer_.ProcessPacket(
9584 QuicEncryptedPacket(buffer, encrypted_length, false)));
9585 ASSERT_EQ(1u, visitor_.ack_frames_.size());
9586 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
9587 EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
9588 ASSERT_EQ(240u, processed_ack_frame.packets.NumPacketsSlow());
9589 EXPECT_EQ(QuicPacketNumber(122u), processed_ack_frame.packets.Min());
9590 EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
9591}
9592
9593TEST_P(QuicFramerTest, CleanTruncation) {
fkastenholz305e1732019-06-18 05:01:22 -07009594 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009595 // This test is not applicable to this version; the range count is
9596 // effectively unlimited
9597 return;
9598 }
nharper9bb83462019-05-01 10:53:22 -07009599 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009600
9601 QuicPacketHeader header;
9602 header.destination_connection_id = FramerTestConnectionId();
9603 header.reset_flag = false;
9604 header.version_flag = false;
9605 header.packet_number = kPacketNumber;
9606
9607 QuicAckFrame ack_frame = InitAckFrame(201);
9608
9609 // Create a packet with just the ack.
9610 QuicFrames frames = {QuicFrame(&ack_frame)};
nharperc32d8ab2019-10-09 11:09:06 -07009611 if (framer_.version().HasHeaderProtection()) {
9612 frames.push_back(QuicFrame(QuicPaddingFrame(12)));
9613 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05009614 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9615 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
9616 ASSERT_TRUE(raw_ack_packet != nullptr);
9617
dschinazi66dea072019-04-09 11:41:06 -07009618 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009619 size_t encrypted_length =
QUICHE team6987b4a2019-03-15 16:23:04 -07009620 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
dschinazi66dea072019-04-09 11:41:06 -07009621 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009622 ASSERT_NE(0u, encrypted_length);
9623
9624 // Now make sure we can turn our ack packet back into an ack frame.
9625 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
9626 ASSERT_TRUE(framer_.ProcessPacket(
9627 QuicEncryptedPacket(buffer, encrypted_length, false)));
9628
9629 // Test for clean truncation of the ack by comparing the length of the
9630 // original packets to the re-serialized packets.
9631 frames.clear();
9632 frames.push_back(QuicFrame(visitor_.ack_frames_[0].get()));
nharperc32d8ab2019-10-09 11:09:06 -07009633 if (framer_.version().HasHeaderProtection()) {
9634 frames.push_back(QuicFrame(*visitor_.padding_frames_[0].get()));
9635 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05009636
9637 size_t original_raw_length = raw_ack_packet->length();
9638 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9639 raw_ack_packet = BuildDataPacket(header, frames);
9640 ASSERT_TRUE(raw_ack_packet != nullptr);
9641 EXPECT_EQ(original_raw_length, raw_ack_packet->length());
9642 ASSERT_TRUE(raw_ack_packet != nullptr);
9643}
9644
9645TEST_P(QuicFramerTest, StopPacketProcessing) {
zhongyi546cc452019-04-12 15:27:49 -07009646 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009647 // clang-format off
9648 unsigned char packet[] = {
9649 // public flags (8 byte connection_id)
9650 0x28,
9651 // connection_id
9652 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9653 // packet number
9654 0x12, 0x34, 0x56, 0x78,
9655
9656 // frame type (stream frame with fin)
9657 0xFF,
9658 // stream id
9659 0x01, 0x02, 0x03, 0x04,
9660 // offset
9661 0x3A, 0x98, 0xFE, 0xDC,
9662 0x32, 0x10, 0x76, 0x54,
9663 // data length
9664 0x00, 0x0c,
9665 // data
9666 'h', 'e', 'l', 'l',
9667 'o', ' ', 'w', 'o',
9668 'r', 'l', 'd', '!',
9669
9670 // frame type (ack frame)
9671 0x40,
9672 // least packet number awaiting an ack
9673 0x12, 0x34, 0x56, 0x78,
9674 0x9A, 0xA0,
9675 // largest observed packet number
9676 0x12, 0x34, 0x56, 0x78,
9677 0x9A, 0xBF,
9678 // num missing packets
9679 0x01,
9680 // missing packet
9681 0x12, 0x34, 0x56, 0x78,
9682 0x9A, 0xBE,
9683 };
9684
QUICHE teama6ef0a62019-03-07 20:34:33 -05009685 unsigned char packet46[] = {
9686 // type (short header, 4 byte packet number)
9687 0x43,
9688 // connection_id
9689 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9690 // packet number
9691 0x12, 0x34, 0x56, 0x78,
9692
9693 // frame type (stream frame with fin)
9694 0xFF,
9695 // stream id
9696 0x01, 0x02, 0x03, 0x04,
9697 // offset
9698 0x3A, 0x98, 0xFE, 0xDC,
9699 0x32, 0x10, 0x76, 0x54,
9700 // data length
9701 0x00, 0x0c,
9702 // data
9703 'h', 'e', 'l', 'l',
9704 'o', ' ', 'w', 'o',
9705 'r', 'l', 'd', '!',
9706
9707 // frame type (ack frame)
9708 0x40,
9709 // least packet number awaiting an ack
9710 0x12, 0x34, 0x56, 0x78,
9711 0x9A, 0xA0,
9712 // largest observed packet number
9713 0x12, 0x34, 0x56, 0x78,
9714 0x9A, 0xBF,
9715 // num missing packets
9716 0x01,
9717 // missing packet
9718 0x12, 0x34, 0x56, 0x78,
9719 0x9A, 0xBE,
9720 };
9721
9722 unsigned char packet99[] = {
9723 // type (short header, 4 byte packet number)
9724 0x43,
9725 // connection_id
9726 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9727 // packet number
9728 0x12, 0x34, 0x56, 0x78,
9729
9730 // frame type (IETF_STREAM frame with fin, length, and offset bits set)
9731 0x08 | 0x01 | 0x02 | 0x04,
9732 // stream id
9733 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
9734 // offset
9735 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
9736 0x32, 0x10, 0x76, 0x54,
9737 // data length
9738 kVarInt62TwoBytes + 0x00, 0x0c,
9739 // data
9740 'h', 'e', 'l', 'l',
9741 'o', ' ', 'w', 'o',
9742 'r', 'l', 'd', '!',
9743
9744 // frame type (ack frame)
9745 0x0d,
9746 // largest observed packet number
9747 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
9748 // Delta time
9749 kVarInt62OneByte + 0x00,
9750 // Ack Block count
9751 kVarInt62OneByte + 0x01,
9752 // First block size (one packet)
9753 kVarInt62OneByte + 0x00,
9754
9755 // Next gap size & ack. Missing all preceding packets
9756 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
9757 kVarInt62OneByte + 0x00,
9758 };
9759 // clang-format on
9760
9761 MockFramerVisitor visitor;
9762 framer_.set_visitor(&visitor);
9763 EXPECT_CALL(visitor, OnPacket());
9764 EXPECT_CALL(visitor, OnPacketHeader(_));
9765 EXPECT_CALL(visitor, OnStreamFrame(_)).WillOnce(Return(false));
9766 EXPECT_CALL(visitor, OnPacketComplete());
9767 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true));
9768 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_)).WillOnce(Return(true));
fayang93b4e4d2020-11-25 07:56:47 -08009769 EXPECT_CALL(visitor, OnDecryptedPacket(_, _));
QUICHE teama6ef0a62019-03-07 20:34:33 -05009770
9771 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -07009772 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07009773 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009774 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -07009775 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -07009776 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009777 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -07009778 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009779 }
9780 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
9781 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -07009782 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05009783}
9784
9785static char kTestString[] = "At least 20 characters.";
9786static QuicStreamId kTestQuicStreamId = 1;
dschinazi38cc1ee2020-02-28 14:33:58 -08009787
9788MATCHER_P(ExpectedStreamFrame, version, "") {
9789 return (arg.stream_id == kTestQuicStreamId ||
9790 QuicUtils::IsCryptoStreamId(version.transport_version,
9791 arg.stream_id)) &&
9792 !arg.fin && arg.offset == 0 &&
9793 std::string(arg.data_buffer, arg.data_length) == kTestString;
QUICHE teama6ef0a62019-03-07 20:34:33 -05009794 // FIN is hard-coded false in ConstructEncryptedPacket.
9795 // Offset 0 is hard-coded in ConstructEncryptedPacket.
9796}
9797
9798// Verify that the packet returned by ConstructEncryptedPacket() can be properly
9799// parsed by the framer.
9800TEST_P(QuicFramerTest, ConstructEncryptedPacket) {
9801 // Since we are using ConstructEncryptedPacket, we have to set the framer's
9802 // crypto to be Null.
zhongyi546cc452019-04-12 15:27:49 -07009803 if (framer_.version().KnowsWhichDecrypterToUse()) {
9804 framer_.InstallDecrypter(
9805 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -07009806 std::make_unique<NullDecrypter>(framer_.perspective()));
zhongyi546cc452019-04-12 15:27:49 -07009807 } else {
vasilvv0fc587f2019-09-06 13:33:08 -07009808 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
9809 framer_.perspective()));
zhongyi546cc452019-04-12 15:27:49 -07009810 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05009811 ParsedQuicVersionVector versions;
9812 versions.push_back(framer_.version());
9813 std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket(
9814 TestConnectionId(), EmptyQuicConnectionId(), false, false,
9815 kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
9816 CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, &versions));
9817
9818 MockFramerVisitor visitor;
9819 framer_.set_visitor(&visitor);
9820 EXPECT_CALL(visitor, OnPacket()).Times(1);
9821 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
9822 .Times(1)
9823 .WillOnce(Return(true));
9824 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
9825 .Times(1)
9826 .WillOnce(Return(true));
9827 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1).WillOnce(Return(true));
fayang93b4e4d2020-11-25 07:56:47 -08009828 EXPECT_CALL(visitor, OnDecryptedPacket(_, _)).Times(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009829 EXPECT_CALL(visitor, OnError(_)).Times(0);
9830 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
QUICHE teamea740082019-03-11 17:58:43 -07009831 if (!QuicVersionUsesCryptoFrames(framer_.version().transport_version)) {
dschinazi38cc1ee2020-02-28 14:33:58 -08009832 EXPECT_CALL(visitor, OnStreamFrame(ExpectedStreamFrame(framer_.version())))
9833 .Times(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009834 } else {
9835 EXPECT_CALL(visitor, OnCryptoFrame(_)).Times(1);
9836 }
9837 EXPECT_CALL(visitor, OnPacketComplete()).Times(1);
9838
9839 EXPECT_TRUE(framer_.ProcessPacket(*packet));
bncf6f82b12019-10-30 07:01:01 -07009840 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05009841}
9842
9843// Verify that the packet returned by ConstructMisFramedEncryptedPacket()
9844// does cause the framer to return an error.
9845TEST_P(QuicFramerTest, ConstructMisFramedEncryptedPacket) {
9846 // Since we are using ConstructEncryptedPacket, we have to set the framer's
9847 // crypto to be Null.
zhongyi546cc452019-04-12 15:27:49 -07009848 if (framer_.version().KnowsWhichDecrypterToUse()) {
nharper9bb83462019-05-01 10:53:22 -07009849 framer_.InstallDecrypter(
9850 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -07009851 std::make_unique<NullDecrypter>(framer_.perspective()));
zhongyi546cc452019-04-12 15:27:49 -07009852 } else {
vasilvv0fc587f2019-09-06 13:33:08 -07009853 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
9854 framer_.perspective()));
zhongyi546cc452019-04-12 15:27:49 -07009855 }
QUICHE team6987b4a2019-03-15 16:23:04 -07009856 framer_.SetEncrypter(ENCRYPTION_INITIAL,
vasilvv0fc587f2019-09-06 13:33:08 -07009857 std::make_unique<NullEncrypter>(framer_.perspective()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05009858 std::unique_ptr<QuicEncryptedPacket> packet(ConstructMisFramedEncryptedPacket(
9859 TestConnectionId(), EmptyQuicConnectionId(), false, false,
9860 kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
bnc9711a9e2019-11-01 06:31:51 -07009861 CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, framer_.version(),
QUICHE teama6ef0a62019-03-07 20:34:33 -05009862 Perspective::IS_CLIENT));
9863
9864 MockFramerVisitor visitor;
9865 framer_.set_visitor(&visitor);
9866 EXPECT_CALL(visitor, OnPacket()).Times(1);
9867 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
9868 .Times(1)
9869 .WillOnce(Return(true));
9870 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
9871 .Times(1)
9872 .WillOnce(Return(true));
9873 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1);
fayang93b4e4d2020-11-25 07:56:47 -08009874 EXPECT_CALL(visitor, OnDecryptedPacket(_, _)).Times(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009875 EXPECT_CALL(visitor, OnError(_)).Times(1);
9876 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
9877 EXPECT_CALL(visitor, OnPacketComplete()).Times(0);
9878
9879 EXPECT_FALSE(framer_.ProcessPacket(*packet));
bncf6f82b12019-10-30 07:01:01 -07009880 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
QUICHE teama6ef0a62019-03-07 20:34:33 -05009881}
9882
QUICHE teama6ef0a62019-03-07 20:34:33 -05009883TEST_P(QuicFramerTest, IetfBlockedFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009884 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009885 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009886 return;
9887 }
zhongyi546cc452019-04-12 15:27:49 -07009888 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009889
9890 // clang-format off
9891 PacketFragments packet99 = {
9892 // type (short header, 4 byte packet number)
9893 {"",
9894 {0x43}},
9895 // connection_id
9896 {"",
9897 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9898 // packet number
9899 {"",
9900 {0x12, 0x34, 0x9A, 0xBC}},
ianswett2f077442019-12-12 11:51:24 -08009901 // frame type (IETF_DATA_BLOCKED)
QUICHE teama6ef0a62019-03-07 20:34:33 -05009902 {"",
9903 {0x14}},
9904 // blocked offset
9905 {"Can not read blocked offset.",
9906 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
9907 };
9908 // clang-format on
9909
9910 std::unique_ptr<QuicEncryptedPacket> encrypted(
9911 AssemblePacketFromFragments(packet99));
9912 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9913
bncf6f82b12019-10-30 07:01:01 -07009914 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -05009915 ASSERT_TRUE(visitor_.header_.get());
9916 EXPECT_TRUE(CheckDecryption(
9917 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9918 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9919
9920 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
9921
9922 CheckFramingBoundaries(packet99, QUIC_INVALID_BLOCKED_DATA);
9923}
9924
9925TEST_P(QuicFramerTest, BuildIetfBlockedPacket) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009926 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009927 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009928 return;
9929 }
9930
9931 QuicPacketHeader header;
9932 header.destination_connection_id = FramerTestConnectionId();
9933 header.reset_flag = false;
9934 header.version_flag = false;
9935 header.packet_number = kPacketNumber;
9936
9937 QuicBlockedFrame frame;
9938 frame.stream_id = QuicUtils::GetInvalidStreamId(framer_.transport_version());
9939 frame.offset = kStreamOffset;
9940 QuicFrames frames = {QuicFrame(&frame)};
9941
9942 // clang-format off
9943 unsigned char packet99[] = {
9944 // type (short header, 4 byte packet number)
9945 0x43,
9946 // connection_id
9947 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9948 // packet number
9949 0x12, 0x34, 0x56, 0x78,
9950
ianswett2f077442019-12-12 11:51:24 -08009951 // frame type (IETF_DATA_BLOCKED)
QUICHE teama6ef0a62019-03-07 20:34:33 -05009952 0x14,
9953 // Offset
9954 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
9955 };
9956 // clang-format on
9957
9958 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9959 ASSERT_TRUE(data != nullptr);
9960
dmcardle8f7df532020-01-07 13:28:57 -08009961 quiche::test::CompareCharArraysWithHexError(
9962 "constructed packet", data->data(), data->length(), AsChars(packet99),
vasilvvbed67c62020-10-20 06:38:43 -07009963 ABSL_ARRAYSIZE(packet99));
QUICHE teama6ef0a62019-03-07 20:34:33 -05009964}
9965
9966TEST_P(QuicFramerTest, IetfStreamBlockedFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -07009967 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -07009968 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009969 return;
9970 }
zhongyi546cc452019-04-12 15:27:49 -07009971 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009972
9973 // clang-format off
9974 PacketFragments packet99 = {
9975 // type (short header, 4 byte packet number)
9976 {"",
9977 {0x43}},
9978 // connection_id
9979 {"",
9980 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9981 // packet number
9982 {"",
9983 {0x12, 0x34, 0x9A, 0xBC}},
ianswett2f077442019-12-12 11:51:24 -08009984 // frame type (IETF_STREAM_DATA_BLOCKED)
QUICHE teama6ef0a62019-03-07 20:34:33 -05009985 {"",
9986 {0x15}},
9987 // blocked offset
renjietangd077f8c2020-03-23 17:22:09 -07009988 {"Unable to read IETF_STREAM_DATA_BLOCKED frame stream id/count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05009989 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
9990 {"Can not read stream blocked offset.",
9991 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
9992 };
9993 // clang-format on
9994
9995 std::unique_ptr<QuicEncryptedPacket> encrypted(
9996 AssemblePacketFromFragments(packet99));
9997 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9998
bncf6f82b12019-10-30 07:01:01 -07009999 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010000 ASSERT_TRUE(visitor_.header_.get());
10001 EXPECT_TRUE(CheckDecryption(
10002 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10003 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10004
10005 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
10006 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
10007
10008 CheckFramingBoundaries(packet99, QUIC_INVALID_STREAM_BLOCKED_DATA);
10009}
10010
10011TEST_P(QuicFramerTest, BuildIetfStreamBlockedPacket) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010012 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010013 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010014 return;
10015 }
10016
10017 QuicPacketHeader header;
10018 header.destination_connection_id = FramerTestConnectionId();
10019 header.reset_flag = false;
10020 header.version_flag = false;
10021 header.packet_number = kPacketNumber;
10022
10023 QuicBlockedFrame frame;
10024 frame.stream_id = kStreamId;
10025 frame.offset = kStreamOffset;
10026 QuicFrames frames = {QuicFrame(&frame)};
10027
10028 // clang-format off
10029 unsigned char packet99[] = {
10030 // type (short header, 4 byte packet number)
10031 0x43,
10032 // connection_id
10033 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10034 // packet number
10035 0x12, 0x34, 0x56, 0x78,
10036
ianswett2f077442019-12-12 11:51:24 -080010037 // frame type (IETF_STREAM_DATA_BLOCKED)
QUICHE teama6ef0a62019-03-07 20:34:33 -050010038 0x15,
10039 // Stream ID
10040 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
10041 // Offset
10042 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
10043 };
10044 // clang-format on
10045
10046 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10047 ASSERT_TRUE(data != nullptr);
10048
dmcardle8f7df532020-01-07 13:28:57 -080010049 quiche::test::CompareCharArraysWithHexError(
10050 "constructed packet", data->data(), data->length(), AsChars(packet99),
vasilvvbed67c62020-10-20 06:38:43 -070010051 ABSL_ARRAYSIZE(packet99));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010052}
10053
fkastenholz3c4eabf2019-04-22 07:49:59 -070010054TEST_P(QuicFramerTest, BiDiMaxStreamsFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010055 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010056 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010057 return;
10058 }
zhongyi546cc452019-04-12 15:27:49 -070010059 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010060
10061 // clang-format off
10062 PacketFragments packet99 = {
10063 // type (short header, 4 byte packet number)
10064 {"",
10065 {0x43}},
10066 // connection_id
10067 {"",
10068 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10069 // packet number
10070 {"",
10071 {0x12, 0x34, 0x9A, 0xBC}},
10072 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
10073 {"",
10074 {0x12}},
10075 // max. streams
renjietangd077f8c2020-03-23 17:22:09 -070010076 {"Unable to read IETF_MAX_STREAMS_BIDIRECTIONAL frame stream id/count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010077 {kVarInt62OneByte + 0x03}},
10078 };
10079 // clang-format on
10080
10081 std::unique_ptr<QuicEncryptedPacket> encrypted(
10082 AssemblePacketFromFragments(packet99));
10083 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10084
bncf6f82b12019-10-30 07:01:01 -070010085 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010086 ASSERT_TRUE(visitor_.header_.get());
10087 EXPECT_TRUE(CheckDecryption(
10088 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10089 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10090
fkastenholz3c4eabf2019-04-22 07:49:59 -070010091 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
10092 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
10093 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010094}
10095
fkastenholz3c4eabf2019-04-22 07:49:59 -070010096TEST_P(QuicFramerTest, UniDiMaxStreamsFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010097 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010098 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010099 return;
10100 }
zhongyi546cc452019-04-12 15:27:49 -070010101 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010102
10103 // clang-format off
10104 PacketFragments packet99 = {
10105 // type (short header, 4 byte packet number)
10106 {"",
10107 {0x43}},
10108 // Test runs in client mode, no connection id
10109 // packet number
10110 {"",
10111 {0x12, 0x34, 0x9A, 0xBC}},
fkastenholz3c4eabf2019-04-22 07:49:59 -070010112 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
QUICHE teama6ef0a62019-03-07 20:34:33 -050010113 {"",
fkastenholz3c4eabf2019-04-22 07:49:59 -070010114 {0x13}},
QUICHE teama6ef0a62019-03-07 20:34:33 -050010115 // max. streams
renjietangd077f8c2020-03-23 17:22:09 -070010116 {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010117 {kVarInt62OneByte + 0x03}},
10118 };
10119 // clang-format on
10120
10121 std::unique_ptr<QuicEncryptedPacket> encrypted(
10122 AssemblePacketFromFragments(packet99));
10123 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10124 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10125
bncf6f82b12019-10-30 07:01:01 -070010126 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010127 ASSERT_TRUE(visitor_.header_.get());
10128 EXPECT_TRUE(CheckDecryption(
10129 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10130 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10131
fkastenholz3c4eabf2019-04-22 07:49:59 -070010132 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
10133 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
10134 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010135}
10136
10137TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010138 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010139 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010140 return;
10141 }
zhongyi546cc452019-04-12 15:27:49 -070010142 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010143
10144 // clang-format off
10145 PacketFragments packet99 = {
10146 // type (short header, 4 byte packet number)
10147 {"",
10148 {0x43}},
10149 // connection_id
10150 {"",
10151 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10152 // packet number
10153 {"",
10154 {0x12, 0x34, 0x9A, 0xBC}},
10155 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
10156 {"",
10157 {0x13}},
10158 // max. streams
renjietangd077f8c2020-03-23 17:22:09 -070010159 {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010160 {kVarInt62OneByte + 0x03}},
10161 };
10162 // clang-format on
10163
10164 std::unique_ptr<QuicEncryptedPacket> encrypted(
10165 AssemblePacketFromFragments(packet99));
10166 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10167
bncf6f82b12019-10-30 07:01:01 -070010168 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010169 ASSERT_TRUE(visitor_.header_.get());
10170 EXPECT_TRUE(CheckDecryption(
10171 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10172 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10173
fkastenholz3c4eabf2019-04-22 07:49:59 -070010174 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
10175 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
10176 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010177}
10178
10179TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010180 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010181 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010182 return;
10183 }
zhongyi546cc452019-04-12 15:27:49 -070010184 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010185
10186 // clang-format off
10187 PacketFragments packet99 = {
10188 // type (short header, 4 byte packet number)
10189 {"",
10190 {0x43}},
10191 // Test runs in client mode, no connection id
10192 // packet number
10193 {"",
10194 {0x12, 0x34, 0x9A, 0xBC}},
10195 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
10196 {"",
10197 {0x13}},
10198 // max. streams
renjietangd077f8c2020-03-23 17:22:09 -070010199 {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010200 {kVarInt62OneByte + 0x03}},
10201 };
10202 // clang-format on
10203
10204 std::unique_ptr<QuicEncryptedPacket> encrypted(
10205 AssemblePacketFromFragments(packet99));
10206 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10207 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10208
bncf6f82b12019-10-30 07:01:01 -070010209 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010210 ASSERT_TRUE(visitor_.header_.get());
10211 EXPECT_TRUE(CheckDecryption(
10212 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10213 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10214
fkastenholz3c4eabf2019-04-22 07:49:59 -070010215 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
10216 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
10217 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010218}
10219
10220// The following four tests ensure that the framer can deserialize a stream
10221// count that is large enough to cause the resulting stream ID to exceed the
10222// current implementation limit(32 bits). The intent is that when this happens,
10223// the stream limit is pegged to the maximum supported value. There are four
10224// tests, for the four combinations of uni- and bi-directional, server- and
10225// client- initiated.
fkastenholz3c4eabf2019-04-22 07:49:59 -070010226TEST_P(QuicFramerTest, BiDiMaxStreamsFrameTooBig) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010227 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010228 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010229 return;
10230 }
zhongyi546cc452019-04-12 15:27:49 -070010231 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010232
10233 // clang-format off
10234 unsigned char packet99[] = {
10235 // type (short header, 4 byte packet number)
10236 0x43,
10237 // connection_id
10238 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10239 // packet number
10240 0x12, 0x34, 0x9A, 0xBC,
10241 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
10242 0x12,
10243
10244 // max. streams. Max stream ID allowed is 0xffffffff
10245 // This encodes a count of 0x40000000, leading to stream
10246 // IDs in the range 0x1 00000000 to 0x1 00000003.
10247 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
10248 };
10249 // clang-format on
10250
vasilvvbed67c62020-10-20 06:38:43 -070010251 QuicEncryptedPacket encrypted(AsChars(packet99), ABSL_ARRAYSIZE(packet99),
QUICHE teama6ef0a62019-03-07 20:34:33 -050010252 false);
10253 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
bncf6f82b12019-10-30 07:01:01 -070010254 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010255 ASSERT_TRUE(visitor_.header_.get());
10256 EXPECT_TRUE(CheckDecryption(
10257 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10258 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10259
fkastenholz465220f2019-04-23 07:56:27 -070010260 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -070010261 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010262}
10263
10264TEST_P(QuicFramerTest, ClientBiDiMaxStreamsFrameTooBig) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010265 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010266 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010267 return;
10268 }
zhongyi546cc452019-04-12 15:27:49 -070010269 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010270
10271 // clang-format off
10272 unsigned char packet99[] = {
10273 // type (short header, 4 byte packet number)
10274 0x43,
10275 // Test runs in client mode, no connection id
10276 // packet number
10277 0x12, 0x34, 0x9A, 0xBC,
10278 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
10279 0x12,
10280
10281 // max. streams. Max stream ID allowed is 0xffffffff
10282 // This encodes a count of 0x40000000, leading to stream
10283 // IDs in the range 0x1 00000000 to 0x1 00000003.
10284 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
10285 };
10286 // clang-format on
10287
vasilvvbed67c62020-10-20 06:38:43 -070010288 QuicEncryptedPacket encrypted(AsChars(packet99), ABSL_ARRAYSIZE(packet99),
QUICHE teama6ef0a62019-03-07 20:34:33 -050010289 false);
10290 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10291 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
10292
bncf6f82b12019-10-30 07:01:01 -070010293 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010294 ASSERT_TRUE(visitor_.header_.get());
10295 EXPECT_TRUE(CheckDecryption(
10296 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10297 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10298
fkastenholz465220f2019-04-23 07:56:27 -070010299 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -070010300 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010301}
10302
10303TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrameTooBig) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010304 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010305 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010306 return;
10307 }
zhongyi546cc452019-04-12 15:27:49 -070010308 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010309
10310 // clang-format off
10311 unsigned char packet99[] = {
10312 // type (short header, 4 byte packet number)
10313 0x43,
10314 // connection_id
10315 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10316 // packet number
10317 0x12, 0x34, 0x9A, 0xBC,
10318 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
10319 0x13,
10320
10321 // max. streams. Max stream ID allowed is 0xffffffff
10322 // This encodes a count of 0x40000000, leading to stream
10323 // IDs in the range 0x1 00000000 to 0x1 00000003.
10324 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
10325 };
10326 // clang-format on
10327
vasilvvbed67c62020-10-20 06:38:43 -070010328 QuicEncryptedPacket encrypted(AsChars(packet99), ABSL_ARRAYSIZE(packet99),
QUICHE teama6ef0a62019-03-07 20:34:33 -050010329 false);
10330 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
10331
bncf6f82b12019-10-30 07:01:01 -070010332 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010333 ASSERT_TRUE(visitor_.header_.get());
10334 EXPECT_TRUE(CheckDecryption(
10335 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10336 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10337
fkastenholz465220f2019-04-23 07:56:27 -070010338 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -070010339 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010340}
10341
10342TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrameTooBig) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010343 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010344 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010345 return;
10346 }
zhongyi546cc452019-04-12 15:27:49 -070010347 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010348
10349 // clang-format off
10350 unsigned char packet99[] = {
10351 // type (short header, 4 byte packet number)
10352 0x43,
10353 // Test runs in client mode, no connection id
10354 // packet number
10355 0x12, 0x34, 0x9A, 0xBC,
10356 // frame type (IETF_MAX_STREAMS_UNDIRECTIONAL)
10357 0x13,
10358
10359 // max. streams. Max stream ID allowed is 0xffffffff
10360 // This encodes a count of 0x40000000, leading to stream
10361 // IDs in the range 0x1 00000000 to 0x1 00000003.
10362 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
10363 };
10364 // clang-format on
10365
vasilvvbed67c62020-10-20 06:38:43 -070010366 QuicEncryptedPacket encrypted(AsChars(packet99), ABSL_ARRAYSIZE(packet99),
QUICHE teama6ef0a62019-03-07 20:34:33 -050010367 false);
10368 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10369 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
10370
bncf6f82b12019-10-30 07:01:01 -070010371 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010372 ASSERT_TRUE(visitor_.header_.get());
10373 EXPECT_TRUE(CheckDecryption(
10374 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10375 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10376
fkastenholz465220f2019-04-23 07:56:27 -070010377 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -070010378 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010379}
10380
fkastenholz3c4eabf2019-04-22 07:49:59 -070010381// Specifically test that count==0 is accepted.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010382TEST_P(QuicFramerTest, MaxStreamsFrameZeroCount) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010383 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010384 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010385 return;
10386 }
zhongyi546cc452019-04-12 15:27:49 -070010387 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010388
10389 // clang-format off
10390 unsigned char packet99[] = {
10391 // type (short header, 4 byte packet number)
10392 0x43,
10393 // connection_id
10394 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10395 // packet number
10396 0x12, 0x34, 0x9A, 0xBC,
10397 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
10398 0x12,
10399 // max. streams == 0.
10400 kVarInt62OneByte + 0x00
10401 };
10402 // clang-format on
10403
vasilvvbed67c62020-10-20 06:38:43 -070010404 QuicEncryptedPacket encrypted(AsChars(packet99), ABSL_ARRAYSIZE(packet99),
QUICHE teama6ef0a62019-03-07 20:34:33 -050010405 false);
fkastenholz3c4eabf2019-04-22 07:49:59 -070010406 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010407}
10408
10409TEST_P(QuicFramerTest, ServerBiDiStreamsBlockedFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010410 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010411 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010412 return;
10413 }
zhongyi546cc452019-04-12 15:27:49 -070010414 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010415
10416 // clang-format off
10417 PacketFragments packet99 = {
10418 // type (short header, 4 byte packet number)
10419 {"",
10420 {0x43}},
10421 // connection_id
10422 {"",
10423 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10424 // packet number
10425 {"",
10426 {0x12, 0x34, 0x9A, 0xBC}},
fkastenholz3c4eabf2019-04-22 07:49:59 -070010427 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
10428 {"",
10429 {0x13}},
10430 // stream count
renjietangd077f8c2020-03-23 17:22:09 -070010431 {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
fkastenholz3c4eabf2019-04-22 07:49:59 -070010432 {kVarInt62OneByte + 0x00}},
10433 };
10434 // clang-format on
10435
10436 std::unique_ptr<QuicEncryptedPacket> encrypted(
10437 AssemblePacketFromFragments(packet99));
10438 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10439
bncf6f82b12019-10-30 07:01:01 -070010440 EXPECT_THAT(framer_.error(), IsQuicNoError());
fkastenholz3c4eabf2019-04-22 07:49:59 -070010441 ASSERT_TRUE(visitor_.header_.get());
10442 EXPECT_TRUE(CheckDecryption(
10443 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10444 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10445
10446 EXPECT_EQ(0u, visitor_.max_streams_frame_.stream_count);
10447 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
10448
10449 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
10450}
10451
10452TEST_P(QuicFramerTest, BiDiStreamsBlockedFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010453 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010454 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholz3c4eabf2019-04-22 07:49:59 -070010455 return;
10456 }
10457 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10458
10459 // clang-format off
10460 PacketFragments packet99 = {
10461 // type (short header, 4 byte packet number)
10462 {"",
10463 {0x43}},
10464 // connection_id
10465 {"",
10466 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10467 // packet number
10468 {"",
10469 {0x12, 0x34, 0x9A, 0xBC}},
QUICHE teama6ef0a62019-03-07 20:34:33 -050010470 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
10471 {"",
10472 {0x16}},
10473 // stream id
renjietangd077f8c2020-03-23 17:22:09 -070010474 {"Unable to read IETF_STREAMS_BLOCKED_BIDIRECTIONAL "
10475 "frame stream id/count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010476 {kVarInt62OneByte + 0x03}},
10477 };
10478 // clang-format on
10479
10480 std::unique_ptr<QuicEncryptedPacket> encrypted(
10481 AssemblePacketFromFragments(packet99));
10482 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10483
bncf6f82b12019-10-30 07:01:01 -070010484 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010485 ASSERT_TRUE(visitor_.header_.get());
10486 EXPECT_TRUE(CheckDecryption(
10487 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10488 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10489
fkastenholz3c4eabf2019-04-22 07:49:59 -070010490 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
10491 EXPECT_FALSE(visitor_.streams_blocked_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010492
fkastenholz3c4eabf2019-04-22 07:49:59 -070010493 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010494}
10495
fkastenholz3c4eabf2019-04-22 07:49:59 -070010496TEST_P(QuicFramerTest, UniDiStreamsBlockedFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010497 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010498 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010499 return;
10500 }
zhongyi546cc452019-04-12 15:27:49 -070010501 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010502
10503 // clang-format off
10504 PacketFragments packet99 = {
10505 // type (short header, 4 byte packet number)
10506 {"",
10507 {0x43}},
10508 // connection_id
10509 {"",
10510 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10511 // packet number
10512 {"",
10513 {0x12, 0x34, 0x9A, 0xBC}},
10514 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10515 {"",
10516 {0x17}},
10517 // stream id
renjietangd077f8c2020-03-23 17:22:09 -070010518 {"Unable to read IETF_STREAMS_BLOCKED_UNIDIRECTIONAL "
10519 "frame stream id/count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010520 {kVarInt62OneByte + 0x03}},
10521 };
10522 // clang-format on
10523
10524 std::unique_ptr<QuicEncryptedPacket> encrypted(
10525 AssemblePacketFromFragments(packet99));
10526 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10527
bncf6f82b12019-10-30 07:01:01 -070010528 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010529 ASSERT_TRUE(visitor_.header_.get());
10530 EXPECT_TRUE(CheckDecryption(
10531 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10532 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10533
fkastenholz3c4eabf2019-04-22 07:49:59 -070010534 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
10535 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
10536 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010537}
10538
10539TEST_P(QuicFramerTest, ClientUniDiStreamsBlockedFrame) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010540 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010541 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010542 return;
10543 }
zhongyi546cc452019-04-12 15:27:49 -070010544 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010545
10546 // clang-format off
10547 PacketFragments packet99 = {
10548 // type (short header, 4 byte packet number)
10549 {"",
10550 {0x43}},
10551 // Test runs in client mode, no connection id
10552 // packet number
10553 {"",
10554 {0x12, 0x34, 0x9A, 0xBC}},
10555 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10556 {"",
10557 {0x17}},
10558 // stream id
renjietangd077f8c2020-03-23 17:22:09 -070010559 {"Unable to read IETF_STREAMS_BLOCKED_UNIDIRECTIONAL "
10560 "frame stream id/count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010561 {kVarInt62OneByte + 0x03}},
10562 };
10563 // clang-format on
10564
10565 std::unique_ptr<QuicEncryptedPacket> encrypted(
10566 AssemblePacketFromFragments(packet99));
10567 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10568 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10569
bncf6f82b12019-10-30 07:01:01 -070010570 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010571 ASSERT_TRUE(visitor_.header_.get());
10572 EXPECT_TRUE(CheckDecryption(
10573 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10574 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10575
fkastenholz3c4eabf2019-04-22 07:49:59 -070010576 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
10577 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
10578 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010579}
10580
10581// Check that when we get a STREAMS_BLOCKED frame that specifies too large
10582// a stream count, we reject with an appropriate error. There is no need to
10583// check for different combinations of Uni/Bi directional and client/server
10584// initiated; the logic does not take these into account.
10585TEST_P(QuicFramerTest, StreamsBlockedFrameTooBig) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010586 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010587 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010588 return;
10589 }
zhongyi546cc452019-04-12 15:27:49 -070010590 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010591
10592 // clang-format off
10593 unsigned char packet99[] = {
10594 // type (short header, 4 byte packet number)
10595 0x43,
10596 // Test runs in client mode, no connection id
10597 // packet number
10598 0x12, 0x34, 0x9A, 0xBC,
10599 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL)
fkastenholz3c4eabf2019-04-22 07:49:59 -070010600 0x16,
QUICHE teama6ef0a62019-03-07 20:34:33 -050010601
10602 // max. streams. Max stream ID allowed is 0xffffffff
10603 // This encodes a count of 0x40000000, leading to stream
10604 // IDs in the range 0x1 00000000 to 0x1 00000003.
10605 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01
10606 };
10607 // clang-format on
10608
vasilvvbed67c62020-10-20 06:38:43 -070010609 QuicEncryptedPacket encrypted(AsChars(packet99), ABSL_ARRAYSIZE(packet99),
QUICHE teama6ef0a62019-03-07 20:34:33 -050010610 false);
10611 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10612 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
10613
bncf6f82b12019-10-30 07:01:01 -070010614 EXPECT_THAT(framer_.error(), IsError(QUIC_STREAMS_BLOCKED_DATA));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010615 EXPECT_EQ(framer_.detailed_error(),
10616 "STREAMS_BLOCKED stream count exceeds implementation limit.");
10617}
10618
fkastenholz3c4eabf2019-04-22 07:49:59 -070010619// Specifically test that count==0 is accepted.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010620TEST_P(QuicFramerTest, StreamsBlockedFrameZeroCount) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010621 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010622 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010623 return;
10624 }
fkastenholz3c4eabf2019-04-22 07:49:59 -070010625
zhongyi546cc452019-04-12 15:27:49 -070010626 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010627
10628 // clang-format off
fkastenholz3c4eabf2019-04-22 07:49:59 -070010629 PacketFragments packet99 = {
10630 // type (short header, 4 byte packet number)
10631 {"",
10632 {0x43}},
10633 // connection_id
10634 {"",
10635 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10636 // packet number
10637 {"",
10638 {0x12, 0x34, 0x9A, 0xBC}},
10639 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10640 {"",
10641 {0x17}},
10642 // stream id
renjietangd077f8c2020-03-23 17:22:09 -070010643 {"Unable to read IETF_STREAMS_BLOCKED_UNIDIRECTIONAL "
10644 "frame stream id/count.",
fkastenholz3c4eabf2019-04-22 07:49:59 -070010645 {kVarInt62OneByte + 0x00}},
QUICHE teama6ef0a62019-03-07 20:34:33 -050010646 };
10647 // clang-format on
10648
fkastenholz3c4eabf2019-04-22 07:49:59 -070010649 std::unique_ptr<QuicEncryptedPacket> encrypted(
10650 AssemblePacketFromFragments(packet99));
10651 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010652
bncf6f82b12019-10-30 07:01:01 -070010653 EXPECT_THAT(framer_.error(), IsQuicNoError());
fkastenholz3c4eabf2019-04-22 07:49:59 -070010654 ASSERT_TRUE(visitor_.header_.get());
10655 EXPECT_TRUE(CheckDecryption(
10656 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10657 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10658
10659 EXPECT_EQ(0u, visitor_.streams_blocked_frame_.stream_count);
10660 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
10661
10662 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010663}
10664
fkastenholz3c4eabf2019-04-22 07:49:59 -070010665TEST_P(QuicFramerTest, BuildBiDiStreamsBlockedPacket) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010666 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010667 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010668 return;
10669 }
10670
10671 QuicPacketHeader header;
10672 header.destination_connection_id = FramerTestConnectionId();
10673 header.reset_flag = false;
10674 header.version_flag = false;
10675 header.packet_number = kPacketNumber;
10676
fkastenholz3c4eabf2019-04-22 07:49:59 -070010677 QuicStreamsBlockedFrame frame;
10678 frame.stream_count = 3;
10679 frame.unidirectional = false;
QUICHE teama6ef0a62019-03-07 20:34:33 -050010680
10681 QuicFrames frames = {QuicFrame(frame)};
10682
10683 // clang-format off
10684 unsigned char packet99[] = {
10685 // type (short header, 4 byte packet number)
10686 0x43,
10687 // connection_id
10688 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10689 // packet number
10690 0x12, 0x34, 0x56, 0x78,
10691
10692 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
10693 0x16,
10694 // Stream count
10695 kVarInt62OneByte + 0x03
10696 };
10697 // clang-format on
10698
10699 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10700 ASSERT_TRUE(data != nullptr);
10701
dmcardle8f7df532020-01-07 13:28:57 -080010702 quiche::test::CompareCharArraysWithHexError(
10703 "constructed packet", data->data(), data->length(), AsChars(packet99),
vasilvvbed67c62020-10-20 06:38:43 -070010704 ABSL_ARRAYSIZE(packet99));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010705}
10706
fkastenholz3c4eabf2019-04-22 07:49:59 -070010707TEST_P(QuicFramerTest, BuildUniStreamsBlockedPacket) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010708 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010709 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010710 return;
10711 }
10712
10713 QuicPacketHeader header;
10714 header.destination_connection_id = FramerTestConnectionId();
10715 header.reset_flag = false;
10716 header.version_flag = false;
10717 header.packet_number = kPacketNumber;
10718
fkastenholz3c4eabf2019-04-22 07:49:59 -070010719 QuicStreamsBlockedFrame frame;
10720 frame.stream_count = 3;
10721 frame.unidirectional = true;
10722
QUICHE teama6ef0a62019-03-07 20:34:33 -050010723 QuicFrames frames = {QuicFrame(frame)};
10724
10725 // clang-format off
10726 unsigned char packet99[] = {
10727 // type (short header, 4 byte packet number)
10728 0x43,
10729 // connection_id
10730 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10731 // packet number
10732 0x12, 0x34, 0x56, 0x78,
10733
10734 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10735 0x17,
10736 // Stream count
10737 kVarInt62OneByte + 0x03
10738 };
10739 // clang-format on
10740
10741 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10742 ASSERT_TRUE(data != nullptr);
10743
dmcardle8f7df532020-01-07 13:28:57 -080010744 quiche::test::CompareCharArraysWithHexError(
10745 "constructed packet", data->data(), data->length(), AsChars(packet99),
vasilvvbed67c62020-10-20 06:38:43 -070010746 ABSL_ARRAYSIZE(packet99));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010747}
10748
fkastenholz3c4eabf2019-04-22 07:49:59 -070010749TEST_P(QuicFramerTest, BuildBiDiMaxStreamsPacket) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010750 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010751 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010752 return;
10753 }
10754
10755 QuicPacketHeader header;
10756 header.destination_connection_id = FramerTestConnectionId();
10757 header.reset_flag = false;
10758 header.version_flag = false;
10759 header.packet_number = kPacketNumber;
10760
fkastenholz3c4eabf2019-04-22 07:49:59 -070010761 QuicMaxStreamsFrame frame;
10762 frame.stream_count = 3;
10763 frame.unidirectional = false;
10764
QUICHE teama6ef0a62019-03-07 20:34:33 -050010765 QuicFrames frames = {QuicFrame(frame)};
10766
10767 // clang-format off
10768 unsigned char packet99[] = {
10769 // type (short header, 4 byte packet number)
10770 0x43,
10771 // connection_id
10772 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10773 // packet number
10774 0x12, 0x34, 0x56, 0x78,
10775
10776 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL frame)
10777 0x12,
10778 // Stream count
10779 kVarInt62OneByte + 0x03
10780 };
10781 // clang-format on
10782
10783 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10784 ASSERT_TRUE(data != nullptr);
10785
dmcardle8f7df532020-01-07 13:28:57 -080010786 quiche::test::CompareCharArraysWithHexError(
10787 "constructed packet", data->data(), data->length(), AsChars(packet99),
vasilvvbed67c62020-10-20 06:38:43 -070010788 ABSL_ARRAYSIZE(packet99));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010789}
10790
fkastenholz3c4eabf2019-04-22 07:49:59 -070010791TEST_P(QuicFramerTest, BuildUniDiMaxStreamsPacket) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010792 // This frame is only for IETF QUIC.
fkastenholz305e1732019-06-18 05:01:22 -070010793 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010794 return;
10795 }
10796
10797 // This test runs in client mode.
10798 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10799
10800 QuicPacketHeader header;
10801 header.destination_connection_id = FramerTestConnectionId();
10802 header.reset_flag = false;
10803 header.version_flag = false;
10804 header.packet_number = kPacketNumber;
10805
fkastenholz3c4eabf2019-04-22 07:49:59 -070010806 QuicMaxStreamsFrame frame;
10807 frame.stream_count = 3;
10808 frame.unidirectional = true;
QUICHE teama6ef0a62019-03-07 20:34:33 -050010809
QUICHE teama6ef0a62019-03-07 20:34:33 -050010810 QuicFrames frames = {QuicFrame(frame)};
10811
10812 // clang-format off
10813 unsigned char packet99[] = {
10814 // type (short header, 4 byte packet number)
10815 0x43,
10816 // connection_id
10817 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10818 // packet number
10819 0x12, 0x34, 0x56, 0x78,
10820
10821 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
10822 0x13,
10823 // Stream count
10824 kVarInt62OneByte + 0x03
10825 };
10826 // clang-format on
10827
10828 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10829 ASSERT_TRUE(data != nullptr);
10830
dmcardle8f7df532020-01-07 13:28:57 -080010831 quiche::test::CompareCharArraysWithHexError(
10832 "constructed packet", data->data(), data->length(), AsChars(packet99),
vasilvvbed67c62020-10-20 06:38:43 -070010833 ABSL_ARRAYSIZE(packet99));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010834}
10835
10836TEST_P(QuicFramerTest, NewConnectionIdFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070010837 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010838 // This frame is only for IETF QUIC.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010839 return;
10840 }
zhongyi546cc452019-04-12 15:27:49 -070010841 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010842 // clang-format off
10843 PacketFragments packet99 = {
10844 // type (short header, 4 byte packet number)
10845 {"",
10846 {0x43}},
10847 // connection_id
10848 {"",
10849 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10850 // packet number
10851 {"",
10852 {0x12, 0x34, 0x56, 0x78}},
10853 // frame type (IETF_NEW_CONNECTION_ID frame)
10854 {"",
10855 {0x18}},
10856 // error code
10857 {"Unable to read new connection ID frame sequence number.",
10858 {kVarInt62OneByte + 0x11}},
fkastenholz1c19fc22019-07-12 11:06:19 -070010859 {"Unable to read new connection ID frame retire_prior_to.",
10860 {kVarInt62OneByte + 0x09}},
dschinazicf5b1e22019-07-17 18:35:17 -070010861 {"Unable to read new connection ID frame connection id.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010862 {0x08}}, // connection ID length
10863 {"Unable to read new connection ID frame connection id.",
10864 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11}},
10865 {"Can not read new connection ID frame reset token.",
10866 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10867 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10868 };
10869 // clang-format on
10870
10871 std::unique_ptr<QuicEncryptedPacket> encrypted(
10872 AssemblePacketFromFragments(packet99));
10873 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10874
bncf6f82b12019-10-30 07:01:01 -070010875 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010876 ASSERT_TRUE(visitor_.header_.get());
10877 EXPECT_TRUE(CheckDecryption(
10878 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10879 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10880
10881 EXPECT_EQ(0u, visitor_.stream_frames_.size());
10882
10883 EXPECT_EQ(FramerTestConnectionIdPlusOne(),
10884 visitor_.new_connection_id_.connection_id);
10885 EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
fkastenholz1c19fc22019-07-12 11:06:19 -070010886 EXPECT_EQ(0x09u, visitor_.new_connection_id_.retire_prior_to);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010887 EXPECT_EQ(kTestStatelessResetToken,
10888 visitor_.new_connection_id_.stateless_reset_token);
10889
10890 ASSERT_EQ(0u, visitor_.ack_frames_.size());
10891
10892 CheckFramingBoundaries(packet99, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
10893}
10894
QUICHE team8e2e4532019-03-14 14:37:56 -070010895TEST_P(QuicFramerTest, NewConnectionIdFrameVariableLength) {
fkastenholz305e1732019-06-18 05:01:22 -070010896 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010897 // This frame is only for IETF QUIC.
QUICHE team8e2e4532019-03-14 14:37:56 -070010898 return;
10899 }
zhongyi546cc452019-04-12 15:27:49 -070010900 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE team8e2e4532019-03-14 14:37:56 -070010901 // clang-format off
10902 PacketFragments packet99 = {
10903 // type (short header, 4 byte packet number)
10904 {"",
10905 {0x43}},
10906 // connection_id
10907 {"",
10908 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10909 // packet number
10910 {"",
10911 {0x12, 0x34, 0x56, 0x78}},
10912 // frame type (IETF_NEW_CONNECTION_ID frame)
10913 {"",
10914 {0x18}},
10915 // error code
10916 {"Unable to read new connection ID frame sequence number.",
10917 {kVarInt62OneByte + 0x11}},
fkastenholz1c19fc22019-07-12 11:06:19 -070010918 {"Unable to read new connection ID frame retire_prior_to.",
10919 {kVarInt62OneByte + 0x0a}},
dschinazicf5b1e22019-07-17 18:35:17 -070010920 {"Unable to read new connection ID frame connection id.",
QUICHE team8e2e4532019-03-14 14:37:56 -070010921 {0x09}}, // connection ID length
10922 {"Unable to read new connection ID frame connection id.",
10923 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
10924 {"Can not read new connection ID frame reset token.",
10925 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10926 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10927 };
10928 // clang-format on
10929
10930 std::unique_ptr<QuicEncryptedPacket> encrypted(
10931 AssemblePacketFromFragments(packet99));
10932 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10933
bncf6f82b12019-10-30 07:01:01 -070010934 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE team8e2e4532019-03-14 14:37:56 -070010935 ASSERT_TRUE(visitor_.header_.get());
10936 EXPECT_TRUE(CheckDecryption(
10937 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10938 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10939
10940 EXPECT_EQ(0u, visitor_.stream_frames_.size());
10941
10942 EXPECT_EQ(FramerTestConnectionIdNineBytes(),
10943 visitor_.new_connection_id_.connection_id);
10944 EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
fkastenholz1c19fc22019-07-12 11:06:19 -070010945 EXPECT_EQ(0x0au, visitor_.new_connection_id_.retire_prior_to);
QUICHE team8e2e4532019-03-14 14:37:56 -070010946 EXPECT_EQ(kTestStatelessResetToken,
10947 visitor_.new_connection_id_.stateless_reset_token);
10948
10949 ASSERT_EQ(0u, visitor_.ack_frames_.size());
10950
10951 CheckFramingBoundaries(packet99, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
10952}
10953
QUICHE team0131a5b2019-03-20 15:23:27 -070010954// Verifies that parsing a NEW_CONNECTION_ID frame with a length above the
10955// specified maximum fails.
10956TEST_P(QuicFramerTest, InvalidLongNewConnectionIdFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070010957 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070010958 // The NEW_CONNECTION_ID frame is only for IETF QUIC.
QUICHE team0131a5b2019-03-20 15:23:27 -070010959 return;
10960 }
zhongyi546cc452019-04-12 15:27:49 -070010961 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE team0131a5b2019-03-20 15:23:27 -070010962 // clang-format off
10963 PacketFragments packet99 = {
10964 // type (short header, 4 byte packet number)
10965 {"",
10966 {0x43}},
10967 // connection_id
10968 {"",
10969 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10970 // packet number
10971 {"",
10972 {0x12, 0x34, 0x56, 0x78}},
10973 // frame type (IETF_NEW_CONNECTION_ID frame)
10974 {"",
10975 {0x18}},
10976 // error code
10977 {"Unable to read new connection ID frame sequence number.",
10978 {kVarInt62OneByte + 0x11}},
fkastenholz1c19fc22019-07-12 11:06:19 -070010979 {"Unable to read new connection ID frame retire_prior_to.",
10980 {kVarInt62OneByte + 0x0b}},
dschinazicf5b1e22019-07-17 18:35:17 -070010981 {"Unable to read new connection ID frame connection id.",
dschinazib953d022019-08-01 18:05:58 -070010982 {0x40}}, // connection ID length
QUICHE team0131a5b2019-03-20 15:23:27 -070010983 {"Unable to read new connection ID frame connection id.",
10984 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10985 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
dschinazib953d022019-08-01 18:05:58 -070010986 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10987 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10988 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10989 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10990 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10991 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E}},
QUICHE team0131a5b2019-03-20 15:23:27 -070010992 {"Can not read new connection ID frame reset token.",
10993 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10994 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10995 };
10996 // clang-format on
10997
10998 std::unique_ptr<QuicEncryptedPacket> encrypted(
10999 AssemblePacketFromFragments(packet99));
11000 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -070011001 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_NEW_CONNECTION_ID_DATA));
dschinazi161bb492020-02-05 09:59:38 -080011002 EXPECT_EQ("Invalid new connection ID length for version.",
11003 framer_.detailed_error());
QUICHE team0131a5b2019-03-20 15:23:27 -070011004}
11005
fkastenholz1c19fc22019-07-12 11:06:19 -070011006// Verifies that parsing a NEW_CONNECTION_ID frame with an invalid
11007// retire-prior-to fails.
11008TEST_P(QuicFramerTest, InvalidRetirePriorToNewConnectionIdFrame) {
11009 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011010 // This frame is only for IETF QUIC only.
fkastenholz1c19fc22019-07-12 11:06:19 -070011011 return;
11012 }
11013 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11014 // clang-format off
11015 PacketFragments packet99 = {
11016 // type (short header, 4 byte packet number)
11017 {"",
11018 {0x43}},
11019 // connection_id
11020 {"",
11021 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11022 // packet number
11023 {"",
11024 {0x12, 0x34, 0x56, 0x78}},
11025 // frame type (IETF_NEW_CONNECTION_ID frame)
11026 {"",
11027 {0x18}},
11028 // sequence number
11029 {"Unable to read new connection ID frame sequence number.",
11030 {kVarInt62OneByte + 0x11}},
11031 {"Unable to read new connection ID frame retire_prior_to.",
11032 {kVarInt62OneByte + 0x1b}},
11033 {"Unable to read new connection ID frame connection id length.",
11034 {0x08}}, // connection ID length
11035 {"Unable to read new connection ID frame connection id.",
11036 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11}},
11037 {"Can not read new connection ID frame reset token.",
11038 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
11039 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
11040 };
11041 // clang-format on
11042
11043 std::unique_ptr<QuicEncryptedPacket> encrypted(
11044 AssemblePacketFromFragments(packet99));
11045 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -070011046 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_NEW_CONNECTION_ID_DATA));
fkastenholz1c19fc22019-07-12 11:06:19 -070011047 EXPECT_EQ("Retire_prior_to > sequence_number.", framer_.detailed_error());
11048}
11049
QUICHE teama6ef0a62019-03-07 20:34:33 -050011050TEST_P(QuicFramerTest, BuildNewConnectionIdFramePacket) {
fkastenholz305e1732019-06-18 05:01:22 -070011051 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011052 // This frame is only for IETF QUIC only.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011053 return;
11054 }
QUICHE team2252b702019-05-14 23:55:14 -040011055 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011056 QuicPacketHeader header;
11057 header.destination_connection_id = FramerTestConnectionId();
11058 header.reset_flag = false;
11059 header.version_flag = false;
11060 header.packet_number = kPacketNumber;
11061
11062 QuicNewConnectionIdFrame frame;
11063 frame.sequence_number = 0x11;
fkastenholz1c19fc22019-07-12 11:06:19 -070011064 frame.retire_prior_to = 0x0c;
QUICHE teama6ef0a62019-03-07 20:34:33 -050011065 // Use this value to force a 4-byte encoded variable length connection ID
11066 // in the frame.
11067 frame.connection_id = FramerTestConnectionIdPlusOne();
11068 frame.stateless_reset_token = kTestStatelessResetToken;
11069
11070 QuicFrames frames = {QuicFrame(&frame)};
11071
11072 // clang-format off
11073 unsigned char packet99[] = {
11074 // type (short header, 4 byte packet number)
11075 0x43,
11076 // connection_id
11077 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11078 // packet number
11079 0x12, 0x34, 0x56, 0x78,
11080
11081 // frame type (IETF_NEW_CONNECTION_ID frame)
11082 0x18,
11083 // sequence number
11084 kVarInt62OneByte + 0x11,
fkastenholz1c19fc22019-07-12 11:06:19 -070011085 // retire_prior_to
11086 kVarInt62OneByte + 0x0c,
QUICHE teama6ef0a62019-03-07 20:34:33 -050011087 // new connection id length
11088 0x08,
11089 // new connection id
11090 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
11091 // stateless reset token
11092 0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
11093 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11094 };
11095 // clang-format on
11096
11097 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11098 ASSERT_TRUE(data != nullptr);
11099
dmcardle8f7df532020-01-07 13:28:57 -080011100 quiche::test::CompareCharArraysWithHexError(
11101 "constructed packet", data->data(), data->length(), AsChars(packet99),
vasilvvbed67c62020-10-20 06:38:43 -070011102 ABSL_ARRAYSIZE(packet99));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011103}
11104
11105TEST_P(QuicFramerTest, NewTokenFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070011106 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011107 // This frame is only for IETF QUIC only.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011108 return;
11109 }
zhongyi546cc452019-04-12 15:27:49 -070011110 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011111 // clang-format off
11112 PacketFragments packet = {
11113 // type (short header, 4 byte packet number)
11114 {"",
11115 {0x43}},
11116 // connection_id
11117 {"",
11118 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11119 // packet number
11120 {"",
11121 {0x12, 0x34, 0x56, 0x78}},
11122 // frame type (IETF_NEW_TOKEN frame)
11123 {"",
11124 {0x07}},
11125 // Length
11126 {"Unable to read new token length.",
11127 {kVarInt62OneByte + 0x08}},
11128 {"Unable to read new token data.",
11129 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}}
11130 };
11131 // clang-format on
11132 uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
11133 0x04, 0x05, 0x06, 0x07};
11134
11135 std::unique_ptr<QuicEncryptedPacket> encrypted(
11136 AssemblePacketFromFragments(packet));
11137 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11138
bncf6f82b12019-10-30 07:01:01 -070011139 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050011140 ASSERT_TRUE(visitor_.header_.get());
11141 EXPECT_TRUE(CheckDecryption(
11142 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11143 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11144
11145 EXPECT_EQ(0u, visitor_.stream_frames_.size());
11146
11147 EXPECT_EQ(sizeof(expected_token_value), visitor_.new_token_.token.length());
11148 EXPECT_EQ(0, memcmp(expected_token_value, visitor_.new_token_.token.data(),
11149 sizeof(expected_token_value)));
11150
11151 CheckFramingBoundaries(packet, QUIC_INVALID_NEW_TOKEN);
11152}
11153
11154TEST_P(QuicFramerTest, BuildNewTokenFramePacket) {
fkastenholz305e1732019-06-18 05:01:22 -070011155 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011156 // This frame is only for IETF QUIC only.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011157 return;
11158 }
QUICHE team2252b702019-05-14 23:55:14 -040011159 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011160 QuicPacketHeader header;
11161 header.destination_connection_id = FramerTestConnectionId();
11162 header.reset_flag = false;
11163 header.version_flag = false;
11164 header.packet_number = kPacketNumber;
11165
11166 uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
11167 0x04, 0x05, 0x06, 0x07};
11168
fayang133b8682020-12-08 05:50:33 -080011169 QuicNewTokenFrame frame(0,
11170 absl::string_view((const char*)(expected_token_value),
11171 sizeof(expected_token_value)));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011172
11173 QuicFrames frames = {QuicFrame(&frame)};
11174
11175 // clang-format off
11176 unsigned char packet[] = {
11177 // type (short header, 4 byte packet number)
11178 0x43,
11179 // connection_id
11180 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11181 // packet number
11182 0x12, 0x34, 0x56, 0x78,
11183
11184 // frame type (IETF_NEW_TOKEN frame)
11185 0x07,
11186 // Length and token
11187 kVarInt62OneByte + 0x08,
11188 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
11189 };
11190 // clang-format on
11191
11192 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11193 ASSERT_TRUE(data != nullptr);
11194
dmcardle8f7df532020-01-07 13:28:57 -080011195 quiche::test::CompareCharArraysWithHexError(
11196 "constructed packet", data->data(), data->length(), AsChars(packet),
vasilvvbed67c62020-10-20 06:38:43 -070011197 ABSL_ARRAYSIZE(packet));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011198}
11199
11200TEST_P(QuicFramerTest, IetfStopSendingFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070011201 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011202 // Stop sending frame is IETF QUIC only.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011203 return;
11204 }
zhongyi546cc452019-04-12 15:27:49 -070011205 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011206
11207 // clang-format off
11208 PacketFragments packet99 = {
11209 // type (short header, 4 byte packet number)
11210 {"",
11211 {0x43}},
11212 // connection_id
11213 {"",
11214 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11215 // packet number
11216 {"",
11217 {0x12, 0x34, 0x9A, 0xBC}},
11218 // frame type (IETF_STOP_SENDING frame)
11219 {"",
11220 {0x05}},
11221 // stream id
renjietangd077f8c2020-03-23 17:22:09 -070011222 {"Unable to read IETF_STOP_SENDING frame stream id/count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050011223 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
11224 {"Unable to read stop sending application error code.",
fkastenholz733552e2019-07-16 11:16:58 -070011225 {kVarInt62FourBytes + 0x00, 0x00, 0x76, 0x54}},
QUICHE teama6ef0a62019-03-07 20:34:33 -050011226 };
11227 // clang-format on
11228
11229 std::unique_ptr<QuicEncryptedPacket> encrypted(
11230 AssemblePacketFromFragments(packet99));
11231 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11232
bncf6f82b12019-10-30 07:01:01 -070011233 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050011234 ASSERT_TRUE(visitor_.header_.get());
11235 EXPECT_TRUE(CheckDecryption(
11236 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11237 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11238
11239 EXPECT_EQ(kStreamId, visitor_.stop_sending_frame_.stream_id);
bncba7be052020-11-24 06:58:02 -080011240 EXPECT_EQ(QUIC_STREAM_UNKNOWN_APPLICATION_ERROR_CODE,
11241 visitor_.stop_sending_frame_.error_code);
bnc4fd6e9b2020-09-10 13:06:54 -070011242 EXPECT_EQ(static_cast<uint64_t>(0x7654),
11243 visitor_.stop_sending_frame_.ietf_error_code);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011244
11245 CheckFramingBoundaries(packet99, QUIC_INVALID_STOP_SENDING_FRAME_DATA);
11246}
11247
11248TEST_P(QuicFramerTest, BuildIetfStopSendingPacket) {
fkastenholz305e1732019-06-18 05:01:22 -070011249 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011250 // Stop sending frame is IETF QUIC only.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011251 return;
11252 }
11253
11254 QuicPacketHeader header;
11255 header.destination_connection_id = FramerTestConnectionId();
11256 header.reset_flag = false;
11257 header.version_flag = false;
11258 header.packet_number = kPacketNumber;
11259
11260 QuicStopSendingFrame frame;
11261 frame.stream_id = kStreamId;
bnc4fd6e9b2020-09-10 13:06:54 -070011262 frame.error_code = QUIC_STREAM_ENCODER_STREAM_ERROR;
11263 frame.ietf_error_code =
11264 static_cast<uint64_t>(QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011265 QuicFrames frames = {QuicFrame(&frame)};
11266
11267 // clang-format off
11268 unsigned char packet99[] = {
11269 // type (short header, 4 byte packet number)
11270 0x43,
11271 // connection_id
11272 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11273 // packet number
11274 0x12, 0x34, 0x56, 0x78,
11275
11276 // frame type (IETF_STOP_SENDING frame)
11277 0x05,
11278 // Stream ID
11279 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
11280 // Application error code
bnc4fd6e9b2020-09-10 13:06:54 -070011281 kVarInt62TwoBytes + 0x02, 0x01,
QUICHE teama6ef0a62019-03-07 20:34:33 -050011282 };
11283 // clang-format on
11284
11285 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11286 ASSERT_TRUE(data != nullptr);
11287
dmcardle8f7df532020-01-07 13:28:57 -080011288 quiche::test::CompareCharArraysWithHexError(
11289 "constructed packet", data->data(), data->length(), AsChars(packet99),
vasilvvbed67c62020-10-20 06:38:43 -070011290 ABSL_ARRAYSIZE(packet99));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011291}
11292
11293TEST_P(QuicFramerTest, IetfPathChallengeFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070011294 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011295 // Path Challenge frame is IETF QUIC only.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011296 return;
11297 }
zhongyi546cc452019-04-12 15:27:49 -070011298 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011299
11300 // clang-format off
11301 PacketFragments packet99 = {
11302 // type (short header, 4 byte packet number)
11303 {"",
11304 {0x43}},
11305 // connection_id
11306 {"",
11307 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11308 // packet number
11309 {"",
11310 {0x12, 0x34, 0x9A, 0xBC}},
11311 // frame type (IETF_PATH_CHALLENGE)
11312 {"",
11313 {0x1a}},
11314 // data
11315 {"Can not read path challenge data.",
11316 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
11317 };
11318 // clang-format on
11319
11320 std::unique_ptr<QuicEncryptedPacket> encrypted(
11321 AssemblePacketFromFragments(packet99));
11322 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11323
bncf6f82b12019-10-30 07:01:01 -070011324 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050011325 ASSERT_TRUE(visitor_.header_.get());
11326 EXPECT_TRUE(CheckDecryption(
11327 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11328 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11329
11330 EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
11331 visitor_.path_challenge_frame_.data_buffer);
11332
11333 CheckFramingBoundaries(packet99, QUIC_INVALID_PATH_CHALLENGE_DATA);
11334}
11335
11336TEST_P(QuicFramerTest, BuildIetfPathChallengePacket) {
fkastenholz305e1732019-06-18 05:01:22 -070011337 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011338 // Path Challenge frame is IETF QUIC only.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011339 return;
11340 }
11341
11342 QuicPacketHeader header;
11343 header.destination_connection_id = FramerTestConnectionId();
11344 header.reset_flag = false;
11345 header.version_flag = false;
11346 header.packet_number = kPacketNumber;
11347
11348 QuicPathChallengeFrame frame;
11349 frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
11350 QuicFrames frames = {QuicFrame(&frame)};
11351
11352 // clang-format off
11353 unsigned char packet99[] = {
11354 // type (short header, 4 byte packet number)
11355 0x43,
11356 // connection_id
11357 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11358 // packet number
11359 0x12, 0x34, 0x56, 0x78,
11360
11361 // frame type (IETF_PATH_CHALLENGE)
11362 0x1a,
11363 // Data
11364 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
11365 };
11366 // clang-format on
11367
11368 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11369 ASSERT_TRUE(data != nullptr);
11370
dmcardle8f7df532020-01-07 13:28:57 -080011371 quiche::test::CompareCharArraysWithHexError(
11372 "constructed packet", data->data(), data->length(), AsChars(packet99),
vasilvvbed67c62020-10-20 06:38:43 -070011373 ABSL_ARRAYSIZE(packet99));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011374}
11375
11376TEST_P(QuicFramerTest, IetfPathResponseFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070011377 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011378 // Path response frame is IETF QUIC only.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011379 return;
11380 }
zhongyi546cc452019-04-12 15:27:49 -070011381 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011382
11383 // clang-format off
11384 PacketFragments packet99 = {
11385 // type (short header, 4 byte packet number)
11386 {"",
11387 {0x43}},
11388 // connection_id
11389 {"",
11390 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11391 // packet number
11392 {"",
11393 {0x12, 0x34, 0x9A, 0xBC}},
11394 // frame type (IETF_PATH_RESPONSE)
11395 {"",
11396 {0x1b}},
11397 // data
11398 {"Can not read path response data.",
11399 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
11400 };
11401 // clang-format on
11402
11403 std::unique_ptr<QuicEncryptedPacket> encrypted(
11404 AssemblePacketFromFragments(packet99));
11405 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11406
bncf6f82b12019-10-30 07:01:01 -070011407 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050011408 ASSERT_TRUE(visitor_.header_.get());
11409 EXPECT_TRUE(CheckDecryption(
11410 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11411 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11412
11413 EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
11414 visitor_.path_response_frame_.data_buffer);
11415
11416 CheckFramingBoundaries(packet99, QUIC_INVALID_PATH_RESPONSE_DATA);
11417}
11418
11419TEST_P(QuicFramerTest, BuildIetfPathResponsePacket) {
fkastenholz305e1732019-06-18 05:01:22 -070011420 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011421 // Path response frame is IETF QUIC only
QUICHE teama6ef0a62019-03-07 20:34:33 -050011422 return;
11423 }
11424
11425 QuicPacketHeader header;
11426 header.destination_connection_id = FramerTestConnectionId();
11427 header.reset_flag = false;
11428 header.version_flag = false;
11429 header.packet_number = kPacketNumber;
11430
11431 QuicPathResponseFrame frame;
11432 frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
11433 QuicFrames frames = {QuicFrame(&frame)};
11434
11435 // clang-format off
11436 unsigned char packet99[] = {
11437 // type (short header, 4 byte packet number)
11438 0x43,
11439 // connection_id
11440 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11441 // packet number
11442 0x12, 0x34, 0x56, 0x78,
11443
11444 // frame type (IETF_PATH_RESPONSE)
11445 0x1b,
11446 // Data
11447 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
11448 };
11449 // clang-format on
11450
11451 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11452 ASSERT_TRUE(data != nullptr);
11453
dmcardle8f7df532020-01-07 13:28:57 -080011454 quiche::test::CompareCharArraysWithHexError(
11455 "constructed packet", data->data(), data->length(), AsChars(packet99),
vasilvvbed67c62020-10-20 06:38:43 -070011456 ABSL_ARRAYSIZE(packet99));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011457}
11458
11459TEST_P(QuicFramerTest, GetRetransmittableControlFrameSize) {
11460 QuicRstStreamFrame rst_stream(1, 3, QUIC_STREAM_CANCELLED, 1024);
11461 EXPECT_EQ(QuicFramer::GetRstStreamFrameSize(framer_.transport_version(),
11462 rst_stream),
11463 QuicFramer::GetRetransmittableControlFrameSize(
11464 framer_.transport_version(), QuicFrame(&rst_stream)));
11465
vasilvvc48c8712019-03-11 13:38:16 -070011466 std::string error_detail(2048, 'e');
mattm55006b02021-01-14 15:09:54 -080011467 QuicConnectionCloseFrame connection_close(framer_.transport_version(),
11468 QUIC_NETWORK_IDLE_TIMEOUT,
11469 NO_IETF_QUIC_ERROR, error_detail,
11470 /*transport_close_frame_type=*/0);
fkastenholz72f509b2019-04-10 09:17:49 -070011471
fkastenholza037b8b2019-05-07 06:00:05 -070011472 EXPECT_EQ(QuicFramer::GetConnectionCloseFrameSize(framer_.transport_version(),
11473 connection_close),
QUICHE teama6ef0a62019-03-07 20:34:33 -050011474 QuicFramer::GetRetransmittableControlFrameSize(
11475 framer_.transport_version(), QuicFrame(&connection_close)));
11476
11477 QuicGoAwayFrame goaway(2, QUIC_PEER_GOING_AWAY, 3, error_detail);
11478 EXPECT_EQ(QuicFramer::GetMinGoAwayFrameSize() + 256,
11479 QuicFramer::GetRetransmittableControlFrameSize(
11480 framer_.transport_version(), QuicFrame(&goaway)));
11481
11482 QuicWindowUpdateFrame window_update(3, 3, 1024);
11483 EXPECT_EQ(QuicFramer::GetWindowUpdateFrameSize(framer_.transport_version(),
11484 window_update),
11485 QuicFramer::GetRetransmittableControlFrameSize(
11486 framer_.transport_version(), QuicFrame(&window_update)));
11487
11488 QuicBlockedFrame blocked(4, 3, 1024);
11489 EXPECT_EQ(
11490 QuicFramer::GetBlockedFrameSize(framer_.transport_version(), blocked),
11491 QuicFramer::GetRetransmittableControlFrameSize(
11492 framer_.transport_version(), QuicFrame(&blocked)));
11493
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011494 // Following frames are IETF QUIC frames only.
fkastenholz305e1732019-06-18 05:01:22 -070011495 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011496 return;
11497 }
QUICHE teama6ef0a62019-03-07 20:34:33 -050011498
fkastenholz1c19fc22019-07-12 11:06:19 -070011499 QuicNewConnectionIdFrame new_connection_id(5, TestConnectionId(), 1, 101111,
11500 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011501 EXPECT_EQ(QuicFramer::GetNewConnectionIdFrameSize(new_connection_id),
11502 QuicFramer::GetRetransmittableControlFrameSize(
11503 framer_.transport_version(), QuicFrame(&new_connection_id)));
11504
fkastenholz3c4eabf2019-04-22 07:49:59 -070011505 QuicMaxStreamsFrame max_streams(6, 3, /*unidirectional=*/false);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011506 EXPECT_EQ(QuicFramer::GetMaxStreamsFrameSize(framer_.transport_version(),
fkastenholz3c4eabf2019-04-22 07:49:59 -070011507 max_streams),
QUICHE teama6ef0a62019-03-07 20:34:33 -050011508 QuicFramer::GetRetransmittableControlFrameSize(
fkastenholz3c4eabf2019-04-22 07:49:59 -070011509 framer_.transport_version(), QuicFrame(max_streams)));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011510
fkastenholz3c4eabf2019-04-22 07:49:59 -070011511 QuicStreamsBlockedFrame streams_blocked(7, 3, /*unidirectional=*/false);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011512 EXPECT_EQ(QuicFramer::GetStreamsBlockedFrameSize(framer_.transport_version(),
fkastenholz3c4eabf2019-04-22 07:49:59 -070011513 streams_blocked),
QUICHE teama6ef0a62019-03-07 20:34:33 -050011514 QuicFramer::GetRetransmittableControlFrameSize(
fkastenholz3c4eabf2019-04-22 07:49:59 -070011515 framer_.transport_version(), QuicFrame(streams_blocked)));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011516
11517 QuicPathFrameBuffer buffer = {
11518 {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
11519 QuicPathResponseFrame path_response_frame(8, buffer);
11520 EXPECT_EQ(QuicFramer::GetPathResponseFrameSize(path_response_frame),
11521 QuicFramer::GetRetransmittableControlFrameSize(
11522 framer_.transport_version(), QuicFrame(&path_response_frame)));
11523
11524 QuicPathChallengeFrame path_challenge_frame(9, buffer);
11525 EXPECT_EQ(QuicFramer::GetPathChallengeFrameSize(path_challenge_frame),
11526 QuicFramer::GetRetransmittableControlFrameSize(
11527 framer_.transport_version(), QuicFrame(&path_challenge_frame)));
11528
bnc187eea32020-09-02 12:16:15 -070011529 QuicStopSendingFrame stop_sending_frame(10, 3, QUIC_STREAM_CANCELLED);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011530 EXPECT_EQ(QuicFramer::GetStopSendingFrameSize(stop_sending_frame),
11531 QuicFramer::GetRetransmittableControlFrameSize(
11532 framer_.transport_version(), QuicFrame(&stop_sending_frame)));
11533}
11534
11535// A set of tests to ensure that bad frame-type encodings
11536// are properly detected and handled.
11537// First, four tests to see that unknown frame types generate
11538// a QUIC_INVALID_FRAME_DATA error with detailed information
11539// "Illegal frame type." This regardless of the encoding of the type
11540// (1/2/4/8 bytes).
11541// This only for version 99.
11542TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown1Byte) {
fkastenholz305e1732019-06-18 05:01:22 -070011543 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011544 // Only IETF QUIC encodes frame types such that this test is relevant.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011545 return;
11546 }
zhongyi546cc452019-04-12 15:27:49 -070011547 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011548 // clang-format off
11549 PacketFragments packet = {
11550 // type (short header, 4 byte packet number)
11551 {"",
11552 {0x43}},
11553 // connection_id
11554 {"",
11555 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11556 // packet number
11557 {"",
11558 {0x12, 0x34, 0x9A, 0xBC}},
11559 // frame type (unknown value, single-byte encoding)
11560 {"",
11561 {0x38}}
11562 };
11563 // clang-format on
11564
11565 std::unique_ptr<QuicEncryptedPacket> encrypted(
11566 AssemblePacketFromFragments(packet));
11567
11568 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11569
bncf6f82b12019-10-30 07:01:01 -070011570 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011571 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11572}
11573
11574TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown2Bytes) {
fkastenholz305e1732019-06-18 05:01:22 -070011575 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011576 // Only IETF QUIC encodes frame types such that this test is relevant.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011577 return;
11578 }
zhongyi546cc452019-04-12 15:27:49 -070011579 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011580
11581 // clang-format off
11582 PacketFragments packet = {
11583 // type (short header, 4 byte packet number)
11584 {"",
11585 {0x43}},
11586 // connection_id
11587 {"",
11588 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11589 // packet number
11590 {"",
11591 {0x12, 0x34, 0x9A, 0xBC}},
11592 // frame type (unknown value, two-byte encoding)
11593 {"",
11594 {kVarInt62TwoBytes + 0x01, 0x38}}
11595 };
11596 // clang-format on
11597
11598 std::unique_ptr<QuicEncryptedPacket> encrypted(
11599 AssemblePacketFromFragments(packet));
11600
11601 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11602
bncf6f82b12019-10-30 07:01:01 -070011603 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011604 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11605}
11606
11607TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown4Bytes) {
fkastenholz305e1732019-06-18 05:01:22 -070011608 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011609 // Only IETF QUIC encodes frame types such that this test is relevant.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011610 return;
11611 }
zhongyi546cc452019-04-12 15:27:49 -070011612 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011613
11614 // clang-format off
11615 PacketFragments packet = {
11616 // type (short header, 4 byte packet number)
11617 {"",
11618 {0x43}},
11619 // connection_id
11620 {"",
11621 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11622 // packet number
11623 {"",
11624 {0x12, 0x34, 0x9A, 0xBC}},
11625 // frame type (unknown value, four-byte encoding)
11626 {"",
11627 {kVarInt62FourBytes + 0x01, 0x00, 0x00, 0x38}}
11628 };
11629 // clang-format on
11630
11631 std::unique_ptr<QuicEncryptedPacket> encrypted(
11632 AssemblePacketFromFragments(packet));
11633
11634 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11635
bncf6f82b12019-10-30 07:01:01 -070011636 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011637 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11638}
11639
11640TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown8Bytes) {
fkastenholz305e1732019-06-18 05:01:22 -070011641 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011642 // Only IETF QUIC encodes frame types such that this test is relevant.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011643 return;
11644 }
zhongyi546cc452019-04-12 15:27:49 -070011645 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011646 // clang-format off
11647 PacketFragments packet = {
11648 // type (short header, 4 byte packet number)
11649 {"",
11650 {0x43}},
11651 // connection_id
11652 {"",
11653 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11654 // packet number
11655 {"",
11656 {0x12, 0x34, 0x9A, 0xBC}},
11657 // frame type (unknown value, eight-byte encoding)
11658 {"",
11659 {kVarInt62EightBytes + 0x01, 0x00, 0x00, 0x01, 0x02, 0x34, 0x56, 0x38}}
11660 };
11661 // clang-format on
11662
11663 std::unique_ptr<QuicEncryptedPacket> encrypted(
11664 AssemblePacketFromFragments(packet));
11665
11666 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11667
bncf6f82b12019-10-30 07:01:01 -070011668 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011669 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11670}
11671
11672// Three tests to check that known frame types that are not minimally
11673// encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
11674// information "Frame type not minimally encoded."
11675// Look at the frame-type encoded in 2, 4, and 8 bytes.
11676TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2Bytes) {
fkastenholz305e1732019-06-18 05:01:22 -070011677 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011678 // Only IETF QUIC encodes frame types such that this test is relevant.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011679 return;
11680 }
zhongyi546cc452019-04-12 15:27:49 -070011681 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011682
11683 // clang-format off
11684 PacketFragments packet = {
11685 // type (short header, 4 byte packet number)
11686 {"",
11687 {0x43}},
11688 // connection_id
11689 {"",
11690 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11691 // packet number
11692 {"",
11693 {0x12, 0x34, 0x9A, 0xBC}},
11694 // frame type (Blocked, two-byte encoding)
11695 {"",
11696 {kVarInt62TwoBytes + 0x00, 0x08}}
11697 };
11698 // clang-format on
11699
11700 std::unique_ptr<QuicEncryptedPacket> encrypted(
11701 AssemblePacketFromFragments(packet));
11702
11703 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11704
bncf54082a2019-11-27 10:19:47 -080011705 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011706 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11707}
11708
11709TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown4Bytes) {
fkastenholz305e1732019-06-18 05:01:22 -070011710 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011711 // Only IETF QUIC encodes frame types such that this test is relevant.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011712 return;
11713 }
zhongyi546cc452019-04-12 15:27:49 -070011714 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011715
11716 // clang-format off
11717 PacketFragments packet = {
11718 // type (short header, 4 byte packet number)
11719 {"",
11720 {0x43}},
11721 // connection_id
11722 {"",
11723 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11724 // packet number
11725 {"",
11726 {0x12, 0x34, 0x9A, 0xBC}},
11727 // frame type (Blocked, four-byte encoding)
11728 {"",
11729 {kVarInt62FourBytes + 0x00, 0x00, 0x00, 0x08}}
11730 };
11731 // clang-format on
11732
11733 std::unique_ptr<QuicEncryptedPacket> encrypted(
11734 AssemblePacketFromFragments(packet));
11735
11736 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11737
bncf54082a2019-11-27 10:19:47 -080011738 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011739 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11740}
11741
11742TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown8Bytes) {
fkastenholz305e1732019-06-18 05:01:22 -070011743 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011744 // Only IETF QUIC encodes frame types such that this test is relevant.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011745 return;
11746 }
zhongyi546cc452019-04-12 15:27:49 -070011747 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011748 // clang-format off
11749 PacketFragments packet = {
11750 // type (short header, 4 byte packet number)
11751 {"",
11752 {0x43}},
11753 // connection_id
11754 {"",
11755 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11756 // packet number
11757 {"",
11758 {0x12, 0x34, 0x9A, 0xBC}},
11759 // frame type (Blocked, eight-byte encoding)
11760 {"",
11761 {kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08}}
11762 };
11763 // clang-format on
11764
11765 std::unique_ptr<QuicEncryptedPacket> encrypted(
11766 AssemblePacketFromFragments(packet));
11767
11768 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11769
bncf54082a2019-11-27 10:19:47 -080011770 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011771 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11772}
11773
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011774// Tests to check that all known IETF frame types that are not minimally
QUICHE teama6ef0a62019-03-07 20:34:33 -050011775// encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
11776// information "Frame type not minimally encoded."
11777// Just look at 2-byte encoding.
11778TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2BytesAllTypes) {
fkastenholz305e1732019-06-18 05:01:22 -070011779 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070011780 // Only IETF QUIC encodes frame types such that this test is relevant.
QUICHE teama6ef0a62019-03-07 20:34:33 -050011781 return;
11782 }
zhongyi546cc452019-04-12 15:27:49 -070011783 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011784
11785 // clang-format off
11786 PacketFragments packets[] = {
11787 {
11788 // type (short header, 4 byte packet number)
11789 {"",
11790 {0x43}},
11791 // connection_id
11792 {"",
11793 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11794 // packet number
11795 {"",
11796 {0x12, 0x34, 0x9A, 0xBC}},
11797 // frame type (two-byte encoding)
11798 {"",
11799 {kVarInt62TwoBytes + 0x00, 0x00}}
11800 },
11801 {
11802 // type (short header, 4 byte packet number)
11803 {"",
11804 {0x43}},
11805 // connection_id
11806 {"",
11807 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11808 // packet number
11809 {"",
11810 {0x12, 0x34, 0x9A, 0xBC}},
11811 // frame type (two-byte encoding)
11812 {"",
11813 {kVarInt62TwoBytes + 0x00, 0x01}}
11814 },
11815 {
11816 // type (short header, 4 byte packet number)
11817 {"",
11818 {0x43}},
11819 // connection_id
11820 {"",
11821 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11822 // packet number
11823 {"",
11824 {0x12, 0x34, 0x9A, 0xBC}},
11825 // frame type (two-byte encoding)
11826 {"",
11827 {kVarInt62TwoBytes + 0x00, 0x02}}
11828 },
11829 {
11830 // type (short header, 4 byte packet number)
11831 {"",
11832 {0x43}},
11833 // connection_id
11834 {"",
11835 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11836 // packet number
11837 {"",
11838 {0x12, 0x34, 0x9A, 0xBC}},
11839 // frame type (two-byte encoding)
11840 {"",
11841 {kVarInt62TwoBytes + 0x00, 0x03}}
11842 },
11843 {
11844 // type (short header, 4 byte packet number)
11845 {"",
11846 {0x43}},
11847 // connection_id
11848 {"",
11849 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11850 // packet number
11851 {"",
11852 {0x12, 0x34, 0x9A, 0xBC}},
11853 // frame type (two-byte encoding)
11854 {"",
11855 {kVarInt62TwoBytes + 0x00, 0x04}}
11856 },
11857 {
11858 // type (short header, 4 byte packet number)
11859 {"",
11860 {0x43}},
11861 // connection_id
11862 {"",
11863 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11864 // packet number
11865 {"",
11866 {0x12, 0x34, 0x9A, 0xBC}},
11867 // frame type (two-byte encoding)
11868 {"",
11869 {kVarInt62TwoBytes + 0x00, 0x05}}
11870 },
11871 {
11872 // type (short header, 4 byte packet number)
11873 {"",
11874 {0x43}},
11875 // connection_id
11876 {"",
11877 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11878 // packet number
11879 {"",
11880 {0x12, 0x34, 0x9A, 0xBC}},
11881 // frame type (two-byte encoding)
11882 {"",
11883 {kVarInt62TwoBytes + 0x00, 0x06}}
11884 },
11885 {
11886 // type (short header, 4 byte packet number)
11887 {"",
11888 {0x43}},
11889 // connection_id
11890 {"",
11891 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11892 // packet number
11893 {"",
11894 {0x12, 0x34, 0x9A, 0xBC}},
11895 // frame type (two-byte encoding)
11896 {"",
11897 {kVarInt62TwoBytes + 0x00, 0x07}}
11898 },
11899 {
11900 // type (short header, 4 byte packet number)
11901 {"",
11902 {0x43}},
11903 // connection_id
11904 {"",
11905 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11906 // packet number
11907 {"",
11908 {0x12, 0x34, 0x9A, 0xBC}},
11909 // frame type (two-byte encoding)
11910 {"",
11911 {kVarInt62TwoBytes + 0x00, 0x08}}
11912 },
11913 {
11914 // type (short header, 4 byte packet number)
11915 {"",
11916 {0x43}},
11917 // connection_id
11918 {"",
11919 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11920 // packet number
11921 {"",
11922 {0x12, 0x34, 0x9A, 0xBC}},
11923 // frame type (two-byte encoding)
11924 {"",
11925 {kVarInt62TwoBytes + 0x00, 0x09}}
11926 },
11927 {
11928 // type (short header, 4 byte packet number)
11929 {"",
11930 {0x43}},
11931 // connection_id
11932 {"",
11933 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11934 // packet number
11935 {"",
11936 {0x12, 0x34, 0x9A, 0xBC}},
11937 // frame type (two-byte encoding)
11938 {"",
11939 {kVarInt62TwoBytes + 0x00, 0x0a}}
11940 },
11941 {
11942 // type (short header, 4 byte packet number)
11943 {"",
11944 {0x43}},
11945 // connection_id
11946 {"",
11947 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11948 // packet number
11949 {"",
11950 {0x12, 0x34, 0x9A, 0xBC}},
11951 // frame type (two-byte encoding)
11952 {"",
11953 {kVarInt62TwoBytes + 0x00, 0x0b}}
11954 },
11955 {
11956 // type (short header, 4 byte packet number)
11957 {"",
11958 {0x43}},
11959 // connection_id
11960 {"",
11961 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11962 // packet number
11963 {"",
11964 {0x12, 0x34, 0x9A, 0xBC}},
11965 // frame type (two-byte encoding)
11966 {"",
11967 {kVarInt62TwoBytes + 0x00, 0x0c}}
11968 },
11969 {
11970 // type (short header, 4 byte packet number)
11971 {"",
11972 {0x43}},
11973 // connection_id
11974 {"",
11975 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11976 // packet number
11977 {"",
11978 {0x12, 0x34, 0x9A, 0xBC}},
11979 // frame type (two-byte encoding)
11980 {"",
11981 {kVarInt62TwoBytes + 0x00, 0x0d}}
11982 },
11983 {
11984 // type (short header, 4 byte packet number)
11985 {"",
11986 {0x43}},
11987 // connection_id
11988 {"",
11989 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11990 // packet number
11991 {"",
11992 {0x12, 0x34, 0x9A, 0xBC}},
11993 // frame type (two-byte encoding)
11994 {"",
11995 {kVarInt62TwoBytes + 0x00, 0x0e}}
11996 },
11997 {
11998 // type (short header, 4 byte packet number)
11999 {"",
12000 {0x43}},
12001 // connection_id
12002 {"",
12003 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12004 // packet number
12005 {"",
12006 {0x12, 0x34, 0x9A, 0xBC}},
12007 // frame type (two-byte encoding)
12008 {"",
12009 {kVarInt62TwoBytes + 0x00, 0x0f}}
12010 },
12011 {
12012 // type (short header, 4 byte packet number)
12013 {"",
12014 {0x43}},
12015 // connection_id
12016 {"",
12017 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12018 // packet number
12019 {"",
12020 {0x12, 0x34, 0x9A, 0xBC}},
12021 // frame type (two-byte encoding)
12022 {"",
12023 {kVarInt62TwoBytes + 0x00, 0x10}}
12024 },
12025 {
12026 // type (short header, 4 byte packet number)
12027 {"",
12028 {0x43}},
12029 // connection_id
12030 {"",
12031 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12032 // packet number
12033 {"",
12034 {0x12, 0x34, 0x9A, 0xBC}},
12035 // frame type (two-byte encoding)
12036 {"",
12037 {kVarInt62TwoBytes + 0x00, 0x11}}
12038 },
12039 {
12040 // type (short header, 4 byte packet number)
12041 {"",
12042 {0x43}},
12043 // connection_id
12044 {"",
12045 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12046 // packet number
12047 {"",
12048 {0x12, 0x34, 0x9A, 0xBC}},
12049 // frame type (two-byte encoding)
12050 {"",
12051 {kVarInt62TwoBytes + 0x00, 0x12}}
12052 },
12053 {
12054 // type (short header, 4 byte packet number)
12055 {"",
12056 {0x43}},
12057 // connection_id
12058 {"",
12059 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12060 // packet number
12061 {"",
12062 {0x12, 0x34, 0x9A, 0xBC}},
12063 // frame type (two-byte encoding)
12064 {"",
12065 {kVarInt62TwoBytes + 0x00, 0x13}}
12066 },
12067 {
12068 // type (short header, 4 byte packet number)
12069 {"",
12070 {0x43}},
12071 // connection_id
12072 {"",
12073 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12074 // packet number
12075 {"",
12076 {0x12, 0x34, 0x9A, 0xBC}},
12077 // frame type (two-byte encoding)
12078 {"",
12079 {kVarInt62TwoBytes + 0x00, 0x14}}
12080 },
12081 {
12082 // type (short header, 4 byte packet number)
12083 {"",
12084 {0x43}},
12085 // connection_id
12086 {"",
12087 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12088 // packet number
12089 {"",
12090 {0x12, 0x34, 0x9A, 0xBC}},
12091 // frame type (two-byte encoding)
12092 {"",
12093 {kVarInt62TwoBytes + 0x00, 0x15}}
12094 },
12095 {
12096 // type (short header, 4 byte packet number)
12097 {"",
12098 {0x43}},
12099 // connection_id
12100 {"",
12101 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12102 // packet number
12103 {"",
12104 {0x12, 0x34, 0x9A, 0xBC}},
12105 // frame type (two-byte encoding)
12106 {"",
12107 {kVarInt62TwoBytes + 0x00, 0x16}}
12108 },
12109 {
12110 // type (short header, 4 byte packet number)
12111 {"",
12112 {0x43}},
12113 // connection_id
12114 {"",
12115 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12116 // packet number
12117 {"",
12118 {0x12, 0x34, 0x9A, 0xBC}},
12119 // frame type (two-byte encoding)
12120 {"",
12121 {kVarInt62TwoBytes + 0x00, 0x17}}
12122 },
12123 {
12124 // type (short header, 4 byte packet number)
12125 {"",
12126 {0x43}},
12127 // connection_id
12128 {"",
12129 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12130 // packet number
12131 {"",
12132 {0x12, 0x34, 0x9A, 0xBC}},
12133 // frame type (two-byte encoding)
12134 {"",
12135 {kVarInt62TwoBytes + 0x00, 0x18}}
12136 },
12137 {
12138 // type (short header, 4 byte packet number)
12139 {"",
12140 {0x43}},
12141 // connection_id
12142 {"",
12143 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12144 // packet number
12145 {"",
12146 {0x12, 0x34, 0x9A, 0xBC}},
12147 // frame type (two-byte encoding)
12148 {"",
12149 {kVarInt62TwoBytes + 0x00, 0x20}}
12150 },
12151 {
12152 // type (short header, 4 byte packet number)
12153 {"",
12154 {0x43}},
12155 // connection_id
12156 {"",
12157 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12158 // packet number
12159 {"",
12160 {0x12, 0x34, 0x9A, 0xBC}},
12161 // frame type (two-byte encoding)
12162 {"",
12163 {kVarInt62TwoBytes + 0x00, 0x21}}
12164 },
12165 };
12166 // clang-format on
12167
12168 for (PacketFragments& packet : packets) {
12169 std::unique_ptr<QuicEncryptedPacket> encrypted(
12170 AssemblePacketFromFragments(packet));
12171
12172 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
12173
bncf54082a2019-11-27 10:19:47 -080012174 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
QUICHE teama6ef0a62019-03-07 20:34:33 -050012175 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
12176 }
12177}
12178
12179TEST_P(QuicFramerTest, RetireConnectionIdFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070012180 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050012181 // This frame is only for version 99.
12182 return;
12183 }
zhongyi546cc452019-04-12 15:27:49 -070012184 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012185 // clang-format off
12186 PacketFragments packet99 = {
12187 // type (short header, 4 byte packet number)
12188 {"",
12189 {0x43}},
12190 // connection_id
12191 {"",
12192 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
12193 // packet number
12194 {"",
12195 {0x12, 0x34, 0x56, 0x78}},
12196 // frame type (IETF_RETIRE_CONNECTION_ID frame)
12197 {"",
12198 {0x19}},
12199 // Sequence number
12200 {"Unable to read retire connection ID frame sequence number.",
12201 {kVarInt62TwoBytes + 0x11, 0x22}}
12202 };
12203 // clang-format on
12204
12205 std::unique_ptr<QuicEncryptedPacket> encrypted(
12206 AssemblePacketFromFragments(packet99));
12207 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
12208
bncf6f82b12019-10-30 07:01:01 -070012209 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050012210 ASSERT_TRUE(visitor_.header_.get());
12211 EXPECT_TRUE(CheckDecryption(
12212 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
12213 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
12214
12215 EXPECT_EQ(0u, visitor_.stream_frames_.size());
12216
12217 EXPECT_EQ(0x1122u, visitor_.retire_connection_id_.sequence_number);
12218
12219 ASSERT_EQ(0u, visitor_.ack_frames_.size());
12220
12221 CheckFramingBoundaries(packet99, QUIC_INVALID_RETIRE_CONNECTION_ID_DATA);
12222}
12223
12224TEST_P(QuicFramerTest, BuildRetireConnectionIdFramePacket) {
fkastenholz305e1732019-06-18 05:01:22 -070012225 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050012226 // This frame is only for version 99.
12227 return;
12228 }
QUICHE team2252b702019-05-14 23:55:14 -040012229 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012230 QuicPacketHeader header;
12231 header.destination_connection_id = FramerTestConnectionId();
12232 header.reset_flag = false;
12233 header.version_flag = false;
12234 header.packet_number = kPacketNumber;
12235
12236 QuicRetireConnectionIdFrame frame;
12237 frame.sequence_number = 0x1122;
12238
12239 QuicFrames frames = {QuicFrame(&frame)};
12240
12241 // clang-format off
12242 unsigned char packet99[] = {
12243 // type (short header, 4 byte packet number)
12244 0x43,
12245 // connection_id
12246 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12247 // packet number
12248 0x12, 0x34, 0x56, 0x78,
12249
12250 // frame type (IETF_RETIRE_CONNECTION_ID frame)
12251 0x19,
12252 // sequence number
12253 kVarInt62TwoBytes + 0x11, 0x22
12254 };
12255 // clang-format on
12256
12257 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
12258 ASSERT_TRUE(data != nullptr);
12259
dmcardle8f7df532020-01-07 13:28:57 -080012260 quiche::test::CompareCharArraysWithHexError(
12261 "constructed packet", data->data(), data->length(), AsChars(packet99),
vasilvvbed67c62020-10-20 06:38:43 -070012262 ABSL_ARRAYSIZE(packet99));
QUICHE teama6ef0a62019-03-07 20:34:33 -050012263}
12264
12265TEST_P(QuicFramerTest, AckFrameWithInvalidLargestObserved) {
zhongyi546cc452019-04-12 15:27:49 -070012266 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012267 // clang-format off
12268 unsigned char packet[] = {
12269 // public flags (8 byte connection_id)
12270 0x2C,
12271 // connection_id
12272 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12273 // packet number
12274 0x12, 0x34, 0x56, 0x78,
12275
12276 // frame type (ack frame)
12277 0x45,
12278 // largest observed
12279 0x00, 0x00,
12280 // Zero delta time.
12281 0x00, 0x00,
12282 // first ack block length.
12283 0x00, 0x00,
12284 // num timestamps.
12285 0x00
12286 };
12287
QUICHE teama6ef0a62019-03-07 20:34:33 -050012288 unsigned char packet46[] = {
12289 // type (short header, 4 byte packet number)
12290 0x43,
12291 // connection_id
12292 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12293 // packet number
12294 0x12, 0x34, 0x56, 0x78,
12295
12296 // frame type (ack frame)
12297 0x45,
12298 // largest observed
12299 0x00, 0x00,
12300 // Zero delta time.
12301 0x00, 0x00,
12302 // first ack block length.
12303 0x00, 0x00,
12304 // num timestamps.
12305 0x00
12306 };
12307
12308 unsigned char packet99[] = {
12309 // type (short header, 4 byte packet number)
12310 0x43,
12311 // connection_id
12312 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12313 // packet number
12314 0x12, 0x34, 0x56, 0x78,
12315
12316 // frame type (IETF_ACK frame)
12317 0x02,
12318 // Largest acked
12319 kVarInt62OneByte + 0x00,
12320 // Zero delta time.
12321 kVarInt62OneByte + 0x00,
12322 // Ack block count 0
12323 kVarInt62OneByte + 0x00,
12324 // First ack block length
12325 kVarInt62OneByte + 0x00,
12326 };
12327 // clang-format on
12328
12329 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -070012330 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -070012331 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050012332 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -070012333 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -070012334 } else if (framer_.version().HasIetfInvariantHeader()) {
fayang374888f2019-05-31 06:47:21 -070012335 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -050012336 }
12337
12338 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
12339 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12340 EXPECT_EQ(framer_.detailed_error(), "Largest acked is 0.");
12341}
12342
12343TEST_P(QuicFramerTest, FirstAckBlockJustUnderFlow) {
zhongyi546cc452019-04-12 15:27:49 -070012344 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012345 // clang-format off
12346 unsigned char packet[] = {
12347 // public flags (8 byte connection_id)
12348 0x2C,
12349 // connection_id
12350 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12351 // packet number
12352 0x12, 0x34, 0x56, 0x78,
12353
12354 // frame type (ack frame)
12355 0x45,
12356 // largest observed
12357 0x00, 0x02,
12358 // Zero delta time.
12359 0x00, 0x00,
12360 // first ack block length.
12361 0x00, 0x03,
12362 // num timestamps.
12363 0x00
12364 };
12365
QUICHE teama6ef0a62019-03-07 20:34:33 -050012366 unsigned char packet46[] = {
12367 // type (short header, 4 byte packet number)
12368 0x43,
12369 // connection_id
12370 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12371 // packet number
12372 0x12, 0x34, 0x56, 0x78,
12373
12374 // frame type (ack frame)
12375 0x45,
12376 // largest observed
12377 0x00, 0x02,
12378 // Zero delta time.
12379 0x00, 0x00,
12380 // first ack block length.
12381 0x00, 0x03,
12382 // num timestamps.
12383 0x00
12384 };
12385
12386 unsigned char packet99[] = {
12387 // type (short header, 4 byte packet number)
12388 0x43,
12389 // connection_id
12390 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12391 // packet number
12392 0x12, 0x34, 0x56, 0x78,
12393
12394 // frame type (IETF_ACK frame)
12395 0x02,
12396 // Largest acked
12397 kVarInt62OneByte + 0x02,
12398 // Zero delta time.
12399 kVarInt62OneByte + 0x00,
12400 // Ack block count 0
12401 kVarInt62OneByte + 0x00,
12402 // First ack block length
12403 kVarInt62OneByte + 0x02,
12404 };
12405 // clang-format on
12406
12407 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -070012408 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -070012409 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050012410 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -070012411 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -070012412 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050012413 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -070012414 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012415 }
12416
12417 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
12418 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12419 EXPECT_EQ(framer_.detailed_error(),
12420 "Underflow with first ack block length 3 largest acked is 2.");
12421}
12422
12423TEST_P(QuicFramerTest, ThirdAckBlockJustUnderflow) {
zhongyi546cc452019-04-12 15:27:49 -070012424 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012425 // clang-format off
12426 unsigned char packet[] = {
12427 // public flags (8 byte connection_id)
12428 0x2C,
12429 // connection_id
12430 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12431 // packet number
12432 0x12, 0x34, 0x56, 0x78,
12433
12434 // frame type (ack frame)
12435 0x60,
12436 // largest observed
12437 0x0A,
12438 // Zero delta time.
12439 0x00, 0x00,
12440 // Num of ack blocks
12441 0x02,
12442 // first ack block length.
12443 0x02,
12444 // gap to next block
12445 0x01,
12446 // ack block length
12447 0x01,
12448 // gap to next block
12449 0x01,
12450 // ack block length
12451 0x06,
12452 // num timestamps.
12453 0x00
12454 };
12455
QUICHE teama6ef0a62019-03-07 20:34:33 -050012456 unsigned char packet46[] = {
12457 // type (short header, 4 byte packet number)
12458 0x43,
12459 // connection_id
12460 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12461 // packet number
12462 0x12, 0x34, 0x56, 0x78,
12463
12464 // frame type (ack frame)
12465 0x60,
12466 // largest observed
12467 0x0A,
12468 // Zero delta time.
12469 0x00, 0x00,
12470 // Num of ack blocks
12471 0x02,
12472 // first ack block length.
12473 0x02,
12474 // gap to next block
12475 0x01,
12476 // ack block length
12477 0x01,
12478 // gap to next block
12479 0x01,
12480 // ack block length
12481 0x06,
12482 // num timestamps.
12483 0x00
12484 };
12485
12486 unsigned char packet99[] = {
12487 // type (short header, 4 byte packet number)
12488 0x43,
12489 // connection_id
12490 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12491 // packet number
12492 0x12, 0x34, 0x56, 0x78,
12493
12494 // frame type (IETF_ACK frame)
12495 0x02,
12496 // Largest acked
12497 kVarInt62OneByte + 0x0A,
12498 // Zero delta time.
12499 kVarInt62OneByte + 0x00,
12500 // Ack block count 2
12501 kVarInt62OneByte + 0x02,
12502 // First ack block length
12503 kVarInt62OneByte + 0x01,
12504 // gap to next block length
12505 kVarInt62OneByte + 0x00,
12506 // ack block length
12507 kVarInt62OneByte + 0x00,
12508 // gap to next block length
12509 kVarInt62OneByte + 0x00,
12510 // ack block length
12511 kVarInt62OneByte + 0x05,
12512 };
12513 // clang-format on
12514
12515 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -070012516 size_t p_size = ABSL_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -070012517 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050012518 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -070012519 p_size = ABSL_ARRAYSIZE(packet99);
dschinaziceed8662020-07-14 09:37:05 -070012520 } else if (framer_.version().HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050012521 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -070012522 p_size = ABSL_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012523 }
12524
12525 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
12526 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
fkastenholz305e1732019-06-18 05:01:22 -070012527 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050012528 EXPECT_EQ(framer_.detailed_error(),
12529 "Underflow with ack block length 6 latest ack block end is 5.");
12530 } else {
12531 EXPECT_EQ(framer_.detailed_error(),
12532 "Underflow with ack block length 6, end of block is 6.");
12533 }
12534}
12535
12536TEST_P(QuicFramerTest, CoalescedPacket) {
12537 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12538 return;
12539 }
zhongyi546cc452019-04-12 15:27:49 -070012540 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012541 // clang-format off
12542 unsigned char packet[] = {
12543 // first coalesced packet
12544 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12545 // 4-byte packet number)
12546 0xD3,
12547 // version
12548 QUIC_VERSION_BYTES,
12549 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070012550 0x08,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012551 // destination connection ID
12552 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -070012553 // source connection ID length
12554 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012555 // long header packet length
12556 0x1E,
12557 // packet number
12558 0x12, 0x34, 0x56, 0x78,
dschinazic73506e2019-09-20 13:26:46 -070012559 // frame type (stream frame with fin)
12560 0xFE,
12561 // stream id
12562 0x02, 0x03, 0x04,
12563 // offset
12564 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12565 // data length
12566 0x00, 0x0c,
12567 // data
12568 'h', 'e', 'l', 'l',
12569 'o', ' ', 'w', 'o',
12570 'r', 'l', 'd', '!',
12571 // second coalesced packet
12572 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12573 // 4-byte packet number)
12574 0xD3,
12575 // version
12576 QUIC_VERSION_BYTES,
12577 // destination connection ID length
12578 0x08,
12579 // destination connection ID
12580 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12581 // source connection ID length
12582 0x00,
12583 // long header packet length
12584 0x1E,
12585 // packet number
12586 0x12, 0x34, 0x56, 0x79,
12587 // frame type (stream frame with fin)
12588 0xFE,
12589 // stream id
12590 0x02, 0x03, 0x04,
12591 // offset
12592 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12593 // data length
12594 0x00, 0x0c,
12595 // data
12596 'H', 'E', 'L', 'L',
12597 'O', '_', 'W', 'O',
12598 'R', 'L', 'D', '?',
12599 };
12600 unsigned char packet99[] = {
12601 // first coalesced packet
12602 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12603 // 4-byte packet number)
12604 0xD3,
12605 // version
12606 QUIC_VERSION_BYTES,
12607 // destination connection ID length
12608 0x08,
12609 // destination connection ID
12610 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12611 // source connection ID length
12612 0x00,
12613 // long header packet length
12614 0x1E,
12615 // packet number
12616 0x12, 0x34, 0x56, 0x78,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012617 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12618 0x08 | 0x01 | 0x02 | 0x04,
12619 // stream id
12620 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12621 // offset
12622 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12623 0x32, 0x10, 0x76, 0x54,
12624 // data length
12625 kVarInt62OneByte + 0x0c,
12626 // data
12627 'h', 'e', 'l', 'l',
12628 'o', ' ', 'w', 'o',
12629 'r', 'l', 'd', '!',
12630 // second coalesced packet
12631 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12632 // 4-byte packet number)
12633 0xD3,
12634 // version
12635 QUIC_VERSION_BYTES,
12636 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070012637 0x08,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012638 // destination connection ID
12639 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -070012640 // source connection ID length
12641 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012642 // long header packet length
12643 0x1E,
12644 // packet number
12645 0x12, 0x34, 0x56, 0x79,
12646 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12647 0x08 | 0x01 | 0x02 | 0x04,
12648 // stream id
12649 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12650 // offset
12651 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12652 0x32, 0x10, 0x76, 0x54,
12653 // data length
12654 kVarInt62OneByte + 0x0c,
12655 // data
12656 'H', 'E', 'L', 'L',
12657 'O', '_', 'W', 'O',
12658 'R', 'L', 'D', '?',
12659 };
12660 // clang-format on
12661
dschinazic73506e2019-09-20 13:26:46 -070012662 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -070012663 size_t p_length = ABSL_ARRAYSIZE(packet);
dschinazi40f0b3d2020-02-19 17:54:05 -080012664 if (framer_.version().HasIetfQuicFrames()) {
dschinazic73506e2019-09-20 13:26:46 -070012665 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -070012666 p_length = ABSL_ARRAYSIZE(packet99);
dschinazic73506e2019-09-20 13:26:46 -070012667 }
12668
12669 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012670 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12671
bncf6f82b12019-10-30 07:01:01 -070012672 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050012673 ASSERT_TRUE(visitor_.header_.get());
12674
12675 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12676 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12677
12678 // Stream ID should be the last 3 bytes of kStreamId.
12679 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12680 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12681 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12682 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12683
12684 ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
12685 EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
12686
bncf6f82b12019-10-30 07:01:01 -070012687 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050012688 ASSERT_TRUE(visitor_.header_.get());
12689
12690 ASSERT_EQ(2u, visitor_.stream_frames_.size());
12691 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12692
12693 // Stream ID should be the last 3 bytes of kStreamId.
12694 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[1]->stream_id);
12695 EXPECT_TRUE(visitor_.stream_frames_[1]->fin);
12696 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[1]->offset);
12697 CheckStreamFrameData("HELLO_WORLD?", visitor_.stream_frames_[1].get());
12698}
12699
fayangd1160ff2020-02-26 11:57:09 -080012700TEST_P(QuicFramerTest, CoalescedPacketWithUdpPadding) {
12701 if (!framer_.version().HasLongHeaderLengths()) {
12702 return;
12703 }
12704 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
12705 // clang-format off
12706 unsigned char packet[] = {
12707 // first coalesced packet
12708 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12709 // 4-byte packet number)
12710 0xD3,
12711 // version
12712 QUIC_VERSION_BYTES,
12713 // destination connection ID length
12714 0x08,
12715 // destination connection ID
12716 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12717 // source connection ID length
12718 0x00,
12719 // long header packet length
12720 0x1E,
12721 // packet number
12722 0x12, 0x34, 0x56, 0x78,
12723 // frame type (stream frame with fin)
12724 0xFE,
12725 // stream id
12726 0x02, 0x03, 0x04,
12727 // offset
12728 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12729 // data length
12730 0x00, 0x0c,
12731 // data
12732 'h', 'e', 'l', 'l',
12733 'o', ' ', 'w', 'o',
12734 'r', 'l', 'd', '!',
12735 // padding
12736 0x00, 0x00, 0x00, 0x00,
12737 0x00, 0x00, 0x00, 0x00,
12738 0x00, 0x00, 0x00, 0x00,
12739 0x00, 0x00, 0x00, 0x00,
12740 0x00, 0x00, 0x00, 0x00,
12741 };
12742 unsigned char packet99[] = {
12743 // first coalesced packet
12744 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12745 // 4-byte packet number)
12746 0xD3,
12747 // version
12748 QUIC_VERSION_BYTES,
12749 // destination connection ID length
12750 0x08,
12751 // destination connection ID
12752 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12753 // source connection ID length
12754 0x00,
12755 // long header packet length
12756 0x1E,
12757 // packet number
12758 0x12, 0x34, 0x56, 0x78,
12759 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12760 0x08 | 0x01 | 0x02 | 0x04,
12761 // stream id
12762 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12763 // offset
12764 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12765 0x32, 0x10, 0x76, 0x54,
12766 // data length
12767 kVarInt62OneByte + 0x0c,
12768 // data
12769 'h', 'e', 'l', 'l',
12770 'o', ' ', 'w', 'o',
12771 'r', 'l', 'd', '!',
12772 // padding
12773 0x00, 0x00, 0x00, 0x00,
12774 0x00, 0x00, 0x00, 0x00,
12775 0x00, 0x00, 0x00, 0x00,
12776 0x00, 0x00, 0x00, 0x00,
12777 0x00, 0x00, 0x00, 0x00,
12778 };
12779 // clang-format on
12780
12781 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -070012782 size_t p_length = ABSL_ARRAYSIZE(packet);
fayangd1160ff2020-02-26 11:57:09 -080012783 if (framer_.version().HasIetfQuicFrames()) {
12784 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -070012785 p_length = ABSL_ARRAYSIZE(packet99);
fayangd1160ff2020-02-26 11:57:09 -080012786 }
12787
12788 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12789 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12790
12791 EXPECT_THAT(framer_.error(), IsQuicNoError());
12792 ASSERT_TRUE(visitor_.header_.get());
12793
12794 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12795 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12796
12797 // Stream ID should be the last 3 bytes of kStreamId.
12798 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12799 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12800 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12801 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12802
12803 EXPECT_EQ(visitor_.coalesced_packets_.size(), 0u);
12804}
12805
12806TEST_P(QuicFramerTest, CoalescedPacketWithDifferentVersion) {
12807 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12808 return;
12809 }
fayangd1160ff2020-02-26 11:57:09 -080012810 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
12811 // clang-format off
12812 unsigned char packet[] = {
12813 // first coalesced packet
12814 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12815 // 4-byte packet number)
12816 0xD3,
12817 // version
12818 QUIC_VERSION_BYTES,
12819 // destination connection ID length
12820 0x08,
12821 // destination connection ID
12822 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12823 // source connection ID length
12824 0x00,
12825 // long header packet length
12826 0x1E,
12827 // packet number
12828 0x12, 0x34, 0x56, 0x78,
12829 // frame type (stream frame with fin)
12830 0xFE,
12831 // stream id
12832 0x02, 0x03, 0x04,
12833 // offset
12834 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12835 // data length
12836 0x00, 0x0c,
12837 // data
12838 'h', 'e', 'l', 'l',
12839 'o', ' ', 'w', 'o',
12840 'r', 'l', 'd', '!',
12841 // second coalesced packet
12842 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12843 // 4-byte packet number)
12844 0xD3,
12845 // garbage version
12846 'G', 'A', 'B', 'G',
12847 // destination connection ID length
12848 0x08,
12849 // destination connection ID
12850 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12851 // source connection ID length
12852 0x00,
12853 // long header packet length
12854 0x1E,
12855 // packet number
12856 0x12, 0x34, 0x56, 0x79,
12857 // frame type (stream frame with fin)
12858 0xFE,
12859 // stream id
12860 0x02, 0x03, 0x04,
12861 // offset
12862 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12863 // data length
12864 0x00, 0x0c,
12865 // data
12866 'H', 'E', 'L', 'L',
12867 'O', '_', 'W', 'O',
12868 'R', 'L', 'D', '?',
12869 };
12870 unsigned char packet99[] = {
12871 // first coalesced packet
12872 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12873 // 4-byte packet number)
12874 0xD3,
12875 // version
12876 QUIC_VERSION_BYTES,
12877 // destination connection ID length
12878 0x08,
12879 // destination connection ID
12880 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12881 // source connection ID length
12882 0x00,
12883 // long header packet length
12884 0x1E,
12885 // packet number
12886 0x12, 0x34, 0x56, 0x78,
12887 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12888 0x08 | 0x01 | 0x02 | 0x04,
12889 // stream id
12890 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12891 // offset
12892 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12893 0x32, 0x10, 0x76, 0x54,
12894 // data length
12895 kVarInt62OneByte + 0x0c,
12896 // data
12897 'h', 'e', 'l', 'l',
12898 'o', ' ', 'w', 'o',
12899 'r', 'l', 'd', '!',
12900 // second coalesced packet
12901 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12902 // 4-byte packet number)
12903 0xD3,
12904 // garbage version
12905 'G', 'A', 'B', 'G',
12906 // destination connection ID length
12907 0x08,
12908 // destination connection ID
12909 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12910 // source connection ID length
12911 0x00,
12912 // long header packet length
12913 0x1E,
12914 // packet number
12915 0x12, 0x34, 0x56, 0x79,
12916 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12917 0x08 | 0x01 | 0x02 | 0x04,
12918 // stream id
12919 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12920 // offset
12921 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12922 0x32, 0x10, 0x76, 0x54,
12923 // data length
12924 kVarInt62OneByte + 0x0c,
12925 // data
12926 'H', 'E', 'L', 'L',
12927 'O', '_', 'W', 'O',
12928 'R', 'L', 'D', '?',
12929 };
12930 // clang-format on
12931
12932 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -070012933 size_t p_length = ABSL_ARRAYSIZE(packet);
fayangd1160ff2020-02-26 11:57:09 -080012934 if (framer_.version().HasIetfQuicFrames()) {
12935 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -070012936 p_length = ABSL_ARRAYSIZE(packet99);
fayangd1160ff2020-02-26 11:57:09 -080012937 }
12938
12939 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12940 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12941
12942 EXPECT_THAT(framer_.error(), IsQuicNoError());
12943 ASSERT_TRUE(visitor_.header_.get());
12944
12945 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12946 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12947
12948 // Stream ID should be the last 3 bytes of kStreamId.
12949 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12950 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12951 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12952 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12953
12954 ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
12955 EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
12956
12957 EXPECT_THAT(framer_.error(), IsQuicNoError());
12958 ASSERT_TRUE(visitor_.header_.get());
12959
12960 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12961 // Verify version mismatch gets reported.
12962 EXPECT_EQ(1, visitor_.version_mismatch_);
12963}
12964
dschinazi4b5a68a2019-08-15 15:45:36 -070012965TEST_P(QuicFramerTest, UndecryptablePacketWithoutDecrypter) {
12966 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12967
12968 if (!framer_.version().KnowsWhichDecrypterToUse()) {
12969 // We create a bad client decrypter by using initial encryption with a
12970 // bogus connection ID; it should fail to decrypt everything.
12971 QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
12972 CrypterPair bogus_crypters;
nharperc8d9e402019-09-12 18:30:14 -070012973 CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12974 framer_.version(),
dschinazi4b5a68a2019-08-15 15:45:36 -070012975 bogus_connection_id, &bogus_crypters);
12976 // This removes all other decrypters.
12977 framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
12978 std::move(bogus_crypters.decrypter));
12979 }
12980
dschinazi4b5a68a2019-08-15 15:45:36 -070012981 // clang-format off
12982 unsigned char packet[] = {
12983 // public flags (version included, 8-byte connection ID,
12984 // 4-byte packet number)
12985 0x28,
12986 // connection_id
12987 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12988 // packet number
12989 0x12, 0x34, 0x56, 0x00,
12990 // padding frames
12991 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12992 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12993 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12994 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12995 };
fayang36825da2019-08-21 14:01:27 -070012996 unsigned char packet46[] = {
dschinazi4b5a68a2019-08-15 15:45:36 -070012997 // public flags (long header with packet type HANDSHAKE and
12998 // 4-byte packet number)
fayang36825da2019-08-21 14:01:27 -070012999 0xE3,
dschinazi4b5a68a2019-08-15 15:45:36 -070013000 // version
13001 QUIC_VERSION_BYTES,
13002 // connection ID lengths
13003 0x05,
13004 // source connection ID
13005 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13006 // long header packet length
13007 0x05,
13008 // packet number
13009 0x12, 0x34, 0x56, 0x00,
13010 // padding frames
13011 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13012 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13013 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13014 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13015 };
dschinazic73506e2019-09-20 13:26:46 -070013016 unsigned char packet49[] = {
dschinazi4b5a68a2019-08-15 15:45:36 -070013017 // public flags (long header with packet type HANDSHAKE and
13018 // 4-byte packet number)
13019 0xE3,
13020 // version
13021 QUIC_VERSION_BYTES,
13022 // destination connection ID length
13023 0x00,
13024 // source connection ID length
13025 0x08,
13026 // source connection ID
13027 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13028 // long header packet length
13029 0x24,
13030 // packet number
13031 0x12, 0x34, 0x56, 0x00,
13032 // padding frames
13033 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13034 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13035 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13036 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13037 };
13038 // clang-format on
13039 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -070013040 size_t p_length = ABSL_ARRAYSIZE(packet);
dschinaziceed8662020-07-14 09:37:05 -070013041 if (framer_.version().HasLongHeaderLengths()) {
dschinazic73506e2019-09-20 13:26:46 -070013042 p = packet49;
vasilvvbed67c62020-10-20 06:38:43 -070013043 p_length = ABSL_ARRAYSIZE(packet49);
dschinaziceed8662020-07-14 09:37:05 -070013044 } else if (framer_.version().HasIetfInvariantHeader()) {
fayang36825da2019-08-21 14:01:27 -070013045 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -070013046 p_length = ABSL_ARRAYSIZE(packet46);
dschinazi4b5a68a2019-08-15 15:45:36 -070013047 }
13048 // First attempt decryption without the handshake crypter.
13049 EXPECT_FALSE(
13050 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false)));
bncf6f82b12019-10-30 07:01:01 -070013051 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
13052 ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
13053 ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
13054 ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
dmcardle8f7df532020-01-07 13:28:57 -080013055 quiche::test::CompareCharArraysWithHexError(
bncf6f82b12019-10-30 07:01:01 -070013056 "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
13057 visitor_.undecryptable_packets_[0]->length(), AsChars(p), p_length);
13058 if (framer_.version().KnowsWhichDecrypterToUse()) {
13059 EXPECT_EQ(ENCRYPTION_HANDSHAKE,
13060 visitor_.undecryptable_decryption_levels_[0]);
13061 }
13062 EXPECT_FALSE(visitor_.undecryptable_has_decryption_keys_[0]);
dschinazi4b5a68a2019-08-15 15:45:36 -070013063}
13064
13065TEST_P(QuicFramerTest, UndecryptablePacketWithDecrypter) {
13066 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13067
13068 // We create a bad client decrypter by using initial encryption with a
13069 // bogus connection ID; it should fail to decrypt everything.
13070 QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
13071 CrypterPair bad_handshake_crypters;
nharperc8d9e402019-09-12 18:30:14 -070013072 CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
13073 framer_.version(), bogus_connection_id,
13074 &bad_handshake_crypters);
dschinazi4b5a68a2019-08-15 15:45:36 -070013075 if (framer_.version().KnowsWhichDecrypterToUse()) {
13076 framer_.InstallDecrypter(ENCRYPTION_HANDSHAKE,
13077 std::move(bad_handshake_crypters.decrypter));
13078 } else {
13079 framer_.SetDecrypter(ENCRYPTION_HANDSHAKE,
13080 std::move(bad_handshake_crypters.decrypter));
13081 }
13082
dschinazi4b5a68a2019-08-15 15:45:36 -070013083 // clang-format off
13084 unsigned char packet[] = {
13085 // public flags (version included, 8-byte connection ID,
13086 // 4-byte packet number)
13087 0x28,
13088 // connection_id
13089 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13090 // packet number
13091 0x12, 0x34, 0x56, 0x00,
13092 // padding frames
13093 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13094 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13095 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13096 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13097 };
fayang36825da2019-08-21 14:01:27 -070013098 unsigned char packet46[] = {
dschinazi4b5a68a2019-08-15 15:45:36 -070013099 // public flags (long header with packet type HANDSHAKE and
13100 // 4-byte packet number)
fayang36825da2019-08-21 14:01:27 -070013101 0xE3,
dschinazi4b5a68a2019-08-15 15:45:36 -070013102 // version
13103 QUIC_VERSION_BYTES,
13104 // connection ID lengths
13105 0x05,
13106 // source connection ID
13107 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13108 // long header packet length
13109 0x05,
13110 // packet number
13111 0x12, 0x34, 0x56, 0x00,
13112 // padding frames
13113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13117 };
dschinazic73506e2019-09-20 13:26:46 -070013118 unsigned char packet49[] = {
dschinazi4b5a68a2019-08-15 15:45:36 -070013119 // public flags (long header with packet type HANDSHAKE and
13120 // 4-byte packet number)
13121 0xE3,
13122 // version
13123 QUIC_VERSION_BYTES,
13124 // destination connection ID length
13125 0x00,
13126 // source connection ID length
13127 0x08,
13128 // source connection ID
13129 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13130 // long header packet length
13131 0x24,
13132 // packet number
13133 0x12, 0x34, 0x56, 0x00,
13134 // padding frames
13135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13136 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13139 };
13140 // clang-format on
13141 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -070013142 size_t p_length = ABSL_ARRAYSIZE(packet);
dschinaziceed8662020-07-14 09:37:05 -070013143 if (framer_.version().HasLongHeaderLengths()) {
dschinazic73506e2019-09-20 13:26:46 -070013144 p = packet49;
vasilvvbed67c62020-10-20 06:38:43 -070013145 p_length = ABSL_ARRAYSIZE(packet49);
dschinaziceed8662020-07-14 09:37:05 -070013146 } else if (framer_.version().HasIetfInvariantHeader()) {
fayang36825da2019-08-21 14:01:27 -070013147 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -070013148 p_length = ABSL_ARRAYSIZE(packet46);
dschinazi4b5a68a2019-08-15 15:45:36 -070013149 }
13150
13151 EXPECT_FALSE(
13152 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false)));
bncf6f82b12019-10-30 07:01:01 -070013153 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
13154 ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
13155 ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
13156 ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
dmcardle8f7df532020-01-07 13:28:57 -080013157 quiche::test::CompareCharArraysWithHexError(
bncf6f82b12019-10-30 07:01:01 -070013158 "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
13159 visitor_.undecryptable_packets_[0]->length(), AsChars(p), p_length);
13160 if (framer_.version().KnowsWhichDecrypterToUse()) {
13161 EXPECT_EQ(ENCRYPTION_HANDSHAKE,
13162 visitor_.undecryptable_decryption_levels_[0]);
13163 }
13164 EXPECT_EQ(framer_.version().KnowsWhichDecrypterToUse(),
13165 visitor_.undecryptable_has_decryption_keys_[0]);
dschinazi4b5a68a2019-08-15 15:45:36 -070013166}
13167
13168TEST_P(QuicFramerTest, UndecryptableCoalescedPacket) {
13169 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
13170 return;
13171 }
13172 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13173 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
13174 // We create a bad client decrypter by using initial encryption with a
13175 // bogus connection ID; it should fail to decrypt everything.
13176 QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
13177 CrypterPair bad_handshake_crypters;
nharperc8d9e402019-09-12 18:30:14 -070013178 CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
13179 framer_.version(), bogus_connection_id,
13180 &bad_handshake_crypters);
dschinazi4b5a68a2019-08-15 15:45:36 -070013181 framer_.InstallDecrypter(ENCRYPTION_HANDSHAKE,
13182 std::move(bad_handshake_crypters.decrypter));
13183 // clang-format off
13184 unsigned char packet[] = {
13185 // first coalesced packet
13186 // public flags (long header with packet type HANDSHAKE and
13187 // 4-byte packet number)
13188 0xE3,
13189 // version
13190 QUIC_VERSION_BYTES,
13191 // destination connection ID length
13192 0x08,
13193 // destination connection ID
13194 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13195 // source connection ID length
13196 0x00,
13197 // long header packet length
13198 0x1E,
13199 // packet number
13200 0x12, 0x34, 0x56, 0x78,
dschinazic73506e2019-09-20 13:26:46 -070013201 // frame type (stream frame with fin)
13202 0xFE,
13203 // stream id
13204 0x02, 0x03, 0x04,
13205 // offset
13206 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
13207 // data length
13208 0x00, 0x0c,
13209 // data
13210 'h', 'e', 'l', 'l',
13211 'o', ' ', 'w', 'o',
13212 'r', 'l', 'd', '!',
13213 // second coalesced packet
13214 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13215 // 4-byte packet number)
13216 0xD3,
13217 // version
13218 QUIC_VERSION_BYTES,
13219 // destination connection ID length
13220 0x08,
13221 // destination connection ID
13222 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13223 // source connection ID length
13224 0x00,
13225 // long header packet length
13226 0x1E,
13227 // packet number
13228 0x12, 0x34, 0x56, 0x79,
13229 // frame type (stream frame with fin)
13230 0xFE,
13231 // stream id
13232 0x02, 0x03, 0x04,
13233 // offset
13234 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
13235 // data length
13236 0x00, 0x0c,
13237 // data
13238 'H', 'E', 'L', 'L',
13239 'O', '_', 'W', 'O',
13240 'R', 'L', 'D', '?',
13241 };
13242 unsigned char packet99[] = {
13243 // first coalesced packet
13244 // public flags (long header with packet type HANDSHAKE and
13245 // 4-byte packet number)
13246 0xE3,
13247 // version
13248 QUIC_VERSION_BYTES,
13249 // destination connection ID length
13250 0x08,
13251 // destination connection ID
13252 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13253 // source connection ID length
13254 0x00,
13255 // long header packet length
13256 0x1E,
13257 // packet number
13258 0x12, 0x34, 0x56, 0x78,
dschinazi4b5a68a2019-08-15 15:45:36 -070013259 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
13260 0x08 | 0x01 | 0x02 | 0x04,
13261 // stream id
13262 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
13263 // offset
13264 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
13265 0x32, 0x10, 0x76, 0x54,
13266 // data length
13267 kVarInt62OneByte + 0x0c,
13268 // data
13269 'h', 'e', 'l', 'l',
13270 'o', ' ', 'w', 'o',
13271 'r', 'l', 'd', '!',
13272 // second coalesced packet
13273 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13274 // 4-byte packet number)
13275 0xD3,
13276 // version
13277 QUIC_VERSION_BYTES,
13278 // destination connection ID length
13279 0x08,
13280 // destination connection ID
13281 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13282 // source connection ID length
13283 0x00,
13284 // long header packet length
13285 0x1E,
13286 // packet number
13287 0x12, 0x34, 0x56, 0x79,
13288 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
13289 0x08 | 0x01 | 0x02 | 0x04,
13290 // stream id
13291 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
13292 // offset
13293 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
13294 0x32, 0x10, 0x76, 0x54,
13295 // data length
13296 kVarInt62OneByte + 0x0c,
13297 // data
13298 'H', 'E', 'L', 'L',
13299 'O', '_', 'W', 'O',
13300 'R', 'L', 'D', '?',
13301 };
13302 // clang-format on
13303 const size_t length_of_first_coalesced_packet = 46;
13304
dschinazic73506e2019-09-20 13:26:46 -070013305 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -070013306 size_t p_length = ABSL_ARRAYSIZE(packet);
dschinazi40f0b3d2020-02-19 17:54:05 -080013307 if (framer_.version().HasIetfQuicFrames()) {
dschinazic73506e2019-09-20 13:26:46 -070013308 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -070013309 p_length = ABSL_ARRAYSIZE(packet99);
dschinazic73506e2019-09-20 13:26:46 -070013310 }
13311
13312 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
13313
dschinazi4b5a68a2019-08-15 15:45:36 -070013314 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
13315
bncf6f82b12019-10-30 07:01:01 -070013316 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
dschinazi4b5a68a2019-08-15 15:45:36 -070013317
bncf6f82b12019-10-30 07:01:01 -070013318 ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
13319 ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
13320 ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
13321 // Make sure we only receive the first undecryptable packet and not the
13322 // full packet including the second coalesced packet.
dmcardle8f7df532020-01-07 13:28:57 -080013323 quiche::test::CompareCharArraysWithHexError(
13324 "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
13325 visitor_.undecryptable_packets_[0]->length(), AsChars(p),
13326 length_of_first_coalesced_packet);
bncf6f82b12019-10-30 07:01:01 -070013327 EXPECT_EQ(ENCRYPTION_HANDSHAKE, visitor_.undecryptable_decryption_levels_[0]);
13328 EXPECT_TRUE(visitor_.undecryptable_has_decryption_keys_[0]);
dschinazi4b5a68a2019-08-15 15:45:36 -070013329
13330 // Make sure the second coalesced packet is parsed correctly.
13331 ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
13332 EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
13333
13334 ASSERT_TRUE(visitor_.header_.get());
13335
13336 ASSERT_EQ(1u, visitor_.stream_frames_.size());
13337 EXPECT_EQ(0u, visitor_.ack_frames_.size());
13338
13339 // Stream ID should be the last 3 bytes of kStreamId.
13340 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
13341 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
13342 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
13343 CheckStreamFrameData("HELLO_WORLD?", visitor_.stream_frames_[0].get());
13344}
13345
QUICHE teama6ef0a62019-03-07 20:34:33 -050013346TEST_P(QuicFramerTest, MismatchedCoalescedPacket) {
13347 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
13348 return;
13349 }
zhongyi546cc452019-04-12 15:27:49 -070013350 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050013351 // clang-format off
13352 unsigned char packet[] = {
13353 // first coalesced packet
13354 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13355 // 4-byte packet number)
13356 0xD3,
13357 // version
13358 QUIC_VERSION_BYTES,
13359 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070013360 0x08,
QUICHE teama6ef0a62019-03-07 20:34:33 -050013361 // destination connection ID
13362 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -070013363 // source connection ID length
13364 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -050013365 // long header packet length
13366 0x1E,
13367 // packet number
13368 0x12, 0x34, 0x56, 0x78,
dschinazic73506e2019-09-20 13:26:46 -070013369 // frame type (stream frame with fin)
13370 0xFE,
13371 // stream id
13372 0x02, 0x03, 0x04,
13373 // offset
13374 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
13375 // data length
13376 0x00, 0x0c,
13377 // data
13378 'h', 'e', 'l', 'l',
13379 'o', ' ', 'w', 'o',
13380 'r', 'l', 'd', '!',
13381 // second coalesced packet
13382 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13383 // 4-byte packet number)
13384 0xD3,
13385 // version
13386 QUIC_VERSION_BYTES,
13387 // destination connection ID length
13388 0x08,
13389 // destination connection ID
13390 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
13391 // source connection ID length
13392 0x00,
13393 // long header packet length
13394 0x1E,
13395 // packet number
13396 0x12, 0x34, 0x56, 0x79,
13397 // frame type (stream frame with fin)
13398 0xFE,
13399 // stream id
13400 0x02, 0x03, 0x04,
13401 // offset
13402 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
13403 // data length
13404 0x00, 0x0c,
13405 // data
13406 'H', 'E', 'L', 'L',
13407 'O', '_', 'W', 'O',
13408 'R', 'L', 'D', '?',
13409 };
13410 unsigned char packet99[] = {
13411 // first coalesced packet
13412 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13413 // 4-byte packet number)
13414 0xD3,
13415 // version
13416 QUIC_VERSION_BYTES,
13417 // destination connection ID length
13418 0x08,
13419 // destination connection ID
13420 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13421 // source connection ID length
13422 0x00,
13423 // long header packet length
13424 0x1E,
13425 // packet number
13426 0x12, 0x34, 0x56, 0x78,
QUICHE teama6ef0a62019-03-07 20:34:33 -050013427 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
13428 0x08 | 0x01 | 0x02 | 0x04,
13429 // stream id
13430 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
13431 // offset
13432 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
13433 0x32, 0x10, 0x76, 0x54,
13434 // data length
13435 kVarInt62OneByte + 0x0c,
13436 // data
13437 'h', 'e', 'l', 'l',
13438 'o', ' ', 'w', 'o',
13439 'r', 'l', 'd', '!',
13440 // second coalesced packet
13441 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13442 // 4-byte packet number)
13443 0xD3,
13444 // version
13445 QUIC_VERSION_BYTES,
13446 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070013447 0x08,
QUICHE teama6ef0a62019-03-07 20:34:33 -050013448 // destination connection ID
13449 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
dschinazi48ac9192019-07-31 00:07:26 -070013450 // source connection ID length
13451 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -050013452 // long header packet length
13453 0x1E,
13454 // packet number
13455 0x12, 0x34, 0x56, 0x79,
13456 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
13457 0x08 | 0x01 | 0x02 | 0x04,
13458 // stream id
13459 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
13460 // offset
13461 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
13462 0x32, 0x10, 0x76, 0x54,
13463 // data length
13464 kVarInt62OneByte + 0x0c,
13465 // data
13466 'H', 'E', 'L', 'L',
13467 'O', '_', 'W', 'O',
13468 'R', 'L', 'D', '?',
13469 };
13470 // clang-format on
13471
dschinazic73506e2019-09-20 13:26:46 -070013472 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -070013473 size_t p_length = ABSL_ARRAYSIZE(packet);
dschinazi40f0b3d2020-02-19 17:54:05 -080013474 if (framer_.version().HasIetfQuicFrames()) {
dschinazic73506e2019-09-20 13:26:46 -070013475 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -070013476 p_length = ABSL_ARRAYSIZE(packet99);
dschinazic73506e2019-09-20 13:26:46 -070013477 }
13478
13479 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
13480
fayang2e445862020-04-06 08:39:22 -070013481 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
QUICHE teama6ef0a62019-03-07 20:34:33 -050013482
bncf6f82b12019-10-30 07:01:01 -070013483 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050013484 ASSERT_TRUE(visitor_.header_.get());
13485
13486 ASSERT_EQ(1u, visitor_.stream_frames_.size());
13487 EXPECT_EQ(0u, visitor_.ack_frames_.size());
13488
13489 // Stream ID should be the last 3 bytes of kStreamId.
13490 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
13491 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
13492 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
13493 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
13494
13495 ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
13496}
13497
13498TEST_P(QuicFramerTest, InvalidCoalescedPacket) {
13499 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
13500 return;
13501 }
zhongyi546cc452019-04-12 15:27:49 -070013502 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050013503 // clang-format off
13504 unsigned char packet[] = {
13505 // first coalesced packet
13506 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13507 // 4-byte packet number)
13508 0xD3,
13509 // version
13510 QUIC_VERSION_BYTES,
13511 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070013512 0x08,
QUICHE teama6ef0a62019-03-07 20:34:33 -050013513 // destination connection ID
13514 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -070013515 // source connection ID length
13516 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -050013517 // long header packet length
13518 0x1E,
13519 // packet number
13520 0x12, 0x34, 0x56, 0x78,
dschinazic73506e2019-09-20 13:26:46 -070013521 // frame type (stream frame with fin)
13522 0xFE,
13523 // stream id
13524 0x02, 0x03, 0x04,
13525 // offset
13526 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
13527 // data length
13528 0x00, 0x0c,
13529 // data
13530 'h', 'e', 'l', 'l',
13531 'o', ' ', 'w', 'o',
13532 'r', 'l', 'd', '!',
13533 // second coalesced packet
13534 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13535 // 4-byte packet number)
13536 0xD3,
13537 // version would be here but we cut off the invalid coalesced header.
13538 };
13539 unsigned char packet99[] = {
13540 // first coalesced packet
13541 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13542 // 4-byte packet number)
13543 0xD3,
13544 // version
13545 QUIC_VERSION_BYTES,
13546 // destination connection ID length
13547 0x08,
13548 // destination connection ID
13549 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13550 // source connection ID length
13551 0x00,
13552 // long header packet length
13553 0x1E,
13554 // packet number
13555 0x12, 0x34, 0x56, 0x78,
QUICHE teama6ef0a62019-03-07 20:34:33 -050013556 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
13557 0x08 | 0x01 | 0x02 | 0x04,
13558 // stream id
13559 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
13560 // offset
13561 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
13562 0x32, 0x10, 0x76, 0x54,
13563 // data length
13564 kVarInt62OneByte + 0x0c,
13565 // data
13566 'h', 'e', 'l', 'l',
13567 'o', ' ', 'w', 'o',
13568 'r', 'l', 'd', '!',
13569 // second coalesced packet
13570 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13571 // 4-byte packet number)
13572 0xD3,
13573 // version would be here but we cut off the invalid coalesced header.
13574 };
13575 // clang-format on
13576
dschinazic73506e2019-09-20 13:26:46 -070013577 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -070013578 size_t p_length = ABSL_ARRAYSIZE(packet);
dschinazi40f0b3d2020-02-19 17:54:05 -080013579 if (framer_.version().HasIetfQuicFrames()) {
dschinazic73506e2019-09-20 13:26:46 -070013580 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -070013581 p_length = ABSL_ARRAYSIZE(packet99);
dschinazic73506e2019-09-20 13:26:46 -070013582 }
13583
13584 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
13585
fayangd1160ff2020-02-26 11:57:09 -080013586 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
QUICHE teama6ef0a62019-03-07 20:34:33 -050013587
bncf6f82b12019-10-30 07:01:01 -070013588 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -050013589 ASSERT_TRUE(visitor_.header_.get());
13590
13591 ASSERT_EQ(1u, visitor_.stream_frames_.size());
13592 EXPECT_EQ(0u, visitor_.ack_frames_.size());
13593
13594 // Stream ID should be the last 3 bytes of kStreamId.
13595 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
13596 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
13597 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
13598 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
13599
13600 ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
13601}
13602
dschinazia484f982019-05-23 03:54:44 -070013603// Some IETF implementations send an initial followed by zeroes instead of
13604// padding inside the initial. We need to make sure that we still process
13605// the initial correctly and ignore the zeroes.
13606TEST_P(QuicFramerTest, CoalescedPacketWithZeroesRoundTrip) {
nharperc8d9e402019-09-12 18:30:14 -070013607 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version()) ||
13608 !framer_.version().UsesInitialObfuscators()) {
dschinazia484f982019-05-23 03:54:44 -070013609 return;
13610 }
13611 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13612 QuicConnectionId connection_id = FramerTestConnectionId();
13613 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13614
13615 CrypterPair client_crypters;
nharperc8d9e402019-09-12 18:30:14 -070013616 CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
13617 framer_.version(), connection_id,
13618 &client_crypters);
dschinazia484f982019-05-23 03:54:44 -070013619 framer_.SetEncrypter(ENCRYPTION_INITIAL,
13620 std::move(client_crypters.encrypter));
13621
13622 QuicPacketHeader header;
13623 header.destination_connection_id = connection_id;
13624 header.version_flag = true;
13625 header.packet_number = kPacketNumber;
13626 header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
13627 header.long_packet_type = INITIAL;
13628 header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
13629 header.retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_1;
nharper965e5922019-09-23 22:33:54 -070013630 QuicFrames frames = {QuicFrame(QuicPingFrame()),
13631 QuicFrame(QuicPaddingFrame(3))};
dschinazia484f982019-05-23 03:54:44 -070013632
13633 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13634 ASSERT_NE(nullptr, data);
13635
13636 // Add zeroes after the valid initial packet.
13637 unsigned char packet[kMaxOutgoingPacketSize] = {};
13638 size_t encrypted_length =
13639 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number, *data,
vasilvvbed67c62020-10-20 06:38:43 -070013640 AsChars(packet), ABSL_ARRAYSIZE(packet));
dschinazia484f982019-05-23 03:54:44 -070013641 ASSERT_NE(0u, encrypted_length);
13642
13643 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13644 CrypterPair server_crypters;
nharperc8d9e402019-09-12 18:30:14 -070013645 CryptoUtils::CreateInitialObfuscators(Perspective::IS_SERVER,
13646 framer_.version(), connection_id,
13647 &server_crypters);
dschinazia484f982019-05-23 03:54:44 -070013648 framer_.InstallDecrypter(ENCRYPTION_INITIAL,
13649 std::move(server_crypters.decrypter));
13650
13651 // Make sure the first long header initial packet parses correctly.
vasilvvbed67c62020-10-20 06:38:43 -070013652 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
dschinazia484f982019-05-23 03:54:44 -070013653
13654 // Make sure we discard the subsequent zeroes.
fayangd1160ff2020-02-26 11:57:09 -080013655 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
13656 EXPECT_TRUE(visitor_.coalesced_packets_.empty());
dschinazia484f982019-05-23 03:54:44 -070013657}
13658
dschinazie0df3f72019-05-06 16:37:51 -070013659TEST_P(QuicFramerTest, ClientReceivesInvalidVersion) {
dschinaziceed8662020-07-14 09:37:05 -070013660 if (!framer_.version().HasIetfInvariantHeader()) {
dschinazie0df3f72019-05-06 16:37:51 -070013661 return;
13662 }
13663 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13664
13665 // clang-format off
13666 unsigned char packet[] = {
13667 // public flags (long header with packet type INITIAL)
fayang36825da2019-08-21 14:01:27 -070013668 0xC3,
dschinazie0df3f72019-05-06 16:37:51 -070013669 // version that is different from the framer's version
13670 'Q', '0', '4', '3',
13671 // connection ID lengths
13672 0x05,
13673 // source connection ID
13674 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13675 // packet number
13676 0x01,
13677 // padding frame
13678 0x00,
13679 };
13680 // clang-format on
13681
vasilvvbed67c62020-10-20 06:38:43 -070013682 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
dschinazie0df3f72019-05-06 16:37:51 -070013683 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
13684
bncf6f82b12019-10-30 07:01:01 -070013685 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_VERSION));
dschinazie0df3f72019-05-06 16:37:51 -070013686 EXPECT_EQ("Client received unexpected version.", framer_.detailed_error());
13687}
13688
QUICHE teama6ef0a62019-03-07 20:34:33 -050013689TEST_P(QuicFramerTest, PacketHeaderWithVariableLengthConnectionId) {
dschinazi97da52b2020-01-13 15:44:43 -080013690 if (!framer_.version().AllowsVariableLengthConnectionIds()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050013691 return;
13692 }
zhongyi546cc452019-04-12 15:27:49 -070013693 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050013694 char connection_id_bytes[9] = {0xFE, 0xDC, 0xBA, 0x98, 0x76,
13695 0x54, 0x32, 0x10, 0x42};
13696 QuicConnectionId connection_id(connection_id_bytes,
13697 sizeof(connection_id_bytes));
13698 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
dschinazi8ff74822019-05-28 16:37:20 -070013699 QuicFramerPeer::SetExpectedServerConnectionIDLength(&framer_,
13700 connection_id.length());
QUICHE teama6ef0a62019-03-07 20:34:33 -050013701
13702 // clang-format off
13703 PacketFragments packet = {
13704 // type (8 byte connection_id and 1 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -070013705 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050013706 {0x40}},
13707 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -070013708 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050013709 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
13710 // packet number
13711 {"Unable to read packet number.",
13712 {0x78}},
13713 };
nharper55fa6132019-05-07 19:37:21 -070013714
13715 PacketFragments packet_with_padding = {
13716 // type (8 byte connection_id and 1 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -070013717 {"Unable to read first byte.",
nharper55fa6132019-05-07 19:37:21 -070013718 {0x40}},
13719 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -070013720 {"Unable to read destination connection ID.",
nharper55fa6132019-05-07 19:37:21 -070013721 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
13722 // packet number
13723 {"",
13724 {0x78}},
13725 // padding
13726 {"", {0x00, 0x00, 0x00}},
13727 };
QUICHE teama6ef0a62019-03-07 20:34:33 -050013728 // clang-format on
13729
nharper55fa6132019-05-07 19:37:21 -070013730 PacketFragments& fragments =
13731 framer_.version().HasHeaderProtection() ? packet_with_padding : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -050013732 std::unique_ptr<QuicEncryptedPacket> encrypted(
nharper55fa6132019-05-07 19:37:21 -070013733 AssemblePacketFromFragments(fragments));
13734 if (framer_.version().HasHeaderProtection()) {
13735 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -070013736 EXPECT_THAT(framer_.error(), IsQuicNoError());
nharper55fa6132019-05-07 19:37:21 -070013737 } else {
13738 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -070013739 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
nharper55fa6132019-05-07 19:37:21 -070013740 }
QUICHE teama6ef0a62019-03-07 20:34:33 -050013741 ASSERT_TRUE(visitor_.header_.get());
13742 EXPECT_EQ(connection_id, visitor_.header_->destination_connection_id);
13743 EXPECT_FALSE(visitor_.header_->reset_flag);
13744 EXPECT_FALSE(visitor_.header_->version_flag);
13745 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
13746 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
13747
nharper55fa6132019-05-07 19:37:21 -070013748 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
QUICHE teama6ef0a62019-03-07 20:34:33 -050013749}
13750
QUICHE team10b22a12019-03-21 15:31:42 -070013751TEST_P(QuicFramerTest, MultiplePacketNumberSpaces) {
dschinaziceed8662020-07-14 09:37:05 -070013752 if (!framer_.version().HasIetfInvariantHeader()) {
QUICHE team10b22a12019-03-21 15:31:42 -070013753 return;
13754 }
QUICHE team10b22a12019-03-21 15:31:42 -070013755 framer_.EnableMultiplePacketNumberSpacesSupport();
13756
13757 // clang-format off
13758 unsigned char long_header_packet[] = {
13759 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13760 // 4-byte packet number)
13761 0xD3,
13762 // version
13763 QUIC_VERSION_BYTES,
13764 // destination connection ID length
fayang91475c42019-06-19 08:04:26 -070013765 0x50,
QUICHE team10b22a12019-03-21 15:31:42 -070013766 // destination connection ID
fayang91475c42019-06-19 08:04:26 -070013767 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
QUICHE team10b22a12019-03-21 15:31:42 -070013768 // packet number
13769 0x12, 0x34, 0x56, 0x78,
13770 // padding frame
13771 0x00,
13772 };
13773 unsigned char long_header_packet99[] = {
13774 // public flags (long header with packet type ZERO_RTT_PROTECTED and
13775 // 4-byte packet number)
13776 0xD3,
13777 // version
13778 QUIC_VERSION_BYTES,
13779 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070013780 0x08,
QUICHE team10b22a12019-03-21 15:31:42 -070013781 // destination connection ID
fayang91475c42019-06-19 08:04:26 -070013782 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -070013783 // source connection ID length
13784 0x00,
QUICHE team10b22a12019-03-21 15:31:42 -070013785 // long header packet length
13786 0x05,
13787 // packet number
13788 0x12, 0x34, 0x56, 0x78,
13789 // padding frame
13790 0x00,
13791 };
13792 // clang-format on
13793
zhongyi546cc452019-04-12 15:27:49 -070013794 if (framer_.version().KnowsWhichDecrypterToUse()) {
13795 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
vasilvv0fc587f2019-09-06 13:33:08 -070013796 std::make_unique<TestDecrypter>());
zhongyi546cc452019-04-12 15:27:49 -070013797 framer_.RemoveDecrypter(ENCRYPTION_INITIAL);
13798 } else {
vasilvv0fc587f2019-09-06 13:33:08 -070013799 framer_.SetDecrypter(ENCRYPTION_ZERO_RTT,
13800 std::make_unique<TestDecrypter>());
zhongyi546cc452019-04-12 15:27:49 -070013801 }
QUICHE team10b22a12019-03-21 15:31:42 -070013802 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
13803 EXPECT_TRUE(framer_.ProcessPacket(
13804 QuicEncryptedPacket(AsChars(long_header_packet),
vasilvvbed67c62020-10-20 06:38:43 -070013805 ABSL_ARRAYSIZE(long_header_packet), false)));
QUICHE team10b22a12019-03-21 15:31:42 -070013806 } else {
13807 EXPECT_TRUE(framer_.ProcessPacket(
13808 QuicEncryptedPacket(AsChars(long_header_packet99),
vasilvvbed67c62020-10-20 06:38:43 -070013809 ABSL_ARRAYSIZE(long_header_packet99), false)));
QUICHE team10b22a12019-03-21 15:31:42 -070013810 }
13811
bncf6f82b12019-10-30 07:01:01 -070013812 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE team10b22a12019-03-21 15:31:42 -070013813 EXPECT_FALSE(
13814 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
13815 .IsInitialized());
13816 EXPECT_FALSE(
13817 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
13818 .IsInitialized());
13819 EXPECT_EQ(kPacketNumber, QuicFramerPeer::GetLargestDecryptedPacketNumber(
13820 &framer_, APPLICATION_DATA));
13821
13822 // clang-format off
13823 unsigned char short_header_packet[] = {
13824 // type (short header, 1 byte packet number)
13825 0x40,
13826 // connection_id
fayang91475c42019-06-19 08:04:26 -070013827 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
QUICHE team10b22a12019-03-21 15:31:42 -070013828 // packet number
13829 0x79,
13830 // padding frame
nharper55fa6132019-05-07 19:37:21 -070013831 0x00, 0x00, 0x00,
QUICHE team10b22a12019-03-21 15:31:42 -070013832 };
13833 // clang-format on
13834
13835 QuicEncryptedPacket short_header_encrypted(
vasilvvbed67c62020-10-20 06:38:43 -070013836 AsChars(short_header_packet), ABSL_ARRAYSIZE(short_header_packet), false);
zhongyi546cc452019-04-12 15:27:49 -070013837 if (framer_.version().KnowsWhichDecrypterToUse()) {
13838 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -070013839 std::make_unique<TestDecrypter>());
zhongyi546cc452019-04-12 15:27:49 -070013840 framer_.RemoveDecrypter(ENCRYPTION_ZERO_RTT);
13841 } else {
13842 framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -070013843 std::make_unique<TestDecrypter>());
zhongyi546cc452019-04-12 15:27:49 -070013844 }
QUICHE team10b22a12019-03-21 15:31:42 -070013845 EXPECT_TRUE(framer_.ProcessPacket(short_header_encrypted));
13846
bncf6f82b12019-10-30 07:01:01 -070013847 EXPECT_THAT(framer_.error(), IsQuicNoError());
QUICHE team10b22a12019-03-21 15:31:42 -070013848 EXPECT_FALSE(
13849 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
13850 .IsInitialized());
13851 EXPECT_FALSE(
13852 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
13853 .IsInitialized());
13854 EXPECT_EQ(kPacketNumber + 1, QuicFramerPeer::GetLargestDecryptedPacketNumber(
13855 &framer_, APPLICATION_DATA));
13856}
13857
nharper2ceb97c2019-04-19 11:38:59 -070013858TEST_P(QuicFramerTest, IetfRetryPacketRejected) {
dschinazi244f6dc2019-05-06 15:45:16 -070013859 if (!framer_.version().KnowsWhichDecrypterToUse() ||
13860 framer_.version().SupportsRetry()) {
nharper2ceb97c2019-04-19 11:38:59 -070013861 return;
13862 }
13863
13864 // clang-format off
fayang36825da2019-08-21 14:01:27 -070013865 PacketFragments packet46 = {
nharper9bb83462019-05-01 10:53:22 -070013866 // public flags (IETF Retry packet, 0-length original destination CID)
dschinazi48ac9192019-07-31 00:07:26 -070013867 {"Unable to read first byte.",
nharper9bb83462019-05-01 10:53:22 -070013868 {0xf0}},
13869 // version tag
13870 {"Unable to read protocol version.",
13871 {QUIC_VERSION_BYTES}},
13872 // connection_id length
dschinazi244f6dc2019-05-06 15:45:16 -070013873 {"RETRY not supported in this version.",
nharper2ceb97c2019-04-19 11:38:59 -070013874 {0x00}},
13875 };
13876 // clang-format on
13877
13878 std::unique_ptr<QuicEncryptedPacket> encrypted(
fayang36825da2019-08-21 14:01:27 -070013879 AssemblePacketFromFragments(packet46));
nharper2ceb97c2019-04-19 11:38:59 -070013880
13881 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -070013882 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
fayang36825da2019-08-21 14:01:27 -070013883 CheckFramingBoundaries(packet46, QUIC_INVALID_PACKET_HEADER);
nharper2ceb97c2019-04-19 11:38:59 -070013884}
13885
13886TEST_P(QuicFramerTest, RetryPacketRejectedWithMultiplePacketNumberSpaces) {
dschinaziceed8662020-07-14 09:37:05 -070013887 if (!framer_.version().HasIetfInvariantHeader() ||
dschinazi244f6dc2019-05-06 15:45:16 -070013888 framer_.version().SupportsRetry()) {
nharper2ceb97c2019-04-19 11:38:59 -070013889 return;
13890 }
13891 framer_.EnableMultiplePacketNumberSpacesSupport();
13892
13893 // clang-format off
13894 PacketFragments packet = {
13895 // public flags (IETF Retry packet, 0-length original destination CID)
dschinazi48ac9192019-07-31 00:07:26 -070013896 {"Unable to read first byte.",
nharper2ceb97c2019-04-19 11:38:59 -070013897 {0xf0}},
13898 // version tag
13899 {"Unable to read protocol version.",
13900 {QUIC_VERSION_BYTES}},
13901 // connection_id length
dschinazi244f6dc2019-05-06 15:45:16 -070013902 {"RETRY not supported in this version.",
nharper2ceb97c2019-04-19 11:38:59 -070013903 {0x00}},
13904 };
13905 // clang-format on
13906
13907 std::unique_ptr<QuicEncryptedPacket> encrypted(
13908 AssemblePacketFromFragments(packet));
13909
13910 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -070013911 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
nharper2ceb97c2019-04-19 11:38:59 -070013912 CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
13913}
13914
nharpera745e392019-04-19 12:05:15 -070013915TEST_P(QuicFramerTest, ProcessPublicHeaderNoVersionInferredType) {
13916 // The framer needs to have Perspective::IS_SERVER and configured to infer the
13917 // packet header type from the packet (not the version). The framer's version
13918 // needs to be one that uses the IETF packet format.
13919 if (!framer_.version().KnowsWhichDecrypterToUse()) {
13920 return;
13921 }
13922 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13923
13924 // Prepare a packet that uses the Google QUIC packet header but has no version
13925 // field.
13926
13927 // clang-format off
13928 PacketFragments packet = {
13929 // public flags (1-byte packet number, 8-byte connection_id, no version)
13930 {"Unable to read public flags.",
13931 {0x08}},
13932 // connection_id
13933 {"Unable to read ConnectionId.",
13934 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
13935 // packet number
13936 {"Unable to read packet number.",
13937 {0x01}},
13938 // padding
13939 {"Invalid public header type for expected version.",
13940 {0x00}},
13941 };
13942 // clang-format on
13943
13944 PacketFragments& fragments = packet;
13945
13946 std::unique_ptr<QuicEncryptedPacket> encrypted(
13947 AssemblePacketFromFragments(fragments));
13948
13949 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -070013950 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
nharper8b6d63a2019-05-03 10:34:53 -070013951 EXPECT_EQ("Invalid public header type for expected version.",
13952 framer_.detailed_error());
nharpera745e392019-04-19 12:05:15 -070013953 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
13954}
13955
nharper3f283562019-05-02 16:37:12 -070013956TEST_P(QuicFramerTest, ProcessMismatchedHeaderVersion) {
13957 // The framer needs to have Perspective::IS_SERVER and configured to infer the
13958 // packet header type from the packet (not the version). The framer's version
13959 // needs to be one that uses the IETF packet format.
13960 if (!framer_.version().KnowsWhichDecrypterToUse()) {
13961 return;
13962 }
13963 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13964
13965 // clang-format off
13966 PacketFragments packet = {
dschinazi072da7c2019-05-07 17:57:42 -070013967 // public flags (Google QUIC header with version present)
nharper3f283562019-05-02 16:37:12 -070013968 {"Unable to read public flags.",
13969 {0x09}},
13970 // connection_id
13971 {"Unable to read ConnectionId.",
13972 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
13973 // version tag
13974 {"Unable to read protocol version.",
13975 {QUIC_VERSION_BYTES}},
13976 // packet number
13977 {"Unable to read packet number.",
13978 {0x01}},
13979 };
13980 // clang-format on
13981
13982 std::unique_ptr<QuicEncryptedPacket> encrypted(
13983 AssemblePacketFromFragments(packet));
13984 framer_.ProcessPacket(*encrypted);
13985
13986 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
bncf6f82b12019-10-30 07:01:01 -070013987 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
nharper8b6d63a2019-05-03 10:34:53 -070013988 EXPECT_EQ("Invalid public header type for expected version.",
13989 framer_.detailed_error());
nharper3f283562019-05-02 16:37:12 -070013990 CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
13991}
13992
dschinazi48ac9192019-07-31 00:07:26 -070013993TEST_P(QuicFramerTest, WriteClientVersionNegotiationProbePacket) {
dschinazi48ac9192019-07-31 00:07:26 -070013994 // clang-format off
13995 static const char expected_packet[1200] = {
13996 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13997 0xc0,
13998 // Version, part of the IETF space reserved for negotiation.
13999 0xca, 0xba, 0xda, 0xda,
14000 // Destination connection ID length 8.
14001 0x08,
14002 // 8-byte destination connection ID.
14003 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
14004 // Source connection ID length 0.
14005 0x00,
14006 // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
14007 // not parse with any known version.
14008 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14009 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
14010 // zeroes to pad to 16 byte boundary.
14011 0x00,
14012 // A polite greeting in case a human sees this in tcpdump.
14013 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
14014 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
14015 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
14016 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
14017 0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
14018 0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
14019 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
14020 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
14021 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
14022 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
14023 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
14024 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
14025 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
14026 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
14027 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
14028 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
14029 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
14030 0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
14031 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
14032 0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
14033 0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
14034 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
14035 0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
14036 };
14037 // clang-format on
14038 char packet[1200];
14039 char destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
14040 0x6c, 0x7a, 0x20, 0x21};
14041 EXPECT_TRUE(QuicFramer::WriteClientVersionNegotiationProbePacket(
14042 packet, sizeof(packet), destination_connection_id_bytes,
14043 sizeof(destination_connection_id_bytes)));
dmcardle8f7df532020-01-07 13:28:57 -080014044 quiche::test::CompareCharArraysWithHexError("constructed packet", packet,
14045 sizeof(packet), expected_packet,
14046 sizeof(expected_packet));
dschinazi48ac9192019-07-31 00:07:26 -070014047 QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
14048 sizeof(packet), false);
dschinazic73506e2019-09-20 13:26:46 -070014049 if (!framer_.version().HasLengthPrefixedConnectionIds()) {
14050 // We can only parse the connection ID with a parser expecting
14051 // length-prefixed connection IDs.
dschinazi48ac9192019-07-31 00:07:26 -070014052 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
14053 return;
14054 }
14055 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
14056 ASSERT_TRUE(visitor_.header_.get());
14057 QuicConnectionId probe_payload_connection_id(
14058 reinterpret_cast<const char*>(destination_connection_id_bytes),
14059 sizeof(destination_connection_id_bytes));
14060 EXPECT_EQ(probe_payload_connection_id,
14061 visitor_.header_.get()->destination_connection_id);
14062}
14063
14064TEST_P(QuicFramerTest, DispatcherParseOldClientVersionNegotiationProbePacket) {
14065 // clang-format off
14066 static const char packet[1200] = {
14067 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
14068 0xc0,
14069 // Version, part of the IETF space reserved for negotiation.
14070 0xca, 0xba, 0xda, 0xba,
14071 // Destination connection ID length 8, source connection ID length 0.
14072 0x50,
14073 // 8-byte destination connection ID.
14074 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
14075 // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
14076 // not parse with any known version.
14077 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14078 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
14079 // 2 bytes of zeroes to pad to 16 byte boundary.
14080 0x00, 0x00,
14081 // A polite greeting in case a human sees this in tcpdump.
14082 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
14083 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
14084 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
14085 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
14086 0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
14087 0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
14088 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
14089 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
14090 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
14091 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
14092 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
14093 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
14094 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
14095 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
14096 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
14097 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
14098 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
14099 0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
14100 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
14101 0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
14102 0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
14103 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
14104 0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
14105 };
14106 // clang-format on
14107 char expected_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
14108 0x6c, 0x7a, 0x20, 0x21};
14109 QuicConnectionId expected_destination_connection_id(
14110 reinterpret_cast<const char*>(expected_destination_connection_id_bytes),
14111 sizeof(expected_destination_connection_id_bytes));
14112
14113 QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
14114 sizeof(packet));
14115 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
fayange3f2f7b2019-09-19 17:01:57 -070014116 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
dschinazi48ac9192019-07-31 00:07:26 -070014117 bool version_present = false, has_length_prefix = true;
14118 QuicVersionLabel version_label = 33;
14119 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
14120 QuicConnectionId destination_connection_id = TestConnectionId(1);
14121 QuicConnectionId source_connection_id = TestConnectionId(2);
14122 bool retry_token_present = true;
vasilvvc872ee42020-10-07 19:50:22 -070014123 absl::string_view retry_token;
dschinazi48ac9192019-07-31 00:07:26 -070014124 std::string detailed_error = "foobar";
14125 QuicErrorCode header_parse_result = QuicFramer::ParsePublicHeaderDispatcher(
fayange3f2f7b2019-09-19 17:01:57 -070014126 encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
14127 &version_present, &has_length_prefix, &version_label, &parsed_version,
dschinazi48ac9192019-07-31 00:07:26 -070014128 &destination_connection_id, &source_connection_id, &retry_token_present,
14129 &retry_token, &detailed_error);
bncf6f82b12019-10-30 07:01:01 -070014130 EXPECT_THAT(header_parse_result, IsQuicNoError());
dschinazi48ac9192019-07-31 00:07:26 -070014131 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
14132 EXPECT_TRUE(version_present);
14133 EXPECT_FALSE(has_length_prefix);
14134 EXPECT_EQ(0xcabadaba, version_label);
14135 EXPECT_EQ(expected_destination_connection_id, destination_connection_id);
14136 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
14137 EXPECT_FALSE(retry_token_present);
14138 EXPECT_EQ("", detailed_error);
14139}
14140
14141TEST_P(QuicFramerTest, DispatcherParseClientVersionNegotiationProbePacket) {
14142 // clang-format off
14143 static const char packet[1200] = {
14144 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
14145 0xc0,
14146 // Version, part of the IETF space reserved for negotiation.
14147 0xca, 0xba, 0xda, 0xba,
14148 // Destination connection ID length 8.
14149 0x08,
14150 // 8-byte destination connection ID.
14151 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
14152 // Source connection ID length 0.
14153 0x00,
14154 // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
14155 // not parse with any known version.
14156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14157 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
14158 // 1 byte of zeroes to pad to 16 byte boundary.
14159 0x00,
14160 // A polite greeting in case a human sees this in tcpdump.
14161 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
14162 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
14163 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
14164 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
14165 0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
14166 0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
14167 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
14168 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
14169 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
14170 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
14171 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
14172 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
14173 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
14174 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
14175 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
14176 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
14177 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
14178 0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
14179 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
14180 0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
14181 0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
14182 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
14183 0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
14184 };
14185 // clang-format on
14186 char expected_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
14187 0x6c, 0x7a, 0x20, 0x21};
14188 QuicConnectionId expected_destination_connection_id(
14189 reinterpret_cast<const char*>(expected_destination_connection_id_bytes),
14190 sizeof(expected_destination_connection_id_bytes));
14191
14192 QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
14193 sizeof(packet));
14194 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
fayange3f2f7b2019-09-19 17:01:57 -070014195 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
dschinazi48ac9192019-07-31 00:07:26 -070014196 bool version_present = false, has_length_prefix = false;
14197 QuicVersionLabel version_label = 33;
14198 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
14199 QuicConnectionId destination_connection_id = TestConnectionId(1);
14200 QuicConnectionId source_connection_id = TestConnectionId(2);
14201 bool retry_token_present = true;
vasilvvc872ee42020-10-07 19:50:22 -070014202 absl::string_view retry_token;
dschinazi48ac9192019-07-31 00:07:26 -070014203 std::string detailed_error = "foobar";
14204 QuicErrorCode header_parse_result = QuicFramer::ParsePublicHeaderDispatcher(
fayange3f2f7b2019-09-19 17:01:57 -070014205 encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
14206 &version_present, &has_length_prefix, &version_label, &parsed_version,
dschinazi48ac9192019-07-31 00:07:26 -070014207 &destination_connection_id, &source_connection_id, &retry_token_present,
14208 &retry_token, &detailed_error);
bncf6f82b12019-10-30 07:01:01 -070014209 EXPECT_THAT(header_parse_result, IsQuicNoError());
dschinazi48ac9192019-07-31 00:07:26 -070014210 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
14211 EXPECT_TRUE(version_present);
14212 EXPECT_TRUE(has_length_prefix);
14213 EXPECT_EQ(0xcabadaba, version_label);
14214 EXPECT_EQ(expected_destination_connection_id, destination_connection_id);
14215 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
14216 EXPECT_EQ("", detailed_error);
14217}
14218
dschinazi48ac9192019-07-31 00:07:26 -070014219TEST_P(QuicFramerTest, ParseServerVersionNegotiationProbeResponse) {
dschinazi48ac9192019-07-31 00:07:26 -070014220 // clang-format off
14221 const char packet[] = {
14222 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
14223 0xc0,
14224 // Version of 0, indicating version negotiation.
14225 0x00, 0x00, 0x00, 0x00,
14226 // Destination connection ID length 0, source connection ID length 8.
14227 0x00, 0x08,
14228 // 8-byte source connection ID.
14229 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
14230 // A few supported versions.
14231 0xaa, 0xaa, 0xaa, 0xaa,
14232 QUIC_VERSION_BYTES,
14233 };
14234 // clang-format on
14235 char probe_payload_bytes[] = {0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21};
dschinazib012d212019-08-01 18:07:26 -070014236 char parsed_probe_payload_bytes[255] = {};
dschinazi9d3ba8d2020-10-07 16:18:07 -070014237 uint8_t parsed_probe_payload_length = sizeof(parsed_probe_payload_bytes);
dschinazi48ac9192019-07-31 00:07:26 -070014238 std::string parse_detailed_error = "";
14239 EXPECT_TRUE(QuicFramer::ParseServerVersionNegotiationProbeResponse(
14240 reinterpret_cast<const char*>(packet), sizeof(packet),
14241 reinterpret_cast<char*>(parsed_probe_payload_bytes),
14242 &parsed_probe_payload_length, &parse_detailed_error));
14243 EXPECT_EQ("", parse_detailed_error);
dmcardle8f7df532020-01-07 13:28:57 -080014244 quiche::test::CompareCharArraysWithHexError(
dschinazi48ac9192019-07-31 00:07:26 -070014245 "parsed probe", parsed_probe_payload_bytes, parsed_probe_payload_length,
14246 probe_payload_bytes, sizeof(probe_payload_bytes));
dschinazide0f6dc2019-05-15 16:10:11 -070014247}
14248
dschinazi9d3ba8d2020-10-07 16:18:07 -070014249TEST_P(QuicFramerTest, ParseClientVersionNegotiationProbePacket) {
dschinazi9d3ba8d2020-10-07 16:18:07 -070014250 char packet[1200];
14251 char input_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
14252 0x6c, 0x7a, 0x20, 0x21};
14253 ASSERT_TRUE(QuicFramer::WriteClientVersionNegotiationProbePacket(
14254 packet, sizeof(packet), input_destination_connection_id_bytes,
14255 sizeof(input_destination_connection_id_bytes)));
14256 char parsed_destination_connection_id_bytes[255] = {0};
14257 uint8_t parsed_destination_connection_id_length =
14258 sizeof(parsed_destination_connection_id_bytes);
14259 ASSERT_TRUE(ParseClientVersionNegotiationProbePacket(
14260 packet, sizeof(packet), parsed_destination_connection_id_bytes,
14261 &parsed_destination_connection_id_length));
14262 quiche::test::CompareCharArraysWithHexError(
14263 "parsed destination connection ID",
14264 parsed_destination_connection_id_bytes,
14265 parsed_destination_connection_id_length,
14266 input_destination_connection_id_bytes,
14267 sizeof(input_destination_connection_id_bytes));
14268}
14269
14270TEST_P(QuicFramerTest, WriteServerVersionNegotiationProbeResponse) {
dschinazi9d3ba8d2020-10-07 16:18:07 -070014271 char packet[1200];
14272 size_t packet_length = sizeof(packet);
14273 char input_source_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
14274 0x6c, 0x7a, 0x20, 0x21};
14275 ASSERT_TRUE(WriteServerVersionNegotiationProbeResponse(
14276 packet, &packet_length, input_source_connection_id_bytes,
14277 sizeof(input_source_connection_id_bytes)));
14278 char parsed_source_connection_id_bytes[255] = {0};
14279 uint8_t parsed_source_connection_id_length =
14280 sizeof(parsed_source_connection_id_bytes);
14281 std::string detailed_error;
14282 ASSERT_TRUE(QuicFramer::ParseServerVersionNegotiationProbeResponse(
14283 packet, packet_length, parsed_source_connection_id_bytes,
14284 &parsed_source_connection_id_length, &detailed_error))
14285 << detailed_error;
14286 quiche::test::CompareCharArraysWithHexError(
14287 "parsed destination connection ID", parsed_source_connection_id_bytes,
14288 parsed_source_connection_id_length, input_source_connection_id_bytes,
14289 sizeof(input_source_connection_id_bytes));
14290}
14291
dschinazi346b7ce2019-06-05 01:38:18 -070014292TEST_P(QuicFramerTest, ClientConnectionIdFromLongHeaderToClient) {
dschinaziceed8662020-07-14 09:37:05 -070014293 if (!framer_.version().HasIetfInvariantHeader()) {
dschinazi7d066ca2019-05-15 17:59:49 -070014294 // This test requires an IETF long header.
14295 return;
14296 }
dschinazi346b7ce2019-06-05 01:38:18 -070014297 SetDecrypterLevel(ENCRYPTION_HANDSHAKE);
dschinazi7d066ca2019-05-15 17:59:49 -070014298 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
dschinazi7d066ca2019-05-15 17:59:49 -070014299 // clang-format off
14300 unsigned char packet[] = {
dschinazi346b7ce2019-06-05 01:38:18 -070014301 // public flags (long header with packet type HANDSHAKE and
dschinazi7d066ca2019-05-15 17:59:49 -070014302 // 4-byte packet number)
fayang36825da2019-08-21 14:01:27 -070014303 0xE3,
dschinazi7d066ca2019-05-15 17:59:49 -070014304 // version
14305 QUIC_VERSION_BYTES,
dschinazi346b7ce2019-06-05 01:38:18 -070014306 // connection ID lengths
dschinazi7d066ca2019-05-15 17:59:49 -070014307 0x50,
14308 // destination connection ID
14309 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
14310 // long header packet length
14311 0x05,
14312 // packet number
14313 0x12, 0x34, 0x56, 0x00,
14314 // padding frame
14315 0x00,
14316 };
dschinazic73506e2019-09-20 13:26:46 -070014317 unsigned char packet49[] = {
dschinazi48ac9192019-07-31 00:07:26 -070014318 // public flags (long header with packet type HANDSHAKE and
14319 // 4-byte packet number)
14320 0xE3,
14321 // version
14322 QUIC_VERSION_BYTES,
14323 // destination connection ID length
14324 0x08,
14325 // destination connection ID
14326 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
14327 // source connection ID length
14328 0x00,
14329 // long header packet length
14330 0x05,
14331 // packet number
14332 0x12, 0x34, 0x56, 0x00,
14333 // padding frame
14334 0x00,
14335 };
dschinazi7d066ca2019-05-15 17:59:49 -070014336 // clang-format on
dschinazi48ac9192019-07-31 00:07:26 -070014337 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -070014338 size_t p_length = ABSL_ARRAYSIZE(packet);
dschinaziceed8662020-07-14 09:37:05 -070014339 if (framer_.version().HasLongHeaderLengths()) {
dschinazic73506e2019-09-20 13:26:46 -070014340 p = packet49;
vasilvvbed67c62020-10-20 06:38:43 -070014341 p_length = ABSL_ARRAYSIZE(packet49);
dschinazi48ac9192019-07-31 00:07:26 -070014342 }
14343 const bool parse_success =
14344 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false));
dschinazi97da52b2020-01-13 15:44:43 -080014345 if (!framer_.version().AllowsVariableLengthConnectionIds()) {
dschinazi346b7ce2019-06-05 01:38:18 -070014346 EXPECT_FALSE(parse_success);
bncf6f82b12019-10-30 07:01:01 -070014347 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
dschinazi7d066ca2019-05-15 17:59:49 -070014348 EXPECT_EQ("Invalid ConnectionId length.", framer_.detailed_error());
dschinazi346b7ce2019-06-05 01:38:18 -070014349 return;
14350 }
dschinazi346b7ce2019-06-05 01:38:18 -070014351 EXPECT_TRUE(parse_success);
bncf6f82b12019-10-30 07:01:01 -070014352 EXPECT_THAT(framer_.error(), IsQuicNoError());
dschinazi346b7ce2019-06-05 01:38:18 -070014353 EXPECT_EQ("", framer_.detailed_error());
14354 ASSERT_TRUE(visitor_.header_.get());
14355 EXPECT_EQ(FramerTestConnectionId(),
14356 visitor_.header_.get()->destination_connection_id);
14357}
14358
14359TEST_P(QuicFramerTest, ClientConnectionIdFromLongHeaderToServer) {
dschinaziceed8662020-07-14 09:37:05 -070014360 if (!framer_.version().HasIetfInvariantHeader()) {
dschinazi346b7ce2019-06-05 01:38:18 -070014361 // This test requires an IETF long header.
14362 return;
14363 }
14364 SetDecrypterLevel(ENCRYPTION_HANDSHAKE);
14365 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14366 // clang-format off
14367 unsigned char packet[] = {
14368 // public flags (long header with packet type HANDSHAKE and
14369 // 4-byte packet number)
fayang36825da2019-08-21 14:01:27 -070014370 0xE3,
dschinazi346b7ce2019-06-05 01:38:18 -070014371 // version
14372 QUIC_VERSION_BYTES,
14373 // connection ID lengths
14374 0x05,
14375 // source connection ID
14376 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
14377 // long header packet length
14378 0x05,
14379 // packet number
14380 0x12, 0x34, 0x56, 0x00,
14381 // padding frame
14382 0x00,
14383 };
dschinazic73506e2019-09-20 13:26:46 -070014384 unsigned char packet49[] = {
dschinazi48ac9192019-07-31 00:07:26 -070014385 // public flags (long header with packet type HANDSHAKE and
14386 // 4-byte packet number)
14387 0xE3,
14388 // version
14389 QUIC_VERSION_BYTES,
14390 // connection ID lengths
14391 0x00, 0x08,
14392 // source connection ID
14393 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
14394 // long header packet length
14395 0x05,
14396 // packet number
14397 0x12, 0x34, 0x56, 0x00,
14398 // padding frame
14399 0x00,
14400 };
dschinazi346b7ce2019-06-05 01:38:18 -070014401 // clang-format on
dschinazi48ac9192019-07-31 00:07:26 -070014402 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -070014403 size_t p_length = ABSL_ARRAYSIZE(packet);
dschinaziceed8662020-07-14 09:37:05 -070014404 if (framer_.version().HasLongHeaderLengths()) {
dschinazic73506e2019-09-20 13:26:46 -070014405 p = packet49;
vasilvvbed67c62020-10-20 06:38:43 -070014406 p_length = ABSL_ARRAYSIZE(packet49);
dschinazi48ac9192019-07-31 00:07:26 -070014407 }
14408 const bool parse_success =
14409 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false));
dschinazi97da52b2020-01-13 15:44:43 -080014410 if (!framer_.version().AllowsVariableLengthConnectionIds()) {
dschinazi346b7ce2019-06-05 01:38:18 -070014411 EXPECT_FALSE(parse_success);
bncf6f82b12019-10-30 07:01:01 -070014412 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
dschinazi346b7ce2019-06-05 01:38:18 -070014413 EXPECT_EQ("Invalid ConnectionId length.", framer_.detailed_error());
14414 return;
14415 }
dschinazi5e1a7b22019-07-31 12:23:21 -070014416 if (!framer_.version().SupportsClientConnectionIds()) {
dschinazi346b7ce2019-06-05 01:38:18 -070014417 EXPECT_FALSE(parse_success);
bncf6f82b12019-10-30 07:01:01 -070014418 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
dschinazi346b7ce2019-06-05 01:38:18 -070014419 EXPECT_EQ("Client connection ID not supported in this version.",
14420 framer_.detailed_error());
14421 return;
14422 }
14423 EXPECT_TRUE(parse_success);
bncf6f82b12019-10-30 07:01:01 -070014424 EXPECT_THAT(framer_.error(), IsQuicNoError());
dschinazi346b7ce2019-06-05 01:38:18 -070014425 EXPECT_EQ("", framer_.detailed_error());
14426 ASSERT_TRUE(visitor_.header_.get());
14427 EXPECT_EQ(FramerTestConnectionId(),
14428 visitor_.header_.get()->source_connection_id);
dschinazi7d066ca2019-05-15 17:59:49 -070014429}
14430
dschinazi334f0232019-05-29 16:08:53 -070014431TEST_P(QuicFramerTest, ProcessAndValidateIetfConnectionIdLengthClient) {
dschinaziceed8662020-07-14 09:37:05 -070014432 if (!framer_.version().HasIetfInvariantHeader()) {
dschinazi334f0232019-05-29 16:08:53 -070014433 // This test requires an IETF long header.
14434 return;
14435 }
14436 char connection_id_lengths = 0x05;
14437 QuicDataReader reader(&connection_id_lengths, 1);
14438
14439 bool should_update_expected_server_connection_id_length = false;
14440 uint8_t expected_server_connection_id_length = 8;
14441 uint8_t destination_connection_id_length = 0;
14442 uint8_t source_connection_id_length = 8;
14443 std::string detailed_error = "";
14444
14445 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
14446 &reader, framer_.version(), Perspective::IS_CLIENT,
14447 should_update_expected_server_connection_id_length,
14448 &expected_server_connection_id_length, &destination_connection_id_length,
14449 &source_connection_id_length, &detailed_error));
14450 EXPECT_EQ(8, expected_server_connection_id_length);
14451 EXPECT_EQ(0, destination_connection_id_length);
14452 EXPECT_EQ(8, source_connection_id_length);
14453 EXPECT_EQ("", detailed_error);
14454
14455 QuicDataReader reader2(&connection_id_lengths, 1);
14456 should_update_expected_server_connection_id_length = true;
14457 expected_server_connection_id_length = 33;
14458 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
14459 &reader2, framer_.version(), Perspective::IS_CLIENT,
14460 should_update_expected_server_connection_id_length,
14461 &expected_server_connection_id_length, &destination_connection_id_length,
14462 &source_connection_id_length, &detailed_error));
14463 EXPECT_EQ(8, expected_server_connection_id_length);
14464 EXPECT_EQ(0, destination_connection_id_length);
14465 EXPECT_EQ(8, source_connection_id_length);
14466 EXPECT_EQ("", detailed_error);
14467}
14468
14469TEST_P(QuicFramerTest, ProcessAndValidateIetfConnectionIdLengthServer) {
dschinaziceed8662020-07-14 09:37:05 -070014470 if (!framer_.version().HasIetfInvariantHeader()) {
dschinazi334f0232019-05-29 16:08:53 -070014471 // This test requires an IETF long header.
14472 return;
14473 }
14474 char connection_id_lengths = 0x50;
14475 QuicDataReader reader(&connection_id_lengths, 1);
14476
14477 bool should_update_expected_server_connection_id_length = false;
14478 uint8_t expected_server_connection_id_length = 8;
14479 uint8_t destination_connection_id_length = 8;
14480 uint8_t source_connection_id_length = 0;
14481 std::string detailed_error = "";
14482
14483 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
14484 &reader, framer_.version(), Perspective::IS_SERVER,
14485 should_update_expected_server_connection_id_length,
14486 &expected_server_connection_id_length, &destination_connection_id_length,
14487 &source_connection_id_length, &detailed_error));
14488 EXPECT_EQ(8, expected_server_connection_id_length);
14489 EXPECT_EQ(8, destination_connection_id_length);
14490 EXPECT_EQ(0, source_connection_id_length);
14491 EXPECT_EQ("", detailed_error);
14492
14493 QuicDataReader reader2(&connection_id_lengths, 1);
14494 should_update_expected_server_connection_id_length = true;
14495 expected_server_connection_id_length = 33;
14496 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
14497 &reader2, framer_.version(), Perspective::IS_SERVER,
14498 should_update_expected_server_connection_id_length,
14499 &expected_server_connection_id_length, &destination_connection_id_length,
14500 &source_connection_id_length, &detailed_error));
14501 EXPECT_EQ(8, expected_server_connection_id_length);
14502 EXPECT_EQ(8, destination_connection_id_length);
14503 EXPECT_EQ(0, source_connection_id_length);
14504 EXPECT_EQ("", detailed_error);
14505}
14506
fkastenholzb4dade72019-08-05 06:54:20 -070014507TEST_P(QuicFramerTest, TestExtendedErrorCodeParser) {
14508 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholzc5e0c8c2019-09-30 10:16:30 -070014509 // Extended error codes only in IETF QUIC
fkastenholzb4dade72019-08-05 06:54:20 -070014510 return;
14511 }
fkastenholz488a4622019-08-26 06:24:46 -070014512 QuicConnectionCloseFrame frame;
14513
14514 frame.error_details = "this has no error code info in it";
14515 MaybeExtractQuicErrorCode(&frame);
bnc77e77b82020-04-05 10:36:49 -070014516 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
fkastenholz488a4622019-08-26 06:24:46 -070014517 EXPECT_EQ("this has no error code info in it", frame.error_details);
14518
14519 frame.error_details = "1234this does not have the colon in it";
14520 MaybeExtractQuicErrorCode(&frame);
bnc77e77b82020-04-05 10:36:49 -070014521 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
fkastenholz488a4622019-08-26 06:24:46 -070014522 EXPECT_EQ("1234this does not have the colon in it", frame.error_details);
14523
14524 frame.error_details = "1a234:this has a colon, but a malformed error number";
14525 MaybeExtractQuicErrorCode(&frame);
bnc77e77b82020-04-05 10:36:49 -070014526 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
fkastenholz488a4622019-08-26 06:24:46 -070014527 EXPECT_EQ("1a234:this has a colon, but a malformed error number",
14528 frame.error_details);
14529
14530 frame.error_details = "1234:this is good";
14531 MaybeExtractQuicErrorCode(&frame);
bnc77e77b82020-04-05 10:36:49 -070014532 EXPECT_EQ(1234u, frame.quic_error_code);
fkastenholz488a4622019-08-26 06:24:46 -070014533 EXPECT_EQ("this is good", frame.error_details);
14534
14535 frame.error_details =
14536 "1234 :this is not good, space between last digit and colon";
14537 MaybeExtractQuicErrorCode(&frame);
bnc77e77b82020-04-05 10:36:49 -070014538 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
fkastenholz488a4622019-08-26 06:24:46 -070014539 EXPECT_EQ("1234 :this is not good, space between last digit and colon",
14540 frame.error_details);
14541
14542 frame.error_details = "123456789";
14543 MaybeExtractQuicErrorCode(&frame);
bncf6f82b12019-10-30 07:01:01 -070014544 EXPECT_THAT(
bnc77e77b82020-04-05 10:36:49 -070014545 frame.quic_error_code,
bncf6f82b12019-10-30 07:01:01 -070014546 IsError(QUIC_IETF_GQUIC_ERROR_MISSING)); // Not good, all numbers, no :
fkastenholz488a4622019-08-26 06:24:46 -070014547 EXPECT_EQ("123456789", frame.error_details);
14548
14549 frame.error_details = "1234:";
14550 MaybeExtractQuicErrorCode(&frame);
fkastenholzb4dade72019-08-05 06:54:20 -070014551 EXPECT_EQ(1234u,
bnc77e77b82020-04-05 10:36:49 -070014552 frame.quic_error_code); // corner case.
fkastenholz488a4622019-08-26 06:24:46 -070014553 EXPECT_EQ("", frame.error_details);
14554
14555 frame.error_details = "1234:5678";
14556 MaybeExtractQuicErrorCode(&frame);
14557 EXPECT_EQ(1234u,
bnc77e77b82020-04-05 10:36:49 -070014558 frame.quic_error_code); // another corner case.
fkastenholz488a4622019-08-26 06:24:46 -070014559 EXPECT_EQ("5678", frame.error_details);
14560
14561 frame.error_details = "12345 6789:";
14562 MaybeExtractQuicErrorCode(&frame);
bnc77e77b82020-04-05 10:36:49 -070014563 EXPECT_THAT(frame.quic_error_code,
bncf6f82b12019-10-30 07:01:01 -070014564 IsError(QUIC_IETF_GQUIC_ERROR_MISSING)); // Not good
fkastenholz488a4622019-08-26 06:24:46 -070014565 EXPECT_EQ("12345 6789:", frame.error_details);
14566
14567 frame.error_details = ":no numbers, is not good";
14568 MaybeExtractQuicErrorCode(&frame);
bnc77e77b82020-04-05 10:36:49 -070014569 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
fkastenholz488a4622019-08-26 06:24:46 -070014570 EXPECT_EQ(":no numbers, is not good", frame.error_details);
14571
14572 frame.error_details = "qwer:also no numbers, is not good";
14573 MaybeExtractQuicErrorCode(&frame);
bnc77e77b82020-04-05 10:36:49 -070014574 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
fkastenholz488a4622019-08-26 06:24:46 -070014575 EXPECT_EQ("qwer:also no numbers, is not good", frame.error_details);
14576
14577 frame.error_details = " 1234:this is not good, space before first digit";
14578 MaybeExtractQuicErrorCode(&frame);
bnc77e77b82020-04-05 10:36:49 -070014579 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
fkastenholz488a4622019-08-26 06:24:46 -070014580 EXPECT_EQ(" 1234:this is not good, space before first digit",
14581 frame.error_details);
14582
14583 frame.error_details = "1234:";
14584 MaybeExtractQuicErrorCode(&frame);
14585 EXPECT_EQ(1234u,
bnc77e77b82020-04-05 10:36:49 -070014586 frame.quic_error_code); // this is good
fkastenholz488a4622019-08-26 06:24:46 -070014587 EXPECT_EQ("", frame.error_details);
fkastenholzb4dade72019-08-05 06:54:20 -070014588}
14589
fayang3371b092019-12-04 07:08:52 -080014590// Regression test for crbug/1029636.
14591TEST_P(QuicFramerTest, OverlyLargeAckDelay) {
14592 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
14593 return;
14594 }
14595 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
14596 // clang-format off
14597 unsigned char packet99[] = {
14598 // type (short header, 4 byte packet number)
14599 0x43,
14600 // connection_id
14601 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
14602 // packet number
14603 0x12, 0x34, 0x56, 0x78,
14604
14605 // frame type (IETF_ACK frame)
14606 0x02,
14607 // largest acked
14608 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
14609 // ack delay time.
14610 kVarInt62EightBytes + 0x31, 0x00, 0x00, 0x00, 0xF3, 0xA0, 0x81, 0xE0,
14611 // Nr. of additional ack blocks
14612 kVarInt62OneByte + 0x00,
14613 // first ack block length.
14614 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
14615 };
14616 // clang-format on
14617
vasilvvbed67c62020-10-20 06:38:43 -070014618 framer_.ProcessPacket(
14619 QuicEncryptedPacket(AsChars(packet99), ABSL_ARRAYSIZE(packet99), false));
fayang3371b092019-12-04 07:08:52 -080014620 ASSERT_EQ(1u, visitor_.ack_frames_.size());
14621 // Verify ack_delay_time is set correctly.
14622 EXPECT_EQ(QuicTime::Delta::Infinite(),
14623 visitor_.ack_frames_[0]->ack_delay_time);
14624}
14625
mattm072a7e32020-10-09 16:16:56 -070014626TEST_P(QuicFramerTest, KeyUpdate) {
14627 if (!framer_.version().UsesTls()) {
14628 // Key update is only used in QUIC+TLS.
14629 return;
14630 }
14631 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14632 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14633 // instead of TestDecrypter.
14634 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14635 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14636 framer_.SetKeyUpdateSupportForConnection(true);
14637
14638 QuicPacketHeader header;
14639 header.destination_connection_id = FramerTestConnectionId();
14640 header.reset_flag = false;
14641 header.version_flag = false;
14642 header.packet_number = kPacketNumber;
14643
14644 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
14645
14646 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14647 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
14648 ASSERT_TRUE(data != nullptr);
14649 std::unique_ptr<QuicEncryptedPacket> encrypted(
14650 EncryptPacketWithTagAndPhase(*data, 0, false));
14651 ASSERT_TRUE(encrypted);
14652
14653 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14654 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14655 // Processed valid packet with phase=0, key=1: no key update.
mattm5c7090d2020-10-19 10:36:43 -070014656 EXPECT_EQ(0u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070014657 EXPECT_EQ(0, visitor_.derive_next_key_count_);
14658 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14659
14660 header.packet_number += 1;
14661 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14662 data = BuildDataPacket(header, frames);
14663 ASSERT_TRUE(data != nullptr);
14664 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
14665 ASSERT_TRUE(encrypted);
14666 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14667 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14668 // Processed valid packet with phase=1, key=2: key update should have
14669 // occurred.
mattm5c7090d2020-10-19 10:36:43 -070014670 ASSERT_EQ(1u, visitor_.key_update_count());
14671 EXPECT_EQ(KeyUpdateReason::kRemote, visitor_.key_update_reasons_[0]);
mattm072a7e32020-10-09 16:16:56 -070014672 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14673 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
14674
14675 header.packet_number += 1;
14676 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14677 data = BuildDataPacket(header, frames);
14678 ASSERT_TRUE(data != nullptr);
14679 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
14680 ASSERT_TRUE(encrypted);
14681 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14682 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14683 // Processed another valid packet with phase=1, key=2: no key update.
mattm5c7090d2020-10-19 10:36:43 -070014684 EXPECT_EQ(1u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070014685 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14686 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
14687
14688 // Process another key update.
14689 header.packet_number += 1;
14690 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14691 data = BuildDataPacket(header, frames);
14692 ASSERT_TRUE(data != nullptr);
14693 encrypted = EncryptPacketWithTagAndPhase(*data, 2, false);
14694 ASSERT_TRUE(encrypted);
14695 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14696 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070014697 ASSERT_EQ(2u, visitor_.key_update_count());
14698 EXPECT_EQ(KeyUpdateReason::kRemote, visitor_.key_update_reasons_[1]);
mattm072a7e32020-10-09 16:16:56 -070014699 EXPECT_EQ(2, visitor_.derive_next_key_count_);
14700 EXPECT_EQ(3, visitor_.decrypted_first_packet_in_key_phase_count_);
14701}
14702
14703TEST_P(QuicFramerTest, KeyUpdateOldPacketAfterUpdate) {
14704 if (!framer_.version().UsesTls()) {
14705 // Key update is only used in QUIC+TLS.
14706 return;
14707 }
14708 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14709 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14710 // instead of TestDecrypter.
14711 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14712 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14713 framer_.SetKeyUpdateSupportForConnection(true);
14714
14715 QuicPacketHeader header;
14716 header.destination_connection_id = FramerTestConnectionId();
14717 header.reset_flag = false;
14718 header.version_flag = false;
14719 header.packet_number = kPacketNumber;
14720
14721 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
14722
14723 // Process packet N with phase 0.
14724 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14725 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
14726 ASSERT_TRUE(data != nullptr);
14727 std::unique_ptr<QuicEncryptedPacket> encrypted(
14728 EncryptPacketWithTagAndPhase(*data, 0, false));
14729 ASSERT_TRUE(encrypted);
14730 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14731 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070014732 EXPECT_EQ(0u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070014733 EXPECT_EQ(0, visitor_.derive_next_key_count_);
14734 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14735
14736 // Process packet N+2 with phase 1.
14737 header.packet_number = kPacketNumber + 2;
14738 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14739 data = BuildDataPacket(header, frames);
14740 ASSERT_TRUE(data != nullptr);
14741 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
14742 ASSERT_TRUE(encrypted);
14743 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14744 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070014745 EXPECT_EQ(1u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070014746 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14747 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
14748
14749 // Process packet N+1 with phase 0. (Receiving packet from previous phase
14750 // after packet from new phase was received.)
14751 header.packet_number = kPacketNumber + 1;
14752 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14753 data = BuildDataPacket(header, frames);
14754 ASSERT_TRUE(data != nullptr);
14755 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
14756 ASSERT_TRUE(encrypted);
14757 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14758 // Packet should decrypt and key update count should not change.
14759 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070014760 EXPECT_EQ(1u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070014761 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14762 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
14763}
14764
14765TEST_P(QuicFramerTest, KeyUpdateOldPacketAfterDiscardPreviousOneRttKeys) {
14766 if (!framer_.version().UsesTls()) {
14767 // Key update is only used in QUIC+TLS.
14768 return;
14769 }
14770 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14771 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14772 // instead of TestDecrypter.
14773 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14774 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14775 framer_.SetKeyUpdateSupportForConnection(true);
14776
14777 QuicPacketHeader header;
14778 header.destination_connection_id = FramerTestConnectionId();
14779 header.reset_flag = false;
14780 header.version_flag = false;
14781 header.packet_number = kPacketNumber;
14782
14783 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
14784
14785 // Process packet N with phase 0.
14786 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14787 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
14788 ASSERT_TRUE(data != nullptr);
14789 std::unique_ptr<QuicEncryptedPacket> encrypted(
14790 EncryptPacketWithTagAndPhase(*data, 0, false));
14791 ASSERT_TRUE(encrypted);
14792 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14793 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070014794 EXPECT_EQ(0u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070014795 EXPECT_EQ(0, visitor_.derive_next_key_count_);
14796 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14797
14798 // Process packet N+2 with phase 1.
14799 header.packet_number = kPacketNumber + 2;
14800 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14801 data = BuildDataPacket(header, frames);
14802 ASSERT_TRUE(data != nullptr);
14803 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
14804 ASSERT_TRUE(encrypted);
14805 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14806 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070014807 EXPECT_EQ(1u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070014808 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14809 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
14810
14811 // Discard keys for previous key phase.
14812 framer_.DiscardPreviousOneRttKeys();
14813
14814 // Process packet N+1 with phase 0. (Receiving packet from previous phase
14815 // after packet from new phase was received.)
14816 header.packet_number = kPacketNumber + 1;
14817 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14818 data = BuildDataPacket(header, frames);
14819 ASSERT_TRUE(data != nullptr);
14820 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
14821 ASSERT_TRUE(encrypted);
14822 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14823 // Packet should not decrypt and key update count should not change.
14824 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070014825 EXPECT_EQ(1u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070014826 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14827 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
14828}
14829
14830TEST_P(QuicFramerTest, KeyUpdatePacketsOutOfOrder) {
14831 if (!framer_.version().UsesTls()) {
14832 // Key update is only used in QUIC+TLS.
14833 return;
14834 }
14835 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14836 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14837 // instead of TestDecrypter.
14838 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14839 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14840 framer_.SetKeyUpdateSupportForConnection(true);
14841
14842 QuicPacketHeader header;
14843 header.destination_connection_id = FramerTestConnectionId();
14844 header.reset_flag = false;
14845 header.version_flag = false;
14846 header.packet_number = kPacketNumber;
14847
14848 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
14849
14850 // Process packet N with phase 0.
14851 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14852 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
14853 ASSERT_TRUE(data != nullptr);
14854 std::unique_ptr<QuicEncryptedPacket> encrypted(
14855 EncryptPacketWithTagAndPhase(*data, 0, false));
14856 ASSERT_TRUE(encrypted);
14857 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14858 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070014859 EXPECT_EQ(0u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070014860 EXPECT_EQ(0, visitor_.derive_next_key_count_);
14861 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14862
14863 // Process packet N+2 with phase 1.
14864 header.packet_number = kPacketNumber + 2;
14865 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14866 data = BuildDataPacket(header, frames);
14867 ASSERT_TRUE(data != nullptr);
14868 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
14869 ASSERT_TRUE(encrypted);
14870 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14871 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070014872 EXPECT_EQ(1u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070014873 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14874 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
14875
14876 // Process packet N+1 with phase 1. (Receiving packet from new phase out of
14877 // order.)
14878 header.packet_number = kPacketNumber + 1;
14879 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14880 data = BuildDataPacket(header, frames);
14881 ASSERT_TRUE(data != nullptr);
14882 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
14883 ASSERT_TRUE(encrypted);
14884 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14885 // Packet should decrypt and key update count should not change.
14886 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070014887 EXPECT_EQ(1u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070014888 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14889 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
14890}
14891
14892TEST_P(QuicFramerTest, KeyUpdateWrongKey) {
14893 if (!framer_.version().UsesTls()) {
14894 // Key update is only used in QUIC+TLS.
14895 return;
14896 }
14897 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14898 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14899 // instead of TestDecrypter.
14900 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14901 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14902 framer_.SetKeyUpdateSupportForConnection(true);
14903
14904 QuicPacketHeader header;
14905 header.destination_connection_id = FramerTestConnectionId();
14906 header.reset_flag = false;
14907 header.version_flag = false;
14908 header.packet_number = kPacketNumber;
14909
14910 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
14911
14912 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14913 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
14914 ASSERT_TRUE(data != nullptr);
14915 std::unique_ptr<QuicEncryptedPacket> encrypted(
14916 EncryptPacketWithTagAndPhase(*data, 0, false));
14917 ASSERT_TRUE(encrypted);
14918
14919 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14920 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14921 // Processed valid packet with phase=0, key=1: no key update.
mattm5c7090d2020-10-19 10:36:43 -070014922 EXPECT_EQ(0u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070014923 EXPECT_EQ(0, visitor_.derive_next_key_count_);
14924 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
mattmd061ef12020-10-23 11:21:31 -070014925 EXPECT_EQ(0u, framer_.PotentialPeerKeyUpdateAttemptCount());
mattm072a7e32020-10-09 16:16:56 -070014926
14927 header.packet_number += 1;
14928 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14929 data = BuildDataPacket(header, frames);
14930 ASSERT_TRUE(data != nullptr);
14931 encrypted = EncryptPacketWithTagAndPhase(*data, 2, true);
14932 ASSERT_TRUE(encrypted);
14933 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14934 // Packet with phase=1 but key=3, should not process and should not cause key
14935 // update, but next decrypter key should have been created to attempt to
14936 // decode it.
14937 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070014938 EXPECT_EQ(0u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070014939 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14940 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
mattmd061ef12020-10-23 11:21:31 -070014941 EXPECT_EQ(1u, framer_.PotentialPeerKeyUpdateAttemptCount());
mattm072a7e32020-10-09 16:16:56 -070014942
14943 header.packet_number += 1;
14944 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14945 data = BuildDataPacket(header, frames);
14946 ASSERT_TRUE(data != nullptr);
14947 encrypted = EncryptPacketWithTagAndPhase(*data, 0, true);
14948 ASSERT_TRUE(encrypted);
14949 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14950 // Packet with phase=1 but key=1, should not process and should not cause key
14951 // update.
14952 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070014953 EXPECT_EQ(0u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070014954 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14955 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
mattmd061ef12020-10-23 11:21:31 -070014956 EXPECT_EQ(2u, framer_.PotentialPeerKeyUpdateAttemptCount());
mattm072a7e32020-10-09 16:16:56 -070014957
14958 header.packet_number += 1;
14959 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14960 data = BuildDataPacket(header, frames);
14961 ASSERT_TRUE(data != nullptr);
14962 encrypted = EncryptPacketWithTagAndPhase(*data, 1, false);
14963 ASSERT_TRUE(encrypted);
14964 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14965 // Packet with phase=0 but key=2, should not process and should not cause key
14966 // update.
14967 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070014968 EXPECT_EQ(0u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070014969 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14970 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
mattmd061ef12020-10-23 11:21:31 -070014971 EXPECT_EQ(2u, framer_.PotentialPeerKeyUpdateAttemptCount());
14972
14973 header.packet_number += 1;
14974 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14975 data = BuildDataPacket(header, frames);
14976 ASSERT_TRUE(data != nullptr);
14977 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
14978 ASSERT_TRUE(encrypted);
14979 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14980 // Packet with phase=0 and key=0, should process and reset
14981 // potential_peer_key_update_attempt_count_.
14982 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14983 EXPECT_EQ(0u, visitor_.key_update_count());
14984 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14985 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14986 EXPECT_EQ(0u, framer_.PotentialPeerKeyUpdateAttemptCount());
mattm072a7e32020-10-09 16:16:56 -070014987}
14988
14989TEST_P(QuicFramerTest, KeyUpdateReceivedWhenNotEnabled) {
14990 if (!framer_.version().UsesTls()) {
14991 // Key update is only used in QUIC+TLS.
14992 return;
14993 }
14994 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14995 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14996 // instead of TestDecrypter.
14997 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14998 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14999
15000 QuicPacketHeader header;
15001 header.destination_connection_id = FramerTestConnectionId();
15002 header.reset_flag = false;
15003 header.version_flag = false;
15004 header.packet_number = kPacketNumber;
15005
15006 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
15007
15008 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
15009 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
15010 ASSERT_TRUE(data != nullptr);
15011 std::unique_ptr<QuicEncryptedPacket> encrypted(
15012 EncryptPacketWithTagAndPhase(*data, 1, true));
15013 ASSERT_TRUE(encrypted);
15014
15015 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
15016 // Received a packet with key phase updated even though framer hasn't had key
15017 // update enabled (SetNextOneRttCrypters never called). Should fail to
15018 // process.
15019 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070015020 EXPECT_EQ(0u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070015021 EXPECT_EQ(0, visitor_.derive_next_key_count_);
15022 EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
15023}
15024
15025TEST_P(QuicFramerTest, KeyUpdateLocallyInitiated) {
15026 if (!framer_.version().UsesTls()) {
15027 // Key update is only used in QUIC+TLS.
15028 return;
15029 }
15030 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
15031 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
15032 // instead of TestDecrypter.
15033 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
15034 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
15035 framer_.SetKeyUpdateSupportForConnection(true);
15036
mattm5c7090d2020-10-19 10:36:43 -070015037 EXPECT_TRUE(framer_.DoKeyUpdate(KeyUpdateReason::kLocalForTests));
mattm072a7e32020-10-09 16:16:56 -070015038 // Key update count should be updated, but haven't received packet from peer
15039 // with new key phase.
mattm5c7090d2020-10-19 10:36:43 -070015040 ASSERT_EQ(1u, visitor_.key_update_count());
15041 EXPECT_EQ(KeyUpdateReason::kLocalForTests, visitor_.key_update_reasons_[0]);
mattm072a7e32020-10-09 16:16:56 -070015042 EXPECT_EQ(1, visitor_.derive_next_key_count_);
15043 EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
15044
15045 QuicPacketHeader header;
15046 header.destination_connection_id = FramerTestConnectionId();
15047 header.reset_flag = false;
15048 header.version_flag = false;
15049 header.packet_number = kPacketNumber;
15050
15051 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
15052
15053 // Process packet N with phase 1.
15054 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
15055 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
15056 ASSERT_TRUE(data != nullptr);
15057 std::unique_ptr<QuicEncryptedPacket> encrypted(
15058 EncryptPacketWithTagAndPhase(*data, 1, true));
15059 ASSERT_TRUE(encrypted);
15060
15061 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
15062 // Packet should decrypt and key update count should not change and
15063 // OnDecryptedFirstPacketInKeyPhase should have been called.
15064 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070015065 EXPECT_EQ(1u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070015066 EXPECT_EQ(1, visitor_.derive_next_key_count_);
15067 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
15068
15069 // Process packet N-1 with phase 0. (Receiving packet from previous phase
15070 // after packet from new phase was received.)
15071 header.packet_number = kPacketNumber - 1;
15072 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
15073 data = BuildDataPacket(header, frames);
15074 ASSERT_TRUE(data != nullptr);
15075 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
15076 ASSERT_TRUE(encrypted);
15077 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
15078 // Packet should decrypt and key update count should not change.
15079 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070015080 EXPECT_EQ(1u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070015081 EXPECT_EQ(1, visitor_.derive_next_key_count_);
15082 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
15083
15084 // Process packet N+1 with phase 0 and key 1. This should not decrypt even
15085 // though it's using the previous key, since the packet number is higher than
15086 // a packet number received using the current key.
15087 header.packet_number = kPacketNumber + 1;
15088 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
15089 data = BuildDataPacket(header, frames);
15090 ASSERT_TRUE(data != nullptr);
15091 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
15092 ASSERT_TRUE(encrypted);
15093 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
15094 // Packet should not decrypt and key update count should not change.
15095 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070015096 EXPECT_EQ(1u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070015097 EXPECT_EQ(2, visitor_.derive_next_key_count_);
15098 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
15099}
15100
15101TEST_P(QuicFramerTest, KeyUpdateLocallyInitiatedReceivedOldPacket) {
15102 if (!framer_.version().UsesTls()) {
15103 // Key update is only used in QUIC+TLS.
15104 return;
15105 }
15106 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
15107 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
15108 // instead of TestDecrypter.
15109 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
15110 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
15111 framer_.SetKeyUpdateSupportForConnection(true);
15112
mattm5c7090d2020-10-19 10:36:43 -070015113 EXPECT_TRUE(framer_.DoKeyUpdate(KeyUpdateReason::kLocalForTests));
mattm072a7e32020-10-09 16:16:56 -070015114 // Key update count should be updated, but haven't received packet
15115 // from peer with new key phase.
mattm5c7090d2020-10-19 10:36:43 -070015116 EXPECT_EQ(1u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070015117 EXPECT_EQ(1, visitor_.derive_next_key_count_);
15118 EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
15119
15120 QuicPacketHeader header;
15121 header.destination_connection_id = FramerTestConnectionId();
15122 header.reset_flag = false;
15123 header.version_flag = false;
15124 header.packet_number = kPacketNumber;
15125
15126 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
15127
15128 // Process packet N with phase 0. (Receiving packet from previous phase
15129 // after locally initiated key update, but before any packet from new phase
15130 // was received.)
15131 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
15132 std::unique_ptr<QuicPacket> data = BuildDataPacket(header, frames);
15133 ASSERT_TRUE(data != nullptr);
15134 std::unique_ptr<QuicEncryptedPacket> encrypted =
15135 EncryptPacketWithTagAndPhase(*data, 0, false);
15136 ASSERT_TRUE(encrypted);
15137 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
15138 // Packet should decrypt and key update count should not change and
15139 // OnDecryptedFirstPacketInKeyPhase should not have been called since the
15140 // packet was from the previous key phase.
15141 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070015142 EXPECT_EQ(1u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070015143 EXPECT_EQ(1, visitor_.derive_next_key_count_);
15144 EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
15145
15146 // Process packet N+1 with phase 1.
15147 header.packet_number = kPacketNumber + 1;
15148 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
15149 data = BuildDataPacket(header, frames);
15150 ASSERT_TRUE(data != nullptr);
15151 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
15152 ASSERT_TRUE(encrypted);
15153 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
15154 // Packet should decrypt and key update count should not change, but
15155 // OnDecryptedFirstPacketInKeyPhase should have been called.
15156 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070015157 EXPECT_EQ(1u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070015158 EXPECT_EQ(1, visitor_.derive_next_key_count_);
15159 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
15160
15161 // Process packet N+2 with phase 0 and key 1. This should not decrypt even
15162 // though it's using the previous key, since the packet number is higher than
15163 // a packet number received using the current key.
15164 header.packet_number = kPacketNumber + 2;
15165 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
15166 data = BuildDataPacket(header, frames);
15167 ASSERT_TRUE(data != nullptr);
15168 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
15169 ASSERT_TRUE(encrypted);
15170 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
15171 // Packet should not decrypt and key update count should not change.
15172 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
mattm5c7090d2020-10-19 10:36:43 -070015173 EXPECT_EQ(1u, visitor_.key_update_count());
mattm072a7e32020-10-09 16:16:56 -070015174 EXPECT_EQ(2, visitor_.derive_next_key_count_);
15175 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
15176}
15177
QUICHE teama6ef0a62019-03-07 20:34:33 -050015178} // namespace
15179} // namespace test
15180} // namespace quic