blob: f288441ac9eb183cc80fb7f4bba0cc4237acbcd1 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/third_party/quiche/src/quic/core/quic_framer.h"
6
7#include <algorithm>
8#include <cstdint>
9#include <map>
10#include <memory>
vasilvv872e7a32019-03-12 16:42:44 -070011#include <string>
QUICHE teama6ef0a62019-03-07 20:34:33 -050012#include <vector>
13
14#include "net/third_party/quiche/src/quic/core/crypto/null_decrypter.h"
15#include "net/third_party/quiche/src/quic/core/crypto/null_encrypter.h"
16#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
17#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
18#include "net/third_party/quiche/src/quic/core/quic_connection_id.h"
dschinazicf5b1e22019-07-17 18:35:17 -070019#include "net/third_party/quiche/src/quic/core/quic_error_codes.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050020#include "net/third_party/quiche/src/quic/core/quic_packets.h"
21#include "net/third_party/quiche/src/quic/core/quic_types.h"
22#include "net/third_party/quiche/src/quic/core/quic_utils.h"
dschinazi243eabc2019-08-05 16:15:29 -070023#include "net/third_party/quiche/src/quic/core/quic_versions.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050024#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h"
25#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
26#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
27#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
28#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050029#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
30#include "net/third_party/quiche/src/quic/platform/api/quic_text_utils.h"
31#include "net/third_party/quiche/src/quic/test_tools/quic_framer_peer.h"
32#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
33#include "net/third_party/quiche/src/quic/test_tools/simple_data_producer.h"
34
35using testing::_;
36using testing::Return;
37using testing::Truly;
38
39namespace quic {
40namespace test {
41namespace {
42
43const uint64_t kEpoch = UINT64_C(1) << 32;
44const uint64_t kMask = kEpoch - 1;
45
46const QuicUint128 kTestStatelessResetToken = 1010101; // 0x0F69B5
47
48// Use fields in which each byte is distinct to ensure that every byte is
49// framed correctly. The values are otherwise arbitrary.
50QuicConnectionId FramerTestConnectionId() {
51 return TestConnectionId(UINT64_C(0xFEDCBA9876543210));
52}
53
54QuicConnectionId FramerTestConnectionIdPlusOne() {
55 return TestConnectionId(UINT64_C(0xFEDCBA9876543211));
56}
57
QUICHE team8e2e4532019-03-14 14:37:56 -070058QuicConnectionId FramerTestConnectionIdNineBytes() {
59 char connection_id_bytes[9] = {0xFE, 0xDC, 0xBA, 0x98, 0x76,
60 0x54, 0x32, 0x10, 0x42};
61 return QuicConnectionId(connection_id_bytes, sizeof(connection_id_bytes));
62}
63
QUICHE teama6ef0a62019-03-07 20:34:33 -050064const QuicPacketNumber kPacketNumber = QuicPacketNumber(UINT64_C(0x12345678));
65const QuicPacketNumber kSmallLargestObserved =
66 QuicPacketNumber(UINT16_C(0x1234));
67const QuicPacketNumber kSmallMissingPacket = QuicPacketNumber(UINT16_C(0x1233));
68const QuicPacketNumber kLeastUnacked = QuicPacketNumber(UINT64_C(0x012345670));
69const QuicStreamId kStreamId = UINT64_C(0x01020304);
70// Note that the high 4 bits of the stream offset must be less than 0x40
71// in order to ensure that the value can be encoded using VarInt62 encoding.
72const QuicStreamOffset kStreamOffset = UINT64_C(0x3A98FEDC32107654);
73const QuicPublicResetNonceProof kNonceProof = UINT64_C(0xABCDEF0123456789);
74
75// In testing that we can ack the full range of packets...
76// This is the largest packet number that can be represented in IETF QUIC
77// varint62 format.
78const QuicPacketNumber kLargestIetfLargestObserved =
79 QuicPacketNumber(UINT64_C(0x3fffffffffffffff));
80// Encodings for the two bits in a VarInt62 that
81// describe the length of the VarInt61. For binary packet
82// formats in this file, the convention is to code the
83// first byte as
84// kVarInt62FourBytes + 0x<value_in_that_byte>
85const uint8_t kVarInt62OneByte = 0x00;
86const uint8_t kVarInt62TwoBytes = 0x40;
87const uint8_t kVarInt62FourBytes = 0x80;
88const uint8_t kVarInt62EightBytes = 0xc0;
89
90class TestEncrypter : public QuicEncrypter {
91 public:
92 ~TestEncrypter() override {}
dschinazi17d42422019-06-18 16:35:07 -070093 bool SetKey(QuicStringPiece /*key*/) override { return true; }
94 bool SetNoncePrefix(QuicStringPiece /*nonce_prefix*/) override {
95 return true;
96 }
97 bool SetIV(QuicStringPiece /*iv*/) override { return true; }
98 bool SetHeaderProtectionKey(QuicStringPiece /*key*/) override { return true; }
QUICHE teama6ef0a62019-03-07 20:34:33 -050099 bool EncryptPacket(uint64_t packet_number,
100 QuicStringPiece associated_data,
101 QuicStringPiece plaintext,
102 char* output,
103 size_t* output_length,
dschinazi17d42422019-06-18 16:35:07 -0700104 size_t /*max_output_length*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500105 packet_number_ = QuicPacketNumber(packet_number);
vasilvvc48c8712019-03-11 13:38:16 -0700106 associated_data_ = std::string(associated_data);
107 plaintext_ = std::string(plaintext);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500108 memcpy(output, plaintext.data(), plaintext.length());
109 *output_length = plaintext.length();
110 return true;
111 }
dschinazi17d42422019-06-18 16:35:07 -0700112 std::string GenerateHeaderProtectionMask(
113 QuicStringPiece /*sample*/) override {
QUICHE team2d187972019-03-19 16:23:47 -0700114 return std::string(5, 0);
115 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500116 size_t GetKeySize() const override { return 0; }
117 size_t GetNoncePrefixSize() const override { return 0; }
118 size_t GetIVSize() const override { return 0; }
119 size_t GetMaxPlaintextSize(size_t ciphertext_size) const override {
120 return ciphertext_size;
121 }
122 size_t GetCiphertextSize(size_t plaintext_size) const override {
123 return plaintext_size;
124 }
125 QuicStringPiece GetKey() const override { return QuicStringPiece(); }
126 QuicStringPiece GetNoncePrefix() const override { return QuicStringPiece(); }
127
128 QuicPacketNumber packet_number_;
vasilvvc48c8712019-03-11 13:38:16 -0700129 std::string associated_data_;
130 std::string plaintext_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500131};
132
133class TestDecrypter : public QuicDecrypter {
134 public:
135 ~TestDecrypter() override {}
dschinazi17d42422019-06-18 16:35:07 -0700136 bool SetKey(QuicStringPiece /*key*/) override { return true; }
137 bool SetNoncePrefix(QuicStringPiece /*nonce_prefix*/) override {
138 return true;
139 }
140 bool SetIV(QuicStringPiece /*iv*/) override { return true; }
141 bool SetHeaderProtectionKey(QuicStringPiece /*key*/) override { return true; }
142 bool SetPreliminaryKey(QuicStringPiece /*key*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500143 QUIC_BUG << "should not be called";
144 return false;
145 }
dschinazi17d42422019-06-18 16:35:07 -0700146 bool SetDiversificationNonce(const DiversificationNonce& /*key*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500147 return true;
148 }
149 bool DecryptPacket(uint64_t packet_number,
150 QuicStringPiece associated_data,
151 QuicStringPiece ciphertext,
152 char* output,
153 size_t* output_length,
dschinazi17d42422019-06-18 16:35:07 -0700154 size_t /*max_output_length*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500155 packet_number_ = QuicPacketNumber(packet_number);
vasilvvc48c8712019-03-11 13:38:16 -0700156 associated_data_ = std::string(associated_data);
157 ciphertext_ = std::string(ciphertext);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500158 memcpy(output, ciphertext.data(), ciphertext.length());
159 *output_length = ciphertext.length();
160 return true;
161 }
QUICHE team2d187972019-03-19 16:23:47 -0700162 std::string GenerateHeaderProtectionMask(
dschinazi17d42422019-06-18 16:35:07 -0700163 QuicDataReader* /*sample_reader*/) override {
QUICHE team2d187972019-03-19 16:23:47 -0700164 return std::string(5, 0);
165 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500166 size_t GetKeySize() const override { return 0; }
167 size_t GetIVSize() const override { return 0; }
168 QuicStringPiece GetKey() const override { return QuicStringPiece(); }
169 QuicStringPiece GetNoncePrefix() const override { return QuicStringPiece(); }
170 // Use a distinct value starting with 0xFFFFFF, which is never used by TLS.
171 uint32_t cipher_id() const override { return 0xFFFFFFF2; }
172 QuicPacketNumber packet_number_;
vasilvvc48c8712019-03-11 13:38:16 -0700173 std::string associated_data_;
174 std::string ciphertext_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500175};
176
177class TestQuicVisitor : public QuicFramerVisitorInterface {
178 public:
179 TestQuicVisitor()
180 : error_count_(0),
181 version_mismatch_(0),
182 packet_count_(0),
183 frame_count_(0),
184 complete_packets_(0),
185 accept_packet_(true),
186 accept_public_header_(true) {}
187
188 ~TestQuicVisitor() override {}
189
190 void OnError(QuicFramer* f) override {
191 QUIC_DLOG(INFO) << "QuicFramer Error: " << QuicErrorCodeToString(f->error())
192 << " (" << f->error() << ")";
193 ++error_count_;
194 }
195
196 void OnPacket() override {}
197
198 void OnPublicResetPacket(const QuicPublicResetPacket& packet) override {
vasilvv0fc587f2019-09-06 13:33:08 -0700199 public_reset_packet_ = std::make_unique<QuicPublicResetPacket>((packet));
fkastenholza3660102019-08-28 05:19:24 -0700200 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500201 }
202
203 void OnVersionNegotiationPacket(
204 const QuicVersionNegotiationPacket& packet) override {
205 version_negotiation_packet_ =
vasilvv0fc587f2019-09-06 13:33:08 -0700206 std::make_unique<QuicVersionNegotiationPacket>((packet));
fkastenholza3660102019-08-28 05:19:24 -0700207 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500208 }
209
dschinazi244f6dc2019-05-06 15:45:16 -0700210 void OnRetryPacket(QuicConnectionId original_connection_id,
211 QuicConnectionId new_connection_id,
212 QuicStringPiece retry_token) override {
213 retry_original_connection_id_ =
vasilvv0fc587f2019-09-06 13:33:08 -0700214 std::make_unique<QuicConnectionId>(original_connection_id);
dschinazi244f6dc2019-05-06 15:45:16 -0700215 retry_new_connection_id_ =
vasilvv0fc587f2019-09-06 13:33:08 -0700216 std::make_unique<QuicConnectionId>(new_connection_id);
217 retry_token_ = std::make_unique<std::string>(std::string(retry_token));
fkastenholza3660102019-08-28 05:19:24 -0700218 EXPECT_EQ(0u, framer_->current_received_frame_type());
dschinazi244f6dc2019-05-06 15:45:16 -0700219 }
220
fayang8aba1ff2019-06-21 12:00:54 -0700221 bool OnProtocolVersionMismatch(ParsedQuicVersion received_version) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500222 QUIC_DLOG(INFO) << "QuicFramer Version Mismatch, version: "
223 << received_version;
224 ++version_mismatch_;
fkastenholza3660102019-08-28 05:19:24 -0700225 EXPECT_EQ(0u, framer_->current_received_frame_type());
dschinazi48ac9192019-07-31 00:07:26 -0700226 return false;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500227 }
228
229 bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override {
vasilvv0fc587f2019-09-06 13:33:08 -0700230 header_ = std::make_unique<QuicPacketHeader>((header));
fkastenholza3660102019-08-28 05:19:24 -0700231 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500232 return accept_public_header_;
233 }
234
dschinazi17d42422019-06-18 16:35:07 -0700235 bool OnUnauthenticatedHeader(const QuicPacketHeader& /*header*/) override {
fkastenholza3660102019-08-28 05:19:24 -0700236 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500237 return true;
238 }
239
fkastenholza3660102019-08-28 05:19:24 -0700240 void OnDecryptedPacket(EncryptionLevel /*level*/) override {
241 EXPECT_EQ(0u, framer_->current_received_frame_type());
242 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500243
244 bool OnPacketHeader(const QuicPacketHeader& header) override {
245 ++packet_count_;
vasilvv0fc587f2019-09-06 13:33:08 -0700246 header_ = std::make_unique<QuicPacketHeader>((header));
fkastenholza3660102019-08-28 05:19:24 -0700247 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500248 return accept_packet_;
249 }
250
251 void OnCoalescedPacket(const QuicEncryptedPacket& packet) override {
dschinazi4b5a68a2019-08-15 15:45:36 -0700252 coalesced_packets_.push_back(packet.Clone());
253 }
254
255 void OnUndecryptablePacket(const QuicEncryptedPacket& packet,
256 EncryptionLevel decryption_level,
257 bool has_decryption_key) override {
258 undecryptable_packets_.push_back(packet.Clone());
259 undecryptable_decryption_levels_.push_back(decryption_level);
260 undecryptable_has_decryption_keys_.push_back(has_decryption_key);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500261 }
262
263 bool OnStreamFrame(const QuicStreamFrame& frame) override {
264 ++frame_count_;
265 // Save a copy of the data so it is valid after the packet is processed.
vasilvvc48c8712019-03-11 13:38:16 -0700266 std::string* string_data =
267 new std::string(frame.data_buffer, frame.data_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500268 stream_data_.push_back(QuicWrapUnique(string_data));
vasilvv0fc587f2019-09-06 13:33:08 -0700269 stream_frames_.push_back(std::make_unique<QuicStreamFrame>(
QUICHE teama6ef0a62019-03-07 20:34:33 -0500270 frame.stream_id, frame.fin, frame.offset, *string_data));
fkastenholza3660102019-08-28 05:19:24 -0700271 if (VersionHasIetfQuicFrames(transport_version_)) {
272 // Low order bits of type encode flags, ignore them for this test.
273 EXPECT_TRUE(IS_IETF_STREAM_FRAME(framer_->current_received_frame_type()));
274 } else {
275 EXPECT_EQ(0u, framer_->current_received_frame_type());
276 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500277 return true;
278 }
279
280 bool OnCryptoFrame(const QuicCryptoFrame& frame) override {
281 ++frame_count_;
282 // Save a copy of the data so it is valid after the packet is processed.
vasilvvc48c8712019-03-11 13:38:16 -0700283 std::string* string_data =
284 new std::string(frame.data_buffer, frame.data_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500285 crypto_data_.push_back(QuicWrapUnique(string_data));
vasilvv0fc587f2019-09-06 13:33:08 -0700286 crypto_frames_.push_back(std::make_unique<QuicCryptoFrame>(
QUICHE team6987b4a2019-03-15 16:23:04 -0700287 ENCRYPTION_INITIAL, frame.offset, *string_data));
fkastenholza3660102019-08-28 05:19:24 -0700288 if (VersionHasIetfQuicFrames(transport_version_)) {
289 EXPECT_EQ(IETF_CRYPTO, framer_->current_received_frame_type());
290 } else {
291 EXPECT_EQ(0u, framer_->current_received_frame_type());
292 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500293 return true;
294 }
295
296 bool OnAckFrameStart(QuicPacketNumber largest_acked,
297 QuicTime::Delta ack_delay_time) override {
298 ++frame_count_;
299 QuicAckFrame ack_frame;
300 ack_frame.largest_acked = largest_acked;
301 ack_frame.ack_delay_time = ack_delay_time;
vasilvv0fc587f2019-09-06 13:33:08 -0700302 ack_frames_.push_back(std::make_unique<QuicAckFrame>(ack_frame));
fkastenholza3660102019-08-28 05:19:24 -0700303 if (VersionHasIetfQuicFrames(transport_version_)) {
304 EXPECT_EQ(IETF_ACK, framer_->current_received_frame_type());
305 } else {
306 EXPECT_EQ(0u, framer_->current_received_frame_type());
307 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500308 return true;
309 }
310
311 bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) override {
312 DCHECK(!ack_frames_.empty());
313 ack_frames_[ack_frames_.size() - 1]->packets.AddRange(start, end);
fkastenholza3660102019-08-28 05:19:24 -0700314 if (VersionHasIetfQuicFrames(transport_version_)) {
315 EXPECT_EQ(IETF_ACK, framer_->current_received_frame_type());
316 } else {
317 EXPECT_EQ(0u, framer_->current_received_frame_type());
318 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500319 return true;
320 }
321
322 bool OnAckTimestamp(QuicPacketNumber packet_number,
323 QuicTime timestamp) override {
324 ack_frames_[ack_frames_.size() - 1]->received_packet_times.push_back(
325 std::make_pair(packet_number, timestamp));
fkastenholza3660102019-08-28 05:19:24 -0700326 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500327 return true;
328 }
329
330 bool OnAckFrameEnd(QuicPacketNumber /*start*/) override { return true; }
331
332 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override {
333 ++frame_count_;
vasilvv0fc587f2019-09-06 13:33:08 -0700334 stop_waiting_frames_.push_back(
335 std::make_unique<QuicStopWaitingFrame>(frame));
fkastenholza3660102019-08-28 05:19:24 -0700336 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500337 return true;
338 }
339
340 bool OnPaddingFrame(const QuicPaddingFrame& frame) override {
vasilvv0fc587f2019-09-06 13:33:08 -0700341 padding_frames_.push_back(std::make_unique<QuicPaddingFrame>(frame));
fkastenholza3660102019-08-28 05:19:24 -0700342 if (VersionHasIetfQuicFrames(transport_version_)) {
343 EXPECT_EQ(IETF_PADDING, 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 OnPingFrame(const QuicPingFrame& frame) override {
351 ++frame_count_;
vasilvv0fc587f2019-09-06 13:33:08 -0700352 ping_frames_.push_back(std::make_unique<QuicPingFrame>(frame));
fkastenholza3660102019-08-28 05:19:24 -0700353 if (VersionHasIetfQuicFrames(transport_version_)) {
354 EXPECT_EQ(IETF_PING, framer_->current_received_frame_type());
355 } else {
356 EXPECT_EQ(0u, framer_->current_received_frame_type());
357 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500358 return true;
359 }
360
361 bool OnMessageFrame(const QuicMessageFrame& frame) override {
362 ++frame_count_;
363 message_frames_.push_back(
vasilvv0fc587f2019-09-06 13:33:08 -0700364 std::make_unique<QuicMessageFrame>(frame.data, frame.message_length));
fkastenholza3660102019-08-28 05:19:24 -0700365 if (VersionHasIetfQuicFrames(transport_version_)) {
366 EXPECT_TRUE(IETF_EXTENSION_MESSAGE_NO_LENGTH ==
367 framer_->current_received_frame_type() ||
368 IETF_EXTENSION_MESSAGE ==
369 framer_->current_received_frame_type());
370 } else {
371 EXPECT_EQ(0u, framer_->current_received_frame_type());
372 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500373 return true;
374 }
375
376 void OnPacketComplete() override { ++complete_packets_; }
377
378 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override {
379 rst_stream_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700380 if (VersionHasIetfQuicFrames(transport_version_)) {
381 EXPECT_EQ(IETF_RST_STREAM, framer_->current_received_frame_type());
382 } else {
383 EXPECT_EQ(0u, framer_->current_received_frame_type());
384 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500385 return true;
386 }
387
388 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override {
389 connection_close_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700390 if (VersionHasIetfQuicFrames(transport_version_)) {
391 EXPECT_NE(GOOGLE_QUIC_CONNECTION_CLOSE, frame.close_type);
392 if (frame.close_type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
393 EXPECT_EQ(IETF_CONNECTION_CLOSE,
394 framer_->current_received_frame_type());
395 } else {
396 EXPECT_EQ(IETF_APPLICATION_CLOSE,
397 framer_->current_received_frame_type());
398 }
399 } else {
400 EXPECT_EQ(0u, framer_->current_received_frame_type());
401 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500402 return true;
403 }
404
QUICHE teama6ef0a62019-03-07 20:34:33 -0500405 bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override {
406 stop_sending_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700407 EXPECT_EQ(IETF_STOP_SENDING, framer_->current_received_frame_type());
408 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500409 return true;
410 }
411
412 bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override {
413 path_challenge_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700414 EXPECT_EQ(IETF_PATH_CHALLENGE, framer_->current_received_frame_type());
415 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500416 return true;
417 }
418
419 bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override {
420 path_response_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700421 EXPECT_EQ(IETF_PATH_RESPONSE, framer_->current_received_frame_type());
422 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500423 return true;
424 }
425
426 bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override {
427 goaway_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700428 EXPECT_FALSE(VersionHasIetfQuicFrames(transport_version_));
429 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500430 return true;
431 }
432
fkastenholz3c4eabf2019-04-22 07:49:59 -0700433 bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& frame) override {
434 max_streams_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700435 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
436 EXPECT_TRUE(IETF_MAX_STREAMS_UNIDIRECTIONAL ==
437 framer_->current_received_frame_type() ||
438 IETF_MAX_STREAMS_BIDIRECTIONAL ==
439 framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500440 return true;
441 }
442
fkastenholz3c4eabf2019-04-22 07:49:59 -0700443 bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame) override {
444 streams_blocked_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700445 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
446 EXPECT_TRUE(IETF_STREAMS_BLOCKED_UNIDIRECTIONAL ==
447 framer_->current_received_frame_type() ||
448 IETF_STREAMS_BLOCKED_BIDIRECTIONAL ==
449 framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500450 return true;
451 }
452
453 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override {
454 window_update_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700455 if (VersionHasIetfQuicFrames(transport_version_)) {
456 EXPECT_TRUE(IETF_MAX_DATA == framer_->current_received_frame_type() ||
457 IETF_MAX_STREAM_DATA ==
458 framer_->current_received_frame_type());
459 } else {
460 EXPECT_EQ(0u, framer_->current_received_frame_type());
461 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500462 return true;
463 }
464
465 bool OnBlockedFrame(const QuicBlockedFrame& frame) override {
466 blocked_frame_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700467 if (VersionHasIetfQuicFrames(transport_version_)) {
468 EXPECT_TRUE(IETF_BLOCKED == framer_->current_received_frame_type() ||
469 IETF_STREAM_BLOCKED ==
470 framer_->current_received_frame_type());
471 } else {
472 EXPECT_EQ(0u, framer_->current_received_frame_type());
473 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500474 return true;
475 }
476
477 bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override {
478 new_connection_id_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700479 EXPECT_EQ(IETF_NEW_CONNECTION_ID, framer_->current_received_frame_type());
480 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500481 return true;
482 }
483
484 bool OnRetireConnectionIdFrame(
485 const QuicRetireConnectionIdFrame& frame) override {
fkastenholza3660102019-08-28 05:19:24 -0700486 EXPECT_EQ(IETF_RETIRE_CONNECTION_ID,
487 framer_->current_received_frame_type());
488 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500489 retire_connection_id_ = frame;
490 return true;
491 }
492
493 bool OnNewTokenFrame(const QuicNewTokenFrame& frame) override {
494 new_token_ = frame;
fkastenholza3660102019-08-28 05:19:24 -0700495 EXPECT_EQ(IETF_NEW_TOKEN, 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 IsValidStatelessResetToken(QuicUint128 token) const override {
fkastenholza3660102019-08-28 05:19:24 -0700501 EXPECT_EQ(0u, framer_->current_received_frame_type());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500502 return token == kTestStatelessResetToken;
503 }
504
505 void OnAuthenticatedIetfStatelessResetPacket(
506 const QuicIetfStatelessResetPacket& packet) override {
507 stateless_reset_packet_ =
vasilvv0fc587f2019-09-06 13:33:08 -0700508 std::make_unique<QuicIetfStatelessResetPacket>(packet);
fkastenholza3660102019-08-28 05:19:24 -0700509 EXPECT_EQ(0u, framer_->current_received_frame_type());
510 }
511
512 void set_framer(QuicFramer* framer) {
513 framer_ = framer;
514 transport_version_ = framer->transport_version();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500515 }
516
517 // Counters from the visitor_ callbacks.
518 int error_count_;
519 int version_mismatch_;
520 int packet_count_;
521 int frame_count_;
522 int complete_packets_;
523 bool accept_packet_;
524 bool accept_public_header_;
525
526 std::unique_ptr<QuicPacketHeader> header_;
527 std::unique_ptr<QuicPublicResetPacket> public_reset_packet_;
528 std::unique_ptr<QuicIetfStatelessResetPacket> stateless_reset_packet_;
529 std::unique_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_;
dschinazi244f6dc2019-05-06 15:45:16 -0700530 std::unique_ptr<QuicConnectionId> retry_original_connection_id_;
531 std::unique_ptr<QuicConnectionId> retry_new_connection_id_;
532 std::unique_ptr<std::string> retry_token_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500533 std::vector<std::unique_ptr<QuicStreamFrame>> stream_frames_;
534 std::vector<std::unique_ptr<QuicCryptoFrame>> crypto_frames_;
535 std::vector<std::unique_ptr<QuicAckFrame>> ack_frames_;
536 std::vector<std::unique_ptr<QuicStopWaitingFrame>> stop_waiting_frames_;
537 std::vector<std::unique_ptr<QuicPaddingFrame>> padding_frames_;
538 std::vector<std::unique_ptr<QuicPingFrame>> ping_frames_;
539 std::vector<std::unique_ptr<QuicMessageFrame>> message_frames_;
540 std::vector<std::unique_ptr<QuicEncryptedPacket>> coalesced_packets_;
dschinazi4b5a68a2019-08-15 15:45:36 -0700541 std::vector<std::unique_ptr<QuicEncryptedPacket>> undecryptable_packets_;
542 std::vector<EncryptionLevel> undecryptable_decryption_levels_;
543 std::vector<bool> undecryptable_has_decryption_keys_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500544 QuicRstStreamFrame rst_stream_frame_;
545 QuicConnectionCloseFrame connection_close_frame_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500546 QuicStopSendingFrame stop_sending_frame_;
547 QuicGoAwayFrame goaway_frame_;
548 QuicPathChallengeFrame path_challenge_frame_;
549 QuicPathResponseFrame path_response_frame_;
550 QuicWindowUpdateFrame window_update_frame_;
551 QuicBlockedFrame blocked_frame_;
fkastenholz3c4eabf2019-04-22 07:49:59 -0700552 QuicStreamsBlockedFrame streams_blocked_frame_;
553 QuicMaxStreamsFrame max_streams_frame_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500554 QuicNewConnectionIdFrame new_connection_id_;
555 QuicRetireConnectionIdFrame retire_connection_id_;
556 QuicNewTokenFrame new_token_;
vasilvvc48c8712019-03-11 13:38:16 -0700557 std::vector<std::unique_ptr<std::string>> stream_data_;
558 std::vector<std::unique_ptr<std::string>> crypto_data_;
fkastenholza3660102019-08-28 05:19:24 -0700559 QuicTransportVersion transport_version_;
560 QuicFramer* framer_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500561};
562
563// Simple struct for defining a packet's content, and associated
564// parse error.
565struct PacketFragment {
vasilvvc48c8712019-03-11 13:38:16 -0700566 std::string error_if_missing;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500567 std::vector<unsigned char> fragment;
568};
569
570using PacketFragments = std::vector<struct PacketFragment>;
571
QUICHE teama6ef0a62019-03-07 20:34:33 -0500572class QuicFramerTest : public QuicTestWithParam<ParsedQuicVersion> {
573 public:
574 QuicFramerTest()
575 : encrypter_(new test::TestEncrypter()),
576 decrypter_(new test::TestDecrypter()),
577 version_(GetParam()),
578 start_(QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(0x10)),
nharperf5e68452019-05-29 17:24:18 -0700579 framer_(AllSupportedVersions(),
QUICHE teama6ef0a62019-03-07 20:34:33 -0500580 start_,
581 Perspective::IS_SERVER,
582 kQuicDefaultConnectionIdLength) {
wub49855982019-05-01 14:16:26 -0700583 SetQuicFlag(FLAGS_quic_supports_tls_handshake, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500584 framer_.set_version(version_);
zhongyi546cc452019-04-12 15:27:49 -0700585 if (framer_.version().KnowsWhichDecrypterToUse()) {
586 framer_.InstallDecrypter(ENCRYPTION_INITIAL,
587 std::unique_ptr<QuicDecrypter>(decrypter_));
588 } else {
589 framer_.SetDecrypter(ENCRYPTION_INITIAL,
590 std::unique_ptr<QuicDecrypter>(decrypter_));
591 }
QUICHE team6987b4a2019-03-15 16:23:04 -0700592 framer_.SetEncrypter(ENCRYPTION_INITIAL,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500593 std::unique_ptr<QuicEncrypter>(encrypter_));
594
595 framer_.set_visitor(&visitor_);
596 framer_.InferPacketHeaderTypeFromVersion();
fkastenholza3660102019-08-28 05:19:24 -0700597 visitor_.set_framer(&framer_);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500598 }
599
zhongyi546cc452019-04-12 15:27:49 -0700600 void SetDecrypterLevel(EncryptionLevel level) {
601 if (!framer_.version().KnowsWhichDecrypterToUse()) {
602 return;
603 }
604 decrypter_ = new TestDecrypter();
605 framer_.InstallDecrypter(level, std::unique_ptr<QuicDecrypter>(decrypter_));
606 }
607
QUICHE teama6ef0a62019-03-07 20:34:33 -0500608 // Helper function to get unsigned char representation of the handshake
rcha702be22019-08-30 15:20:12 -0700609 // protocol byte at position |pos| of the current QUIC version number.
610 unsigned char GetQuicVersionByte(int pos) {
611 return (CreateQuicVersionLabel(version_) >> 8 * (3 - pos)) & 0xff;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500612 }
613
614 bool CheckEncryption(QuicPacketNumber packet_number, QuicPacket* packet) {
615 if (packet_number != encrypter_->packet_number_) {
616 QUIC_LOG(ERROR) << "Encrypted incorrect packet number. expected "
617 << packet_number
618 << " actual: " << encrypter_->packet_number_;
619 return false;
620 }
621 if (packet->AssociatedData(framer_.transport_version()) !=
622 encrypter_->associated_data_) {
623 QUIC_LOG(ERROR) << "Encrypted incorrect associated data. expected "
624 << packet->AssociatedData(framer_.transport_version())
625 << " actual: " << encrypter_->associated_data_;
626 return false;
627 }
628 if (packet->Plaintext(framer_.transport_version()) !=
629 encrypter_->plaintext_) {
630 QUIC_LOG(ERROR) << "Encrypted incorrect plaintext data. expected "
631 << packet->Plaintext(framer_.transport_version())
632 << " actual: " << encrypter_->plaintext_;
633 return false;
634 }
635 return true;
636 }
637
638 bool CheckDecryption(const QuicEncryptedPacket& encrypted,
639 bool includes_version,
640 bool includes_diversification_nonce,
641 QuicConnectionIdLength destination_connection_id_length,
642 QuicConnectionIdLength source_connection_id_length) {
643 return CheckDecryption(
644 encrypted, includes_version, includes_diversification_nonce,
645 destination_connection_id_length, source_connection_id_length,
646 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
647 }
648
649 bool CheckDecryption(
650 const QuicEncryptedPacket& encrypted,
651 bool includes_version,
652 bool includes_diversification_nonce,
653 QuicConnectionIdLength destination_connection_id_length,
654 QuicConnectionIdLength source_connection_id_length,
655 QuicVariableLengthIntegerLength retry_token_length_length,
656 size_t retry_token_length,
657 QuicVariableLengthIntegerLength length_length) {
658 if (visitor_.header_->packet_number != decrypter_->packet_number_) {
659 QUIC_LOG(ERROR) << "Decrypted incorrect packet number. expected "
660 << visitor_.header_->packet_number
661 << " actual: " << decrypter_->packet_number_;
662 return false;
663 }
664 QuicStringPiece associated_data =
665 QuicFramer::GetAssociatedDataFromEncryptedPacket(
666 framer_.transport_version(), encrypted,
667 destination_connection_id_length, source_connection_id_length,
668 includes_version, includes_diversification_nonce,
669 PACKET_4BYTE_PACKET_NUMBER, retry_token_length_length,
670 retry_token_length, length_length);
671 if (associated_data != decrypter_->associated_data_) {
672 QUIC_LOG(ERROR) << "Decrypted incorrect associated data. expected "
673 << QuicTextUtils::HexEncode(associated_data)
674 << " actual: "
675 << QuicTextUtils::HexEncode(decrypter_->associated_data_);
676 return false;
677 }
678 QuicStringPiece ciphertext(
679 encrypted.AsStringPiece().substr(GetStartOfEncryptedData(
680 framer_.transport_version(), destination_connection_id_length,
681 source_connection_id_length, includes_version,
682 includes_diversification_nonce, PACKET_4BYTE_PACKET_NUMBER,
683 retry_token_length_length, retry_token_length, length_length)));
684 if (ciphertext != decrypter_->ciphertext_) {
685 QUIC_LOG(ERROR) << "Decrypted incorrect ciphertext data. expected "
686 << QuicTextUtils::HexEncode(ciphertext) << " actual: "
687 << QuicTextUtils::HexEncode(decrypter_->ciphertext_)
688 << " associated data: "
689 << QuicTextUtils::HexEncode(associated_data);
690 return false;
691 }
692 return true;
693 }
694
695 char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); }
696
697 // Creates a new QuicEncryptedPacket by concatenating the various
698 // packet fragments in |fragments|.
699 std::unique_ptr<QuicEncryptedPacket> AssemblePacketFromFragments(
700 const PacketFragments& fragments) {
dschinazi66dea072019-04-09 11:41:06 -0700701 char* buffer = new char[kMaxOutgoingPacketSize + 1];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500702 size_t len = 0;
703 for (const auto& fragment : fragments) {
704 memcpy(buffer + len, fragment.fragment.data(), fragment.fragment.size());
705 len += fragment.fragment.size();
706 }
vasilvv0fc587f2019-09-06 13:33:08 -0700707 return std::make_unique<QuicEncryptedPacket>(buffer, len, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500708 }
709
710 void CheckFramingBoundaries(const PacketFragments& fragments,
711 QuicErrorCode error_code) {
712 std::unique_ptr<QuicEncryptedPacket> packet(
713 AssemblePacketFromFragments(fragments));
714 // Check all the various prefixes of |packet| for the expected
715 // parse error and error code.
716 for (size_t i = 0; i < packet->length(); ++i) {
vasilvvc48c8712019-03-11 13:38:16 -0700717 std::string expected_error;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500718 size_t len = 0;
719 for (const auto& fragment : fragments) {
720 len += fragment.fragment.size();
721 if (i < len) {
722 expected_error = fragment.error_if_missing;
723 break;
724 }
725 }
726
727 if (expected_error.empty())
728 continue;
729
730 CheckProcessingFails(*packet, i, expected_error, error_code);
731 }
732 }
733
734 void CheckProcessingFails(const QuicEncryptedPacket& packet,
735 size_t len,
vasilvvc48c8712019-03-11 13:38:16 -0700736 std::string expected_error,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500737 QuicErrorCode error_code) {
738 QuicEncryptedPacket encrypted(packet.data(), len, false);
739 EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
740 EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len;
741 EXPECT_EQ(error_code, framer_.error()) << "len: " << len;
742 }
743
744 void CheckProcessingFails(unsigned char* packet,
745 size_t len,
vasilvvc48c8712019-03-11 13:38:16 -0700746 std::string expected_error,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500747 QuicErrorCode error_code) {
748 QuicEncryptedPacket encrypted(AsChars(packet), len, false);
749 EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
750 EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len;
751 EXPECT_EQ(error_code, framer_.error()) << "len: " << len;
752 }
753
754 // Checks if the supplied string matches data in the supplied StreamFrame.
vasilvvc48c8712019-03-11 13:38:16 -0700755 void CheckStreamFrameData(std::string str, QuicStreamFrame* frame) {
756 EXPECT_EQ(str, std::string(frame->data_buffer, frame->data_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500757 }
758
759 void CheckCalculatePacketNumber(uint64_t expected_packet_number,
760 QuicPacketNumber last_packet_number) {
761 uint64_t wire_packet_number = expected_packet_number & kMask;
762 EXPECT_EQ(expected_packet_number,
763 QuicFramerPeer::CalculatePacketNumberFromWire(
764 &framer_, PACKET_4BYTE_PACKET_NUMBER, last_packet_number,
765 wire_packet_number))
766 << "last_packet_number: " << last_packet_number
767 << " wire_packet_number: " << wire_packet_number;
768 }
769
770 std::unique_ptr<QuicPacket> BuildDataPacket(const QuicPacketHeader& header,
771 const QuicFrames& frames) {
772 return BuildUnsizedDataPacket(&framer_, header, frames);
773 }
774
775 std::unique_ptr<QuicPacket> BuildDataPacket(const QuicPacketHeader& header,
776 const QuicFrames& frames,
777 size_t packet_size) {
778 return BuildUnsizedDataPacket(&framer_, header, frames, packet_size);
779 }
780
781 // N starts at 1.
782 QuicStreamId GetNthStreamid(QuicTransportVersion transport_version,
783 Perspective perspective,
784 bool bidirectional,
785 int n) {
786 if (bidirectional) {
787 return QuicUtils::GetFirstBidirectionalStreamId(transport_version,
788 perspective) +
789 ((n - 1) * QuicUtils::StreamIdDelta(transport_version));
790 }
791 // Unidirectional
792 return QuicUtils::GetFirstUnidirectionalStreamId(transport_version,
793 perspective) +
794 ((n - 1) * QuicUtils::StreamIdDelta(transport_version));
795 }
796
797 test::TestEncrypter* encrypter_;
798 test::TestDecrypter* decrypter_;
799 ParsedQuicVersion version_;
800 QuicTime start_;
801 QuicFramer framer_;
802 test::TestQuicVisitor visitor_;
803 SimpleBufferAllocator allocator_;
804};
805
806// Multiple test cases of QuicFramerTest use byte arrays to define packets for
807// testing, and these byte arrays contain the QUIC version. This macro explodes
808// the 32-bit version into four bytes in network order. Since it uses methods of
809// QuicFramerTest, it is only valid to use this in a QuicFramerTest.
rcha702be22019-08-30 15:20:12 -0700810#define QUIC_VERSION_BYTES \
811 GetQuicVersionByte(0), GetQuicVersionByte(1), GetQuicVersionByte(2), \
812 GetQuicVersionByte(3)
QUICHE teama6ef0a62019-03-07 20:34:33 -0500813
814// Run all framer tests with all supported versions of QUIC.
nharperf5e68452019-05-29 17:24:18 -0700815INSTANTIATE_TEST_SUITE_P(QuicFramerTests,
816 QuicFramerTest,
817 ::testing::ValuesIn(AllSupportedVersions()));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500818
819TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochStart) {
820 // A few quick manual sanity checks.
821 CheckCalculatePacketNumber(UINT64_C(1), QuicPacketNumber());
822 CheckCalculatePacketNumber(kEpoch + 1, QuicPacketNumber(kMask));
823 CheckCalculatePacketNumber(kEpoch, QuicPacketNumber(kMask));
824 for (uint64_t j = 0; j < 10; j++) {
825 CheckCalculatePacketNumber(j, QuicPacketNumber());
826 CheckCalculatePacketNumber(kEpoch - 1 - j, QuicPacketNumber());
827 }
828
829 // Cases where the last number was close to the start of the range.
830 for (QuicPacketNumber last = QuicPacketNumber(1); last < QuicPacketNumber(10);
831 last++) {
832 // Small numbers should not wrap (even if they're out of order).
833 for (uint64_t j = 0; j < 10; j++) {
834 CheckCalculatePacketNumber(j, last);
835 }
836
837 // Large numbers should not wrap either (because we're near 0 already).
838 for (uint64_t j = 0; j < 10; j++) {
839 CheckCalculatePacketNumber(kEpoch - 1 - j, last);
840 }
841 }
842}
843
844TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochEnd) {
845 // Cases where the last number was close to the end of the range
846 for (uint64_t i = 0; i < 10; i++) {
847 QuicPacketNumber last = QuicPacketNumber(kEpoch - i);
848
849 // Small numbers should wrap.
850 for (uint64_t j = 0; j < 10; j++) {
851 CheckCalculatePacketNumber(kEpoch + j, last);
852 }
853
854 // Large numbers should not (even if they're out of order).
855 for (uint64_t j = 0; j < 10; j++) {
856 CheckCalculatePacketNumber(kEpoch - 1 - j, last);
857 }
858 }
859}
860
861// Next check where we're in a non-zero epoch to verify we handle
862// reverse wrapping, too.
863TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearPrevEpoch) {
864 const uint64_t prev_epoch = 1 * kEpoch;
865 const uint64_t cur_epoch = 2 * kEpoch;
866 // Cases where the last number was close to the start of the range
867 for (uint64_t i = 0; i < 10; i++) {
868 QuicPacketNumber last = QuicPacketNumber(cur_epoch + i);
869 // Small number should not wrap (even if they're out of order).
870 for (uint64_t j = 0; j < 10; j++) {
871 CheckCalculatePacketNumber(cur_epoch + j, last);
872 }
873
874 // But large numbers should reverse wrap.
875 for (uint64_t j = 0; j < 10; j++) {
876 uint64_t num = kEpoch - 1 - j;
877 CheckCalculatePacketNumber(prev_epoch + num, last);
878 }
879 }
880}
881
882TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextEpoch) {
883 const uint64_t cur_epoch = 2 * kEpoch;
884 const uint64_t next_epoch = 3 * kEpoch;
885 // Cases where the last number was close to the end of the range
886 for (uint64_t i = 0; i < 10; i++) {
887 QuicPacketNumber last = QuicPacketNumber(next_epoch - 1 - i);
888
889 // Small numbers should wrap.
890 for (uint64_t j = 0; j < 10; j++) {
891 CheckCalculatePacketNumber(next_epoch + j, last);
892 }
893
894 // but large numbers should not (even if they're out of order).
895 for (uint64_t j = 0; j < 10; j++) {
896 uint64_t num = kEpoch - 1 - j;
897 CheckCalculatePacketNumber(cur_epoch + num, last);
898 }
899 }
900}
901
902TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextMax) {
903 const uint64_t max_number = std::numeric_limits<uint64_t>::max();
904 const uint64_t max_epoch = max_number & ~kMask;
905
906 // Cases where the last number was close to the end of the range
907 for (uint64_t i = 0; i < 10; i++) {
908 // Subtract 1, because the expected next packet number is 1 more than the
909 // last packet number.
910 QuicPacketNumber last = QuicPacketNumber(max_number - i - 1);
911
912 // Small numbers should not wrap, because they have nowhere to go.
913 for (uint64_t j = 0; j < 10; j++) {
914 CheckCalculatePacketNumber(max_epoch + j, last);
915 }
916
917 // Large numbers should not wrap either.
918 for (uint64_t j = 0; j < 10; j++) {
919 uint64_t num = kEpoch - 1 - j;
920 CheckCalculatePacketNumber(max_epoch + num, last);
921 }
922 }
923}
924
925TEST_P(QuicFramerTest, EmptyPacket) {
926 char packet[] = {0x00};
927 QuicEncryptedPacket encrypted(packet, 0, false);
928 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
929 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
930}
931
932TEST_P(QuicFramerTest, LargePacket) {
zhongyi546cc452019-04-12 15:27:49 -0700933 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500934 // clang-format off
dschinazie8d7fa72019-04-05 14:44:40 -0700935 unsigned char packet[kMaxIncomingPacketSize + 1] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500936 // public flags (8 byte connection_id)
937 0x28,
938 // connection_id
939 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
940 // packet number
941 0x78, 0x56, 0x34, 0x12,
942 // private flags
943 0x00,
944 };
dschinazie8d7fa72019-04-05 14:44:40 -0700945 unsigned char packet46[kMaxIncomingPacketSize + 1] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500946 // type (short header 4 byte packet number)
947 0x43,
948 // connection_id
949 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
950 // packet number
951 0x78, 0x56, 0x34, 0x12,
952 };
953 // clang-format on
954 unsigned char* p = packet;
955 size_t p_size = QUIC_ARRAYSIZE(packet);
fayang36825da2019-08-21 14:01:27 -0700956 if (framer_.transport_version() > QUIC_VERSION_43) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500957 p = packet46;
958 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500959 }
960
961 const size_t header_size = GetPacketHeaderSize(
962 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
963 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
964 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
965 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
966
dschinazie8d7fa72019-04-05 14:44:40 -0700967 memset(p + header_size, 0, kMaxIncomingPacketSize - header_size);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500968
969 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
dschinazie8d7fa72019-04-05 14:44:40 -0700970 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500971
972 ASSERT_TRUE(visitor_.header_.get());
973 // Make sure we've parsed the packet header, so we can send an error.
974 EXPECT_EQ(FramerTestConnectionId(),
975 visitor_.header_->destination_connection_id);
976 // Make sure the correct error is propagated.
977 EXPECT_EQ(QUIC_PACKET_TOO_LARGE, framer_.error());
dschinazie8d7fa72019-04-05 14:44:40 -0700978 EXPECT_EQ("Packet too large.", framer_.detailed_error());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500979}
980
981TEST_P(QuicFramerTest, PacketHeader) {
982 if (framer_.transport_version() > QUIC_VERSION_43) {
983 return;
984 }
985
986 // clang-format off
987 PacketFragments packet = {
988 // public flags (8 byte connection_id)
989 {"Unable to read public flags.",
990 {0x28}},
991 // connection_id
992 {"Unable to read ConnectionId.",
993 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
994 // packet number
995 {"Unable to read packet number.",
996 {0x12, 0x34, 0x56, 0x78}},
997 };
998 // clang-format on
999
1000 PacketFragments& fragments = packet;
1001
1002 std::unique_ptr<QuicEncryptedPacket> encrypted(
1003 AssemblePacketFromFragments(fragments));
1004
1005 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1006 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1007 ASSERT_TRUE(visitor_.header_.get());
1008 EXPECT_EQ(FramerTestConnectionId(),
1009 visitor_.header_->destination_connection_id);
1010 EXPECT_FALSE(visitor_.header_->reset_flag);
1011 EXPECT_FALSE(visitor_.header_->version_flag);
1012 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1013
1014 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
fayangccbab732019-05-13 10:11:25 -07001015
1016 PacketHeaderFormat format;
1017 bool version_flag;
dschinazib42a8c52019-05-30 09:45:01 -07001018 QuicConnectionId destination_connection_id, source_connection_id;
fayangccbab732019-05-13 10:11:25 -07001019 QuicVersionLabel version_label;
1020 std::string detailed_error;
dschinazi48ac9192019-07-31 00:07:26 -07001021 QuicErrorCode error_code;
1022 if (!GetQuicReloadableFlag(quic_use_parse_public_header)) {
1023 error_code = QuicFramer::ProcessPacketDispatcher(
1024 *encrypted, kQuicDefaultConnectionIdLength, &format, &version_flag,
1025 &version_label, &destination_connection_id, &source_connection_id,
1026 &detailed_error);
1027 } else {
1028 bool retry_token_present, use_length_prefix;
1029 QuicStringPiece retry_token;
1030 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1031 error_code = QuicFramer::ParsePublicHeaderDispatcher(
1032 *encrypted, kQuicDefaultConnectionIdLength, &format, &version_flag,
1033 &use_length_prefix, &version_label, &parsed_version,
1034 &destination_connection_id, &source_connection_id, &retry_token_present,
1035 &retry_token, &detailed_error);
1036 EXPECT_FALSE(retry_token_present);
1037 EXPECT_FALSE(use_length_prefix);
1038 }
1039 EXPECT_EQ(QUIC_NO_ERROR, error_code);
fayangccbab732019-05-13 10:11:25 -07001040 EXPECT_EQ(GOOGLE_QUIC_PACKET, format);
1041 EXPECT_FALSE(version_flag);
dschinazib42a8c52019-05-30 09:45:01 -07001042 EXPECT_EQ(kQuicDefaultConnectionIdLength, destination_connection_id.length());
fayangccbab732019-05-13 10:11:25 -07001043 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
dschinazib42a8c52019-05-30 09:45:01 -07001044 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001045}
1046
1047TEST_P(QuicFramerTest, LongPacketHeader) {
1048 // clang-format off
QUICHE teama6ef0a62019-03-07 20:34:33 -05001049 PacketFragments packet46 = {
1050 // type (long header with packet type INITIAL)
dschinazi48ac9192019-07-31 00:07:26 -07001051 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001052 {0xC3}},
1053 // version tag
1054 {"Unable to read protocol version.",
1055 {QUIC_VERSION_BYTES}},
1056 // connection_id length
1057 {"Unable to read ConnectionId length.",
1058 {0x50}},
1059 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001060 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001061 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1062 // packet number
1063 {"Unable to read packet number.",
1064 {0x12, 0x34, 0x56, 0x78}},
1065 };
1066 // clang-format on
1067
1068 if (framer_.transport_version() <= QUIC_VERSION_43 ||
1069 QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
1070 return;
1071 }
1072
QUICHE teama6ef0a62019-03-07 20:34:33 -05001073 std::unique_ptr<QuicEncryptedPacket> encrypted(
fayang36825da2019-08-21 14:01:27 -07001074 AssemblePacketFromFragments(packet46));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001075
1076 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1077 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1078 ASSERT_TRUE(visitor_.header_.get());
1079 EXPECT_EQ(FramerTestConnectionId(),
1080 visitor_.header_->destination_connection_id);
1081 EXPECT_FALSE(visitor_.header_->reset_flag);
1082 EXPECT_TRUE(visitor_.header_->version_flag);
1083 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1084
fayang36825da2019-08-21 14:01:27 -07001085 CheckFramingBoundaries(packet46, QUIC_INVALID_PACKET_HEADER);
fayangccbab732019-05-13 10:11:25 -07001086
1087 PacketHeaderFormat format;
1088 bool version_flag;
dschinazib42a8c52019-05-30 09:45:01 -07001089 QuicConnectionId destination_connection_id, source_connection_id;
fayangccbab732019-05-13 10:11:25 -07001090 QuicVersionLabel version_label;
1091 std::string detailed_error;
dschinazi48ac9192019-07-31 00:07:26 -07001092 QuicErrorCode error_code;
1093 if (!GetQuicReloadableFlag(quic_use_parse_public_header)) {
1094 error_code = QuicFramer::ProcessPacketDispatcher(
1095 *encrypted, kQuicDefaultConnectionIdLength, &format, &version_flag,
1096 &version_label, &destination_connection_id, &source_connection_id,
1097 &detailed_error);
1098 } else {
1099 bool retry_token_present, use_length_prefix;
1100 QuicStringPiece retry_token;
1101 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1102 error_code = QuicFramer::ParsePublicHeaderDispatcher(
1103 *encrypted, kQuicDefaultConnectionIdLength, &format, &version_flag,
1104 &use_length_prefix, &version_label, &parsed_version,
1105 &destination_connection_id, &source_connection_id, &retry_token_present,
1106 &retry_token, &detailed_error);
1107 EXPECT_EQ(retry_token_present, framer_.version().SupportsRetry());
1108 EXPECT_FALSE(use_length_prefix);
1109 }
fayangccbab732019-05-13 10:11:25 -07001110 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1111 EXPECT_TRUE(version_flag);
dschinazib42a8c52019-05-30 09:45:01 -07001112 EXPECT_EQ(kQuicDefaultConnectionIdLength, destination_connection_id.length());
fayangccbab732019-05-13 10:11:25 -07001113 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
dschinazib42a8c52019-05-30 09:45:01 -07001114 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1115}
1116
1117TEST_P(QuicFramerTest, LongPacketHeaderWithBothConnectionIds) {
1118 if (framer_.transport_version() <= QUIC_VERSION_43) {
1119 // This test requires an IETF long header.
1120 return;
1121 }
dschinazi48ac9192019-07-31 00:07:26 -07001122 SetQuicReloadableFlag(quic_use_parse_public_header, false);
dschinazib42a8c52019-05-30 09:45:01 -07001123 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
dschinazib42a8c52019-05-30 09:45:01 -07001124 // clang-format off
1125 unsigned char packet[] = {
1126 // public flags (long header with packet type ZERO_RTT_PROTECTED and
1127 // 4-byte packet number)
fayang36825da2019-08-21 14:01:27 -07001128 0xD3,
dschinazib42a8c52019-05-30 09:45:01 -07001129 // version
1130 QUIC_VERSION_BYTES,
1131 // connection ID lengths
1132 0x55,
1133 // destination connection ID
1134 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1135 // source connection ID
1136 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
1137 // long header packet length
1138 0x05,
1139 // packet number
1140 0x12, 0x34, 0x56, 0x00,
1141 // padding frame
1142 0x00,
1143 };
1144 // clang-format on
1145
1146 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
1147 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1148 bool version_flag = false;
1149 QuicConnectionId destination_connection_id, source_connection_id;
1150 QuicVersionLabel version_label = 0;
1151 std::string detailed_error = "";
dschinazi48ac9192019-07-31 00:07:26 -07001152 QuicErrorCode error_code;
1153 if (!GetQuicReloadableFlag(quic_use_parse_public_header)) {
1154 error_code = QuicFramer::ProcessPacketDispatcher(
1155 encrypted, kQuicDefaultConnectionIdLength, &format, &version_flag,
1156 &version_label, &destination_connection_id, &source_connection_id,
1157 &detailed_error);
1158 } else {
1159 bool retry_token_present, use_length_prefix;
1160 QuicStringPiece retry_token;
1161 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1162 error_code = QuicFramer::ParsePublicHeaderDispatcher(
1163 encrypted, kQuicDefaultConnectionIdLength, &format, &version_flag,
1164 &use_length_prefix, &version_label, &parsed_version,
1165 &destination_connection_id, &source_connection_id, &retry_token_present,
1166 &retry_token, &detailed_error);
1167 EXPECT_FALSE(retry_token_present);
1168 EXPECT_FALSE(use_length_prefix);
1169 }
dschinazib42a8c52019-05-30 09:45:01 -07001170 EXPECT_EQ("", detailed_error);
1171 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1172 EXPECT_TRUE(version_flag);
1173 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1174 EXPECT_EQ(FramerTestConnectionIdPlusOne(), source_connection_id);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001175}
1176
dschinazi243eabc2019-08-05 16:15:29 -07001177TEST_P(QuicFramerTest, ParsePublicHeader) {
dschinazi243eabc2019-08-05 16:15:29 -07001178 // clang-format off
1179 unsigned char packet[] = {
1180 // public flags (version included, 8-byte connection ID,
1181 // 4-byte packet number)
1182 0x29,
1183 // connection_id
1184 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1185 // version
1186 QUIC_VERSION_BYTES,
1187 // packet number
1188 0x12, 0x34, 0x56, 0x78,
1189 // padding frame
1190 0x00,
1191 };
fayang36825da2019-08-21 14:01:27 -07001192 unsigned char packet46[] = {
1193 // public flags (long header with packet type HANDSHAKE and
1194 // 4-byte packet number)
1195 0xE3,
1196 // version
1197 QUIC_VERSION_BYTES,
1198 // connection ID lengths
1199 0x50,
1200 // destination connection ID
1201 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1202 // long header packet length
1203 0x05,
1204 // packet number
1205 0x12, 0x34, 0x56, 0x78,
1206 // padding frame
1207 0x00,
dschinazi243eabc2019-08-05 16:15:29 -07001208 };
1209 unsigned char packet99[] = {
1210 // public flags (long header with packet type HANDSHAKE and
1211 // 4-byte packet number)
1212 0xE3,
1213 // version
1214 QUIC_VERSION_BYTES,
1215 // destination connection ID length
1216 0x08,
1217 // destination connection ID
1218 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1219 // source connection ID length
1220 0x00,
1221 // long header packet length
1222 0x05,
1223 // packet number
1224 0x12, 0x34, 0x56, 0x78,
1225 // padding frame
1226 0x00,
1227 };
1228 // clang-format on
1229 unsigned char* p = packet;
1230 size_t p_length = QUIC_ARRAYSIZE(packet);
1231 if (framer_.transport_version() == QUIC_VERSION_99) {
1232 p = packet99;
1233 p_length = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07001234 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
1235 p = packet46;
1236 p_length = QUIC_ARRAYSIZE(packet46);
dschinazi243eabc2019-08-05 16:15:29 -07001237 }
1238
1239 uint8_t first_byte = 0x33;
1240 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1241 bool version_present = false, has_length_prefix = false;
1242 QuicVersionLabel version_label = 0;
1243 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1244 QuicConnectionId destination_connection_id = EmptyQuicConnectionId(),
1245 source_connection_id = EmptyQuicConnectionId();
1246 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1247 QuicVariableLengthIntegerLength retry_token_length_length =
1248 VARIABLE_LENGTH_INTEGER_LENGTH_4;
1249 QuicStringPiece retry_token;
1250 std::string detailed_error = "foobar";
1251
1252 QuicDataReader reader(AsChars(p), p_length);
1253 const QuicErrorCode parse_error = QuicFramer::ParsePublicHeader(
1254 &reader, kQuicDefaultConnectionIdLength,
1255 /*ietf_format=*/
1256 VersionHasIetfInvariantHeader(framer_.transport_version()), &first_byte,
1257 &format, &version_present, &has_length_prefix, &version_label,
1258 &parsed_version, &destination_connection_id, &source_connection_id,
1259 &long_packet_type, &retry_token_length_length, &retry_token,
1260 &detailed_error);
1261 EXPECT_EQ(QUIC_NO_ERROR, parse_error);
1262 EXPECT_EQ("", detailed_error);
1263 EXPECT_EQ(p[0], first_byte);
1264 EXPECT_TRUE(version_present);
1265 EXPECT_EQ(framer_.version().HasLengthPrefixedConnectionIds(),
1266 has_length_prefix);
1267 EXPECT_EQ(CreateQuicVersionLabel(framer_.version()), version_label);
1268 EXPECT_EQ(framer_.version(), parsed_version);
1269 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1270 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1271 EXPECT_EQ(VARIABLE_LENGTH_INTEGER_LENGTH_0, retry_token_length_length);
1272 EXPECT_EQ(QuicStringPiece(), retry_token);
1273 if (VersionHasIetfInvariantHeader(framer_.transport_version())) {
1274 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1275 EXPECT_EQ(HANDSHAKE, long_packet_type);
1276 } else {
1277 EXPECT_EQ(GOOGLE_QUIC_PACKET, format);
1278 }
1279}
1280
dschinazi346b7ce2019-06-05 01:38:18 -07001281TEST_P(QuicFramerTest, ClientConnectionIdFromShortHeaderToClient) {
dschinazi346b7ce2019-06-05 01:38:18 -07001282 if (!framer_.version().SupportsClientConnectionIds()) {
1283 return;
1284 }
1285 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1286 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
1287 TestConnectionId(0x33));
1288 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1289 framer_.SetExpectedClientConnectionIdLength(kQuicDefaultConnectionIdLength);
1290 // clang-format off
1291 unsigned char packet[] = {
1292 // type (short header, 4 byte packet number)
1293 0x43,
1294 // connection_id
1295 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1296 // packet number
1297 0x13, 0x37, 0x42, 0x33,
1298 // padding frame
1299 0x00,
1300 };
1301 // clang-format on
1302 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
1303 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1304 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1305 EXPECT_EQ("", framer_.detailed_error());
1306 ASSERT_TRUE(visitor_.header_.get());
1307 EXPECT_EQ(FramerTestConnectionId(),
1308 visitor_.header_->destination_connection_id);
1309 EXPECT_EQ(TestConnectionId(0x33), visitor_.header_->source_connection_id);
1310}
1311
1312// In short header packets from client to server, the client connection ID
1313// is omitted, but the framer adds it to the header struct using its
1314// last serialized client connection ID. This test ensures that this
1315// mechanism behaves as expected.
1316TEST_P(QuicFramerTest, ClientConnectionIdFromShortHeaderToServer) {
dschinazi346b7ce2019-06-05 01:38:18 -07001317 if (!framer_.version().SupportsClientConnectionIds()) {
1318 return;
1319 }
1320 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1321 QuicFramerPeer::SetLastSerializedClientConnectionId(&framer_,
1322 TestConnectionId(0x33));
1323 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1324 // clang-format off
1325 unsigned char packet[] = {
1326 // type (short header, 4 byte packet number)
1327 0x43,
1328 // connection_id
1329 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1330 // packet number
1331 0x13, 0x37, 0x42, 0x33,
1332 // padding frame
1333 0x00,
1334 };
1335 // clang-format on
1336 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
1337 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1338 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1339 EXPECT_EQ("", framer_.detailed_error());
1340 ASSERT_TRUE(visitor_.header_.get());
1341 EXPECT_EQ(FramerTestConnectionId(),
1342 visitor_.header_->destination_connection_id);
1343 EXPECT_EQ(TestConnectionId(0x33), visitor_.header_->source_connection_id);
1344}
1345
QUICHE teama6ef0a62019-03-07 20:34:33 -05001346TEST_P(QuicFramerTest, PacketHeaderWith0ByteConnectionId) {
zhongyi546cc452019-04-12 15:27:49 -07001347 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
dschinazi7b9278c2019-05-20 07:36:21 -07001348 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
1349 FramerTestConnectionId());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001350 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1351
1352 // clang-format off
1353 PacketFragments packet = {
1354 // public flags (0 byte connection_id)
1355 {"Unable to read public flags.",
1356 {0x20}},
1357 // connection_id
1358 // packet number
1359 {"Unable to read packet number.",
1360 {0x12, 0x34, 0x56, 0x78}},
1361 };
1362
QUICHE teama6ef0a62019-03-07 20:34:33 -05001363 PacketFragments packet46 = {
1364 // type (short header, 4 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001365 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001366 {0x43}},
1367 // connection_id
1368 // packet number
1369 {"Unable to read packet number.",
1370 {0x12, 0x34, 0x56, 0x78}},
1371 };
nharper55fa6132019-05-07 19:37:21 -07001372
1373 PacketFragments packet_hp = {
1374 // type (short header, 4 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001375 {"Unable to read first byte.",
nharper55fa6132019-05-07 19:37:21 -07001376 {0x43}},
1377 // connection_id
1378 // packet number
1379 {"",
1380 {0x12, 0x34, 0x56, 0x78}},
1381 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001382 // clang-format on
1383
1384 PacketFragments& fragments =
nharper55fa6132019-05-07 19:37:21 -07001385 framer_.version().HasHeaderProtection()
1386 ? packet_hp
fayang36825da2019-08-21 14:01:27 -07001387 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
1388 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001389 std::unique_ptr<QuicEncryptedPacket> encrypted(
1390 AssemblePacketFromFragments(fragments));
1391 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1392 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1393 ASSERT_TRUE(visitor_.header_.get());
dschinazi5e1a7b22019-07-31 12:23:21 -07001394 EXPECT_EQ(FramerTestConnectionId(), visitor_.header_->source_connection_id);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001395 EXPECT_FALSE(visitor_.header_->reset_flag);
1396 EXPECT_FALSE(visitor_.header_->version_flag);
1397 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1398
1399 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1400}
1401
1402TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) {
zhongyi546cc452019-04-12 15:27:49 -07001403 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001404 // clang-format off
1405 PacketFragments packet = {
1406 // public flags (0 byte connection_id)
1407 {"Unable to read public flags.",
1408 {0x29}},
1409 // connection_id
1410 {"Unable to read ConnectionId.",
1411 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1412 // version tag
1413 {"Unable to read protocol version.",
1414 {QUIC_VERSION_BYTES}},
1415 // packet number
1416 {"Unable to read packet number.",
1417 {0x12, 0x34, 0x56, 0x78}},
1418 };
1419
QUICHE teama6ef0a62019-03-07 20:34:33 -05001420 PacketFragments packet46 = {
1421 // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1422 // packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001423 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001424 {0xD3}},
1425 // version tag
1426 {"Unable to read protocol version.",
1427 {QUIC_VERSION_BYTES}},
1428 // connection_id length
1429 {"Unable to read ConnectionId length.",
1430 {0x50}},
1431 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001432 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001433 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1434 // packet number
1435 {"Unable to read packet number.",
1436 {0x12, 0x34, 0x56, 0x78}},
1437 };
1438
1439 PacketFragments packet99 = {
1440 // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1441 // packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001442 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001443 {0xD3}},
1444 // version tag
1445 {"Unable to read protocol version.",
1446 {QUIC_VERSION_BYTES}},
dschinazi48ac9192019-07-31 00:07:26 -07001447 // destination connection ID length
1448 {"Unable to read destination connection ID.",
1449 {0x08}},
1450 // destination connection ID
1451 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001452 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
dschinazi48ac9192019-07-31 00:07:26 -07001453 // source connection ID length
1454 {"Unable to read source connection ID.",
1455 {0x00}},
QUICHE teama6ef0a62019-03-07 20:34:33 -05001456 // long header packet length
1457 {"Unable to read long header payload length.",
1458 {0x04}},
1459 // packet number
1460 {"Long header payload length longer than packet.",
1461 {0x12, 0x34, 0x56, 0x78}},
1462 };
1463 // clang-format on
1464
1465 PacketFragments& fragments =
1466 framer_.transport_version() == QUIC_VERSION_99
1467 ? packet99
fayang36825da2019-08-21 14:01:27 -07001468 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
1469 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001470 std::unique_ptr<QuicEncryptedPacket> encrypted(
1471 AssemblePacketFromFragments(fragments));
1472 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1473 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1474 ASSERT_TRUE(visitor_.header_.get());
1475 EXPECT_EQ(FramerTestConnectionId(),
1476 visitor_.header_->destination_connection_id);
1477 EXPECT_FALSE(visitor_.header_->reset_flag);
1478 EXPECT_TRUE(visitor_.header_->version_flag);
1479 EXPECT_EQ(GetParam(), visitor_.header_->version);
1480 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1481
1482 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1483}
1484
1485TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) {
zhongyi546cc452019-04-12 15:27:49 -07001486 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001487 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1488
1489 // clang-format off
1490 PacketFragments packet = {
1491 // public flags (8 byte connection_id and 4 byte packet number)
1492 {"Unable to read public flags.",
1493 {0x28}},
1494 // connection_id
1495 {"Unable to read ConnectionId.",
1496 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1497 // packet number
1498 {"Unable to read packet number.",
1499 {0x12, 0x34, 0x56, 0x78}},
1500 };
1501
QUICHE teama6ef0a62019-03-07 20:34:33 -05001502 PacketFragments packet46 = {
1503 // type (short header, 4 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001504 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001505 {0x43}},
1506 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001507 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001508 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1509 // packet number
1510 {"Unable to read packet number.",
1511 {0x12, 0x34, 0x56, 0x78}},
1512 };
nharper55fa6132019-05-07 19:37:21 -07001513
1514 PacketFragments packet_hp = {
1515 // type (short header, 4 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001516 {"Unable to read first byte.",
nharper55fa6132019-05-07 19:37:21 -07001517 {0x43}},
1518 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001519 {"Unable to read destination connection ID.",
nharper55fa6132019-05-07 19:37:21 -07001520 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1521 // packet number
1522 {"",
1523 {0x12, 0x34, 0x56, 0x78}},
1524 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001525 // clang-format on
1526
1527 PacketFragments& fragments =
nharper55fa6132019-05-07 19:37:21 -07001528 framer_.version().HasHeaderProtection()
1529 ? packet_hp
fayang36825da2019-08-21 14:01:27 -07001530 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
1531 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001532 std::unique_ptr<QuicEncryptedPacket> encrypted(
1533 AssemblePacketFromFragments(fragments));
1534 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1535 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1536 ASSERT_TRUE(visitor_.header_.get());
1537 EXPECT_EQ(FramerTestConnectionId(),
1538 visitor_.header_->destination_connection_id);
1539 EXPECT_FALSE(visitor_.header_->reset_flag);
1540 EXPECT_FALSE(visitor_.header_->version_flag);
1541 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1542
1543 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1544}
1545
1546TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) {
zhongyi546cc452019-04-12 15:27:49 -07001547 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001548 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1549
1550 // clang-format off
1551 PacketFragments packet = {
1552 // public flags (8 byte connection_id and 2 byte packet number)
1553 {"Unable to read public flags.",
1554 {0x18}},
1555 // connection_id
1556 {"Unable to read ConnectionId.",
1557 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1558 // packet number
1559 {"Unable to read packet number.",
1560 {0x56, 0x78}},
1561 };
1562
QUICHE teama6ef0a62019-03-07 20:34:33 -05001563 PacketFragments packet46 = {
1564 // type (short header, 2 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001565 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001566 {0x41}},
1567 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001568 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001569 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1570 // packet number
1571 {"Unable to read packet number.",
1572 {0x56, 0x78}},
1573 };
nharper55fa6132019-05-07 19:37:21 -07001574
1575 PacketFragments packet_hp = {
1576 // type (short header, 2 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001577 {"Unable to read first byte.",
nharper55fa6132019-05-07 19:37:21 -07001578 {0x41}},
1579 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001580 {"Unable to read destination connection ID.",
nharper55fa6132019-05-07 19:37:21 -07001581 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1582 // packet number
1583 {"",
1584 {0x56, 0x78}},
1585 // padding
1586 {"", {0x00, 0x00}},
1587 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001588 // clang-format on
1589
1590 PacketFragments& fragments =
nharper55fa6132019-05-07 19:37:21 -07001591 framer_.version().HasHeaderProtection()
1592 ? packet_hp
fayang36825da2019-08-21 14:01:27 -07001593 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
1594 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001595 std::unique_ptr<QuicEncryptedPacket> encrypted(
1596 AssemblePacketFromFragments(fragments));
nharper55fa6132019-05-07 19:37:21 -07001597 if (framer_.version().HasHeaderProtection()) {
1598 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
1599 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1600 } else {
1601 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1602 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1603 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001604 ASSERT_TRUE(visitor_.header_.get());
1605 EXPECT_EQ(FramerTestConnectionId(),
1606 visitor_.header_->destination_connection_id);
1607 EXPECT_FALSE(visitor_.header_->reset_flag);
1608 EXPECT_FALSE(visitor_.header_->version_flag);
1609 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1610 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1611
1612 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1613}
1614
1615TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) {
zhongyi546cc452019-04-12 15:27:49 -07001616 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001617 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1618
1619 // clang-format off
1620 PacketFragments packet = {
1621 // public flags (8 byte connection_id and 1 byte packet number)
1622 {"Unable to read public flags.",
1623 {0x08}},
1624 // connection_id
1625 {"Unable to read ConnectionId.",
1626 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1627 // packet number
1628 {"Unable to read packet number.",
1629 {0x78}},
1630 };
1631
QUICHE teama6ef0a62019-03-07 20:34:33 -05001632 PacketFragments packet46 = {
1633 // type (8 byte connection_id and 1 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001634 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001635 {0x40}},
1636 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001637 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05001638 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1639 // packet number
1640 {"Unable to read packet number.",
1641 {0x78}},
1642 };
1643
nharper55fa6132019-05-07 19:37:21 -07001644 PacketFragments packet_hp = {
1645 // type (8 byte connection_id and 1 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -07001646 {"Unable to read first byte.",
nharper55fa6132019-05-07 19:37:21 -07001647 {0x40}},
1648 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -07001649 {"Unable to read destination connection ID.",
nharper55fa6132019-05-07 19:37:21 -07001650 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1651 // packet number
1652 {"",
1653 {0x78}},
1654 // padding
1655 {"", {0x00, 0x00, 0x00}},
1656 };
1657
QUICHE teama6ef0a62019-03-07 20:34:33 -05001658 // clang-format on
1659
1660 PacketFragments& fragments =
nharper55fa6132019-05-07 19:37:21 -07001661 framer_.version().HasHeaderProtection()
1662 ? packet_hp
fayang36825da2019-08-21 14:01:27 -07001663 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
1664 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001665 std::unique_ptr<QuicEncryptedPacket> encrypted(
1666 AssemblePacketFromFragments(fragments));
nharper55fa6132019-05-07 19:37:21 -07001667 if (framer_.version().HasHeaderProtection()) {
1668 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
1669 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1670 } else {
1671 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1672 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1673 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001674 ASSERT_TRUE(visitor_.header_.get());
1675 EXPECT_EQ(FramerTestConnectionId(),
1676 visitor_.header_->destination_connection_id);
1677 EXPECT_FALSE(visitor_.header_->reset_flag);
1678 EXPECT_FALSE(visitor_.header_->version_flag);
1679 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1680 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1681
1682 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1683}
1684
1685TEST_P(QuicFramerTest, PacketNumberDecreasesThenIncreases) {
zhongyi546cc452019-04-12 15:27:49 -07001686 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001687 // Test the case when a packet is received from the past and future packet
1688 // numbers are still calculated relative to the largest received packet.
1689 QuicPacketHeader header;
1690 header.destination_connection_id = FramerTestConnectionId();
1691 header.reset_flag = false;
1692 header.version_flag = false;
1693 header.packet_number = kPacketNumber - 2;
1694
1695 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
1696 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1697 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
1698 ASSERT_TRUE(data != nullptr);
1699
1700 QuicEncryptedPacket encrypted(data->data(), data->length(), false);
1701 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1702 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1703 ASSERT_TRUE(visitor_.header_.get());
1704 EXPECT_EQ(FramerTestConnectionId(),
1705 visitor_.header_->destination_connection_id);
1706 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1707 EXPECT_EQ(kPacketNumber - 2, visitor_.header_->packet_number);
1708
1709 // Receive a 1 byte packet number.
1710 header.packet_number = kPacketNumber;
1711 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1712 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1713 data = BuildDataPacket(header, frames);
1714 QuicEncryptedPacket encrypted1(data->data(), data->length(), false);
1715 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1716 EXPECT_TRUE(framer_.ProcessPacket(encrypted1));
1717 ASSERT_TRUE(visitor_.header_.get());
1718 EXPECT_EQ(FramerTestConnectionId(),
1719 visitor_.header_->destination_connection_id);
1720 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1721 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1722
1723 // Process a 2 byte packet number 256 packets ago.
1724 header.packet_number = kPacketNumber - 256;
1725 header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
1726 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1727 data = BuildDataPacket(header, frames);
1728 QuicEncryptedPacket encrypted2(data->data(), data->length(), false);
1729 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1730 EXPECT_TRUE(framer_.ProcessPacket(encrypted2));
1731 ASSERT_TRUE(visitor_.header_.get());
1732 EXPECT_EQ(FramerTestConnectionId(),
1733 visitor_.header_->destination_connection_id);
1734 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1735 EXPECT_EQ(kPacketNumber - 256, visitor_.header_->packet_number);
1736
1737 // Process another 1 byte packet number and ensure it works.
1738 header.packet_number = kPacketNumber - 1;
1739 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1740 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1741 data = BuildDataPacket(header, frames);
1742 QuicEncryptedPacket encrypted3(data->data(), data->length(), false);
1743 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1744 EXPECT_TRUE(framer_.ProcessPacket(encrypted3));
1745 ASSERT_TRUE(visitor_.header_.get());
1746 EXPECT_EQ(FramerTestConnectionId(),
1747 visitor_.header_->destination_connection_id);
1748 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1749 EXPECT_EQ(kPacketNumber - 1, visitor_.header_->packet_number);
1750}
1751
1752TEST_P(QuicFramerTest, PacketWithDiversificationNonce) {
zhongyi546cc452019-04-12 15:27:49 -07001753 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001754 // clang-format off
1755 unsigned char packet[] = {
1756 // public flags: includes nonce flag
1757 0x2C,
1758 // connection_id
1759 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1760 // nonce
1761 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1762 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1763 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1764 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1765 // packet number
1766 0x12, 0x34, 0x56, 0x78,
1767
1768 // frame type (padding)
1769 0x00,
1770 0x00, 0x00, 0x00, 0x00
1771 };
1772
QUICHE teama6ef0a62019-03-07 20:34:33 -05001773 unsigned char packet46[] = {
1774 // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1775 // number.
1776 0xD0,
1777 // version tag
1778 QUIC_VERSION_BYTES,
1779 // connection_id length
1780 0x05,
1781 // connection_id
1782 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1783 // packet number
1784 0x78,
1785 // nonce
1786 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1787 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1788 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1789 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1790
1791 // frame type (padding)
1792 0x00,
1793 0x00, 0x00, 0x00, 0x00
1794 };
1795
1796 unsigned char packet99[] = {
1797 // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1798 // number.
1799 0xD0,
1800 // version tag
1801 QUIC_VERSION_BYTES,
dschinazi48ac9192019-07-31 00:07:26 -07001802 // destination connection ID length
1803 0x00,
1804 // source connection ID length
1805 0x08,
1806 // source connection ID
QUICHE teama6ef0a62019-03-07 20:34:33 -05001807 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1808 // long header packet length
1809 0x26,
1810 // packet number
1811 0x78,
1812 // nonce
1813 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1814 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1815 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1816 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1817
1818 // frame type (padding)
1819 0x00,
1820 0x00, 0x00, 0x00, 0x00
1821 };
1822 // clang-format on
1823
1824 if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
1825 return;
1826 }
1827
1828 unsigned char* p = packet;
1829 size_t p_size = QUIC_ARRAYSIZE(packet);
1830 if (framer_.transport_version() == QUIC_VERSION_99) {
1831 p = packet99;
1832 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07001833 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001834 p = packet46;
1835 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001836 }
1837
1838 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1839 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1840 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1841 ASSERT_TRUE(visitor_.header_->nonce != nullptr);
1842 for (char i = 0; i < 32; ++i) {
1843 EXPECT_EQ(i, (*visitor_.header_->nonce)[static_cast<size_t>(i)]);
1844 }
1845 EXPECT_EQ(1u, visitor_.padding_frames_.size());
1846 EXPECT_EQ(5, visitor_.padding_frames_[0]->num_padding_bytes);
1847}
1848
1849TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) {
1850 // clang-format off
1851 unsigned char packet[] = {
1852 // public flags (8 byte connection_id, version flag and an unknown flag)
1853 0x29,
1854 // connection_id
1855 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1856 // version tag
1857 'Q', '0', '0', '0',
1858 // packet number
1859 0x12, 0x34, 0x56, 0x78,
1860
1861 // frame type (padding frame)
1862 0x00,
1863 0x00, 0x00, 0x00, 0x00
1864 };
1865
fayang36825da2019-08-21 14:01:27 -07001866 unsigned char packet46[] = {
nharper55fa6132019-05-07 19:37:21 -07001867 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
1868 0xD3,
1869 // version tag
1870 'Q', '0', '0', '0',
1871 // connection_id length
1872 0x50,
1873 // connection_id
1874 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1875 // packet number
1876 0x12, 0x34, 0x56, 0x78,
1877
1878 // frame type (padding frame)
1879 0x00,
1880 0x00, 0x00, 0x00, 0x00
1881 };
dschinazi48ac9192019-07-31 00:07:26 -07001882
1883 unsigned char packet99[] = {
1884 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
1885 0xD3,
1886 // version tag
1887 'Q', '0', '0', '0',
1888 // destination connection ID length
1889 0x08,
1890 // destination connection ID
1891 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1892 // source connection ID length
1893 0x00,
1894 // packet number
1895 0x12, 0x34, 0x56, 0x78,
1896
1897 // frame type (padding frame)
1898 0x00,
1899 0x00, 0x00, 0x00, 0x00
1900 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001901 // clang-format on
1902
nharper55fa6132019-05-07 19:37:21 -07001903 unsigned char* p = packet;
1904 size_t p_size = QUIC_ARRAYSIZE(packet);
dschinazi48ac9192019-07-31 00:07:26 -07001905 if (framer_.transport_version() >= QUIC_VERSION_99) {
1906 p = packet99;
1907 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07001908 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
1909 p = packet46;
1910 p_size = QUIC_ARRAYSIZE(packet46);
nharper55fa6132019-05-07 19:37:21 -07001911 }
1912 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001913 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1914 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1915 ASSERT_TRUE(visitor_.header_.get());
1916 EXPECT_EQ(0, visitor_.frame_count_);
1917 EXPECT_EQ(1, visitor_.version_mismatch_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001918}
1919
1920TEST_P(QuicFramerTest, PaddingFrame) {
zhongyi546cc452019-04-12 15:27:49 -07001921 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001922 // clang-format off
1923 unsigned char packet[] = {
1924 // public flags (8 byte connection_id)
1925 0x28,
1926 // connection_id
1927 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1928 // packet number
1929 0x12, 0x34, 0x56, 0x78,
1930
1931 // paddings
1932 0x00, 0x00,
1933 // frame type (stream frame with fin)
1934 0xFF,
1935 // stream id
1936 0x01, 0x02, 0x03, 0x04,
1937 // offset
1938 0x3A, 0x98, 0xFE, 0xDC,
1939 0x32, 0x10, 0x76, 0x54,
1940 // data length
1941 0x00, 0x0c,
1942 // data
1943 'h', 'e', 'l', 'l',
1944 'o', ' ', 'w', 'o',
1945 'r', 'l', 'd', '!',
1946 // paddings
1947 0x00, 0x00,
1948 };
1949
QUICHE teama6ef0a62019-03-07 20:34:33 -05001950 unsigned char packet46[] = {
1951 // type (short header, 4 byte packet number)
1952 0x43,
1953 // connection_id
1954 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1955 // packet number
1956 0x12, 0x34, 0x56, 0x78,
1957
1958 // paddings
1959 0x00, 0x00,
1960 // frame type (stream frame with fin)
1961 0xFF,
1962 // stream id
1963 0x01, 0x02, 0x03, 0x04,
1964 // offset
1965 0x3A, 0x98, 0xFE, 0xDC,
1966 0x32, 0x10, 0x76, 0x54,
1967 // data length
1968 0x00, 0x0c,
1969 // data
1970 'h', 'e', 'l', 'l',
1971 'o', ' ', 'w', 'o',
1972 'r', 'l', 'd', '!',
1973 // paddings
1974 0x00, 0x00,
1975 };
1976
1977 unsigned char packet99[] = {
1978 // type (short header, 4 byte packet number)
1979 0x43,
1980 // connection_id
1981 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1982 // packet number
1983 0x12, 0x34, 0x56, 0x78,
1984
1985 // paddings
1986 0x00, 0x00,
1987 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
1988 0x08 | 0x01 | 0x02 | 0x04,
1989
1990 // stream id
1991 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
1992 // offset
1993 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
1994 0x32, 0x10, 0x76, 0x54,
1995 // data length
1996 kVarInt62OneByte + 0x0c,
1997 // data
1998 'h', 'e', 'l', 'l',
1999 'o', ' ', 'w', 'o',
2000 'r', 'l', 'd', '!',
2001 // paddings
2002 0x00, 0x00,
2003 };
2004 // clang-format on
2005
2006 unsigned char* p = packet;
2007 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07002008 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002009 p = packet99;
2010 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07002011 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002012 p = packet46;
2013 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002014 }
2015
2016 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
2017 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2018 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2019 ASSERT_TRUE(visitor_.header_.get());
2020 EXPECT_TRUE(CheckDecryption(
2021 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2022 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2023
2024 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2025 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2026 EXPECT_EQ(2u, visitor_.padding_frames_.size());
2027 EXPECT_EQ(2, visitor_.padding_frames_[0]->num_padding_bytes);
2028 EXPECT_EQ(2, visitor_.padding_frames_[1]->num_padding_bytes);
2029 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2030 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2031 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2032 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2033}
2034
2035TEST_P(QuicFramerTest, StreamFrame) {
zhongyi546cc452019-04-12 15:27:49 -07002036 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002037 // clang-format off
2038 PacketFragments packet = {
2039 // public flags (8 byte connection_id)
2040 {"",
2041 {0x28}},
2042 // connection_id
2043 {"",
2044 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2045 // packet number
2046 {"",
2047 {0x12, 0x34, 0x56, 0x78}},
2048 // frame type (stream frame with fin)
2049 {"",
2050 {0xFF}},
2051 // stream id
2052 {"Unable to read stream_id.",
2053 {0x01, 0x02, 0x03, 0x04}},
2054 // offset
2055 {"Unable to read offset.",
2056 {0x3A, 0x98, 0xFE, 0xDC,
2057 0x32, 0x10, 0x76, 0x54}},
2058 {"Unable to read frame data.",
2059 {
2060 // data length
2061 0x00, 0x0c,
2062 // data
2063 'h', 'e', 'l', 'l',
2064 'o', ' ', 'w', 'o',
2065 'r', 'l', 'd', '!'}},
2066 };
2067
QUICHE teama6ef0a62019-03-07 20:34:33 -05002068 PacketFragments packet46 = {
2069 // type (short header, 4 byte packet number)
2070 {"",
2071 {0x43}},
2072 // connection_id
2073 {"",
2074 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2075 // packet number
2076 {"",
2077 {0x12, 0x34, 0x56, 0x78}},
2078 // frame type (stream frame with fin)
2079 {"",
2080 {0xFF}},
2081 // stream id
2082 {"Unable to read stream_id.",
2083 {0x01, 0x02, 0x03, 0x04}},
2084 // offset
2085 {"Unable to read offset.",
2086 {0x3A, 0x98, 0xFE, 0xDC,
2087 0x32, 0x10, 0x76, 0x54}},
2088 {"Unable to read frame data.",
2089 {
2090 // data length
2091 0x00, 0x0c,
2092 // data
2093 'h', 'e', 'l', 'l',
2094 'o', ' ', 'w', 'o',
2095 'r', 'l', 'd', '!'}},
2096 };
2097
2098 PacketFragments packet99 = {
2099 // type (short header, 4 byte packet number)
2100 {"",
2101 {0x43}},
2102 // connection_id
2103 {"",
2104 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2105 // packet number
2106 {"",
2107 {0x12, 0x34, 0x56, 0x78}},
2108 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
2109 {"",
2110 { 0x08 | 0x01 | 0x02 | 0x04 }},
2111 // stream id
2112 {"Unable to read stream_id.",
2113 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
2114 // offset
2115 {"Unable to read stream data offset.",
2116 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2117 0x32, 0x10, 0x76, 0x54}},
2118 // data length
2119 {"Unable to read stream data length.",
2120 {kVarInt62OneByte + 0x0c}},
2121 // data
2122 {"Unable to read frame data.",
2123 { 'h', 'e', 'l', 'l',
2124 'o', ' ', 'w', 'o',
2125 'r', 'l', 'd', '!'}},
2126 };
2127 // clang-format on
2128
2129 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07002130 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05002131 ? packet99
fayang36825da2019-08-21 14:01:27 -07002132 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
2133 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002134 std::unique_ptr<QuicEncryptedPacket> encrypted(
2135 AssemblePacketFromFragments(fragments));
2136 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2137
2138 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2139 ASSERT_TRUE(visitor_.header_.get());
2140 EXPECT_TRUE(CheckDecryption(
2141 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2142 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2143
2144 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2145 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2146 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2147 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2148 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2149 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2150
2151 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2152}
2153
2154// Test an empty (no data) stream frame.
2155TEST_P(QuicFramerTest, EmptyStreamFrame) {
2156 // Only the IETF QUIC spec explicitly says that empty
2157 // stream frames are supported.
fkastenholz305e1732019-06-18 05:01:22 -07002158 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002159 return;
2160 }
zhongyi546cc452019-04-12 15:27:49 -07002161 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002162 // clang-format off
2163 PacketFragments packet = {
2164 // type (short header, 4 byte packet number)
2165 {"",
2166 {0x43}},
2167 // connection_id
2168 {"",
2169 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2170 // packet number
2171 {"",
2172 {0x12, 0x34, 0x56, 0x78}},
2173 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
2174 {"",
2175 { 0x08 | 0x01 | 0x02 | 0x04 }},
2176 // stream id
2177 {"Unable to read stream_id.",
2178 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
2179 // offset
2180 {"Unable to read stream data offset.",
2181 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2182 0x32, 0x10, 0x76, 0x54}},
2183 // data length
2184 {"Unable to read stream data length.",
2185 {kVarInt62OneByte + 0x00}},
2186 };
2187 // clang-format on
2188
2189 std::unique_ptr<QuicEncryptedPacket> encrypted(
2190 AssemblePacketFromFragments(packet));
2191 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2192
2193 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2194 ASSERT_TRUE(visitor_.header_.get());
2195 EXPECT_TRUE(CheckDecryption(
2196 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2197 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2198
2199 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2200 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2201 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2202 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2203 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2204 EXPECT_EQ(visitor_.stream_frames_[0].get()->data_length, 0u);
2205
2206 CheckFramingBoundaries(packet, QUIC_INVALID_STREAM_DATA);
2207}
2208
2209TEST_P(QuicFramerTest, MissingDiversificationNonce) {
QUICHE team8e2e4532019-03-14 14:37:56 -07002210 if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
2211 // TLS does not use diversification nonces.
2212 return;
2213 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002214 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002215 decrypter_ = new test::TestDecrypter();
zhongyi546cc452019-04-12 15:27:49 -07002216 if (framer_.version().KnowsWhichDecrypterToUse()) {
vasilvv0fc587f2019-09-06 13:33:08 -07002217 framer_.InstallDecrypter(
2218 ENCRYPTION_INITIAL,
2219 std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07002220 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
2221 std::unique_ptr<QuicDecrypter>(decrypter_));
2222 } else {
vasilvv0fc587f2019-09-06 13:33:08 -07002223 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
2224 Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07002225 framer_.SetAlternativeDecrypter(
2226 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
2227 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002228
2229 // clang-format off
2230 unsigned char packet[] = {
2231 // public flags (8 byte connection_id)
2232 0x28,
2233 // connection_id
2234 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2235 // packet number
2236 0x12, 0x34, 0x56, 0x78,
QUICHE team8e2e4532019-03-14 14:37:56 -07002237 // padding frame
2238 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002239 };
2240
QUICHE team8e2e4532019-03-14 14:37:56 -07002241 unsigned char packet46[] = {
2242 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2243 0xD3,
2244 // version tag
2245 QUIC_VERSION_BYTES,
2246 // connection_id length
2247 0x05,
2248 // connection_id
2249 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2250 // packet number
2251 0x12, 0x34, 0x56, 0x78,
2252 // padding frame
2253 0x00,
2254 };
2255
2256 unsigned char packet99[] = {
2257 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2258 0xD3,
2259 // version tag
2260 QUIC_VERSION_BYTES,
dschinazi48ac9192019-07-31 00:07:26 -07002261 // destination connection ID length
2262 0x00,
2263 // source connection ID length
2264 0x08,
2265 // source connection ID
QUICHE team8e2e4532019-03-14 14:37:56 -07002266 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2267 // IETF long header payload length
2268 0x05,
2269 // packet number
2270 0x12, 0x34, 0x56, 0x78,
2271 // padding frame
2272 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002273 };
2274 // clang-format on
2275
2276 unsigned char* p = packet;
QUICHE team8e2e4532019-03-14 14:37:56 -07002277 size_t p_length = QUIC_ARRAYSIZE(packet);
2278 if (framer_.transport_version() == QUIC_VERSION_99) {
2279 p = packet99;
2280 p_length = QUIC_ARRAYSIZE(packet99);
fayangf36e29d2019-06-06 14:03:40 -07002281 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE team8e2e4532019-03-14 14:37:56 -07002282 p = packet46;
2283 p_length = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002284 }
QUICHE team8e2e4532019-03-14 14:37:56 -07002285 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002286 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
nharper55fa6132019-05-07 19:37:21 -07002287 if (framer_.version().HasHeaderProtection()) {
2288 EXPECT_EQ(QUIC_DECRYPTION_FAILURE, framer_.error());
2289 EXPECT_EQ("Unable to decrypt header protection.", framer_.detailed_error());
fayang36825da2019-08-21 14:01:27 -07002290 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002291 // Cannot read diversification nonce.
2292 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
QUICHE team8e2e4532019-03-14 14:37:56 -07002293 EXPECT_EQ("Unable to read nonce.", framer_.detailed_error());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002294 } else {
2295 EXPECT_EQ(QUIC_DECRYPTION_FAILURE, framer_.error());
2296 }
2297}
2298
2299TEST_P(QuicFramerTest, StreamFrame3ByteStreamId) {
2300 if (framer_.transport_version() > QUIC_VERSION_43) {
2301 // This test is nonsensical for IETF Quic.
2302 return;
2303 }
2304 // clang-format off
2305 PacketFragments packet = {
2306 // public flags (8 byte connection_id)
2307 {"",
2308 {0x28}},
2309 // connection_id
2310 {"",
2311 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2312 // packet number
2313 {"",
2314 {0x12, 0x34, 0x56, 0x78}},
2315 // frame type (stream frame with fin)
2316 {"",
2317 {0xFE}},
2318 // stream id
2319 {"Unable to read stream_id.",
2320 {0x02, 0x03, 0x04}},
2321 // offset
2322 {"Unable to read offset.",
2323 {0x3A, 0x98, 0xFE, 0xDC,
2324 0x32, 0x10, 0x76, 0x54}},
2325 {"Unable to read frame data.",
2326 {
2327 // data length
2328 0x00, 0x0c,
2329 // data
2330 'h', 'e', 'l', 'l',
2331 'o', ' ', 'w', 'o',
2332 'r', 'l', 'd', '!'}},
2333 };
2334 // clang-format on
2335
2336 PacketFragments& fragments = packet;
2337 std::unique_ptr<QuicEncryptedPacket> encrypted(
2338 AssemblePacketFromFragments(fragments));
2339 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2340
2341 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2342 ASSERT_TRUE(visitor_.header_.get());
2343 EXPECT_TRUE(CheckDecryption(
2344 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2345 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2346
2347 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2348 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2349 // Stream ID should be the last 3 bytes of kStreamId.
2350 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2351 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2352 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2353 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2354
2355 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2356}
2357
2358TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) {
zhongyi546cc452019-04-12 15:27:49 -07002359 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002360 // clang-format off
2361 PacketFragments packet = {
2362 // public flags (8 byte connection_id)
2363 {"",
2364 {0x28}},
2365 // connection_id
2366 {"",
2367 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2368 // packet number
2369 {"",
2370 {0x12, 0x34, 0x56, 0x78}},
2371 // frame type (stream frame with fin)
2372 {"",
2373 {0xFD}},
2374 // stream id
2375 {"Unable to read stream_id.",
2376 {0x03, 0x04}},
2377 // offset
2378 {"Unable to read offset.",
2379 {0x3A, 0x98, 0xFE, 0xDC,
2380 0x32, 0x10, 0x76, 0x54}},
2381 {"Unable to read frame data.",
2382 {
2383 // data length
2384 0x00, 0x0c,
2385 // data
2386 'h', 'e', 'l', 'l',
2387 'o', ' ', 'w', 'o',
2388 'r', 'l', 'd', '!'}},
2389 };
2390
QUICHE teama6ef0a62019-03-07 20:34:33 -05002391 PacketFragments packet46 = {
2392 // type (short header, 4 byte packet number)
2393 {"",
2394 {0x43}},
2395 // connection_id
2396 {"",
2397 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2398 // packet number
2399 {"",
2400 {0x12, 0x34, 0x56, 0x78}},
2401 // frame type (stream frame with fin)
2402 {"",
2403 {0xFD}},
2404 // stream id
2405 {"Unable to read stream_id.",
2406 {0x03, 0x04}},
2407 // offset
2408 {"Unable to read offset.",
2409 {0x3A, 0x98, 0xFE, 0xDC,
2410 0x32, 0x10, 0x76, 0x54}},
2411 {"Unable to read frame data.",
2412 {
2413 // data length
2414 0x00, 0x0c,
2415 // data
2416 'h', 'e', 'l', 'l',
2417 'o', ' ', 'w', 'o',
2418 'r', 'l', 'd', '!'}},
2419 };
2420
2421 PacketFragments packet99 = {
2422 // type (short header, 4 byte packet number)
2423 {"",
2424 {0x43}},
2425 // connection_id
2426 {"",
2427 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2428 // packet number
2429 {"",
2430 {0x12, 0x34, 0x56, 0x78}},
2431 // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2432 {"",
2433 {0x08 | 0x01 | 0x02 | 0x04}},
2434 // stream id
2435 {"Unable to read stream_id.",
2436 {kVarInt62TwoBytes + 0x03, 0x04}},
2437 // offset
2438 {"Unable to read stream data offset.",
2439 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2440 0x32, 0x10, 0x76, 0x54}},
2441 // data length
2442 {"Unable to read stream data length.",
2443 {kVarInt62OneByte + 0x0c}},
2444 // data
2445 {"Unable to read frame data.",
2446 { 'h', 'e', 'l', 'l',
2447 'o', ' ', 'w', 'o',
2448 'r', 'l', 'd', '!'}},
2449 };
2450 // clang-format on
2451
2452 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07002453 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05002454 ? packet99
fayang36825da2019-08-21 14:01:27 -07002455 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
2456 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002457 std::unique_ptr<QuicEncryptedPacket> encrypted(
2458 AssemblePacketFromFragments(fragments));
2459 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2460
2461 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2462 ASSERT_TRUE(visitor_.header_.get());
2463 EXPECT_TRUE(CheckDecryption(
2464 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2465 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2466
2467 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2468 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2469 // Stream ID should be the last 2 bytes of kStreamId.
2470 EXPECT_EQ(0x0000FFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2471 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2472 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2473 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2474
2475 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2476}
2477
2478TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) {
zhongyi546cc452019-04-12 15:27:49 -07002479 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002480 // clang-format off
2481 PacketFragments packet = {
2482 // public flags (8 byte connection_id)
2483 {"",
2484 {0x28}},
2485 // connection_id
2486 {"",
2487 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2488 // packet number
2489 {"",
2490 {0x12, 0x34, 0x56, 0x78}},
2491 // frame type (stream frame with fin)
2492 {"",
2493 {0xFC}},
2494 // stream id
2495 {"Unable to read stream_id.",
2496 {0x04}},
2497 // offset
2498 {"Unable to read offset.",
2499 {0x3A, 0x98, 0xFE, 0xDC,
2500 0x32, 0x10, 0x76, 0x54}},
2501 {"Unable to read frame data.",
2502 {
2503 // data length
2504 0x00, 0x0c,
2505 // data
2506 'h', 'e', 'l', 'l',
2507 'o', ' ', 'w', 'o',
2508 'r', 'l', 'd', '!'}},
2509 };
2510
QUICHE teama6ef0a62019-03-07 20:34:33 -05002511 PacketFragments packet46 = {
2512 // type (short header, 4 byte packet number)
2513 {"",
2514 {0x43}},
2515 // connection_id
2516 {"",
2517 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2518 // packet number
2519 {"",
2520 {0x12, 0x34, 0x56, 0x78}},
2521 // frame type (stream frame with fin)
2522 {"",
2523 {0xFC}},
2524 // stream id
2525 {"Unable to read stream_id.",
2526 {0x04}},
2527 // offset
2528 {"Unable to read offset.",
2529 {0x3A, 0x98, 0xFE, 0xDC,
2530 0x32, 0x10, 0x76, 0x54}},
2531 {"Unable to read frame data.",
2532 {
2533 // data length
2534 0x00, 0x0c,
2535 // data
2536 'h', 'e', 'l', 'l',
2537 'o', ' ', 'w', 'o',
2538 'r', 'l', 'd', '!'}},
2539 };
2540
2541 PacketFragments packet99 = {
2542 // type (short header, 4 byte packet number)
2543 {"",
2544 {0x43}},
2545 // connection_id
2546 {"",
2547 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2548 // packet number
2549 {"",
2550 {0x12, 0x34, 0x56, 0x78}},
2551 // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2552 {"",
2553 {0x08 | 0x01 | 0x02 | 0x04}},
2554 // stream id
2555 {"Unable to read stream_id.",
2556 {kVarInt62OneByte + 0x04}},
2557 // offset
2558 {"Unable to read stream data offset.",
2559 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2560 0x32, 0x10, 0x76, 0x54}},
2561 // data length
2562 {"Unable to read stream data length.",
2563 {kVarInt62OneByte + 0x0c}},
2564 // data
2565 {"Unable to read frame data.",
2566 { 'h', 'e', 'l', 'l',
2567 'o', ' ', 'w', 'o',
2568 'r', 'l', 'd', '!'}},
2569 };
2570 // clang-format on
2571
2572 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07002573 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05002574 ? packet99
fayang36825da2019-08-21 14:01:27 -07002575 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
2576 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002577 std::unique_ptr<QuicEncryptedPacket> encrypted(
2578 AssemblePacketFromFragments(fragments));
2579 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2580
2581 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2582 ASSERT_TRUE(visitor_.header_.get());
2583 EXPECT_TRUE(CheckDecryption(
2584 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2585 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2586
2587 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2588 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2589 // Stream ID should be the last 1 byte of kStreamId.
2590 EXPECT_EQ(0x000000FF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2591 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2592 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2593 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2594
2595 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2596}
2597
2598TEST_P(QuicFramerTest, StreamFrameWithVersion) {
fkastenholz305e1732019-06-18 05:01:22 -07002599 // If IETF frames are in use then we must also have the IETF
2600 // header invariants.
2601 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
2602 DCHECK(VersionHasIetfInvariantHeader(framer_.transport_version()));
2603 }
2604
zhongyi546cc452019-04-12 15:27:49 -07002605 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002606 // clang-format off
2607 PacketFragments packet = {
2608 // public flags (version, 8 byte connection_id)
2609 {"",
2610 {0x29}},
2611 // connection_id
2612 {"",
2613 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2614 // version tag
2615 {"",
2616 {QUIC_VERSION_BYTES}},
2617 // packet number
2618 {"",
2619 {0x12, 0x34, 0x56, 0x78}},
2620 // frame type (stream frame with fin)
2621 {"",
2622 {0xFE}},
2623 // stream id
2624 {"Unable to read stream_id.",
2625 {0x02, 0x03, 0x04}},
2626 // offset
2627 {"Unable to read offset.",
2628 {0x3A, 0x98, 0xFE, 0xDC,
2629 0x32, 0x10, 0x76, 0x54}},
2630 {"Unable to read frame data.",
2631 {
2632 // data length
2633 0x00, 0x0c,
2634 // data
2635 'h', 'e', 'l', 'l',
2636 'o', ' ', 'w', 'o',
2637 'r', 'l', 'd', '!'}},
2638 };
2639
QUICHE teama6ef0a62019-03-07 20:34:33 -05002640 PacketFragments packet46 = {
2641 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2642 // 4-byte packet number)
2643 {"",
2644 {0xD3}},
2645 // version tag
2646 {"",
2647 {QUIC_VERSION_BYTES}},
2648 // connection_id length
2649 {"",
2650 {0x50}},
2651 // connection_id
2652 {"",
2653 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2654 // packet number
2655 {"",
2656 {0x12, 0x34, 0x56, 0x78}},
2657 // frame type (stream frame with fin)
2658 {"",
2659 {0xFE}},
2660 // stream id
2661 {"Unable to read stream_id.",
2662 {0x02, 0x03, 0x04}},
2663 // offset
2664 {"Unable to read offset.",
2665 {0x3A, 0x98, 0xFE, 0xDC,
2666 0x32, 0x10, 0x76, 0x54}},
2667 {"Unable to read frame data.",
2668 {
2669 // data length
2670 0x00, 0x0c,
2671 // data
2672 'h', 'e', 'l', 'l',
2673 'o', ' ', 'w', 'o',
2674 'r', 'l', 'd', '!'}},
2675 };
2676
2677 PacketFragments packet99 = {
2678 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2679 // 4-byte packet number)
2680 {"",
2681 {0xD3}},
2682 // version tag
2683 {"",
2684 {QUIC_VERSION_BYTES}},
dschinazi48ac9192019-07-31 00:07:26 -07002685 // destination connection ID length
QUICHE teama6ef0a62019-03-07 20:34:33 -05002686 {"",
dschinazi48ac9192019-07-31 00:07:26 -07002687 {0x08}},
2688 // destination connection ID
QUICHE teama6ef0a62019-03-07 20:34:33 -05002689 {"",
2690 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
dschinazi48ac9192019-07-31 00:07:26 -07002691 // source connection ID length
2692 {"",
2693 {0x00}},
QUICHE teama6ef0a62019-03-07 20:34:33 -05002694 // long header packet length
2695 {"",
2696 {0x1E}},
2697 // packet number
2698 {"",
2699 {0x12, 0x34, 0x56, 0x78}},
2700 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
2701 {"",
2702 {0x08 | 0x01 | 0x02 | 0x04}},
2703 // stream id
2704 {"Long header payload length longer than packet.",
2705 {kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04}},
2706 // offset
2707 {"Long header payload length longer than packet.",
2708 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2709 0x32, 0x10, 0x76, 0x54}},
2710 // data length
2711 {"Long header payload length longer than packet.",
2712 {kVarInt62OneByte + 0x0c}},
2713 // data
2714 {"Long header payload length longer than packet.",
2715 { 'h', 'e', 'l', 'l',
2716 'o', ' ', 'w', 'o',
2717 'r', 'l', 'd', '!'}},
2718 };
2719 // clang-format on
2720
2721 QuicVariableLengthIntegerLength retry_token_length_length =
2722 VARIABLE_LENGTH_INTEGER_LENGTH_0;
2723 size_t retry_token_length = 0;
2724 QuicVariableLengthIntegerLength length_length =
2725 QuicVersionHasLongHeaderLengths(framer_.transport_version())
2726 ? VARIABLE_LENGTH_INTEGER_LENGTH_1
2727 : VARIABLE_LENGTH_INTEGER_LENGTH_0;
2728
2729 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07002730 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05002731 ? packet99
fayang36825da2019-08-21 14:01:27 -07002732 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
2733 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002734 std::unique_ptr<QuicEncryptedPacket> encrypted(
2735 AssemblePacketFromFragments(fragments));
2736 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2737
2738 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2739 ASSERT_TRUE(visitor_.header_.get());
2740 EXPECT_TRUE(CheckDecryption(
2741 *encrypted, kIncludeVersion, !kIncludeDiversificationNonce,
2742 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID,
2743 retry_token_length_length, retry_token_length, length_length));
2744
2745 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2746 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2747 // Stream ID should be the last 3 bytes of kStreamId.
2748 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2749 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2750 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2751 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2752
2753 CheckFramingBoundaries(fragments,
2754 framer_.transport_version() == QUIC_VERSION_99
2755 ? QUIC_INVALID_PACKET_HEADER
2756 : QUIC_INVALID_STREAM_DATA);
2757}
2758
2759TEST_P(QuicFramerTest, RejectPacket) {
zhongyi546cc452019-04-12 15:27:49 -07002760 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002761 visitor_.accept_packet_ = false;
2762
2763 // clang-format off
2764 unsigned char packet[] = {
2765 // public flags (8 byte connection_id)
2766 0x28,
2767 // connection_id
2768 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2769 // packet number
2770 0x12, 0x34, 0x56, 0x78,
2771
2772 // frame type (stream frame with fin)
2773 0xFF,
2774 // stream id
2775 0x01, 0x02, 0x03, 0x04,
2776 // offset
2777 0x3A, 0x98, 0xFE, 0xDC,
2778 0x32, 0x10, 0x76, 0x54,
2779 // data length
2780 0x00, 0x0c,
2781 // data
2782 'h', 'e', 'l', 'l',
2783 'o', ' ', 'w', 'o',
2784 'r', 'l', 'd', '!',
2785 };
2786
QUICHE teama6ef0a62019-03-07 20:34:33 -05002787 unsigned char packet46[] = {
2788 // type (short header, 4 byte packet number)
2789 0x43,
2790 // connection_id
2791 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2792 // packet number
2793 0x12, 0x34, 0x56, 0x78,
2794
2795 // frame type (STREAM Frame with FIN, LEN, and OFFSET bits set)
2796 0x10 | 0x01 | 0x02 | 0x04,
2797 // stream id
2798 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
2799 // offset
2800 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2801 0x32, 0x10, 0x76, 0x54,
2802 // data length
2803 kVarInt62OneByte + 0x0c,
2804 // data
2805 'h', 'e', 'l', 'l',
2806 'o', ' ', 'w', 'o',
2807 'r', 'l', 'd', '!',
2808 };
2809 // clang-format on
2810
2811 unsigned char* p = packet;
fayang36825da2019-08-21 14:01:27 -07002812 if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002813 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05002814 }
2815 QuicEncryptedPacket encrypted(AsChars(p),
2816 framer_.transport_version() > QUIC_VERSION_43
fayang36825da2019-08-21 14:01:27 -07002817 ? QUIC_ARRAYSIZE(packet46)
QUICHE teama6ef0a62019-03-07 20:34:33 -05002818 : QUIC_ARRAYSIZE(packet),
2819 false);
2820 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2821
2822 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2823 ASSERT_TRUE(visitor_.header_.get());
2824 EXPECT_TRUE(CheckDecryption(
2825 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2826 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2827
2828 ASSERT_EQ(0u, visitor_.stream_frames_.size());
2829 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2830}
2831
2832TEST_P(QuicFramerTest, RejectPublicHeader) {
2833 visitor_.accept_public_header_ = false;
2834
2835 // clang-format off
2836 unsigned char packet[] = {
2837 // public flags (8 byte connection_id)
2838 0x28,
2839 // connection_id
2840 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2841 };
2842
QUICHE teama6ef0a62019-03-07 20:34:33 -05002843 unsigned char packet46[] = {
2844 // type (short header, 1 byte packet number)
2845 0x40,
2846 // connection_id
2847 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2848 // packet number
2849 0x01,
2850 };
2851 // clang-format on
2852
2853 QuicEncryptedPacket encrypted(
fayang36825da2019-08-21 14:01:27 -07002854 framer_.transport_version() >= QUIC_VERSION_46 ? AsChars(packet46)
2855 : AsChars(packet),
2856 framer_.transport_version() >= QUIC_VERSION_46 ? QUIC_ARRAYSIZE(packet46)
2857 : QUIC_ARRAYSIZE(packet),
QUICHE teama6ef0a62019-03-07 20:34:33 -05002858 false);
2859 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2860
2861 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2862 ASSERT_TRUE(visitor_.header_.get());
2863 EXPECT_FALSE(visitor_.header_->packet_number.IsInitialized());
2864}
2865
2866TEST_P(QuicFramerTest, AckFrameOneAckBlock) {
zhongyi546cc452019-04-12 15:27:49 -07002867 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002868 // clang-format off
2869 PacketFragments packet = {
2870 // public flags (8 byte connection_id)
2871 {"",
2872 {0x2C}},
2873 // connection_id
2874 {"",
2875 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2876 // packet number
2877 {"",
2878 {0x12, 0x34, 0x56, 0x78}},
2879 // frame type (ack frame)
2880 // (one ack block, 2 byte largest observed, 2 byte block length)
2881 {"",
2882 {0x45}},
2883 // largest acked
2884 {"Unable to read largest acked.",
2885 {0x12, 0x34}},
2886 // Zero delta time.
2887 {"Unable to read ack delay time.",
2888 {0x00, 0x00}},
2889 // first ack block length.
2890 {"Unable to read first ack block length.",
2891 {0x12, 0x34}},
2892 // num timestamps.
2893 {"Unable to read num received packets.",
2894 {0x00}}
2895 };
2896
QUICHE teama6ef0a62019-03-07 20:34:33 -05002897 PacketFragments packet46 = {
2898 // type (short packet, 4 byte packet number)
2899 {"",
2900 {0x43}},
2901 // connection_id
2902 {"",
2903 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2904 // packet number
2905 {"",
2906 {0x12, 0x34, 0x56, 0x78}},
2907 // frame type (ack frame)
2908 // (one ack block, 2 byte largest observed, 2 byte block length)
2909 {"",
2910 {0x45}},
2911 // largest acked
2912 {"Unable to read largest acked.",
2913 {0x12, 0x34}},
2914 // Zero delta time.
2915 {"Unable to read ack delay time.",
2916 {0x00, 0x00}},
2917 // first ack block length.
2918 {"Unable to read first ack block length.",
2919 {0x12, 0x34}},
2920 // num timestamps.
2921 {"Unable to read num received packets.",
2922 {0x00}}
2923 };
2924
2925 PacketFragments packet99 = {
2926 // type (short packet, 4 byte packet number)
2927 {"",
2928 {0x43}},
2929 // connection_id
2930 {"",
2931 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2932 // packet number
2933 {"",
2934 {0x12, 0x34, 0x56, 0x78}},
2935 // frame type (IETF_ACK)
2936 // (one ack block, 2 byte largest observed, 2 byte block length)
2937 // IETF-Quic ignores the bit-fields in the ack type, all of
2938 // that information is encoded elsewhere in the frame.
2939 {"",
2940 {0x02}},
2941 // largest acked
2942 {"Unable to read largest acked.",
2943 {kVarInt62TwoBytes + 0x12, 0x34}},
2944 // Zero delta time.
2945 {"Unable to read ack delay time.",
2946 {kVarInt62OneByte + 0x00}},
2947 // Ack block count (0 -- no blocks after the first)
2948 {"Unable to read ack block count.",
2949 {kVarInt62OneByte + 0x00}},
2950 // first ack block length - 1.
2951 // IETF Quic defines the ack block's value as the "number of
2952 // packets that preceed the largest packet number in the block"
2953 // which for the 1st ack block is the largest acked field,
2954 // above. This means that if we are acking just packet 0x1234
2955 // then the 1st ack block will be 0.
2956 {"Unable to read first ack block length.",
2957 {kVarInt62TwoBytes + 0x12, 0x33}}
2958 };
2959 // clang-format on
2960
2961 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07002962 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05002963 ? packet99
fayang36825da2019-08-21 14:01:27 -07002964 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
2965 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002966 std::unique_ptr<QuicEncryptedPacket> encrypted(
2967 AssemblePacketFromFragments(fragments));
2968 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2969
2970 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2971 ASSERT_TRUE(visitor_.header_.get());
2972 EXPECT_TRUE(CheckDecryption(
2973 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2974 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
2975
2976 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2977 ASSERT_EQ(1u, visitor_.ack_frames_.size());
2978 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
2979 EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
2980 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
2981
2982 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
2983}
2984
2985// This test checks that the ack frame processor correctly identifies
2986// and handles the case where the first ack block is larger than the
2987// largest_acked packet.
2988TEST_P(QuicFramerTest, FirstAckFrameUnderflow) {
zhongyi546cc452019-04-12 15:27:49 -07002989 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002990 // clang-format off
2991 PacketFragments packet = {
2992 // public flags (8 byte connection_id)
2993 {"",
2994 {0x2C}},
2995 // connection_id
2996 {"",
2997 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2998 // packet number
2999 {"",
3000 {0x12, 0x34, 0x56, 0x78}},
3001 // frame type (ack frame)
3002 // (one ack block, 2 byte largest observed, 2 byte block length)
3003 {"",
3004 {0x45}},
3005 // largest acked
3006 {"Unable to read largest acked.",
3007 {0x12, 0x34}},
3008 // Zero delta time.
3009 {"Unable to read ack delay time.",
3010 {0x00, 0x00}},
3011 // first ack block length.
3012 {"Unable to read first ack block length.",
3013 {0x88, 0x88}},
3014 // num timestamps.
3015 {"Underflow with first ack block length 34952 largest acked is 4660.",
3016 {0x00}}
3017 };
3018
QUICHE teama6ef0a62019-03-07 20:34:33 -05003019 PacketFragments packet46 = {
3020 // type (short header, 4 byte packet number)
3021 {"",
3022 {0x43}},
3023 // connection_id
3024 {"",
3025 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3026 // packet number
3027 {"",
3028 {0x12, 0x34, 0x56, 0x78}},
3029 // frame type (ack frame)
3030 // (one ack block, 2 byte largest observed, 2 byte block length)
3031 {"",
3032 {0x45}},
3033 // largest acked
3034 {"Unable to read largest acked.",
3035 {0x12, 0x34}},
3036 // Zero delta time.
3037 {"Unable to read ack delay time.",
3038 {0x00, 0x00}},
3039 // first ack block length.
3040 {"Unable to read first ack block length.",
3041 {0x88, 0x88}},
3042 // num timestamps.
3043 {"Underflow with first ack block length 34952 largest acked is 4660.",
3044 {0x00}}
3045 };
3046
3047 PacketFragments packet99 = {
3048 // type (short header, 4 byte packet number)
3049 {"",
3050 {0x43}},
3051 // connection_id
3052 {"",
3053 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3054 // packet number
3055 {"",
3056 {0x12, 0x34, 0x56, 0x78}},
3057 // frame type (IETF_ACK)
3058 {"",
3059 {0x02}},
3060 // largest acked
3061 {"Unable to read largest acked.",
3062 {kVarInt62TwoBytes + 0x12, 0x34}},
3063 // Zero delta time.
3064 {"Unable to read ack delay time.",
3065 {kVarInt62OneByte + 0x00}},
3066 // Ack block count (0 -- no blocks after the first)
3067 {"Unable to read ack block count.",
3068 {kVarInt62OneByte + 0x00}},
3069 // first ack block length.
3070 {"Unable to read first ack block length.",
3071 {kVarInt62TwoBytes + 0x28, 0x88}}
3072 };
3073 // clang-format on
3074
3075 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07003076 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05003077 ? packet99
fayang36825da2019-08-21 14:01:27 -07003078 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
3079 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003080 std::unique_ptr<QuicEncryptedPacket> encrypted(
3081 AssemblePacketFromFragments(fragments));
3082 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3083 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3084}
3085
3086// This test checks that the ack frame processor correctly identifies
3087// and handles the case where the third ack block's gap is larger than the
3088// available space in the ack range.
3089TEST_P(QuicFramerTest, ThirdAckBlockUnderflowGap) {
fkastenholz305e1732019-06-18 05:01:22 -07003090 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003091 // for now, only v99
3092 return;
3093 }
zhongyi546cc452019-04-12 15:27:49 -07003094 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003095 // clang-format off
3096 PacketFragments packet99 = {
3097 // type (short header, 4 byte packet number)
3098 {"",
3099 {0x43}},
3100 // connection_id
3101 {"",
3102 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3103 // packet number
3104 {"",
3105 {0x12, 0x34, 0x56, 0x78}},
3106 // frame type (IETF_ACK frame)
3107 {"",
3108 {0x02}},
3109 // largest acked
3110 {"Unable to read largest acked.",
3111 {kVarInt62OneByte + 63}},
3112 // Zero delta time.
3113 {"Unable to read ack delay time.",
3114 {kVarInt62OneByte + 0x00}},
3115 // Ack block count (2 -- 2 blocks after the first)
3116 {"Unable to read ack block count.",
3117 {kVarInt62OneByte + 0x02}},
3118 // first ack block length.
3119 {"Unable to read first ack block length.",
3120 {kVarInt62OneByte + 13}}, // Ack 14 packets, range 50..63 (inclusive)
3121
3122 {"Unable to read gap block value.",
3123 {kVarInt62OneByte + 9}}, // Gap 10 packets, 40..49 (inclusive)
3124 {"Unable to read ack block value.",
3125 {kVarInt62OneByte + 9}}, // Ack 10 packets, 30..39 (inclusive)
3126 {"Unable to read gap block value.",
3127 {kVarInt62OneByte + 29}}, // A gap of 30 packets (0..29 inclusive)
3128 // should be too big, leaving no room
3129 // for the ack.
3130 {"Underflow with gap block length 30 previous ack block start is 30.",
3131 {kVarInt62OneByte + 10}}, // Don't care
3132 };
3133 // clang-format on
3134
3135 std::unique_ptr<QuicEncryptedPacket> encrypted(
3136 AssemblePacketFromFragments(packet99));
3137 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3138 EXPECT_EQ(
3139 framer_.detailed_error(),
3140 "Underflow with gap block length 30 previous ack block start is 30.");
3141 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3142}
3143
3144// This test checks that the ack frame processor correctly identifies
3145// and handles the case where the third ack block's length is larger than the
3146// available space in the ack range.
3147TEST_P(QuicFramerTest, ThirdAckBlockUnderflowAck) {
fkastenholz305e1732019-06-18 05:01:22 -07003148 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003149 // for now, only v99
3150 return;
3151 }
zhongyi546cc452019-04-12 15:27:49 -07003152 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003153 // clang-format off
3154 PacketFragments packet99 = {
3155 // type (short header, 4 byte packet number)
3156 {"",
3157 {0x43}},
3158 // connection_id
3159 {"",
3160 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3161 // packet number
3162 {"",
3163 {0x12, 0x34, 0x56, 0x78}},
3164 // frame type (IETF_ACK frame)
3165 {"",
3166 {0x02}},
3167 // largest acked
3168 {"Unable to read largest acked.",
3169 {kVarInt62OneByte + 63}},
3170 // Zero delta time.
3171 {"Unable to read ack delay time.",
3172 {kVarInt62OneByte + 0x00}},
3173 // Ack block count (2 -- 2 blocks after the first)
3174 {"Unable to read ack block count.",
3175 {kVarInt62OneByte + 0x02}},
3176 // first ack block length.
3177 {"Unable to read first ack block length.",
3178 {kVarInt62OneByte + 13}}, // only 50 packet numbers "left"
3179
3180 {"Unable to read gap block value.",
3181 {kVarInt62OneByte + 10}}, // Only 40 packet numbers left
3182 {"Unable to read ack block value.",
3183 {kVarInt62OneByte + 10}}, // only 30 packet numbers left.
3184 {"Unable to read gap block value.",
3185 {kVarInt62OneByte + 1}}, // Gap is OK, 29 packet numbers left
3186 {"Unable to read ack block value.",
3187 {kVarInt62OneByte + 30}}, // Use up all 30, should be an error
3188 };
3189 // clang-format on
3190
3191 std::unique_ptr<QuicEncryptedPacket> encrypted(
3192 AssemblePacketFromFragments(packet99));
3193 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3194 EXPECT_EQ(framer_.detailed_error(),
3195 "Underflow with ack block length 31 latest ack block end is 25.");
3196 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3197}
3198
3199// Tests a variety of ack block wrap scenarios. For example, if the
3200// N-1th block causes packet 0 to be acked, then a gap would wrap
3201// around to 0x3fffffff ffffffff... Make sure we detect this
3202// condition.
3203TEST_P(QuicFramerTest, AckBlockUnderflowGapWrap) {
fkastenholz305e1732019-06-18 05:01:22 -07003204 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003205 // for now, only v99
3206 return;
3207 }
zhongyi546cc452019-04-12 15:27:49 -07003208 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003209 // clang-format off
3210 PacketFragments packet99 = {
3211 // type (short header, 4 byte packet number)
3212 {"",
3213 {0x43}},
3214 // connection_id
3215 {"",
3216 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3217 // packet number
3218 {"",
3219 {0x12, 0x34, 0x56, 0x78}},
3220 // frame type (IETF_ACK frame)
3221 {"",
3222 {0x02}},
3223 // largest acked
3224 {"Unable to read largest acked.",
3225 {kVarInt62OneByte + 10}},
3226 // Zero delta time.
3227 {"Unable to read ack delay time.",
3228 {kVarInt62OneByte + 0x00}},
3229 // Ack block count (1 -- 1 blocks after the first)
3230 {"Unable to read ack block count.",
3231 {kVarInt62OneByte + 1}},
3232 // first ack block length.
3233 {"Unable to read first ack block length.",
3234 {kVarInt62OneByte + 9}}, // Ack packets 1..10 (inclusive)
3235
3236 {"Unable to read gap block value.",
3237 {kVarInt62OneByte + 1}}, // Gap of 2 packets (-1...0), should wrap
3238 {"Underflow with gap block length 2 previous ack block start is 1.",
3239 {kVarInt62OneByte + 9}}, // irrelevant
3240 };
3241 // clang-format on
3242
3243 std::unique_ptr<QuicEncryptedPacket> encrypted(
3244 AssemblePacketFromFragments(packet99));
3245 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3246 EXPECT_EQ(framer_.detailed_error(),
3247 "Underflow with gap block length 2 previous ack block start is 1.");
3248 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3249}
3250
3251// As AckBlockUnderflowGapWrap, but in this test, it's the ack
3252// component of the ack-block that causes the wrap, not the gap.
3253TEST_P(QuicFramerTest, AckBlockUnderflowAckWrap) {
fkastenholz305e1732019-06-18 05:01:22 -07003254 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003255 // for now, only v99
3256 return;
3257 }
zhongyi546cc452019-04-12 15:27:49 -07003258 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003259 // clang-format off
3260 PacketFragments packet99 = {
3261 // type (short header, 4 byte packet number)
3262 {"",
3263 {0x43}},
3264 // connection_id
3265 {"",
3266 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3267 // packet number
3268 {"",
3269 {0x12, 0x34, 0x56, 0x78}},
3270 // frame type (IETF_ACK frame)
3271 {"",
3272 {0x02}},
3273 // largest acked
3274 {"Unable to read largest acked.",
3275 {kVarInt62OneByte + 10}},
3276 // Zero delta time.
3277 {"Unable to read ack delay time.",
3278 {kVarInt62OneByte + 0x00}},
3279 // Ack block count (1 -- 1 blocks after the first)
3280 {"Unable to read ack block count.",
3281 {kVarInt62OneByte + 1}},
3282 // first ack block length.
3283 {"Unable to read first ack block length.",
3284 {kVarInt62OneByte + 6}}, // Ack packets 4..10 (inclusive)
3285
3286 {"Unable to read gap block value.",
3287 {kVarInt62OneByte + 1}}, // Gap of 2 packets (2..3)
3288 {"Unable to read ack block value.",
3289 {kVarInt62OneByte + 9}}, // Should wrap.
3290 };
3291 // clang-format on
3292
3293 std::unique_ptr<QuicEncryptedPacket> encrypted(
3294 AssemblePacketFromFragments(packet99));
3295 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3296 EXPECT_EQ(framer_.detailed_error(),
3297 "Underflow with ack block length 10 latest ack block end is 1.");
3298 CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
3299}
3300
3301// An ack block that acks the entire range, 1...0x3fffffffffffffff
3302TEST_P(QuicFramerTest, AckBlockAcksEverything) {
fkastenholz305e1732019-06-18 05:01:22 -07003303 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003304 // for now, only v99
3305 return;
3306 }
zhongyi546cc452019-04-12 15:27:49 -07003307 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003308 // clang-format off
3309 PacketFragments packet99 = {
3310 // type (short header, 4 byte packet number)
3311 {"",
3312 {0x43}},
3313 // connection_id
3314 {"",
3315 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3316 // packet number
3317 {"",
3318 {0x12, 0x34, 0x56, 0x78}},
3319 // frame type (IETF_ACK frame)
3320 {"",
3321 {0x02}},
3322 // largest acked
3323 {"Unable to read largest acked.",
3324 {kVarInt62EightBytes + 0x3f, 0xff, 0xff, 0xff,
3325 0xff, 0xff, 0xff, 0xff}},
3326 // Zero delta time.
3327 {"Unable to read ack delay time.",
3328 {kVarInt62OneByte + 0x00}},
3329 // Ack block count No additional blocks
3330 {"Unable to read ack block count.",
3331 {kVarInt62OneByte + 0}},
3332 // first ack block length.
3333 {"Unable to read first ack block length.",
3334 {kVarInt62EightBytes + 0x3f, 0xff, 0xff, 0xff,
3335 0xff, 0xff, 0xff, 0xfe}},
3336 };
3337 // clang-format on
3338
3339 std::unique_ptr<QuicEncryptedPacket> encrypted(
3340 AssemblePacketFromFragments(packet99));
3341 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3342 EXPECT_EQ(1u, visitor_.ack_frames_.size());
3343 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3344 EXPECT_EQ(1u, frame.packets.NumIntervals());
3345 EXPECT_EQ(kLargestIetfLargestObserved, LargestAcked(frame));
3346 EXPECT_EQ(kLargestIetfLargestObserved.ToUint64(),
3347 frame.packets.NumPacketsSlow());
3348}
3349
3350// This test looks for a malformed ack where
3351// - There is a largest-acked value (that is, the frame is acking
3352// something,
3353// - But the length of the first ack block is 0 saying that no frames
3354// are being acked with the largest-acked value or there are no
3355// additional ack blocks.
3356//
3357TEST_P(QuicFramerTest, AckFrameFirstAckBlockLengthZero) {
fkastenholz305e1732019-06-18 05:01:22 -07003358 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003359 // Not applicable to version 99 -- first ack block contains the
3360 // number of packets that preceed the largest_acked packet.
3361 // A value of 0 means no packets preceed --- that the block's
3362 // length is 1. Therefore the condition that this test checks can
3363 // not arise.
3364 return;
3365 }
nharper9bb83462019-05-01 10:53:22 -07003366 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003367
3368 // clang-format off
3369 PacketFragments packet = {
3370 // public flags (8 byte connection_id)
3371 {"",
3372 { 0x2C }},
3373 // connection_id
3374 {"",
3375 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3376 // packet number
3377 {"",
3378 { 0x12, 0x34, 0x56, 0x78 }},
3379
3380 // frame type (ack frame)
3381 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3382 {"",
3383 { 0x65 }},
3384 // largest acked
3385 {"Unable to read largest acked.",
3386 { 0x12, 0x34 }},
3387 // Zero delta time.
3388 {"Unable to read ack delay time.",
3389 { 0x00, 0x00 }},
3390 // num ack blocks ranges.
3391 {"Unable to read num of ack blocks.",
3392 { 0x01 }},
3393 // first ack block length.
3394 {"Unable to read first ack block length.",
3395 { 0x00, 0x00 }},
3396 // gap to next block.
3397 { "First block length is zero.",
3398 { 0x01 }},
3399 // ack block length.
3400 { "First block length is zero.",
3401 { 0x0e, 0xaf }},
3402 // Number of timestamps.
3403 { "First block length is zero.",
3404 { 0x00 }},
3405 };
3406
QUICHE teama6ef0a62019-03-07 20:34:33 -05003407 PacketFragments packet46 = {
3408 // type (short header, 4 byte packet number)
3409 {"",
3410 { 0x43 }},
3411 // connection_id
3412 {"",
3413 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3414 // packet number
3415 {"",
3416 { 0x12, 0x34, 0x56, 0x78 }},
3417
3418 // frame type (ack frame)
3419 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3420 {"",
3421 { 0x65 }},
3422 // largest acked
3423 {"Unable to read largest acked.",
3424 { 0x12, 0x34 }},
3425 // Zero delta time.
3426 {"Unable to read ack delay time.",
3427 { 0x00, 0x00 }},
3428 // num ack blocks ranges.
3429 {"Unable to read num of ack blocks.",
3430 { 0x01 }},
3431 // first ack block length.
3432 {"Unable to read first ack block length.",
3433 { 0x00, 0x00 }},
3434 // gap to next block.
3435 { "First block length is zero.",
3436 { 0x01 }},
3437 // ack block length.
3438 { "First block length is zero.",
3439 { 0x0e, 0xaf }},
3440 // Number of timestamps.
3441 { "First block length is zero.",
3442 { 0x00 }},
3443 };
3444
3445 // clang-format on
3446 PacketFragments& fragments =
fayang36825da2019-08-21 14:01:27 -07003447 framer_.transport_version() >= QUIC_VERSION_46 ? packet46 : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -05003448
3449 std::unique_ptr<QuicEncryptedPacket> encrypted(
3450 AssemblePacketFromFragments(fragments));
3451
3452 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3453 EXPECT_EQ(QUIC_INVALID_ACK_DATA, framer_.error());
3454
3455 ASSERT_TRUE(visitor_.header_.get());
3456 EXPECT_TRUE(CheckDecryption(
3457 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3458 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
3459
3460 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3461 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3462
3463 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3464}
3465
3466TEST_P(QuicFramerTest, AckFrameOneAckBlockMaxLength) {
zhongyi546cc452019-04-12 15:27:49 -07003467 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003468 // clang-format off
3469 PacketFragments packet = {
3470 // public flags (8 byte connection_id)
3471 {"",
3472 {0x2C}},
3473 // connection_id
3474 {"",
3475 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3476 // packet number
3477 {"",
3478 {0x12, 0x34, 0x56, 0x78}},
3479 // frame type (ack frame)
3480 // (one ack block, 4 byte largest observed, 2 byte block length)
3481 {"",
3482 {0x49}},
3483 // largest acked
3484 {"Unable to read largest acked.",
3485 {0x12, 0x34, 0x56, 0x78}},
3486 // Zero delta time.
3487 {"Unable to read ack delay time.",
3488 {0x00, 0x00}},
3489 // first ack block length.
3490 {"Unable to read first ack block length.",
3491 {0x12, 0x34}},
3492 // num timestamps.
3493 {"Unable to read num received packets.",
3494 {0x00}}
3495 };
3496
QUICHE teama6ef0a62019-03-07 20:34:33 -05003497 PacketFragments packet46 = {
3498 // type (short header, 4 byte packet number)
3499 {"",
3500 {0x43}},
3501 // connection_id
3502 {"",
3503 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3504 // packet number
3505 {"",
3506 {0x56, 0x78, 0x9A, 0xBC}},
3507 // frame type (ack frame)
3508 // (one ack block, 4 byte largest observed, 2 byte block length)
3509 {"",
3510 {0x49}},
3511 // largest acked
3512 {"Unable to read largest acked.",
3513 {0x12, 0x34, 0x56, 0x78}},
3514 // Zero delta time.
3515 {"Unable to read ack delay time.",
3516 {0x00, 0x00}},
3517 // first ack block length.
3518 {"Unable to read first ack block length.",
3519 {0x12, 0x34}},
3520 // num timestamps.
3521 {"Unable to read num received packets.",
3522 {0x00}}
3523 };
3524
3525 PacketFragments packet99 = {
3526 // type (short header, 4 byte packet number)
3527 {"",
3528 {0x43}},
3529 // connection_id
3530 {"",
3531 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3532 // packet number
3533 {"",
3534 {0x56, 0x78, 0x9A, 0xBC}},
3535 // frame type (IETF_ACK frame)
3536 {"",
3537 {0x02}},
3538 // largest acked
3539 {"Unable to read largest acked.",
3540 {kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78}},
3541 // Zero delta time.
3542 {"Unable to read ack delay time.",
3543 {kVarInt62OneByte + 0x00}},
3544 // Number of ack blocks after first
3545 {"Unable to read ack block count.",
3546 {kVarInt62OneByte + 0x00}},
3547 // first ack block length.
3548 {"Unable to read first ack block length.",
3549 {kVarInt62TwoBytes + 0x12, 0x33}}
3550 };
3551 // clang-format on
3552
3553 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07003554 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05003555 ? packet99
fayang36825da2019-08-21 14:01:27 -07003556 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
3557 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003558 std::unique_ptr<QuicEncryptedPacket> encrypted(
3559 AssemblePacketFromFragments(fragments));
3560 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3561
3562 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
3563 ASSERT_TRUE(visitor_.header_.get());
3564 EXPECT_TRUE(CheckDecryption(
3565 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3566 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
3567
3568 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3569 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3570 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3571 EXPECT_EQ(kPacketNumber, LargestAcked(frame));
3572 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
3573
3574 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3575}
3576
3577// Tests ability to handle multiple ackblocks after the first ack
3578// block. Non-version-99 tests include multiple timestamps as well.
3579TEST_P(QuicFramerTest, AckFrameTwoTimeStampsMultipleAckBlocks) {
zhongyi546cc452019-04-12 15:27:49 -07003580 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003581 // clang-format off
3582 PacketFragments packet = {
3583 // public flags (8 byte connection_id)
3584 {"",
3585 { 0x2C }},
3586 // connection_id
3587 {"",
3588 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3589 // packet number
3590 {"",
3591 { 0x12, 0x34, 0x56, 0x78 }},
3592
3593 // frame type (ack frame)
3594 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3595 {"",
3596 { 0x65 }},
3597 // largest acked
3598 {"Unable to read largest acked.",
3599 { 0x12, 0x34 }},
3600 // Zero delta time.
3601 {"Unable to read ack delay time.",
3602 { 0x00, 0x00 }},
3603 // num ack blocks ranges.
3604 {"Unable to read num of ack blocks.",
3605 { 0x04 }},
3606 // first ack block length.
3607 {"Unable to read first ack block length.",
3608 { 0x00, 0x01 }},
3609 // gap to next block.
3610 { "Unable to read gap to next ack block.",
3611 { 0x01 }},
3612 // ack block length.
3613 { "Unable to ack block length.",
3614 { 0x0e, 0xaf }},
3615 // gap to next block.
3616 { "Unable to read gap to next ack block.",
3617 { 0xff }},
3618 // ack block length.
3619 { "Unable to ack block length.",
3620 { 0x00, 0x00 }},
3621 // gap to next block.
3622 { "Unable to read gap to next ack block.",
3623 { 0x91 }},
3624 // ack block length.
3625 { "Unable to ack block length.",
3626 { 0x01, 0xea }},
3627 // gap to next block.
3628 { "Unable to read gap to next ack block.",
3629 { 0x05 }},
3630 // ack block length.
3631 { "Unable to ack block length.",
3632 { 0x00, 0x04 }},
3633 // Number of timestamps.
3634 { "Unable to read num received packets.",
3635 { 0x02 }},
3636 // Delta from largest observed.
3637 { "Unable to read sequence delta in received packets.",
3638 { 0x01 }},
3639 // Delta time.
3640 { "Unable to read time delta in received packets.",
3641 { 0x76, 0x54, 0x32, 0x10 }},
3642 // Delta from largest observed.
3643 { "Unable to read sequence delta in received packets.",
3644 { 0x02 }},
3645 // Delta time.
3646 { "Unable to read incremental time delta in received packets.",
3647 { 0x32, 0x10 }},
3648 };
3649
QUICHE teama6ef0a62019-03-07 20:34:33 -05003650 PacketFragments packet46 = {
3651 // type (short header, 4 byte packet number)
3652 {"",
3653 { 0x43 }},
3654 // connection_id
3655 {"",
3656 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3657 // packet number
3658 {"",
3659 { 0x12, 0x34, 0x56, 0x78 }},
3660
3661 // frame type (ack frame)
3662 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3663 {"",
3664 { 0x65 }},
3665 // largest acked
3666 {"Unable to read largest acked.",
3667 { 0x12, 0x34 }},
3668 // Zero delta time.
3669 {"Unable to read ack delay time.",
3670 { 0x00, 0x00 }},
3671 // num ack blocks ranges.
3672 {"Unable to read num of ack blocks.",
3673 { 0x04 }},
3674 // first ack block length.
3675 {"Unable to read first ack block length.",
3676 { 0x00, 0x01 }},
3677 // gap to next block.
3678 { "Unable to read gap to next ack block.",
3679 { 0x01 }},
3680 // ack block length.
3681 { "Unable to ack block length.",
3682 { 0x0e, 0xaf }},
3683 // gap to next block.
3684 { "Unable to read gap to next ack block.",
3685 { 0xff }},
3686 // ack block length.
3687 { "Unable to ack block length.",
3688 { 0x00, 0x00 }},
3689 // gap to next block.
3690 { "Unable to read gap to next ack block.",
3691 { 0x91 }},
3692 // ack block length.
3693 { "Unable to ack block length.",
3694 { 0x01, 0xea }},
3695 // gap to next block.
3696 { "Unable to read gap to next ack block.",
3697 { 0x05 }},
3698 // ack block length.
3699 { "Unable to ack block length.",
3700 { 0x00, 0x04 }},
3701 // Number of timestamps.
3702 { "Unable to read num received packets.",
3703 { 0x02 }},
3704 // Delta from largest observed.
3705 { "Unable to read sequence delta in received packets.",
3706 { 0x01 }},
3707 // Delta time.
3708 { "Unable to read time delta in received packets.",
3709 { 0x76, 0x54, 0x32, 0x10 }},
3710 // Delta from largest observed.
3711 { "Unable to read sequence delta in received packets.",
3712 { 0x02 }},
3713 // Delta time.
3714 { "Unable to read incremental time delta in received packets.",
3715 { 0x32, 0x10 }},
3716 };
3717
3718 PacketFragments packet99 = {
3719 // type (short header, 4 byte packet number)
3720 {"",
3721 { 0x43 }},
3722 // connection_id
3723 {"",
3724 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3725 // packet number
3726 {"",
3727 { 0x12, 0x34, 0x56, 0x78 }},
3728
3729 // frame type (IETF_ACK frame)
3730 {"",
3731 { 0x02 }},
3732 // largest acked
3733 {"Unable to read largest acked.",
3734 { kVarInt62TwoBytes + 0x12, 0x34 }}, // = 4660
3735 // Zero delta time.
3736 {"Unable to read ack delay time.",
3737 { kVarInt62OneByte + 0x00 }},
3738 // number of additional ack blocks
3739 {"Unable to read ack block count.",
3740 { kVarInt62OneByte + 0x03 }},
3741 // first ack block length.
3742 {"Unable to read first ack block length.",
3743 { kVarInt62OneByte + 0x00 }}, // 1st block length = 1
3744
3745 // Additional ACK Block #1
3746 // gap to next block.
3747 { "Unable to read gap block value.",
3748 { kVarInt62OneByte + 0x00 }}, // gap of 1 packet
3749 // ack block length.
3750 { "Unable to read ack block value.",
3751 { kVarInt62TwoBytes + 0x0e, 0xae }}, // 3759
3752
3753 // pre-version-99 test includes an ack block of 0 length. this
3754 // can not happen in version 99. ergo the second block is not
3755 // present in the v99 test and the gap length of the next block
3756 // is the sum of the two gaps in the pre-version-99 tests.
3757 // Additional ACK Block #2
3758 // gap to next block.
3759 { "Unable to read gap block value.",
3760 { kVarInt62TwoBytes + 0x01, 0x8f }}, // Gap is 400 (0x190) pkts
3761 // ack block length.
3762 { "Unable to read ack block value.",
3763 { kVarInt62TwoBytes + 0x01, 0xe9 }}, // block is 389 (x1ea) pkts
3764
3765 // Additional ACK Block #3
3766 // gap to next block.
3767 { "Unable to read gap block value.",
3768 { kVarInt62OneByte + 0x04 }}, // Gap is 5 packets.
3769 // ack block length.
3770 { "Unable to read ack block value.",
3771 { kVarInt62OneByte + 0x03 }}, // block is 3 packets.
3772 };
3773
3774 // clang-format on
3775 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07003776 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05003777 ? packet99
fayang36825da2019-08-21 14:01:27 -07003778 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
3779 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003780
3781 std::unique_ptr<QuicEncryptedPacket> encrypted(
3782 AssemblePacketFromFragments(fragments));
3783
3784 framer_.set_process_timestamps(true);
3785 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3786
3787 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
3788 ASSERT_TRUE(visitor_.header_.get());
3789 EXPECT_TRUE(CheckDecryption(
3790 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3791 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
3792
3793 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3794 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3795 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3796 EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
3797 ASSERT_EQ(4254u, frame.packets.NumPacketsSlow());
3798 EXPECT_EQ(4u, frame.packets.NumIntervals());
fkastenholz305e1732019-06-18 05:01:22 -07003799 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003800 EXPECT_EQ(0u, frame.received_packet_times.size());
3801 } else {
3802 EXPECT_EQ(2u, frame.received_packet_times.size());
3803 }
3804 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3805}
3806
3807TEST_P(QuicFramerTest, AckFrameTimeStampDeltaTooHigh) {
nharper9bb83462019-05-01 10:53:22 -07003808 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003809 // clang-format off
3810 unsigned char packet[] = {
3811 // public flags (8 byte connection_id)
3812 0x28,
3813 // connection_id
3814 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3815 // packet number
3816 0x12, 0x34, 0x56, 0x78,
3817
3818 // frame type (ack frame)
3819 // (no ack blocks, 1 byte largest observed, 1 byte block length)
3820 0x40,
3821 // largest acked
3822 0x01,
3823 // Zero delta time.
3824 0x00, 0x00,
3825 // first ack block length.
3826 0x01,
3827 // num timestamps.
3828 0x01,
3829 // Delta from largest observed.
3830 0x01,
3831 // Delta time.
3832 0x10, 0x32, 0x54, 0x76,
3833 };
3834
QUICHE teama6ef0a62019-03-07 20:34:33 -05003835 unsigned char packet46[] = {
3836 // type (short header, 4 byte packet number)
3837 0x43,
3838 // connection_id
3839 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3840 // packet number
3841 0x12, 0x34, 0x56, 0x78,
3842
3843 // frame type (ack frame)
3844 // (no ack blocks, 1 byte largest observed, 1 byte block length)
3845 0x40,
3846 // largest acked
3847 0x01,
3848 // Zero delta time.
3849 0x00, 0x00,
3850 // first ack block length.
3851 0x01,
3852 // num timestamps.
3853 0x01,
3854 // Delta from largest observed.
3855 0x01,
3856 // Delta time.
3857 0x10, 0x32, 0x54, 0x76,
3858 };
3859 // clang-format on
fkastenholz305e1732019-06-18 05:01:22 -07003860 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003861 return;
3862 }
3863 QuicEncryptedPacket encrypted(
fayang36825da2019-08-21 14:01:27 -07003864 AsChars(framer_.transport_version() >= QUIC_VERSION_46 ? packet46
3865 : packet),
QUICHE teama6ef0a62019-03-07 20:34:33 -05003866 QUIC_ARRAYSIZE(packet), false);
3867 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
3868 EXPECT_TRUE(QuicTextUtils::StartsWith(
3869 framer_.detailed_error(), "delta_from_largest_observed too high"));
3870}
3871
3872TEST_P(QuicFramerTest, AckFrameTimeStampSecondDeltaTooHigh) {
nharper9bb83462019-05-01 10:53:22 -07003873 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003874 // clang-format off
3875 unsigned char packet[] = {
3876 // public flags (8 byte connection_id)
3877 0x28,
3878 // connection_id
3879 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3880 // packet number
3881 0x12, 0x34, 0x56, 0x78,
3882
3883 // frame type (ack frame)
3884 // (no ack blocks, 1 byte largest observed, 1 byte block length)
3885 0x40,
3886 // largest acked
3887 0x03,
3888 // Zero delta time.
3889 0x00, 0x00,
3890 // first ack block length.
3891 0x03,
3892 // num timestamps.
3893 0x02,
3894 // Delta from largest observed.
3895 0x01,
3896 // Delta time.
3897 0x10, 0x32, 0x54, 0x76,
3898 // Delta from largest observed.
3899 0x03,
3900 // Delta time.
3901 0x10, 0x32,
3902 };
3903
QUICHE teama6ef0a62019-03-07 20:34:33 -05003904 unsigned char packet46[] = {
3905 // type (short header, 4 byte packet number)
3906 0x43,
3907 // connection_id
3908 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3909 // packet number
3910 0x12, 0x34, 0x56, 0x78,
3911
3912 // frame type (ack frame)
3913 // (no ack blocks, 1 byte largest observed, 1 byte block length)
3914 0x40,
3915 // largest acked
3916 0x03,
3917 // Zero delta time.
3918 0x00, 0x00,
3919 // first ack block length.
3920 0x03,
3921 // num timestamps.
3922 0x02,
3923 // Delta from largest observed.
3924 0x01,
3925 // Delta time.
3926 0x10, 0x32, 0x54, 0x76,
3927 // Delta from largest observed.
3928 0x03,
3929 // Delta time.
3930 0x10, 0x32,
3931 };
3932 // clang-format on
fkastenholz305e1732019-06-18 05:01:22 -07003933 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003934 return;
3935 }
3936 QuicEncryptedPacket encrypted(
fayang36825da2019-08-21 14:01:27 -07003937 AsChars(framer_.transport_version() >= QUIC_VERSION_46 ? packet46
3938 : packet),
QUICHE teama6ef0a62019-03-07 20:34:33 -05003939 QUIC_ARRAYSIZE(packet), false);
3940 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
3941 EXPECT_TRUE(QuicTextUtils::StartsWith(
3942 framer_.detailed_error(), "delta_from_largest_observed too high"));
3943}
3944
3945TEST_P(QuicFramerTest, NewStopWaitingFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07003946 if (VersionHasIetfQuicFrames(version_.transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003947 return;
3948 }
nharper9bb83462019-05-01 10:53:22 -07003949 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003950 // clang-format off
3951 PacketFragments packet = {
3952 // public flags (8 byte connection_id)
3953 {"",
3954 {0x2C}},
3955 // connection_id
3956 {"",
3957 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3958 // packet number
3959 {"",
3960 {0x12, 0x34, 0x56, 0x78}},
3961 // frame type (stop waiting frame)
3962 {"",
3963 {0x06}},
3964 // least packet number awaiting an ack, delta from packet number.
3965 {"Unable to read least unacked delta.",
3966 {0x00, 0x00, 0x00, 0x08}}
3967 };
3968
QUICHE teama6ef0a62019-03-07 20:34:33 -05003969 PacketFragments packet46 = {
3970 // type (short header, 4 byte packet number)
3971 {"",
3972 {0x43}},
3973 // connection_id
3974 {"",
3975 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3976 // packet number
3977 {"",
3978 {0x12, 0x34, 0x56, 0x78}},
3979 // frame type (stop waiting frame)
3980 {"",
3981 {0x06}},
3982 // least packet number awaiting an ack, delta from packet number.
3983 {"Unable to read least unacked delta.",
3984 {0x00, 0x00, 0x00, 0x08}}
3985 };
3986 // clang-format on
3987
3988 PacketFragments& fragments =
fayang36825da2019-08-21 14:01:27 -07003989 framer_.transport_version() >= QUIC_VERSION_46 ? packet46 : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -05003990
3991 std::unique_ptr<QuicEncryptedPacket> encrypted(
3992 AssemblePacketFromFragments(fragments));
ianswett97b690b2019-05-02 15:12:43 -07003993 if (GetQuicReloadableFlag(quic_do_not_accept_stop_waiting) &&
fayang36825da2019-08-21 14:01:27 -07003994 version_.transport_version >= QUIC_VERSION_46) {
ianswett97b690b2019-05-02 15:12:43 -07003995 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3996 EXPECT_EQ(QUIC_INVALID_STOP_WAITING_DATA, framer_.error());
3997 EXPECT_EQ("STOP WAITING not supported in version 44+.",
3998 framer_.detailed_error());
3999 return;
4000 }
4001
QUICHE teama6ef0a62019-03-07 20:34:33 -05004002 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4003
4004 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4005 ASSERT_TRUE(visitor_.header_.get());
4006 EXPECT_TRUE(CheckDecryption(
4007 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4008 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4009
4010 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4011 ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size());
4012 const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0];
4013 EXPECT_EQ(kLeastUnacked, frame.least_unacked);
4014
4015 CheckFramingBoundaries(fragments, QUIC_INVALID_STOP_WAITING_DATA);
4016}
4017
4018TEST_P(QuicFramerTest, InvalidNewStopWaitingFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07004019 if (VersionHasIetfQuicFrames(version_.transport_version) ||
ianswett97b690b2019-05-02 15:12:43 -07004020 (GetQuicReloadableFlag(quic_do_not_accept_stop_waiting) &&
fayang36825da2019-08-21 14:01:27 -07004021 version_.transport_version >= QUIC_VERSION_46)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004022 return;
4023 }
nharper9bb83462019-05-01 10:53:22 -07004024 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004025 // clang-format off
4026 unsigned char packet[] = {
4027 // public flags (8 byte connection_id)
4028 0x2C,
4029 // connection_id
4030 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4031 // packet number
4032 0x12, 0x34, 0x56, 0x78,
4033 // frame type (stop waiting frame)
4034 0x06,
4035 // least packet number awaiting an ack, delta from packet number.
4036 0x13, 0x34, 0x56, 0x78,
4037 0x9A, 0xA8,
4038 };
4039
QUICHE teama6ef0a62019-03-07 20:34:33 -05004040 unsigned char packet46[] = {
4041 // type (short header, 4 byte packet number)
4042 0x43,
4043 // connection_id
4044 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4045 // packet number
4046 0x12, 0x34, 0x56, 0x78,
4047 // frame type (stop waiting frame)
4048 0x06,
4049 // least packet number awaiting an ack, delta from packet number.
4050 0x57, 0x78, 0x9A, 0xA8,
4051 };
4052 // clang-format on
4053
4054 QuicEncryptedPacket encrypted(
fayang36825da2019-08-21 14:01:27 -07004055 AsChars(framer_.transport_version() >= QUIC_VERSION_46 ? packet46
4056 : packet),
4057 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46)
QUICHE teama6ef0a62019-03-07 20:34:33 -05004058 : QUIC_ARRAYSIZE(packet),
4059 false);
4060 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
4061 EXPECT_EQ(QUIC_INVALID_STOP_WAITING_DATA, framer_.error());
4062 EXPECT_EQ("Invalid unacked delta.", framer_.detailed_error());
4063}
4064
4065TEST_P(QuicFramerTest, RstStreamFrame) {
zhongyi546cc452019-04-12 15:27:49 -07004066 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004067 // clang-format off
4068 PacketFragments packet = {
4069 // public flags (8 byte connection_id)
4070 {"",
4071 {0x28}},
4072 // connection_id
4073 {"",
4074 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4075 // packet number
4076 {"",
4077 {0x12, 0x34, 0x56, 0x78}},
4078 // frame type (rst stream frame)
4079 {"",
4080 {0x01}},
4081 // stream id
4082 {"Unable to read stream_id.",
4083 {0x01, 0x02, 0x03, 0x04}},
4084 // sent byte offset
4085 {"Unable to read rst stream sent byte offset.",
4086 {0x3A, 0x98, 0xFE, 0xDC,
4087 0x32, 0x10, 0x76, 0x54}},
4088 // error code
4089 {"Unable to read rst stream error code.",
4090 {0x00, 0x00, 0x00, 0x01}}
4091 };
4092
QUICHE teama6ef0a62019-03-07 20:34:33 -05004093 PacketFragments packet46 = {
4094 // type (short header, 4 byte packet number)
4095 {"",
4096 {0x43}},
4097 // connection_id
4098 {"",
4099 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4100 // packet number
4101 {"",
4102 {0x12, 0x34, 0x56, 0x78}},
4103 // frame type (rst stream frame)
4104 {"",
4105 {0x01}},
4106 // stream id
4107 {"Unable to read stream_id.",
4108 {0x01, 0x02, 0x03, 0x04}},
4109 // sent byte offset
4110 {"Unable to read rst stream sent byte offset.",
4111 {0x3A, 0x98, 0xFE, 0xDC,
4112 0x32, 0x10, 0x76, 0x54}},
4113 // error code
4114 {"Unable to read rst stream error code.",
4115 {0x00, 0x00, 0x00, 0x01}}
4116 };
4117
4118 PacketFragments packet99 = {
4119 // type (short header, 4 byte packet number)
4120 {"",
4121 {0x43}},
4122 // connection_id
4123 {"",
4124 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4125 // packet number
4126 {"",
4127 {0x12, 0x34, 0x56, 0x78}},
4128 // frame type (IETF_RST_STREAM frame)
4129 {"",
4130 {0x04}},
4131 // stream id
4132 {"Unable to read rst stream stream id.",
4133 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4134 // application error code
4135 {"Unable to read rst stream error code.",
fkastenholz07300e52019-07-16 11:51:37 -07004136 {kVarInt62OneByte + 0x01}},
QUICHE teama6ef0a62019-03-07 20:34:33 -05004137 // Final Offset
4138 {"Unable to read rst stream sent byte offset.",
4139 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}}
4140 };
4141 // clang-format on
4142
4143 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07004144 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05004145 ? packet99
fayang36825da2019-08-21 14:01:27 -07004146 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
4147 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004148 std::unique_ptr<QuicEncryptedPacket> encrypted(
4149 AssemblePacketFromFragments(fragments));
4150 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4151
4152 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4153 ASSERT_TRUE(visitor_.header_.get());
4154 EXPECT_TRUE(CheckDecryption(
4155 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4156 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4157
4158 EXPECT_EQ(kStreamId, visitor_.rst_stream_frame_.stream_id);
4159 EXPECT_EQ(0x01, visitor_.rst_stream_frame_.error_code);
4160 EXPECT_EQ(kStreamOffset, visitor_.rst_stream_frame_.byte_offset);
4161 CheckFramingBoundaries(fragments, QUIC_INVALID_RST_STREAM_DATA);
4162}
4163
4164TEST_P(QuicFramerTest, ConnectionCloseFrame) {
zhongyi546cc452019-04-12 15:27:49 -07004165 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004166 // clang-format off
4167 PacketFragments packet = {
4168 // public flags (8 byte connection_id)
4169 {"",
4170 {0x28}},
4171 // connection_id
4172 {"",
4173 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4174 // packet number
4175 {"",
4176 {0x12, 0x34, 0x56, 0x78}},
4177 // frame type (connection close frame)
4178 {"",
4179 {0x02}},
4180 // error code
4181 {"Unable to read connection close error code.",
4182 {0x00, 0x00, 0x00, 0x11}},
4183 {"Unable to read connection close error details.",
4184 {
4185 // error details length
4186 0x0, 0x0d,
4187 // error details
4188 'b', 'e', 'c', 'a',
4189 'u', 's', 'e', ' ',
4190 'I', ' ', 'c', 'a',
4191 'n'}
4192 }
4193 };
4194
QUICHE teama6ef0a62019-03-07 20:34:33 -05004195 PacketFragments packet46 = {
4196 // type (short header, 4 byte packet number)
4197 {"",
4198 {0x43}},
4199 // connection_id
4200 {"",
4201 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4202 // packet number
4203 {"",
4204 {0x12, 0x34, 0x56, 0x78}},
4205 // frame type (connection close frame)
4206 {"",
4207 {0x02}},
4208 // error code
4209 {"Unable to read connection close error code.",
4210 {0x00, 0x00, 0x00, 0x11}},
4211 {"Unable to read connection close error details.",
4212 {
4213 // error details length
4214 0x0, 0x0d,
4215 // error details
4216 'b', 'e', 'c', 'a',
4217 'u', 's', 'e', ' ',
4218 'I', ' ', 'c', 'a',
4219 'n'}
4220 }
4221 };
4222
4223 PacketFragments packet99 = {
4224 // type (short header, 4 byte packet number)
4225 {"",
4226 {0x43}},
4227 // connection_id
4228 {"",
4229 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4230 // packet number
4231 {"",
4232 {0x12, 0x34, 0x56, 0x78}},
fkastenholzb4dade72019-08-05 06:54:20 -07004233 // frame type (IETF Transport CONNECTION_CLOSE frame)
QUICHE teama6ef0a62019-03-07 20:34:33 -05004234 {"",
4235 {0x1c}},
4236 // error code
4237 {"Unable to read connection close error code.",
fkastenholzd57d3f92019-07-16 09:05:17 -07004238 {kVarInt62TwoBytes + 0x00, 0x11}},
QUICHE teama6ef0a62019-03-07 20:34:33 -05004239 {"Unable to read connection close frame type.",
4240 {kVarInt62TwoBytes + 0x12, 0x34 }},
4241 {"Unable to read connection close error details.",
4242 {
4243 // error details length
4244 kVarInt62OneByte + 0x0d,
4245 // error details
4246 'b', 'e', 'c', 'a',
4247 'u', 's', 'e', ' ',
4248 'I', ' ', 'c', 'a',
4249 'n'}
4250 }
4251 };
4252 // clang-format on
4253
4254 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07004255 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05004256 ? packet99
fayang36825da2019-08-21 14:01:27 -07004257 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
4258 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004259 std::unique_ptr<QuicEncryptedPacket> encrypted(
4260 AssemblePacketFromFragments(fragments));
4261 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4262
4263 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4264 ASSERT_TRUE(visitor_.header_.get());
4265 EXPECT_TRUE(CheckDecryption(
4266 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4267 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4268
4269 EXPECT_EQ(0u, visitor_.stream_frames_.size());
zhongyiba6354a2019-04-10 16:49:25 -07004270 EXPECT_EQ(0x11u, static_cast<unsigned>(
4271 visitor_.connection_close_frame_.quic_error_code));
QUICHE teama6ef0a62019-03-07 20:34:33 -05004272 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
fkastenholz305e1732019-06-18 05:01:22 -07004273 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholze9d71a82019-04-09 05:12:13 -07004274 EXPECT_EQ(0x1234u,
4275 visitor_.connection_close_frame_.transport_close_frame_type);
fkastenholzb4dade72019-08-05 06:54:20 -07004276 EXPECT_EQ(QUIC_IETF_GQUIC_ERROR_MISSING,
4277 visitor_.connection_close_frame_.extracted_error_code);
fkastenholza14a7ae2019-08-07 05:21:22 -07004278 } else {
4279 // For Google QUIC closes, the error code is copied into
4280 // extracted_error_code.
4281 EXPECT_EQ(0x11u,
4282 static_cast<unsigned>(
4283 visitor_.connection_close_frame_.extracted_error_code));
fkastenholzb4dade72019-08-05 06:54:20 -07004284 }
4285
4286 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4287
4288 CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4289}
4290
4291// As above, but checks that for Google-QUIC, if there happens
4292// to be an ErrorCode string at the start of the details, it is
4293// NOT extracted/parsed/folded/spindled/and/mutilated.
4294TEST_P(QuicFramerTest, ConnectionCloseFrameWithExtractedInfoIgnoreGCuic) {
4295 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4296
4297 // clang-format off
4298 PacketFragments packet = {
4299 // public flags (8 byte connection_id)
4300 {"",
4301 {0x28}},
4302 // connection_id
4303 {"",
4304 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4305 // packet number
4306 {"",
4307 {0x12, 0x34, 0x56, 0x78}},
4308 // frame type (connection close frame)
4309 {"",
4310 {0x02}},
4311 // error code
4312 {"Unable to read connection close error code.",
4313 {0x00, 0x00, 0x00, 0x11}},
4314 {"Unable to read connection close error details.",
4315 {
4316 // error details length
4317 0x0, 0x13,
4318 // error details
4319 '1', '7', '7', '6',
4320 '7', ':', 'b', 'e',
4321 'c', 'a', 'u', 's',
4322 'e', ' ', 'I', ' ',
4323 'c', 'a', 'n'}
4324 }
4325 };
4326
fkastenholzb4dade72019-08-05 06:54:20 -07004327 PacketFragments packet46 = {
4328 // type (short header, 4 byte packet number)
4329 {"",
4330 {0x43}},
4331 // connection_id
4332 {"",
4333 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4334 // packet number
4335 {"",
4336 {0x12, 0x34, 0x56, 0x78}},
4337 // frame type (connection close frame)
4338 {"",
4339 {0x02}},
4340 // error code
4341 {"Unable to read connection close error code.",
4342 {0x00, 0x00, 0x00, 0x11}},
4343 {"Unable to read connection close error details.",
4344 {
4345 // error details length
4346 0x0, 0x13,
4347 // error details
4348 '1', '7', '7', '6',
4349 '7', ':', 'b', 'e',
4350 'c', 'a', 'u', 's',
4351 'e', ' ', 'I', ' ',
4352 'c', 'a', 'n'}
4353 }
4354 };
4355
4356 PacketFragments packet99 = {
4357 // type (short header, 4 byte packet number)
4358 {"",
4359 {0x43}},
4360 // connection_id
4361 {"",
4362 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4363 // packet number
4364 {"",
4365 {0x12, 0x34, 0x56, 0x78}},
4366 // frame type (IETF Transport CONNECTION_CLOSE frame)
4367 {"",
4368 {0x1c}},
4369 // error code
4370 {"Unable to read connection close error code.",
4371 {kVarInt62OneByte + 0x11}},
4372 {"Unable to read connection close frame type.",
4373 {kVarInt62TwoBytes + 0x12, 0x34 }},
4374 {"Unable to read connection close error details.",
4375 {
4376 // error details length
4377 kVarInt62OneByte + 0x13,
4378 // error details
4379 '1', '7', '7', '6',
4380 '7', ':', 'b', 'e',
4381 'c', 'a', 'u', 's',
4382 'e', ' ', 'I', ' ',
4383 'c', 'a', 'n'}
4384 }
4385 };
4386 // clang-format on
4387
4388 PacketFragments& fragments =
4389 VersionHasIetfQuicFrames(framer_.transport_version())
4390 ? packet99
fayang36825da2019-08-21 14:01:27 -07004391 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
4392 : packet);
fkastenholzb4dade72019-08-05 06:54:20 -07004393 std::unique_ptr<QuicEncryptedPacket> encrypted(
4394 AssemblePacketFromFragments(fragments));
4395 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4396
4397 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4398 ASSERT_TRUE(visitor_.header_.get());
4399 EXPECT_TRUE(CheckDecryption(
4400 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4401 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4402
4403 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4404 EXPECT_EQ(0x11u, static_cast<unsigned>(
4405 visitor_.connection_close_frame_.quic_error_code));
fkastenholz488a4622019-08-26 06:24:46 -07004406
fkastenholzb4dade72019-08-05 06:54:20 -07004407 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4408 EXPECT_EQ(0x1234u,
4409 visitor_.connection_close_frame_.transport_close_frame_type);
4410 EXPECT_EQ(17767u, visitor_.connection_close_frame_.extracted_error_code);
fkastenholz488a4622019-08-26 06:24:46 -07004411 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
fkastenholzb4dade72019-08-05 06:54:20 -07004412 } else {
fkastenholza14a7ae2019-08-07 05:21:22 -07004413 EXPECT_EQ(0x11u, visitor_.connection_close_frame_.extracted_error_code);
fkastenholz488a4622019-08-26 06:24:46 -07004414 // Error code is not prepended in GQUIC, so it is not removed and should
4415 // remain in the reason phrase.
4416 EXPECT_EQ("17767:because I can",
4417 visitor_.connection_close_frame_.error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004418 }
4419
4420 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4421
4422 CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4423}
4424
fkastenholz04bd4f32019-04-16 12:24:38 -07004425// Test the CONNECTION_CLOSE/Application variant.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004426TEST_P(QuicFramerTest, ApplicationCloseFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07004427 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004428 // This frame does not exist in versions other than 99.
4429 return;
4430 }
zhongyi546cc452019-04-12 15:27:49 -07004431 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004432
4433 // clang-format off
4434 PacketFragments packet99 = {
4435 // type (short header, 4 byte packet number)
4436 {"",
4437 {0x43}},
4438 // connection_id
4439 {"",
4440 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4441 // packet number
4442 {"",
4443 {0x12, 0x34, 0x56, 0x78}},
fkastenholz72f509b2019-04-10 09:17:49 -07004444 // frame type (IETF_CONNECTION_CLOSE/Application frame)
QUICHE teama6ef0a62019-03-07 20:34:33 -05004445 {"",
4446 {0x1d}},
4447 // error code
fkastenholz72f509b2019-04-10 09:17:49 -07004448 {"Unable to read connection close error code.",
fkastenholzd57d3f92019-07-16 09:05:17 -07004449 {kVarInt62TwoBytes + 0x00, 0x11}},
fkastenholz72f509b2019-04-10 09:17:49 -07004450 {"Unable to read connection close error details.",
QUICHE teama6ef0a62019-03-07 20:34:33 -05004451 {
4452 // error details length
4453 kVarInt62OneByte + 0x0d,
4454 // error details
4455 'b', 'e', 'c', 'a',
4456 'u', 's', 'e', ' ',
4457 'I', ' ', 'c', 'a',
4458 'n'}
4459 }
4460 };
4461 // clang-format on
4462
4463 std::unique_ptr<QuicEncryptedPacket> encrypted(
4464 AssemblePacketFromFragments(packet99));
4465 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4466
4467 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4468 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());
4474
fkastenholz72f509b2019-04-10 09:17:49 -07004475 EXPECT_EQ(IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
4476 visitor_.connection_close_frame_.close_type);
4477 EXPECT_EQ(122u, visitor_.connection_close_frame_.extracted_error_code);
fkastenholz88d08f42019-09-06 07:38:04 -07004478 EXPECT_EQ(0x11u, visitor_.connection_close_frame_.quic_error_code);
fkastenholz72f509b2019-04-10 09:17:49 -07004479 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004480
4481 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4482
fkastenholz04bd4f32019-04-16 12:24:38 -07004483 CheckFramingBoundaries(packet99, QUIC_INVALID_CONNECTION_CLOSE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004484}
4485
fkastenholzb4dade72019-08-05 06:54:20 -07004486// Check that we can extract an error code from an application close.
4487TEST_P(QuicFramerTest, ApplicationCloseFrameExtract) {
4488 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4489 // This frame does not exist in versions other than 99.
4490 return;
4491 }
4492 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4493
4494 // clang-format off
4495 PacketFragments packet99 = {
4496 // type (short header, 4 byte packet number)
4497 {"",
4498 {0x43}},
4499 // connection_id
4500 {"",
4501 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4502 // packet number
4503 {"",
4504 {0x12, 0x34, 0x56, 0x78}},
4505 // frame type (IETF_CONNECTION_CLOSE/Application frame)
4506 {"",
4507 {0x1d}},
4508 // error code
4509 {"Unable to read connection close error code.",
4510 {kVarInt62OneByte + 0x11}},
4511 {"Unable to read connection close error details.",
4512 {
4513 // error details length
4514 kVarInt62OneByte + 0x13,
4515 // error details
4516 '1', '7', '7', '6',
4517 '7', ':', 'b', 'e',
4518 'c', 'a', 'u', 's',
4519 'e', ' ', 'I', ' ',
4520 'c', 'a', 'n'}
4521 }
4522 };
4523 // clang-format on
4524
4525 std::unique_ptr<QuicEncryptedPacket> encrypted(
4526 AssemblePacketFromFragments(packet99));
4527 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4528
4529 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4530 ASSERT_TRUE(visitor_.header_.get());
4531 EXPECT_TRUE(CheckDecryption(
4532 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4533 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4534
4535 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4536
4537 EXPECT_EQ(IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
4538 visitor_.connection_close_frame_.close_type);
4539 EXPECT_EQ(17767u, visitor_.connection_close_frame_.extracted_error_code);
4540 EXPECT_EQ(0x11u, visitor_.connection_close_frame_.quic_error_code);
fkastenholz488a4622019-08-26 06:24:46 -07004541 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
fkastenholzb4dade72019-08-05 06:54:20 -07004542
4543 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4544
4545 CheckFramingBoundaries(packet99, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4546}
4547
QUICHE teama6ef0a62019-03-07 20:34:33 -05004548TEST_P(QuicFramerTest, GoAwayFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07004549 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004550 // This frame is not supported in version 99.
4551 return;
4552 }
nharper9bb83462019-05-01 10:53:22 -07004553 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004554 // clang-format off
4555 PacketFragments packet = {
4556 // public flags (8 byte connection_id)
4557 {"",
4558 {0x28}},
4559 // connection_id
4560 {"",
4561 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4562 // packet number
4563 {"",
4564 {0x12, 0x34, 0x56, 0x78}},
4565 // frame type (go away frame)
4566 {"",
4567 {0x03}},
4568 // error code
4569 {"Unable to read go away error code.",
4570 {0x00, 0x00, 0x00, 0x09}},
4571 // stream id
4572 {"Unable to read last good stream id.",
4573 {0x01, 0x02, 0x03, 0x04}},
4574 // stream id
4575 {"Unable to read goaway reason.",
4576 {
4577 // error details length
4578 0x0, 0x0d,
4579 // error details
4580 'b', 'e', 'c', 'a',
4581 'u', 's', 'e', ' ',
4582 'I', ' ', 'c', 'a',
4583 'n'}
4584 }
4585 };
4586
QUICHE teama6ef0a62019-03-07 20:34:33 -05004587 PacketFragments packet46 = {
4588 // type (short header, 4 byte packet number)
4589 {"",
4590 {0x43}},
4591 // connection_id
4592 {"",
4593 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4594 // packet number
4595 {"",
4596 {0x12, 0x34, 0x56, 0x78}},
4597 // frame type (go away frame)
4598 {"",
4599 {0x03}},
4600 // error code
4601 {"Unable to read go away error code.",
4602 {0x00, 0x00, 0x00, 0x09}},
4603 // stream id
4604 {"Unable to read last good stream id.",
4605 {0x01, 0x02, 0x03, 0x04}},
4606 // stream id
4607 {"Unable to read goaway reason.",
4608 {
4609 // error details length
4610 0x0, 0x0d,
4611 // error details
4612 'b', 'e', 'c', 'a',
4613 'u', 's', 'e', ' ',
4614 'I', ' ', 'c', 'a',
4615 'n'}
4616 }
4617 };
4618 // clang-format on
4619
4620 PacketFragments& fragments =
fayang36825da2019-08-21 14:01:27 -07004621 framer_.transport_version() >= QUIC_VERSION_46 ? packet46 : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004622 std::unique_ptr<QuicEncryptedPacket> encrypted(
4623 AssemblePacketFromFragments(fragments));
4624 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4625
4626 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4627 ASSERT_TRUE(visitor_.header_.get());
4628 EXPECT_TRUE(CheckDecryption(
4629 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4630 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4631
4632 EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id);
fkastenholz88d08f42019-09-06 07:38:04 -07004633 EXPECT_EQ(0x9u, visitor_.goaway_frame_.error_code);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004634 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase);
4635
4636 CheckFramingBoundaries(fragments, QUIC_INVALID_GOAWAY_DATA);
4637}
4638
4639TEST_P(QuicFramerTest, WindowUpdateFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07004640 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004641 // This frame is not in version 99, see MaxDataFrame and MaxStreamDataFrame
4642 // for Version 99 equivalents.
4643 return;
4644 }
nharper9bb83462019-05-01 10:53:22 -07004645 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004646 // clang-format off
4647 PacketFragments packet = {
4648 // public flags (8 byte connection_id)
4649 {"",
4650 {0x28}},
4651 // connection_id
4652 {"",
4653 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4654 // packet number
4655 {"",
4656 {0x12, 0x34, 0x56, 0x78}},
4657 // frame type (window update frame)
4658 {"",
4659 {0x04}},
4660 // stream id
4661 {"Unable to read stream_id.",
4662 {0x01, 0x02, 0x03, 0x04}},
4663 // byte offset
4664 {"Unable to read window byte_offset.",
4665 {0x3A, 0x98, 0xFE, 0xDC,
4666 0x32, 0x10, 0x76, 0x54}},
4667 };
4668
QUICHE teama6ef0a62019-03-07 20:34:33 -05004669 PacketFragments packet46 = {
4670 // type (short header, 4 byte packet number)
4671 {"",
4672 {0x43}},
4673 // connection_id
4674 {"",
4675 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4676 // packet number
4677 {"",
4678 {0x12, 0x34, 0x56, 0x78}},
4679 // frame type (window update frame)
4680 {"",
4681 {0x04}},
4682 // stream id
4683 {"Unable to read stream_id.",
4684 {0x01, 0x02, 0x03, 0x04}},
4685 // byte offset
4686 {"Unable to read window byte_offset.",
4687 {0x3A, 0x98, 0xFE, 0xDC,
4688 0x32, 0x10, 0x76, 0x54}},
4689 };
4690
4691 // clang-format on
4692
4693 PacketFragments& fragments =
fayang36825da2019-08-21 14:01:27 -07004694 framer_.transport_version() >= QUIC_VERSION_46 ? packet46 : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004695 std::unique_ptr<QuicEncryptedPacket> encrypted(
4696 AssemblePacketFromFragments(fragments));
4697 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4698
4699 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4700 ASSERT_TRUE(visitor_.header_.get());
4701 EXPECT_TRUE(CheckDecryption(
4702 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4703 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4704
4705 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
4706 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.byte_offset);
4707
4708 CheckFramingBoundaries(fragments, QUIC_INVALID_WINDOW_UPDATE_DATA);
4709}
4710
4711TEST_P(QuicFramerTest, MaxDataFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07004712 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004713 // This frame is available only in version 99.
4714 return;
4715 }
zhongyi546cc452019-04-12 15:27:49 -07004716 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004717 // clang-format off
4718 PacketFragments packet99 = {
4719 // type (short header, 4 byte packet number)
4720 {"",
4721 {0x43}},
4722 // connection_id
4723 {"",
4724 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4725 // packet number
4726 {"",
4727 {0x12, 0x34, 0x56, 0x78}},
4728 // frame type (IETF_MAX_DATA frame)
4729 {"",
4730 {0x10}},
4731 // byte offset
4732 {"Can not read MAX_DATA byte-offset",
4733 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
4734 0x32, 0x10, 0x76, 0x54}},
4735 };
4736 // clang-format on
4737
4738 std::unique_ptr<QuicEncryptedPacket> encrypted(
4739 AssemblePacketFromFragments(packet99));
4740 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4741
4742 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4743 ASSERT_TRUE(visitor_.header_.get());
4744 EXPECT_TRUE(CheckDecryption(
4745 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4746 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4747
4748 EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
4749 visitor_.window_update_frame_.stream_id);
4750 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.byte_offset);
4751
4752 CheckFramingBoundaries(packet99, QUIC_INVALID_MAX_DATA_FRAME_DATA);
4753}
4754
4755TEST_P(QuicFramerTest, MaxStreamDataFrame) {
fkastenholz305e1732019-06-18 05:01:22 -07004756 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004757 // This frame available only in version 99.
4758 return;
4759 }
zhongyi546cc452019-04-12 15:27:49 -07004760 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004761 // clang-format off
4762 PacketFragments packet99 = {
4763 // type (short header, 4 byte packet number)
4764 {"",
4765 {0x43}},
4766 // connection_id
4767 {"",
4768 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4769 // packet number
4770 {"",
4771 {0x12, 0x34, 0x56, 0x78}},
4772 // frame type (IETF_MAX_STREAM_DATA frame)
4773 {"",
4774 {0x11}},
4775 // stream id
4776 {"Can not read MAX_STREAM_DATA stream id",
4777 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4778 // byte offset
4779 {"Can not read MAX_STREAM_DATA byte-count",
4780 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
4781 0x32, 0x10, 0x76, 0x54}},
4782 };
4783 // clang-format on
4784
4785 std::unique_ptr<QuicEncryptedPacket> encrypted(
4786 AssemblePacketFromFragments(packet99));
4787 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4788
4789 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4790 ASSERT_TRUE(visitor_.header_.get());
4791 EXPECT_TRUE(CheckDecryption(
4792 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4793 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4794
4795 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
4796 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.byte_offset);
4797
4798 CheckFramingBoundaries(packet99, QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA);
4799}
4800
4801TEST_P(QuicFramerTest, BlockedFrame) {
zhongyi546cc452019-04-12 15:27:49 -07004802 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004803 // clang-format off
4804 PacketFragments packet = {
4805 // public flags (8 byte connection_id)
4806 {"",
4807 {0x28}},
4808 // connection_id
4809 {"",
4810 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4811 // packet number
4812 {"",
4813 {0x12, 0x34, 0x56, 0x78}},
4814 // frame type (blocked frame)
4815 {"",
4816 {0x05}},
4817 // stream id
4818 {"Unable to read stream_id.",
4819 {0x01, 0x02, 0x03, 0x04}},
4820 };
4821
QUICHE teama6ef0a62019-03-07 20:34:33 -05004822 PacketFragments packet46 = {
4823 // type (short header, 4 byte packet number)
4824 {"",
4825 {0x43}},
4826 // connection_id
4827 {"",
4828 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4829 // packet number
4830 {"",
4831 {0x12, 0x34, 0x56, 0x78}},
4832 // frame type (blocked frame)
4833 {"",
4834 {0x05}},
4835 // stream id
4836 {"Unable to read stream_id.",
4837 {0x01, 0x02, 0x03, 0x04}},
4838 };
4839
4840 PacketFragments packet99 = {
4841 // type (short header, 4 byte packet number)
4842 {"",
4843 {0x43}},
4844 // connection_id
4845 {"",
4846 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4847 // packet number
4848 {"",
4849 {0x12, 0x34, 0x56, 0x78}},
4850 // frame type (IETF_STREAM_BLOCKED frame)
4851 {"",
4852 {0x15}},
4853 // stream id
4854 {"Can not read stream blocked stream id.",
4855 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4856 // Offset
4857 {"Can not read stream blocked offset.",
4858 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
4859 };
4860 // clang-format on
4861
4862 PacketFragments& fragments =
fkastenholz305e1732019-06-18 05:01:22 -07004863 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05004864 ? packet99
fayang36825da2019-08-21 14:01:27 -07004865 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
4866 : packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004867 std::unique_ptr<QuicEncryptedPacket> encrypted(
4868 AssemblePacketFromFragments(fragments));
4869 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4870
4871 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4872 ASSERT_TRUE(visitor_.header_.get());
4873 EXPECT_TRUE(CheckDecryption(
4874 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4875 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4876
fkastenholz305e1732019-06-18 05:01:22 -07004877 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004878 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
4879 } else {
4880 EXPECT_EQ(0u, visitor_.blocked_frame_.offset);
4881 }
4882 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
4883
fkastenholz305e1732019-06-18 05:01:22 -07004884 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004885 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_BLOCKED_DATA);
4886 } else {
4887 CheckFramingBoundaries(fragments, QUIC_INVALID_BLOCKED_DATA);
4888 }
4889}
4890
4891TEST_P(QuicFramerTest, PingFrame) {
zhongyi546cc452019-04-12 15:27:49 -07004892 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004893 // clang-format off
4894 unsigned char packet[] = {
4895 // public flags (8 byte connection_id)
4896 0x28,
4897 // connection_id
4898 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4899 // packet number
4900 0x12, 0x34, 0x56, 0x78,
4901
4902 // frame type (ping frame)
4903 0x07,
4904 };
4905
QUICHE teama6ef0a62019-03-07 20:34:33 -05004906 unsigned char packet46[] = {
4907 // type (short header, 4 byte packet number)
4908 0x43,
4909 // connection_id
4910 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4911 // packet number
4912 0x12, 0x34, 0x56, 0x78,
4913
4914 // frame type
4915 0x07,
4916 };
4917
4918 unsigned char packet99[] = {
4919 // type (short header, 4 byte packet number)
4920 0x43,
4921 // connection_id
4922 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4923 // packet number
4924 0x12, 0x34, 0x56, 0x78,
4925
4926 // frame type (IETF_PING frame)
4927 0x01,
4928 };
4929 // clang-format on
4930
4931 QuicEncryptedPacket encrypted(
fkastenholz305e1732019-06-18 05:01:22 -07004932 AsChars(VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05004933 ? packet99
fayang36825da2019-08-21 14:01:27 -07004934 : (framer_.transport_version() >= QUIC_VERSION_46 ? packet46
4935 : packet)),
fkastenholz305e1732019-06-18 05:01:22 -07004936 VersionHasIetfQuicFrames(framer_.transport_version())
QUICHE teama6ef0a62019-03-07 20:34:33 -05004937 ? QUIC_ARRAYSIZE(packet99)
fayang36825da2019-08-21 14:01:27 -07004938 : (framer_.transport_version() >= QUIC_VERSION_46
QUICHE teama6ef0a62019-03-07 20:34:33 -05004939 ? QUIC_ARRAYSIZE(packet46)
fayang36825da2019-08-21 14:01:27 -07004940 : QUIC_ARRAYSIZE(packet)),
QUICHE teama6ef0a62019-03-07 20:34:33 -05004941 false);
4942 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4943
4944 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4945 ASSERT_TRUE(visitor_.header_.get());
4946 EXPECT_TRUE(CheckDecryption(
4947 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4948 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4949
4950 EXPECT_EQ(1u, visitor_.ping_frames_.size());
4951
4952 // No need to check the PING frame boundaries because it has no payload.
4953}
4954
4955TEST_P(QuicFramerTest, MessageFrame) {
fayang36825da2019-08-21 14:01:27 -07004956 if (framer_.transport_version() <= QUIC_VERSION_43) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004957 return;
4958 }
zhongyi546cc452019-04-12 15:27:49 -07004959 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004960 // clang-format off
QUICHE teama6ef0a62019-03-07 20:34:33 -05004961 PacketFragments packet46 = {
4962 // type (short header, 4 byte packet number)
4963 {"",
4964 {0x43}},
4965 // connection_id
4966 {"",
4967 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4968 // packet number
4969 {"",
4970 {0x12, 0x34, 0x56, 0x78}},
4971 // message frame type.
4972 {"",
4973 { 0x21 }},
4974 // message length
4975 {"Unable to read message length",
4976 {0x07}},
4977 // message data
4978 {"Unable to read message data",
4979 {'m', 'e', 's', 's', 'a', 'g', 'e'}},
4980 // message frame no length.
4981 {"",
4982 { 0x20 }},
4983 // message data
4984 {{},
4985 {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
4986 };
4987 // clang-format on
4988
fayang36825da2019-08-21 14:01:27 -07004989 std::unique_ptr<QuicEncryptedPacket> encrypted(
4990 AssemblePacketFromFragments(packet46));
QUICHE teama6ef0a62019-03-07 20:34:33 -05004991 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4992
4993 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4994 ASSERT_TRUE(visitor_.header_.get());
4995 EXPECT_TRUE(CheckDecryption(
4996 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4997 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
4998
4999 ASSERT_EQ(2u, visitor_.message_frames_.size());
5000 EXPECT_EQ(7u, visitor_.message_frames_[0]->message_length);
5001 EXPECT_EQ(8u, visitor_.message_frames_[1]->message_length);
5002
fayang36825da2019-08-21 14:01:27 -07005003 CheckFramingBoundaries(packet46, QUIC_INVALID_MESSAGE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005004}
5005
5006TEST_P(QuicFramerTest, PublicResetPacketV33) {
5007 // clang-format off
5008 PacketFragments packet = {
5009 // public flags (public reset, 8 byte connection_id)
5010 {"",
5011 {0x0A}},
5012 // connection_id
5013 {"",
5014 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5015 {"Unable to read reset message.",
5016 {
5017 // message tag (kPRST)
5018 'P', 'R', 'S', 'T',
5019 // num_entries (2) + padding
5020 0x02, 0x00, 0x00, 0x00,
5021 // tag kRNON
5022 'R', 'N', 'O', 'N',
5023 // end offset 8
5024 0x08, 0x00, 0x00, 0x00,
5025 // tag kRSEQ
5026 'R', 'S', 'E', 'Q',
5027 // end offset 16
5028 0x10, 0x00, 0x00, 0x00,
5029 // nonce proof
5030 0x89, 0x67, 0x45, 0x23,
5031 0x01, 0xEF, 0xCD, 0xAB,
5032 // rejected packet number
5033 0xBC, 0x9A, 0x78, 0x56,
5034 0x34, 0x12, 0x00, 0x00,
5035 }
5036 }
5037 };
5038 // clang-format on
5039 if (framer_.transport_version() > QUIC_VERSION_43) {
5040 return;
5041 }
5042
5043 std::unique_ptr<QuicEncryptedPacket> encrypted(
5044 AssemblePacketFromFragments(packet));
5045 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5046 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5047 ASSERT_TRUE(visitor_.public_reset_packet_.get());
5048 EXPECT_EQ(FramerTestConnectionId(),
5049 visitor_.public_reset_packet_->connection_id);
5050 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof);
5051 EXPECT_EQ(
5052 IpAddressFamily::IP_UNSPEC,
5053 visitor_.public_reset_packet_->client_address.host().address_family());
5054
5055 CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
5056}
5057
5058TEST_P(QuicFramerTest, PublicResetPacket) {
5059 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5060
5061 // clang-format off
5062 PacketFragments packet = {
5063 // public flags (public reset, 8 byte connection_id)
5064 {"",
5065 {0x0E}},
5066 // connection_id
5067 {"",
5068 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5069 {"Unable to read reset message.",
5070 {
5071 // message tag (kPRST)
5072 'P', 'R', 'S', 'T',
5073 // num_entries (2) + padding
5074 0x02, 0x00, 0x00, 0x00,
5075 // tag kRNON
5076 'R', 'N', 'O', 'N',
5077 // end offset 8
5078 0x08, 0x00, 0x00, 0x00,
5079 // tag kRSEQ
5080 'R', 'S', 'E', 'Q',
5081 // end offset 16
5082 0x10, 0x00, 0x00, 0x00,
5083 // nonce proof
5084 0x89, 0x67, 0x45, 0x23,
5085 0x01, 0xEF, 0xCD, 0xAB,
5086 // rejected packet number
5087 0xBC, 0x9A, 0x78, 0x56,
5088 0x34, 0x12, 0x00, 0x00,
5089 }
5090 }
5091 };
5092 // clang-format on
5093
5094 if (framer_.transport_version() > QUIC_VERSION_43) {
5095 return;
5096 }
5097
5098 std::unique_ptr<QuicEncryptedPacket> encrypted(
5099 AssemblePacketFromFragments(packet));
5100 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5101 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5102 ASSERT_TRUE(visitor_.public_reset_packet_.get());
5103 EXPECT_EQ(FramerTestConnectionId(),
5104 visitor_.public_reset_packet_->connection_id);
5105 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof);
5106 EXPECT_EQ(
5107 IpAddressFamily::IP_UNSPEC,
5108 visitor_.public_reset_packet_->client_address.host().address_family());
5109
5110 CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
5111}
5112
5113TEST_P(QuicFramerTest, PublicResetPacketWithTrailingJunk) {
5114 // clang-format off
5115 unsigned char packet[] = {
5116 // public flags (public reset, 8 byte connection_id)
5117 0x0A,
5118 // connection_id
5119 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5120 // message tag (kPRST)
5121 'P', 'R', 'S', 'T',
5122 // num_entries (2) + padding
5123 0x02, 0x00, 0x00, 0x00,
5124 // tag kRNON
5125 'R', 'N', 'O', 'N',
5126 // end offset 8
5127 0x08, 0x00, 0x00, 0x00,
5128 // tag kRSEQ
5129 'R', 'S', 'E', 'Q',
5130 // end offset 16
5131 0x10, 0x00, 0x00, 0x00,
5132 // nonce proof
5133 0x89, 0x67, 0x45, 0x23,
5134 0x01, 0xEF, 0xCD, 0xAB,
5135 // rejected packet number
5136 0xBC, 0x9A, 0x78, 0x56,
5137 0x34, 0x12, 0x00, 0x00,
5138 // trailing junk
5139 'j', 'u', 'n', 'k',
5140 };
5141 // clang-format on
5142 if (framer_.transport_version() > QUIC_VERSION_43) {
5143 return;
5144 }
5145
5146 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5147 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5148 ASSERT_EQ(QUIC_INVALID_PUBLIC_RST_PACKET, framer_.error());
5149 EXPECT_EQ("Unable to read reset message.", framer_.detailed_error());
5150}
5151
5152TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) {
5153 // clang-format off
5154 PacketFragments packet = {
5155 // public flags (public reset, 8 byte connection_id)
5156 {"",
5157 {0x0A}},
5158 // connection_id
5159 {"",
5160 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5161 {"Unable to read reset message.",
5162 {
5163 // message tag (kPRST)
5164 'P', 'R', 'S', 'T',
5165 // num_entries (2) + padding
5166 0x03, 0x00, 0x00, 0x00,
5167 // tag kRNON
5168 'R', 'N', 'O', 'N',
5169 // end offset 8
5170 0x08, 0x00, 0x00, 0x00,
5171 // tag kRSEQ
5172 'R', 'S', 'E', 'Q',
5173 // end offset 16
5174 0x10, 0x00, 0x00, 0x00,
5175 // tag kCADR
5176 'C', 'A', 'D', 'R',
5177 // end offset 24
5178 0x18, 0x00, 0x00, 0x00,
5179 // nonce proof
5180 0x89, 0x67, 0x45, 0x23,
5181 0x01, 0xEF, 0xCD, 0xAB,
5182 // rejected packet number
5183 0xBC, 0x9A, 0x78, 0x56,
5184 0x34, 0x12, 0x00, 0x00,
5185 // client address: 4.31.198.44:443
5186 0x02, 0x00,
5187 0x04, 0x1F, 0xC6, 0x2C,
5188 0xBB, 0x01,
5189 }
5190 }
5191 };
5192 // clang-format on
5193 if (framer_.transport_version() > QUIC_VERSION_43) {
5194 return;
5195 }
5196
5197 std::unique_ptr<QuicEncryptedPacket> encrypted(
5198 AssemblePacketFromFragments(packet));
5199 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5200 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5201 ASSERT_TRUE(visitor_.public_reset_packet_.get());
5202 EXPECT_EQ(FramerTestConnectionId(),
5203 visitor_.public_reset_packet_->connection_id);
5204 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof);
5205 EXPECT_EQ("4.31.198.44",
5206 visitor_.public_reset_packet_->client_address.host().ToString());
5207 EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port());
5208
5209 CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
5210}
5211
5212TEST_P(QuicFramerTest, IetfStatelessResetPacket) {
5213 // clang-format off
5214 unsigned char packet[] = {
5215 // type (short packet, 1 byte packet number)
5216 0x50,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005217 // Random bytes
5218 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5219 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5220 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5221 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5222 // stateless reset token
5223 0xB5, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
5224 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5225 };
5226 // clang-format on
5227 if (framer_.transport_version() <= QUIC_VERSION_43) {
5228 return;
5229 }
5230 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
dschinazib953d022019-08-01 18:05:58 -07005231 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
5232 TestConnectionId(0x33));
QUICHE teama6ef0a62019-03-07 20:34:33 -05005233 decrypter_ = new test::TestDecrypter();
zhongyi546cc452019-04-12 15:27:49 -07005234 if (framer_.version().KnowsWhichDecrypterToUse()) {
vasilvv0fc587f2019-09-06 13:33:08 -07005235 framer_.InstallDecrypter(
5236 ENCRYPTION_INITIAL,
5237 std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07005238 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
5239 std::unique_ptr<QuicDecrypter>(decrypter_));
5240 } else {
vasilvv0fc587f2019-09-06 13:33:08 -07005241 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
5242 Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07005243 framer_.SetAlternativeDecrypter(
5244 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
5245 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005246 // This packet cannot be decrypted because diversification nonce is missing.
5247 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5248 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5249 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5250 ASSERT_TRUE(visitor_.stateless_reset_packet_.get());
5251 EXPECT_EQ(kTestStatelessResetToken,
5252 visitor_.stateless_reset_packet_->stateless_reset_token);
5253}
5254
5255TEST_P(QuicFramerTest, IetfStatelessResetPacketInvalidStatelessResetToken) {
5256 // clang-format off
5257 unsigned char packet[] = {
5258 // type (short packet, 1 byte packet number)
5259 0x50,
dschinazib953d022019-08-01 18:05:58 -07005260 // Random bytes
5261 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5262 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5263 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5264 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005265 // stateless reset token
5266 0xB6, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
5267 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5268 };
5269 // clang-format on
5270 if (framer_.transport_version() <= QUIC_VERSION_43) {
5271 return;
5272 }
dschinazib953d022019-08-01 18:05:58 -07005273 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
5274 TestConnectionId(0x33));
QUICHE teama6ef0a62019-03-07 20:34:33 -05005275 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005276 decrypter_ = new test::TestDecrypter();
zhongyi546cc452019-04-12 15:27:49 -07005277 if (framer_.version().KnowsWhichDecrypterToUse()) {
vasilvv0fc587f2019-09-06 13:33:08 -07005278 framer_.InstallDecrypter(
5279 ENCRYPTION_INITIAL,
5280 std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07005281 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
5282 std::unique_ptr<QuicDecrypter>(decrypter_));
5283 } else {
vasilvv0fc587f2019-09-06 13:33:08 -07005284 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
5285 Perspective::IS_CLIENT));
zhongyi546cc452019-04-12 15:27:49 -07005286 framer_.SetAlternativeDecrypter(
5287 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
5288 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005289 // This packet cannot be decrypted because diversification nonce is missing.
5290 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5291 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5292 EXPECT_EQ(QUIC_DECRYPTION_FAILURE, framer_.error());
5293 ASSERT_FALSE(visitor_.stateless_reset_packet_);
5294}
5295
dschinazi072da7c2019-05-07 17:57:42 -07005296TEST_P(QuicFramerTest, VersionNegotiationPacketClient) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005297 // clang-format off
5298 PacketFragments packet = {
5299 // public flags (version, 8 byte connection_id)
5300 {"",
5301 {0x29}},
5302 // connection_id
5303 {"",
5304 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5305 // version tag
5306 {"Unable to read supported version in negotiation.",
5307 {QUIC_VERSION_BYTES,
5308 'Q', '2', '.', '0'}},
5309 };
5310
fayang36825da2019-08-21 14:01:27 -07005311 PacketFragments packet46 = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005312 // type (long header)
5313 {"",
5314 {0x8F}},
5315 // version tag
5316 {"",
5317 {0x00, 0x00, 0x00, 0x00}},
5318 {"",
5319 {0x05}},
5320 // connection_id
5321 {"",
5322 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5323 // Supported versions
5324 {"Unable to read supported version in negotiation.",
5325 {QUIC_VERSION_BYTES,
5326 'Q', '2', '.', '0'}},
5327 };
dschinazi48ac9192019-07-31 00:07:26 -07005328
5329 PacketFragments packet99 = {
5330 // type (long header)
5331 {"",
5332 {0x8F}},
5333 // version tag
5334 {"",
5335 {0x00, 0x00, 0x00, 0x00}},
5336 {"",
5337 {0x08}},
5338 // connection_id
5339 {"",
5340 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5341 {"",
5342 {0x00}},
5343 // Supported versions
5344 {"Unable to read supported version in negotiation.",
5345 {QUIC_VERSION_BYTES,
5346 'Q', '2', '.', '0'}},
5347 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05005348 // clang-format on
5349
5350 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5351
5352 PacketFragments& fragments =
dschinazi48ac9192019-07-31 00:07:26 -07005353 framer_.transport_version() >= QUIC_VERSION_99
5354 ? packet99
fayang36825da2019-08-21 14:01:27 -07005355 : framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -05005356 std::unique_ptr<QuicEncryptedPacket> encrypted(
5357 AssemblePacketFromFragments(fragments));
5358 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5359 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5360 ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
nharper4fd11052019-06-04 14:23:22 -07005361 EXPECT_EQ(1u, visitor_.version_negotiation_packet_->versions.size());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005362 EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]);
5363
5364 // Remove the last version from the packet so that every truncated
5365 // version of the packet is invalid, otherwise checking boundaries
5366 // is annoyingly complicated.
5367 for (size_t i = 0; i < 4; ++i) {
5368 fragments.back().fragment.pop_back();
5369 }
5370 CheckFramingBoundaries(fragments, QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
5371}
5372
dschinazi072da7c2019-05-07 17:57:42 -07005373TEST_P(QuicFramerTest, VersionNegotiationPacketServer) {
fayang36825da2019-08-21 14:01:27 -07005374 if (framer_.transport_version() <= QUIC_VERSION_43) {
dschinazi072da7c2019-05-07 17:57:42 -07005375 return;
5376 }
5377
5378 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
5379 // clang-format off
5380 unsigned char packet[] = {
5381 // public flags (long header with all ignored bits set)
5382 0xFF,
5383 // version
5384 0x00, 0x00, 0x00, 0x00,
5385 // connection ID lengths
5386 0x50,
5387 // destination connection ID
5388 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5389 // supported versions
5390 QUIC_VERSION_BYTES,
5391 'Q', '2', '.', '0',
5392 };
dschinazi48ac9192019-07-31 00:07:26 -07005393 unsigned char packet2[] = {
5394 // public flags (long header with all ignored bits set)
5395 0xFF,
5396 // version
5397 0x00, 0x00, 0x00, 0x00,
5398 // destination connection ID length
5399 0x08,
5400 // destination connection ID
5401 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5402 // source connection ID length
5403 0x00,
5404 // supported versions
5405 QUIC_VERSION_BYTES,
5406 'Q', '2', '.', '0',
5407 };
dschinazi072da7c2019-05-07 17:57:42 -07005408 // clang-format on
dschinazi48ac9192019-07-31 00:07:26 -07005409 unsigned char* p = packet;
5410 size_t p_length = QUIC_ARRAYSIZE(packet);
5411 if (framer_.version().HasLengthPrefixedConnectionIds()) {
5412 p = packet2;
5413 p_length = QUIC_ARRAYSIZE(packet2);
5414 }
dschinazi072da7c2019-05-07 17:57:42 -07005415
dschinazi48ac9192019-07-31 00:07:26 -07005416 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
dschinazi072da7c2019-05-07 17:57:42 -07005417 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5418 EXPECT_EQ(QUIC_INVALID_VERSION_NEGOTIATION_PACKET, framer_.error());
5419 EXPECT_EQ("Server received version negotiation packet.",
5420 framer_.detailed_error());
5421 EXPECT_FALSE(visitor_.version_negotiation_packet_.get());
5422}
5423
QUICHE teama6ef0a62019-03-07 20:34:33 -05005424TEST_P(QuicFramerTest, OldVersionNegotiationPacket) {
5425 // clang-format off
5426 PacketFragments packet = {
5427 // public flags (version, 8 byte connection_id)
5428 {"",
5429 {0x2D}},
5430 // connection_id
5431 {"",
5432 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5433 // version tag
5434 {"Unable to read supported version in negotiation.",
5435 {QUIC_VERSION_BYTES,
5436 'Q', '2', '.', '0'}},
5437 };
5438 // clang-format on
5439
5440 if (framer_.transport_version() > QUIC_VERSION_43) {
5441 return;
5442 }
5443
5444 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5445
5446 std::unique_ptr<QuicEncryptedPacket> encrypted(
5447 AssemblePacketFromFragments(packet));
5448 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5449 ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
5450 ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
nharper4fd11052019-06-04 14:23:22 -07005451 EXPECT_EQ(1u, visitor_.version_negotiation_packet_->versions.size());
QUICHE teama6ef0a62019-03-07 20:34:33 -05005452 EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]);
5453
5454 // Remove the last version from the packet so that every truncated
5455 // version of the packet is invalid, otherwise checking boundaries
5456 // is annoyingly complicated.
5457 for (size_t i = 0; i < 4; ++i) {
5458 packet.back().fragment.pop_back();
5459 }
5460 CheckFramingBoundaries(packet, QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
5461}
5462
dschinazi244f6dc2019-05-06 15:45:16 -07005463TEST_P(QuicFramerTest, ParseIetfRetryPacket) {
5464 if (!framer_.version().SupportsRetry()) {
5465 return;
5466 }
5467 // IETF RETRY is only sent from client to server.
5468 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5469 // clang-format off
5470 unsigned char packet[] = {
5471 // public flags (long header with packet type RETRY and ODCIL=8)
5472 0xF5,
5473 // version
5474 QUIC_VERSION_BYTES,
5475 // connection ID lengths
5476 0x05,
5477 // source connection ID
5478 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5479 // original destination connection ID
5480 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5481 // retry token
5482 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5483 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5484 };
dschinazi48ac9192019-07-31 00:07:26 -07005485 unsigned char packet99[] = {
5486 // public flags (long header with packet type RETRY)
5487 0xF0,
5488 // version
5489 QUIC_VERSION_BYTES,
5490 // destination connection ID length
5491 0x00,
5492 // source connection ID length
5493 0x08,
5494 // source connection ID
5495 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5496 // original destination connection ID length
5497 0x08,
5498 // original destination connection ID
5499 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5500 // retry token
5501 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5502 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5503 };
dschinazi244f6dc2019-05-06 15:45:16 -07005504 // clang-format on
5505
dschinazi48ac9192019-07-31 00:07:26 -07005506 unsigned char* p = packet;
5507 size_t p_length = QUIC_ARRAYSIZE(packet);
5508 if (framer_.transport_version() == QUIC_VERSION_99) {
5509 p = packet99;
5510 p_length = QUIC_ARRAYSIZE(packet99);
5511 }
5512 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
dschinazi244f6dc2019-05-06 15:45:16 -07005513 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5514
5515 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
5516 ASSERT_TRUE(visitor_.header_.get());
5517
5518 ASSERT_TRUE(visitor_.retry_original_connection_id_.get());
5519 ASSERT_TRUE(visitor_.retry_new_connection_id_.get());
5520 ASSERT_TRUE(visitor_.retry_token_.get());
5521
5522 EXPECT_EQ(FramerTestConnectionId(),
5523 *visitor_.retry_original_connection_id_.get());
5524 EXPECT_EQ(FramerTestConnectionIdPlusOne(),
5525 *visitor_.retry_new_connection_id_.get());
5526 EXPECT_EQ("Hello this is RETRY!", *visitor_.retry_token_.get());
5527}
5528
5529TEST_P(QuicFramerTest, RejectIetfRetryPacketAsServer) {
5530 if (!framer_.version().SupportsRetry()) {
5531 return;
5532 }
5533 // IETF RETRY is only sent from client to server.
5534 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
5535 // clang-format off
5536 unsigned char packet[] = {
5537 // public flags (long header with packet type RETRY and ODCIL=8)
5538 0xF5,
5539 // version
5540 QUIC_VERSION_BYTES,
5541 // connection ID lengths
dschinazi48ac9192019-07-31 00:07:26 -07005542 0x00, 0x08,
dschinazi244f6dc2019-05-06 15:45:16 -07005543 // source connection ID
5544 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5545 // original destination connection ID
5546 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5547 // retry token
5548 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5549 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5550 };
5551 // clang-format on
5552
5553 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
5554 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5555
5556 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
5557 EXPECT_EQ("Client-initiated RETRY is invalid.", framer_.detailed_error());
5558}
5559
QUICHE teama6ef0a62019-03-07 20:34:33 -05005560TEST_P(QuicFramerTest, BuildPaddingFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04005561 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005562 QuicPacketHeader header;
5563 header.destination_connection_id = FramerTestConnectionId();
5564 header.reset_flag = false;
5565 header.version_flag = false;
5566 header.packet_number = kPacketNumber;
5567
5568 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5569
5570 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07005571 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005572 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04005573 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005574 // connection_id
5575 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5576 // packet number
5577 0x12, 0x34, 0x56, 0x78,
5578
5579 // frame type (padding frame)
5580 0x00,
5581 0x00, 0x00, 0x00, 0x00
5582 };
5583
dschinazi66dea072019-04-09 11:41:06 -07005584 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005585 // type (short header, 4 byte packet number)
5586 0x43,
5587 // connection_id
5588 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5589 // packet number
5590 0x12, 0x34, 0x56, 0x78,
5591
5592 // frame type (padding frame)
5593 0x00,
5594 0x00, 0x00, 0x00, 0x00
5595 };
5596
dschinazi66dea072019-04-09 11:41:06 -07005597 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005598 // type (short header, 4 byte packet number)
5599 0x43,
5600 // connection_id
5601 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5602 // packet number
5603 0x12, 0x34, 0x56, 0x78,
5604
5605 // frame type (padding frame)
5606 0x00,
5607 0x00, 0x00, 0x00, 0x00
5608 };
5609 // clang-format on
5610
5611 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07005612 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005613 p = packet99;
fayang36825da2019-08-21 14:01:27 -07005614 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fayang374888f2019-05-31 06:47:21 -07005615 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05005616 }
5617
5618 uint64_t header_size = GetPacketHeaderSize(
5619 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
5620 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
5621 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
5622 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07005623 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005624
5625 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5626 ASSERT_TRUE(data != nullptr);
5627
5628 test::CompareCharArraysWithHexError(
5629 "constructed packet", data->data(), data->length(), AsChars(p),
fayang36825da2019-08-21 14:01:27 -07005630 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46)
QUICHE teama6ef0a62019-03-07 20:34:33 -05005631 : QUIC_ARRAYSIZE(packet));
5632}
5633
5634TEST_P(QuicFramerTest, BuildStreamFramePacketWithNewPaddingFrame) {
QUICHE team2252b702019-05-14 23:55:14 -04005635 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005636 QuicPacketHeader header;
5637 header.destination_connection_id = FramerTestConnectionId();
5638 header.reset_flag = false;
5639 header.version_flag = false;
5640 header.packet_number = kPacketNumber;
5641 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
5642 QuicStringPiece("hello world!"));
5643 QuicPaddingFrame padding_frame(2);
5644 QuicFrames frames = {QuicFrame(padding_frame), QuicFrame(stream_frame),
5645 QuicFrame(padding_frame)};
5646
5647 // clang-format off
5648 unsigned char packet[] = {
5649 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04005650 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005651 // connection_id
5652 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5653 // packet number
5654 0x12, 0x34, 0x56, 0x78,
5655
5656 // paddings
5657 0x00, 0x00,
5658 // frame type (stream frame with fin)
5659 0xFF,
5660 // stream id
5661 0x01, 0x02, 0x03, 0x04,
5662 // offset
5663 0x3A, 0x98, 0xFE, 0xDC,
5664 0x32, 0x10, 0x76, 0x54,
5665 // data length
5666 0x00, 0x0c,
5667 // data
5668 'h', 'e', 'l', 'l',
5669 'o', ' ', 'w', 'o',
5670 'r', 'l', 'd', '!',
5671 // paddings
5672 0x00, 0x00,
5673 };
5674
QUICHE teama6ef0a62019-03-07 20:34:33 -05005675 unsigned char packet46[] = {
5676 // type (short header, 4 byte packet number)
5677 0x43,
5678 // connection_id
5679 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5680 // packet number
5681 0x12, 0x34, 0x56, 0x78,
5682
5683 // paddings
5684 0x00, 0x00,
5685 // frame type (stream frame with fin)
5686 0xFF,
5687 // stream id
5688 0x01, 0x02, 0x03, 0x04,
5689 // offset
5690 0x3A, 0x98, 0xFE, 0xDC,
5691 0x32, 0x10, 0x76, 0x54,
5692 // data length
5693 0x00, 0x0c,
5694 // data
5695 'h', 'e', 'l', 'l',
5696 'o', ' ', 'w', 'o',
5697 'r', 'l', 'd', '!',
5698 // paddings
5699 0x00, 0x00,
5700 };
5701
5702 unsigned char packet99[] = {
5703 // type (short header, 4 byte packet number)
5704 0x43,
5705 // connection_id
5706 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5707 // packet number
5708 0x12, 0x34, 0x56, 0x78,
5709
5710 // paddings
5711 0x00, 0x00,
5712 // frame type (IETF_STREAM with FIN, LEN, and OFFSET bits set)
5713 0x08 | 0x01 | 0x02 | 0x04,
5714 // stream id
5715 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
5716 // offset
5717 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5718 0x32, 0x10, 0x76, 0x54,
5719 // data length
5720 kVarInt62OneByte + 0x0c,
5721 // data
5722 'h', 'e', 'l', 'l',
5723 'o', ' ', 'w', 'o',
5724 'r', 'l', 'd', '!',
5725 // paddings
5726 0x00, 0x00,
5727 };
5728 // clang-format on
5729
5730 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5731 ASSERT_TRUE(data != nullptr);
5732
5733 unsigned char* p = packet;
5734 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07005735 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005736 p = packet99;
5737 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07005738 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005739 p = packet46;
5740 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005741 }
5742 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
5743
5744 test::CompareCharArraysWithHexError("constructed packet", data->data(),
5745 data->length(), AsChars(p), p_size);
5746}
5747
5748TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04005749 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005750 QuicPacketHeader header;
5751 header.destination_connection_id = FramerTestConnectionId();
5752 header.reset_flag = false;
5753 header.version_flag = false;
5754 header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
5755 header.packet_number = kPacketNumber;
5756
5757 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5758
5759 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07005760 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005761 // public flags (8 byte connection_id and 4 byte packet number)
QUICHE team2252b702019-05-14 23:55:14 -04005762 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005763 // connection_id
5764 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5765 // packet number
5766 0x12, 0x34, 0x56, 0x78,
5767
5768 // frame type (padding frame)
5769 0x00,
5770 0x00, 0x00, 0x00, 0x00
5771 };
5772
dschinazi66dea072019-04-09 11:41:06 -07005773 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005774 // type (short header, 4 byte packet number)
5775 0x43,
5776 // connection_id
5777 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5778 // packet number
5779 0x12, 0x34, 0x56, 0x78,
5780
5781 // frame type (padding frame)
5782 0x00,
5783 0x00, 0x00, 0x00, 0x00
5784 };
5785
dschinazi66dea072019-04-09 11:41:06 -07005786 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005787 // type (short header, 4 byte packet number)
5788 0x43,
5789 // connection_id
5790 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5791 // packet number
5792 0x12, 0x34, 0x56, 0x78,
5793
5794 // frame type (padding frame)
5795 0x00,
5796 0x00, 0x00, 0x00, 0x00
5797 };
5798 // clang-format on
5799
5800 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07005801 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005802 p = packet99;
fayang36825da2019-08-21 14:01:27 -07005803 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fayang374888f2019-05-31 06:47:21 -07005804 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05005805 }
5806
5807 uint64_t header_size = GetPacketHeaderSize(
5808 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
5809 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
5810 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
5811 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07005812 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005813
5814 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5815 ASSERT_TRUE(data != nullptr);
5816
5817 test::CompareCharArraysWithHexError(
5818 "constructed packet", data->data(), data->length(), AsChars(p),
fayang36825da2019-08-21 14:01:27 -07005819 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46)
QUICHE teama6ef0a62019-03-07 20:34:33 -05005820 : QUIC_ARRAYSIZE(packet));
5821}
5822
5823TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04005824 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005825 QuicPacketHeader header;
5826 header.destination_connection_id = FramerTestConnectionId();
5827 header.reset_flag = false;
5828 header.version_flag = false;
5829 header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
5830 header.packet_number = kPacketNumber;
5831
5832 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5833
5834 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07005835 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005836 // public flags (8 byte connection_id and 2 byte packet number)
QUICHE team2252b702019-05-14 23:55:14 -04005837 0x1C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005838 // connection_id
5839 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5840 // packet number
5841 0x56, 0x78,
5842
5843 // frame type (padding frame)
5844 0x00,
5845 0x00, 0x00, 0x00, 0x00
5846 };
5847
dschinazi66dea072019-04-09 11:41:06 -07005848 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005849 // type (short header, 2 byte packet number)
5850 0x41,
5851 // connection_id
5852 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5853 // packet number
5854 0x56, 0x78,
5855
5856 // frame type (padding frame)
5857 0x00,
5858 0x00, 0x00, 0x00, 0x00
5859 };
5860
dschinazi66dea072019-04-09 11:41:06 -07005861 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005862 // type (short header, 2 byte packet number)
5863 0x41,
5864 // connection_id
5865 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5866 // packet number
5867 0x56, 0x78,
5868
5869 // frame type (padding frame)
5870 0x00,
5871 0x00, 0x00, 0x00, 0x00
5872 };
5873 // clang-format on
5874
5875 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07005876 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005877 p = packet99;
fayang36825da2019-08-21 14:01:27 -07005878 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fayang374888f2019-05-31 06:47:21 -07005879 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05005880 }
5881
5882 uint64_t header_size = GetPacketHeaderSize(
5883 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
5884 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
5885 !kIncludeDiversificationNonce, PACKET_2BYTE_PACKET_NUMBER,
5886 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07005887 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005888
5889 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5890 ASSERT_TRUE(data != nullptr);
5891
5892 test::CompareCharArraysWithHexError(
5893 "constructed packet", data->data(), data->length(), AsChars(p),
fayang36825da2019-08-21 14:01:27 -07005894 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46)
QUICHE teama6ef0a62019-03-07 20:34:33 -05005895 : QUIC_ARRAYSIZE(packet));
5896}
5897
5898TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04005899 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005900 QuicPacketHeader header;
5901 header.destination_connection_id = FramerTestConnectionId();
5902 header.reset_flag = false;
5903 header.version_flag = false;
5904 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
5905 header.packet_number = kPacketNumber;
5906
5907 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5908
5909 // clang-format off
dschinazi66dea072019-04-09 11:41:06 -07005910 unsigned char packet[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005911 // public flags (8 byte connection_id and 1 byte packet number)
QUICHE team2252b702019-05-14 23:55:14 -04005912 0x0C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005913 // connection_id
5914 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5915 // packet number
5916 0x78,
5917
5918 // frame type (padding frame)
5919 0x00,
5920 0x00, 0x00, 0x00, 0x00
5921 };
5922
dschinazi66dea072019-04-09 11:41:06 -07005923 unsigned char packet46[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005924 // type (short header, 1 byte packet number)
5925 0x40,
5926 // connection_id
5927 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5928 // packet number
5929 0x78,
5930
5931 // frame type (padding frame)
5932 0x00,
5933 0x00, 0x00, 0x00, 0x00
5934 };
5935
dschinazi66dea072019-04-09 11:41:06 -07005936 unsigned char packet99[kMaxOutgoingPacketSize] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005937 // type (short header, 1 byte packet number)
5938 0x40,
5939 // connection_id
5940 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5941 // packet number
5942 0x78,
5943
5944 // frame type (padding frame)
5945 0x00,
5946 0x00, 0x00, 0x00, 0x00
5947 };
5948 // clang-format on
5949
5950 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07005951 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005952 p = packet99;
fayang36825da2019-08-21 14:01:27 -07005953 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fayang374888f2019-05-31 06:47:21 -07005954 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05005955 }
5956
5957 uint64_t header_size = GetPacketHeaderSize(
5958 framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
5959 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
5960 !kIncludeDiversificationNonce, PACKET_1BYTE_PACKET_NUMBER,
5961 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
dschinazi66dea072019-04-09 11:41:06 -07005962 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005963
5964 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5965 ASSERT_TRUE(data != nullptr);
5966
5967 test::CompareCharArraysWithHexError(
5968 "constructed packet", data->data(), data->length(), AsChars(p),
fayang36825da2019-08-21 14:01:27 -07005969 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46)
QUICHE teama6ef0a62019-03-07 20:34:33 -05005970 : QUIC_ARRAYSIZE(packet));
5971}
5972
5973TEST_P(QuicFramerTest, BuildStreamFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04005974 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005975 QuicPacketHeader header;
5976 header.destination_connection_id = FramerTestConnectionId();
5977 header.reset_flag = false;
5978 header.version_flag = false;
5979 header.packet_number = kPacketNumber;
5980 if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
5981 header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
5982 }
5983
5984 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
5985 QuicStringPiece("hello world!"));
5986
5987 QuicFrames frames = {QuicFrame(stream_frame)};
5988
5989 // clang-format off
5990 unsigned char packet[] = {
5991 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04005992 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005993 // connection_id
5994 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5995 // packet number
5996 0x12, 0x34, 0x56, 0x78,
5997
5998 // frame type (stream frame with fin and no length)
5999 0xDF,
6000 // stream id
6001 0x01, 0x02, 0x03, 0x04,
6002 // offset
6003 0x3A, 0x98, 0xFE, 0xDC,
6004 0x32, 0x10, 0x76, 0x54,
6005 // data
6006 'h', 'e', 'l', 'l',
6007 'o', ' ', 'w', 'o',
6008 'r', 'l', 'd', '!',
6009 };
6010
QUICHE teama6ef0a62019-03-07 20:34:33 -05006011 unsigned char packet46[] = {
6012 // type (short header, 4 byte packet number)
6013 0x43,
6014 // connection_id
6015 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6016 // packet number
6017 0x12, 0x34, 0x56, 0x78,
6018
6019 // frame type (stream frame with fin and no length)
6020 0xDF,
6021 // stream id
6022 0x01, 0x02, 0x03, 0x04,
6023 // offset
6024 0x3A, 0x98, 0xFE, 0xDC,
6025 0x32, 0x10, 0x76, 0x54,
6026 // data
6027 'h', 'e', 'l', 'l',
6028 'o', ' ', 'w', 'o',
6029 'r', 'l', 'd', '!',
6030 };
6031
6032 unsigned char packet99[] = {
6033 // type (short header, 4 byte packet number)
6034 0x43,
6035 // connection_id
6036 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6037 // packet number
6038 0x12, 0x34, 0x56, 0x78,
6039
6040 // frame type (IETF_STREAM frame with FIN and OFFSET, no length)
6041 0x08 | 0x01 | 0x04,
6042 // stream id
6043 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
6044 // offset
6045 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6046 0x32, 0x10, 0x76, 0x54,
6047 // data
6048 'h', 'e', 'l', 'l',
6049 'o', ' ', 'w', 'o',
6050 'r', 'l', 'd', '!',
6051 };
6052 // clang-format on
6053
6054 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6055 ASSERT_TRUE(data != nullptr);
6056
6057 unsigned char* p = packet;
6058 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07006059 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006060 p = packet99;
6061 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07006062 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006063 p = packet46;
6064 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006065 }
6066 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6067 data->length(), AsChars(p), p_size);
6068}
6069
6070TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) {
6071 QuicPacketHeader header;
6072 header.destination_connection_id = FramerTestConnectionId();
6073 header.reset_flag = false;
6074 header.version_flag = true;
6075 if (framer_.transport_version() > QUIC_VERSION_43) {
6076 header.long_packet_type = ZERO_RTT_PROTECTED;
6077 }
6078 header.packet_number = kPacketNumber;
6079 if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
6080 header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
6081 }
6082
6083 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
6084 QuicStringPiece("hello world!"));
6085 QuicFrames frames = {QuicFrame(stream_frame)};
6086
6087 // clang-format off
6088 unsigned char packet[] = {
6089 // public flags (version, 8 byte connection_id)
6090 0x2D,
6091 // connection_id
6092 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6093 // version tag
6094 QUIC_VERSION_BYTES,
6095 // packet number
6096 0x12, 0x34, 0x56, 0x78,
6097
6098 // frame type (stream frame with fin and no length)
6099 0xDF,
6100 // stream id
6101 0x01, 0x02, 0x03, 0x04,
6102 // offset
6103 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6104 // data
6105 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6106 };
6107
QUICHE teama6ef0a62019-03-07 20:34:33 -05006108 unsigned char packet46[] = {
6109 // type (long header with packet type ZERO_RTT_PROTECTED)
6110 0xD3,
6111 // version tag
6112 QUIC_VERSION_BYTES,
6113 // connection_id length
6114 0x50,
6115 // connection_id
6116 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6117 // packet number
6118 0x12, 0x34, 0x56, 0x78,
6119
6120 // frame type (stream frame with fin and no length)
6121 0xDF,
6122 // stream id
6123 0x01, 0x02, 0x03, 0x04,
6124 // offset
6125 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6126 // data
6127 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6128 };
6129
6130 unsigned char packet99[] = {
6131 // type (long header with packet type ZERO_RTT_PROTECTED)
6132 0xD3,
6133 // version tag
6134 QUIC_VERSION_BYTES,
dschinazi48ac9192019-07-31 00:07:26 -07006135 // destination connection ID length
6136 0x08,
6137 // destination connection ID
QUICHE teama6ef0a62019-03-07 20:34:33 -05006138 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -07006139 // source connection ID length
6140 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006141 // length
6142 0x40, 0x1D,
6143 // packet number
6144 0x12, 0x34, 0x56, 0x78,
6145
6146 // frame type (IETF_STREAM frame with fin and offset, no length)
6147 0x08 | 0x01 | 0x04,
6148 // stream id
6149 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
6150 // offset
6151 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
6152 // data
6153 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
6154 };
6155 // clang-format on
6156
6157 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6158 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6159 ASSERT_TRUE(data != nullptr);
6160
6161 unsigned char* p = packet;
6162 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07006163 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006164 p = packet99;
6165 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07006166 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006167 p = packet46;
6168 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006169 }
6170 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6171 data->length(), AsChars(p), p_size);
6172}
6173
6174TEST_P(QuicFramerTest, BuildCryptoFramePacket) {
fkastenholzceae8372019-06-12 12:22:22 -07006175 if (!QuicVersionUsesCryptoFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006176 return;
6177 }
QUICHE team2252b702019-05-14 23:55:14 -04006178 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006179 QuicPacketHeader header;
6180 header.destination_connection_id = FramerTestConnectionId();
6181 header.reset_flag = false;
6182 header.version_flag = false;
6183 header.packet_number = kPacketNumber;
6184
6185 SimpleDataProducer data_producer;
6186 framer_.set_data_producer(&data_producer);
6187
6188 QuicStringPiece crypto_frame_contents("hello world!");
QUICHE team6987b4a2019-03-15 16:23:04 -07006189 QuicCryptoFrame crypto_frame(ENCRYPTION_INITIAL, kStreamOffset,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006190 crypto_frame_contents.length());
QUICHE team6987b4a2019-03-15 16:23:04 -07006191 data_producer.SaveCryptoData(ENCRYPTION_INITIAL, kStreamOffset,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006192 crypto_frame_contents);
6193
6194 QuicFrames frames = {QuicFrame(&crypto_frame)};
6195
6196 // clang-format off
nharper107ba5f2019-07-02 21:33:39 -07006197 unsigned char packet48[] = {
6198 // type (short header, 4 byte packet number)
6199 0x43,
6200 // connection_id
6201 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6202 // packet number
6203 0x12, 0x34, 0x56, 0x78,
6204
6205 // frame type (QuicFrameType CRYPTO_FRAME)
6206 0x08,
6207 // offset
6208 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6209 0x32, 0x10, 0x76, 0x54,
6210 // length
6211 kVarInt62OneByte + 12,
6212 // data
6213 'h', 'e', 'l', 'l',
6214 'o', ' ', 'w', 'o',
6215 'r', 'l', 'd', '!',
6216 };
6217
6218 unsigned char packet99[] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006219 // type (short header, 4 byte packet number)
6220 0x43,
6221 // connection_id
6222 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6223 // packet number
6224 0x12, 0x34, 0x56, 0x78,
6225
6226 // frame type (IETF_CRYPTO frame)
6227 0x06,
6228 // offset
6229 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6230 0x32, 0x10, 0x76, 0x54,
6231 // length
6232 kVarInt62OneByte + 12,
6233 // data
6234 'h', 'e', 'l', 'l',
6235 'o', ' ', 'w', 'o',
6236 'r', 'l', 'd', '!',
6237 };
6238 // clang-format on
6239
nharper107ba5f2019-07-02 21:33:39 -07006240 unsigned char* packet = packet48;
6241 size_t packet_size = QUIC_ARRAYSIZE(packet48);
6242 if (framer_.transport_version() == QUIC_VERSION_99) {
6243 packet = packet99;
6244 packet_size = QUIC_ARRAYSIZE(packet99);
6245 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05006246
6247 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6248 ASSERT_TRUE(data != nullptr);
6249 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6250 data->length(), AsChars(packet),
6251 packet_size);
6252}
6253
6254TEST_P(QuicFramerTest, CryptoFrame) {
nharper107ba5f2019-07-02 21:33:39 -07006255 if (framer_.transport_version() < QUIC_VERSION_48) {
6256 // CRYPTO frames aren't supported prior to v48.
QUICHE teama6ef0a62019-03-07 20:34:33 -05006257 return;
6258 }
zhongyi546cc452019-04-12 15:27:49 -07006259 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006260
6261 // clang-format off
nharper107ba5f2019-07-02 21:33:39 -07006262 PacketFragments packet48 = {
6263 // type (short header, 4 byte packet number)
6264 {"",
6265 {0x43}},
6266 // connection_id
6267 {"",
6268 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
6269 // packet number
6270 {"",
6271 {0x12, 0x34, 0x56, 0x78}},
6272 // frame type (QuicFrameType CRYPTO_FRAME)
6273 {"",
6274 {0x08}},
6275 // offset
6276 {"",
6277 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6278 0x32, 0x10, 0x76, 0x54}},
6279 // data length
6280 {"Invalid data length.",
6281 {kVarInt62OneByte + 12}},
6282 // data
6283 {"Unable to read frame data.",
6284 {'h', 'e', 'l', 'l',
6285 'o', ' ', 'w', 'o',
6286 'r', 'l', 'd', '!'}},
6287 };
6288
6289 PacketFragments packet99 = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006290 // type (short header, 4 byte packet number)
6291 {"",
6292 {0x43}},
6293 // connection_id
6294 {"",
6295 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
6296 // packet number
6297 {"",
6298 {0x12, 0x34, 0x56, 0x78}},
6299 // frame type (IETF_CRYPTO frame)
6300 {"",
6301 {0x06}},
6302 // offset
6303 {"",
6304 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
6305 0x32, 0x10, 0x76, 0x54}},
6306 // data length
6307 {"Invalid data length.",
6308 {kVarInt62OneByte + 12}},
6309 // data
6310 {"Unable to read frame data.",
6311 {'h', 'e', 'l', 'l',
6312 'o', ' ', 'w', 'o',
6313 'r', 'l', 'd', '!'}},
6314 };
6315 // clang-format on
6316
nharper107ba5f2019-07-02 21:33:39 -07006317 PacketFragments& fragments =
6318 framer_.transport_version() == QUIC_VERSION_99 ? packet99 : packet48;
QUICHE teama6ef0a62019-03-07 20:34:33 -05006319 std::unique_ptr<QuicEncryptedPacket> encrypted(
nharper107ba5f2019-07-02 21:33:39 -07006320 AssemblePacketFromFragments(fragments));
QUICHE teama6ef0a62019-03-07 20:34:33 -05006321 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6322
6323 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
6324 ASSERT_TRUE(visitor_.header_.get());
6325 EXPECT_TRUE(CheckDecryption(
6326 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
6327 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
6328 ASSERT_EQ(1u, visitor_.crypto_frames_.size());
6329 QuicCryptoFrame* frame = visitor_.crypto_frames_[0].get();
6330 EXPECT_EQ(kStreamOffset, frame->offset);
vasilvvc48c8712019-03-11 13:38:16 -07006331 EXPECT_EQ("hello world!",
6332 std::string(frame->data_buffer, frame->data_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05006333
nharper107ba5f2019-07-02 21:33:39 -07006334 CheckFramingBoundaries(fragments, QUIC_INVALID_FRAME_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006335}
6336
6337TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) {
dschinazi1ac22cc2019-06-25 11:47:50 -07006338 SetQuicReloadableFlag(quic_version_negotiation_grease, true);
6339 SetQuicFlag(FLAGS_quic_disable_version_negotiation_grease_randomness, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006340 // clang-format off
6341 unsigned char packet[] = {
6342 // public flags (version, 8 byte connection_id)
6343 0x0D,
6344 // connection_id
6345 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi1ac22cc2019-06-25 11:47:50 -07006346 // supported versions
6347 0xDA, 0x5A, 0x3A, 0x3A,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006348 QUIC_VERSION_BYTES,
6349 };
fayang36825da2019-08-21 14:01:27 -07006350 unsigned char packet46[] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006351 // type (long header)
dschinazi0366de92019-06-18 20:00:27 -07006352 0xC0,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006353 // version tag
6354 0x00, 0x00, 0x00, 0x00,
6355 // connection_id length
6356 0x05,
6357 // connection_id
6358 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi1ac22cc2019-06-25 11:47:50 -07006359 // supported versions
6360 0xDA, 0x5A, 0x3A, 0x3A,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006361 QUIC_VERSION_BYTES,
6362 };
dschinazi48ac9192019-07-31 00:07:26 -07006363 unsigned char packet99[] = {
6364 // type (long header)
6365 0xC0,
6366 // version tag
6367 0x00, 0x00, 0x00, 0x00,
6368 // destination connection ID length
6369 0x00,
6370 // source connection ID length
6371 0x08,
6372 // source connection ID
6373 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6374 // supported versions
6375 0xDA, 0x5A, 0x3A, 0x3A,
6376 QUIC_VERSION_BYTES,
6377 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05006378 // clang-format on
6379 unsigned char* p = packet;
6380 size_t p_size = QUIC_ARRAYSIZE(packet);
dschinazi48ac9192019-07-31 00:07:26 -07006381 if (framer_.transport_version() >= QUIC_VERSION_99) {
6382 p = packet99;
6383 p_size = QUIC_ARRAYSIZE(packet99);
6384 } else if (framer_.transport_version() > QUIC_VERSION_43) {
fayang36825da2019-08-21 14:01:27 -07006385 p = packet46;
6386 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006387 }
6388
6389 QuicConnectionId connection_id = FramerTestConnectionId();
6390 std::unique_ptr<QuicEncryptedPacket> data(
dschinazib417d602019-05-29 13:08:45 -07006391 QuicFramer::BuildVersionNegotiationPacket(
6392 connection_id, EmptyQuicConnectionId(),
6393 framer_.transport_version() > QUIC_VERSION_43,
dschinazi48ac9192019-07-31 00:07:26 -07006394 framer_.version().HasLengthPrefixedConnectionIds(),
QUICHE teama6ef0a62019-03-07 20:34:33 -05006395 SupportedVersions(GetParam())));
6396 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6397 data->length(), AsChars(p), p_size);
6398}
6399
dschinazib417d602019-05-29 13:08:45 -07006400TEST_P(QuicFramerTest, BuildVersionNegotiationPacketWithClientConnectionId) {
dschinazi48ac9192019-07-31 00:07:26 -07006401 if (!framer_.version().SupportsClientConnectionIds()) {
dschinazib417d602019-05-29 13:08:45 -07006402 return;
6403 }
6404
dschinazi1ac22cc2019-06-25 11:47:50 -07006405 SetQuicReloadableFlag(quic_version_negotiation_grease, true);
6406 SetQuicFlag(FLAGS_quic_disable_version_negotiation_grease_randomness, true);
dschinazib417d602019-05-29 13:08:45 -07006407
dschinazib417d602019-05-29 13:08:45 -07006408 // clang-format off
6409 unsigned char packet[] = {
6410 // type (long header)
dschinazi0366de92019-06-18 20:00:27 -07006411 0xC0,
dschinazib417d602019-05-29 13:08:45 -07006412 // version tag
6413 0x00, 0x00, 0x00, 0x00,
dschinazib417d602019-05-29 13:08:45 -07006414 // client/destination connection ID
dschinazi48ac9192019-07-31 00:07:26 -07006415 0x08,
dschinazib417d602019-05-29 13:08:45 -07006416 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
6417 // server/source connection ID
dschinazi48ac9192019-07-31 00:07:26 -07006418 0x08,
dschinazib417d602019-05-29 13:08:45 -07006419 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi1ac22cc2019-06-25 11:47:50 -07006420 // supported versions
6421 0xDA, 0x5A, 0x3A, 0x3A,
dschinazib417d602019-05-29 13:08:45 -07006422 QUIC_VERSION_BYTES,
6423 };
6424 // clang-format on
6425
6426 QuicConnectionId server_connection_id = FramerTestConnectionId();
6427 QuicConnectionId client_connection_id = FramerTestConnectionIdPlusOne();
6428 std::unique_ptr<QuicEncryptedPacket> data(
dschinazi48ac9192019-07-31 00:07:26 -07006429 QuicFramer::BuildVersionNegotiationPacket(
6430 server_connection_id, client_connection_id, true, true,
6431 SupportedVersions(GetParam())));
dschinazib417d602019-05-29 13:08:45 -07006432 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6433 data->length(), AsChars(packet),
6434 QUIC_ARRAYSIZE(packet));
6435}
6436
QUICHE teama6ef0a62019-03-07 20:34:33 -05006437TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlock) {
QUICHE team2252b702019-05-14 23:55:14 -04006438 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006439 QuicPacketHeader header;
6440 header.destination_connection_id = FramerTestConnectionId();
6441 header.reset_flag = false;
6442 header.version_flag = false;
6443 header.packet_number = kPacketNumber;
6444
6445 // Use kSmallLargestObserved to make this test finished in a short time.
6446 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6447 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6448
6449 QuicFrames frames = {QuicFrame(&ack_frame)};
6450
6451 // clang-format off
6452 unsigned char packet[] = {
6453 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04006454 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006455 // connection_id
6456 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6457 // packet number
6458 0x12, 0x34, 0x56, 0x78,
6459
6460 // frame type (ack frame)
6461 // (no ack blocks, 2 byte largest observed, 2 byte block length)
6462 0x45,
6463 // largest acked
6464 0x12, 0x34,
6465 // Zero delta time.
6466 0x00, 0x00,
6467 // first ack block length.
6468 0x12, 0x34,
6469 // num timestamps.
6470 0x00,
6471 };
6472
QUICHE teama6ef0a62019-03-07 20:34:33 -05006473 unsigned char packet46[] = {
6474 // type (short header, 4 byte packet number)
6475 0x43,
6476 // connection_id
6477 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6478 // packet number
6479 0x12, 0x34, 0x56, 0x78,
6480
6481 // frame type (ack frame)
6482 // (no ack blocks, 2 byte largest observed, 2 byte block length)
6483 0x45,
6484 // largest acked
6485 0x12, 0x34,
6486 // Zero delta time.
6487 0x00, 0x00,
6488 // first ack block length.
6489 0x12, 0x34,
6490 // num timestamps.
6491 0x00,
6492 };
6493
6494 unsigned char packet99[] = {
6495 // type (short header, 4 byte packet number)
6496 0x43,
6497 // connection_id
6498 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6499 // packet number
6500 0x12, 0x34, 0x56, 0x78,
6501
6502 // frame type (IETF_ACK frame)
6503 0x02,
6504 // largest acked
6505 kVarInt62TwoBytes + 0x12, 0x34,
6506 // Zero delta time.
6507 kVarInt62OneByte + 0x00,
6508 // Number of additional ack blocks.
6509 kVarInt62OneByte + 0x00,
6510 // first ack block length.
6511 kVarInt62TwoBytes + 0x12, 0x33,
6512 };
6513 // clang-format on
6514 unsigned char* p = packet;
6515 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07006516 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006517 p = packet99;
6518 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07006519 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006520 p = packet46;
6521 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006522 }
6523
6524 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6525 ASSERT_TRUE(data != nullptr);
6526 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6527 data->length(), AsChars(p), p_size);
6528}
6529
6530TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlockMaxLength) {
QUICHE team2252b702019-05-14 23:55:14 -04006531 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006532 QuicPacketHeader header;
6533 header.destination_connection_id = FramerTestConnectionId();
6534 header.reset_flag = false;
6535 header.version_flag = false;
6536 header.packet_number = kPacketNumber;
6537
6538 QuicAckFrame ack_frame = InitAckFrame(kPacketNumber);
6539 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6540
6541 QuicFrames frames = {QuicFrame(&ack_frame)};
6542
6543 // clang-format off
6544 unsigned char packet[] = {
6545 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04006546 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006547 // connection_id
6548 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6549 // packet number
6550 0x12, 0x34, 0x56, 0x78,
6551
6552 // frame type (ack frame)
6553 // (no ack blocks, 4 byte largest observed, 4 byte block length)
6554 0x4A,
6555 // largest acked
6556 0x12, 0x34, 0x56, 0x78,
6557 // Zero delta time.
6558 0x00, 0x00,
6559 // first ack block length.
6560 0x12, 0x34, 0x56, 0x78,
6561 // num timestamps.
6562 0x00,
6563 };
6564
QUICHE teama6ef0a62019-03-07 20:34:33 -05006565 unsigned char packet46[] = {
6566 // type (short header, 4 byte packet number)
6567 0x43,
6568 // connection_id
6569 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6570 // packet number
6571 0x12, 0x34, 0x56, 0x78,
6572
6573 // frame type (ack frame)
6574 // (no ack blocks, 4 byte largest observed, 4 byte block length)
6575 0x4A,
6576 // largest acked
6577 0x12, 0x34, 0x56, 0x78,
6578 // Zero delta time.
6579 0x00, 0x00,
6580 // first ack block length.
6581 0x12, 0x34, 0x56, 0x78,
6582 // num timestamps.
6583 0x00,
6584 };
6585
6586
6587 unsigned char packet99[] = {
6588 // type (short header, 4 byte packet number)
6589 0x43,
6590 // connection_id
6591 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6592 // packet number
6593 0x12, 0x34, 0x56, 0x78,
6594
6595 // frame type (IETF_ACK frame)
6596 0x02,
6597 // largest acked
6598 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
6599 // Zero delta time.
6600 kVarInt62OneByte + 0x00,
6601 // Nr. of additional ack blocks
6602 kVarInt62OneByte + 0x00,
6603 // first ack block length.
6604 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
6605 };
6606 // clang-format on
6607 unsigned char* p = packet;
6608 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07006609 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006610 p = packet99;
6611 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07006612 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006613 p = packet46;
6614 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006615 }
6616
6617 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6618 ASSERT_TRUE(data != nullptr);
6619 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6620 data->length(), AsChars(p), p_size);
6621}
6622
6623TEST_P(QuicFramerTest, BuildAckFramePacketMultipleAckBlocks) {
QUICHE team2252b702019-05-14 23:55:14 -04006624 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006625 QuicPacketHeader header;
6626 header.destination_connection_id = FramerTestConnectionId();
6627 header.reset_flag = false;
6628 header.version_flag = false;
6629 header.packet_number = kPacketNumber;
6630
6631 // Use kSmallLargestObserved to make this test finished in a short time.
6632 QuicAckFrame ack_frame =
6633 InitAckFrame({{QuicPacketNumber(1), QuicPacketNumber(5)},
6634 {QuicPacketNumber(10), QuicPacketNumber(500)},
6635 {QuicPacketNumber(900), kSmallMissingPacket},
6636 {kSmallMissingPacket + 1, kSmallLargestObserved + 1}});
6637 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6638
6639 QuicFrames frames = {QuicFrame(&ack_frame)};
6640
6641 // clang-format off
6642 unsigned char packet[] = {
6643 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04006644 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006645 // connection_id
6646 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6647 // packet number
6648 0x12, 0x34, 0x56, 0x78,
6649
6650 // frame type (ack frame)
6651 // (has ack blocks, 2 byte largest observed, 2 byte block length)
6652 0x65,
6653 // largest acked
6654 0x12, 0x34,
6655 // Zero delta time.
6656 0x00, 0x00,
6657 // num ack blocks ranges.
6658 0x04,
6659 // first ack block length.
6660 0x00, 0x01,
6661 // gap to next block.
6662 0x01,
6663 // ack block length.
6664 0x0e, 0xaf,
6665 // gap to next block.
6666 0xff,
6667 // ack block length.
6668 0x00, 0x00,
6669 // gap to next block.
6670 0x91,
6671 // ack block length.
6672 0x01, 0xea,
6673 // gap to next block.
6674 0x05,
6675 // ack block length.
6676 0x00, 0x04,
6677 // num timestamps.
6678 0x00,
6679 };
6680
QUICHE teama6ef0a62019-03-07 20:34:33 -05006681 unsigned char packet46[] = {
6682 // type (short header, 4 byte packet number)
6683 0x43,
6684 // connection_id
6685 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6686 // packet number
6687 0x12, 0x34, 0x56, 0x78,
6688
6689 // frame type (ack frame)
6690 // (has ack blocks, 2 byte largest observed, 2 byte block length)
6691 0x65,
6692 // largest acked
6693 0x12, 0x34,
6694 // Zero delta time.
6695 0x00, 0x00,
6696 // num ack blocks ranges.
6697 0x04,
6698 // first ack block length.
6699 0x00, 0x01,
6700 // gap to next block.
6701 0x01,
6702 // ack block length.
6703 0x0e, 0xaf,
6704 // gap to next block.
6705 0xff,
6706 // ack block length.
6707 0x00, 0x00,
6708 // gap to next block.
6709 0x91,
6710 // ack block length.
6711 0x01, 0xea,
6712 // gap to next block.
6713 0x05,
6714 // ack block length.
6715 0x00, 0x04,
6716 // num timestamps.
6717 0x00,
6718 };
6719
6720 unsigned char packet99[] = {
6721 // type (short header, 4 byte packet number)
6722 0x43,
6723 // connection_id
6724 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6725 // packet number
6726 0x12, 0x34, 0x56, 0x78,
6727
6728 // frame type (IETF_ACK frame)
6729 0x02,
6730 // largest acked
6731 kVarInt62TwoBytes + 0x12, 0x34,
6732 // Zero delta time.
6733 kVarInt62OneByte + 0x00,
6734 // num additional ack blocks.
6735 kVarInt62OneByte + 0x03,
6736 // first ack block length.
6737 kVarInt62OneByte + 0x00,
6738
6739 // gap to next block.
6740 kVarInt62OneByte + 0x00,
6741 // ack block length.
6742 kVarInt62TwoBytes + 0x0e, 0xae,
6743
6744 // gap to next block.
6745 kVarInt62TwoBytes + 0x01, 0x8f,
6746 // ack block length.
6747 kVarInt62TwoBytes + 0x01, 0xe9,
6748
6749 // gap to next block.
6750 kVarInt62OneByte + 0x04,
6751 // ack block length.
6752 kVarInt62OneByte + 0x03,
6753 };
6754 // clang-format on
6755 unsigned char* p = packet;
6756 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07006757 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006758 p = packet99;
6759 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07006760 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05006761 p = packet46;
6762 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006763 }
6764
6765 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6766 ASSERT_TRUE(data != nullptr);
6767
6768 test::CompareCharArraysWithHexError("constructed packet", data->data(),
6769 data->length(), AsChars(p), p_size);
6770}
6771
6772TEST_P(QuicFramerTest, BuildAckFramePacketMaxAckBlocks) {
QUICHE team2252b702019-05-14 23:55:14 -04006773 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05006774 QuicPacketHeader header;
6775 header.destination_connection_id = FramerTestConnectionId();
6776 header.reset_flag = false;
6777 header.version_flag = false;
6778 header.packet_number = kPacketNumber;
6779
6780 // Use kSmallLargestObservedto make this test finished in a short time.
6781 QuicAckFrame ack_frame;
6782 ack_frame.largest_acked = kSmallLargestObserved;
6783 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6784 // 300 ack blocks.
6785 for (size_t i = 2; i < 2 * 300; i += 2) {
6786 ack_frame.packets.Add(QuicPacketNumber(i));
6787 }
6788 ack_frame.packets.AddRange(QuicPacketNumber(600), kSmallLargestObserved + 1);
6789
6790 QuicFrames frames = {QuicFrame(&ack_frame)};
6791
6792 // clang-format off
6793 unsigned char packet[] = {
6794 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04006795 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05006796 // connection_id
6797 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6798 // packet number
6799 0x12, 0x34, 0x56, 0x78,
6800 // frame type (ack frame)
6801 // (has ack blocks, 2 byte largest observed, 2 byte block length)
6802 0x65,
6803 // largest acked
6804 0x12, 0x34,
6805 // Zero delta time.
6806 0x00, 0x00,
6807 // num ack blocks ranges.
6808 0xff,
6809 // first ack block length.
6810 0x0f, 0xdd,
6811 // 255 = 4 * 63 + 3
6812 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6813 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6814 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6815 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6816 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6817 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6818 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6819 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6820 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6821 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6822
6823 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6824 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6825 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6826 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6827 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6828 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6829 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6830 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6831 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6832 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6833
6834 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6835 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6836 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6837 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6838 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6839 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6840 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6841 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6842 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6843 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6844
6845 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6846 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6847 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6848 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6849 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6850 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6851 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6852 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6853 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6854 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6855
6856 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6857 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6858 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6859 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6860 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6861 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6862 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6863 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6864 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6865 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6866
6867 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6868 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6869 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6870 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6871 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6872 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6873 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6874 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6875 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6876 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6877
6878 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6879 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6880 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6881 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6882 // num timestamps.
6883 0x00,
6884 };
6885
QUICHE teama6ef0a62019-03-07 20:34:33 -05006886 unsigned char packet46[] = {
6887 // type (short header, 4 byte packet number)
6888 0x43,
6889 // connection_id
6890 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6891 // packet number
6892 0x12, 0x34, 0x56, 0x78,
6893 // frame type (ack frame)
6894 // (has ack blocks, 2 byte largest observed, 2 byte block length)
6895 0x65,
6896 // largest acked
6897 0x12, 0x34,
6898 // Zero delta time.
6899 0x00, 0x00,
6900 // num ack blocks ranges.
6901 0xff,
6902 // first ack block length.
6903 0x0f, 0xdd,
6904 // 255 = 4 * 63 + 3
6905 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6906 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6907 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6908 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6909 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6910 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6911 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6912 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6913 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6914 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6915
6916 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6917 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6918 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6919 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6920 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6921 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6922 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6923 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6924 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6925 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6926
6927 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6928 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6929 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6930 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6931 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6932 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6933 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6934 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6935 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6936 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6937
6938 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6939 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6940 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6941 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6942 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6943 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6944 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6945 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6946 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6947 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6948
6949 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6950 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6951 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6952 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6953 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6954 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6955 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6956 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6957 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6958 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6959
6960 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6961 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6962 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6963 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6964 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6965 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6966 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6967 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6968 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6969 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6970
6971 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6972 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6973 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6974 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6975 // num timestamps.
6976 0x00,
6977 };
6978
6979 unsigned char packet99[] = {
6980 // type (short header, 4 byte packet number)
6981 0x43,
6982 // connection_id
6983 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6984 // packet number
6985 0x12, 0x34, 0x56, 0x78,
6986 // frame type (IETF_ACK frame)
6987 0x02,
6988 // largest acked
6989 kVarInt62TwoBytes + 0x12, 0x34,
6990 // Zero delta time.
6991 kVarInt62OneByte + 0x00,
6992 // num ack blocks ranges.
6993 kVarInt62TwoBytes + 0x01, 0x2b,
6994 // first ack block length.
6995 kVarInt62TwoBytes + 0x0f, 0xdc,
6996 // 255 added blocks of gap_size == 1, ack_size == 1
6997#define V99AddedBLOCK kVarInt62OneByte + 0x00, kVarInt62OneByte + 0x00
6998 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
6999 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7000 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7001 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7002 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7003 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7004 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7005 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7006 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7007 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7008 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7009 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7010 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7011 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7012 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7013 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7014 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7015 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7016 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7017 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7018
7019 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7020 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7021 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7022 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7023 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7024 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7025 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7026 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7027 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7028 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7029 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7030 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7031 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7032 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7033 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7034 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7035 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7036 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7037 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7038 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7039
7040 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7041 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7042 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7043 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7044 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7045 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7046 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7047 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7048 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7049 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7050 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7051 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7052 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7053 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7054 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7055 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7056 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7057 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7058 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7059 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7060
7061#undef V99AddedBLOCK
7062 };
7063 // clang-format on
7064 unsigned char* p = packet;
7065 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07007066 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007067 p = packet99;
7068 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07007069 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007070 p = packet46;
7071 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007072 }
7073
7074 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7075 ASSERT_TRUE(data != nullptr);
7076
7077 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7078 data->length(), AsChars(p), p_size);
7079}
7080
7081TEST_P(QuicFramerTest, BuildNewStopWaitingPacket) {
7082 if (version_.transport_version > QUIC_VERSION_43) {
7083 return;
7084 }
QUICHE team2252b702019-05-14 23:55:14 -04007085 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007086 QuicPacketHeader header;
7087 header.destination_connection_id = FramerTestConnectionId();
7088 header.reset_flag = false;
7089 header.version_flag = false;
7090 header.packet_number = kPacketNumber;
7091
7092 QuicStopWaitingFrame stop_waiting_frame;
7093 stop_waiting_frame.least_unacked = kLeastUnacked;
7094
7095 QuicFrames frames = {QuicFrame(stop_waiting_frame)};
7096
7097 // clang-format off
7098 unsigned char packet[] = {
7099 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007100 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007101 // connection_id
7102 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7103 // packet number
7104 0x12, 0x34, 0x56, 0x78,
7105
7106 // frame type (stop waiting frame)
7107 0x06,
7108 // least packet number awaiting an ack, delta from packet number.
7109 0x00, 0x00, 0x00, 0x08,
7110 };
7111
7112 // clang-format on
7113
7114 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7115 ASSERT_TRUE(data != nullptr);
7116
7117 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7118 data->length(), AsChars(packet),
7119 QUIC_ARRAYSIZE(packet));
7120}
7121
7122TEST_P(QuicFramerTest, BuildRstFramePacketQuic) {
QUICHE team2252b702019-05-14 23:55:14 -04007123 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007124 QuicPacketHeader header;
7125 header.destination_connection_id = FramerTestConnectionId();
7126 header.reset_flag = false;
7127 header.version_flag = false;
7128 header.packet_number = kPacketNumber;
7129
7130 QuicRstStreamFrame rst_frame;
7131 rst_frame.stream_id = kStreamId;
fkastenholz305e1732019-06-18 05:01:22 -07007132 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007133 rst_frame.ietf_error_code = 0x01;
7134 } else {
7135 rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708);
7136 }
7137 rst_frame.byte_offset = 0x0807060504030201;
7138
7139 // clang-format off
7140 unsigned char packet[] = {
7141 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007142 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007143 // connection_id
7144 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7145 // packet number
7146 0x12, 0x34, 0x56, 0x78,
7147
7148 // frame type (rst stream frame)
7149 0x01,
7150 // stream id
7151 0x01, 0x02, 0x03, 0x04,
7152 // sent byte offset
7153 0x08, 0x07, 0x06, 0x05,
7154 0x04, 0x03, 0x02, 0x01,
7155 // error code
7156 0x05, 0x06, 0x07, 0x08,
7157 };
7158
QUICHE teama6ef0a62019-03-07 20:34:33 -05007159 unsigned char packet46[] = {
7160 // type (short packet, 4 byte packet number)
7161 0x43,
7162 // connection_id
7163 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7164 // packet number
7165 0x12, 0x34, 0x56, 0x78,
7166
7167 // frame type (rst stream frame)
7168 0x01,
7169 // stream id
7170 0x01, 0x02, 0x03, 0x04,
7171 // sent byte offset
7172 0x08, 0x07, 0x06, 0x05,
7173 0x04, 0x03, 0x02, 0x01,
7174 // error code
7175 0x05, 0x06, 0x07, 0x08,
7176 };
7177
7178 unsigned char packet99[] = {
7179 // type (short packet, 4 byte packet number)
7180 0x43,
7181 // connection_id
7182 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7183 // packet number
7184 0x12, 0x34, 0x56, 0x78,
7185
7186 // frame type (IETF_RST_STREAM frame)
7187 0x04,
7188 // stream id
7189 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
fkastenholz07300e52019-07-16 11:51:37 -07007190 // error code
7191 kVarInt62OneByte + 0x01,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007192 // sent byte offset
7193 kVarInt62EightBytes + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01
7194 };
7195 // clang-format on
7196
7197 QuicFrames frames = {QuicFrame(&rst_frame)};
7198
7199 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7200 ASSERT_TRUE(data != nullptr);
7201
7202 unsigned char* p = packet;
7203 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07007204 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007205 p = packet99;
7206 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07007207 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007208 p = packet46;
7209 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007210 }
7211 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
7212
7213 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7214 data->length(), AsChars(p), p_size);
7215}
7216
7217TEST_P(QuicFramerTest, BuildCloseFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04007218 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007219 QuicPacketHeader header;
7220 header.destination_connection_id = FramerTestConnectionId();
7221 header.reset_flag = false;
7222 header.version_flag = false;
7223 header.packet_number = kPacketNumber;
7224
7225 QuicConnectionCloseFrame close_frame;
fkastenholz305e1732019-06-18 05:01:22 -07007226 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholze9d71a82019-04-09 05:12:13 -07007227 close_frame.transport_error_code =
QUICHE teama6ef0a62019-03-07 20:34:33 -05007228 static_cast<QuicIetfTransportErrorCodes>(0x11);
fkastenholze9d71a82019-04-09 05:12:13 -07007229 close_frame.transport_close_frame_type = 0x05;
fkastenholz72f509b2019-04-10 09:17:49 -07007230 close_frame.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -05007231 } else {
fkastenholze9d71a82019-04-09 05:12:13 -07007232 close_frame.quic_error_code = static_cast<QuicErrorCode>(0x05060708);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007233 }
7234 close_frame.error_details = "because I can";
7235
7236 QuicFrames frames = {QuicFrame(&close_frame)};
7237
7238 // clang-format off
7239 unsigned char packet[] = {
7240 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007241 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007242 // connection_id
7243 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7244 // packet number
7245 0x12, 0x34, 0x56, 0x78,
7246
7247 // frame type (connection close frame)
7248 0x02,
7249 // error code
7250 0x05, 0x06, 0x07, 0x08,
7251 // error details length
7252 0x00, 0x0d,
7253 // error details
7254 'b', 'e', 'c', 'a',
7255 'u', 's', 'e', ' ',
7256 'I', ' ', 'c', 'a',
7257 'n',
7258 };
7259
QUICHE teama6ef0a62019-03-07 20:34:33 -05007260 unsigned char packet46[] = {
7261 // type (short header, 4 byte packet number)
7262 0x43,
7263 // connection_id
7264 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7265 // packet number
7266 0x12, 0x34, 0x56, 0x78,
7267
7268 // frame type (connection close frame)
7269 0x02,
7270 // error code
7271 0x05, 0x06, 0x07, 0x08,
7272 // error details length
7273 0x00, 0x0d,
7274 // error details
7275 'b', 'e', 'c', 'a',
7276 'u', 's', 'e', ' ',
7277 'I', ' ', 'c', 'a',
7278 'n',
7279 };
7280
7281 unsigned char packet99[] = {
7282 // type (short header, 4 byte packet number)
7283 0x43,
7284 // connection_id
7285 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7286 // packet number
7287 0x12, 0x34, 0x56, 0x78,
7288
7289 // frame type (IETF_CONNECTION_CLOSE frame)
7290 0x1c,
7291 // error code
fkastenholzd57d3f92019-07-16 09:05:17 -07007292 kVarInt62OneByte + 0x11,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007293 // Frame type within the CONNECTION_CLOSE frame
7294 kVarInt62OneByte + 0x05,
7295 // error details length
7296 kVarInt62OneByte + 0x0d,
7297 // error details
7298 'b', 'e', 'c', 'a',
7299 'u', 's', 'e', ' ',
7300 'I', ' ', 'c', 'a',
7301 'n',
7302 };
7303 // clang-format on
7304
7305 unsigned char* p = packet;
7306 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07007307 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007308 p = packet99;
7309 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07007310 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007311 p = packet46;
7312 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007313 }
7314
7315 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7316 ASSERT_TRUE(data != nullptr);
7317
7318 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7319 data->length(), AsChars(p), p_size);
7320}
7321
fkastenholzb4dade72019-08-05 06:54:20 -07007322TEST_P(QuicFramerTest, BuildCloseFramePacketExtendedInfo) {
7323 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7324 QuicPacketHeader header;
7325 header.destination_connection_id = FramerTestConnectionId();
7326 header.reset_flag = false;
7327 header.version_flag = false;
7328 header.packet_number = kPacketNumber;
7329
7330 QuicConnectionCloseFrame close_frame;
7331 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7332 close_frame.transport_error_code =
7333 static_cast<QuicIetfTransportErrorCodes>(0x11);
7334 close_frame.transport_close_frame_type = 0x05;
7335 close_frame.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
7336 } else {
7337 close_frame.quic_error_code = static_cast<QuicErrorCode>(0x05060708);
7338 }
7339 // Set this so that it is "there" for both Google QUIC and IETF QUIC
7340 // framing. It better not show up for Google QUIC!
7341 close_frame.extracted_error_code = static_cast<QuicErrorCode>(0x4567);
7342
7343 // For IETF QUIC this will be prefaced with "17767:"
7344 // (17767 == 0x4567).
7345 close_frame.error_details = "because I can";
7346
7347 QuicFrames frames = {QuicFrame(&close_frame)};
7348
7349 // clang-format off
7350 unsigned char packet[] = {
7351 // public flags (8 byte connection_id)
7352 0x2C,
7353 // connection_id
7354 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7355 // packet number
7356 0x12, 0x34, 0x56, 0x78,
7357
7358 // frame type (connection close frame)
7359 0x02,
7360 // error code
7361 0x05, 0x06, 0x07, 0x08,
7362 // error details length
7363 0x00, 0x0d,
7364 // error details
7365 'b', 'e', 'c', 'a',
7366 'u', 's', 'e', ' ',
7367 'I', ' ', 'c', 'a',
7368 'n',
7369 };
7370
fkastenholzb4dade72019-08-05 06:54:20 -07007371 unsigned char packet46[] = {
7372 // type (short header, 4 byte packet number)
7373 0x43,
7374 // connection_id
7375 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7376 // packet number
7377 0x12, 0x34, 0x56, 0x78,
7378
7379 // frame type (connection close frame)
7380 0x02,
7381 // error code
7382 0x05, 0x06, 0x07, 0x08,
7383 // error details length
7384 0x00, 0x0d,
7385 // error details
7386 'b', 'e', 'c', 'a',
7387 'u', 's', 'e', ' ',
7388 'I', ' ', 'c', 'a',
7389 'n',
7390 };
7391
7392 unsigned char packet99[] = {
7393 // type (short header, 4 byte packet number)
7394 0x43,
7395 // connection_id
7396 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7397 // packet number
7398 0x12, 0x34, 0x56, 0x78,
7399
7400 // frame type (IETF_CONNECTION_CLOSE frame)
7401 0x1c,
7402 // error code
7403 kVarInt62OneByte + 0x11,
7404 // Frame type within the CONNECTION_CLOSE frame
7405 kVarInt62OneByte + 0x05,
7406 // error details length
7407 kVarInt62OneByte + 0x13,
7408 // error details
7409 '1', '7', '7', '6',
7410 '7', ':', 'b', 'e',
7411 'c', 'a', 'u', 's',
7412 'e', ' ', 'I', ' ',
7413 'c', 'a', 'n'
7414 };
7415 // clang-format on
7416
7417 unsigned char* p = packet;
7418 size_t p_size = QUIC_ARRAYSIZE(packet);
7419 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7420 p = packet99;
7421 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07007422 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fkastenholzb4dade72019-08-05 06:54:20 -07007423 p = packet46;
7424 p_size = QUIC_ARRAYSIZE(packet46);
fkastenholzb4dade72019-08-05 06:54:20 -07007425 }
7426
7427 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7428 ASSERT_TRUE(data != nullptr);
7429
7430 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7431 data->length(), AsChars(p), p_size);
7432}
7433
QUICHE teama6ef0a62019-03-07 20:34:33 -05007434TEST_P(QuicFramerTest, BuildTruncatedCloseFramePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04007435 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007436 QuicPacketHeader header;
7437 header.destination_connection_id = FramerTestConnectionId();
7438 header.reset_flag = false;
7439 header.version_flag = false;
7440 header.packet_number = kPacketNumber;
7441
7442 QuicConnectionCloseFrame close_frame;
fkastenholz305e1732019-06-18 05:01:22 -07007443 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholze9d71a82019-04-09 05:12:13 -07007444 close_frame.transport_error_code = PROTOCOL_VIOLATION; // value is 0x0a
7445 EXPECT_EQ(0u, close_frame.transport_close_frame_type);
fkastenholz72f509b2019-04-10 09:17:49 -07007446 close_frame.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -05007447 } else {
fkastenholze9d71a82019-04-09 05:12:13 -07007448 close_frame.quic_error_code = static_cast<QuicErrorCode>(0x05060708);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007449 }
vasilvvc48c8712019-03-11 13:38:16 -07007450 close_frame.error_details = std::string(2048, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -05007451 QuicFrames frames = {QuicFrame(&close_frame)};
7452
7453 // clang-format off
7454 unsigned char packet[] = {
7455 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007456 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007457 // connection_id
7458 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7459 // packet number
7460 0x12, 0x34, 0x56, 0x78,
7461
7462 // frame type (connection close frame)
7463 0x02,
7464 // error code
7465 0x05, 0x06, 0x07, 0x08,
7466 // error details length
7467 0x01, 0x00,
7468 // error details (truncated to 256 bytes)
7469 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7470 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7471 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7472 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7473 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7474 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7475 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7476 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7477 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7478 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7479 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7480 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7481 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7482 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7483 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7484 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7485 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7486 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7487 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7488 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7489 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7490 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7491 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7492 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7493 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7494 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7495 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7496 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7497 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7498 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7499 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7500 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7501 };
7502
QUICHE teama6ef0a62019-03-07 20:34:33 -05007503 unsigned char packet46[] = {
7504 // type (short header, 4 byte packet number)
7505 0x43,
7506 // connection_id
7507 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7508 // packet number
7509 0x12, 0x34, 0x56, 0x78,
7510
7511 // frame type (connection close frame)
7512 0x02,
7513 // error code
7514 0x05, 0x06, 0x07, 0x08,
7515 // error details length
7516 0x01, 0x00,
7517 // error details (truncated to 256 bytes)
7518 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7519 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7520 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7521 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7522 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7523 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7524 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7525 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7526 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7527 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7528 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7529 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7530 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7531 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7532 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7533 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7534 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7535 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7536 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7537 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7538 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7539 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7540 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7541 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7542 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7543 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7544 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7545 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7546 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7547 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7548 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7549 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7550 };
7551
7552 unsigned char packet99[] = {
7553 // type (short header, 4 byte packet number)
7554 0x43,
7555 // connection_id
7556 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7557 // packet number
7558 0x12, 0x34, 0x56, 0x78,
7559
7560 // frame type (IETF_CONNECTION_CLOSE frame)
7561 0x1c,
7562 // error code
fkastenholzd57d3f92019-07-16 09:05:17 -07007563 kVarInt62OneByte + 0x0a,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007564 // Frame type within the CONNECTION_CLOSE frame
7565 kVarInt62OneByte + 0x00,
7566 // error details length
7567 kVarInt62TwoBytes + 0x01, 0x00,
7568 // error details (truncated to 256 bytes)
7569 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7570 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7571 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7572 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7573 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7574 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7575 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7576 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7577 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7578 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7579 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7580 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7581 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7582 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7583 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7584 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7585 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7586 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7587 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7588 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7589 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7590 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7591 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7592 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7593 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7594 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7595 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7596 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7597 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7598 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7599 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7600 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7601 };
7602 // clang-format on
7603
7604 unsigned char* p = packet;
7605 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07007606 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007607 p = packet99;
7608 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07007609 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007610 p = packet46;
7611 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007612 }
7613
7614 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7615 ASSERT_TRUE(data != nullptr);
7616
7617 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7618 data->length(), AsChars(p), p_size);
7619}
7620
7621TEST_P(QuicFramerTest, BuildApplicationCloseFramePacket) {
fkastenholz305e1732019-06-18 05:01:22 -07007622 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007623 // Versions other than 99 do not have ApplicationClose
7624 return;
7625 }
QUICHE team2252b702019-05-14 23:55:14 -04007626 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007627 QuicPacketHeader header;
7628 header.destination_connection_id = FramerTestConnectionId();
7629 header.reset_flag = false;
7630 header.version_flag = false;
7631 header.packet_number = kPacketNumber;
7632
fkastenholz72f509b2019-04-10 09:17:49 -07007633 QuicConnectionCloseFrame app_close_frame;
fkastenholzd57d3f92019-07-16 09:05:17 -07007634 app_close_frame.application_error_code =
7635 static_cast<uint64_t>(QUIC_INVALID_STREAM_ID);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007636 app_close_frame.error_details = "because I can";
fkastenholz72f509b2019-04-10 09:17:49 -07007637 app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -05007638
7639 QuicFrames frames = {QuicFrame(&app_close_frame)};
7640
7641 // clang-format off
7642
7643 unsigned char packet99[] = {
7644 // type (short header, 4 byte packet number)
7645 0x43,
7646 // connection_id
7647 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7648 // packet number
7649 0x12, 0x34, 0x56, 0x78,
7650
7651 // frame type (IETF_APPLICATION_CLOSE frame)
7652 0x1d,
7653 // error code
fkastenholzd57d3f92019-07-16 09:05:17 -07007654 kVarInt62OneByte + 0x11,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007655 // error details length
7656 kVarInt62OneByte + 0x0d,
7657 // error details
7658 'b', 'e', 'c', 'a',
7659 'u', 's', 'e', ' ',
7660 'I', ' ', 'c', 'a',
7661 'n',
7662 };
7663 // clang-format on
7664
7665 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7666 ASSERT_TRUE(data != nullptr);
7667
7668 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7669 data->length(), AsChars(packet99),
7670 QUIC_ARRAYSIZE(packet99));
7671}
7672
7673TEST_P(QuicFramerTest, BuildTruncatedApplicationCloseFramePacket) {
fkastenholz305e1732019-06-18 05:01:22 -07007674 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007675 // Versions other than 99 do not have this frame.
7676 return;
7677 }
QUICHE team2252b702019-05-14 23:55:14 -04007678 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007679 QuicPacketHeader header;
7680 header.destination_connection_id = FramerTestConnectionId();
7681 header.reset_flag = false;
7682 header.version_flag = false;
7683 header.packet_number = kPacketNumber;
7684
fkastenholz72f509b2019-04-10 09:17:49 -07007685 QuicConnectionCloseFrame app_close_frame;
fkastenholzd57d3f92019-07-16 09:05:17 -07007686 app_close_frame.application_error_code =
7687 static_cast<uint64_t>(QUIC_INVALID_STREAM_ID);
vasilvvc48c8712019-03-11 13:38:16 -07007688 app_close_frame.error_details = std::string(2048, 'A');
fkastenholz72f509b2019-04-10 09:17:49 -07007689 app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -05007690
7691 QuicFrames frames = {QuicFrame(&app_close_frame)};
7692
7693 // clang-format off
7694 unsigned char packet99[] = {
7695 // type (short header, 4 byte packet number)
7696 0x43,
7697 // connection_id
7698 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7699 // packet number
7700 0x12, 0x34, 0x56, 0x78,
7701
7702 // frame type (IETF_APPLICATION_CLOSE frame)
7703 0x1d,
7704 // error code
fkastenholzd57d3f92019-07-16 09:05:17 -07007705 kVarInt62OneByte + 0x11,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007706 // error details length
7707 kVarInt62TwoBytes + 0x01, 0x00,
7708 // error details (truncated to 256 bytes)
7709 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7710 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7711 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7712 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7713 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7714 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7715 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7716 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7717 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7718 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7719 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7720 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7721 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7722 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7723 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7724 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7725 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7726 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7727 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7728 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7729 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7730 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7731 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7732 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7733 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7734 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7735 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7736 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7737 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7738 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7739 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7740 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7741 };
7742 // clang-format on
7743
7744 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7745 ASSERT_TRUE(data != nullptr);
7746
7747 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7748 data->length(), AsChars(packet99),
7749 QUIC_ARRAYSIZE(packet99));
7750}
7751
7752TEST_P(QuicFramerTest, BuildGoAwayPacket) {
fkastenholz305e1732019-06-18 05:01:22 -07007753 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007754 // This frame type is not supported in version 99.
7755 return;
7756 }
QUICHE team2252b702019-05-14 23:55:14 -04007757 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007758 QuicPacketHeader header;
7759 header.destination_connection_id = FramerTestConnectionId();
7760 header.reset_flag = false;
7761 header.version_flag = false;
7762 header.packet_number = kPacketNumber;
7763
7764 QuicGoAwayFrame goaway_frame;
7765 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
7766 goaway_frame.last_good_stream_id = kStreamId;
7767 goaway_frame.reason_phrase = "because I can";
7768
7769 QuicFrames frames = {QuicFrame(&goaway_frame)};
7770
7771 // clang-format off
7772 unsigned char packet[] = {
7773 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007774 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007775 // connection_id
7776 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7777 // packet number
7778 0x12, 0x34, 0x56, 0x78,
7779
7780 // frame type (go away frame)
7781 0x03,
7782 // error code
7783 0x05, 0x06, 0x07, 0x08,
7784 // stream id
7785 0x01, 0x02, 0x03, 0x04,
7786 // error details length
7787 0x00, 0x0d,
7788 // error details
7789 'b', 'e', 'c', 'a',
7790 'u', 's', 'e', ' ',
7791 'I', ' ', 'c', 'a',
7792 'n',
7793 };
7794
QUICHE teama6ef0a62019-03-07 20:34:33 -05007795 unsigned char packet46[] = {
7796 // type (short header, 4 byte packet number)
7797 0x43,
7798 // connection_id
7799 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7800 // packet number
7801 0x12, 0x34, 0x56, 0x78,
7802
7803 // frame type (go away frame)
7804 0x03,
7805 // error code
7806 0x05, 0x06, 0x07, 0x08,
7807 // stream id
7808 0x01, 0x02, 0x03, 0x04,
7809 // error details length
7810 0x00, 0x0d,
7811 // error details
7812 'b', 'e', 'c', 'a',
7813 'u', 's', 'e', ' ',
7814 'I', ' ', 'c', 'a',
7815 'n',
7816 };
7817
7818 // clang-format on
7819
7820 unsigned char* p = packet;
7821 size_t p_size = QUIC_ARRAYSIZE(packet);
fayang36825da2019-08-21 14:01:27 -07007822 if (framer_.transport_version() > QUIC_VERSION_43) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007823 p = packet46;
7824 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007825 }
7826
7827 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7828 ASSERT_TRUE(data != nullptr);
7829
7830 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7831 data->length(), AsChars(p), p_size);
7832}
7833
7834TEST_P(QuicFramerTest, BuildTruncatedGoAwayPacket) {
fkastenholz305e1732019-06-18 05:01:22 -07007835 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007836 // This frame type is not supported in version 99.
7837 return;
7838 }
QUICHE team2252b702019-05-14 23:55:14 -04007839 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007840 QuicPacketHeader header;
7841 header.destination_connection_id = FramerTestConnectionId();
7842 header.reset_flag = false;
7843 header.version_flag = false;
7844 header.packet_number = kPacketNumber;
7845
7846 QuicGoAwayFrame goaway_frame;
7847 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
7848 goaway_frame.last_good_stream_id = kStreamId;
vasilvvc48c8712019-03-11 13:38:16 -07007849 goaway_frame.reason_phrase = std::string(2048, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -05007850
7851 QuicFrames frames = {QuicFrame(&goaway_frame)};
7852
7853 // clang-format off
7854 unsigned char packet[] = {
7855 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007856 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007857 // connection_id
7858 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7859 // packet number
7860 0x12, 0x34, 0x56, 0x78,
7861
7862 // frame type (go away frame)
7863 0x03,
7864 // error code
7865 0x05, 0x06, 0x07, 0x08,
7866 // stream id
7867 0x01, 0x02, 0x03, 0x04,
7868 // error details length
7869 0x01, 0x00,
7870 // error details (truncated to 256 bytes)
7871 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7872 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7873 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7874 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7875 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7876 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7877 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7878 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7879 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7880 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7881 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7882 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7883 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7884 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7885 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7886 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7887 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7888 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7889 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7890 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7891 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7892 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7893 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7894 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7895 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7896 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7897 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7898 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7899 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7900 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7901 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7902 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7903 };
7904
QUICHE teama6ef0a62019-03-07 20:34:33 -05007905 unsigned char packet46[] = {
7906 // type (short header, 4 byte packet number)
7907 0x43,
7908 // connection_id
7909 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7910 // packet number
7911 0x12, 0x34, 0x56, 0x78,
7912
7913 // frame type (go away frame)
7914 0x03,
7915 // error code
7916 0x05, 0x06, 0x07, 0x08,
7917 // stream id
7918 0x01, 0x02, 0x03, 0x04,
7919 // error details length
7920 0x01, 0x00,
7921 // error details (truncated to 256 bytes)
7922 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7923 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7924 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7925 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7926 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7927 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7928 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7929 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7930 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7931 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7932 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7933 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7934 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7935 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7936 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7937 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7938 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7939 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7940 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7941 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7942 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7943 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7944 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7945 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7946 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7947 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7948 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7949 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7950 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7951 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7952 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7953 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7954 };
7955 // clang-format on
7956
7957 unsigned char* p = packet;
7958 size_t p_size = QUIC_ARRAYSIZE(packet);
fayang36825da2019-08-21 14:01:27 -07007959 if (framer_.transport_version() > QUIC_VERSION_43) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05007960 p = packet46;
7961 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007962 }
7963
7964 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7965 ASSERT_TRUE(data != nullptr);
7966
7967 test::CompareCharArraysWithHexError("constructed packet", data->data(),
7968 data->length(), AsChars(p), p_size);
7969}
7970
7971TEST_P(QuicFramerTest, BuildWindowUpdatePacket) {
QUICHE team2252b702019-05-14 23:55:14 -04007972 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05007973 QuicPacketHeader header;
7974 header.destination_connection_id = FramerTestConnectionId();
7975 header.reset_flag = false;
7976 header.version_flag = false;
7977 header.packet_number = kPacketNumber;
7978
7979 QuicWindowUpdateFrame window_update_frame;
7980 window_update_frame.stream_id = kStreamId;
7981 window_update_frame.byte_offset = 0x1122334455667788;
7982
7983 QuicFrames frames = {QuicFrame(&window_update_frame)};
7984
7985 // clang-format off
7986 unsigned char packet[] = {
7987 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04007988 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05007989 // connection_id
7990 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7991 // packet number
7992 0x12, 0x34, 0x56, 0x78,
7993
7994 // frame type (window update frame)
7995 0x04,
7996 // stream id
7997 0x01, 0x02, 0x03, 0x04,
7998 // byte offset
7999 0x11, 0x22, 0x33, 0x44,
8000 0x55, 0x66, 0x77, 0x88,
8001 };
8002
QUICHE teama6ef0a62019-03-07 20:34:33 -05008003 unsigned char packet46[] = {
8004 // type (short header, 4 byte packet number)
8005 0x43,
8006 // connection_id
8007 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8008 // packet number
8009 0x12, 0x34, 0x56, 0x78,
8010
8011 // frame type (window update frame)
8012 0x04,
8013 // stream id
8014 0x01, 0x02, 0x03, 0x04,
8015 // byte offset
8016 0x11, 0x22, 0x33, 0x44,
8017 0x55, 0x66, 0x77, 0x88,
8018 };
8019
8020 unsigned char packet99[] = {
8021 // type (short header, 4 byte packet number)
8022 0x43,
8023 // connection_id
8024 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8025 // packet number
8026 0x12, 0x34, 0x56, 0x78,
8027
8028 // frame type (IETF_MAX_STREAM_DATA frame)
8029 0x11,
8030 // stream id
8031 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
8032 // byte offset
8033 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
8034 0x55, 0x66, 0x77, 0x88,
8035 };
8036 // clang-format on
8037
8038 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8039 ASSERT_TRUE(data != nullptr);
8040
8041 unsigned char* p = packet;
8042 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07008043 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008044 p = packet99;
8045 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07008046 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008047 p = packet46;
8048 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008049 }
8050
8051 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8052 data->length(), AsChars(p), p_size);
8053}
8054
8055TEST_P(QuicFramerTest, BuildMaxStreamDataPacket) {
fkastenholz305e1732019-06-18 05:01:22 -07008056 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008057 // This frame is available only in this version.
8058 return;
8059 }
QUICHE team2252b702019-05-14 23:55:14 -04008060 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008061 QuicPacketHeader header;
8062 header.destination_connection_id = FramerTestConnectionId();
8063 header.reset_flag = false;
8064 header.version_flag = false;
8065 header.packet_number = kPacketNumber;
8066
8067 QuicWindowUpdateFrame window_update_frame;
8068 window_update_frame.stream_id = kStreamId;
8069 window_update_frame.byte_offset = 0x1122334455667788;
8070
8071 QuicFrames frames = {QuicFrame(&window_update_frame)};
8072
8073 // clang-format off
8074 unsigned char packet99[] = {
8075 // type (short header, 4 byte packet number)
8076 0x43,
8077 // connection_id
8078 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8079 // packet number
8080 0x12, 0x34, 0x56, 0x78,
8081
8082 // frame type (IETF_MAX_STREAM_DATA frame)
8083 0x11,
8084 // stream id
8085 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
8086 // byte offset
8087 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
8088 0x55, 0x66, 0x77, 0x88,
8089 };
8090 // clang-format on
8091
8092 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8093 ASSERT_TRUE(data != nullptr);
8094
8095 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8096 data->length(), AsChars(packet99),
8097 QUIC_ARRAYSIZE(packet99));
8098}
8099
8100TEST_P(QuicFramerTest, BuildMaxDataPacket) {
fkastenholz305e1732019-06-18 05:01:22 -07008101 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008102 // This frame is available only in this version.
8103 return;
8104 }
QUICHE team2252b702019-05-14 23:55:14 -04008105 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008106 QuicPacketHeader header;
8107 header.destination_connection_id = FramerTestConnectionId();
8108 header.reset_flag = false;
8109 header.version_flag = false;
8110 header.packet_number = kPacketNumber;
8111
8112 QuicWindowUpdateFrame window_update_frame;
8113 window_update_frame.stream_id =
8114 QuicUtils::GetInvalidStreamId(framer_.transport_version());
8115 window_update_frame.byte_offset = 0x1122334455667788;
8116
8117 QuicFrames frames = {QuicFrame(&window_update_frame)};
8118
8119 // clang-format off
8120 unsigned char packet99[] = {
8121 // type (short header, 4 byte packet number)
8122 0x43,
8123 // connection_id
8124 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8125 // packet number
8126 0x12, 0x34, 0x56, 0x78,
8127
8128 // frame type (IETF_MAX_DATA frame)
8129 0x10,
8130 // byte offset
8131 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
8132 0x55, 0x66, 0x77, 0x88,
8133 };
8134 // clang-format on
8135
8136 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8137 ASSERT_TRUE(data != nullptr);
8138
8139 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8140 data->length(), AsChars(packet99),
8141 QUIC_ARRAYSIZE(packet99));
8142}
8143
8144TEST_P(QuicFramerTest, BuildBlockedPacket) {
QUICHE team2252b702019-05-14 23:55:14 -04008145 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008146 QuicPacketHeader header;
8147 header.destination_connection_id = FramerTestConnectionId();
8148 header.reset_flag = false;
8149 header.version_flag = false;
8150 header.packet_number = kPacketNumber;
8151
8152 QuicBlockedFrame blocked_frame;
fkastenholz305e1732019-06-18 05:01:22 -07008153 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8154 // For IETF QUIC, the stream ID must be <invalid> for the frame
QUICHE teama6ef0a62019-03-07 20:34:33 -05008155 // to be a BLOCKED frame. if it's valid, it will be a
8156 // STREAM_BLOCKED frame.
8157 blocked_frame.stream_id =
8158 QuicUtils::GetInvalidStreamId(framer_.transport_version());
8159 } else {
8160 blocked_frame.stream_id = kStreamId;
8161 }
8162 blocked_frame.offset = kStreamOffset;
8163
8164 QuicFrames frames = {QuicFrame(&blocked_frame)};
8165
8166 // clang-format off
8167 unsigned char packet[] = {
8168 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04008169 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008170 // connection_id
8171 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8172 // packet number
8173 0x12, 0x34, 0x56, 0x78,
8174
8175 // frame type (blocked frame)
8176 0x05,
8177 // stream id
8178 0x01, 0x02, 0x03, 0x04,
8179 };
8180
QUICHE teama6ef0a62019-03-07 20:34:33 -05008181 unsigned char packet46[] = {
8182 // type (short packet, 4 byte packet number)
8183 0x43,
8184 // connection_id
8185 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8186 // packet number
8187 0x12, 0x34, 0x56, 0x78,
8188
8189 // frame type (blocked frame)
8190 0x05,
8191 // stream id
8192 0x01, 0x02, 0x03, 0x04,
8193 };
8194
8195 unsigned char packet99[] = {
8196 // type (short packet, 4 byte packet number)
8197 0x43,
8198 // connection_id
8199 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8200 // packet number
8201 0x12, 0x34, 0x56, 0x78,
8202
8203 // frame type (IETF_BLOCKED frame)
8204 0x14,
8205 // Offset
8206 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
8207 };
8208 // clang-format on
8209
8210 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8211 ASSERT_TRUE(data != nullptr);
8212
8213 unsigned char* p = packet;
8214 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07008215 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008216 p = packet99;
8217 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07008218 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008219 p = packet46;
8220 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008221 }
8222
8223 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8224 data->length(), AsChars(p), p_size);
8225}
8226
8227TEST_P(QuicFramerTest, BuildPingPacket) {
QUICHE team2252b702019-05-14 23:55:14 -04008228 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008229 QuicPacketHeader header;
8230 header.destination_connection_id = FramerTestConnectionId();
8231 header.reset_flag = false;
8232 header.version_flag = false;
8233 header.packet_number = kPacketNumber;
8234
8235 QuicFrames frames = {QuicFrame(QuicPingFrame())};
8236
8237 // clang-format off
8238 unsigned char packet[] = {
8239 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04008240 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008241 // connection_id
8242 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8243 // packet number
8244 0x12, 0x34, 0x56, 0x78,
8245
8246 // frame type (ping frame)
8247 0x07,
8248 };
8249
QUICHE teama6ef0a62019-03-07 20:34:33 -05008250 unsigned char packet46[] = {
8251 // type (short header, 4 byte packet number)
8252 0x43,
8253 // connection_id
8254 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8255 // packet number
8256 0x12, 0x34, 0x56, 0x78,
8257
8258 // frame type
8259 0x07,
8260 };
8261
8262 unsigned char packet99[] = {
8263 // type (short header, 4 byte packet number)
8264 0x43,
8265 // connection_id
8266 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8267 // packet number
8268 0x12, 0x34, 0x56, 0x78,
8269
8270 // frame type (IETF_PING frame)
8271 0x01,
8272 };
8273 // clang-format on
8274
8275 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07008276 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008277 p = packet99;
fayang36825da2019-08-21 14:01:27 -07008278 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fayang374888f2019-05-31 06:47:21 -07008279 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008280 }
8281
8282 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8283 ASSERT_TRUE(data != nullptr);
8284
8285 test::CompareCharArraysWithHexError(
8286 "constructed packet", data->data(), data->length(), AsChars(p),
fayang36825da2019-08-21 14:01:27 -07008287 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46)
QUICHE teama6ef0a62019-03-07 20:34:33 -05008288 : QUIC_ARRAYSIZE(packet));
8289}
8290
8291TEST_P(QuicFramerTest, BuildMessagePacket) {
fayang36825da2019-08-21 14:01:27 -07008292 if (framer_.transport_version() <= QUIC_VERSION_43) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008293 return;
8294 }
QUICHE team2252b702019-05-14 23:55:14 -04008295 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008296 QuicPacketHeader header;
8297 header.destination_connection_id = FramerTestConnectionId();
8298 header.reset_flag = false;
8299 header.version_flag = false;
8300 header.packet_number = kPacketNumber;
8301 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
8302
wub553a9662019-03-28 20:13:23 -07008303 QuicMessageFrame frame(1, MakeSpan(&allocator_, "message", &storage));
8304 QuicMessageFrame frame2(2, MakeSpan(&allocator_, "message2", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05008305 QuicFrames frames = {QuicFrame(&frame), QuicFrame(&frame2)};
8306
8307 // clang-format off
QUICHE teama6ef0a62019-03-07 20:34:33 -05008308 unsigned char packet46[] = {
8309 // type (short header, 4 byte packet number)
8310 0x43,
8311 // connection_id
8312 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8313 // packet number
8314 0x12, 0x34, 0x56, 0x78,
8315
8316 // frame type (message frame)
8317 0x21,
8318 // Length
8319 0x07,
8320 // Message Data
8321 'm', 'e', 's', 's', 'a', 'g', 'e',
8322 // frame type (message frame no length)
8323 0x20,
8324 // Message Data
8325 'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8326 };
8327
8328 unsigned char packet99[] = {
8329 // type (short header, 4 byte packet number)
8330 0x43,
8331 // connection_id
8332 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8333 // packet number
8334 0x12, 0x34, 0x56, 0x78,
8335
8336 // frame type (IETF_MESSAGE frame)
8337 0x21,
8338 // Length
8339 0x07,
8340 // Message Data
8341 'm', 'e', 's', 's', 'a', 'g', 'e',
8342 // frame type (message frame no length)
8343 0x20,
8344 // Message Data
8345 'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8346 };
8347 // clang-format on
8348
fayang36825da2019-08-21 14:01:27 -07008349 unsigned char* p = packet46;
fkastenholz305e1732019-06-18 05:01:22 -07008350 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008351 p = packet99;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008352 }
8353
8354 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8355 ASSERT_TRUE(data != nullptr);
8356
8357 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8358 data->length(), AsChars(p),
fayang36825da2019-08-21 14:01:27 -07008359 QUIC_ARRAYSIZE(packet46));
QUICHE teama6ef0a62019-03-07 20:34:33 -05008360}
8361
8362// Test that the connectivity probing packet is serialized correctly as a
8363// padded PING packet.
8364TEST_P(QuicFramerTest, BuildConnectivityProbingPacket) {
QUICHE team2252b702019-05-14 23:55:14 -04008365 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008366 QuicPacketHeader header;
8367 header.destination_connection_id = FramerTestConnectionId();
8368 header.reset_flag = false;
8369 header.version_flag = false;
8370 header.packet_number = kPacketNumber;
8371
8372 // clang-format off
8373 unsigned char packet[] = {
8374 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04008375 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008376 // connection_id
8377 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8378 // packet number
8379 0x12, 0x34, 0x56, 0x78,
8380
8381 // frame type (ping frame)
8382 0x07,
8383 // frame type (padding frame)
8384 0x00,
8385 0x00, 0x00, 0x00, 0x00
8386 };
8387
QUICHE teama6ef0a62019-03-07 20:34:33 -05008388 unsigned char packet46[] = {
8389 // type (short header, 4 byte packet number)
8390 0x43,
8391 // connection_id
8392 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8393 // packet number
8394 0x12, 0x34, 0x56, 0x78,
8395
8396 // frame type
8397 0x07,
8398 // frame type (padding frame)
8399 0x00,
8400 0x00, 0x00, 0x00, 0x00
8401 };
8402
8403 unsigned char packet99[] = {
8404 // type (short header, 4 byte packet number)
8405 0x43,
8406 // connection_id
8407 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8408 // packet number
8409 0x12, 0x34, 0x56, 0x78,
8410
8411 // frame type (IETF_PING frame)
8412 0x01,
8413 // frame type (padding frame)
8414 0x00,
8415 0x00, 0x00, 0x00, 0x00
8416 };
8417 // clang-format on
8418
8419 unsigned char* p = packet;
8420 size_t packet_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07008421 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008422 p = packet99;
8423 packet_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07008424 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008425 p = packet46;
8426 packet_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008427 }
8428
dschinazi66dea072019-04-09 11:41:06 -07008429 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008430
8431 size_t length = framer_.BuildConnectivityProbingPacket(
QUICHE team6987b4a2019-03-15 16:23:04 -07008432 header, buffer.get(), packet_size, ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008433
8434 EXPECT_NE(0u, length);
8435 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
8436 header);
8437
8438 test::CompareCharArraysWithHexError("constructed packet", data.data(),
8439 data.length(), AsChars(p), packet_size);
8440}
8441
8442// Test that the path challenge connectivity probing packet is serialized
8443// correctly as a padded PATH CHALLENGE packet.
8444TEST_P(QuicFramerTest, BuildPaddedPathChallengePacket) {
fkastenholz305e1732019-06-18 05:01:22 -07008445 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008446 return;
8447 }
8448
8449 QuicPacketHeader header;
8450 header.destination_connection_id = FramerTestConnectionId();
8451 header.reset_flag = false;
8452 header.version_flag = false;
8453 header.packet_number = kPacketNumber;
8454 QuicPathFrameBuffer payload;
8455
8456 // clang-format off
8457 unsigned char packet[] = {
8458 // type (short header, 4 byte packet number)
8459 0x43,
8460 // connection_id
8461 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8462 // packet number
8463 0x12, 0x34, 0x56, 0x78,
8464
8465 // Path Challenge Frame type (IETF_PATH_CHALLENGE)
8466 0x1a,
8467 // 8 "random" bytes, MockRandom makes lots of r's
8468 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r',
8469 // frame type (padding frame)
8470 0x00,
8471 0x00, 0x00, 0x00, 0x00
8472 };
8473 // clang-format on
8474
dschinazi66dea072019-04-09 11:41:06 -07008475 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008476 MockRandom randomizer;
8477
8478 size_t length = framer_.BuildPaddedPathChallengePacket(
8479 header, buffer.get(), QUIC_ARRAYSIZE(packet), &payload, &randomizer,
QUICHE team6987b4a2019-03-15 16:23:04 -07008480 ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008481 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
8482
8483 // Payload has the random bytes that were generated. Copy them into packet,
8484 // above, before checking that the generated packet is correct.
8485 EXPECT_EQ(kQuicPathFrameBufferSize, payload.size());
8486
8487 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
8488 header);
8489
8490 test::CompareCharArraysWithHexError("constructed packet", data.data(),
8491 data.length(), AsChars(packet),
8492 QUIC_ARRAYSIZE(packet));
8493}
8494
8495// Several tests that the path response connectivity probing packet is
8496// serialized correctly as either a padded and unpadded PATH RESPONSE
8497// packet. Also generates packets with 1 and 3 PATH_RESPONSES in them to
8498// exercised the single- and multiple- payload cases.
8499TEST_P(QuicFramerTest, BuildPathResponsePacket1ResponseUnpadded) {
fkastenholz305e1732019-06-18 05:01:22 -07008500 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008501 return;
8502 }
8503
8504 QuicPacketHeader header;
8505 header.destination_connection_id = FramerTestConnectionId();
8506 header.reset_flag = false;
8507 header.version_flag = false;
8508 header.packet_number = kPacketNumber;
8509 QuicPathFrameBuffer payload0 = {
8510 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
8511
8512 // Build 1 PATH RESPONSE, not padded
8513 // clang-format off
8514 unsigned char packet[] = {
8515 // type (short header, 4 byte packet number)
8516 0x43,
8517 // connection_id
8518 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8519 // packet number
8520 0x12, 0x34, 0x56, 0x78,
8521
8522 // Path Response Frame type (IETF_PATH_RESPONSE)
8523 0x1b,
8524 // 8 "random" bytes
8525 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
8526 };
8527 // clang-format on
dschinazi66dea072019-04-09 11:41:06 -07008528 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008529 QuicDeque<QuicPathFrameBuffer> payloads;
8530 payloads.push_back(payload0);
8531 size_t length = framer_.BuildPathResponsePacket(
8532 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
QUICHE team6987b4a2019-03-15 16:23:04 -07008533 /*is_padded=*/false, ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008534 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
8535 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
8536 header);
8537
8538 test::CompareCharArraysWithHexError("constructed packet", data.data(),
8539 data.length(), AsChars(packet),
8540 QUIC_ARRAYSIZE(packet));
8541}
8542
8543TEST_P(QuicFramerTest, BuildPathResponsePacket1ResponsePadded) {
fkastenholz305e1732019-06-18 05:01:22 -07008544 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008545 return;
8546 }
8547
8548 QuicPacketHeader header;
8549 header.destination_connection_id = FramerTestConnectionId();
8550 header.reset_flag = false;
8551 header.version_flag = false;
8552 header.packet_number = kPacketNumber;
8553 QuicPathFrameBuffer payload0 = {
8554 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
8555
8556 // Build 1 PATH RESPONSE, padded
8557 // clang-format off
8558 unsigned char packet[] = {
8559 // type (short header, 4 byte packet number)
8560 0x43,
8561 // connection_id
8562 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8563 // packet number
8564 0x12, 0x34, 0x56, 0x78,
8565
8566 // Path Response Frame type (IETF_PATH_RESPONSE)
8567 0x1b,
8568 // 8 "random" bytes
8569 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
8570 // Padding type and pad
8571 0x00, 0x00, 0x00, 0x00, 0x00
8572 };
8573 // clang-format on
dschinazi66dea072019-04-09 11:41:06 -07008574 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008575 QuicDeque<QuicPathFrameBuffer> payloads;
8576 payloads.push_back(payload0);
8577 size_t length = framer_.BuildPathResponsePacket(
8578 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
QUICHE team6987b4a2019-03-15 16:23:04 -07008579 /*is_padded=*/true, ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008580 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
8581 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
8582 header);
8583
8584 test::CompareCharArraysWithHexError("constructed packet", data.data(),
8585 data.length(), AsChars(packet),
8586 QUIC_ARRAYSIZE(packet));
8587}
8588
8589TEST_P(QuicFramerTest, BuildPathResponsePacket3ResponsesUnpadded) {
fkastenholz305e1732019-06-18 05:01:22 -07008590 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008591 return;
8592 }
8593
8594 QuicPacketHeader header;
8595 header.destination_connection_id = FramerTestConnectionId();
8596 header.reset_flag = false;
8597 header.version_flag = false;
8598 header.packet_number = kPacketNumber;
8599 QuicPathFrameBuffer payload0 = {
8600 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
8601 QuicPathFrameBuffer payload1 = {
8602 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
8603 QuicPathFrameBuffer payload2 = {
8604 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
8605
8606 // Build one packet with 3 PATH RESPONSES, no padding
8607 // clang-format off
8608 unsigned char packet[] = {
8609 // type (short header, 4 byte packet number)
8610 0x43,
8611 // connection_id
8612 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8613 // packet number
8614 0x12, 0x34, 0x56, 0x78,
8615
8616 // 3 path response frames (IETF_PATH_RESPONSE type byte and payload)
8617 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
8618 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
8619 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
8620 };
8621 // clang-format on
8622
dschinazi66dea072019-04-09 11:41:06 -07008623 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008624 QuicDeque<QuicPathFrameBuffer> payloads;
8625 payloads.push_back(payload0);
8626 payloads.push_back(payload1);
8627 payloads.push_back(payload2);
8628 size_t length = framer_.BuildPathResponsePacket(
8629 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
QUICHE team6987b4a2019-03-15 16:23:04 -07008630 /*is_padded=*/false, ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008631 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
8632 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
8633 header);
8634
8635 test::CompareCharArraysWithHexError("constructed packet", data.data(),
8636 data.length(), AsChars(packet),
8637 QUIC_ARRAYSIZE(packet));
8638}
8639
8640TEST_P(QuicFramerTest, BuildPathResponsePacket3ResponsesPadded) {
fkastenholz305e1732019-06-18 05:01:22 -07008641 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008642 return;
8643 }
8644
8645 QuicPacketHeader header;
8646 header.destination_connection_id = FramerTestConnectionId();
8647 header.reset_flag = false;
8648 header.version_flag = false;
8649 header.packet_number = kPacketNumber;
8650 QuicPathFrameBuffer payload0 = {
8651 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
8652 QuicPathFrameBuffer payload1 = {
8653 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
8654 QuicPathFrameBuffer payload2 = {
8655 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
8656
8657 // Build one packet with 3 PATH RESPONSES, with padding
8658 // clang-format off
8659 unsigned char packet[] = {
8660 // type (short header, 4 byte packet number)
8661 0x43,
8662 // connection_id
8663 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8664 // packet number
8665 0x12, 0x34, 0x56, 0x78,
8666
8667 // 3 path response frames (IETF_PATH_RESPONSE byte and payload)
8668 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
8669 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
8670 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
8671 // Padding
8672 0x00, 0x00, 0x00, 0x00, 0x00
8673 };
8674 // clang-format on
8675
dschinazi66dea072019-04-09 11:41:06 -07008676 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008677 QuicDeque<QuicPathFrameBuffer> payloads;
8678 payloads.push_back(payload0);
8679 payloads.push_back(payload1);
8680 payloads.push_back(payload2);
8681 size_t length = framer_.BuildPathResponsePacket(
8682 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
QUICHE team6987b4a2019-03-15 16:23:04 -07008683 /*is_padded=*/true, ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008684 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
8685 QuicPacket data(framer_.transport_version(), buffer.release(), length, true,
8686 header);
8687
8688 test::CompareCharArraysWithHexError("constructed packet", data.data(),
8689 data.length(), AsChars(packet),
8690 QUIC_ARRAYSIZE(packet));
8691}
8692
8693// Test that the MTU discovery packet is serialized correctly as a PING packet.
8694TEST_P(QuicFramerTest, BuildMtuDiscoveryPacket) {
QUICHE team2252b702019-05-14 23:55:14 -04008695 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008696 QuicPacketHeader header;
8697 header.destination_connection_id = FramerTestConnectionId();
8698 header.reset_flag = false;
8699 header.version_flag = false;
8700 header.packet_number = kPacketNumber;
8701
8702 QuicFrames frames = {QuicFrame(QuicMtuDiscoveryFrame())};
8703
8704 // clang-format off
8705 unsigned char packet[] = {
8706 // public flags (8 byte connection_id)
QUICHE team2252b702019-05-14 23:55:14 -04008707 0x2C,
QUICHE teama6ef0a62019-03-07 20:34:33 -05008708 // connection_id
8709 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8710 // packet number
8711 0x12, 0x34, 0x56, 0x78,
8712
8713 // frame type (ping frame)
8714 0x07,
8715 };
8716
QUICHE teama6ef0a62019-03-07 20:34:33 -05008717 unsigned char packet46[] = {
8718 // type (short header, 4 byte packet number)
8719 0x43,
8720 // connection_id
8721 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8722 // packet number
8723 0x12, 0x34, 0x56, 0x78,
8724
8725 // frame type
8726 0x07,
8727 };
8728
8729 unsigned char packet99[] = {
8730 // type (short header, 4 byte packet number)
8731 0x43,
8732 // connection_id
8733 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8734 // packet number
8735 0x12, 0x34, 0x56, 0x78,
8736
8737 // frame type (IETF_PING frame)
8738 0x01,
8739 };
8740 // clang-format on
8741
8742 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8743 ASSERT_TRUE(data != nullptr);
8744
8745 unsigned char* p = packet;
fkastenholz305e1732019-06-18 05:01:22 -07008746 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008747 p = packet99;
fayang36825da2019-08-21 14:01:27 -07008748 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fayang374888f2019-05-31 06:47:21 -07008749 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05008750 }
8751
8752 test::CompareCharArraysWithHexError(
8753 "constructed packet", data->data(), data->length(), AsChars(p),
fayang36825da2019-08-21 14:01:27 -07008754 framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46)
QUICHE teama6ef0a62019-03-07 20:34:33 -05008755 : QUIC_ARRAYSIZE(packet));
8756}
8757
8758TEST_P(QuicFramerTest, BuildPublicResetPacket) {
8759 QuicPublicResetPacket reset_packet;
8760 reset_packet.connection_id = FramerTestConnectionId();
8761 reset_packet.nonce_proof = kNonceProof;
8762
8763 // clang-format off
8764 unsigned char packet[] = {
8765 // public flags (public reset, 8 byte ConnectionId)
8766 0x0E,
8767 // connection_id
8768 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8769 // message tag (kPRST)
8770 'P', 'R', 'S', 'T',
8771 // num_entries (1) + padding
8772 0x01, 0x00, 0x00, 0x00,
8773 // tag kRNON
8774 'R', 'N', 'O', 'N',
8775 // end offset 8
8776 0x08, 0x00, 0x00, 0x00,
8777 // nonce proof
8778 0x89, 0x67, 0x45, 0x23,
8779 0x01, 0xEF, 0xCD, 0xAB,
8780 };
8781 // clang-format on
8782
8783 if (framer_.transport_version() > QUIC_VERSION_43) {
8784 return;
8785 }
8786
8787 std::unique_ptr<QuicEncryptedPacket> data(
8788 framer_.BuildPublicResetPacket(reset_packet));
8789 ASSERT_TRUE(data != nullptr);
8790 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8791 data->length(), AsChars(packet),
8792 QUIC_ARRAYSIZE(packet));
8793}
8794
8795TEST_P(QuicFramerTest, BuildPublicResetPacketWithClientAddress) {
8796 QuicPublicResetPacket reset_packet;
8797 reset_packet.connection_id = FramerTestConnectionId();
8798 reset_packet.nonce_proof = kNonceProof;
8799 reset_packet.client_address =
8800 QuicSocketAddress(QuicIpAddress::Loopback4(), 0x1234);
8801
8802 // clang-format off
8803 unsigned char packet[] = {
8804 // public flags (public reset, 8 byte ConnectionId)
8805 0x0E,
8806 // connection_id
8807 0xFE, 0xDC, 0xBA, 0x98,
8808 0x76, 0x54, 0x32, 0x10,
8809 // message tag (kPRST)
8810 'P', 'R', 'S', 'T',
8811 // num_entries (2) + padding
8812 0x02, 0x00, 0x00, 0x00,
8813 // tag kRNON
8814 'R', 'N', 'O', 'N',
8815 // end offset 8
8816 0x08, 0x00, 0x00, 0x00,
8817 // tag kCADR
8818 'C', 'A', 'D', 'R',
8819 // end offset 16
8820 0x10, 0x00, 0x00, 0x00,
8821 // nonce proof
8822 0x89, 0x67, 0x45, 0x23,
8823 0x01, 0xEF, 0xCD, 0xAB,
8824 // client address
8825 0x02, 0x00,
8826 0x7F, 0x00, 0x00, 0x01,
8827 0x34, 0x12,
8828 };
8829 // clang-format on
8830
8831 if (framer_.transport_version() > QUIC_VERSION_43) {
8832 return;
8833 }
8834
8835 std::unique_ptr<QuicEncryptedPacket> data(
8836 framer_.BuildPublicResetPacket(reset_packet));
8837 ASSERT_TRUE(data != nullptr);
8838
8839 test::CompareCharArraysWithHexError("constructed packet", data->data(),
8840 data->length(), AsChars(packet),
8841 QUIC_ARRAYSIZE(packet));
8842}
8843
8844TEST_P(QuicFramerTest, BuildPublicResetPacketWithEndpointId) {
8845 QuicPublicResetPacket reset_packet;
8846 reset_packet.connection_id = FramerTestConnectionId();
8847 reset_packet.nonce_proof = kNonceProof;
8848 reset_packet.endpoint_id = "FakeServerId";
8849
8850 // The tag value map in CryptoHandshakeMessage is a std::map, so the two tags
8851 // in the packet, kRNON and kEPID, have unspecified ordering w.r.t each other.
8852 // clang-format off
8853 unsigned char packet_variant1[] = {
8854 // public flags (public reset, 8 byte ConnectionId)
8855 0x0E,
8856 // connection_id
8857 0xFE, 0xDC, 0xBA, 0x98,
8858 0x76, 0x54, 0x32, 0x10,
8859 // message tag (kPRST)
8860 'P', 'R', 'S', 'T',
8861 // num_entries (2) + padding
8862 0x02, 0x00, 0x00, 0x00,
8863 // tag kRNON
8864 'R', 'N', 'O', 'N',
8865 // end offset 8
8866 0x08, 0x00, 0x00, 0x00,
8867 // tag kEPID
8868 'E', 'P', 'I', 'D',
8869 // end offset 20
8870 0x14, 0x00, 0x00, 0x00,
8871 // nonce proof
8872 0x89, 0x67, 0x45, 0x23,
8873 0x01, 0xEF, 0xCD, 0xAB,
8874 // Endpoint ID
8875 'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
8876 };
8877 unsigned char packet_variant2[] = {
8878 // public flags (public reset, 8 byte ConnectionId)
8879 0x0E,
8880 // connection_id
8881 0xFE, 0xDC, 0xBA, 0x98,
8882 0x76, 0x54, 0x32, 0x10,
8883 // message tag (kPRST)
8884 'P', 'R', 'S', 'T',
8885 // num_entries (2) + padding
8886 0x02, 0x00, 0x00, 0x00,
8887 // tag kEPID
8888 'E', 'P', 'I', 'D',
8889 // end offset 12
8890 0x0C, 0x00, 0x00, 0x00,
8891 // tag kRNON
8892 'R', 'N', 'O', 'N',
8893 // end offset 20
8894 0x14, 0x00, 0x00, 0x00,
8895 // Endpoint ID
8896 'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
8897 // nonce proof
8898 0x89, 0x67, 0x45, 0x23,
8899 0x01, 0xEF, 0xCD, 0xAB,
8900 };
8901 // clang-format on
8902
8903 if (framer_.transport_version() > QUIC_VERSION_43) {
8904 return;
8905 }
8906
8907 std::unique_ptr<QuicEncryptedPacket> data(
8908 framer_.BuildPublicResetPacket(reset_packet));
8909 ASSERT_TRUE(data != nullptr);
8910
8911 // Variant 1 ends with char 'd'. Variant 1 ends with char 0xAB.
8912 if ('d' == data->data()[data->length() - 1]) {
8913 test::CompareCharArraysWithHexError(
8914 "constructed packet", data->data(), data->length(),
8915 AsChars(packet_variant1), QUIC_ARRAYSIZE(packet_variant1));
8916 } else {
8917 test::CompareCharArraysWithHexError(
8918 "constructed packet", data->data(), data->length(),
8919 AsChars(packet_variant2), QUIC_ARRAYSIZE(packet_variant2));
8920 }
8921}
8922
8923TEST_P(QuicFramerTest, BuildIetfStatelessResetPacket) {
8924 // clang-format off
fayang36825da2019-08-21 14:01:27 -07008925 unsigned char packet[] = {
QUICHE teama6ef0a62019-03-07 20:34:33 -05008926 // type (short header, 1 byte packet number)
8927 0x70,
8928 // random packet number
8929 0xFE,
8930 // stateless reset token
8931 0xB5, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
8932 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8933 };
8934 // clang-format on
8935
8936 std::unique_ptr<QuicEncryptedPacket> data(
8937 framer_.BuildIetfStatelessResetPacket(FramerTestConnectionId(),
8938 kTestStatelessResetToken));
8939 ASSERT_TRUE(data != nullptr);
8940 // Skip packet number byte which is random in stateless reset packet.
8941 test::CompareCharArraysWithHexError("constructed packet", data->data(), 1,
fayang36825da2019-08-21 14:01:27 -07008942 AsChars(packet), 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05008943 const size_t random_bytes_length =
8944 data->length() - kPacketHeaderTypeSize - sizeof(kTestStatelessResetToken);
8945 EXPECT_EQ(kMinRandomBytesLengthInStatelessReset, random_bytes_length);
8946 // Verify stateless reset token is correct.
8947 test::CompareCharArraysWithHexError(
8948 "constructed packet",
8949 data->data() + data->length() - sizeof(kTestStatelessResetToken),
8950 sizeof(kTestStatelessResetToken),
fayang36825da2019-08-21 14:01:27 -07008951 AsChars(packet) + QUIC_ARRAYSIZE(packet) -
QUICHE teama6ef0a62019-03-07 20:34:33 -05008952 sizeof(kTestStatelessResetToken),
8953 sizeof(kTestStatelessResetToken));
8954}
8955
8956TEST_P(QuicFramerTest, EncryptPacket) {
8957 QuicPacketNumber packet_number = kPacketNumber;
8958 // clang-format off
8959 unsigned char packet[] = {
8960 // public flags (8 byte connection_id)
8961 0x28,
8962 // connection_id
8963 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8964 // packet number
8965 0x12, 0x34, 0x56, 0x78,
8966
8967 // redundancy
8968 'a', 'b', 'c', 'd',
8969 'e', 'f', 'g', 'h',
8970 'i', 'j', 'k', 'l',
8971 'm', 'n', 'o', 'p',
8972 };
8973
QUICHE teama6ef0a62019-03-07 20:34:33 -05008974 unsigned char packet46[] = {
8975 // type (short header, 4 byte packet number)
8976 0x43,
8977 // connection_id
8978 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8979 // packet number
8980 0x12, 0x34, 0x56, 0x78,
8981
8982 // redundancy
8983 'a', 'b', 'c', 'd',
8984 'e', 'f', 'g', 'h',
8985 'i', 'j', 'k', 'l',
8986 'm', 'n', 'o', 'p',
8987 };
8988
8989 unsigned char packet99[] = {
8990 // type (short header, 4 byte packet number)
8991 0x43,
8992 // connection_id
8993 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8994 // packet number
8995 0x12, 0x34, 0x56, 0x78,
8996
8997 // redundancy
8998 'a', 'b', 'c', 'd',
8999 'e', 'f', 'g', 'h',
9000 'i', 'j', 'k', 'l',
9001 'm', 'n', 'o', 'p',
nharper55fa6132019-05-07 19:37:21 -07009002 'q', 'r', 's', 't',
QUICHE teama6ef0a62019-03-07 20:34:33 -05009003 };
9004 // clang-format on
9005
9006 unsigned char* p = packet;
nharper55fa6132019-05-07 19:37:21 -07009007 size_t p_size = QUIC_ARRAYSIZE(packet);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009008 if (framer_.transport_version() == QUIC_VERSION_99) {
9009 p = packet99;
nharper55fa6132019-05-07 19:37:21 -07009010 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07009011 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fayang374888f2019-05-31 06:47:21 -07009012 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -05009013 }
9014
9015 std::unique_ptr<QuicPacket> raw(new QuicPacket(
nharper55fa6132019-05-07 19:37:21 -07009016 AsChars(p), p_size, false, PACKET_8BYTE_CONNECTION_ID,
QUICHE teama6ef0a62019-03-07 20:34:33 -05009017 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
9018 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
9019 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0));
dschinazi66dea072019-04-09 11:41:06 -07009020 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009021 size_t encrypted_length = framer_.EncryptPayload(
dschinazi66dea072019-04-09 11:41:06 -07009022 ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009023
9024 ASSERT_NE(0u, encrypted_length);
9025 EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
9026}
9027
9028TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) {
nharper55fa6132019-05-07 19:37:21 -07009029 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009030 QuicPacketNumber packet_number = kPacketNumber;
9031 // clang-format off
9032 unsigned char packet[] = {
9033 // public flags (version, 8 byte connection_id)
9034 0x29,
9035 // connection_id
9036 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9037 // version tag
9038 'Q', '.', '1', '0',
9039 // packet number
9040 0x12, 0x34, 0x56, 0x78,
9041
9042 // redundancy
9043 'a', 'b', 'c', 'd',
9044 'e', 'f', 'g', 'h',
9045 'i', 'j', 'k', 'l',
9046 'm', 'n', 'o', 'p',
9047 };
9048
QUICHE teama6ef0a62019-03-07 20:34:33 -05009049 unsigned char packet46[] = {
9050 // type (long header with packet type ZERO_RTT_PROTECTED)
9051 0xD3,
9052 // version tag
9053 'Q', '.', '1', '0',
9054 // connection_id length
9055 0x50,
9056 // connection_id
9057 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9058 // packet number
9059 0x12, 0x34, 0x56, 0x78,
9060
9061 // redundancy
9062 'a', 'b', 'c', 'd',
9063 'e', 'f', 'g', 'h',
9064 'i', 'j', 'k', 'l',
9065 'm', 'n', 'o', 'p',
9066 };
9067
9068 unsigned char packet99[] = {
9069 // type (long header with packet type ZERO_RTT_PROTECTED)
9070 0xD3,
9071 // version tag
9072 'Q', '.', '1', '0',
dschinazi48ac9192019-07-31 00:07:26 -07009073 // destination connection ID length
9074 0x08,
9075 // destination connection ID
QUICHE teama6ef0a62019-03-07 20:34:33 -05009076 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -07009077 // source connection ID length
9078 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -05009079 // packet number
9080 0x12, 0x34, 0x56, 0x78,
9081
9082 // redundancy
9083 'a', 'b', 'c', 'd',
9084 'e', 'f', 'g', 'h',
9085 'i', 'j', 'k', 'l',
9086 'm', 'n', 'o', 'p',
nharper55fa6132019-05-07 19:37:21 -07009087 'q', 'r', 's', 't',
QUICHE teama6ef0a62019-03-07 20:34:33 -05009088 };
9089 // clang-format on
9090
9091 unsigned char* p = packet;
nharper55fa6132019-05-07 19:37:21 -07009092 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07009093 // TODO(ianswett): see todo in previous test.
QUICHE teama6ef0a62019-03-07 20:34:33 -05009094 if (framer_.transport_version() == QUIC_VERSION_99) {
9095 p = packet99;
nharper55fa6132019-05-07 19:37:21 -07009096 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07009097 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009098 p = packet46;
nharper55fa6132019-05-07 19:37:21 -07009099 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009100 }
9101
9102 std::unique_ptr<QuicPacket> raw(new QuicPacket(
nharper55fa6132019-05-07 19:37:21 -07009103 AsChars(p), p_size, false, PACKET_8BYTE_CONNECTION_ID,
9104 PACKET_0BYTE_CONNECTION_ID, kIncludeVersion,
9105 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
9106 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0));
dschinazi66dea072019-04-09 11:41:06 -07009107 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009108 size_t encrypted_length = framer_.EncryptPayload(
dschinazi66dea072019-04-09 11:41:06 -07009109 ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009110
9111 ASSERT_NE(0u, encrypted_length);
9112 EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
9113}
9114
9115TEST_P(QuicFramerTest, AckTruncationLargePacket) {
fkastenholz305e1732019-06-18 05:01:22 -07009116 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009117 // This test is not applicable to this version; the range count is
9118 // effectively unlimited
9119 return;
9120 }
nharper9bb83462019-05-01 10:53:22 -07009121 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009122
9123 QuicPacketHeader header;
9124 header.destination_connection_id = FramerTestConnectionId();
9125 header.reset_flag = false;
9126 header.version_flag = false;
9127 header.packet_number = kPacketNumber;
9128
9129 QuicAckFrame ack_frame;
9130 // Create a packet with just the ack.
9131 ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
9132 QuicFrames frames = {QuicFrame(&ack_frame)};
9133
9134 // Build an ack packet with truncation due to limit in number of nack ranges.
9135 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9136 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
9137 ASSERT_TRUE(raw_ack_packet != nullptr);
dschinazi66dea072019-04-09 11:41:06 -07009138 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009139 size_t encrypted_length =
QUICHE team6987b4a2019-03-15 16:23:04 -07009140 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
dschinazi66dea072019-04-09 11:41:06 -07009141 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009142 ASSERT_NE(0u, encrypted_length);
9143 // Now make sure we can turn our ack packet back into an ack frame.
9144 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
9145 ASSERT_TRUE(framer_.ProcessPacket(
9146 QuicEncryptedPacket(buffer, encrypted_length, false)));
9147 ASSERT_EQ(1u, visitor_.ack_frames_.size());
9148 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
9149 EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
9150 ASSERT_EQ(256u, processed_ack_frame.packets.NumPacketsSlow());
9151 EXPECT_EQ(QuicPacketNumber(90u), processed_ack_frame.packets.Min());
9152 EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
9153}
9154
9155TEST_P(QuicFramerTest, AckTruncationSmallPacket) {
fkastenholz305e1732019-06-18 05:01:22 -07009156 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009157 // This test is not applicable to this version; the range count is
9158 // effectively unlimited
9159 return;
9160 }
nharper9bb83462019-05-01 10:53:22 -07009161 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009162
9163 QuicPacketHeader header;
9164 header.destination_connection_id = FramerTestConnectionId();
9165 header.reset_flag = false;
9166 header.version_flag = false;
9167 header.packet_number = kPacketNumber;
9168
9169 // Create a packet with just the ack.
9170 QuicAckFrame ack_frame;
9171 ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
9172 QuicFrames frames = {QuicFrame(&ack_frame)};
9173
9174 // Build an ack packet with truncation due to limit in number of nack ranges.
9175 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9176 std::unique_ptr<QuicPacket> raw_ack_packet(
9177 BuildDataPacket(header, frames, 500));
9178 ASSERT_TRUE(raw_ack_packet != nullptr);
dschinazi66dea072019-04-09 11:41:06 -07009179 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009180 size_t encrypted_length =
QUICHE team6987b4a2019-03-15 16:23:04 -07009181 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
dschinazi66dea072019-04-09 11:41:06 -07009182 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009183 ASSERT_NE(0u, encrypted_length);
9184 // Now make sure we can turn our ack packet back into an ack frame.
9185 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
9186 ASSERT_TRUE(framer_.ProcessPacket(
9187 QuicEncryptedPacket(buffer, encrypted_length, false)));
9188 ASSERT_EQ(1u, visitor_.ack_frames_.size());
9189 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
9190 EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
9191 ASSERT_EQ(240u, processed_ack_frame.packets.NumPacketsSlow());
9192 EXPECT_EQ(QuicPacketNumber(122u), processed_ack_frame.packets.Min());
9193 EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
9194}
9195
9196TEST_P(QuicFramerTest, CleanTruncation) {
fkastenholz305e1732019-06-18 05:01:22 -07009197 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009198 // This test is not applicable to this version; the range count is
9199 // effectively unlimited
9200 return;
9201 }
nharper9bb83462019-05-01 10:53:22 -07009202 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009203
9204 QuicPacketHeader header;
9205 header.destination_connection_id = FramerTestConnectionId();
9206 header.reset_flag = false;
9207 header.version_flag = false;
9208 header.packet_number = kPacketNumber;
9209
9210 QuicAckFrame ack_frame = InitAckFrame(201);
9211
9212 // Create a packet with just the ack.
9213 QuicFrames frames = {QuicFrame(&ack_frame)};
9214 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9215 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
9216 ASSERT_TRUE(raw_ack_packet != nullptr);
9217
dschinazi66dea072019-04-09 11:41:06 -07009218 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05009219 size_t encrypted_length =
QUICHE team6987b4a2019-03-15 16:23:04 -07009220 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
dschinazi66dea072019-04-09 11:41:06 -07009221 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009222 ASSERT_NE(0u, encrypted_length);
9223
9224 // Now make sure we can turn our ack packet back into an ack frame.
9225 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
9226 ASSERT_TRUE(framer_.ProcessPacket(
9227 QuicEncryptedPacket(buffer, encrypted_length, false)));
9228
9229 // Test for clean truncation of the ack by comparing the length of the
9230 // original packets to the re-serialized packets.
9231 frames.clear();
9232 frames.push_back(QuicFrame(visitor_.ack_frames_[0].get()));
9233
9234 size_t original_raw_length = raw_ack_packet->length();
9235 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9236 raw_ack_packet = BuildDataPacket(header, frames);
9237 ASSERT_TRUE(raw_ack_packet != nullptr);
9238 EXPECT_EQ(original_raw_length, raw_ack_packet->length());
9239 ASSERT_TRUE(raw_ack_packet != nullptr);
9240}
9241
9242TEST_P(QuicFramerTest, StopPacketProcessing) {
zhongyi546cc452019-04-12 15:27:49 -07009243 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009244 // clang-format off
9245 unsigned char packet[] = {
9246 // public flags (8 byte connection_id)
9247 0x28,
9248 // connection_id
9249 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9250 // packet number
9251 0x12, 0x34, 0x56, 0x78,
9252
9253 // frame type (stream frame with fin)
9254 0xFF,
9255 // stream id
9256 0x01, 0x02, 0x03, 0x04,
9257 // offset
9258 0x3A, 0x98, 0xFE, 0xDC,
9259 0x32, 0x10, 0x76, 0x54,
9260 // data length
9261 0x00, 0x0c,
9262 // data
9263 'h', 'e', 'l', 'l',
9264 'o', ' ', 'w', 'o',
9265 'r', 'l', 'd', '!',
9266
9267 // frame type (ack frame)
9268 0x40,
9269 // least packet number awaiting an ack
9270 0x12, 0x34, 0x56, 0x78,
9271 0x9A, 0xA0,
9272 // largest observed packet number
9273 0x12, 0x34, 0x56, 0x78,
9274 0x9A, 0xBF,
9275 // num missing packets
9276 0x01,
9277 // missing packet
9278 0x12, 0x34, 0x56, 0x78,
9279 0x9A, 0xBE,
9280 };
9281
QUICHE teama6ef0a62019-03-07 20:34:33 -05009282 unsigned char packet46[] = {
9283 // type (short header, 4 byte packet number)
9284 0x43,
9285 // connection_id
9286 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9287 // packet number
9288 0x12, 0x34, 0x56, 0x78,
9289
9290 // frame type (stream frame with fin)
9291 0xFF,
9292 // stream id
9293 0x01, 0x02, 0x03, 0x04,
9294 // offset
9295 0x3A, 0x98, 0xFE, 0xDC,
9296 0x32, 0x10, 0x76, 0x54,
9297 // data length
9298 0x00, 0x0c,
9299 // data
9300 'h', 'e', 'l', 'l',
9301 'o', ' ', 'w', 'o',
9302 'r', 'l', 'd', '!',
9303
9304 // frame type (ack frame)
9305 0x40,
9306 // least packet number awaiting an ack
9307 0x12, 0x34, 0x56, 0x78,
9308 0x9A, 0xA0,
9309 // largest observed packet number
9310 0x12, 0x34, 0x56, 0x78,
9311 0x9A, 0xBF,
9312 // num missing packets
9313 0x01,
9314 // missing packet
9315 0x12, 0x34, 0x56, 0x78,
9316 0x9A, 0xBE,
9317 };
9318
9319 unsigned char packet99[] = {
9320 // type (short header, 4 byte packet number)
9321 0x43,
9322 // connection_id
9323 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9324 // packet number
9325 0x12, 0x34, 0x56, 0x78,
9326
9327 // frame type (IETF_STREAM frame with fin, length, and offset bits set)
9328 0x08 | 0x01 | 0x02 | 0x04,
9329 // stream id
9330 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
9331 // offset
9332 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
9333 0x32, 0x10, 0x76, 0x54,
9334 // data length
9335 kVarInt62TwoBytes + 0x00, 0x0c,
9336 // data
9337 'h', 'e', 'l', 'l',
9338 'o', ' ', 'w', 'o',
9339 'r', 'l', 'd', '!',
9340
9341 // frame type (ack frame)
9342 0x0d,
9343 // largest observed packet number
9344 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
9345 // Delta time
9346 kVarInt62OneByte + 0x00,
9347 // Ack Block count
9348 kVarInt62OneByte + 0x01,
9349 // First block size (one packet)
9350 kVarInt62OneByte + 0x00,
9351
9352 // Next gap size & ack. Missing all preceding packets
9353 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
9354 kVarInt62OneByte + 0x00,
9355 };
9356 // clang-format on
9357
9358 MockFramerVisitor visitor;
9359 framer_.set_visitor(&visitor);
9360 EXPECT_CALL(visitor, OnPacket());
9361 EXPECT_CALL(visitor, OnPacketHeader(_));
9362 EXPECT_CALL(visitor, OnStreamFrame(_)).WillOnce(Return(false));
9363 EXPECT_CALL(visitor, OnPacketComplete());
9364 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true));
9365 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_)).WillOnce(Return(true));
9366 EXPECT_CALL(visitor, OnDecryptedPacket(_));
9367
9368 unsigned char* p = packet;
9369 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -07009370 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009371 p = packet99;
9372 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -07009373 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009374 p = packet46;
9375 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009376 }
9377 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
9378 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9379 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
9380}
9381
9382static char kTestString[] = "At least 20 characters.";
9383static QuicStreamId kTestQuicStreamId = 1;
9384static bool ExpectedStreamFrame(const QuicStreamFrame& frame) {
9385 return (frame.stream_id == kTestQuicStreamId ||
nharper46833c32019-05-15 21:33:05 -07009386 QuicUtils::IsCryptoStreamId(QUIC_VERSION_99, frame.stream_id)) &&
QUICHE teama6ef0a62019-03-07 20:34:33 -05009387 !frame.fin && frame.offset == 0 &&
vasilvvc48c8712019-03-11 13:38:16 -07009388 std::string(frame.data_buffer, frame.data_length) == kTestString;
QUICHE teama6ef0a62019-03-07 20:34:33 -05009389 // FIN is hard-coded false in ConstructEncryptedPacket.
9390 // Offset 0 is hard-coded in ConstructEncryptedPacket.
9391}
9392
9393// Verify that the packet returned by ConstructEncryptedPacket() can be properly
9394// parsed by the framer.
9395TEST_P(QuicFramerTest, ConstructEncryptedPacket) {
9396 // Since we are using ConstructEncryptedPacket, we have to set the framer's
9397 // crypto to be Null.
zhongyi546cc452019-04-12 15:27:49 -07009398 if (framer_.version().KnowsWhichDecrypterToUse()) {
9399 framer_.InstallDecrypter(
9400 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -07009401 std::make_unique<NullDecrypter>(framer_.perspective()));
zhongyi546cc452019-04-12 15:27:49 -07009402 } else {
vasilvv0fc587f2019-09-06 13:33:08 -07009403 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
9404 framer_.perspective()));
zhongyi546cc452019-04-12 15:27:49 -07009405 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05009406 ParsedQuicVersionVector versions;
9407 versions.push_back(framer_.version());
9408 std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket(
9409 TestConnectionId(), EmptyQuicConnectionId(), false, false,
9410 kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
9411 CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, &versions));
9412
9413 MockFramerVisitor visitor;
9414 framer_.set_visitor(&visitor);
9415 EXPECT_CALL(visitor, OnPacket()).Times(1);
9416 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
9417 .Times(1)
9418 .WillOnce(Return(true));
9419 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
9420 .Times(1)
9421 .WillOnce(Return(true));
9422 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1).WillOnce(Return(true));
9423 EXPECT_CALL(visitor, OnDecryptedPacket(_)).Times(1);
9424 EXPECT_CALL(visitor, OnError(_)).Times(0);
9425 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
QUICHE teamea740082019-03-11 17:58:43 -07009426 if (!QuicVersionUsesCryptoFrames(framer_.version().transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009427 EXPECT_CALL(visitor, OnStreamFrame(Truly(ExpectedStreamFrame))).Times(1);
9428 } else {
9429 EXPECT_CALL(visitor, OnCryptoFrame(_)).Times(1);
9430 }
9431 EXPECT_CALL(visitor, OnPacketComplete()).Times(1);
9432
9433 EXPECT_TRUE(framer_.ProcessPacket(*packet));
9434 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
9435}
9436
9437// Verify that the packet returned by ConstructMisFramedEncryptedPacket()
9438// does cause the framer to return an error.
9439TEST_P(QuicFramerTest, ConstructMisFramedEncryptedPacket) {
9440 // Since we are using ConstructEncryptedPacket, we have to set the framer's
9441 // crypto to be Null.
zhongyi546cc452019-04-12 15:27:49 -07009442 if (framer_.version().KnowsWhichDecrypterToUse()) {
nharper9bb83462019-05-01 10:53:22 -07009443 framer_.InstallDecrypter(
9444 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -07009445 std::make_unique<NullDecrypter>(framer_.perspective()));
zhongyi546cc452019-04-12 15:27:49 -07009446 } else {
vasilvv0fc587f2019-09-06 13:33:08 -07009447 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
9448 framer_.perspective()));
zhongyi546cc452019-04-12 15:27:49 -07009449 }
QUICHE team6987b4a2019-03-15 16:23:04 -07009450 framer_.SetEncrypter(ENCRYPTION_INITIAL,
vasilvv0fc587f2019-09-06 13:33:08 -07009451 std::make_unique<NullEncrypter>(framer_.perspective()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05009452 ParsedQuicVersionVector versions;
9453 versions.push_back(framer_.version());
9454 std::unique_ptr<QuicEncryptedPacket> packet(ConstructMisFramedEncryptedPacket(
9455 TestConnectionId(), EmptyQuicConnectionId(), false, false,
9456 kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
9457 CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, &versions,
9458 Perspective::IS_CLIENT));
9459
9460 MockFramerVisitor visitor;
9461 framer_.set_visitor(&visitor);
9462 EXPECT_CALL(visitor, OnPacket()).Times(1);
9463 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
9464 .Times(1)
9465 .WillOnce(Return(true));
9466 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
9467 .Times(1)
9468 .WillOnce(Return(true));
9469 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1);
9470 EXPECT_CALL(visitor, OnDecryptedPacket(_)).Times(1);
9471 EXPECT_CALL(visitor, OnError(_)).Times(1);
9472 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
9473 EXPECT_CALL(visitor, OnPacketComplete()).Times(0);
9474
9475 EXPECT_FALSE(framer_.ProcessPacket(*packet));
9476 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
9477}
9478
QUICHE teama6ef0a62019-03-07 20:34:33 -05009479TEST_P(QuicFramerTest, IetfBlockedFrame) {
9480 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -07009481 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009482 return;
9483 }
zhongyi546cc452019-04-12 15:27:49 -07009484 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009485
9486 // clang-format off
9487 PacketFragments packet99 = {
9488 // type (short header, 4 byte packet number)
9489 {"",
9490 {0x43}},
9491 // connection_id
9492 {"",
9493 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9494 // packet number
9495 {"",
9496 {0x12, 0x34, 0x9A, 0xBC}},
9497 // frame type (IETF_BLOCKED)
9498 {"",
9499 {0x14}},
9500 // blocked offset
9501 {"Can not read blocked offset.",
9502 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
9503 };
9504 // clang-format on
9505
9506 std::unique_ptr<QuicEncryptedPacket> encrypted(
9507 AssemblePacketFromFragments(packet99));
9508 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9509
9510 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
9511 ASSERT_TRUE(visitor_.header_.get());
9512 EXPECT_TRUE(CheckDecryption(
9513 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9514 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9515
9516 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
9517
9518 CheckFramingBoundaries(packet99, QUIC_INVALID_BLOCKED_DATA);
9519}
9520
9521TEST_P(QuicFramerTest, BuildIetfBlockedPacket) {
9522 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -07009523 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009524 return;
9525 }
9526
9527 QuicPacketHeader header;
9528 header.destination_connection_id = FramerTestConnectionId();
9529 header.reset_flag = false;
9530 header.version_flag = false;
9531 header.packet_number = kPacketNumber;
9532
9533 QuicBlockedFrame frame;
9534 frame.stream_id = QuicUtils::GetInvalidStreamId(framer_.transport_version());
9535 frame.offset = kStreamOffset;
9536 QuicFrames frames = {QuicFrame(&frame)};
9537
9538 // clang-format off
9539 unsigned char packet99[] = {
9540 // type (short header, 4 byte packet number)
9541 0x43,
9542 // connection_id
9543 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9544 // packet number
9545 0x12, 0x34, 0x56, 0x78,
9546
9547 // frame type (IETF_BLOCKED)
9548 0x14,
9549 // Offset
9550 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
9551 };
9552 // clang-format on
9553
9554 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9555 ASSERT_TRUE(data != nullptr);
9556
9557 test::CompareCharArraysWithHexError("constructed packet", data->data(),
9558 data->length(), AsChars(packet99),
9559 QUIC_ARRAYSIZE(packet99));
9560}
9561
9562TEST_P(QuicFramerTest, IetfStreamBlockedFrame) {
9563 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -07009564 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009565 return;
9566 }
zhongyi546cc452019-04-12 15:27:49 -07009567 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009568
9569 // clang-format off
9570 PacketFragments packet99 = {
9571 // type (short header, 4 byte packet number)
9572 {"",
9573 {0x43}},
9574 // connection_id
9575 {"",
9576 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9577 // packet number
9578 {"",
9579 {0x12, 0x34, 0x9A, 0xBC}},
9580 // frame type (IETF_STREAM_BLOCKED)
9581 {"",
9582 {0x15}},
9583 // blocked offset
9584 {"Can not read stream blocked stream id.",
9585 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
9586 {"Can not read stream blocked offset.",
9587 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
9588 };
9589 // clang-format on
9590
9591 std::unique_ptr<QuicEncryptedPacket> encrypted(
9592 AssemblePacketFromFragments(packet99));
9593 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9594
9595 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
9596 ASSERT_TRUE(visitor_.header_.get());
9597 EXPECT_TRUE(CheckDecryption(
9598 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9599 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9600
9601 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
9602 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
9603
9604 CheckFramingBoundaries(packet99, QUIC_INVALID_STREAM_BLOCKED_DATA);
9605}
9606
9607TEST_P(QuicFramerTest, BuildIetfStreamBlockedPacket) {
9608 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -07009609 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009610 return;
9611 }
9612
9613 QuicPacketHeader header;
9614 header.destination_connection_id = FramerTestConnectionId();
9615 header.reset_flag = false;
9616 header.version_flag = false;
9617 header.packet_number = kPacketNumber;
9618
9619 QuicBlockedFrame frame;
9620 frame.stream_id = kStreamId;
9621 frame.offset = kStreamOffset;
9622 QuicFrames frames = {QuicFrame(&frame)};
9623
9624 // clang-format off
9625 unsigned char packet99[] = {
9626 // type (short header, 4 byte packet number)
9627 0x43,
9628 // connection_id
9629 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9630 // packet number
9631 0x12, 0x34, 0x56, 0x78,
9632
9633 // frame type (IETF_STREAM_BLOCKED)
9634 0x15,
9635 // Stream ID
9636 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
9637 // Offset
9638 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
9639 };
9640 // clang-format on
9641
9642 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9643 ASSERT_TRUE(data != nullptr);
9644
9645 test::CompareCharArraysWithHexError("constructed packet", data->data(),
9646 data->length(), AsChars(packet99),
9647 QUIC_ARRAYSIZE(packet99));
9648}
9649
fkastenholz3c4eabf2019-04-22 07:49:59 -07009650TEST_P(QuicFramerTest, BiDiMaxStreamsFrame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009651 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -07009652 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009653 return;
9654 }
zhongyi546cc452019-04-12 15:27:49 -07009655 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009656
9657 // clang-format off
9658 PacketFragments packet99 = {
9659 // type (short header, 4 byte packet number)
9660 {"",
9661 {0x43}},
9662 // connection_id
9663 {"",
9664 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9665 // packet number
9666 {"",
9667 {0x12, 0x34, 0x9A, 0xBC}},
9668 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9669 {"",
9670 {0x12}},
9671 // max. streams
9672 {"Can not read MAX_STREAMS stream count.",
9673 {kVarInt62OneByte + 0x03}},
9674 };
9675 // clang-format on
9676
9677 std::unique_ptr<QuicEncryptedPacket> encrypted(
9678 AssemblePacketFromFragments(packet99));
9679 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9680
9681 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
9682 ASSERT_TRUE(visitor_.header_.get());
9683 EXPECT_TRUE(CheckDecryption(
9684 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9685 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9686
fkastenholz3c4eabf2019-04-22 07:49:59 -07009687 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9688 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
9689 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009690}
9691
fkastenholz3c4eabf2019-04-22 07:49:59 -07009692TEST_P(QuicFramerTest, UniDiMaxStreamsFrame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009693 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -07009694 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009695 return;
9696 }
zhongyi546cc452019-04-12 15:27:49 -07009697 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009698
9699 // clang-format off
9700 PacketFragments packet99 = {
9701 // type (short header, 4 byte packet number)
9702 {"",
9703 {0x43}},
9704 // Test runs in client mode, no connection id
9705 // packet number
9706 {"",
9707 {0x12, 0x34, 0x9A, 0xBC}},
fkastenholz3c4eabf2019-04-22 07:49:59 -07009708 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
QUICHE teama6ef0a62019-03-07 20:34:33 -05009709 {"",
fkastenholz3c4eabf2019-04-22 07:49:59 -07009710 {0x13}},
QUICHE teama6ef0a62019-03-07 20:34:33 -05009711 // max. streams
9712 {"Can not read MAX_STREAMS stream count.",
9713 {kVarInt62OneByte + 0x03}},
9714 };
9715 // clang-format on
9716
9717 std::unique_ptr<QuicEncryptedPacket> encrypted(
9718 AssemblePacketFromFragments(packet99));
9719 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9720 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9721
9722 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
9723 ASSERT_TRUE(visitor_.header_.get());
9724 EXPECT_TRUE(CheckDecryption(
9725 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9726 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9727
fkastenholz3c4eabf2019-04-22 07:49:59 -07009728 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9729 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9730 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009731}
9732
9733TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrame) {
9734 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -07009735 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009736 return;
9737 }
zhongyi546cc452019-04-12 15:27:49 -07009738 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009739
9740 // clang-format off
9741 PacketFragments packet99 = {
9742 // type (short header, 4 byte packet number)
9743 {"",
9744 {0x43}},
9745 // connection_id
9746 {"",
9747 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9748 // packet number
9749 {"",
9750 {0x12, 0x34, 0x9A, 0xBC}},
9751 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9752 {"",
9753 {0x13}},
9754 // max. streams
9755 {"Can not read MAX_STREAMS stream count.",
9756 {kVarInt62OneByte + 0x03}},
9757 };
9758 // clang-format on
9759
9760 std::unique_ptr<QuicEncryptedPacket> encrypted(
9761 AssemblePacketFromFragments(packet99));
9762 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9763
9764 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
9765 ASSERT_TRUE(visitor_.header_.get());
9766 EXPECT_TRUE(CheckDecryption(
9767 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9768 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9769
fkastenholz3c4eabf2019-04-22 07:49:59 -07009770 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9771 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9772 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009773}
9774
9775TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrame) {
9776 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -07009777 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009778 return;
9779 }
zhongyi546cc452019-04-12 15:27:49 -07009780 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009781
9782 // clang-format off
9783 PacketFragments packet99 = {
9784 // type (short header, 4 byte packet number)
9785 {"",
9786 {0x43}},
9787 // Test runs in client mode, no connection id
9788 // packet number
9789 {"",
9790 {0x12, 0x34, 0x9A, 0xBC}},
9791 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9792 {"",
9793 {0x13}},
9794 // max. streams
9795 {"Can not read MAX_STREAMS stream count.",
9796 {kVarInt62OneByte + 0x03}},
9797 };
9798 // clang-format on
9799
9800 std::unique_ptr<QuicEncryptedPacket> encrypted(
9801 AssemblePacketFromFragments(packet99));
9802 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9803 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9804
9805 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
9806 ASSERT_TRUE(visitor_.header_.get());
9807 EXPECT_TRUE(CheckDecryption(
9808 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9809 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9810
fkastenholz3c4eabf2019-04-22 07:49:59 -07009811 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9812 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9813 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009814}
9815
9816// The following four tests ensure that the framer can deserialize a stream
9817// count that is large enough to cause the resulting stream ID to exceed the
9818// current implementation limit(32 bits). The intent is that when this happens,
9819// the stream limit is pegged to the maximum supported value. There are four
9820// tests, for the four combinations of uni- and bi-directional, server- and
9821// client- initiated.
fkastenholz3c4eabf2019-04-22 07:49:59 -07009822TEST_P(QuicFramerTest, BiDiMaxStreamsFrameTooBig) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009823 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -07009824 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009825 return;
9826 }
zhongyi546cc452019-04-12 15:27:49 -07009827 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009828
9829 // clang-format off
9830 unsigned char packet99[] = {
9831 // type (short header, 4 byte packet number)
9832 0x43,
9833 // connection_id
9834 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9835 // packet number
9836 0x12, 0x34, 0x9A, 0xBC,
9837 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9838 0x12,
9839
9840 // max. streams. Max stream ID allowed is 0xffffffff
9841 // This encodes a count of 0x40000000, leading to stream
9842 // IDs in the range 0x1 00000000 to 0x1 00000003.
9843 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9844 };
9845 // clang-format on
9846
9847 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
9848 false);
9849 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9850 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
9851 ASSERT_TRUE(visitor_.header_.get());
9852 EXPECT_TRUE(CheckDecryption(
9853 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9854 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9855
fkastenholz465220f2019-04-23 07:56:27 -07009856 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -07009857 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009858}
9859
9860TEST_P(QuicFramerTest, ClientBiDiMaxStreamsFrameTooBig) {
9861 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -07009862 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009863 return;
9864 }
zhongyi546cc452019-04-12 15:27:49 -07009865 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009866
9867 // clang-format off
9868 unsigned char packet99[] = {
9869 // type (short header, 4 byte packet number)
9870 0x43,
9871 // Test runs in client mode, no connection id
9872 // packet number
9873 0x12, 0x34, 0x9A, 0xBC,
9874 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9875 0x12,
9876
9877 // max. streams. Max stream ID allowed is 0xffffffff
9878 // This encodes a count of 0x40000000, leading to stream
9879 // IDs in the range 0x1 00000000 to 0x1 00000003.
9880 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9881 };
9882 // clang-format on
9883
9884 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
9885 false);
9886 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9887 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9888
9889 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
9890 ASSERT_TRUE(visitor_.header_.get());
9891 EXPECT_TRUE(CheckDecryption(
9892 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9893 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9894
fkastenholz465220f2019-04-23 07:56:27 -07009895 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -07009896 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009897}
9898
9899TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrameTooBig) {
9900 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -07009901 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009902 return;
9903 }
zhongyi546cc452019-04-12 15:27:49 -07009904 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009905
9906 // clang-format off
9907 unsigned char packet99[] = {
9908 // type (short header, 4 byte packet number)
9909 0x43,
9910 // connection_id
9911 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9912 // packet number
9913 0x12, 0x34, 0x9A, 0xBC,
9914 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9915 0x13,
9916
9917 // max. streams. Max stream ID allowed is 0xffffffff
9918 // This encodes a count of 0x40000000, leading to stream
9919 // IDs in the range 0x1 00000000 to 0x1 00000003.
9920 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9921 };
9922 // clang-format on
9923
9924 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
9925 false);
9926 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9927
9928 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
9929 ASSERT_TRUE(visitor_.header_.get());
9930 EXPECT_TRUE(CheckDecryption(
9931 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9932 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9933
fkastenholz465220f2019-04-23 07:56:27 -07009934 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -07009935 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009936}
9937
9938TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrameTooBig) {
9939 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -07009940 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009941 return;
9942 }
zhongyi546cc452019-04-12 15:27:49 -07009943 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009944
9945 // clang-format off
9946 unsigned char packet99[] = {
9947 // type (short header, 4 byte packet number)
9948 0x43,
9949 // Test runs in client mode, no connection id
9950 // packet number
9951 0x12, 0x34, 0x9A, 0xBC,
9952 // frame type (IETF_MAX_STREAMS_UNDIRECTIONAL)
9953 0x13,
9954
9955 // max. streams. Max stream ID allowed is 0xffffffff
9956 // This encodes a count of 0x40000000, leading to stream
9957 // IDs in the range 0x1 00000000 to 0x1 00000003.
9958 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9959 };
9960 // clang-format on
9961
9962 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
9963 false);
9964 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9965 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9966
9967 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
9968 ASSERT_TRUE(visitor_.header_.get());
9969 EXPECT_TRUE(CheckDecryption(
9970 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9971 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
9972
fkastenholz465220f2019-04-23 07:56:27 -07009973 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
fkastenholz3c4eabf2019-04-22 07:49:59 -07009974 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009975}
9976
fkastenholz3c4eabf2019-04-22 07:49:59 -07009977// Specifically test that count==0 is accepted.
QUICHE teama6ef0a62019-03-07 20:34:33 -05009978TEST_P(QuicFramerTest, MaxStreamsFrameZeroCount) {
9979 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -07009980 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05009981 return;
9982 }
zhongyi546cc452019-04-12 15:27:49 -07009983 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05009984
9985 // clang-format off
9986 unsigned char packet99[] = {
9987 // type (short header, 4 byte packet number)
9988 0x43,
9989 // connection_id
9990 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9991 // packet number
9992 0x12, 0x34, 0x9A, 0xBC,
9993 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9994 0x12,
9995 // max. streams == 0.
9996 kVarInt62OneByte + 0x00
9997 };
9998 // clang-format on
9999
10000 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
10001 false);
fkastenholz3c4eabf2019-04-22 07:49:59 -070010002 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010003}
10004
10005TEST_P(QuicFramerTest, ServerBiDiStreamsBlockedFrame) {
10006 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070010007 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010008 return;
10009 }
zhongyi546cc452019-04-12 15:27:49 -070010010 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010011
10012 // clang-format off
10013 PacketFragments packet99 = {
10014 // type (short header, 4 byte packet number)
10015 {"",
10016 {0x43}},
10017 // connection_id
10018 {"",
10019 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10020 // packet number
10021 {"",
10022 {0x12, 0x34, 0x9A, 0xBC}},
fkastenholz3c4eabf2019-04-22 07:49:59 -070010023 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
10024 {"",
10025 {0x13}},
10026 // stream count
10027 {"Can not read MAX_STREAMS stream count.",
10028 {kVarInt62OneByte + 0x00}},
10029 };
10030 // clang-format on
10031
10032 std::unique_ptr<QuicEncryptedPacket> encrypted(
10033 AssemblePacketFromFragments(packet99));
10034 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10035
10036 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10037 ASSERT_TRUE(visitor_.header_.get());
10038 EXPECT_TRUE(CheckDecryption(
10039 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10040 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10041
10042 EXPECT_EQ(0u, visitor_.max_streams_frame_.stream_count);
10043 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
10044
10045 CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
10046}
10047
10048TEST_P(QuicFramerTest, BiDiStreamsBlockedFrame) {
10049 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070010050 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholz3c4eabf2019-04-22 07:49:59 -070010051 return;
10052 }
10053 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10054
10055 // clang-format off
10056 PacketFragments packet99 = {
10057 // type (short header, 4 byte packet number)
10058 {"",
10059 {0x43}},
10060 // connection_id
10061 {"",
10062 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10063 // packet number
10064 {"",
10065 {0x12, 0x34, 0x9A, 0xBC}},
QUICHE teama6ef0a62019-03-07 20:34:33 -050010066 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
10067 {"",
10068 {0x16}},
10069 // stream id
fkastenholz3c4eabf2019-04-22 07:49:59 -070010070 {"Can not read STREAMS_BLOCKED stream count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010071 {kVarInt62OneByte + 0x03}},
10072 };
10073 // clang-format on
10074
10075 std::unique_ptr<QuicEncryptedPacket> encrypted(
10076 AssemblePacketFromFragments(packet99));
10077 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10078
10079 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10080 ASSERT_TRUE(visitor_.header_.get());
10081 EXPECT_TRUE(CheckDecryption(
10082 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10083 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10084
fkastenholz3c4eabf2019-04-22 07:49:59 -070010085 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
10086 EXPECT_FALSE(visitor_.streams_blocked_frame_.unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010087
fkastenholz3c4eabf2019-04-22 07:49:59 -070010088 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010089}
10090
fkastenholz3c4eabf2019-04-22 07:49:59 -070010091TEST_P(QuicFramerTest, UniDiStreamsBlockedFrame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010092 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070010093 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010094 return;
10095 }
zhongyi546cc452019-04-12 15:27:49 -070010096 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010097
10098 // clang-format off
10099 PacketFragments packet99 = {
10100 // type (short header, 4 byte packet number)
10101 {"",
10102 {0x43}},
10103 // connection_id
10104 {"",
10105 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10106 // packet number
10107 {"",
10108 {0x12, 0x34, 0x9A, 0xBC}},
10109 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10110 {"",
10111 {0x17}},
10112 // stream id
fkastenholz3c4eabf2019-04-22 07:49:59 -070010113 {"Can not read STREAMS_BLOCKED stream count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010114 {kVarInt62OneByte + 0x03}},
10115 };
10116 // clang-format on
10117
10118 std::unique_ptr<QuicEncryptedPacket> encrypted(
10119 AssemblePacketFromFragments(packet99));
10120 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10121
10122 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10123 ASSERT_TRUE(visitor_.header_.get());
10124 EXPECT_TRUE(CheckDecryption(
10125 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10126 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10127
fkastenholz3c4eabf2019-04-22 07:49:59 -070010128 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
10129 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
10130 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010131}
10132
10133TEST_P(QuicFramerTest, ClientUniDiStreamsBlockedFrame) {
10134 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070010135 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010136 return;
10137 }
zhongyi546cc452019-04-12 15:27:49 -070010138 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010139
10140 // clang-format off
10141 PacketFragments packet99 = {
10142 // type (short header, 4 byte packet number)
10143 {"",
10144 {0x43}},
10145 // Test runs in client mode, no connection id
10146 // packet number
10147 {"",
10148 {0x12, 0x34, 0x9A, 0xBC}},
10149 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10150 {"",
10151 {0x17}},
10152 // stream id
fkastenholz3c4eabf2019-04-22 07:49:59 -070010153 {"Can not read STREAMS_BLOCKED stream count.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010154 {kVarInt62OneByte + 0x03}},
10155 };
10156 // clang-format on
10157
10158 std::unique_ptr<QuicEncryptedPacket> encrypted(
10159 AssemblePacketFromFragments(packet99));
10160 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10161 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10162
10163 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10164 ASSERT_TRUE(visitor_.header_.get());
10165 EXPECT_TRUE(CheckDecryption(
10166 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10167 PACKET_0BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10168
fkastenholz3c4eabf2019-04-22 07:49:59 -070010169 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
10170 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
10171 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010172}
10173
10174// Check that when we get a STREAMS_BLOCKED frame that specifies too large
10175// a stream count, we reject with an appropriate error. There is no need to
10176// check for different combinations of Uni/Bi directional and client/server
10177// initiated; the logic does not take these into account.
10178TEST_P(QuicFramerTest, StreamsBlockedFrameTooBig) {
10179 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070010180 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010181 return;
10182 }
zhongyi546cc452019-04-12 15:27:49 -070010183 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010184
10185 // clang-format off
10186 unsigned char packet99[] = {
10187 // type (short header, 4 byte packet number)
10188 0x43,
10189 // Test runs in client mode, no connection id
10190 // packet number
10191 0x12, 0x34, 0x9A, 0xBC,
10192 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL)
fkastenholz3c4eabf2019-04-22 07:49:59 -070010193 0x16,
QUICHE teama6ef0a62019-03-07 20:34:33 -050010194
10195 // max. streams. Max stream ID allowed is 0xffffffff
10196 // This encodes a count of 0x40000000, leading to stream
10197 // IDs in the range 0x1 00000000 to 0x1 00000003.
10198 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01
10199 };
10200 // clang-format on
10201
10202 QuicEncryptedPacket encrypted(AsChars(packet99), QUIC_ARRAYSIZE(packet99),
10203 false);
10204 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10205 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
10206
fkastenholz3c4eabf2019-04-22 07:49:59 -070010207 EXPECT_EQ(QUIC_STREAMS_BLOCKED_DATA, framer_.error());
QUICHE teama6ef0a62019-03-07 20:34:33 -050010208 EXPECT_EQ(framer_.detailed_error(),
10209 "STREAMS_BLOCKED stream count exceeds implementation limit.");
10210}
10211
fkastenholz3c4eabf2019-04-22 07:49:59 -070010212// Specifically test that count==0 is accepted.
QUICHE teama6ef0a62019-03-07 20:34:33 -050010213TEST_P(QuicFramerTest, StreamsBlockedFrameZeroCount) {
10214 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070010215 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010216 return;
10217 }
fkastenholz3c4eabf2019-04-22 07:49:59 -070010218
zhongyi546cc452019-04-12 15:27:49 -070010219 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010220
10221 // clang-format off
fkastenholz3c4eabf2019-04-22 07:49:59 -070010222 PacketFragments packet99 = {
10223 // type (short header, 4 byte packet number)
10224 {"",
10225 {0x43}},
10226 // connection_id
10227 {"",
10228 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10229 // packet number
10230 {"",
10231 {0x12, 0x34, 0x9A, 0xBC}},
10232 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10233 {"",
10234 {0x17}},
10235 // stream id
10236 {"Can not read STREAMS_BLOCKED stream count.",
10237 {kVarInt62OneByte + 0x00}},
QUICHE teama6ef0a62019-03-07 20:34:33 -050010238 };
10239 // clang-format on
10240
fkastenholz3c4eabf2019-04-22 07:49:59 -070010241 std::unique_ptr<QuicEncryptedPacket> encrypted(
10242 AssemblePacketFromFragments(packet99));
10243 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010244
fkastenholz3c4eabf2019-04-22 07:49:59 -070010245 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10246 ASSERT_TRUE(visitor_.header_.get());
10247 EXPECT_TRUE(CheckDecryption(
10248 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10249 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10250
10251 EXPECT_EQ(0u, visitor_.streams_blocked_frame_.stream_count);
10252 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
10253
10254 CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010255}
10256
fkastenholz3c4eabf2019-04-22 07:49:59 -070010257TEST_P(QuicFramerTest, BuildBiDiStreamsBlockedPacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010258 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070010259 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010260 return;
10261 }
10262
10263 QuicPacketHeader header;
10264 header.destination_connection_id = FramerTestConnectionId();
10265 header.reset_flag = false;
10266 header.version_flag = false;
10267 header.packet_number = kPacketNumber;
10268
fkastenholz3c4eabf2019-04-22 07:49:59 -070010269 QuicStreamsBlockedFrame frame;
10270 frame.stream_count = 3;
10271 frame.unidirectional = false;
QUICHE teama6ef0a62019-03-07 20:34:33 -050010272
10273 QuicFrames frames = {QuicFrame(frame)};
10274
10275 // clang-format off
10276 unsigned char packet99[] = {
10277 // type (short header, 4 byte packet number)
10278 0x43,
10279 // connection_id
10280 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10281 // packet number
10282 0x12, 0x34, 0x56, 0x78,
10283
10284 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
10285 0x16,
10286 // Stream count
10287 kVarInt62OneByte + 0x03
10288 };
10289 // clang-format on
10290
10291 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10292 ASSERT_TRUE(data != nullptr);
10293
10294 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10295 data->length(), AsChars(packet99),
10296 QUIC_ARRAYSIZE(packet99));
10297}
10298
fkastenholz3c4eabf2019-04-22 07:49:59 -070010299TEST_P(QuicFramerTest, BuildUniStreamsBlockedPacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010300 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070010301 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010302 return;
10303 }
10304
10305 QuicPacketHeader header;
10306 header.destination_connection_id = FramerTestConnectionId();
10307 header.reset_flag = false;
10308 header.version_flag = false;
10309 header.packet_number = kPacketNumber;
10310
fkastenholz3c4eabf2019-04-22 07:49:59 -070010311 QuicStreamsBlockedFrame frame;
10312 frame.stream_count = 3;
10313 frame.unidirectional = true;
10314
QUICHE teama6ef0a62019-03-07 20:34:33 -050010315 QuicFrames frames = {QuicFrame(frame)};
10316
10317 // clang-format off
10318 unsigned char packet99[] = {
10319 // type (short header, 4 byte packet number)
10320 0x43,
10321 // connection_id
10322 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10323 // packet number
10324 0x12, 0x34, 0x56, 0x78,
10325
10326 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
10327 0x17,
10328 // Stream count
10329 kVarInt62OneByte + 0x03
10330 };
10331 // clang-format on
10332
10333 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10334 ASSERT_TRUE(data != nullptr);
10335
10336 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10337 data->length(), AsChars(packet99),
10338 QUIC_ARRAYSIZE(packet99));
10339}
10340
fkastenholz3c4eabf2019-04-22 07:49:59 -070010341TEST_P(QuicFramerTest, BuildBiDiMaxStreamsPacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010342 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070010343 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010344 return;
10345 }
10346
10347 QuicPacketHeader header;
10348 header.destination_connection_id = FramerTestConnectionId();
10349 header.reset_flag = false;
10350 header.version_flag = false;
10351 header.packet_number = kPacketNumber;
10352
fkastenholz3c4eabf2019-04-22 07:49:59 -070010353 QuicMaxStreamsFrame frame;
10354 frame.stream_count = 3;
10355 frame.unidirectional = false;
10356
QUICHE teama6ef0a62019-03-07 20:34:33 -050010357 QuicFrames frames = {QuicFrame(frame)};
10358
10359 // clang-format off
10360 unsigned char packet99[] = {
10361 // type (short header, 4 byte packet number)
10362 0x43,
10363 // connection_id
10364 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10365 // packet number
10366 0x12, 0x34, 0x56, 0x78,
10367
10368 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL frame)
10369 0x12,
10370 // Stream count
10371 kVarInt62OneByte + 0x03
10372 };
10373 // clang-format on
10374
10375 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10376 ASSERT_TRUE(data != nullptr);
10377
10378 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10379 data->length(), AsChars(packet99),
10380 QUIC_ARRAYSIZE(packet99));
10381}
10382
fkastenholz3c4eabf2019-04-22 07:49:59 -070010383TEST_P(QuicFramerTest, BuildUniDiMaxStreamsPacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010384 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070010385 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010386 return;
10387 }
10388
10389 // This test runs in client mode.
10390 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10391
10392 QuicPacketHeader header;
10393 header.destination_connection_id = FramerTestConnectionId();
10394 header.reset_flag = false;
10395 header.version_flag = false;
10396 header.packet_number = kPacketNumber;
10397
fkastenholz3c4eabf2019-04-22 07:49:59 -070010398 QuicMaxStreamsFrame frame;
10399 frame.stream_count = 3;
10400 frame.unidirectional = true;
QUICHE teama6ef0a62019-03-07 20:34:33 -050010401
QUICHE teama6ef0a62019-03-07 20:34:33 -050010402 QuicFrames frames = {QuicFrame(frame)};
10403
10404 // clang-format off
10405 unsigned char packet99[] = {
10406 // type (short header, 4 byte packet number)
10407 0x43,
10408 // connection_id
10409 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10410 // packet number
10411 0x12, 0x34, 0x56, 0x78,
10412
10413 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
10414 0x13,
10415 // Stream count
10416 kVarInt62OneByte + 0x03
10417 };
10418 // clang-format on
10419
10420 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10421 ASSERT_TRUE(data != nullptr);
10422
10423 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10424 data->length(), AsChars(packet99),
10425 QUIC_ARRAYSIZE(packet99));
10426}
10427
10428TEST_P(QuicFramerTest, NewConnectionIdFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070010429 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010430 // This frame is only for version 99.
10431 return;
10432 }
zhongyi546cc452019-04-12 15:27:49 -070010433 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010434 // clang-format off
10435 PacketFragments packet99 = {
10436 // type (short header, 4 byte packet number)
10437 {"",
10438 {0x43}},
10439 // connection_id
10440 {"",
10441 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10442 // packet number
10443 {"",
10444 {0x12, 0x34, 0x56, 0x78}},
10445 // frame type (IETF_NEW_CONNECTION_ID frame)
10446 {"",
10447 {0x18}},
10448 // error code
10449 {"Unable to read new connection ID frame sequence number.",
10450 {kVarInt62OneByte + 0x11}},
fkastenholz1c19fc22019-07-12 11:06:19 -070010451 {"Unable to read new connection ID frame retire_prior_to.",
10452 {kVarInt62OneByte + 0x09}},
dschinazicf5b1e22019-07-17 18:35:17 -070010453 {"Unable to read new connection ID frame connection id.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050010454 {0x08}}, // connection ID length
10455 {"Unable to read new connection ID frame connection id.",
10456 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11}},
10457 {"Can not read new connection ID frame reset token.",
10458 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10459 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10460 };
10461 // clang-format on
10462
10463 std::unique_ptr<QuicEncryptedPacket> encrypted(
10464 AssemblePacketFromFragments(packet99));
10465 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10466
10467 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10468 ASSERT_TRUE(visitor_.header_.get());
10469 EXPECT_TRUE(CheckDecryption(
10470 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10471 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10472
10473 EXPECT_EQ(0u, visitor_.stream_frames_.size());
10474
10475 EXPECT_EQ(FramerTestConnectionIdPlusOne(),
10476 visitor_.new_connection_id_.connection_id);
10477 EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
fkastenholz1c19fc22019-07-12 11:06:19 -070010478 EXPECT_EQ(0x09u, visitor_.new_connection_id_.retire_prior_to);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010479 EXPECT_EQ(kTestStatelessResetToken,
10480 visitor_.new_connection_id_.stateless_reset_token);
10481
10482 ASSERT_EQ(0u, visitor_.ack_frames_.size());
10483
10484 CheckFramingBoundaries(packet99, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
10485}
10486
QUICHE team8e2e4532019-03-14 14:37:56 -070010487TEST_P(QuicFramerTest, NewConnectionIdFrameVariableLength) {
fkastenholz305e1732019-06-18 05:01:22 -070010488 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE team9b41c972019-03-21 11:22:48 -070010489 // This frame is only for version 99.
QUICHE team8e2e4532019-03-14 14:37:56 -070010490 return;
10491 }
zhongyi546cc452019-04-12 15:27:49 -070010492 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE team8e2e4532019-03-14 14:37:56 -070010493 // clang-format off
10494 PacketFragments packet99 = {
10495 // type (short header, 4 byte packet number)
10496 {"",
10497 {0x43}},
10498 // connection_id
10499 {"",
10500 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10501 // packet number
10502 {"",
10503 {0x12, 0x34, 0x56, 0x78}},
10504 // frame type (IETF_NEW_CONNECTION_ID frame)
10505 {"",
10506 {0x18}},
10507 // error code
10508 {"Unable to read new connection ID frame sequence number.",
10509 {kVarInt62OneByte + 0x11}},
fkastenholz1c19fc22019-07-12 11:06:19 -070010510 {"Unable to read new connection ID frame retire_prior_to.",
10511 {kVarInt62OneByte + 0x0a}},
dschinazicf5b1e22019-07-17 18:35:17 -070010512 {"Unable to read new connection ID frame connection id.",
QUICHE team8e2e4532019-03-14 14:37:56 -070010513 {0x09}}, // connection ID length
10514 {"Unable to read new connection ID frame connection id.",
10515 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
10516 {"Can not read new connection ID frame reset token.",
10517 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10518 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10519 };
10520 // clang-format on
10521
10522 std::unique_ptr<QuicEncryptedPacket> encrypted(
10523 AssemblePacketFromFragments(packet99));
10524 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10525
10526 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10527 ASSERT_TRUE(visitor_.header_.get());
10528 EXPECT_TRUE(CheckDecryption(
10529 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10530 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10531
10532 EXPECT_EQ(0u, visitor_.stream_frames_.size());
10533
10534 EXPECT_EQ(FramerTestConnectionIdNineBytes(),
10535 visitor_.new_connection_id_.connection_id);
10536 EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
fkastenholz1c19fc22019-07-12 11:06:19 -070010537 EXPECT_EQ(0x0au, visitor_.new_connection_id_.retire_prior_to);
QUICHE team8e2e4532019-03-14 14:37:56 -070010538 EXPECT_EQ(kTestStatelessResetToken,
10539 visitor_.new_connection_id_.stateless_reset_token);
10540
10541 ASSERT_EQ(0u, visitor_.ack_frames_.size());
10542
10543 CheckFramingBoundaries(packet99, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
10544}
10545
QUICHE team0131a5b2019-03-20 15:23:27 -070010546// Verifies that parsing a NEW_CONNECTION_ID frame with a length above the
10547// specified maximum fails.
10548TEST_P(QuicFramerTest, InvalidLongNewConnectionIdFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070010549 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE team0131a5b2019-03-20 15:23:27 -070010550 // The NEW_CONNECTION_ID frame is only for version 99.
10551 return;
10552 }
zhongyi546cc452019-04-12 15:27:49 -070010553 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE team0131a5b2019-03-20 15:23:27 -070010554 // clang-format off
10555 PacketFragments packet99 = {
10556 // type (short header, 4 byte packet number)
10557 {"",
10558 {0x43}},
10559 // connection_id
10560 {"",
10561 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10562 // packet number
10563 {"",
10564 {0x12, 0x34, 0x56, 0x78}},
10565 // frame type (IETF_NEW_CONNECTION_ID frame)
10566 {"",
10567 {0x18}},
10568 // error code
10569 {"Unable to read new connection ID frame sequence number.",
10570 {kVarInt62OneByte + 0x11}},
fkastenholz1c19fc22019-07-12 11:06:19 -070010571 {"Unable to read new connection ID frame retire_prior_to.",
10572 {kVarInt62OneByte + 0x0b}},
dschinazicf5b1e22019-07-17 18:35:17 -070010573 {"Unable to read new connection ID frame connection id.",
dschinazib953d022019-08-01 18:05:58 -070010574 {0x40}}, // connection ID length
QUICHE team0131a5b2019-03-20 15:23:27 -070010575 {"Unable to read new connection ID frame connection id.",
10576 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10577 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
dschinazib953d022019-08-01 18:05:58 -070010578 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10579 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10580 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10581 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10582 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10583 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E}},
QUICHE team0131a5b2019-03-20 15:23:27 -070010584 {"Can not read new connection ID frame reset token.",
10585 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10586 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10587 };
10588 // clang-format on
10589
10590 std::unique_ptr<QuicEncryptedPacket> encrypted(
10591 AssemblePacketFromFragments(packet99));
10592 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10593 EXPECT_EQ(QUIC_INVALID_NEW_CONNECTION_ID_DATA, framer_.error());
dschinazicf5b1e22019-07-17 18:35:17 -070010594 EXPECT_EQ("Unable to read new connection ID frame connection id.",
10595 framer_.detailed_error());
QUICHE team0131a5b2019-03-20 15:23:27 -070010596}
10597
fkastenholz1c19fc22019-07-12 11:06:19 -070010598// Verifies that parsing a NEW_CONNECTION_ID frame with an invalid
10599// retire-prior-to fails.
10600TEST_P(QuicFramerTest, InvalidRetirePriorToNewConnectionIdFrame) {
10601 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10602 // The NEW_CONNECTION_ID frame is only for version 99.
10603 return;
10604 }
10605 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10606 // clang-format off
10607 PacketFragments packet99 = {
10608 // type (short header, 4 byte packet number)
10609 {"",
10610 {0x43}},
10611 // connection_id
10612 {"",
10613 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10614 // packet number
10615 {"",
10616 {0x12, 0x34, 0x56, 0x78}},
10617 // frame type (IETF_NEW_CONNECTION_ID frame)
10618 {"",
10619 {0x18}},
10620 // sequence number
10621 {"Unable to read new connection ID frame sequence number.",
10622 {kVarInt62OneByte + 0x11}},
10623 {"Unable to read new connection ID frame retire_prior_to.",
10624 {kVarInt62OneByte + 0x1b}},
10625 {"Unable to read new connection ID frame connection id length.",
10626 {0x08}}, // connection ID length
10627 {"Unable to read new connection ID frame connection id.",
10628 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11}},
10629 {"Can not read new connection ID frame reset token.",
10630 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10631 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10632 };
10633 // clang-format on
10634
10635 std::unique_ptr<QuicEncryptedPacket> encrypted(
10636 AssemblePacketFromFragments(packet99));
10637 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10638 EXPECT_EQ(QUIC_INVALID_NEW_CONNECTION_ID_DATA, framer_.error());
10639 EXPECT_EQ("Retire_prior_to > sequence_number.", framer_.detailed_error());
10640}
10641
QUICHE teama6ef0a62019-03-07 20:34:33 -050010642TEST_P(QuicFramerTest, BuildNewConnectionIdFramePacket) {
fkastenholz305e1732019-06-18 05:01:22 -070010643 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010644 // This frame is only for version 99.
10645 return;
10646 }
QUICHE team2252b702019-05-14 23:55:14 -040010647 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010648 QuicPacketHeader header;
10649 header.destination_connection_id = FramerTestConnectionId();
10650 header.reset_flag = false;
10651 header.version_flag = false;
10652 header.packet_number = kPacketNumber;
10653
10654 QuicNewConnectionIdFrame frame;
10655 frame.sequence_number = 0x11;
fkastenholz1c19fc22019-07-12 11:06:19 -070010656 frame.retire_prior_to = 0x0c;
QUICHE teama6ef0a62019-03-07 20:34:33 -050010657 // Use this value to force a 4-byte encoded variable length connection ID
10658 // in the frame.
10659 frame.connection_id = FramerTestConnectionIdPlusOne();
10660 frame.stateless_reset_token = kTestStatelessResetToken;
10661
10662 QuicFrames frames = {QuicFrame(&frame)};
10663
10664 // clang-format off
10665 unsigned char packet99[] = {
10666 // type (short header, 4 byte packet number)
10667 0x43,
10668 // connection_id
10669 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10670 // packet number
10671 0x12, 0x34, 0x56, 0x78,
10672
10673 // frame type (IETF_NEW_CONNECTION_ID frame)
10674 0x18,
10675 // sequence number
10676 kVarInt62OneByte + 0x11,
fkastenholz1c19fc22019-07-12 11:06:19 -070010677 // retire_prior_to
10678 kVarInt62OneByte + 0x0c,
QUICHE teama6ef0a62019-03-07 20:34:33 -050010679 // new connection id length
10680 0x08,
10681 // new connection id
10682 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
10683 // stateless reset token
10684 0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10685 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10686 };
10687 // clang-format on
10688
10689 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10690 ASSERT_TRUE(data != nullptr);
10691
10692 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10693 data->length(), AsChars(packet99),
10694 QUIC_ARRAYSIZE(packet99));
10695}
10696
10697TEST_P(QuicFramerTest, NewTokenFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070010698 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010699 // This frame is only for version 99.
10700 return;
10701 }
zhongyi546cc452019-04-12 15:27:49 -070010702 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010703 // clang-format off
10704 PacketFragments packet = {
10705 // type (short header, 4 byte packet number)
10706 {"",
10707 {0x43}},
10708 // connection_id
10709 {"",
10710 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10711 // packet number
10712 {"",
10713 {0x12, 0x34, 0x56, 0x78}},
10714 // frame type (IETF_NEW_TOKEN frame)
10715 {"",
10716 {0x07}},
10717 // Length
10718 {"Unable to read new token length.",
10719 {kVarInt62OneByte + 0x08}},
10720 {"Unable to read new token data.",
10721 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}}
10722 };
10723 // clang-format on
10724 uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
10725 0x04, 0x05, 0x06, 0x07};
10726
10727 std::unique_ptr<QuicEncryptedPacket> encrypted(
10728 AssemblePacketFromFragments(packet));
10729 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10730
10731 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10732 ASSERT_TRUE(visitor_.header_.get());
10733 EXPECT_TRUE(CheckDecryption(
10734 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10735 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10736
10737 EXPECT_EQ(0u, visitor_.stream_frames_.size());
10738
10739 EXPECT_EQ(sizeof(expected_token_value), visitor_.new_token_.token.length());
10740 EXPECT_EQ(0, memcmp(expected_token_value, visitor_.new_token_.token.data(),
10741 sizeof(expected_token_value)));
10742
10743 CheckFramingBoundaries(packet, QUIC_INVALID_NEW_TOKEN);
10744}
10745
10746TEST_P(QuicFramerTest, BuildNewTokenFramePacket) {
fkastenholz305e1732019-06-18 05:01:22 -070010747 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010748 // This frame is only for version 99.
10749 return;
10750 }
QUICHE team2252b702019-05-14 23:55:14 -040010751 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010752 QuicPacketHeader header;
10753 header.destination_connection_id = FramerTestConnectionId();
10754 header.reset_flag = false;
10755 header.version_flag = false;
10756 header.packet_number = kPacketNumber;
10757
10758 uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
10759 0x04, 0x05, 0x06, 0x07};
10760
vasilvvc48c8712019-03-11 13:38:16 -070010761 QuicNewTokenFrame frame(0, std::string((const char*)(expected_token_value),
10762 sizeof(expected_token_value)));
QUICHE teama6ef0a62019-03-07 20:34:33 -050010763
10764 QuicFrames frames = {QuicFrame(&frame)};
10765
10766 // clang-format off
10767 unsigned char packet[] = {
10768 // type (short header, 4 byte packet number)
10769 0x43,
10770 // connection_id
10771 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10772 // packet number
10773 0x12, 0x34, 0x56, 0x78,
10774
10775 // frame type (IETF_NEW_TOKEN frame)
10776 0x07,
10777 // Length and token
10778 kVarInt62OneByte + 0x08,
10779 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
10780 };
10781 // clang-format on
10782
10783 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10784 ASSERT_TRUE(data != nullptr);
10785
10786 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10787 data->length(), AsChars(packet),
10788 QUIC_ARRAYSIZE(packet));
10789}
10790
10791TEST_P(QuicFramerTest, IetfStopSendingFrame) {
10792 // This test is only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070010793 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010794 return;
10795 }
zhongyi546cc452019-04-12 15:27:49 -070010796 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010797
10798 // clang-format off
10799 PacketFragments packet99 = {
10800 // type (short header, 4 byte packet number)
10801 {"",
10802 {0x43}},
10803 // connection_id
10804 {"",
10805 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10806 // packet number
10807 {"",
10808 {0x12, 0x34, 0x9A, 0xBC}},
10809 // frame type (IETF_STOP_SENDING frame)
10810 {"",
10811 {0x05}},
10812 // stream id
10813 {"Unable to read stop sending stream id.",
10814 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
10815 {"Unable to read stop sending application error code.",
fkastenholz733552e2019-07-16 11:16:58 -070010816 {kVarInt62FourBytes + 0x00, 0x00, 0x76, 0x54}},
QUICHE teama6ef0a62019-03-07 20:34:33 -050010817 };
10818 // clang-format on
10819
10820 std::unique_ptr<QuicEncryptedPacket> encrypted(
10821 AssemblePacketFromFragments(packet99));
10822 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10823
10824 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10825 ASSERT_TRUE(visitor_.header_.get());
10826 EXPECT_TRUE(CheckDecryption(
10827 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10828 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10829
10830 EXPECT_EQ(kStreamId, visitor_.stop_sending_frame_.stream_id);
10831 EXPECT_EQ(0x7654, visitor_.stop_sending_frame_.application_error_code);
10832
10833 CheckFramingBoundaries(packet99, QUIC_INVALID_STOP_SENDING_FRAME_DATA);
10834}
10835
10836TEST_P(QuicFramerTest, BuildIetfStopSendingPacket) {
10837 // This test is only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070010838 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010839 return;
10840 }
10841
10842 QuicPacketHeader header;
10843 header.destination_connection_id = FramerTestConnectionId();
10844 header.reset_flag = false;
10845 header.version_flag = false;
10846 header.packet_number = kPacketNumber;
10847
10848 QuicStopSendingFrame frame;
10849 frame.stream_id = kStreamId;
10850 frame.application_error_code = 0xffff;
10851 QuicFrames frames = {QuicFrame(&frame)};
10852
10853 // clang-format off
10854 unsigned char packet99[] = {
10855 // type (short header, 4 byte packet number)
10856 0x43,
10857 // connection_id
10858 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10859 // packet number
10860 0x12, 0x34, 0x56, 0x78,
10861
10862 // frame type (IETF_STOP_SENDING frame)
10863 0x05,
10864 // Stream ID
10865 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
10866 // Application error code
fkastenholz733552e2019-07-16 11:16:58 -070010867 kVarInt62FourBytes + 0x00, 0x00, 0xff, 0xff
QUICHE teama6ef0a62019-03-07 20:34:33 -050010868 };
10869 // clang-format on
10870
10871 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10872 ASSERT_TRUE(data != nullptr);
10873
10874 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10875 data->length(), AsChars(packet99),
10876 QUIC_ARRAYSIZE(packet99));
10877}
10878
10879TEST_P(QuicFramerTest, IetfPathChallengeFrame) {
10880 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070010881 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010882 return;
10883 }
zhongyi546cc452019-04-12 15:27:49 -070010884 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010885
10886 // clang-format off
10887 PacketFragments packet99 = {
10888 // type (short header, 4 byte packet number)
10889 {"",
10890 {0x43}},
10891 // connection_id
10892 {"",
10893 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10894 // packet number
10895 {"",
10896 {0x12, 0x34, 0x9A, 0xBC}},
10897 // frame type (IETF_PATH_CHALLENGE)
10898 {"",
10899 {0x1a}},
10900 // data
10901 {"Can not read path challenge data.",
10902 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
10903 };
10904 // clang-format on
10905
10906 std::unique_ptr<QuicEncryptedPacket> encrypted(
10907 AssemblePacketFromFragments(packet99));
10908 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10909
10910 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10911 ASSERT_TRUE(visitor_.header_.get());
10912 EXPECT_TRUE(CheckDecryption(
10913 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10914 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10915
10916 EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
10917 visitor_.path_challenge_frame_.data_buffer);
10918
10919 CheckFramingBoundaries(packet99, QUIC_INVALID_PATH_CHALLENGE_DATA);
10920}
10921
10922TEST_P(QuicFramerTest, BuildIetfPathChallengePacket) {
10923 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070010924 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010925 return;
10926 }
10927
10928 QuicPacketHeader header;
10929 header.destination_connection_id = FramerTestConnectionId();
10930 header.reset_flag = false;
10931 header.version_flag = false;
10932 header.packet_number = kPacketNumber;
10933
10934 QuicPathChallengeFrame frame;
10935 frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
10936 QuicFrames frames = {QuicFrame(&frame)};
10937
10938 // clang-format off
10939 unsigned char packet99[] = {
10940 // type (short header, 4 byte packet number)
10941 0x43,
10942 // connection_id
10943 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10944 // packet number
10945 0x12, 0x34, 0x56, 0x78,
10946
10947 // frame type (IETF_PATH_CHALLENGE)
10948 0x1a,
10949 // Data
10950 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
10951 };
10952 // clang-format on
10953
10954 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10955 ASSERT_TRUE(data != nullptr);
10956
10957 test::CompareCharArraysWithHexError("constructed packet", data->data(),
10958 data->length(), AsChars(packet99),
10959 QUIC_ARRAYSIZE(packet99));
10960}
10961
10962TEST_P(QuicFramerTest, IetfPathResponseFrame) {
10963 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070010964 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050010965 return;
10966 }
zhongyi546cc452019-04-12 15:27:49 -070010967 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050010968
10969 // clang-format off
10970 PacketFragments packet99 = {
10971 // type (short header, 4 byte packet number)
10972 {"",
10973 {0x43}},
10974 // connection_id
10975 {"",
10976 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10977 // packet number
10978 {"",
10979 {0x12, 0x34, 0x9A, 0xBC}},
10980 // frame type (IETF_PATH_RESPONSE)
10981 {"",
10982 {0x1b}},
10983 // data
10984 {"Can not read path response data.",
10985 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
10986 };
10987 // clang-format on
10988
10989 std::unique_ptr<QuicEncryptedPacket> encrypted(
10990 AssemblePacketFromFragments(packet99));
10991 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10992
10993 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
10994 ASSERT_TRUE(visitor_.header_.get());
10995 EXPECT_TRUE(CheckDecryption(
10996 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10997 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
10998
10999 EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
11000 visitor_.path_response_frame_.data_buffer);
11001
11002 CheckFramingBoundaries(packet99, QUIC_INVALID_PATH_RESPONSE_DATA);
11003}
11004
11005TEST_P(QuicFramerTest, BuildIetfPathResponsePacket) {
11006 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070011007 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011008 return;
11009 }
11010
11011 QuicPacketHeader header;
11012 header.destination_connection_id = FramerTestConnectionId();
11013 header.reset_flag = false;
11014 header.version_flag = false;
11015 header.packet_number = kPacketNumber;
11016
11017 QuicPathResponseFrame frame;
11018 frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
11019 QuicFrames frames = {QuicFrame(&frame)};
11020
11021 // clang-format off
11022 unsigned char packet99[] = {
11023 // type (short header, 4 byte packet number)
11024 0x43,
11025 // connection_id
11026 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11027 // packet number
11028 0x12, 0x34, 0x56, 0x78,
11029
11030 // frame type (IETF_PATH_RESPONSE)
11031 0x1b,
11032 // Data
11033 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
11034 };
11035 // clang-format on
11036
11037 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11038 ASSERT_TRUE(data != nullptr);
11039
11040 test::CompareCharArraysWithHexError("constructed packet", data->data(),
11041 data->length(), AsChars(packet99),
11042 QUIC_ARRAYSIZE(packet99));
11043}
11044
11045TEST_P(QuicFramerTest, GetRetransmittableControlFrameSize) {
11046 QuicRstStreamFrame rst_stream(1, 3, QUIC_STREAM_CANCELLED, 1024);
11047 EXPECT_EQ(QuicFramer::GetRstStreamFrameSize(framer_.transport_version(),
11048 rst_stream),
11049 QuicFramer::GetRetransmittableControlFrameSize(
11050 framer_.transport_version(), QuicFrame(&rst_stream)));
11051
vasilvvc48c8712019-03-11 13:38:16 -070011052 std::string error_detail(2048, 'e');
QUICHE teama6ef0a62019-03-07 20:34:33 -050011053 QuicConnectionCloseFrame connection_close(QUIC_NETWORK_IDLE_TIMEOUT,
11054 error_detail);
fkastenholz305e1732019-06-18 05:01:22 -070011055 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
fkastenholz72f509b2019-04-10 09:17:49 -070011056 connection_close.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
11057 }
11058
fkastenholza037b8b2019-05-07 06:00:05 -070011059 EXPECT_EQ(QuicFramer::GetConnectionCloseFrameSize(framer_.transport_version(),
11060 connection_close),
QUICHE teama6ef0a62019-03-07 20:34:33 -050011061 QuicFramer::GetRetransmittableControlFrameSize(
11062 framer_.transport_version(), QuicFrame(&connection_close)));
11063
11064 QuicGoAwayFrame goaway(2, QUIC_PEER_GOING_AWAY, 3, error_detail);
11065 EXPECT_EQ(QuicFramer::GetMinGoAwayFrameSize() + 256,
11066 QuicFramer::GetRetransmittableControlFrameSize(
11067 framer_.transport_version(), QuicFrame(&goaway)));
11068
11069 QuicWindowUpdateFrame window_update(3, 3, 1024);
11070 EXPECT_EQ(QuicFramer::GetWindowUpdateFrameSize(framer_.transport_version(),
11071 window_update),
11072 QuicFramer::GetRetransmittableControlFrameSize(
11073 framer_.transport_version(), QuicFrame(&window_update)));
11074
11075 QuicBlockedFrame blocked(4, 3, 1024);
11076 EXPECT_EQ(
11077 QuicFramer::GetBlockedFrameSize(framer_.transport_version(), blocked),
11078 QuicFramer::GetRetransmittableControlFrameSize(
11079 framer_.transport_version(), QuicFrame(&blocked)));
11080
fkastenholz305e1732019-06-18 05:01:22 -070011081 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011082 return;
11083 }
QUICHE teama6ef0a62019-03-07 20:34:33 -050011084
fkastenholz1c19fc22019-07-12 11:06:19 -070011085 QuicNewConnectionIdFrame new_connection_id(5, TestConnectionId(), 1, 101111,
11086 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011087 EXPECT_EQ(QuicFramer::GetNewConnectionIdFrameSize(new_connection_id),
11088 QuicFramer::GetRetransmittableControlFrameSize(
11089 framer_.transport_version(), QuicFrame(&new_connection_id)));
11090
fkastenholz3c4eabf2019-04-22 07:49:59 -070011091 QuicMaxStreamsFrame max_streams(6, 3, /*unidirectional=*/false);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011092 EXPECT_EQ(QuicFramer::GetMaxStreamsFrameSize(framer_.transport_version(),
fkastenholz3c4eabf2019-04-22 07:49:59 -070011093 max_streams),
QUICHE teama6ef0a62019-03-07 20:34:33 -050011094 QuicFramer::GetRetransmittableControlFrameSize(
fkastenholz3c4eabf2019-04-22 07:49:59 -070011095 framer_.transport_version(), QuicFrame(max_streams)));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011096
fkastenholz3c4eabf2019-04-22 07:49:59 -070011097 QuicStreamsBlockedFrame streams_blocked(7, 3, /*unidirectional=*/false);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011098 EXPECT_EQ(QuicFramer::GetStreamsBlockedFrameSize(framer_.transport_version(),
fkastenholz3c4eabf2019-04-22 07:49:59 -070011099 streams_blocked),
QUICHE teama6ef0a62019-03-07 20:34:33 -050011100 QuicFramer::GetRetransmittableControlFrameSize(
fkastenholz3c4eabf2019-04-22 07:49:59 -070011101 framer_.transport_version(), QuicFrame(streams_blocked)));
QUICHE teama6ef0a62019-03-07 20:34:33 -050011102
11103 QuicPathFrameBuffer buffer = {
11104 {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
11105 QuicPathResponseFrame path_response_frame(8, buffer);
11106 EXPECT_EQ(QuicFramer::GetPathResponseFrameSize(path_response_frame),
11107 QuicFramer::GetRetransmittableControlFrameSize(
11108 framer_.transport_version(), QuicFrame(&path_response_frame)));
11109
11110 QuicPathChallengeFrame path_challenge_frame(9, buffer);
11111 EXPECT_EQ(QuicFramer::GetPathChallengeFrameSize(path_challenge_frame),
11112 QuicFramer::GetRetransmittableControlFrameSize(
11113 framer_.transport_version(), QuicFrame(&path_challenge_frame)));
11114
11115 QuicStopSendingFrame stop_sending_frame(10, 3, 20);
11116 EXPECT_EQ(QuicFramer::GetStopSendingFrameSize(stop_sending_frame),
11117 QuicFramer::GetRetransmittableControlFrameSize(
11118 framer_.transport_version(), QuicFrame(&stop_sending_frame)));
11119}
11120
11121// A set of tests to ensure that bad frame-type encodings
11122// are properly detected and handled.
11123// First, four tests to see that unknown frame types generate
11124// a QUIC_INVALID_FRAME_DATA error with detailed information
11125// "Illegal frame type." This regardless of the encoding of the type
11126// (1/2/4/8 bytes).
11127// This only for version 99.
11128TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown1Byte) {
11129 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070011130 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011131 return;
11132 }
zhongyi546cc452019-04-12 15:27:49 -070011133 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011134 // clang-format off
11135 PacketFragments packet = {
11136 // type (short header, 4 byte packet number)
11137 {"",
11138 {0x43}},
11139 // connection_id
11140 {"",
11141 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11142 // packet number
11143 {"",
11144 {0x12, 0x34, 0x9A, 0xBC}},
11145 // frame type (unknown value, single-byte encoding)
11146 {"",
11147 {0x38}}
11148 };
11149 // clang-format on
11150
11151 std::unique_ptr<QuicEncryptedPacket> encrypted(
11152 AssemblePacketFromFragments(packet));
11153
11154 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11155
11156 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
11157 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11158}
11159
11160TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown2Bytes) {
11161 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070011162 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011163 return;
11164 }
zhongyi546cc452019-04-12 15:27:49 -070011165 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011166
11167 // clang-format off
11168 PacketFragments packet = {
11169 // type (short header, 4 byte packet number)
11170 {"",
11171 {0x43}},
11172 // connection_id
11173 {"",
11174 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11175 // packet number
11176 {"",
11177 {0x12, 0x34, 0x9A, 0xBC}},
11178 // frame type (unknown value, two-byte encoding)
11179 {"",
11180 {kVarInt62TwoBytes + 0x01, 0x38}}
11181 };
11182 // clang-format on
11183
11184 std::unique_ptr<QuicEncryptedPacket> encrypted(
11185 AssemblePacketFromFragments(packet));
11186
11187 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11188
11189 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
11190 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11191}
11192
11193TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown4Bytes) {
11194 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070011195 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011196 return;
11197 }
zhongyi546cc452019-04-12 15:27:49 -070011198 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011199
11200 // clang-format off
11201 PacketFragments packet = {
11202 // type (short header, 4 byte packet number)
11203 {"",
11204 {0x43}},
11205 // connection_id
11206 {"",
11207 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11208 // packet number
11209 {"",
11210 {0x12, 0x34, 0x9A, 0xBC}},
11211 // frame type (unknown value, four-byte encoding)
11212 {"",
11213 {kVarInt62FourBytes + 0x01, 0x00, 0x00, 0x38}}
11214 };
11215 // clang-format on
11216
11217 std::unique_ptr<QuicEncryptedPacket> encrypted(
11218 AssemblePacketFromFragments(packet));
11219
11220 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11221
11222 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
11223 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11224}
11225
11226TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown8Bytes) {
11227 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070011228 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011229 return;
11230 }
zhongyi546cc452019-04-12 15:27:49 -070011231 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011232 // clang-format off
11233 PacketFragments packet = {
11234 // type (short header, 4 byte packet number)
11235 {"",
11236 {0x43}},
11237 // connection_id
11238 {"",
11239 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11240 // packet number
11241 {"",
11242 {0x12, 0x34, 0x9A, 0xBC}},
11243 // frame type (unknown value, eight-byte encoding)
11244 {"",
11245 {kVarInt62EightBytes + 0x01, 0x00, 0x00, 0x01, 0x02, 0x34, 0x56, 0x38}}
11246 };
11247 // clang-format on
11248
11249 std::unique_ptr<QuicEncryptedPacket> encrypted(
11250 AssemblePacketFromFragments(packet));
11251
11252 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11253
11254 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
11255 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
11256}
11257
11258// Three tests to check that known frame types that are not minimally
11259// encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
11260// information "Frame type not minimally encoded."
11261// Look at the frame-type encoded in 2, 4, and 8 bytes.
11262TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2Bytes) {
11263 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070011264 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011265 return;
11266 }
zhongyi546cc452019-04-12 15:27:49 -070011267 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011268
11269 // clang-format off
11270 PacketFragments packet = {
11271 // type (short header, 4 byte packet number)
11272 {"",
11273 {0x43}},
11274 // connection_id
11275 {"",
11276 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11277 // packet number
11278 {"",
11279 {0x12, 0x34, 0x9A, 0xBC}},
11280 // frame type (Blocked, two-byte encoding)
11281 {"",
11282 {kVarInt62TwoBytes + 0x00, 0x08}}
11283 };
11284 // clang-format on
11285
11286 std::unique_ptr<QuicEncryptedPacket> encrypted(
11287 AssemblePacketFromFragments(packet));
11288
11289 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11290
11291 EXPECT_EQ(IETF_QUIC_PROTOCOL_VIOLATION, framer_.error());
11292 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11293}
11294
11295TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown4Bytes) {
11296 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070011297 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011298 return;
11299 }
zhongyi546cc452019-04-12 15:27:49 -070011300 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011301
11302 // clang-format off
11303 PacketFragments packet = {
11304 // type (short header, 4 byte packet number)
11305 {"",
11306 {0x43}},
11307 // connection_id
11308 {"",
11309 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11310 // packet number
11311 {"",
11312 {0x12, 0x34, 0x9A, 0xBC}},
11313 // frame type (Blocked, four-byte encoding)
11314 {"",
11315 {kVarInt62FourBytes + 0x00, 0x00, 0x00, 0x08}}
11316 };
11317 // clang-format on
11318
11319 std::unique_ptr<QuicEncryptedPacket> encrypted(
11320 AssemblePacketFromFragments(packet));
11321
11322 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11323
11324 EXPECT_EQ(IETF_QUIC_PROTOCOL_VIOLATION, framer_.error());
11325 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11326}
11327
11328TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown8Bytes) {
11329 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070011330 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011331 return;
11332 }
zhongyi546cc452019-04-12 15:27:49 -070011333 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011334 // clang-format off
11335 PacketFragments packet = {
11336 // type (short header, 4 byte packet number)
11337 {"",
11338 {0x43}},
11339 // connection_id
11340 {"",
11341 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11342 // packet number
11343 {"",
11344 {0x12, 0x34, 0x9A, 0xBC}},
11345 // frame type (Blocked, eight-byte encoding)
11346 {"",
11347 {kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08}}
11348 };
11349 // clang-format on
11350
11351 std::unique_ptr<QuicEncryptedPacket> encrypted(
11352 AssemblePacketFromFragments(packet));
11353
11354 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11355
11356 EXPECT_EQ(IETF_QUIC_PROTOCOL_VIOLATION, framer_.error());
11357 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11358}
11359
11360// Tests to check that all known OETF frame types that are not minimally
11361// encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
11362// information "Frame type not minimally encoded."
11363// Just look at 2-byte encoding.
11364TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2BytesAllTypes) {
11365 // This test only for version 99.
fkastenholz305e1732019-06-18 05:01:22 -070011366 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011367 return;
11368 }
zhongyi546cc452019-04-12 15:27:49 -070011369 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011370
11371 // clang-format off
11372 PacketFragments packets[] = {
11373 {
11374 // type (short header, 4 byte packet number)
11375 {"",
11376 {0x43}},
11377 // connection_id
11378 {"",
11379 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11380 // packet number
11381 {"",
11382 {0x12, 0x34, 0x9A, 0xBC}},
11383 // frame type (two-byte encoding)
11384 {"",
11385 {kVarInt62TwoBytes + 0x00, 0x00}}
11386 },
11387 {
11388 // type (short header, 4 byte packet number)
11389 {"",
11390 {0x43}},
11391 // connection_id
11392 {"",
11393 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11394 // packet number
11395 {"",
11396 {0x12, 0x34, 0x9A, 0xBC}},
11397 // frame type (two-byte encoding)
11398 {"",
11399 {kVarInt62TwoBytes + 0x00, 0x01}}
11400 },
11401 {
11402 // type (short header, 4 byte packet number)
11403 {"",
11404 {0x43}},
11405 // connection_id
11406 {"",
11407 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11408 // packet number
11409 {"",
11410 {0x12, 0x34, 0x9A, 0xBC}},
11411 // frame type (two-byte encoding)
11412 {"",
11413 {kVarInt62TwoBytes + 0x00, 0x02}}
11414 },
11415 {
11416 // type (short header, 4 byte packet number)
11417 {"",
11418 {0x43}},
11419 // connection_id
11420 {"",
11421 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11422 // packet number
11423 {"",
11424 {0x12, 0x34, 0x9A, 0xBC}},
11425 // frame type (two-byte encoding)
11426 {"",
11427 {kVarInt62TwoBytes + 0x00, 0x03}}
11428 },
11429 {
11430 // type (short header, 4 byte packet number)
11431 {"",
11432 {0x43}},
11433 // connection_id
11434 {"",
11435 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11436 // packet number
11437 {"",
11438 {0x12, 0x34, 0x9A, 0xBC}},
11439 // frame type (two-byte encoding)
11440 {"",
11441 {kVarInt62TwoBytes + 0x00, 0x04}}
11442 },
11443 {
11444 // type (short header, 4 byte packet number)
11445 {"",
11446 {0x43}},
11447 // connection_id
11448 {"",
11449 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11450 // packet number
11451 {"",
11452 {0x12, 0x34, 0x9A, 0xBC}},
11453 // frame type (two-byte encoding)
11454 {"",
11455 {kVarInt62TwoBytes + 0x00, 0x05}}
11456 },
11457 {
11458 // type (short header, 4 byte packet number)
11459 {"",
11460 {0x43}},
11461 // connection_id
11462 {"",
11463 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11464 // packet number
11465 {"",
11466 {0x12, 0x34, 0x9A, 0xBC}},
11467 // frame type (two-byte encoding)
11468 {"",
11469 {kVarInt62TwoBytes + 0x00, 0x06}}
11470 },
11471 {
11472 // type (short header, 4 byte packet number)
11473 {"",
11474 {0x43}},
11475 // connection_id
11476 {"",
11477 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11478 // packet number
11479 {"",
11480 {0x12, 0x34, 0x9A, 0xBC}},
11481 // frame type (two-byte encoding)
11482 {"",
11483 {kVarInt62TwoBytes + 0x00, 0x07}}
11484 },
11485 {
11486 // type (short header, 4 byte packet number)
11487 {"",
11488 {0x43}},
11489 // connection_id
11490 {"",
11491 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11492 // packet number
11493 {"",
11494 {0x12, 0x34, 0x9A, 0xBC}},
11495 // frame type (two-byte encoding)
11496 {"",
11497 {kVarInt62TwoBytes + 0x00, 0x08}}
11498 },
11499 {
11500 // type (short header, 4 byte packet number)
11501 {"",
11502 {0x43}},
11503 // connection_id
11504 {"",
11505 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11506 // packet number
11507 {"",
11508 {0x12, 0x34, 0x9A, 0xBC}},
11509 // frame type (two-byte encoding)
11510 {"",
11511 {kVarInt62TwoBytes + 0x00, 0x09}}
11512 },
11513 {
11514 // type (short header, 4 byte packet number)
11515 {"",
11516 {0x43}},
11517 // connection_id
11518 {"",
11519 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11520 // packet number
11521 {"",
11522 {0x12, 0x34, 0x9A, 0xBC}},
11523 // frame type (two-byte encoding)
11524 {"",
11525 {kVarInt62TwoBytes + 0x00, 0x0a}}
11526 },
11527 {
11528 // type (short header, 4 byte packet number)
11529 {"",
11530 {0x43}},
11531 // connection_id
11532 {"",
11533 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11534 // packet number
11535 {"",
11536 {0x12, 0x34, 0x9A, 0xBC}},
11537 // frame type (two-byte encoding)
11538 {"",
11539 {kVarInt62TwoBytes + 0x00, 0x0b}}
11540 },
11541 {
11542 // type (short header, 4 byte packet number)
11543 {"",
11544 {0x43}},
11545 // connection_id
11546 {"",
11547 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11548 // packet number
11549 {"",
11550 {0x12, 0x34, 0x9A, 0xBC}},
11551 // frame type (two-byte encoding)
11552 {"",
11553 {kVarInt62TwoBytes + 0x00, 0x0c}}
11554 },
11555 {
11556 // type (short header, 4 byte packet number)
11557 {"",
11558 {0x43}},
11559 // connection_id
11560 {"",
11561 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11562 // packet number
11563 {"",
11564 {0x12, 0x34, 0x9A, 0xBC}},
11565 // frame type (two-byte encoding)
11566 {"",
11567 {kVarInt62TwoBytes + 0x00, 0x0d}}
11568 },
11569 {
11570 // type (short header, 4 byte packet number)
11571 {"",
11572 {0x43}},
11573 // connection_id
11574 {"",
11575 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11576 // packet number
11577 {"",
11578 {0x12, 0x34, 0x9A, 0xBC}},
11579 // frame type (two-byte encoding)
11580 {"",
11581 {kVarInt62TwoBytes + 0x00, 0x0e}}
11582 },
11583 {
11584 // type (short header, 4 byte packet number)
11585 {"",
11586 {0x43}},
11587 // connection_id
11588 {"",
11589 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11590 // packet number
11591 {"",
11592 {0x12, 0x34, 0x9A, 0xBC}},
11593 // frame type (two-byte encoding)
11594 {"",
11595 {kVarInt62TwoBytes + 0x00, 0x0f}}
11596 },
11597 {
11598 // type (short header, 4 byte packet number)
11599 {"",
11600 {0x43}},
11601 // connection_id
11602 {"",
11603 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11604 // packet number
11605 {"",
11606 {0x12, 0x34, 0x9A, 0xBC}},
11607 // frame type (two-byte encoding)
11608 {"",
11609 {kVarInt62TwoBytes + 0x00, 0x10}}
11610 },
11611 {
11612 // type (short header, 4 byte packet number)
11613 {"",
11614 {0x43}},
11615 // connection_id
11616 {"",
11617 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11618 // packet number
11619 {"",
11620 {0x12, 0x34, 0x9A, 0xBC}},
11621 // frame type (two-byte encoding)
11622 {"",
11623 {kVarInt62TwoBytes + 0x00, 0x11}}
11624 },
11625 {
11626 // type (short header, 4 byte packet number)
11627 {"",
11628 {0x43}},
11629 // connection_id
11630 {"",
11631 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11632 // packet number
11633 {"",
11634 {0x12, 0x34, 0x9A, 0xBC}},
11635 // frame type (two-byte encoding)
11636 {"",
11637 {kVarInt62TwoBytes + 0x00, 0x12}}
11638 },
11639 {
11640 // type (short header, 4 byte packet number)
11641 {"",
11642 {0x43}},
11643 // connection_id
11644 {"",
11645 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11646 // packet number
11647 {"",
11648 {0x12, 0x34, 0x9A, 0xBC}},
11649 // frame type (two-byte encoding)
11650 {"",
11651 {kVarInt62TwoBytes + 0x00, 0x13}}
11652 },
11653 {
11654 // type (short header, 4 byte packet number)
11655 {"",
11656 {0x43}},
11657 // connection_id
11658 {"",
11659 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11660 // packet number
11661 {"",
11662 {0x12, 0x34, 0x9A, 0xBC}},
11663 // frame type (two-byte encoding)
11664 {"",
11665 {kVarInt62TwoBytes + 0x00, 0x14}}
11666 },
11667 {
11668 // type (short header, 4 byte packet number)
11669 {"",
11670 {0x43}},
11671 // connection_id
11672 {"",
11673 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11674 // packet number
11675 {"",
11676 {0x12, 0x34, 0x9A, 0xBC}},
11677 // frame type (two-byte encoding)
11678 {"",
11679 {kVarInt62TwoBytes + 0x00, 0x15}}
11680 },
11681 {
11682 // type (short header, 4 byte packet number)
11683 {"",
11684 {0x43}},
11685 // connection_id
11686 {"",
11687 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11688 // packet number
11689 {"",
11690 {0x12, 0x34, 0x9A, 0xBC}},
11691 // frame type (two-byte encoding)
11692 {"",
11693 {kVarInt62TwoBytes + 0x00, 0x16}}
11694 },
11695 {
11696 // type (short header, 4 byte packet number)
11697 {"",
11698 {0x43}},
11699 // connection_id
11700 {"",
11701 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11702 // packet number
11703 {"",
11704 {0x12, 0x34, 0x9A, 0xBC}},
11705 // frame type (two-byte encoding)
11706 {"",
11707 {kVarInt62TwoBytes + 0x00, 0x17}}
11708 },
11709 {
11710 // type (short header, 4 byte packet number)
11711 {"",
11712 {0x43}},
11713 // connection_id
11714 {"",
11715 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11716 // packet number
11717 {"",
11718 {0x12, 0x34, 0x9A, 0xBC}},
11719 // frame type (two-byte encoding)
11720 {"",
11721 {kVarInt62TwoBytes + 0x00, 0x18}}
11722 },
11723 {
11724 // type (short header, 4 byte packet number)
11725 {"",
11726 {0x43}},
11727 // connection_id
11728 {"",
11729 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11730 // packet number
11731 {"",
11732 {0x12, 0x34, 0x9A, 0xBC}},
11733 // frame type (two-byte encoding)
11734 {"",
11735 {kVarInt62TwoBytes + 0x00, 0x20}}
11736 },
11737 {
11738 // type (short header, 4 byte packet number)
11739 {"",
11740 {0x43}},
11741 // connection_id
11742 {"",
11743 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11744 // packet number
11745 {"",
11746 {0x12, 0x34, 0x9A, 0xBC}},
11747 // frame type (two-byte encoding)
11748 {"",
11749 {kVarInt62TwoBytes + 0x00, 0x21}}
11750 },
11751 };
11752 // clang-format on
11753
11754 for (PacketFragments& packet : packets) {
11755 std::unique_ptr<QuicEncryptedPacket> encrypted(
11756 AssemblePacketFromFragments(packet));
11757
11758 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11759
11760 EXPECT_EQ(IETF_QUIC_PROTOCOL_VIOLATION, framer_.error());
11761 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11762 }
11763}
11764
11765TEST_P(QuicFramerTest, RetireConnectionIdFrame) {
fkastenholz305e1732019-06-18 05:01:22 -070011766 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011767 // This frame is only for version 99.
11768 return;
11769 }
zhongyi546cc452019-04-12 15:27:49 -070011770 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011771 // clang-format off
11772 PacketFragments packet99 = {
11773 // type (short header, 4 byte packet number)
11774 {"",
11775 {0x43}},
11776 // connection_id
11777 {"",
11778 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11779 // packet number
11780 {"",
11781 {0x12, 0x34, 0x56, 0x78}},
11782 // frame type (IETF_RETIRE_CONNECTION_ID frame)
11783 {"",
11784 {0x19}},
11785 // Sequence number
11786 {"Unable to read retire connection ID frame sequence number.",
11787 {kVarInt62TwoBytes + 0x11, 0x22}}
11788 };
11789 // clang-format on
11790
11791 std::unique_ptr<QuicEncryptedPacket> encrypted(
11792 AssemblePacketFromFragments(packet99));
11793 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11794
11795 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
11796 ASSERT_TRUE(visitor_.header_.get());
11797 EXPECT_TRUE(CheckDecryption(
11798 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11799 PACKET_8BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID));
11800
11801 EXPECT_EQ(0u, visitor_.stream_frames_.size());
11802
11803 EXPECT_EQ(0x1122u, visitor_.retire_connection_id_.sequence_number);
11804
11805 ASSERT_EQ(0u, visitor_.ack_frames_.size());
11806
11807 CheckFramingBoundaries(packet99, QUIC_INVALID_RETIRE_CONNECTION_ID_DATA);
11808}
11809
11810TEST_P(QuicFramerTest, BuildRetireConnectionIdFramePacket) {
fkastenholz305e1732019-06-18 05:01:22 -070011811 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011812 // This frame is only for version 99.
11813 return;
11814 }
QUICHE team2252b702019-05-14 23:55:14 -040011815 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011816 QuicPacketHeader header;
11817 header.destination_connection_id = FramerTestConnectionId();
11818 header.reset_flag = false;
11819 header.version_flag = false;
11820 header.packet_number = kPacketNumber;
11821
11822 QuicRetireConnectionIdFrame frame;
11823 frame.sequence_number = 0x1122;
11824
11825 QuicFrames frames = {QuicFrame(&frame)};
11826
11827 // clang-format off
11828 unsigned char packet99[] = {
11829 // type (short header, 4 byte packet number)
11830 0x43,
11831 // connection_id
11832 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11833 // packet number
11834 0x12, 0x34, 0x56, 0x78,
11835
11836 // frame type (IETF_RETIRE_CONNECTION_ID frame)
11837 0x19,
11838 // sequence number
11839 kVarInt62TwoBytes + 0x11, 0x22
11840 };
11841 // clang-format on
11842
11843 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11844 ASSERT_TRUE(data != nullptr);
11845
11846 test::CompareCharArraysWithHexError("constructed packet", data->data(),
11847 data->length(), AsChars(packet99),
11848 QUIC_ARRAYSIZE(packet99));
11849}
11850
11851TEST_P(QuicFramerTest, AckFrameWithInvalidLargestObserved) {
zhongyi546cc452019-04-12 15:27:49 -070011852 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011853 // clang-format off
11854 unsigned char packet[] = {
11855 // public flags (8 byte connection_id)
11856 0x2C,
11857 // connection_id
11858 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11859 // packet number
11860 0x12, 0x34, 0x56, 0x78,
11861
11862 // frame type (ack frame)
11863 0x45,
11864 // largest observed
11865 0x00, 0x00,
11866 // Zero delta time.
11867 0x00, 0x00,
11868 // first ack block length.
11869 0x00, 0x00,
11870 // num timestamps.
11871 0x00
11872 };
11873
QUICHE teama6ef0a62019-03-07 20:34:33 -050011874 unsigned char packet46[] = {
11875 // type (short header, 4 byte packet number)
11876 0x43,
11877 // connection_id
11878 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11879 // packet number
11880 0x12, 0x34, 0x56, 0x78,
11881
11882 // frame type (ack frame)
11883 0x45,
11884 // largest observed
11885 0x00, 0x00,
11886 // Zero delta time.
11887 0x00, 0x00,
11888 // first ack block length.
11889 0x00, 0x00,
11890 // num timestamps.
11891 0x00
11892 };
11893
11894 unsigned char packet99[] = {
11895 // type (short header, 4 byte packet number)
11896 0x43,
11897 // connection_id
11898 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11899 // packet number
11900 0x12, 0x34, 0x56, 0x78,
11901
11902 // frame type (IETF_ACK frame)
11903 0x02,
11904 // Largest acked
11905 kVarInt62OneByte + 0x00,
11906 // Zero delta time.
11907 kVarInt62OneByte + 0x00,
11908 // Ack block count 0
11909 kVarInt62OneByte + 0x00,
11910 // First ack block length
11911 kVarInt62OneByte + 0x00,
11912 };
11913 // clang-format on
11914
11915 unsigned char* p = packet;
11916 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -070011917 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011918 p = packet99;
11919 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -070011920 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
fayang374888f2019-05-31 06:47:21 -070011921 p = packet46;
QUICHE teama6ef0a62019-03-07 20:34:33 -050011922 }
11923
11924 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
11925 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
11926 EXPECT_EQ(framer_.detailed_error(), "Largest acked is 0.");
11927}
11928
11929TEST_P(QuicFramerTest, FirstAckBlockJustUnderFlow) {
zhongyi546cc452019-04-12 15:27:49 -070011930 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050011931 // clang-format off
11932 unsigned char packet[] = {
11933 // public flags (8 byte connection_id)
11934 0x2C,
11935 // connection_id
11936 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11937 // packet number
11938 0x12, 0x34, 0x56, 0x78,
11939
11940 // frame type (ack frame)
11941 0x45,
11942 // largest observed
11943 0x00, 0x02,
11944 // Zero delta time.
11945 0x00, 0x00,
11946 // first ack block length.
11947 0x00, 0x03,
11948 // num timestamps.
11949 0x00
11950 };
11951
QUICHE teama6ef0a62019-03-07 20:34:33 -050011952 unsigned char packet46[] = {
11953 // type (short header, 4 byte packet number)
11954 0x43,
11955 // connection_id
11956 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11957 // packet number
11958 0x12, 0x34, 0x56, 0x78,
11959
11960 // frame type (ack frame)
11961 0x45,
11962 // largest observed
11963 0x00, 0x02,
11964 // Zero delta time.
11965 0x00, 0x00,
11966 // first ack block length.
11967 0x00, 0x03,
11968 // num timestamps.
11969 0x00
11970 };
11971
11972 unsigned char packet99[] = {
11973 // type (short header, 4 byte packet number)
11974 0x43,
11975 // connection_id
11976 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11977 // packet number
11978 0x12, 0x34, 0x56, 0x78,
11979
11980 // frame type (IETF_ACK frame)
11981 0x02,
11982 // Largest acked
11983 kVarInt62OneByte + 0x02,
11984 // Zero delta time.
11985 kVarInt62OneByte + 0x00,
11986 // Ack block count 0
11987 kVarInt62OneByte + 0x00,
11988 // First ack block length
11989 kVarInt62OneByte + 0x02,
11990 };
11991 // clang-format on
11992
11993 unsigned char* p = packet;
11994 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -070011995 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011996 p = packet99;
11997 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -070011998 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011999 p = packet46;
12000 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012001 }
12002
12003 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
12004 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12005 EXPECT_EQ(framer_.detailed_error(),
12006 "Underflow with first ack block length 3 largest acked is 2.");
12007}
12008
12009TEST_P(QuicFramerTest, ThirdAckBlockJustUnderflow) {
zhongyi546cc452019-04-12 15:27:49 -070012010 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012011 // clang-format off
12012 unsigned char packet[] = {
12013 // public flags (8 byte connection_id)
12014 0x2C,
12015 // connection_id
12016 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12017 // packet number
12018 0x12, 0x34, 0x56, 0x78,
12019
12020 // frame type (ack frame)
12021 0x60,
12022 // largest observed
12023 0x0A,
12024 // Zero delta time.
12025 0x00, 0x00,
12026 // Num of ack blocks
12027 0x02,
12028 // first ack block length.
12029 0x02,
12030 // gap to next block
12031 0x01,
12032 // ack block length
12033 0x01,
12034 // gap to next block
12035 0x01,
12036 // ack block length
12037 0x06,
12038 // num timestamps.
12039 0x00
12040 };
12041
QUICHE teama6ef0a62019-03-07 20:34:33 -050012042 unsigned char packet46[] = {
12043 // type (short header, 4 byte packet number)
12044 0x43,
12045 // connection_id
12046 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12047 // packet number
12048 0x12, 0x34, 0x56, 0x78,
12049
12050 // frame type (ack frame)
12051 0x60,
12052 // largest observed
12053 0x0A,
12054 // Zero delta time.
12055 0x00, 0x00,
12056 // Num of ack blocks
12057 0x02,
12058 // first ack block length.
12059 0x02,
12060 // gap to next block
12061 0x01,
12062 // ack block length
12063 0x01,
12064 // gap to next block
12065 0x01,
12066 // ack block length
12067 0x06,
12068 // num timestamps.
12069 0x00
12070 };
12071
12072 unsigned char packet99[] = {
12073 // type (short header, 4 byte packet number)
12074 0x43,
12075 // connection_id
12076 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12077 // packet number
12078 0x12, 0x34, 0x56, 0x78,
12079
12080 // frame type (IETF_ACK frame)
12081 0x02,
12082 // Largest acked
12083 kVarInt62OneByte + 0x0A,
12084 // Zero delta time.
12085 kVarInt62OneByte + 0x00,
12086 // Ack block count 2
12087 kVarInt62OneByte + 0x02,
12088 // First ack block length
12089 kVarInt62OneByte + 0x01,
12090 // gap to next block length
12091 kVarInt62OneByte + 0x00,
12092 // ack block length
12093 kVarInt62OneByte + 0x00,
12094 // gap to next block length
12095 kVarInt62OneByte + 0x00,
12096 // ack block length
12097 kVarInt62OneByte + 0x05,
12098 };
12099 // clang-format on
12100
12101 unsigned char* p = packet;
12102 size_t p_size = QUIC_ARRAYSIZE(packet);
fkastenholz305e1732019-06-18 05:01:22 -070012103 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050012104 p = packet99;
12105 p_size = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -070012106 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050012107 p = packet46;
12108 p_size = QUIC_ARRAYSIZE(packet46);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012109 }
12110
12111 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
12112 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
fkastenholz305e1732019-06-18 05:01:22 -070012113 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050012114 EXPECT_EQ(framer_.detailed_error(),
12115 "Underflow with ack block length 6 latest ack block end is 5.");
12116 } else {
12117 EXPECT_EQ(framer_.detailed_error(),
12118 "Underflow with ack block length 6, end of block is 6.");
12119 }
12120}
12121
12122TEST_P(QuicFramerTest, CoalescedPacket) {
12123 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12124 return;
12125 }
zhongyi546cc452019-04-12 15:27:49 -070012126 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012127 // clang-format off
12128 unsigned char packet[] = {
12129 // first coalesced packet
12130 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12131 // 4-byte packet number)
12132 0xD3,
12133 // version
12134 QUIC_VERSION_BYTES,
12135 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070012136 0x08,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012137 // destination connection ID
12138 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -070012139 // source connection ID length
12140 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012141 // long header packet length
12142 0x1E,
12143 // packet number
12144 0x12, 0x34, 0x56, 0x78,
12145 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12146 0x08 | 0x01 | 0x02 | 0x04,
12147 // stream id
12148 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12149 // offset
12150 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12151 0x32, 0x10, 0x76, 0x54,
12152 // data length
12153 kVarInt62OneByte + 0x0c,
12154 // data
12155 'h', 'e', 'l', 'l',
12156 'o', ' ', 'w', 'o',
12157 'r', 'l', 'd', '!',
12158 // second coalesced packet
12159 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12160 // 4-byte packet number)
12161 0xD3,
12162 // version
12163 QUIC_VERSION_BYTES,
12164 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070012165 0x08,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012166 // destination connection ID
12167 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -070012168 // source connection ID length
12169 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012170 // long header packet length
12171 0x1E,
12172 // packet number
12173 0x12, 0x34, 0x56, 0x79,
12174 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12175 0x08 | 0x01 | 0x02 | 0x04,
12176 // stream id
12177 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12178 // offset
12179 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12180 0x32, 0x10, 0x76, 0x54,
12181 // data length
12182 kVarInt62OneByte + 0x0c,
12183 // data
12184 'H', 'E', 'L', 'L',
12185 'O', '_', 'W', 'O',
12186 'R', 'L', 'D', '?',
12187 };
12188 // clang-format on
12189
12190 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
12191 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12192
12193 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
12194 ASSERT_TRUE(visitor_.header_.get());
12195
12196 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12197 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12198
12199 // Stream ID should be the last 3 bytes of kStreamId.
12200 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12201 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12202 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12203 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12204
12205 ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
12206 EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
12207
12208 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
12209 ASSERT_TRUE(visitor_.header_.get());
12210
12211 ASSERT_EQ(2u, visitor_.stream_frames_.size());
12212 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12213
12214 // Stream ID should be the last 3 bytes of kStreamId.
12215 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[1]->stream_id);
12216 EXPECT_TRUE(visitor_.stream_frames_[1]->fin);
12217 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[1]->offset);
12218 CheckStreamFrameData("HELLO_WORLD?", visitor_.stream_frames_[1].get());
12219}
12220
dschinazi4b5a68a2019-08-15 15:45:36 -070012221TEST_P(QuicFramerTest, UndecryptablePacketWithoutDecrypter) {
12222 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12223
12224 if (!framer_.version().KnowsWhichDecrypterToUse()) {
12225 // We create a bad client decrypter by using initial encryption with a
12226 // bogus connection ID; it should fail to decrypt everything.
12227 QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
12228 CrypterPair bogus_crypters;
12229 CryptoUtils::CreateTlsInitialCrypters(Perspective::IS_CLIENT,
12230 framer_.transport_version(),
12231 bogus_connection_id, &bogus_crypters);
12232 // This removes all other decrypters.
12233 framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
12234 std::move(bogus_crypters.decrypter));
12235 }
12236
dschinazi4b5a68a2019-08-15 15:45:36 -070012237 // clang-format off
12238 unsigned char packet[] = {
12239 // public flags (version included, 8-byte connection ID,
12240 // 4-byte packet number)
12241 0x28,
12242 // connection_id
12243 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12244 // packet number
12245 0x12, 0x34, 0x56, 0x00,
12246 // padding frames
12247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12251 };
fayang36825da2019-08-21 14:01:27 -070012252 unsigned char packet46[] = {
dschinazi4b5a68a2019-08-15 15:45:36 -070012253 // public flags (long header with packet type HANDSHAKE and
12254 // 4-byte packet number)
fayang36825da2019-08-21 14:01:27 -070012255 0xE3,
dschinazi4b5a68a2019-08-15 15:45:36 -070012256 // version
12257 QUIC_VERSION_BYTES,
12258 // connection ID lengths
12259 0x05,
12260 // source connection ID
12261 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12262 // long header packet length
12263 0x05,
12264 // packet number
12265 0x12, 0x34, 0x56, 0x00,
12266 // padding frames
12267 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12271 };
12272 unsigned char packet99[] = {
12273 // public flags (long header with packet type HANDSHAKE and
12274 // 4-byte packet number)
12275 0xE3,
12276 // version
12277 QUIC_VERSION_BYTES,
12278 // destination connection ID length
12279 0x00,
12280 // source connection ID length
12281 0x08,
12282 // source connection ID
12283 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12284 // long header packet length
12285 0x24,
12286 // packet number
12287 0x12, 0x34, 0x56, 0x00,
12288 // padding frames
12289 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12290 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12293 };
12294 // clang-format on
12295 unsigned char* p = packet;
12296 size_t p_length = QUIC_ARRAYSIZE(packet);
12297 if (framer_.transport_version() == QUIC_VERSION_99) {
12298 p = packet99;
12299 p_length = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -070012300 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
12301 p = packet46;
12302 p_length = QUIC_ARRAYSIZE(packet46);
dschinazi4b5a68a2019-08-15 15:45:36 -070012303 }
12304 // First attempt decryption without the handshake crypter.
12305 EXPECT_FALSE(
12306 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false)));
12307 EXPECT_EQ(QUIC_DECRYPTION_FAILURE, framer_.error());
12308 if (GetQuicRestartFlag(quic_framer_uses_undecryptable_upcall)) {
12309 ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12310 ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12311 ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12312 CompareCharArraysWithHexError(
12313 "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
12314 visitor_.undecryptable_packets_[0]->length(), AsChars(p), p_length);
12315 if (framer_.version().KnowsWhichDecrypterToUse()) {
12316 EXPECT_EQ(ENCRYPTION_HANDSHAKE,
12317 visitor_.undecryptable_decryption_levels_[0]);
12318 }
12319 EXPECT_FALSE(visitor_.undecryptable_has_decryption_keys_[0]);
12320 } else {
12321 EXPECT_EQ(0u, visitor_.undecryptable_packets_.size());
12322 EXPECT_EQ(0u, visitor_.undecryptable_decryption_levels_.size());
12323 EXPECT_EQ(0u, visitor_.undecryptable_has_decryption_keys_.size());
12324 }
12325}
12326
12327TEST_P(QuicFramerTest, UndecryptablePacketWithDecrypter) {
12328 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12329
12330 // We create a bad client decrypter by using initial encryption with a
12331 // bogus connection ID; it should fail to decrypt everything.
12332 QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
12333 CrypterPair bad_handshake_crypters;
12334 CryptoUtils::CreateTlsInitialCrypters(
12335 Perspective::IS_CLIENT, framer_.transport_version(), bogus_connection_id,
12336 &bad_handshake_crypters);
12337 if (framer_.version().KnowsWhichDecrypterToUse()) {
12338 framer_.InstallDecrypter(ENCRYPTION_HANDSHAKE,
12339 std::move(bad_handshake_crypters.decrypter));
12340 } else {
12341 framer_.SetDecrypter(ENCRYPTION_HANDSHAKE,
12342 std::move(bad_handshake_crypters.decrypter));
12343 }
12344
dschinazi4b5a68a2019-08-15 15:45:36 -070012345 // clang-format off
12346 unsigned char packet[] = {
12347 // public flags (version included, 8-byte connection ID,
12348 // 4-byte packet number)
12349 0x28,
12350 // connection_id
12351 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12352 // packet number
12353 0x12, 0x34, 0x56, 0x00,
12354 // padding frames
12355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12359 };
fayang36825da2019-08-21 14:01:27 -070012360 unsigned char packet46[] = {
dschinazi4b5a68a2019-08-15 15:45:36 -070012361 // public flags (long header with packet type HANDSHAKE and
12362 // 4-byte packet number)
fayang36825da2019-08-21 14:01:27 -070012363 0xE3,
dschinazi4b5a68a2019-08-15 15:45:36 -070012364 // version
12365 QUIC_VERSION_BYTES,
12366 // connection ID lengths
12367 0x05,
12368 // source connection ID
12369 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12370 // long header packet length
12371 0x05,
12372 // packet number
12373 0x12, 0x34, 0x56, 0x00,
12374 // padding frames
12375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12379 };
12380 unsigned char packet99[] = {
12381 // public flags (long header with packet type HANDSHAKE and
12382 // 4-byte packet number)
12383 0xE3,
12384 // version
12385 QUIC_VERSION_BYTES,
12386 // destination connection ID length
12387 0x00,
12388 // source connection ID length
12389 0x08,
12390 // source connection ID
12391 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12392 // long header packet length
12393 0x24,
12394 // packet number
12395 0x12, 0x34, 0x56, 0x00,
12396 // padding frames
12397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12398 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12399 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12400 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12401 };
12402 // clang-format on
12403 unsigned char* p = packet;
12404 size_t p_length = QUIC_ARRAYSIZE(packet);
12405 if (framer_.transport_version() == QUIC_VERSION_99) {
12406 p = packet99;
12407 p_length = QUIC_ARRAYSIZE(packet99);
fayang36825da2019-08-21 14:01:27 -070012408 } else if (framer_.transport_version() >= QUIC_VERSION_46) {
12409 p = packet46;
12410 p_length = QUIC_ARRAYSIZE(packet46);
dschinazi4b5a68a2019-08-15 15:45:36 -070012411 }
12412
12413 EXPECT_FALSE(
12414 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false)));
12415 EXPECT_EQ(QUIC_DECRYPTION_FAILURE, framer_.error());
12416 if (GetQuicRestartFlag(quic_framer_uses_undecryptable_upcall)) {
12417 ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12418 ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12419 ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12420 CompareCharArraysWithHexError(
12421 "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
12422 visitor_.undecryptable_packets_[0]->length(), AsChars(p), p_length);
12423 if (framer_.version().KnowsWhichDecrypterToUse()) {
12424 EXPECT_EQ(ENCRYPTION_HANDSHAKE,
12425 visitor_.undecryptable_decryption_levels_[0]);
12426 }
12427 EXPECT_EQ(framer_.version().KnowsWhichDecrypterToUse(),
12428 visitor_.undecryptable_has_decryption_keys_[0]);
12429 } else {
12430 EXPECT_EQ(0u, visitor_.undecryptable_packets_.size());
12431 EXPECT_EQ(0u, visitor_.undecryptable_decryption_levels_.size());
12432 EXPECT_EQ(0u, visitor_.undecryptable_has_decryption_keys_.size());
12433 }
12434}
12435
12436TEST_P(QuicFramerTest, UndecryptableCoalescedPacket) {
12437 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12438 return;
12439 }
12440 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
12441 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
12442 // We create a bad client decrypter by using initial encryption with a
12443 // bogus connection ID; it should fail to decrypt everything.
12444 QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
12445 CrypterPair bad_handshake_crypters;
12446 CryptoUtils::CreateTlsInitialCrypters(
12447 Perspective::IS_CLIENT, framer_.transport_version(), bogus_connection_id,
12448 &bad_handshake_crypters);
12449 framer_.InstallDecrypter(ENCRYPTION_HANDSHAKE,
12450 std::move(bad_handshake_crypters.decrypter));
12451 // clang-format off
12452 unsigned char packet[] = {
12453 // first coalesced packet
12454 // public flags (long header with packet type HANDSHAKE and
12455 // 4-byte packet number)
12456 0xE3,
12457 // version
12458 QUIC_VERSION_BYTES,
12459 // destination connection ID length
12460 0x08,
12461 // destination connection ID
12462 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12463 // source connection ID length
12464 0x00,
12465 // long header packet length
12466 0x1E,
12467 // packet number
12468 0x12, 0x34, 0x56, 0x78,
12469 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12470 0x08 | 0x01 | 0x02 | 0x04,
12471 // stream id
12472 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12473 // offset
12474 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12475 0x32, 0x10, 0x76, 0x54,
12476 // data length
12477 kVarInt62OneByte + 0x0c,
12478 // data
12479 'h', 'e', 'l', 'l',
12480 'o', ' ', 'w', 'o',
12481 'r', 'l', 'd', '!',
12482 // second coalesced packet
12483 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12484 // 4-byte packet number)
12485 0xD3,
12486 // version
12487 QUIC_VERSION_BYTES,
12488 // destination connection ID length
12489 0x08,
12490 // destination connection ID
12491 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12492 // source connection ID length
12493 0x00,
12494 // long header packet length
12495 0x1E,
12496 // packet number
12497 0x12, 0x34, 0x56, 0x79,
12498 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12499 0x08 | 0x01 | 0x02 | 0x04,
12500 // stream id
12501 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12502 // offset
12503 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12504 0x32, 0x10, 0x76, 0x54,
12505 // data length
12506 kVarInt62OneByte + 0x0c,
12507 // data
12508 'H', 'E', 'L', 'L',
12509 'O', '_', 'W', 'O',
12510 'R', 'L', 'D', '?',
12511 };
12512 // clang-format on
12513 const size_t length_of_first_coalesced_packet = 46;
12514
12515 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
12516 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12517
12518 EXPECT_EQ(QUIC_DECRYPTION_FAILURE, framer_.error());
12519
12520 if (GetQuicRestartFlag(quic_framer_uses_undecryptable_upcall)) {
12521 ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12522 ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12523 ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12524 // Make sure we only receive the first undecryptable packet and not the
12525 // full packet including the second coalesced packet.
12526 CompareCharArraysWithHexError(
12527 "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
12528 visitor_.undecryptable_packets_[0]->length(), AsChars(packet),
12529 length_of_first_coalesced_packet);
12530 EXPECT_EQ(ENCRYPTION_HANDSHAKE,
12531 visitor_.undecryptable_decryption_levels_[0]);
12532 EXPECT_TRUE(visitor_.undecryptable_has_decryption_keys_[0]);
12533 } else {
12534 EXPECT_EQ(0u, visitor_.undecryptable_packets_.size());
12535 EXPECT_EQ(0u, visitor_.undecryptable_decryption_levels_.size());
12536 EXPECT_EQ(0u, visitor_.undecryptable_has_decryption_keys_.size());
12537 }
12538
12539 // Make sure the second coalesced packet is parsed correctly.
12540 ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
12541 EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
12542
12543 ASSERT_TRUE(visitor_.header_.get());
12544
12545 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12546 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12547
12548 // Stream ID should be the last 3 bytes of kStreamId.
12549 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12550 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12551 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12552 CheckStreamFrameData("HELLO_WORLD?", visitor_.stream_frames_[0].get());
12553}
12554
QUICHE teama6ef0a62019-03-07 20:34:33 -050012555TEST_P(QuicFramerTest, MismatchedCoalescedPacket) {
12556 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12557 return;
12558 }
zhongyi546cc452019-04-12 15:27:49 -070012559 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012560 // clang-format off
12561 unsigned char packet[] = {
12562 // first coalesced packet
12563 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12564 // 4-byte packet number)
12565 0xD3,
12566 // version
12567 QUIC_VERSION_BYTES,
12568 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070012569 0x08,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012570 // destination connection ID
12571 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -070012572 // source connection ID length
12573 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012574 // long header packet length
12575 0x1E,
12576 // packet number
12577 0x12, 0x34, 0x56, 0x78,
12578 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12579 0x08 | 0x01 | 0x02 | 0x04,
12580 // stream id
12581 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12582 // offset
12583 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12584 0x32, 0x10, 0x76, 0x54,
12585 // data length
12586 kVarInt62OneByte + 0x0c,
12587 // data
12588 'h', 'e', 'l', 'l',
12589 'o', ' ', 'w', 'o',
12590 'r', 'l', 'd', '!',
12591 // second coalesced packet
12592 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12593 // 4-byte packet number)
12594 0xD3,
12595 // version
12596 QUIC_VERSION_BYTES,
12597 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070012598 0x08,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012599 // destination connection ID
12600 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
dschinazi48ac9192019-07-31 00:07:26 -070012601 // source connection ID length
12602 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012603 // long header packet length
12604 0x1E,
12605 // packet number
12606 0x12, 0x34, 0x56, 0x79,
12607 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12608 0x08 | 0x01 | 0x02 | 0x04,
12609 // stream id
12610 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12611 // offset
12612 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12613 0x32, 0x10, 0x76, 0x54,
12614 // data length
12615 kVarInt62OneByte + 0x0c,
12616 // data
12617 'H', 'E', 'L', 'L',
12618 'O', '_', 'W', 'O',
12619 'R', 'L', 'D', '?',
12620 };
12621 // clang-format on
12622
12623 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
12624 EXPECT_QUIC_PEER_BUG(EXPECT_TRUE(framer_.ProcessPacket(encrypted)),
12625 "Server: Received mismatched coalesced header.*");
12626
12627 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
12628 ASSERT_TRUE(visitor_.header_.get());
12629
12630 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12631 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12632
12633 // Stream ID should be the last 3 bytes of kStreamId.
12634 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12635 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12636 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12637 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12638
12639 ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
12640}
12641
12642TEST_P(QuicFramerTest, InvalidCoalescedPacket) {
12643 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12644 return;
12645 }
zhongyi546cc452019-04-12 15:27:49 -070012646 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012647 // clang-format off
12648 unsigned char packet[] = {
12649 // first coalesced packet
12650 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12651 // 4-byte packet number)
12652 0xD3,
12653 // version
12654 QUIC_VERSION_BYTES,
12655 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070012656 0x08,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012657 // destination connection ID
12658 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -070012659 // source connection ID length
12660 0x00,
QUICHE teama6ef0a62019-03-07 20:34:33 -050012661 // long header packet length
12662 0x1E,
12663 // packet number
12664 0x12, 0x34, 0x56, 0x78,
12665 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12666 0x08 | 0x01 | 0x02 | 0x04,
12667 // stream id
12668 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12669 // offset
12670 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12671 0x32, 0x10, 0x76, 0x54,
12672 // data length
12673 kVarInt62OneByte + 0x0c,
12674 // data
12675 'h', 'e', 'l', 'l',
12676 'o', ' ', 'w', 'o',
12677 'r', 'l', 'd', '!',
12678 // second coalesced packet
12679 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12680 // 4-byte packet number)
12681 0xD3,
12682 // version would be here but we cut off the invalid coalesced header.
12683 };
12684 // clang-format on
12685
12686 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
12687 EXPECT_QUIC_PEER_BUG(EXPECT_TRUE(framer_.ProcessPacket(encrypted)),
12688 "Server: Failed to parse received coalesced header.*");
12689
12690 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
12691 ASSERT_TRUE(visitor_.header_.get());
12692
12693 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12694 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12695
12696 // Stream ID should be the last 3 bytes of kStreamId.
12697 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12698 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12699 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12700 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12701
12702 ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
12703}
12704
dschinazia484f982019-05-23 03:54:44 -070012705// Some IETF implementations send an initial followed by zeroes instead of
12706// padding inside the initial. We need to make sure that we still process
12707// the initial correctly and ignore the zeroes.
12708TEST_P(QuicFramerTest, CoalescedPacketWithZeroesRoundTrip) {
12709 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12710 return;
12711 }
12712 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
12713 QuicConnectionId connection_id = FramerTestConnectionId();
12714 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12715
12716 CrypterPair client_crypters;
12717 CryptoUtils::CreateTlsInitialCrypters(Perspective::IS_CLIENT,
12718 framer_.transport_version(),
12719 connection_id, &client_crypters);
12720 framer_.SetEncrypter(ENCRYPTION_INITIAL,
12721 std::move(client_crypters.encrypter));
12722
12723 QuicPacketHeader header;
12724 header.destination_connection_id = connection_id;
12725 header.version_flag = true;
12726 header.packet_number = kPacketNumber;
12727 header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
12728 header.long_packet_type = INITIAL;
12729 header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
12730 header.retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_1;
12731 QuicFrames frames = {QuicFrame(QuicPingFrame())};
12732
12733 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
12734 ASSERT_NE(nullptr, data);
12735
12736 // Add zeroes after the valid initial packet.
12737 unsigned char packet[kMaxOutgoingPacketSize] = {};
12738 size_t encrypted_length =
12739 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number, *data,
12740 AsChars(packet), QUIC_ARRAYSIZE(packet));
12741 ASSERT_NE(0u, encrypted_length);
12742
12743 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
12744 CrypterPair server_crypters;
12745 CryptoUtils::CreateTlsInitialCrypters(Perspective::IS_SERVER,
12746 framer_.transport_version(),
12747 connection_id, &server_crypters);
12748 framer_.InstallDecrypter(ENCRYPTION_INITIAL,
12749 std::move(server_crypters.decrypter));
12750
12751 // Make sure the first long header initial packet parses correctly.
12752 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
12753
12754 // Make sure we discard the subsequent zeroes.
12755 EXPECT_QUIC_PEER_BUG(EXPECT_TRUE(framer_.ProcessPacket(encrypted)),
dschinazi48ac9192019-07-31 00:07:26 -070012756 "Server: (Failed to parse received|Received mismatched) "
12757 "coalesced header.*");
dschinazia484f982019-05-23 03:54:44 -070012758}
12759
dschinazie0df3f72019-05-06 16:37:51 -070012760TEST_P(QuicFramerTest, ClientReceivesInvalidVersion) {
fayang36825da2019-08-21 14:01:27 -070012761 if (framer_.transport_version() <= QUIC_VERSION_43) {
dschinazie0df3f72019-05-06 16:37:51 -070012762 return;
12763 }
12764 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12765
12766 // clang-format off
12767 unsigned char packet[] = {
12768 // public flags (long header with packet type INITIAL)
fayang36825da2019-08-21 14:01:27 -070012769 0xC3,
dschinazie0df3f72019-05-06 16:37:51 -070012770 // version that is different from the framer's version
12771 'Q', '0', '4', '3',
12772 // connection ID lengths
12773 0x05,
12774 // source connection ID
12775 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12776 // packet number
12777 0x01,
12778 // padding frame
12779 0x00,
12780 };
12781 // clang-format on
12782
12783 QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
12784 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12785
12786 EXPECT_EQ(QUIC_INVALID_VERSION, framer_.error());
12787 EXPECT_EQ("Client received unexpected version.", framer_.detailed_error());
12788}
12789
QUICHE teama6ef0a62019-03-07 20:34:33 -050012790TEST_P(QuicFramerTest, PacketHeaderWithVariableLengthConnectionId) {
dschinazib953d022019-08-01 18:05:58 -070012791 if (!QuicUtils::VariableLengthConnectionIdAllowedForVersion(
12792 framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050012793 return;
12794 }
zhongyi546cc452019-04-12 15:27:49 -070012795 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012796 char connection_id_bytes[9] = {0xFE, 0xDC, 0xBA, 0x98, 0x76,
12797 0x54, 0x32, 0x10, 0x42};
12798 QuicConnectionId connection_id(connection_id_bytes,
12799 sizeof(connection_id_bytes));
12800 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
dschinazi8ff74822019-05-28 16:37:20 -070012801 QuicFramerPeer::SetExpectedServerConnectionIDLength(&framer_,
12802 connection_id.length());
QUICHE teama6ef0a62019-03-07 20:34:33 -050012803
12804 // clang-format off
12805 PacketFragments packet = {
12806 // type (8 byte connection_id and 1 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -070012807 {"Unable to read first byte.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050012808 {0x40}},
12809 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -070012810 {"Unable to read destination connection ID.",
QUICHE teama6ef0a62019-03-07 20:34:33 -050012811 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
12812 // packet number
12813 {"Unable to read packet number.",
12814 {0x78}},
12815 };
nharper55fa6132019-05-07 19:37:21 -070012816
12817 PacketFragments packet_with_padding = {
12818 // type (8 byte connection_id and 1 byte packet number)
dschinazi48ac9192019-07-31 00:07:26 -070012819 {"Unable to read first byte.",
nharper55fa6132019-05-07 19:37:21 -070012820 {0x40}},
12821 // connection_id
dschinazi48ac9192019-07-31 00:07:26 -070012822 {"Unable to read destination connection ID.",
nharper55fa6132019-05-07 19:37:21 -070012823 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
12824 // packet number
12825 {"",
12826 {0x78}},
12827 // padding
12828 {"", {0x00, 0x00, 0x00}},
12829 };
QUICHE teama6ef0a62019-03-07 20:34:33 -050012830 // clang-format on
12831
nharper55fa6132019-05-07 19:37:21 -070012832 PacketFragments& fragments =
12833 framer_.version().HasHeaderProtection() ? packet_with_padding : packet;
QUICHE teama6ef0a62019-03-07 20:34:33 -050012834 std::unique_ptr<QuicEncryptedPacket> encrypted(
nharper55fa6132019-05-07 19:37:21 -070012835 AssemblePacketFromFragments(fragments));
12836 if (framer_.version().HasHeaderProtection()) {
12837 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
12838 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
12839 } else {
12840 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
12841 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
12842 }
QUICHE teama6ef0a62019-03-07 20:34:33 -050012843 ASSERT_TRUE(visitor_.header_.get());
12844 EXPECT_EQ(connection_id, visitor_.header_->destination_connection_id);
12845 EXPECT_FALSE(visitor_.header_->reset_flag);
12846 EXPECT_FALSE(visitor_.header_->version_flag);
12847 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
12848 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
12849
nharper55fa6132019-05-07 19:37:21 -070012850 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
QUICHE teama6ef0a62019-03-07 20:34:33 -050012851}
12852
QUICHE team10b22a12019-03-21 15:31:42 -070012853TEST_P(QuicFramerTest, MultiplePacketNumberSpaces) {
12854 if (framer_.transport_version() < QUIC_VERSION_46) {
12855 return;
12856 }
QUICHE team10b22a12019-03-21 15:31:42 -070012857 framer_.EnableMultiplePacketNumberSpacesSupport();
12858
12859 // clang-format off
12860 unsigned char long_header_packet[] = {
12861 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12862 // 4-byte packet number)
12863 0xD3,
12864 // version
12865 QUIC_VERSION_BYTES,
12866 // destination connection ID length
fayang91475c42019-06-19 08:04:26 -070012867 0x50,
QUICHE team10b22a12019-03-21 15:31:42 -070012868 // destination connection ID
fayang91475c42019-06-19 08:04:26 -070012869 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
QUICHE team10b22a12019-03-21 15:31:42 -070012870 // packet number
12871 0x12, 0x34, 0x56, 0x78,
12872 // padding frame
12873 0x00,
12874 };
12875 unsigned char long_header_packet99[] = {
12876 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12877 // 4-byte packet number)
12878 0xD3,
12879 // version
12880 QUIC_VERSION_BYTES,
12881 // destination connection ID length
dschinazi48ac9192019-07-31 00:07:26 -070012882 0x08,
QUICHE team10b22a12019-03-21 15:31:42 -070012883 // destination connection ID
fayang91475c42019-06-19 08:04:26 -070012884 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
dschinazi48ac9192019-07-31 00:07:26 -070012885 // source connection ID length
12886 0x00,
QUICHE team10b22a12019-03-21 15:31:42 -070012887 // long header packet length
12888 0x05,
12889 // packet number
12890 0x12, 0x34, 0x56, 0x78,
12891 // padding frame
12892 0x00,
12893 };
12894 // clang-format on
12895
zhongyi546cc452019-04-12 15:27:49 -070012896 if (framer_.version().KnowsWhichDecrypterToUse()) {
12897 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
vasilvv0fc587f2019-09-06 13:33:08 -070012898 std::make_unique<TestDecrypter>());
zhongyi546cc452019-04-12 15:27:49 -070012899 framer_.RemoveDecrypter(ENCRYPTION_INITIAL);
12900 } else {
vasilvv0fc587f2019-09-06 13:33:08 -070012901 framer_.SetDecrypter(ENCRYPTION_ZERO_RTT,
12902 std::make_unique<TestDecrypter>());
zhongyi546cc452019-04-12 15:27:49 -070012903 }
QUICHE team10b22a12019-03-21 15:31:42 -070012904 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12905 EXPECT_TRUE(framer_.ProcessPacket(
12906 QuicEncryptedPacket(AsChars(long_header_packet),
12907 QUIC_ARRAYSIZE(long_header_packet), false)));
12908 } else {
12909 EXPECT_TRUE(framer_.ProcessPacket(
12910 QuicEncryptedPacket(AsChars(long_header_packet99),
12911 QUIC_ARRAYSIZE(long_header_packet99), false)));
12912 }
12913
12914 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
12915 EXPECT_FALSE(
12916 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
12917 .IsInitialized());
12918 EXPECT_FALSE(
12919 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
12920 .IsInitialized());
12921 EXPECT_EQ(kPacketNumber, QuicFramerPeer::GetLargestDecryptedPacketNumber(
12922 &framer_, APPLICATION_DATA));
12923
12924 // clang-format off
12925 unsigned char short_header_packet[] = {
12926 // type (short header, 1 byte packet number)
12927 0x40,
12928 // connection_id
fayang91475c42019-06-19 08:04:26 -070012929 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
QUICHE team10b22a12019-03-21 15:31:42 -070012930 // packet number
12931 0x79,
12932 // padding frame
nharper55fa6132019-05-07 19:37:21 -070012933 0x00, 0x00, 0x00,
QUICHE team10b22a12019-03-21 15:31:42 -070012934 };
12935 // clang-format on
12936
12937 QuicEncryptedPacket short_header_encrypted(
12938 AsChars(short_header_packet), QUIC_ARRAYSIZE(short_header_packet), false);
zhongyi546cc452019-04-12 15:27:49 -070012939 if (framer_.version().KnowsWhichDecrypterToUse()) {
12940 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -070012941 std::make_unique<TestDecrypter>());
zhongyi546cc452019-04-12 15:27:49 -070012942 framer_.RemoveDecrypter(ENCRYPTION_ZERO_RTT);
12943 } else {
12944 framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -070012945 std::make_unique<TestDecrypter>());
zhongyi546cc452019-04-12 15:27:49 -070012946 }
QUICHE team10b22a12019-03-21 15:31:42 -070012947 EXPECT_TRUE(framer_.ProcessPacket(short_header_encrypted));
12948
12949 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
12950 EXPECT_FALSE(
12951 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
12952 .IsInitialized());
12953 EXPECT_FALSE(
12954 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
12955 .IsInitialized());
12956 EXPECT_EQ(kPacketNumber + 1, QuicFramerPeer::GetLargestDecryptedPacketNumber(
12957 &framer_, APPLICATION_DATA));
12958}
12959
nharper2ceb97c2019-04-19 11:38:59 -070012960TEST_P(QuicFramerTest, IetfRetryPacketRejected) {
dschinazi244f6dc2019-05-06 15:45:16 -070012961 if (!framer_.version().KnowsWhichDecrypterToUse() ||
12962 framer_.version().SupportsRetry()) {
nharper2ceb97c2019-04-19 11:38:59 -070012963 return;
12964 }
12965
12966 // clang-format off
fayang36825da2019-08-21 14:01:27 -070012967 PacketFragments packet46 = {
nharper9bb83462019-05-01 10:53:22 -070012968 // public flags (IETF Retry packet, 0-length original destination CID)
dschinazi48ac9192019-07-31 00:07:26 -070012969 {"Unable to read first byte.",
nharper9bb83462019-05-01 10:53:22 -070012970 {0xf0}},
12971 // version tag
12972 {"Unable to read protocol version.",
12973 {QUIC_VERSION_BYTES}},
12974 // connection_id length
dschinazi244f6dc2019-05-06 15:45:16 -070012975 {"RETRY not supported in this version.",
nharper2ceb97c2019-04-19 11:38:59 -070012976 {0x00}},
12977 };
12978 // clang-format on
12979
12980 std::unique_ptr<QuicEncryptedPacket> encrypted(
fayang36825da2019-08-21 14:01:27 -070012981 AssemblePacketFromFragments(packet46));
nharper2ceb97c2019-04-19 11:38:59 -070012982
12983 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
12984 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
fayang36825da2019-08-21 14:01:27 -070012985 CheckFramingBoundaries(packet46, QUIC_INVALID_PACKET_HEADER);
nharper2ceb97c2019-04-19 11:38:59 -070012986}
12987
12988TEST_P(QuicFramerTest, RetryPacketRejectedWithMultiplePacketNumberSpaces) {
dschinazi244f6dc2019-05-06 15:45:16 -070012989 if (framer_.transport_version() < QUIC_VERSION_46 ||
12990 framer_.version().SupportsRetry()) {
nharper2ceb97c2019-04-19 11:38:59 -070012991 return;
12992 }
12993 framer_.EnableMultiplePacketNumberSpacesSupport();
12994
12995 // clang-format off
12996 PacketFragments packet = {
12997 // public flags (IETF Retry packet, 0-length original destination CID)
dschinazi48ac9192019-07-31 00:07:26 -070012998 {"Unable to read first byte.",
nharper2ceb97c2019-04-19 11:38:59 -070012999 {0xf0}},
13000 // version tag
13001 {"Unable to read protocol version.",
13002 {QUIC_VERSION_BYTES}},
13003 // connection_id length
dschinazi244f6dc2019-05-06 15:45:16 -070013004 {"RETRY not supported in this version.",
nharper2ceb97c2019-04-19 11:38:59 -070013005 {0x00}},
13006 };
13007 // clang-format on
13008
13009 std::unique_ptr<QuicEncryptedPacket> encrypted(
13010 AssemblePacketFromFragments(packet));
13011
13012 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13013 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
13014 CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
13015}
13016
nharpera745e392019-04-19 12:05:15 -070013017TEST_P(QuicFramerTest, ProcessPublicHeaderNoVersionInferredType) {
13018 // The framer needs to have Perspective::IS_SERVER and configured to infer the
13019 // packet header type from the packet (not the version). The framer's version
13020 // needs to be one that uses the IETF packet format.
13021 if (!framer_.version().KnowsWhichDecrypterToUse()) {
13022 return;
13023 }
13024 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13025
13026 // Prepare a packet that uses the Google QUIC packet header but has no version
13027 // field.
13028
13029 // clang-format off
13030 PacketFragments packet = {
13031 // public flags (1-byte packet number, 8-byte connection_id, no version)
13032 {"Unable to read public flags.",
13033 {0x08}},
13034 // connection_id
13035 {"Unable to read ConnectionId.",
13036 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
13037 // packet number
13038 {"Unable to read packet number.",
13039 {0x01}},
13040 // padding
13041 {"Invalid public header type for expected version.",
13042 {0x00}},
13043 };
13044 // clang-format on
13045
13046 PacketFragments& fragments = packet;
13047
13048 std::unique_ptr<QuicEncryptedPacket> encrypted(
13049 AssemblePacketFromFragments(fragments));
13050
13051 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13052 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
nharper8b6d63a2019-05-03 10:34:53 -070013053 EXPECT_EQ("Invalid public header type for expected version.",
13054 framer_.detailed_error());
nharpera745e392019-04-19 12:05:15 -070013055 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
13056}
13057
nharper3f283562019-05-02 16:37:12 -070013058TEST_P(QuicFramerTest, ProcessMismatchedHeaderVersion) {
13059 // The framer needs to have Perspective::IS_SERVER and configured to infer the
13060 // packet header type from the packet (not the version). The framer's version
13061 // needs to be one that uses the IETF packet format.
13062 if (!framer_.version().KnowsWhichDecrypterToUse()) {
13063 return;
13064 }
13065 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13066
13067 // clang-format off
13068 PacketFragments packet = {
dschinazi072da7c2019-05-07 17:57:42 -070013069 // public flags (Google QUIC header with version present)
nharper3f283562019-05-02 16:37:12 -070013070 {"Unable to read public flags.",
13071 {0x09}},
13072 // connection_id
13073 {"Unable to read ConnectionId.",
13074 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
13075 // version tag
13076 {"Unable to read protocol version.",
13077 {QUIC_VERSION_BYTES}},
13078 // packet number
13079 {"Unable to read packet number.",
13080 {0x01}},
13081 };
13082 // clang-format on
13083
13084 std::unique_ptr<QuicEncryptedPacket> encrypted(
13085 AssemblePacketFromFragments(packet));
13086 framer_.ProcessPacket(*encrypted);
13087
13088 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13089 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
nharper8b6d63a2019-05-03 10:34:53 -070013090 EXPECT_EQ("Invalid public header type for expected version.",
13091 framer_.detailed_error());
nharper3f283562019-05-02 16:37:12 -070013092 CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
13093}
13094
dschinazi48ac9192019-07-31 00:07:26 -070013095TEST_P(QuicFramerTest, WriteClientVersionNegotiationProbePacketOld) {
13096 SetQuicFlag(FLAGS_quic_prober_uses_length_prefixed_connection_ids, false);
dschinazide0f6dc2019-05-15 16:10:11 -070013097 // clang-format off
13098 static const char expected_packet[1200] = {
13099 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13100 0xc0,
13101 // Version, part of the IETF space reserved for negotiation.
13102 0xca, 0xba, 0xda, 0xba,
13103 // Destination connection ID length 8, source connection ID length 0.
13104 0x50,
13105 // 8-byte destination connection ID.
13106 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13107 // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13108 // not parse with any known version.
13109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13110 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13111 // 2 bytes of zeroes to pad to 16 byte boundary.
13112 0x00, 0x00,
13113 // A polite greeting in case a human sees this in tcpdump.
13114 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13115 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13116 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13117 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13118 0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13119 0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13120 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13121 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13122 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13123 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13124 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13125 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13126 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13127 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13128 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13129 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13130 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13131 0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13132 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13133 0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13134 0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13135 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13136 0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13137 };
13138 // clang-format on
13139 char packet[1200];
13140 char destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13141 0x6c, 0x7a, 0x20, 0x21};
13142 EXPECT_TRUE(QuicFramer::WriteClientVersionNegotiationProbePacket(
13143 packet, sizeof(packet), destination_connection_id_bytes,
13144 sizeof(destination_connection_id_bytes)));
dschinazi48ac9192019-07-31 00:07:26 -070013145 test::CompareCharArraysWithHexError("constructed packet", packet,
13146 sizeof(packet), expected_packet,
13147 sizeof(expected_packet));
dschinazide0f6dc2019-05-15 16:10:11 -070013148 QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13149 sizeof(packet), false);
13150 // Make sure we fail to parse this packet for the version under test.
dschinazide0f6dc2019-05-15 16:10:11 -070013151 if (framer_.transport_version() <= QUIC_VERSION_43) {
13152 // We can only parse the connection ID with an IETF parser.
dschinazi48ac9192019-07-31 00:07:26 -070013153 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
dschinazide0f6dc2019-05-15 16:10:11 -070013154 return;
13155 }
dschinazi48ac9192019-07-31 00:07:26 -070013156 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
dschinazide0f6dc2019-05-15 16:10:11 -070013157 ASSERT_TRUE(visitor_.header_.get());
13158 QuicConnectionId probe_payload_connection_id(
13159 reinterpret_cast<const char*>(destination_connection_id_bytes),
13160 sizeof(destination_connection_id_bytes));
13161 EXPECT_EQ(probe_payload_connection_id,
13162 visitor_.header_.get()->destination_connection_id);
dschinazi30ab6db2019-08-13 14:43:32 -070013163
13164 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
13165 bool version_present = false, has_length_prefix = false;
13166 QuicVersionLabel version_label = 0;
13167 ParsedQuicVersion parsed_version = QuicVersionReservedForNegotiation();
13168 QuicConnectionId destination_connection_id = TestConnectionId(0x33);
13169 QuicConnectionId source_connection_id = TestConnectionId(0x34);
13170 bool retry_token_present = true;
13171 QuicStringPiece retry_token;
13172 std::string detailed_error = "foobar";
13173
13174 QuicErrorCode parse_result = QuicFramer::ParsePublicHeaderDispatcher(
13175 encrypted, kQuicDefaultConnectionIdLength, &format, &version_present,
13176 &has_length_prefix, &version_label, &parsed_version,
13177 &destination_connection_id, &source_connection_id, &retry_token_present,
13178 &retry_token, &detailed_error);
13179 EXPECT_EQ(QUIC_NO_ERROR, parse_result);
13180 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
13181 EXPECT_TRUE(version_present);
13182 EXPECT_FALSE(has_length_prefix);
13183 EXPECT_EQ(0xcabadaba, version_label);
13184 EXPECT_EQ(QUIC_VERSION_UNSUPPORTED, parsed_version.transport_version);
13185 EXPECT_EQ(probe_payload_connection_id, destination_connection_id);
13186 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
13187 EXPECT_FALSE(retry_token_present);
13188 EXPECT_EQ(QuicStringPiece(), retry_token);
13189 EXPECT_EQ("", detailed_error);
dschinazide0f6dc2019-05-15 16:10:11 -070013190}
13191
dschinazi48ac9192019-07-31 00:07:26 -070013192TEST_P(QuicFramerTest, WriteClientVersionNegotiationProbePacket) {
13193 SetQuicFlag(FLAGS_quic_prober_uses_length_prefixed_connection_ids, true);
13194 // clang-format off
13195 static const char expected_packet[1200] = {
13196 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13197 0xc0,
13198 // Version, part of the IETF space reserved for negotiation.
13199 0xca, 0xba, 0xda, 0xda,
13200 // Destination connection ID length 8.
13201 0x08,
13202 // 8-byte destination connection ID.
13203 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13204 // Source connection ID length 0.
13205 0x00,
13206 // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13207 // not parse with any known version.
13208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13209 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13210 // zeroes to pad to 16 byte boundary.
13211 0x00,
13212 // A polite greeting in case a human sees this in tcpdump.
13213 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13214 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13215 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13216 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13217 0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13218 0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13219 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13220 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13221 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13222 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13223 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13224 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13225 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13226 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13227 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13228 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13229 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13230 0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13231 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13232 0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13233 0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13234 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13235 0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13236 };
13237 // clang-format on
13238 char packet[1200];
13239 char destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13240 0x6c, 0x7a, 0x20, 0x21};
13241 EXPECT_TRUE(QuicFramer::WriteClientVersionNegotiationProbePacket(
13242 packet, sizeof(packet), destination_connection_id_bytes,
13243 sizeof(destination_connection_id_bytes)));
13244 test::CompareCharArraysWithHexError("constructed packet", packet,
13245 sizeof(packet), expected_packet,
13246 sizeof(expected_packet));
13247 QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13248 sizeof(packet), false);
13249 if (framer_.transport_version() < QUIC_VERSION_99) {
13250 // We can only parse the connection ID with a v99 parser.
13251 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
13252 return;
13253 }
13254 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
13255 ASSERT_TRUE(visitor_.header_.get());
13256 QuicConnectionId probe_payload_connection_id(
13257 reinterpret_cast<const char*>(destination_connection_id_bytes),
13258 sizeof(destination_connection_id_bytes));
13259 EXPECT_EQ(probe_payload_connection_id,
13260 visitor_.header_.get()->destination_connection_id);
13261}
13262
13263TEST_P(QuicFramerTest, DispatcherParseOldClientVersionNegotiationProbePacket) {
13264 // clang-format off
13265 static const char packet[1200] = {
13266 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13267 0xc0,
13268 // Version, part of the IETF space reserved for negotiation.
13269 0xca, 0xba, 0xda, 0xba,
13270 // Destination connection ID length 8, source connection ID length 0.
13271 0x50,
13272 // 8-byte destination connection ID.
13273 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13274 // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13275 // not parse with any known version.
13276 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13277 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13278 // 2 bytes of zeroes to pad to 16 byte boundary.
13279 0x00, 0x00,
13280 // A polite greeting in case a human sees this in tcpdump.
13281 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13282 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13283 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13284 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13285 0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13286 0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13287 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13288 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13289 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13290 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13291 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13292 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13293 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13294 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13295 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13296 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13297 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13298 0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13299 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13300 0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13301 0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13302 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13303 0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13304 };
13305 // clang-format on
13306 char expected_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13307 0x6c, 0x7a, 0x20, 0x21};
13308 QuicConnectionId expected_destination_connection_id(
13309 reinterpret_cast<const char*>(expected_destination_connection_id_bytes),
13310 sizeof(expected_destination_connection_id_bytes));
13311
13312 QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13313 sizeof(packet));
13314 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
13315 bool version_present = false, has_length_prefix = true;
13316 QuicVersionLabel version_label = 33;
13317 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
13318 QuicConnectionId destination_connection_id = TestConnectionId(1);
13319 QuicConnectionId source_connection_id = TestConnectionId(2);
13320 bool retry_token_present = true;
13321 QuicStringPiece retry_token;
13322 std::string detailed_error = "foobar";
13323 QuicErrorCode header_parse_result = QuicFramer::ParsePublicHeaderDispatcher(
13324 encrypted, kQuicDefaultConnectionIdLength, &format, &version_present,
13325 &has_length_prefix, &version_label, &parsed_version,
13326 &destination_connection_id, &source_connection_id, &retry_token_present,
13327 &retry_token, &detailed_error);
13328 EXPECT_EQ(QUIC_NO_ERROR, header_parse_result);
13329 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
13330 EXPECT_TRUE(version_present);
13331 EXPECT_FALSE(has_length_prefix);
13332 EXPECT_EQ(0xcabadaba, version_label);
13333 EXPECT_EQ(expected_destination_connection_id, destination_connection_id);
13334 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
13335 EXPECT_FALSE(retry_token_present);
13336 EXPECT_EQ("", detailed_error);
13337}
13338
13339TEST_P(QuicFramerTest, DispatcherParseClientVersionNegotiationProbePacket) {
13340 // clang-format off
13341 static const char packet[1200] = {
13342 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13343 0xc0,
13344 // Version, part of the IETF space reserved for negotiation.
13345 0xca, 0xba, 0xda, 0xba,
13346 // Destination connection ID length 8.
13347 0x08,
13348 // 8-byte destination connection ID.
13349 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13350 // Source connection ID length 0.
13351 0x00,
13352 // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13353 // not parse with any known version.
13354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13355 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13356 // 1 byte of zeroes to pad to 16 byte boundary.
13357 0x00,
13358 // A polite greeting in case a human sees this in tcpdump.
13359 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13360 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13361 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13362 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13363 0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13364 0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13365 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13366 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13367 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13368 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13369 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13370 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13371 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13372 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13373 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13374 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13375 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13376 0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13377 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13378 0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13379 0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13380 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13381 0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13382 };
13383 // clang-format on
13384 char expected_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13385 0x6c, 0x7a, 0x20, 0x21};
13386 QuicConnectionId expected_destination_connection_id(
13387 reinterpret_cast<const char*>(expected_destination_connection_id_bytes),
13388 sizeof(expected_destination_connection_id_bytes));
13389
13390 QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13391 sizeof(packet));
13392 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
13393 bool version_present = false, has_length_prefix = false;
13394 QuicVersionLabel version_label = 33;
13395 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
13396 QuicConnectionId destination_connection_id = TestConnectionId(1);
13397 QuicConnectionId source_connection_id = TestConnectionId(2);
13398 bool retry_token_present = true;
13399 QuicStringPiece retry_token;
13400 std::string detailed_error = "foobar";
13401 QuicErrorCode header_parse_result = QuicFramer::ParsePublicHeaderDispatcher(
13402 encrypted, kQuicDefaultConnectionIdLength, &format, &version_present,
13403 &has_length_prefix, &version_label, &parsed_version,
13404 &destination_connection_id, &source_connection_id, &retry_token_present,
13405 &retry_token, &detailed_error);
13406 EXPECT_EQ(QUIC_NO_ERROR, header_parse_result);
13407 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
13408 EXPECT_TRUE(version_present);
13409 EXPECT_TRUE(has_length_prefix);
13410 EXPECT_EQ(0xcabadaba, version_label);
13411 EXPECT_EQ(expected_destination_connection_id, destination_connection_id);
13412 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
13413 EXPECT_EQ("", detailed_error);
13414}
13415
13416TEST_P(QuicFramerTest, ParseServerVersionNegotiationProbeResponseOld) {
13417 SetQuicFlag(FLAGS_quic_prober_uses_length_prefixed_connection_ids, false);
dschinazide0f6dc2019-05-15 16:10:11 -070013418 // clang-format off
13419 const char packet[] = {
13420 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13421 0xc0,
13422 // Version of 0, indicating version negotiation.
13423 0x00, 0x00, 0x00, 0x00,
13424 // Destination connection ID length 0, source connection ID length 8.
13425 0x05,
13426 // 8-byte source connection ID.
13427 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13428 // A few supported versions.
13429 0xaa, 0xaa, 0xaa, 0xaa,
13430 QUIC_VERSION_BYTES,
13431 };
13432 // clang-format on
13433 char probe_payload_bytes[] = {0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21};
dschinazib012d212019-08-01 18:07:26 -070013434 char parsed_probe_payload_bytes[255] = {};
dschinazide0f6dc2019-05-15 16:10:11 -070013435 uint8_t parsed_probe_payload_length = 0;
13436 std::string parse_detailed_error = "";
13437 EXPECT_TRUE(QuicFramer::ParseServerVersionNegotiationProbeResponse(
13438 reinterpret_cast<const char*>(packet), sizeof(packet),
13439 reinterpret_cast<char*>(parsed_probe_payload_bytes),
13440 &parsed_probe_payload_length, &parse_detailed_error));
13441 EXPECT_EQ("", parse_detailed_error);
13442 test::CompareCharArraysWithHexError(
dschinazi48ac9192019-07-31 00:07:26 -070013443 "parsed probe", parsed_probe_payload_bytes, parsed_probe_payload_length,
13444 probe_payload_bytes, sizeof(probe_payload_bytes));
13445}
13446
13447TEST_P(QuicFramerTest, ParseServerVersionNegotiationProbeResponse) {
13448 SetQuicFlag(FLAGS_quic_prober_uses_length_prefixed_connection_ids, true);
13449 // clang-format off
13450 const char packet[] = {
13451 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13452 0xc0,
13453 // Version of 0, indicating version negotiation.
13454 0x00, 0x00, 0x00, 0x00,
13455 // Destination connection ID length 0, source connection ID length 8.
13456 0x00, 0x08,
13457 // 8-byte source connection ID.
13458 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13459 // A few supported versions.
13460 0xaa, 0xaa, 0xaa, 0xaa,
13461 QUIC_VERSION_BYTES,
13462 };
13463 // clang-format on
13464 char probe_payload_bytes[] = {0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21};
dschinazib012d212019-08-01 18:07:26 -070013465 char parsed_probe_payload_bytes[255] = {};
dschinazi48ac9192019-07-31 00:07:26 -070013466 uint8_t parsed_probe_payload_length = 0;
13467 std::string parse_detailed_error = "";
13468 EXPECT_TRUE(QuicFramer::ParseServerVersionNegotiationProbeResponse(
13469 reinterpret_cast<const char*>(packet), sizeof(packet),
13470 reinterpret_cast<char*>(parsed_probe_payload_bytes),
13471 &parsed_probe_payload_length, &parse_detailed_error));
13472 EXPECT_EQ("", parse_detailed_error);
13473 test::CompareCharArraysWithHexError(
13474 "parsed probe", parsed_probe_payload_bytes, parsed_probe_payload_length,
13475 probe_payload_bytes, sizeof(probe_payload_bytes));
dschinazide0f6dc2019-05-15 16:10:11 -070013476}
13477
dschinaziccbe0e02019-08-13 12:15:00 -070013478// Test the client-side workaround for b/139330014 where an old client expects
13479// no length prefix but receives a length-prefixed response.
13480TEST_P(QuicFramerTest, ParseBadServerVersionNegotiationProbeResponse) {
13481 SetQuicFlag(FLAGS_quic_prober_uses_length_prefixed_connection_ids, false);
13482 // clang-format off
13483 const char packet[] = {
13484 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13485 0xc0,
13486 // Version of 0, indicating version negotiation.
13487 0x00, 0x00, 0x00, 0x00,
13488 // Destination connection ID length 0, source connection ID length 8.
13489 0x00, 0x08,
13490 // 8-byte source connection ID.
13491 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13492 // A few supported versions.
13493 0xaa, 0xaa, 0xaa, 0xaa,
13494 QUIC_VERSION_BYTES,
13495 };
13496 // clang-format on
13497 char probe_payload_bytes[] = {0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21};
13498 char parsed_probe_payload_bytes[255] = {};
13499 uint8_t parsed_probe_payload_length = 0;
13500 std::string parse_detailed_error = "";
13501 EXPECT_TRUE(QuicFramer::ParseServerVersionNegotiationProbeResponse(
13502 reinterpret_cast<const char*>(packet), sizeof(packet),
13503 reinterpret_cast<char*>(parsed_probe_payload_bytes),
13504 &parsed_probe_payload_length, &parse_detailed_error));
13505 EXPECT_EQ("", parse_detailed_error);
13506 test::CompareCharArraysWithHexError(
13507 "parsed probe", parsed_probe_payload_bytes, parsed_probe_payload_length,
13508 probe_payload_bytes, sizeof(probe_payload_bytes));
13509}
13510
dschinazi346b7ce2019-06-05 01:38:18 -070013511TEST_P(QuicFramerTest, ClientConnectionIdFromLongHeaderToClient) {
dschinazi7d066ca2019-05-15 17:59:49 -070013512 if (framer_.transport_version() <= QUIC_VERSION_43) {
13513 // This test requires an IETF long header.
13514 return;
13515 }
dschinazi346b7ce2019-06-05 01:38:18 -070013516 SetDecrypterLevel(ENCRYPTION_HANDSHAKE);
dschinazi7d066ca2019-05-15 17:59:49 -070013517 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
dschinazi7d066ca2019-05-15 17:59:49 -070013518 // clang-format off
13519 unsigned char packet[] = {
dschinazi346b7ce2019-06-05 01:38:18 -070013520 // public flags (long header with packet type HANDSHAKE and
dschinazi7d066ca2019-05-15 17:59:49 -070013521 // 4-byte packet number)
fayang36825da2019-08-21 14:01:27 -070013522 0xE3,
dschinazi7d066ca2019-05-15 17:59:49 -070013523 // version
13524 QUIC_VERSION_BYTES,
dschinazi346b7ce2019-06-05 01:38:18 -070013525 // connection ID lengths
dschinazi7d066ca2019-05-15 17:59:49 -070013526 0x50,
13527 // destination connection ID
13528 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13529 // long header packet length
13530 0x05,
13531 // packet number
13532 0x12, 0x34, 0x56, 0x00,
13533 // padding frame
13534 0x00,
13535 };
dschinazi48ac9192019-07-31 00:07:26 -070013536 unsigned char packet99[] = {
13537 // public flags (long header with packet type HANDSHAKE and
13538 // 4-byte packet number)
13539 0xE3,
13540 // version
13541 QUIC_VERSION_BYTES,
13542 // destination connection ID length
13543 0x08,
13544 // destination connection ID
13545 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13546 // source connection ID length
13547 0x00,
13548 // long header packet length
13549 0x05,
13550 // packet number
13551 0x12, 0x34, 0x56, 0x00,
13552 // padding frame
13553 0x00,
13554 };
dschinazi7d066ca2019-05-15 17:59:49 -070013555 // clang-format on
dschinazi48ac9192019-07-31 00:07:26 -070013556 unsigned char* p = packet;
13557 size_t p_length = QUIC_ARRAYSIZE(packet);
13558 if (framer_.transport_version() == QUIC_VERSION_99) {
13559 p = packet99;
13560 p_length = QUIC_ARRAYSIZE(packet99);
13561 }
13562 const bool parse_success =
13563 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false));
dschinazi7d066ca2019-05-15 17:59:49 -070013564 if (!QuicUtils::VariableLengthConnectionIdAllowedForVersion(
13565 framer_.transport_version())) {
dschinazi346b7ce2019-06-05 01:38:18 -070013566 EXPECT_FALSE(parse_success);
13567 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
dschinazi7d066ca2019-05-15 17:59:49 -070013568 EXPECT_EQ("Invalid ConnectionId length.", framer_.detailed_error());
dschinazi346b7ce2019-06-05 01:38:18 -070013569 return;
13570 }
dschinazi346b7ce2019-06-05 01:38:18 -070013571 EXPECT_TRUE(parse_success);
13572 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
13573 EXPECT_EQ("", framer_.detailed_error());
13574 ASSERT_TRUE(visitor_.header_.get());
13575 EXPECT_EQ(FramerTestConnectionId(),
13576 visitor_.header_.get()->destination_connection_id);
13577}
13578
13579TEST_P(QuicFramerTest, ClientConnectionIdFromLongHeaderToServer) {
13580 if (framer_.transport_version() <= QUIC_VERSION_43) {
13581 // This test requires an IETF long header.
13582 return;
13583 }
13584 SetDecrypterLevel(ENCRYPTION_HANDSHAKE);
13585 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13586 // clang-format off
13587 unsigned char packet[] = {
13588 // public flags (long header with packet type HANDSHAKE and
13589 // 4-byte packet number)
fayang36825da2019-08-21 14:01:27 -070013590 0xE3,
dschinazi346b7ce2019-06-05 01:38:18 -070013591 // version
13592 QUIC_VERSION_BYTES,
13593 // connection ID lengths
13594 0x05,
13595 // source connection ID
13596 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13597 // long header packet length
13598 0x05,
13599 // packet number
13600 0x12, 0x34, 0x56, 0x00,
13601 // padding frame
13602 0x00,
13603 };
dschinazi48ac9192019-07-31 00:07:26 -070013604 unsigned char packet99[] = {
13605 // public flags (long header with packet type HANDSHAKE and
13606 // 4-byte packet number)
13607 0xE3,
13608 // version
13609 QUIC_VERSION_BYTES,
13610 // connection ID lengths
13611 0x00, 0x08,
13612 // source connection ID
13613 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13614 // long header packet length
13615 0x05,
13616 // packet number
13617 0x12, 0x34, 0x56, 0x00,
13618 // padding frame
13619 0x00,
13620 };
dschinazi346b7ce2019-06-05 01:38:18 -070013621 // clang-format on
dschinazi48ac9192019-07-31 00:07:26 -070013622 unsigned char* p = packet;
13623 size_t p_length = QUIC_ARRAYSIZE(packet);
13624 if (framer_.transport_version() == QUIC_VERSION_99) {
13625 p = packet99;
13626 p_length = QUIC_ARRAYSIZE(packet99);
13627 }
13628 const bool parse_success =
13629 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false));
dschinazi346b7ce2019-06-05 01:38:18 -070013630 if (!QuicUtils::VariableLengthConnectionIdAllowedForVersion(
13631 framer_.transport_version())) {
13632 EXPECT_FALSE(parse_success);
13633 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
13634 EXPECT_EQ("Invalid ConnectionId length.", framer_.detailed_error());
13635 return;
13636 }
dschinazi5e1a7b22019-07-31 12:23:21 -070013637 if (!framer_.version().SupportsClientConnectionIds()) {
dschinazi346b7ce2019-06-05 01:38:18 -070013638 EXPECT_FALSE(parse_success);
13639 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
13640 EXPECT_EQ("Client connection ID not supported in this version.",
13641 framer_.detailed_error());
13642 return;
13643 }
13644 EXPECT_TRUE(parse_success);
13645 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
13646 EXPECT_EQ("", framer_.detailed_error());
13647 ASSERT_TRUE(visitor_.header_.get());
13648 EXPECT_EQ(FramerTestConnectionId(),
13649 visitor_.header_.get()->source_connection_id);
dschinazi7d066ca2019-05-15 17:59:49 -070013650}
13651
dschinazi334f0232019-05-29 16:08:53 -070013652TEST_P(QuicFramerTest, ProcessAndValidateIetfConnectionIdLengthClient) {
13653 if (framer_.transport_version() <= QUIC_VERSION_43) {
13654 // This test requires an IETF long header.
13655 return;
13656 }
13657 char connection_id_lengths = 0x05;
13658 QuicDataReader reader(&connection_id_lengths, 1);
13659
13660 bool should_update_expected_server_connection_id_length = false;
13661 uint8_t expected_server_connection_id_length = 8;
13662 uint8_t destination_connection_id_length = 0;
13663 uint8_t source_connection_id_length = 8;
13664 std::string detailed_error = "";
13665
13666 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13667 &reader, framer_.version(), Perspective::IS_CLIENT,
13668 should_update_expected_server_connection_id_length,
13669 &expected_server_connection_id_length, &destination_connection_id_length,
13670 &source_connection_id_length, &detailed_error));
13671 EXPECT_EQ(8, expected_server_connection_id_length);
13672 EXPECT_EQ(0, destination_connection_id_length);
13673 EXPECT_EQ(8, source_connection_id_length);
13674 EXPECT_EQ("", detailed_error);
13675
13676 QuicDataReader reader2(&connection_id_lengths, 1);
13677 should_update_expected_server_connection_id_length = true;
13678 expected_server_connection_id_length = 33;
13679 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13680 &reader2, framer_.version(), Perspective::IS_CLIENT,
13681 should_update_expected_server_connection_id_length,
13682 &expected_server_connection_id_length, &destination_connection_id_length,
13683 &source_connection_id_length, &detailed_error));
13684 EXPECT_EQ(8, expected_server_connection_id_length);
13685 EXPECT_EQ(0, destination_connection_id_length);
13686 EXPECT_EQ(8, source_connection_id_length);
13687 EXPECT_EQ("", detailed_error);
13688}
13689
13690TEST_P(QuicFramerTest, ProcessAndValidateIetfConnectionIdLengthServer) {
13691 if (framer_.transport_version() <= QUIC_VERSION_43) {
13692 // This test requires an IETF long header.
13693 return;
13694 }
13695 char connection_id_lengths = 0x50;
13696 QuicDataReader reader(&connection_id_lengths, 1);
13697
13698 bool should_update_expected_server_connection_id_length = false;
13699 uint8_t expected_server_connection_id_length = 8;
13700 uint8_t destination_connection_id_length = 8;
13701 uint8_t source_connection_id_length = 0;
13702 std::string detailed_error = "";
13703
13704 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13705 &reader, framer_.version(), Perspective::IS_SERVER,
13706 should_update_expected_server_connection_id_length,
13707 &expected_server_connection_id_length, &destination_connection_id_length,
13708 &source_connection_id_length, &detailed_error));
13709 EXPECT_EQ(8, expected_server_connection_id_length);
13710 EXPECT_EQ(8, destination_connection_id_length);
13711 EXPECT_EQ(0, source_connection_id_length);
13712 EXPECT_EQ("", detailed_error);
13713
13714 QuicDataReader reader2(&connection_id_lengths, 1);
13715 should_update_expected_server_connection_id_length = true;
13716 expected_server_connection_id_length = 33;
13717 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13718 &reader2, framer_.version(), Perspective::IS_SERVER,
13719 should_update_expected_server_connection_id_length,
13720 &expected_server_connection_id_length, &destination_connection_id_length,
13721 &source_connection_id_length, &detailed_error));
13722 EXPECT_EQ(8, expected_server_connection_id_length);
13723 EXPECT_EQ(8, destination_connection_id_length);
13724 EXPECT_EQ(0, source_connection_id_length);
13725 EXPECT_EQ("", detailed_error);
13726}
13727
fkastenholzb4dade72019-08-05 06:54:20 -070013728TEST_P(QuicFramerTest, TestExtendedErrorCodeParser) {
13729 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
13730 return;
13731 }
fkastenholz488a4622019-08-26 06:24:46 -070013732 QuicConnectionCloseFrame frame;
13733
13734 frame.error_details = "this has no error code info in it";
13735 MaybeExtractQuicErrorCode(&frame);
13736 EXPECT_EQ(QUIC_IETF_GQUIC_ERROR_MISSING, frame.extracted_error_code);
13737 EXPECT_EQ("this has no error code info in it", frame.error_details);
13738
13739 frame.error_details = "1234this does not have the colon in it";
13740 MaybeExtractQuicErrorCode(&frame);
13741 EXPECT_EQ(QUIC_IETF_GQUIC_ERROR_MISSING, frame.extracted_error_code);
13742 EXPECT_EQ("1234this does not have the colon in it", frame.error_details);
13743
13744 frame.error_details = "1a234:this has a colon, but a malformed error number";
13745 MaybeExtractQuicErrorCode(&frame);
13746 EXPECT_EQ(QUIC_IETF_GQUIC_ERROR_MISSING, frame.extracted_error_code);
13747 EXPECT_EQ("1a234:this has a colon, but a malformed error number",
13748 frame.error_details);
13749
13750 frame.error_details = "1234:this is good";
13751 MaybeExtractQuicErrorCode(&frame);
13752 EXPECT_EQ(1234u, frame.extracted_error_code);
13753 EXPECT_EQ("this is good", frame.error_details);
13754
13755 frame.error_details =
13756 "1234 :this is not good, space between last digit and colon";
13757 MaybeExtractQuicErrorCode(&frame);
13758 EXPECT_EQ(QUIC_IETF_GQUIC_ERROR_MISSING, frame.extracted_error_code);
13759 EXPECT_EQ("1234 :this is not good, space between last digit and colon",
13760 frame.error_details);
13761
13762 frame.error_details = "123456789";
13763 MaybeExtractQuicErrorCode(&frame);
fkastenholzb4dade72019-08-05 06:54:20 -070013764 EXPECT_EQ(QUIC_IETF_GQUIC_ERROR_MISSING,
fkastenholz488a4622019-08-26 06:24:46 -070013765 frame.extracted_error_code); // Not good, all numbers, no :
13766 EXPECT_EQ("123456789", frame.error_details);
13767
13768 frame.error_details = "1234:";
13769 MaybeExtractQuicErrorCode(&frame);
fkastenholzb4dade72019-08-05 06:54:20 -070013770 EXPECT_EQ(1234u,
fkastenholz488a4622019-08-26 06:24:46 -070013771 frame.extracted_error_code); // corner case.
13772 EXPECT_EQ("", frame.error_details);
13773
13774 frame.error_details = "1234:5678";
13775 MaybeExtractQuicErrorCode(&frame);
13776 EXPECT_EQ(1234u,
13777 frame.extracted_error_code); // another corner case.
13778 EXPECT_EQ("5678", frame.error_details);
13779
13780 frame.error_details = "12345 6789:";
13781 MaybeExtractQuicErrorCode(&frame);
fkastenholzb4dade72019-08-05 06:54:20 -070013782 EXPECT_EQ(QUIC_IETF_GQUIC_ERROR_MISSING,
fkastenholz488a4622019-08-26 06:24:46 -070013783 frame.extracted_error_code); // Not good
13784 EXPECT_EQ("12345 6789:", frame.error_details);
13785
13786 frame.error_details = ":no numbers, is not good";
13787 MaybeExtractQuicErrorCode(&frame);
13788 EXPECT_EQ(QUIC_IETF_GQUIC_ERROR_MISSING, frame.extracted_error_code);
13789 EXPECT_EQ(":no numbers, is not good", frame.error_details);
13790
13791 frame.error_details = "qwer:also no numbers, is not good";
13792 MaybeExtractQuicErrorCode(&frame);
13793 EXPECT_EQ(QUIC_IETF_GQUIC_ERROR_MISSING, frame.extracted_error_code);
13794 EXPECT_EQ("qwer:also no numbers, is not good", frame.error_details);
13795
13796 frame.error_details = " 1234:this is not good, space before first digit";
13797 MaybeExtractQuicErrorCode(&frame);
13798 EXPECT_EQ(QUIC_IETF_GQUIC_ERROR_MISSING, frame.extracted_error_code);
13799 EXPECT_EQ(" 1234:this is not good, space before first digit",
13800 frame.error_details);
13801
13802 frame.error_details = "1234:";
13803 MaybeExtractQuicErrorCode(&frame);
13804 EXPECT_EQ(1234u,
13805 frame.extracted_error_code); // this is good
13806 EXPECT_EQ("", frame.error_details);
fkastenholzb4dade72019-08-05 06:54:20 -070013807}
13808
QUICHE teama6ef0a62019-03-07 20:34:33 -050013809} // namespace
13810} // namespace test
13811} // namespace quic