1 // 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 "quiche/quic/core/quic_framer.h"
6
7 #include <algorithm>
8 #include <cstdint>
9 #include <cstring>
10 #include <map>
11 #include <memory>
12 #include <string>
13 #include <utility>
14 #include <vector>
15
16 #include "absl/base/macros.h"
17 #include "absl/memory/memory.h"
18 #include "absl/strings/escaping.h"
19 #include "absl/strings/match.h"
20 #include "absl/strings/string_view.h"
21 #include "quiche/quic/core/crypto/null_decrypter.h"
22 #include "quiche/quic/core/crypto/null_encrypter.h"
23 #include "quiche/quic/core/crypto/quic_decrypter.h"
24 #include "quiche/quic/core/crypto/quic_encrypter.h"
25 #include "quiche/quic/core/quic_connection_id.h"
26 #include "quiche/quic/core/quic_error_codes.h"
27 #include "quiche/quic/core/quic_packets.h"
28 #include "quiche/quic/core/quic_types.h"
29 #include "quiche/quic/core/quic_utils.h"
30 #include "quiche/quic/core/quic_versions.h"
31 #include "quiche/quic/platform/api/quic_expect_bug.h"
32 #include "quiche/quic/platform/api/quic_flags.h"
33 #include "quiche/quic/platform/api/quic_ip_address.h"
34 #include "quiche/quic/platform/api/quic_ip_address_family.h"
35 #include "quiche/quic/platform/api/quic_logging.h"
36 #include "quiche/quic/platform/api/quic_test.h"
37 #include "quiche/quic/test_tools/quic_framer_peer.h"
38 #include "quiche/quic/test_tools/quic_test_utils.h"
39 #include "quiche/quic/test_tools/simple_data_producer.h"
40 #include "quiche/common/test_tools/quiche_test_utils.h"
41
42 using testing::_;
43 using testing::ContainerEq;
44 using testing::Return;
45
46 namespace quic {
47 namespace test {
48 namespace {
49
50 const uint64_t kEpoch = UINT64_C(1) << 32;
51 const uint64_t kMask = kEpoch - 1;
52 const uint8_t kPacket0ByteConnectionId = 0;
53 const uint8_t kPacket8ByteConnectionId = 8;
54 constexpr size_t kTagSize = 16;
55
56 const StatelessResetToken kTestStatelessResetToken{
57 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
58 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f};
59
60 // Use fields in which each byte is distinct to ensure that every byte is
61 // framed correctly. The values are otherwise arbitrary.
FramerTestConnectionId()62 QuicConnectionId FramerTestConnectionId() {
63 return TestConnectionId(UINT64_C(0xFEDCBA9876543210));
64 }
65
FramerTestConnectionIdPlusOne()66 QuicConnectionId FramerTestConnectionIdPlusOne() {
67 return TestConnectionId(UINT64_C(0xFEDCBA9876543211));
68 }
69
FramerTestConnectionIdNineBytes()70 QuicConnectionId FramerTestConnectionIdNineBytes() {
71 uint8_t connection_id_bytes[9] = {0xFE, 0xDC, 0xBA, 0x98, 0x76,
72 0x54, 0x32, 0x10, 0x42};
73 return QuicConnectionId(reinterpret_cast<char*>(connection_id_bytes),
74 sizeof(connection_id_bytes));
75 }
76
77 const QuicPacketNumber kPacketNumber = QuicPacketNumber(UINT64_C(0x12345678));
78 const QuicPacketNumber kSmallLargestObserved =
79 QuicPacketNumber(UINT16_C(0x1234));
80 const QuicPacketNumber kSmallMissingPacket = QuicPacketNumber(UINT16_C(0x1233));
81 const QuicPacketNumber kLeastUnacked = QuicPacketNumber(UINT64_C(0x012345670));
82 const QuicStreamId kStreamId = UINT64_C(0x01020304);
83 // Note that the high 4 bits of the stream offset must be less than 0x40
84 // in order to ensure that the value can be encoded using VarInt62 encoding.
85 const QuicStreamOffset kStreamOffset = UINT64_C(0x3A98FEDC32107654);
86 const QuicPublicResetNonceProof kNonceProof = UINT64_C(0xABCDEF0123456789);
87
88 // In testing that we can ack the full range of packets...
89 // This is the largest packet number that can be represented in IETF QUIC
90 // varint62 format.
91 const QuicPacketNumber kLargestIetfLargestObserved =
92 QuicPacketNumber(UINT64_C(0x3fffffffffffffff));
93 // Encodings for the two bits in a VarInt62 that
94 // describe the length of the VarInt61. For binary packet
95 // formats in this file, the convention is to code the
96 // first byte as
97 // kVarInt62FourBytes + 0x<value_in_that_byte>
98 const uint8_t kVarInt62OneByte = 0x00;
99 const uint8_t kVarInt62TwoBytes = 0x40;
100 const uint8_t kVarInt62FourBytes = 0x80;
101 const uint8_t kVarInt62EightBytes = 0xc0;
102
103 class TestEncrypter : public QuicEncrypter {
104 public:
~TestEncrypter()105 ~TestEncrypter() override {}
SetKey(absl::string_view)106 bool SetKey(absl::string_view /*key*/) override { return true; }
SetNoncePrefix(absl::string_view)107 bool SetNoncePrefix(absl::string_view /*nonce_prefix*/) override {
108 return true;
109 }
SetIV(absl::string_view)110 bool SetIV(absl::string_view /*iv*/) override { return true; }
SetHeaderProtectionKey(absl::string_view)111 bool SetHeaderProtectionKey(absl::string_view /*key*/) override {
112 return true;
113 }
EncryptPacket(uint64_t packet_number,absl::string_view associated_data,absl::string_view plaintext,char * output,size_t * output_length,size_t)114 bool EncryptPacket(uint64_t packet_number, absl::string_view associated_data,
115 absl::string_view plaintext, char* output,
116 size_t* output_length,
117 size_t /*max_output_length*/) override {
118 packet_number_ = QuicPacketNumber(packet_number);
119 associated_data_ = std::string(associated_data);
120 plaintext_ = std::string(plaintext);
121 memcpy(output, plaintext.data(), plaintext.length());
122 *output_length = plaintext.length();
123 return true;
124 }
GenerateHeaderProtectionMask(absl::string_view)125 std::string GenerateHeaderProtectionMask(
126 absl::string_view /*sample*/) override {
127 return std::string(5, 0);
128 }
GetKeySize() const129 size_t GetKeySize() const override { return 0; }
GetNoncePrefixSize() const130 size_t GetNoncePrefixSize() const override { return 0; }
GetIVSize() const131 size_t GetIVSize() const override { return 0; }
GetMaxPlaintextSize(size_t ciphertext_size) const132 size_t GetMaxPlaintextSize(size_t ciphertext_size) const override {
133 return ciphertext_size;
134 }
GetCiphertextSize(size_t plaintext_size) const135 size_t GetCiphertextSize(size_t plaintext_size) const override {
136 return plaintext_size;
137 }
GetConfidentialityLimit() const138 QuicPacketCount GetConfidentialityLimit() const override {
139 return std::numeric_limits<QuicPacketCount>::max();
140 }
GetKey() const141 absl::string_view GetKey() const override { return absl::string_view(); }
GetNoncePrefix() const142 absl::string_view GetNoncePrefix() const override {
143 return absl::string_view();
144 }
145
146 QuicPacketNumber packet_number_;
147 std::string associated_data_;
148 std::string plaintext_;
149 };
150
151 class TestDecrypter : public QuicDecrypter {
152 public:
~TestDecrypter()153 ~TestDecrypter() override {}
SetKey(absl::string_view)154 bool SetKey(absl::string_view /*key*/) override { return true; }
SetNoncePrefix(absl::string_view)155 bool SetNoncePrefix(absl::string_view /*nonce_prefix*/) override {
156 return true;
157 }
SetIV(absl::string_view)158 bool SetIV(absl::string_view /*iv*/) override { return true; }
SetHeaderProtectionKey(absl::string_view)159 bool SetHeaderProtectionKey(absl::string_view /*key*/) override {
160 return true;
161 }
SetPreliminaryKey(absl::string_view)162 bool SetPreliminaryKey(absl::string_view /*key*/) override {
163 QUIC_BUG(quic_bug_10486_1) << "should not be called";
164 return false;
165 }
SetDiversificationNonce(const DiversificationNonce &)166 bool SetDiversificationNonce(const DiversificationNonce& /*key*/) override {
167 return true;
168 }
DecryptPacket(uint64_t packet_number,absl::string_view associated_data,absl::string_view ciphertext,char * output,size_t * output_length,size_t)169 bool DecryptPacket(uint64_t packet_number, absl::string_view associated_data,
170 absl::string_view ciphertext, char* output,
171 size_t* output_length,
172 size_t /*max_output_length*/) override {
173 packet_number_ = QuicPacketNumber(packet_number);
174 associated_data_ = std::string(associated_data);
175 ciphertext_ = std::string(ciphertext);
176 memcpy(output, ciphertext.data(), ciphertext.length());
177 *output_length = ciphertext.length();
178 return true;
179 }
GenerateHeaderProtectionMask(QuicDataReader *)180 std::string GenerateHeaderProtectionMask(
181 QuicDataReader* /*sample_reader*/) override {
182 return std::string(5, 0);
183 }
GetKeySize() const184 size_t GetKeySize() const override { return 0; }
GetNoncePrefixSize() const185 size_t GetNoncePrefixSize() const override { return 0; }
GetIVSize() const186 size_t GetIVSize() const override { return 0; }
GetKey() const187 absl::string_view GetKey() const override { return absl::string_view(); }
GetNoncePrefix() const188 absl::string_view GetNoncePrefix() const override {
189 return absl::string_view();
190 }
191 // Use a distinct value starting with 0xFFFFFF, which is never used by TLS.
cipher_id() const192 uint32_t cipher_id() const override { return 0xFFFFFFF2; }
GetIntegrityLimit() const193 QuicPacketCount GetIntegrityLimit() const override {
194 return std::numeric_limits<QuicPacketCount>::max();
195 }
196 QuicPacketNumber packet_number_;
197 std::string associated_data_;
198 std::string ciphertext_;
199 };
200
EncryptPacketWithTagAndPhase(const QuicPacket & packet,uint8_t tag,bool phase)201 std::unique_ptr<QuicEncryptedPacket> EncryptPacketWithTagAndPhase(
202 const QuicPacket& packet, uint8_t tag, bool phase) {
203 std::string packet_data = std::string(packet.AsStringPiece());
204 if (phase) {
205 packet_data[0] |= FLAGS_KEY_PHASE_BIT;
206 } else {
207 packet_data[0] &= ~FLAGS_KEY_PHASE_BIT;
208 }
209
210 TaggingEncrypter crypter(tag);
211 const size_t packet_size = crypter.GetCiphertextSize(packet_data.size());
212 char* buffer = new char[packet_size];
213 size_t buf_len = 0;
214 if (!crypter.EncryptPacket(0, absl::string_view(), packet_data, buffer,
215 &buf_len, packet_size)) {
216 delete[] buffer;
217 return nullptr;
218 }
219
220 return std::make_unique<QuicEncryptedPacket>(buffer, buf_len,
221 /*owns_buffer=*/true);
222 }
223
224 class TestQuicVisitor : public QuicFramerVisitorInterface {
225 public:
TestQuicVisitor()226 TestQuicVisitor()
227 : error_count_(0),
228 version_mismatch_(0),
229 packet_count_(0),
230 frame_count_(0),
231 complete_packets_(0),
232 derive_next_key_count_(0),
233 decrypted_first_packet_in_key_phase_count_(0),
234 accept_packet_(true),
235 accept_public_header_(true) {}
236
~TestQuicVisitor()237 ~TestQuicVisitor() override {}
238
OnError(QuicFramer * f)239 void OnError(QuicFramer* f) override {
240 QUIC_DLOG(INFO) << "QuicFramer Error: " << QuicErrorCodeToString(f->error())
241 << " (" << f->error() << ")";
242 ++error_count_;
243 }
244
OnPacket()245 void OnPacket() override {}
246
OnVersionNegotiationPacket(const QuicVersionNegotiationPacket & packet)247 void OnVersionNegotiationPacket(
248 const QuicVersionNegotiationPacket& packet) override {
249 version_negotiation_packet_ =
250 std::make_unique<QuicVersionNegotiationPacket>((packet));
251 EXPECT_EQ(0u, framer_->current_received_frame_type());
252 }
253
OnRetryPacket(QuicConnectionId original_connection_id,QuicConnectionId new_connection_id,absl::string_view retry_token,absl::string_view retry_integrity_tag,absl::string_view retry_without_tag)254 void OnRetryPacket(QuicConnectionId original_connection_id,
255 QuicConnectionId new_connection_id,
256 absl::string_view retry_token,
257 absl::string_view retry_integrity_tag,
258 absl::string_view retry_without_tag) override {
259 on_retry_packet_called_ = true;
260 retry_original_connection_id_ =
261 std::make_unique<QuicConnectionId>(original_connection_id);
262 retry_new_connection_id_ =
263 std::make_unique<QuicConnectionId>(new_connection_id);
264 retry_token_ = std::make_unique<std::string>(std::string(retry_token));
265 retry_token_integrity_tag_ =
266 std::make_unique<std::string>(std::string(retry_integrity_tag));
267 retry_without_tag_ =
268 std::make_unique<std::string>(std::string(retry_without_tag));
269 EXPECT_EQ(0u, framer_->current_received_frame_type());
270 }
271
OnProtocolVersionMismatch(ParsedQuicVersion received_version)272 bool OnProtocolVersionMismatch(ParsedQuicVersion received_version) override {
273 QUIC_DLOG(INFO) << "QuicFramer Version Mismatch, version: "
274 << received_version;
275 ++version_mismatch_;
276 EXPECT_EQ(0u, framer_->current_received_frame_type());
277 return false;
278 }
279
OnUnauthenticatedPublicHeader(const QuicPacketHeader & header)280 bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override {
281 header_ = std::make_unique<QuicPacketHeader>((header));
282 EXPECT_EQ(0u, framer_->current_received_frame_type());
283 return accept_public_header_;
284 }
285
OnUnauthenticatedHeader(const QuicPacketHeader &)286 bool OnUnauthenticatedHeader(const QuicPacketHeader& /*header*/) override {
287 EXPECT_EQ(0u, framer_->current_received_frame_type());
288 return true;
289 }
290
OnDecryptedPacket(size_t,EncryptionLevel)291 void OnDecryptedPacket(size_t /*length*/,
292 EncryptionLevel /*level*/) override {
293 EXPECT_EQ(0u, framer_->current_received_frame_type());
294 }
295
OnPacketHeader(const QuicPacketHeader & header)296 bool OnPacketHeader(const QuicPacketHeader& header) override {
297 ++packet_count_;
298 header_ = std::make_unique<QuicPacketHeader>((header));
299 EXPECT_EQ(0u, framer_->current_received_frame_type());
300 return accept_packet_;
301 }
302
OnCoalescedPacket(const QuicEncryptedPacket & packet)303 void OnCoalescedPacket(const QuicEncryptedPacket& packet) override {
304 coalesced_packets_.push_back(packet.Clone());
305 }
306
OnUndecryptablePacket(const QuicEncryptedPacket & packet,EncryptionLevel decryption_level,bool has_decryption_key)307 void OnUndecryptablePacket(const QuicEncryptedPacket& packet,
308 EncryptionLevel decryption_level,
309 bool has_decryption_key) override {
310 undecryptable_packets_.push_back(packet.Clone());
311 undecryptable_decryption_levels_.push_back(decryption_level);
312 undecryptable_has_decryption_keys_.push_back(has_decryption_key);
313 }
314
OnStreamFrame(const QuicStreamFrame & frame)315 bool OnStreamFrame(const QuicStreamFrame& frame) override {
316 ++frame_count_;
317 // Save a copy of the data so it is valid after the packet is processed.
318 std::string* string_data =
319 new std::string(frame.data_buffer, frame.data_length);
320 stream_data_.push_back(absl::WrapUnique(string_data));
321 stream_frames_.push_back(std::make_unique<QuicStreamFrame>(
322 frame.stream_id, frame.fin, frame.offset, *string_data));
323 if (VersionHasIetfQuicFrames(transport_version_)) {
324 // Low order bits of type encode flags, ignore them for this test.
325 EXPECT_TRUE(IS_IETF_STREAM_FRAME(framer_->current_received_frame_type()));
326 } else {
327 EXPECT_EQ(0u, framer_->current_received_frame_type());
328 }
329 return true;
330 }
331
OnCryptoFrame(const QuicCryptoFrame & frame)332 bool OnCryptoFrame(const QuicCryptoFrame& frame) override {
333 ++frame_count_;
334 // Save a copy of the data so it is valid after the packet is processed.
335 std::string* string_data =
336 new std::string(frame.data_buffer, frame.data_length);
337 crypto_data_.push_back(absl::WrapUnique(string_data));
338 crypto_frames_.push_back(std::make_unique<QuicCryptoFrame>(
339 frame.level, frame.offset, *string_data));
340 if (VersionHasIetfQuicFrames(transport_version_)) {
341 EXPECT_EQ(IETF_CRYPTO, framer_->current_received_frame_type());
342 } else {
343 EXPECT_EQ(0u, framer_->current_received_frame_type());
344 }
345 return true;
346 }
347
OnAckFrameStart(QuicPacketNumber largest_acked,QuicTime::Delta ack_delay_time)348 bool OnAckFrameStart(QuicPacketNumber largest_acked,
349 QuicTime::Delta ack_delay_time) override {
350 ++frame_count_;
351 QuicAckFrame ack_frame;
352 ack_frame.largest_acked = largest_acked;
353 ack_frame.ack_delay_time = ack_delay_time;
354 ack_frames_.push_back(std::make_unique<QuicAckFrame>(ack_frame));
355 if (VersionHasIetfQuicFrames(transport_version_)) {
356 EXPECT_TRUE(IETF_ACK == framer_->current_received_frame_type() ||
357 IETF_ACK_ECN == framer_->current_received_frame_type() ||
358 IETF_ACK_RECEIVE_TIMESTAMPS ==
359 framer_->current_received_frame_type());
360 } else {
361 EXPECT_EQ(0u, framer_->current_received_frame_type());
362 }
363 return true;
364 }
365
OnAckRange(QuicPacketNumber start,QuicPacketNumber end)366 bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) override {
367 QUICHE_DCHECK(!ack_frames_.empty());
368 ack_frames_[ack_frames_.size() - 1]->packets.AddRange(start, end);
369 if (VersionHasIetfQuicFrames(transport_version_)) {
370 EXPECT_TRUE(IETF_ACK == framer_->current_received_frame_type() ||
371 IETF_ACK_ECN == framer_->current_received_frame_type() ||
372 IETF_ACK_RECEIVE_TIMESTAMPS ==
373 framer_->current_received_frame_type());
374 } else {
375 EXPECT_EQ(0u, framer_->current_received_frame_type());
376 }
377 return true;
378 }
379
OnAckTimestamp(QuicPacketNumber packet_number,QuicTime timestamp)380 bool OnAckTimestamp(QuicPacketNumber packet_number,
381 QuicTime timestamp) override {
382 ack_frames_[ack_frames_.size() - 1]->received_packet_times.push_back(
383 std::make_pair(packet_number, timestamp));
384 if (VersionHasIetfQuicFrames(transport_version_)) {
385 EXPECT_TRUE(IETF_ACK == framer_->current_received_frame_type() ||
386 IETF_ACK_ECN == framer_->current_received_frame_type() ||
387 IETF_ACK_RECEIVE_TIMESTAMPS ==
388 framer_->current_received_frame_type());
389 } else {
390 EXPECT_EQ(0u, framer_->current_received_frame_type());
391 }
392 return true;
393 }
394
OnAckFrameEnd(QuicPacketNumber,const std::optional<QuicEcnCounts> &)395 bool OnAckFrameEnd(
396 QuicPacketNumber /*start*/,
397 const std::optional<QuicEcnCounts>& /*ecn_counts*/) override {
398 return true;
399 }
400
OnStopWaitingFrame(const QuicStopWaitingFrame & frame)401 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override {
402 ++frame_count_;
403 stop_waiting_frames_.push_back(
404 std::make_unique<QuicStopWaitingFrame>(frame));
405 EXPECT_EQ(0u, framer_->current_received_frame_type());
406 return true;
407 }
408
OnPaddingFrame(const QuicPaddingFrame & frame)409 bool OnPaddingFrame(const QuicPaddingFrame& frame) override {
410 padding_frames_.push_back(std::make_unique<QuicPaddingFrame>(frame));
411 if (VersionHasIetfQuicFrames(transport_version_)) {
412 EXPECT_EQ(IETF_PADDING, framer_->current_received_frame_type());
413 } else {
414 EXPECT_EQ(0u, framer_->current_received_frame_type());
415 }
416 return true;
417 }
418
OnPingFrame(const QuicPingFrame & frame)419 bool OnPingFrame(const QuicPingFrame& frame) override {
420 ++frame_count_;
421 ping_frames_.push_back(std::make_unique<QuicPingFrame>(frame));
422 if (VersionHasIetfQuicFrames(transport_version_)) {
423 EXPECT_EQ(IETF_PING, framer_->current_received_frame_type());
424 } else {
425 EXPECT_EQ(0u, framer_->current_received_frame_type());
426 }
427 return true;
428 }
429
OnMessageFrame(const QuicMessageFrame & frame)430 bool OnMessageFrame(const QuicMessageFrame& frame) override {
431 ++frame_count_;
432 message_frames_.push_back(
433 std::make_unique<QuicMessageFrame>(frame.data, frame.message_length));
434 if (VersionHasIetfQuicFrames(transport_version_)) {
435 EXPECT_TRUE(IETF_EXTENSION_MESSAGE_NO_LENGTH_V99 ==
436 framer_->current_received_frame_type() ||
437 IETF_EXTENSION_MESSAGE_V99 ==
438 framer_->current_received_frame_type());
439 } else {
440 EXPECT_EQ(0u, framer_->current_received_frame_type());
441 }
442 return true;
443 }
444
OnHandshakeDoneFrame(const QuicHandshakeDoneFrame & frame)445 bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) override {
446 ++frame_count_;
447 handshake_done_frames_.push_back(
448 std::make_unique<QuicHandshakeDoneFrame>(frame));
449 QUICHE_DCHECK(VersionHasIetfQuicFrames(transport_version_));
450 EXPECT_EQ(IETF_HANDSHAKE_DONE, framer_->current_received_frame_type());
451 return true;
452 }
453
OnAckFrequencyFrame(const QuicAckFrequencyFrame & frame)454 bool OnAckFrequencyFrame(const QuicAckFrequencyFrame& frame) override {
455 ++frame_count_;
456 ack_frequency_frames_.emplace_back(
457 std::make_unique<QuicAckFrequencyFrame>(frame));
458 QUICHE_DCHECK(VersionHasIetfQuicFrames(transport_version_));
459 EXPECT_EQ(IETF_ACK_FREQUENCY, framer_->current_received_frame_type());
460 return true;
461 }
462
OnPacketComplete()463 void OnPacketComplete() override { ++complete_packets_; }
464
OnRstStreamFrame(const QuicRstStreamFrame & frame)465 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override {
466 rst_stream_frame_ = frame;
467 if (VersionHasIetfQuicFrames(transport_version_)) {
468 EXPECT_EQ(IETF_RST_STREAM, framer_->current_received_frame_type());
469 } else {
470 EXPECT_EQ(0u, framer_->current_received_frame_type());
471 }
472 return true;
473 }
474
OnConnectionCloseFrame(const QuicConnectionCloseFrame & frame)475 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override {
476 connection_close_frame_ = frame;
477 if (VersionHasIetfQuicFrames(transport_version_)) {
478 EXPECT_NE(GOOGLE_QUIC_CONNECTION_CLOSE, frame.close_type);
479 if (frame.close_type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
480 EXPECT_EQ(IETF_CONNECTION_CLOSE,
481 framer_->current_received_frame_type());
482 } else {
483 EXPECT_EQ(IETF_APPLICATION_CLOSE,
484 framer_->current_received_frame_type());
485 }
486 } else {
487 EXPECT_EQ(0u, framer_->current_received_frame_type());
488 }
489 return true;
490 }
491
OnStopSendingFrame(const QuicStopSendingFrame & frame)492 bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override {
493 stop_sending_frame_ = frame;
494 EXPECT_EQ(IETF_STOP_SENDING, framer_->current_received_frame_type());
495 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
496 return true;
497 }
498
OnPathChallengeFrame(const QuicPathChallengeFrame & frame)499 bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override {
500 path_challenge_frame_ = frame;
501 EXPECT_EQ(IETF_PATH_CHALLENGE, framer_->current_received_frame_type());
502 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
503 return true;
504 }
505
OnPathResponseFrame(const QuicPathResponseFrame & frame)506 bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override {
507 path_response_frame_ = frame;
508 EXPECT_EQ(IETF_PATH_RESPONSE, framer_->current_received_frame_type());
509 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
510 return true;
511 }
512
OnGoAwayFrame(const QuicGoAwayFrame & frame)513 bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override {
514 goaway_frame_ = frame;
515 EXPECT_FALSE(VersionHasIetfQuicFrames(transport_version_));
516 EXPECT_EQ(0u, framer_->current_received_frame_type());
517 return true;
518 }
519
OnMaxStreamsFrame(const QuicMaxStreamsFrame & frame)520 bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& frame) override {
521 max_streams_frame_ = frame;
522 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
523 EXPECT_TRUE(IETF_MAX_STREAMS_UNIDIRECTIONAL ==
524 framer_->current_received_frame_type() ||
525 IETF_MAX_STREAMS_BIDIRECTIONAL ==
526 framer_->current_received_frame_type());
527 return true;
528 }
529
OnStreamsBlockedFrame(const QuicStreamsBlockedFrame & frame)530 bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame) override {
531 streams_blocked_frame_ = frame;
532 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
533 EXPECT_TRUE(IETF_STREAMS_BLOCKED_UNIDIRECTIONAL ==
534 framer_->current_received_frame_type() ||
535 IETF_STREAMS_BLOCKED_BIDIRECTIONAL ==
536 framer_->current_received_frame_type());
537 return true;
538 }
539
OnWindowUpdateFrame(const QuicWindowUpdateFrame & frame)540 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override {
541 window_update_frame_ = frame;
542 if (VersionHasIetfQuicFrames(transport_version_)) {
543 EXPECT_TRUE(IETF_MAX_DATA == framer_->current_received_frame_type() ||
544 IETF_MAX_STREAM_DATA ==
545 framer_->current_received_frame_type());
546 } else {
547 EXPECT_EQ(0u, framer_->current_received_frame_type());
548 }
549 return true;
550 }
551
OnBlockedFrame(const QuicBlockedFrame & frame)552 bool OnBlockedFrame(const QuicBlockedFrame& frame) override {
553 blocked_frame_ = frame;
554 if (VersionHasIetfQuicFrames(transport_version_)) {
555 EXPECT_TRUE(IETF_DATA_BLOCKED == framer_->current_received_frame_type() ||
556 IETF_STREAM_DATA_BLOCKED ==
557 framer_->current_received_frame_type());
558 } else {
559 EXPECT_EQ(0u, framer_->current_received_frame_type());
560 }
561 return true;
562 }
563
OnNewConnectionIdFrame(const QuicNewConnectionIdFrame & frame)564 bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override {
565 new_connection_id_ = frame;
566 EXPECT_EQ(IETF_NEW_CONNECTION_ID, framer_->current_received_frame_type());
567 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
568 return true;
569 }
570
OnRetireConnectionIdFrame(const QuicRetireConnectionIdFrame & frame)571 bool OnRetireConnectionIdFrame(
572 const QuicRetireConnectionIdFrame& frame) override {
573 EXPECT_EQ(IETF_RETIRE_CONNECTION_ID,
574 framer_->current_received_frame_type());
575 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
576 retire_connection_id_ = frame;
577 return true;
578 }
579
OnNewTokenFrame(const QuicNewTokenFrame & frame)580 bool OnNewTokenFrame(const QuicNewTokenFrame& frame) override {
581 new_token_ = frame;
582 EXPECT_EQ(IETF_NEW_TOKEN, framer_->current_received_frame_type());
583 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
584 return true;
585 }
586
IsValidStatelessResetToken(const StatelessResetToken & token) const587 bool IsValidStatelessResetToken(
588 const StatelessResetToken& token) const override {
589 EXPECT_EQ(0u, framer_->current_received_frame_type());
590 return token == kTestStatelessResetToken;
591 }
592
OnAuthenticatedIetfStatelessResetPacket(const QuicIetfStatelessResetPacket & packet)593 void OnAuthenticatedIetfStatelessResetPacket(
594 const QuicIetfStatelessResetPacket& packet) override {
595 stateless_reset_packet_ =
596 std::make_unique<QuicIetfStatelessResetPacket>(packet);
597 EXPECT_EQ(0u, framer_->current_received_frame_type());
598 }
599
OnKeyUpdate(KeyUpdateReason reason)600 void OnKeyUpdate(KeyUpdateReason reason) override {
601 key_update_reasons_.push_back(reason);
602 }
603
OnDecryptedFirstPacketInKeyPhase()604 void OnDecryptedFirstPacketInKeyPhase() override {
605 decrypted_first_packet_in_key_phase_count_++;
606 }
607
AdvanceKeysAndCreateCurrentOneRttDecrypter()608 std::unique_ptr<QuicDecrypter> AdvanceKeysAndCreateCurrentOneRttDecrypter()
609 override {
610 derive_next_key_count_++;
611 return std::make_unique<StrictTaggingDecrypter>(derive_next_key_count_);
612 }
CreateCurrentOneRttEncrypter()613 std::unique_ptr<QuicEncrypter> CreateCurrentOneRttEncrypter() override {
614 return std::make_unique<TaggingEncrypter>(derive_next_key_count_);
615 }
616
set_framer(QuicFramer * framer)617 void set_framer(QuicFramer* framer) {
618 framer_ = framer;
619 transport_version_ = framer->transport_version();
620 }
621
key_update_count() const622 size_t key_update_count() const { return key_update_reasons_.size(); }
623
624 // Counters from the visitor_ callbacks.
625 int error_count_;
626 int version_mismatch_;
627 int packet_count_;
628 int frame_count_;
629 int complete_packets_;
630 std::vector<KeyUpdateReason> key_update_reasons_;
631 int derive_next_key_count_;
632 int decrypted_first_packet_in_key_phase_count_;
633 bool accept_packet_;
634 bool accept_public_header_;
635
636 std::unique_ptr<QuicPacketHeader> header_;
637 std::unique_ptr<QuicIetfStatelessResetPacket> stateless_reset_packet_;
638 std::unique_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_;
639 std::unique_ptr<QuicConnectionId> retry_original_connection_id_;
640 std::unique_ptr<QuicConnectionId> retry_new_connection_id_;
641 std::unique_ptr<std::string> retry_token_;
642 std::unique_ptr<std::string> retry_token_integrity_tag_;
643 std::unique_ptr<std::string> retry_without_tag_;
644 bool on_retry_packet_called_ = false;
645 std::vector<std::unique_ptr<QuicStreamFrame>> stream_frames_;
646 std::vector<std::unique_ptr<QuicCryptoFrame>> crypto_frames_;
647 std::vector<std::unique_ptr<QuicAckFrame>> ack_frames_;
648 std::vector<std::unique_ptr<QuicStopWaitingFrame>> stop_waiting_frames_;
649 std::vector<std::unique_ptr<QuicPaddingFrame>> padding_frames_;
650 std::vector<std::unique_ptr<QuicPingFrame>> ping_frames_;
651 std::vector<std::unique_ptr<QuicMessageFrame>> message_frames_;
652 std::vector<std::unique_ptr<QuicHandshakeDoneFrame>> handshake_done_frames_;
653 std::vector<std::unique_ptr<QuicAckFrequencyFrame>> ack_frequency_frames_;
654 std::vector<std::unique_ptr<QuicEncryptedPacket>> coalesced_packets_;
655 std::vector<std::unique_ptr<QuicEncryptedPacket>> undecryptable_packets_;
656 std::vector<EncryptionLevel> undecryptable_decryption_levels_;
657 std::vector<bool> undecryptable_has_decryption_keys_;
658 QuicRstStreamFrame rst_stream_frame_;
659 QuicConnectionCloseFrame connection_close_frame_;
660 QuicStopSendingFrame stop_sending_frame_;
661 QuicGoAwayFrame goaway_frame_;
662 QuicPathChallengeFrame path_challenge_frame_;
663 QuicPathResponseFrame path_response_frame_;
664 QuicWindowUpdateFrame window_update_frame_;
665 QuicBlockedFrame blocked_frame_;
666 QuicStreamsBlockedFrame streams_blocked_frame_;
667 QuicMaxStreamsFrame max_streams_frame_;
668 QuicNewConnectionIdFrame new_connection_id_;
669 QuicRetireConnectionIdFrame retire_connection_id_;
670 QuicNewTokenFrame new_token_;
671 std::vector<std::unique_ptr<std::string>> stream_data_;
672 std::vector<std::unique_ptr<std::string>> crypto_data_;
673 QuicTransportVersion transport_version_;
674 QuicFramer* framer_;
675 };
676
677 // Simple struct for defining a packet's content, and associated
678 // parse error.
679 struct PacketFragment {
680 std::string error_if_missing;
681 std::vector<unsigned char> fragment;
682 };
683
684 using PacketFragments = std::vector<struct PacketFragment>;
685
686 class QuicFramerTest : public QuicTestWithParam<ParsedQuicVersion> {
687 public:
QuicFramerTest()688 QuicFramerTest()
689 : encrypter_(new test::TestEncrypter()),
690 decrypter_(new test::TestDecrypter()),
691 version_(GetParam()),
692 start_(QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(0x10)),
693 framer_(AllSupportedVersions(), start_, Perspective::IS_SERVER,
694 kQuicDefaultConnectionIdLength) {
695 framer_.set_version(version_);
696 if (framer_.version().KnowsWhichDecrypterToUse()) {
697 framer_.InstallDecrypter(ENCRYPTION_INITIAL,
698 std::unique_ptr<QuicDecrypter>(decrypter_));
699 } else {
700 framer_.SetDecrypter(ENCRYPTION_INITIAL,
701 std::unique_ptr<QuicDecrypter>(decrypter_));
702 }
703 framer_.SetEncrypter(ENCRYPTION_INITIAL,
704 std::unique_ptr<QuicEncrypter>(encrypter_));
705
706 framer_.set_visitor(&visitor_);
707 visitor_.set_framer(&framer_);
708 }
709
SetDecrypterLevel(EncryptionLevel level)710 void SetDecrypterLevel(EncryptionLevel level) {
711 if (!framer_.version().KnowsWhichDecrypterToUse()) {
712 return;
713 }
714 decrypter_ = new TestDecrypter();
715 framer_.InstallDecrypter(level, std::unique_ptr<QuicDecrypter>(decrypter_));
716 }
717
718 // Helper function to get unsigned char representation of the handshake
719 // protocol byte at position |pos| of the current QUIC version number.
GetQuicVersionByte(int pos)720 unsigned char GetQuicVersionByte(int pos) {
721 return (CreateQuicVersionLabel(version_) >> 8 * (3 - pos)) & 0xff;
722 }
723
724 // Helper functions to take a v1 long header packet and make it v2. These are
725 // not needed for short header packets, but if sent, this function will exit
726 // cleanly. It needs to be called twice for coalesced packets (see references
727 // to length_of_first_coalesced_packet below for examples of how to do this).
ReviseFirstByteByVersion(unsigned char packet_ietf[])728 inline void ReviseFirstByteByVersion(unsigned char packet_ietf[]) {
729 if (version_.UsesV2PacketTypes() && (packet_ietf[0] >= 0x80)) {
730 packet_ietf[0] = (packet_ietf[0] + 0x10) | 0xc0;
731 }
732 }
ReviseFirstByteByVersion(PacketFragments & packet_ietf)733 inline void ReviseFirstByteByVersion(PacketFragments& packet_ietf) {
734 ReviseFirstByteByVersion(&packet_ietf[0].fragment[0]);
735 }
736
CheckEncryption(QuicPacketNumber packet_number,QuicPacket * packet)737 bool CheckEncryption(QuicPacketNumber packet_number, QuicPacket* packet) {
738 if (packet_number != encrypter_->packet_number_) {
739 QUIC_LOG(ERROR) << "Encrypted incorrect packet number. expected "
740 << packet_number
741 << " actual: " << encrypter_->packet_number_;
742 return false;
743 }
744 if (packet->AssociatedData(framer_.transport_version()) !=
745 encrypter_->associated_data_) {
746 QUIC_LOG(ERROR) << "Encrypted incorrect associated data. expected "
747 << packet->AssociatedData(framer_.transport_version())
748 << " actual: " << encrypter_->associated_data_;
749 return false;
750 }
751 if (packet->Plaintext(framer_.transport_version()) !=
752 encrypter_->plaintext_) {
753 QUIC_LOG(ERROR) << "Encrypted incorrect plaintext data. expected "
754 << packet->Plaintext(framer_.transport_version())
755 << " actual: " << encrypter_->plaintext_;
756 return false;
757 }
758 return true;
759 }
760
CheckDecryption(const QuicEncryptedPacket & encrypted,bool includes_version,bool includes_diversification_nonce,uint8_t destination_connection_id_length,uint8_t source_connection_id_length)761 bool CheckDecryption(const QuicEncryptedPacket& encrypted,
762 bool includes_version,
763 bool includes_diversification_nonce,
764 uint8_t destination_connection_id_length,
765 uint8_t source_connection_id_length) {
766 return CheckDecryption(
767 encrypted, includes_version, includes_diversification_nonce,
768 destination_connection_id_length, source_connection_id_length,
769 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
770 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
771 }
772
CheckDecryption(const QuicEncryptedPacket & encrypted,bool includes_version,bool includes_diversification_nonce,uint8_t destination_connection_id_length,uint8_t source_connection_id_length,quiche::QuicheVariableLengthIntegerLength retry_token_length_length,size_t retry_token_length,quiche::QuicheVariableLengthIntegerLength length_length)773 bool CheckDecryption(
774 const QuicEncryptedPacket& encrypted, bool includes_version,
775 bool includes_diversification_nonce,
776 uint8_t destination_connection_id_length,
777 uint8_t source_connection_id_length,
778 quiche::QuicheVariableLengthIntegerLength retry_token_length_length,
779 size_t retry_token_length,
780 quiche::QuicheVariableLengthIntegerLength length_length) {
781 if (visitor_.header_->packet_number != decrypter_->packet_number_) {
782 QUIC_LOG(ERROR) << "Decrypted incorrect packet number. expected "
783 << visitor_.header_->packet_number
784 << " actual: " << decrypter_->packet_number_;
785 return false;
786 }
787 absl::string_view associated_data =
788 QuicFramer::GetAssociatedDataFromEncryptedPacket(
789 framer_.transport_version(), encrypted,
790 destination_connection_id_length, source_connection_id_length,
791 includes_version, includes_diversification_nonce,
792 PACKET_4BYTE_PACKET_NUMBER, retry_token_length_length,
793 retry_token_length, length_length);
794 if (associated_data != decrypter_->associated_data_) {
795 QUIC_LOG(ERROR) << "Decrypted incorrect associated data. expected "
796 << absl::BytesToHexString(associated_data) << " actual: "
797 << absl::BytesToHexString(decrypter_->associated_data_);
798 return false;
799 }
800 absl::string_view ciphertext(
801 encrypted.AsStringPiece().substr(GetStartOfEncryptedData(
802 framer_.transport_version(), destination_connection_id_length,
803 source_connection_id_length, includes_version,
804 includes_diversification_nonce, PACKET_4BYTE_PACKET_NUMBER,
805 retry_token_length_length, retry_token_length, length_length)));
806 if (ciphertext != decrypter_->ciphertext_) {
807 QUIC_LOG(ERROR) << "Decrypted incorrect ciphertext data. expected "
808 << absl::BytesToHexString(ciphertext) << " actual: "
809 << absl::BytesToHexString(decrypter_->ciphertext_)
810 << " associated data: "
811 << absl::BytesToHexString(associated_data);
812 return false;
813 }
814 return true;
815 }
816
AsChars(unsigned char * data)817 char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); }
818
819 // Creates a new QuicEncryptedPacket by concatenating the various
820 // packet fragments in |fragments|.
AssemblePacketFromFragments(const PacketFragments & fragments)821 std::unique_ptr<QuicEncryptedPacket> AssemblePacketFromFragments(
822 const PacketFragments& fragments) {
823 char* buffer = new char[kMaxOutgoingPacketSize + 1];
824 size_t len = 0;
825 for (const auto& fragment : fragments) {
826 memcpy(buffer + len, fragment.fragment.data(), fragment.fragment.size());
827 len += fragment.fragment.size();
828 }
829 return std::make_unique<QuicEncryptedPacket>(buffer, len, true);
830 }
831
CheckFramingBoundaries(const PacketFragments & fragments,QuicErrorCode error_code)832 void CheckFramingBoundaries(const PacketFragments& fragments,
833 QuicErrorCode error_code) {
834 std::unique_ptr<QuicEncryptedPacket> packet(
835 AssemblePacketFromFragments(fragments));
836 // Check all the various prefixes of |packet| for the expected
837 // parse error and error code.
838 for (size_t i = 0; i < packet->length(); ++i) {
839 std::string expected_error;
840 size_t len = 0;
841 for (const auto& fragment : fragments) {
842 len += fragment.fragment.size();
843 if (i < len) {
844 expected_error = fragment.error_if_missing;
845 break;
846 }
847 }
848
849 if (expected_error.empty()) continue;
850
851 CheckProcessingFails(*packet, i, expected_error, error_code);
852 }
853 }
854
CheckProcessingFails(const QuicEncryptedPacket & packet,size_t len,std::string expected_error,QuicErrorCode error_code)855 void CheckProcessingFails(const QuicEncryptedPacket& packet, size_t len,
856 std::string expected_error,
857 QuicErrorCode error_code) {
858 QuicEncryptedPacket encrypted(packet.data(), len, false);
859 EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
860 EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len;
861 EXPECT_EQ(error_code, framer_.error()) << "len: " << len;
862 }
863
CheckProcessingFails(unsigned char * packet,size_t len,std::string expected_error,QuicErrorCode error_code)864 void CheckProcessingFails(unsigned char* packet, size_t len,
865 std::string expected_error,
866 QuicErrorCode error_code) {
867 QuicEncryptedPacket encrypted(AsChars(packet), len, false);
868 EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
869 EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len;
870 EXPECT_EQ(error_code, framer_.error()) << "len: " << len;
871 }
872
873 // Checks if the supplied string matches data in the supplied StreamFrame.
CheckStreamFrameData(std::string str,QuicStreamFrame * frame)874 void CheckStreamFrameData(std::string str, QuicStreamFrame* frame) {
875 EXPECT_EQ(str, std::string(frame->data_buffer, frame->data_length));
876 }
877
CheckCalculatePacketNumber(uint64_t expected_packet_number,QuicPacketNumber last_packet_number)878 void CheckCalculatePacketNumber(uint64_t expected_packet_number,
879 QuicPacketNumber last_packet_number) {
880 uint64_t wire_packet_number = expected_packet_number & kMask;
881 EXPECT_EQ(expected_packet_number,
882 QuicFramerPeer::CalculatePacketNumberFromWire(
883 &framer_, PACKET_4BYTE_PACKET_NUMBER, last_packet_number,
884 wire_packet_number))
885 << "last_packet_number: " << last_packet_number
886 << " wire_packet_number: " << wire_packet_number;
887 }
888
BuildDataPacket(const QuicPacketHeader & header,const QuicFrames & frames)889 std::unique_ptr<QuicPacket> BuildDataPacket(const QuicPacketHeader& header,
890 const QuicFrames& frames) {
891 return BuildUnsizedDataPacket(&framer_, header, frames);
892 }
893
BuildDataPacket(const QuicPacketHeader & header,const QuicFrames & frames,size_t packet_size)894 std::unique_ptr<QuicPacket> BuildDataPacket(const QuicPacketHeader& header,
895 const QuicFrames& frames,
896 size_t packet_size) {
897 return BuildUnsizedDataPacket(&framer_, header, frames, packet_size);
898 }
899
900 // N starts at 1.
GetNthStreamid(QuicTransportVersion transport_version,Perspective perspective,bool bidirectional,int n)901 QuicStreamId GetNthStreamid(QuicTransportVersion transport_version,
902 Perspective perspective, bool bidirectional,
903 int n) {
904 if (bidirectional) {
905 return QuicUtils::GetFirstBidirectionalStreamId(transport_version,
906 perspective) +
907 ((n - 1) * QuicUtils::StreamIdDelta(transport_version));
908 }
909 // Unidirectional
910 return QuicUtils::GetFirstUnidirectionalStreamId(transport_version,
911 perspective) +
912 ((n - 1) * QuicUtils::StreamIdDelta(transport_version));
913 }
914
CreationTimePlus(uint64_t offset_us)915 QuicTime CreationTimePlus(uint64_t offset_us) {
916 return framer_.creation_time() +
917 QuicTime::Delta::FromMicroseconds(offset_us);
918 }
919
920 test::TestEncrypter* encrypter_;
921 test::TestDecrypter* decrypter_;
922 ParsedQuicVersion version_;
923 QuicTime start_;
924 QuicFramer framer_;
925 test::TestQuicVisitor visitor_;
926 quiche::SimpleBufferAllocator allocator_;
927 };
928
929 // Multiple test cases of QuicFramerTest use byte arrays to define packets for
930 // testing, and these byte arrays contain the QUIC version. This macro explodes
931 // the 32-bit version into four bytes in network order. Since it uses methods of
932 // QuicFramerTest, it is only valid to use this in a QuicFramerTest.
933 #define QUIC_VERSION_BYTES \
934 GetQuicVersionByte(0), GetQuicVersionByte(1), GetQuicVersionByte(2), \
935 GetQuicVersionByte(3)
936
937 // Run all framer tests with all supported versions of QUIC.
938 INSTANTIATE_TEST_SUITE_P(QuicFramerTests, QuicFramerTest,
939 ::testing::ValuesIn(AllSupportedVersions()),
940 ::testing::PrintToStringParamName());
941
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearEpochStart)942 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochStart) {
943 // A few quick manual sanity checks.
944 CheckCalculatePacketNumber(UINT64_C(1), QuicPacketNumber());
945 CheckCalculatePacketNumber(kEpoch + 1, QuicPacketNumber(kMask));
946 CheckCalculatePacketNumber(kEpoch, QuicPacketNumber(kMask));
947 for (uint64_t j = 0; j < 10; j++) {
948 CheckCalculatePacketNumber(j, QuicPacketNumber());
949 CheckCalculatePacketNumber(kEpoch - 1 - j, QuicPacketNumber());
950 }
951
952 // Cases where the last number was close to the start of the range.
953 for (QuicPacketNumber last = QuicPacketNumber(1); last < QuicPacketNumber(10);
954 last++) {
955 // Small numbers should not wrap (even if they're out of order).
956 for (uint64_t j = 0; j < 10; j++) {
957 CheckCalculatePacketNumber(j, last);
958 }
959
960 // Large numbers should not wrap either (because we're near 0 already).
961 for (uint64_t j = 0; j < 10; j++) {
962 CheckCalculatePacketNumber(kEpoch - 1 - j, last);
963 }
964 }
965 }
966
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearEpochEnd)967 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochEnd) {
968 // Cases where the last number was close to the end of the range
969 for (uint64_t i = 0; i < 10; i++) {
970 QuicPacketNumber last = QuicPacketNumber(kEpoch - i);
971
972 // Small numbers should wrap.
973 for (uint64_t j = 0; j < 10; j++) {
974 CheckCalculatePacketNumber(kEpoch + j, last);
975 }
976
977 // Large numbers should not (even if they're out of order).
978 for (uint64_t j = 0; j < 10; j++) {
979 CheckCalculatePacketNumber(kEpoch - 1 - j, last);
980 }
981 }
982 }
983
984 // Next check where we're in a non-zero epoch to verify we handle
985 // reverse wrapping, too.
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearPrevEpoch)986 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearPrevEpoch) {
987 const uint64_t prev_epoch = 1 * kEpoch;
988 const uint64_t cur_epoch = 2 * kEpoch;
989 // Cases where the last number was close to the start of the range
990 for (uint64_t i = 0; i < 10; i++) {
991 QuicPacketNumber last = QuicPacketNumber(cur_epoch + i);
992 // Small number should not wrap (even if they're out of order).
993 for (uint64_t j = 0; j < 10; j++) {
994 CheckCalculatePacketNumber(cur_epoch + j, last);
995 }
996
997 // But large numbers should reverse wrap.
998 for (uint64_t j = 0; j < 10; j++) {
999 uint64_t num = kEpoch - 1 - j;
1000 CheckCalculatePacketNumber(prev_epoch + num, last);
1001 }
1002 }
1003 }
1004
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearNextEpoch)1005 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextEpoch) {
1006 const uint64_t cur_epoch = 2 * kEpoch;
1007 const uint64_t next_epoch = 3 * kEpoch;
1008 // Cases where the last number was close to the end of the range
1009 for (uint64_t i = 0; i < 10; i++) {
1010 QuicPacketNumber last = QuicPacketNumber(next_epoch - 1 - i);
1011
1012 // Small numbers should wrap.
1013 for (uint64_t j = 0; j < 10; j++) {
1014 CheckCalculatePacketNumber(next_epoch + j, last);
1015 }
1016
1017 // but large numbers should not (even if they're out of order).
1018 for (uint64_t j = 0; j < 10; j++) {
1019 uint64_t num = kEpoch - 1 - j;
1020 CheckCalculatePacketNumber(cur_epoch + num, last);
1021 }
1022 }
1023 }
1024
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearNextMax)1025 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextMax) {
1026 const uint64_t max_number = std::numeric_limits<uint64_t>::max();
1027 const uint64_t max_epoch = max_number & ~kMask;
1028
1029 // Cases where the last number was close to the end of the range
1030 for (uint64_t i = 0; i < 10; i++) {
1031 // Subtract 1, because the expected next packet number is 1 more than the
1032 // last packet number.
1033 QuicPacketNumber last = QuicPacketNumber(max_number - i - 1);
1034
1035 // Small numbers should not wrap, because they have nowhere to go.
1036 for (uint64_t j = 0; j < 10; j++) {
1037 CheckCalculatePacketNumber(max_epoch + j, last);
1038 }
1039
1040 // Large numbers should not wrap either.
1041 for (uint64_t j = 0; j < 10; j++) {
1042 uint64_t num = kEpoch - 1 - j;
1043 CheckCalculatePacketNumber(max_epoch + num, last);
1044 }
1045 }
1046 }
1047
TEST_P(QuicFramerTest,EmptyPacket)1048 TEST_P(QuicFramerTest, EmptyPacket) {
1049 char packet[] = {0x00};
1050 QuicEncryptedPacket encrypted(packet, 0, false);
1051 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
1052 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
1053 }
1054
TEST_P(QuicFramerTest,LargePacket)1055 TEST_P(QuicFramerTest, LargePacket) {
1056 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1057 // clang-format off
1058 unsigned char packet[kMaxIncomingPacketSize + 1] = {
1059 // type (short header 4 byte packet number)
1060 0x43,
1061 // connection_id
1062 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1063 // packet number
1064 0x78, 0x56, 0x34, 0x12,
1065 };
1066 // clang-format on
1067
1068 const size_t header_size = GetPacketHeaderSize(
1069 framer_.transport_version(), kPacket8ByteConnectionId,
1070 kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
1071 PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
1072 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
1073
1074 memset(packet + header_size, 0, kMaxIncomingPacketSize - header_size);
1075
1076 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
1077 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
1078
1079 ASSERT_TRUE(visitor_.header_.get());
1080 // Make sure we've parsed the packet header, so we can send an error.
1081 EXPECT_EQ(FramerTestConnectionId(),
1082 visitor_.header_->destination_connection_id);
1083 // Make sure the correct error is propagated.
1084 EXPECT_THAT(framer_.error(), IsError(QUIC_PACKET_TOO_LARGE));
1085 EXPECT_EQ("Packet too large.", framer_.detailed_error());
1086 }
1087
TEST_P(QuicFramerTest,LongPacketHeader)1088 TEST_P(QuicFramerTest, LongPacketHeader) {
1089 // clang-format off
1090 PacketFragments packet = {
1091 // type (long header with packet type ZERO_RTT)
1092 {"Unable to read first byte.",
1093 {0xD3}},
1094 // version tag
1095 {"Unable to read protocol version.",
1096 {QUIC_VERSION_BYTES}},
1097 // connection_id length
1098 {"Unable to read ConnectionId length.",
1099 {0x50}},
1100 // connection_id
1101 {"Unable to read destination connection ID.",
1102 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1103 // packet number
1104 {"Unable to read packet number.",
1105 {0x12, 0x34, 0x56, 0x78}},
1106 };
1107 // clang-format on
1108
1109 if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
1110 return;
1111 }
1112
1113 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
1114 std::unique_ptr<QuicEncryptedPacket> encrypted(
1115 AssemblePacketFromFragments(packet));
1116
1117 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1118 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1119 ASSERT_TRUE(visitor_.header_.get());
1120 EXPECT_EQ(FramerTestConnectionId(),
1121 visitor_.header_->destination_connection_id);
1122 EXPECT_FALSE(visitor_.header_->reset_flag);
1123 EXPECT_TRUE(visitor_.header_->version_flag);
1124 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1125
1126 CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
1127
1128 PacketHeaderFormat format;
1129 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1130 bool version_flag;
1131 QuicConnectionId destination_connection_id, source_connection_id;
1132 QuicVersionLabel version_label;
1133 std::string detailed_error;
1134 bool use_length_prefix;
1135 std::optional<absl::string_view> retry_token;
1136 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1137 const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1138 *encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1139 &version_flag, &use_length_prefix, &version_label, &parsed_version,
1140 &destination_connection_id, &source_connection_id, &retry_token,
1141 &detailed_error);
1142 EXPECT_THAT(error_code, IsQuicNoError());
1143 EXPECT_EQ("", detailed_error);
1144 EXPECT_FALSE(retry_token.has_value());
1145 EXPECT_FALSE(use_length_prefix);
1146 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1147 EXPECT_TRUE(version_flag);
1148 EXPECT_EQ(kQuicDefaultConnectionIdLength, destination_connection_id.length());
1149 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1150 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1151 }
1152
TEST_P(QuicFramerTest,LongPacketHeaderWithBothConnectionIds)1153 TEST_P(QuicFramerTest, LongPacketHeaderWithBothConnectionIds) {
1154 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
1155 // clang-format off
1156 unsigned char packet[] = {
1157 // public flags (long header with packet type ZERO_RTT_PROTECTED and
1158 // 4-byte packet number)
1159 0xD3,
1160 // version
1161 QUIC_VERSION_BYTES,
1162 // connection ID lengths
1163 0x55,
1164 // destination connection ID
1165 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1166 // source connection ID
1167 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
1168 // packet number
1169 0x12, 0x34, 0x56, 0x00,
1170 // padding frame
1171 0x00,
1172 };
1173 unsigned char packet49[] = {
1174 // public flags (long header with packet type ZERO_RTT_PROTECTED and
1175 // 4-byte packet number)
1176 0xD3,
1177 // version
1178 QUIC_VERSION_BYTES,
1179 // destination connection ID length
1180 0x08,
1181 // destination connection ID
1182 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1183 // source connection ID length
1184 0x08,
1185 // source connection ID
1186 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
1187 // long header packet length
1188 0x05,
1189 // packet number
1190 0x12, 0x34, 0x56, 0x00,
1191 // padding frame
1192 0x00,
1193 };
1194 // clang-format on
1195
1196 unsigned char* p = packet;
1197 size_t p_length = ABSL_ARRAYSIZE(packet);
1198 if (framer_.version().HasLongHeaderLengths()) {
1199 ReviseFirstByteByVersion(packet49);
1200 p = packet49;
1201 p_length = ABSL_ARRAYSIZE(packet49);
1202 }
1203
1204 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
1205 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1206 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1207 bool version_flag = false;
1208 QuicConnectionId destination_connection_id, source_connection_id;
1209 QuicVersionLabel version_label = 0;
1210 std::string detailed_error = "";
1211 bool use_length_prefix;
1212 std::optional<absl::string_view> retry_token;
1213 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1214 const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1215 encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1216 &version_flag, &use_length_prefix, &version_label, &parsed_version,
1217 &destination_connection_id, &source_connection_id, &retry_token,
1218 &detailed_error);
1219 EXPECT_THAT(error_code, IsQuicNoError());
1220 EXPECT_FALSE(retry_token.has_value());
1221 EXPECT_EQ(framer_.version().HasLengthPrefixedConnectionIds(),
1222 use_length_prefix);
1223 EXPECT_EQ("", detailed_error);
1224 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1225 EXPECT_TRUE(version_flag);
1226 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1227 EXPECT_EQ(FramerTestConnectionIdPlusOne(), source_connection_id);
1228 }
1229
TEST_P(QuicFramerTest,AllZeroPacketParsingFails)1230 TEST_P(QuicFramerTest, AllZeroPacketParsingFails) {
1231 unsigned char packet[1200] = {};
1232 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
1233 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1234 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1235 bool version_flag = false;
1236 QuicConnectionId destination_connection_id, source_connection_id;
1237 QuicVersionLabel version_label = 0;
1238 std::string detailed_error = "";
1239 bool use_length_prefix;
1240 std::optional<absl::string_view> retry_token;
1241 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1242 const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1243 encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1244 &version_flag, &use_length_prefix, &version_label, &parsed_version,
1245 &destination_connection_id, &source_connection_id, &retry_token,
1246 &detailed_error);
1247 EXPECT_EQ(error_code, QUIC_INVALID_PACKET_HEADER);
1248 EXPECT_EQ(detailed_error, "Invalid flags.");
1249 }
1250
TEST_P(QuicFramerTest,ParsePublicHeader)1251 TEST_P(QuicFramerTest, ParsePublicHeader) {
1252 // clang-format off
1253 unsigned char packet[] = {
1254 // public flags (long header with packet type HANDSHAKE and
1255 // 4-byte packet number)
1256 0xE3,
1257 // version
1258 QUIC_VERSION_BYTES,
1259 // connection ID lengths
1260 0x50,
1261 // destination connection ID
1262 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1263 // long header packet length
1264 0x05,
1265 // packet number
1266 0x12, 0x34, 0x56, 0x78,
1267 // padding frame
1268 0x00,
1269 };
1270 unsigned char packet49[] = {
1271 // public flags (long header with packet type HANDSHAKE and
1272 // 4-byte packet number)
1273 0xE3,
1274 // version
1275 QUIC_VERSION_BYTES,
1276 // destination connection ID length
1277 0x08,
1278 // destination connection ID
1279 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1280 // source connection ID length
1281 0x00,
1282 // long header packet length
1283 0x05,
1284 // packet number
1285 0x12, 0x34, 0x56, 0x78,
1286 // padding frame
1287 0x00,
1288 };
1289 // clang-format on
1290 unsigned char* p = packet;
1291 size_t p_length = ABSL_ARRAYSIZE(packet);
1292 if (framer_.version().HasLongHeaderLengths()) {
1293 ReviseFirstByteByVersion(packet49);
1294 p = packet49;
1295 p_length = ABSL_ARRAYSIZE(packet49);
1296 }
1297
1298 uint8_t first_byte = 0x33;
1299 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1300 bool version_present = false, has_length_prefix = false;
1301 QuicVersionLabel version_label = 0;
1302 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1303 QuicConnectionId destination_connection_id = EmptyQuicConnectionId(),
1304 source_connection_id = EmptyQuicConnectionId();
1305 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1306 quiche::QuicheVariableLengthIntegerLength retry_token_length_length =
1307 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_4;
1308 absl::string_view retry_token;
1309 std::string detailed_error = "foobar";
1310
1311 QuicDataReader reader(AsChars(p), p_length);
1312 const QuicErrorCode parse_error = QuicFramer::ParsePublicHeader(
1313 &reader, kQuicDefaultConnectionIdLength, /*ietf_format=*/true,
1314 &first_byte, &format, &version_present, &has_length_prefix,
1315 &version_label, &parsed_version, &destination_connection_id,
1316 &source_connection_id, &long_packet_type, &retry_token_length_length,
1317 &retry_token, &detailed_error);
1318 EXPECT_THAT(parse_error, IsQuicNoError());
1319 EXPECT_EQ("", detailed_error);
1320 EXPECT_EQ(p[0], first_byte);
1321 EXPECT_TRUE(version_present);
1322 EXPECT_EQ(framer_.version().HasLengthPrefixedConnectionIds(),
1323 has_length_prefix);
1324 EXPECT_EQ(CreateQuicVersionLabel(framer_.version()), version_label);
1325 EXPECT_EQ(framer_.version(), parsed_version);
1326 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1327 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1328 EXPECT_EQ(quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
1329 retry_token_length_length);
1330 EXPECT_EQ(absl::string_view(), retry_token);
1331 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1332 EXPECT_EQ(HANDSHAKE, long_packet_type);
1333 }
1334
TEST_P(QuicFramerTest,ParsePublicHeaderProxBadSourceConnectionIdLength)1335 TEST_P(QuicFramerTest, ParsePublicHeaderProxBadSourceConnectionIdLength) {
1336 if (!framer_.version().HasLengthPrefixedConnectionIds()) {
1337 return;
1338 }
1339 // clang-format off
1340 unsigned char packet[] = {
1341 // public flags (long header with packet type HANDSHAKE and
1342 // 4-byte packet number)
1343 0xE3,
1344 // version
1345 'P', 'R', 'O', 'X',
1346 // destination connection ID length
1347 0x08,
1348 // destination connection ID
1349 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1350 // source connection ID length (bogus)
1351 0xEE,
1352 // long header packet length
1353 0x05,
1354 // packet number
1355 0x12, 0x34, 0x56, 0x78,
1356 // padding frame
1357 0x00,
1358 };
1359 // clang-format on
1360 unsigned char* p = packet;
1361 size_t p_length = ABSL_ARRAYSIZE(packet);
1362
1363 uint8_t first_byte = 0x33;
1364 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1365 bool version_present = false, has_length_prefix = false;
1366 QuicVersionLabel version_label = 0;
1367 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1368 QuicConnectionId destination_connection_id = EmptyQuicConnectionId(),
1369 source_connection_id = EmptyQuicConnectionId();
1370 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1371 quiche::QuicheVariableLengthIntegerLength retry_token_length_length =
1372 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_4;
1373 absl::string_view retry_token;
1374 std::string detailed_error = "foobar";
1375
1376 QuicDataReader reader(AsChars(p), p_length);
1377 const QuicErrorCode parse_error = QuicFramer::ParsePublicHeader(
1378 &reader, kQuicDefaultConnectionIdLength,
1379 /*ietf_format=*/true, &first_byte, &format, &version_present,
1380 &has_length_prefix, &version_label, &parsed_version,
1381 &destination_connection_id, &source_connection_id, &long_packet_type,
1382 &retry_token_length_length, &retry_token, &detailed_error);
1383 EXPECT_THAT(parse_error, IsQuicNoError());
1384 EXPECT_EQ("", detailed_error);
1385 EXPECT_EQ(p[0], first_byte);
1386 EXPECT_TRUE(version_present);
1387 EXPECT_TRUE(has_length_prefix);
1388 EXPECT_EQ(0x50524F58u, version_label); // "PROX"
1389 EXPECT_EQ(UnsupportedQuicVersion(), parsed_version);
1390 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1391 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1392 EXPECT_EQ(quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
1393 retry_token_length_length);
1394 EXPECT_EQ(absl::string_view(), retry_token);
1395 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1396 }
1397
TEST_P(QuicFramerTest,ClientConnectionIdFromShortHeaderToClient)1398 TEST_P(QuicFramerTest, ClientConnectionIdFromShortHeaderToClient) {
1399 if (!framer_.version().SupportsClientConnectionIds()) {
1400 return;
1401 }
1402 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1403 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
1404 TestConnectionId(0x33));
1405 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1406 framer_.SetExpectedClientConnectionIdLength(kQuicDefaultConnectionIdLength);
1407 // clang-format off
1408 unsigned char packet[] = {
1409 // type (short header, 4 byte packet number)
1410 0x43,
1411 // connection_id
1412 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1413 // packet number
1414 0x13, 0x37, 0x42, 0x33,
1415 // padding frame
1416 0x00,
1417 };
1418 // clang-format on
1419 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
1420 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1421 EXPECT_THAT(framer_.error(), IsQuicNoError());
1422 EXPECT_EQ("", framer_.detailed_error());
1423 ASSERT_TRUE(visitor_.header_.get());
1424 EXPECT_EQ(FramerTestConnectionId(),
1425 visitor_.header_->destination_connection_id);
1426 }
1427
1428 // In short header packets from client to server, the client connection ID
1429 // is omitted, but the framer adds it to the header struct using its
1430 // last serialized client connection ID. This test ensures that this
1431 // mechanism behaves as expected.
TEST_P(QuicFramerTest,ClientConnectionIdFromShortHeaderToServer)1432 TEST_P(QuicFramerTest, ClientConnectionIdFromShortHeaderToServer) {
1433 if (!framer_.version().SupportsClientConnectionIds()) {
1434 return;
1435 }
1436 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1437 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1438 // clang-format off
1439 unsigned char packet[] = {
1440 // type (short header, 4 byte packet number)
1441 0x43,
1442 // connection_id
1443 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1444 // packet number
1445 0x13, 0x37, 0x42, 0x33,
1446 // padding frame
1447 0x00,
1448 };
1449 // clang-format on
1450 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
1451 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1452 EXPECT_THAT(framer_.error(), IsQuicNoError());
1453 EXPECT_EQ("", framer_.detailed_error());
1454 ASSERT_TRUE(visitor_.header_.get());
1455 EXPECT_EQ(FramerTestConnectionId(),
1456 visitor_.header_->destination_connection_id);
1457 }
1458
TEST_P(QuicFramerTest,PacketHeaderWith0ByteConnectionId)1459 TEST_P(QuicFramerTest, PacketHeaderWith0ByteConnectionId) {
1460 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1461 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
1462 FramerTestConnectionId());
1463 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1464
1465 // clang-format off
1466 PacketFragments packet = {
1467 // type (short header, 4 byte packet number)
1468 {"Unable to read first byte.",
1469 {0x43}},
1470 // connection_id
1471 // packet number
1472 {"Unable to read packet number.",
1473 {0x12, 0x34, 0x56, 0x78}},
1474 };
1475
1476 PacketFragments packet_hp = {
1477 // type (short header, 4 byte packet number)
1478 {"Unable to read first byte.",
1479 {0x43}},
1480 // connection_id
1481 // packet number
1482 {"",
1483 {0x12, 0x34, 0x56, 0x78}},
1484 };
1485 // clang-format on
1486
1487 PacketFragments& fragments =
1488 framer_.version().HasHeaderProtection() ? packet_hp : packet;
1489 std::unique_ptr<QuicEncryptedPacket> encrypted(
1490 AssemblePacketFromFragments(fragments));
1491 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1492 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1493 ASSERT_TRUE(visitor_.header_.get());
1494 EXPECT_FALSE(visitor_.header_->reset_flag);
1495 EXPECT_FALSE(visitor_.header_->version_flag);
1496 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1497
1498 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1499 }
1500
TEST_P(QuicFramerTest,PacketHeaderWithVersionFlag)1501 TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) {
1502 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
1503 // clang-format off
1504 PacketFragments packet = {
1505 // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1506 // packet number)
1507 {"Unable to read first byte.",
1508 {0xD3}},
1509 // version tag
1510 {"Unable to read protocol version.",
1511 {QUIC_VERSION_BYTES}},
1512 // connection_id length
1513 {"Unable to read ConnectionId length.",
1514 {0x50}},
1515 // connection_id
1516 {"Unable to read destination connection ID.",
1517 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1518 // packet number
1519 {"Unable to read packet number.",
1520 {0x12, 0x34, 0x56, 0x78}},
1521 };
1522
1523 PacketFragments packet49 = {
1524 // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1525 // packet number)
1526 {"Unable to read first byte.",
1527 {0xD3}},
1528 // version tag
1529 {"Unable to read protocol version.",
1530 {QUIC_VERSION_BYTES}},
1531 // destination connection ID length
1532 {"Unable to read destination connection ID.",
1533 {0x08}},
1534 // destination connection ID
1535 {"Unable to read destination connection ID.",
1536 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1537 // source connection ID length
1538 {"Unable to read source connection ID.",
1539 {0x00}},
1540 // long header packet length
1541 {"Unable to read long header payload length.",
1542 {0x04}},
1543 // packet number
1544 {"Long header payload length longer than packet.",
1545 {0x12, 0x34, 0x56, 0x78}},
1546 };
1547 // clang-format on
1548
1549 ReviseFirstByteByVersion(packet49);
1550 PacketFragments& fragments =
1551 framer_.version().HasLongHeaderLengths() ? packet49 : packet;
1552 std::unique_ptr<QuicEncryptedPacket> encrypted(
1553 AssemblePacketFromFragments(fragments));
1554 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1555 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1556 ASSERT_TRUE(visitor_.header_.get());
1557 EXPECT_EQ(FramerTestConnectionId(),
1558 visitor_.header_->destination_connection_id);
1559 EXPECT_FALSE(visitor_.header_->reset_flag);
1560 EXPECT_TRUE(visitor_.header_->version_flag);
1561 EXPECT_EQ(GetParam(), visitor_.header_->version);
1562 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1563
1564 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1565 }
1566
TEST_P(QuicFramerTest,PacketHeaderWith4BytePacketNumber)1567 TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) {
1568 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1569 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1570
1571 // clang-format off
1572 PacketFragments packet = {
1573 // type (short header, 4 byte packet number)
1574 {"Unable to read first byte.",
1575 {0x43}},
1576 // connection_id
1577 {"Unable to read destination connection ID.",
1578 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1579 // packet number
1580 {"Unable to read packet number.",
1581 {0x12, 0x34, 0x56, 0x78}},
1582 };
1583
1584 PacketFragments packet_hp = {
1585 // type (short header, 4 byte packet number)
1586 {"Unable to read first byte.",
1587 {0x43}},
1588 // connection_id
1589 {"Unable to read destination connection ID.",
1590 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1591 // packet number
1592 {"",
1593 {0x12, 0x34, 0x56, 0x78}},
1594 };
1595 // clang-format on
1596
1597 PacketFragments& fragments =
1598 framer_.version().HasHeaderProtection() ? packet_hp : packet;
1599 std::unique_ptr<QuicEncryptedPacket> encrypted(
1600 AssemblePacketFromFragments(fragments));
1601 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1602 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1603 ASSERT_TRUE(visitor_.header_.get());
1604 EXPECT_EQ(FramerTestConnectionId(),
1605 visitor_.header_->destination_connection_id);
1606 EXPECT_FALSE(visitor_.header_->reset_flag);
1607 EXPECT_FALSE(visitor_.header_->version_flag);
1608 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1609
1610 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1611 }
1612
TEST_P(QuicFramerTest,PacketHeaderWith2BytePacketNumber)1613 TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) {
1614 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1615 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1616
1617 // clang-format off
1618 PacketFragments packet = {
1619 // type (short header, 2 byte packet number)
1620 {"Unable to read first byte.",
1621 {0x41}},
1622 // connection_id
1623 {"Unable to read destination connection ID.",
1624 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1625 // packet number
1626 {"Unable to read packet number.",
1627 {0x56, 0x78}},
1628 };
1629
1630 PacketFragments packet_hp = {
1631 // type (short header, 2 byte packet number)
1632 {"Unable to read first byte.",
1633 {0x41}},
1634 // connection_id
1635 {"Unable to read destination connection ID.",
1636 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1637 // packet number
1638 {"",
1639 {0x56, 0x78}},
1640 // padding
1641 {"", {0x00, 0x00}},
1642 };
1643 // clang-format on
1644
1645 PacketFragments& fragments =
1646 framer_.version().HasHeaderProtection() ? packet_hp : packet;
1647 std::unique_ptr<QuicEncryptedPacket> encrypted(
1648 AssemblePacketFromFragments(fragments));
1649 if (framer_.version().HasHeaderProtection()) {
1650 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
1651 EXPECT_THAT(framer_.error(), IsQuicNoError());
1652 } else {
1653 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1654 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1655 }
1656 ASSERT_TRUE(visitor_.header_.get());
1657 EXPECT_EQ(FramerTestConnectionId(),
1658 visitor_.header_->destination_connection_id);
1659 EXPECT_FALSE(visitor_.header_->reset_flag);
1660 EXPECT_FALSE(visitor_.header_->version_flag);
1661 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1662 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1663
1664 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1665 }
1666
TEST_P(QuicFramerTest,PacketHeaderWith1BytePacketNumber)1667 TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) {
1668 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1669 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1670
1671 // clang-format off
1672 PacketFragments packet = {
1673 // type (8 byte connection_id and 1 byte packet number)
1674 {"Unable to read first byte.",
1675 {0x40}},
1676 // connection_id
1677 {"Unable to read destination connection ID.",
1678 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1679 // packet number
1680 {"Unable to read packet number.",
1681 {0x78}},
1682 };
1683
1684 PacketFragments packet_hp = {
1685 // type (8 byte connection_id and 1 byte packet number)
1686 {"Unable to read first byte.",
1687 {0x40}},
1688 // connection_id
1689 {"Unable to read destination connection ID.",
1690 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1691 // packet number
1692 {"",
1693 {0x78}},
1694 // padding
1695 {"", {0x00, 0x00, 0x00}},
1696 };
1697
1698 // clang-format on
1699
1700 PacketFragments& fragments =
1701 framer_.version().HasHeaderProtection() ? packet_hp : packet;
1702 std::unique_ptr<QuicEncryptedPacket> encrypted(
1703 AssemblePacketFromFragments(fragments));
1704 if (framer_.version().HasHeaderProtection()) {
1705 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
1706 EXPECT_THAT(framer_.error(), IsQuicNoError());
1707 } else {
1708 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1709 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1710 }
1711 ASSERT_TRUE(visitor_.header_.get());
1712 EXPECT_EQ(FramerTestConnectionId(),
1713 visitor_.header_->destination_connection_id);
1714 EXPECT_FALSE(visitor_.header_->reset_flag);
1715 EXPECT_FALSE(visitor_.header_->version_flag);
1716 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1717 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1718
1719 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1720 }
1721
TEST_P(QuicFramerTest,PacketNumberDecreasesThenIncreases)1722 TEST_P(QuicFramerTest, PacketNumberDecreasesThenIncreases) {
1723 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1724 // Test the case when a packet is received from the past and future packet
1725 // numbers are still calculated relative to the largest received packet.
1726 QuicPacketHeader header;
1727 header.destination_connection_id = FramerTestConnectionId();
1728 header.reset_flag = false;
1729 header.version_flag = false;
1730 header.packet_number = kPacketNumber - 2;
1731
1732 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
1733 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1734 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
1735 ASSERT_TRUE(data != nullptr);
1736
1737 QuicEncryptedPacket encrypted(data->data(), data->length(), false);
1738 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1739 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1740 ASSERT_TRUE(visitor_.header_.get());
1741 EXPECT_EQ(FramerTestConnectionId(),
1742 visitor_.header_->destination_connection_id);
1743 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1744 EXPECT_EQ(kPacketNumber - 2, visitor_.header_->packet_number);
1745
1746 // Receive a 1 byte packet number.
1747 header.packet_number = kPacketNumber;
1748 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1749 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1750 data = BuildDataPacket(header, frames);
1751 QuicEncryptedPacket encrypted1(data->data(), data->length(), false);
1752 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1753 EXPECT_TRUE(framer_.ProcessPacket(encrypted1));
1754 ASSERT_TRUE(visitor_.header_.get());
1755 EXPECT_EQ(FramerTestConnectionId(),
1756 visitor_.header_->destination_connection_id);
1757 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1758 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1759
1760 // Process a 2 byte packet number 256 packets ago.
1761 header.packet_number = kPacketNumber - 256;
1762 header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
1763 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1764 data = BuildDataPacket(header, frames);
1765 QuicEncryptedPacket encrypted2(data->data(), data->length(), false);
1766 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1767 EXPECT_TRUE(framer_.ProcessPacket(encrypted2));
1768 ASSERT_TRUE(visitor_.header_.get());
1769 EXPECT_EQ(FramerTestConnectionId(),
1770 visitor_.header_->destination_connection_id);
1771 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1772 EXPECT_EQ(kPacketNumber - 256, visitor_.header_->packet_number);
1773
1774 // Process another 1 byte packet number and ensure it works.
1775 header.packet_number = kPacketNumber - 1;
1776 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1777 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1778 data = BuildDataPacket(header, frames);
1779 QuicEncryptedPacket encrypted3(data->data(), data->length(), false);
1780 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1781 EXPECT_TRUE(framer_.ProcessPacket(encrypted3));
1782 ASSERT_TRUE(visitor_.header_.get());
1783 EXPECT_EQ(FramerTestConnectionId(),
1784 visitor_.header_->destination_connection_id);
1785 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1786 EXPECT_EQ(kPacketNumber - 1, visitor_.header_->packet_number);
1787 }
1788
TEST_P(QuicFramerTest,PacketWithDiversificationNonce)1789 TEST_P(QuicFramerTest, PacketWithDiversificationNonce) {
1790 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
1791 // clang-format off
1792 unsigned char packet[] = {
1793 // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1794 // number.
1795 0xD0,
1796 // version tag
1797 QUIC_VERSION_BYTES,
1798 // connection_id length
1799 0x05,
1800 // connection_id
1801 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1802 // packet number
1803 0x78,
1804 // nonce
1805 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1806 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1807 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1808 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1809
1810 // frame type (padding)
1811 0x00,
1812 0x00, 0x00, 0x00, 0x00
1813 };
1814
1815 unsigned char packet49[] = {
1816 // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1817 // number.
1818 0xD0,
1819 // version tag
1820 QUIC_VERSION_BYTES,
1821 // destination connection ID length
1822 0x00,
1823 // source connection ID length
1824 0x08,
1825 // source connection ID
1826 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1827 // long header packet length
1828 0x26,
1829 // packet number
1830 0x78,
1831 // nonce
1832 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1833 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1834 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1835 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1836
1837 // frame type (padding)
1838 0x00,
1839 0x00, 0x00, 0x00, 0x00
1840 };
1841 // clang-format on
1842
1843 if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
1844 return;
1845 }
1846
1847 unsigned char* p = packet;
1848 size_t p_size = ABSL_ARRAYSIZE(packet);
1849 if (framer_.version().HasLongHeaderLengths()) {
1850 p = packet49;
1851 p_size = ABSL_ARRAYSIZE(packet49);
1852 }
1853
1854 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1855 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1856 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1857 ASSERT_TRUE(visitor_.header_->nonce != nullptr);
1858 for (char i = 0; i < 32; ++i) {
1859 EXPECT_EQ(i, (*visitor_.header_->nonce)[static_cast<size_t>(i)]);
1860 }
1861 EXPECT_EQ(1u, visitor_.padding_frames_.size());
1862 EXPECT_EQ(5, visitor_.padding_frames_[0]->num_padding_bytes);
1863 }
1864
TEST_P(QuicFramerTest,LargePublicFlagWithMismatchedVersions)1865 TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) {
1866 // clang-format off
1867 unsigned char packet[] = {
1868 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
1869 0xD3,
1870 // version tag
1871 'Q', '0', '0', '0',
1872 // connection_id length
1873 0x50,
1874 // connection_id
1875 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1876 // packet number
1877 0x12, 0x34, 0x56, 0x78,
1878
1879 // frame type (padding frame)
1880 0x00,
1881 0x00, 0x00, 0x00, 0x00
1882 };
1883
1884 unsigned char packet49[] = {
1885 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
1886 0xD3,
1887 // version tag
1888 'Q', '0', '0', '0',
1889 // destination connection ID length
1890 0x08,
1891 // destination connection ID
1892 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1893 // source connection ID length
1894 0x00,
1895 // packet number
1896 0x12, 0x34, 0x56, 0x78,
1897
1898 // frame type (padding frame)
1899 0x00,
1900 0x00, 0x00, 0x00, 0x00
1901 };
1902 // clang-format on
1903
1904 unsigned char* p = packet;
1905 size_t p_size = ABSL_ARRAYSIZE(packet);
1906 if (framer_.version().HasLongHeaderLengths()) {
1907 p = packet49;
1908 p_size = ABSL_ARRAYSIZE(packet49);
1909 }
1910 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1911 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1912 EXPECT_THAT(framer_.error(), IsQuicNoError());
1913 ASSERT_TRUE(visitor_.header_.get());
1914 EXPECT_EQ(0, visitor_.frame_count_);
1915 EXPECT_EQ(1, visitor_.version_mismatch_);
1916 }
1917
TEST_P(QuicFramerTest,PaddingFrame)1918 TEST_P(QuicFramerTest, PaddingFrame) {
1919 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1920 // clang-format off
1921 unsigned char packet[] = {
1922 // type (short header, 4 byte packet number)
1923 0x43,
1924 // connection_id
1925 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1926 // packet number
1927 0x12, 0x34, 0x56, 0x78,
1928
1929 // paddings
1930 0x00, 0x00,
1931 // frame type (stream frame with fin)
1932 0xFF,
1933 // stream id
1934 0x01, 0x02, 0x03, 0x04,
1935 // offset
1936 0x3A, 0x98, 0xFE, 0xDC,
1937 0x32, 0x10, 0x76, 0x54,
1938 // data length
1939 0x00, 0x0c,
1940 // data
1941 'h', 'e', 'l', 'l',
1942 'o', ' ', 'w', 'o',
1943 'r', 'l', 'd', '!',
1944 // paddings
1945 0x00, 0x00,
1946 };
1947
1948 unsigned char packet_ietf[] = {
1949 // type (short header, 4 byte packet number)
1950 0x43,
1951 // connection_id
1952 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1953 // packet number
1954 0x12, 0x34, 0x56, 0x78,
1955
1956 // paddings
1957 0x00, 0x00,
1958 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
1959 0x08 | 0x01 | 0x02 | 0x04,
1960
1961 // stream id
1962 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
1963 // offset
1964 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
1965 0x32, 0x10, 0x76, 0x54,
1966 // data length
1967 kVarInt62OneByte + 0x0c,
1968 // data
1969 'h', 'e', 'l', 'l',
1970 'o', ' ', 'w', 'o',
1971 'r', 'l', 'd', '!',
1972 // paddings
1973 0x00, 0x00,
1974 };
1975 // clang-format on
1976
1977 unsigned char* p = packet;
1978 size_t p_size = ABSL_ARRAYSIZE(packet);
1979 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
1980 p = packet_ietf;
1981 p_size = ABSL_ARRAYSIZE(packet_ietf);
1982 }
1983
1984 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1985 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1986 EXPECT_THAT(framer_.error(), IsQuicNoError());
1987 ASSERT_TRUE(visitor_.header_.get());
1988 EXPECT_TRUE(CheckDecryption(
1989 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
1990 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
1991
1992 ASSERT_EQ(1u, visitor_.stream_frames_.size());
1993 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1994 EXPECT_EQ(2u, visitor_.padding_frames_.size());
1995 EXPECT_EQ(2, visitor_.padding_frames_[0]->num_padding_bytes);
1996 EXPECT_EQ(2, visitor_.padding_frames_[1]->num_padding_bytes);
1997 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
1998 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
1999 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2000 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2001 }
2002
TEST_P(QuicFramerTest,StreamFrame)2003 TEST_P(QuicFramerTest, StreamFrame) {
2004 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2005 // clang-format off
2006 PacketFragments packet = {
2007 // type (short header, 4 byte packet number)
2008 {"",
2009 {0x43}},
2010 // connection_id
2011 {"",
2012 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2013 // packet number
2014 {"",
2015 {0x12, 0x34, 0x56, 0x78}},
2016 // frame type (stream frame with fin)
2017 {"",
2018 {0xFF}},
2019 // stream id
2020 {"Unable to read stream_id.",
2021 {0x01, 0x02, 0x03, 0x04}},
2022 // offset
2023 {"Unable to read offset.",
2024 {0x3A, 0x98, 0xFE, 0xDC,
2025 0x32, 0x10, 0x76, 0x54}},
2026 {"Unable to read frame data.",
2027 {
2028 // data length
2029 0x00, 0x0c,
2030 // data
2031 'h', 'e', 'l', 'l',
2032 'o', ' ', 'w', 'o',
2033 'r', 'l', 'd', '!'}},
2034 };
2035
2036 PacketFragments packet_ietf = {
2037 // type (short header, 4 byte packet number)
2038 {"",
2039 {0x43}},
2040 // connection_id
2041 {"",
2042 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2043 // packet number
2044 {"",
2045 {0x12, 0x34, 0x56, 0x78}},
2046 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
2047 {"",
2048 { 0x08 | 0x01 | 0x02 | 0x04 }},
2049 // stream id
2050 {"Unable to read IETF_STREAM frame stream id/count.",
2051 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
2052 // offset
2053 {"Unable to read stream data offset.",
2054 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2055 0x32, 0x10, 0x76, 0x54}},
2056 // data length
2057 {"Unable to read stream data length.",
2058 {kVarInt62OneByte + 0x0c}},
2059 // data
2060 {"Unable to read frame data.",
2061 { 'h', 'e', 'l', 'l',
2062 'o', ' ', 'w', 'o',
2063 'r', 'l', 'd', '!'}},
2064 };
2065 // clang-format on
2066
2067 PacketFragments& fragments =
2068 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2069 : packet;
2070 std::unique_ptr<QuicEncryptedPacket> encrypted(
2071 AssemblePacketFromFragments(fragments));
2072 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2073
2074 EXPECT_THAT(framer_.error(), IsQuicNoError());
2075 ASSERT_TRUE(visitor_.header_.get());
2076 EXPECT_TRUE(CheckDecryption(
2077 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2078 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2079
2080 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2081 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2082 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2083 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2084 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2085 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2086
2087 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2088 }
2089
2090 // Test an empty (no data) stream frame.
TEST_P(QuicFramerTest,EmptyStreamFrame)2091 TEST_P(QuicFramerTest, EmptyStreamFrame) {
2092 // Only the IETF QUIC spec explicitly says that empty
2093 // stream frames are supported.
2094 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2095 return;
2096 }
2097 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2098 // clang-format off
2099 PacketFragments packet = {
2100 // type (short header, 4 byte packet number)
2101 {"",
2102 {0x43}},
2103 // connection_id
2104 {"",
2105 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2106 // packet number
2107 {"",
2108 {0x12, 0x34, 0x56, 0x78}},
2109 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
2110 {"",
2111 { 0x08 | 0x01 | 0x02 | 0x04 }},
2112 // stream id
2113 {"Unable to read IETF_STREAM frame stream id/count.",
2114 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
2115 // offset
2116 {"Unable to read stream data offset.",
2117 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2118 0x32, 0x10, 0x76, 0x54}},
2119 // data length
2120 {"Unable to read stream data length.",
2121 {kVarInt62OneByte + 0x00}},
2122 };
2123 // clang-format on
2124
2125 std::unique_ptr<QuicEncryptedPacket> encrypted(
2126 AssemblePacketFromFragments(packet));
2127 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2128
2129 EXPECT_THAT(framer_.error(), IsQuicNoError());
2130 ASSERT_TRUE(visitor_.header_.get());
2131 EXPECT_TRUE(CheckDecryption(
2132 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2133 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2134
2135 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2136 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2137 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2138 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2139 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2140 EXPECT_EQ(visitor_.stream_frames_[0].get()->data_length, 0u);
2141
2142 CheckFramingBoundaries(packet, QUIC_INVALID_STREAM_DATA);
2143 }
2144
TEST_P(QuicFramerTest,MissingDiversificationNonce)2145 TEST_P(QuicFramerTest, MissingDiversificationNonce) {
2146 if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
2147 // TLS does not use diversification nonces.
2148 return;
2149 }
2150 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
2151 decrypter_ = new test::TestDecrypter();
2152 if (framer_.version().KnowsWhichDecrypterToUse()) {
2153 framer_.InstallDecrypter(
2154 ENCRYPTION_INITIAL,
2155 std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
2156 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
2157 std::unique_ptr<QuicDecrypter>(decrypter_));
2158 } else {
2159 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
2160 Perspective::IS_CLIENT));
2161 framer_.SetAlternativeDecrypter(
2162 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
2163 }
2164
2165 // clang-format off
2166 unsigned char packet[] = {
2167 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2168 0xD3,
2169 // version tag
2170 QUIC_VERSION_BYTES,
2171 // connection_id length
2172 0x05,
2173 // connection_id
2174 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2175 // packet number
2176 0x12, 0x34, 0x56, 0x78,
2177 // padding frame
2178 0x00,
2179 };
2180
2181 unsigned char packet49[] = {
2182 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2183 0xD3,
2184 // version tag
2185 QUIC_VERSION_BYTES,
2186 // destination connection ID length
2187 0x00,
2188 // source connection ID length
2189 0x08,
2190 // source connection ID
2191 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2192 // IETF long header payload length
2193 0x05,
2194 // packet number
2195 0x12, 0x34, 0x56, 0x78,
2196 // padding frame
2197 0x00,
2198 };
2199 // clang-format on
2200
2201 unsigned char* p = packet;
2202 size_t p_length = ABSL_ARRAYSIZE(packet);
2203 if (framer_.version().HasLongHeaderLengths()) {
2204 p = packet49;
2205 p_length = ABSL_ARRAYSIZE(packet49);
2206 }
2207 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
2208 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
2209 if (framer_.version().HasHeaderProtection()) {
2210 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
2211 EXPECT_EQ("Unable to decrypt ENCRYPTION_ZERO_RTT header protection.",
2212 framer_.detailed_error());
2213 } else {
2214 // Cannot read diversification nonce.
2215 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
2216 EXPECT_EQ("Unable to read nonce.", framer_.detailed_error());
2217 }
2218 }
2219
TEST_P(QuicFramerTest,StreamFrame2ByteStreamId)2220 TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) {
2221 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2222 // clang-format off
2223 PacketFragments packet = {
2224 // type (short header, 4 byte packet number)
2225 {"",
2226 {0x43}},
2227 // connection_id
2228 {"",
2229 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2230 // packet number
2231 {"",
2232 {0x12, 0x34, 0x56, 0x78}},
2233 // frame type (stream frame with fin)
2234 {"",
2235 {0xFD}},
2236 // stream id
2237 {"Unable to read stream_id.",
2238 {0x03, 0x04}},
2239 // offset
2240 {"Unable to read offset.",
2241 {0x3A, 0x98, 0xFE, 0xDC,
2242 0x32, 0x10, 0x76, 0x54}},
2243 {"Unable to read frame data.",
2244 {
2245 // data length
2246 0x00, 0x0c,
2247 // data
2248 'h', 'e', 'l', 'l',
2249 'o', ' ', 'w', 'o',
2250 'r', 'l', 'd', '!'}},
2251 };
2252
2253 PacketFragments packet_ietf = {
2254 // type (short header, 4 byte packet number)
2255 {"",
2256 {0x43}},
2257 // connection_id
2258 {"",
2259 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2260 // packet number
2261 {"",
2262 {0x12, 0x34, 0x56, 0x78}},
2263 // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2264 {"",
2265 {0x08 | 0x01 | 0x02 | 0x04}},
2266 // stream id
2267 {"Unable to read IETF_STREAM frame stream id/count.",
2268 {kVarInt62TwoBytes + 0x03, 0x04}},
2269 // offset
2270 {"Unable to read stream data offset.",
2271 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2272 0x32, 0x10, 0x76, 0x54}},
2273 // data length
2274 {"Unable to read stream data length.",
2275 {kVarInt62OneByte + 0x0c}},
2276 // data
2277 {"Unable to read frame data.",
2278 { 'h', 'e', 'l', 'l',
2279 'o', ' ', 'w', 'o',
2280 'r', 'l', 'd', '!'}},
2281 };
2282 // clang-format on
2283
2284 PacketFragments& fragments =
2285 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2286 : packet;
2287 std::unique_ptr<QuicEncryptedPacket> encrypted(
2288 AssemblePacketFromFragments(fragments));
2289 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2290
2291 EXPECT_THAT(framer_.error(), IsQuicNoError());
2292 ASSERT_TRUE(visitor_.header_.get());
2293 EXPECT_TRUE(CheckDecryption(
2294 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2295 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2296
2297 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2298 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2299 // Stream ID should be the last 2 bytes of kStreamId.
2300 EXPECT_EQ(0x0000FFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2301 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2302 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2303 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2304
2305 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2306 }
2307
TEST_P(QuicFramerTest,StreamFrame1ByteStreamId)2308 TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) {
2309 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2310 // clang-format off
2311 PacketFragments packet = {
2312 // type (short header, 4 byte packet number)
2313 {"",
2314 {0x43}},
2315 // connection_id
2316 {"",
2317 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2318 // packet number
2319 {"",
2320 {0x12, 0x34, 0x56, 0x78}},
2321 // frame type (stream frame with fin)
2322 {"",
2323 {0xFC}},
2324 // stream id
2325 {"Unable to read stream_id.",
2326 {0x04}},
2327 // offset
2328 {"Unable to read offset.",
2329 {0x3A, 0x98, 0xFE, 0xDC,
2330 0x32, 0x10, 0x76, 0x54}},
2331 {"Unable to read frame data.",
2332 {
2333 // data length
2334 0x00, 0x0c,
2335 // data
2336 'h', 'e', 'l', 'l',
2337 'o', ' ', 'w', 'o',
2338 'r', 'l', 'd', '!'}},
2339 };
2340
2341 PacketFragments packet_ietf = {
2342 // type (short header, 4 byte packet number)
2343 {"",
2344 {0x43}},
2345 // connection_id
2346 {"",
2347 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2348 // packet number
2349 {"",
2350 {0x12, 0x34, 0x56, 0x78}},
2351 // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2352 {"",
2353 {0x08 | 0x01 | 0x02 | 0x04}},
2354 // stream id
2355 {"Unable to read IETF_STREAM frame stream id/count.",
2356 {kVarInt62OneByte + 0x04}},
2357 // offset
2358 {"Unable to read stream data offset.",
2359 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2360 0x32, 0x10, 0x76, 0x54}},
2361 // data length
2362 {"Unable to read stream data length.",
2363 {kVarInt62OneByte + 0x0c}},
2364 // data
2365 {"Unable to read frame data.",
2366 { 'h', 'e', 'l', 'l',
2367 'o', ' ', 'w', 'o',
2368 'r', 'l', 'd', '!'}},
2369 };
2370 // clang-format on
2371
2372 PacketFragments& fragments =
2373 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2374 : packet;
2375 std::unique_ptr<QuicEncryptedPacket> encrypted(
2376 AssemblePacketFromFragments(fragments));
2377 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2378
2379 EXPECT_THAT(framer_.error(), IsQuicNoError());
2380 ASSERT_TRUE(visitor_.header_.get());
2381 EXPECT_TRUE(CheckDecryption(
2382 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2383 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2384
2385 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2386 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2387 // Stream ID should be the last 1 byte of kStreamId.
2388 EXPECT_EQ(0x000000FF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2389 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2390 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2391 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2392
2393 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2394 }
2395
TEST_P(QuicFramerTest,StreamFrameWithVersion)2396 TEST_P(QuicFramerTest, StreamFrameWithVersion) {
2397 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
2398 // clang-format off
2399 PacketFragments packet = {
2400 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2401 // 4-byte packet number)
2402 {"",
2403 {0xD3}},
2404 // version tag
2405 {"",
2406 {QUIC_VERSION_BYTES}},
2407 // connection_id length
2408 {"",
2409 {0x50}},
2410 // connection_id
2411 {"",
2412 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2413 // packet number
2414 {"",
2415 {0x12, 0x34, 0x56, 0x78}},
2416 // frame type (stream frame with fin)
2417 {"",
2418 {0xFE}},
2419 // stream id
2420 {"Unable to read stream_id.",
2421 {0x02, 0x03, 0x04}},
2422 // offset
2423 {"Unable to read offset.",
2424 {0x3A, 0x98, 0xFE, 0xDC,
2425 0x32, 0x10, 0x76, 0x54}},
2426 {"Unable to read frame data.",
2427 {
2428 // data length
2429 0x00, 0x0c,
2430 // data
2431 'h', 'e', 'l', 'l',
2432 'o', ' ', 'w', 'o',
2433 'r', 'l', 'd', '!'}},
2434 };
2435
2436 PacketFragments packet49 = {
2437 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2438 // 4-byte packet number)
2439 {"",
2440 {0xD3}},
2441 // version tag
2442 {"",
2443 {QUIC_VERSION_BYTES}},
2444 // destination connection ID length
2445 {"",
2446 {0x08}},
2447 // destination connection ID
2448 {"",
2449 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2450 // source connection ID length
2451 {"",
2452 {0x00}},
2453 // long header packet length
2454 {"",
2455 {0x1E}},
2456 // packet number
2457 {"",
2458 {0x12, 0x34, 0x56, 0x78}},
2459 // frame type (stream frame with fin)
2460 {"",
2461 {0xFE}},
2462 // stream id
2463 {"Long header payload length longer than packet.",
2464 {0x02, 0x03, 0x04}},
2465 // offset
2466 {"Long header payload length longer than packet.",
2467 {0x3A, 0x98, 0xFE, 0xDC,
2468 0x32, 0x10, 0x76, 0x54}},
2469 {"Long header payload length longer than packet.",
2470 {
2471 // data length
2472 0x00, 0x0c,
2473 // data
2474 'h', 'e', 'l', 'l',
2475 'o', ' ', 'w', 'o',
2476 'r', 'l', 'd', '!'}},
2477 };
2478
2479 PacketFragments packet_ietf = {
2480 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2481 // 4-byte packet number)
2482 {"",
2483 {0xD3}},
2484 // version tag
2485 {"",
2486 {QUIC_VERSION_BYTES}},
2487 // destination connection ID length
2488 {"",
2489 {0x08}},
2490 // destination connection ID
2491 {"",
2492 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2493 // source connection ID length
2494 {"",
2495 {0x00}},
2496 // long header packet length
2497 {"",
2498 {0x1E}},
2499 // packet number
2500 {"",
2501 {0x12, 0x34, 0x56, 0x78}},
2502 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
2503 {"",
2504 {0x08 | 0x01 | 0x02 | 0x04}},
2505 // stream id
2506 {"Long header payload length longer than packet.",
2507 {kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04}},
2508 // offset
2509 {"Long header payload length longer than packet.",
2510 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2511 0x32, 0x10, 0x76, 0x54}},
2512 // data length
2513 {"Long header payload length longer than packet.",
2514 {kVarInt62OneByte + 0x0c}},
2515 // data
2516 {"Long header payload length longer than packet.",
2517 { 'h', 'e', 'l', 'l',
2518 'o', ' ', 'w', 'o',
2519 'r', 'l', 'd', '!'}},
2520 };
2521 // clang-format on
2522
2523 quiche::QuicheVariableLengthIntegerLength retry_token_length_length =
2524 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
2525 size_t retry_token_length = 0;
2526 quiche::QuicheVariableLengthIntegerLength length_length =
2527 QuicVersionHasLongHeaderLengths(framer_.transport_version())
2528 ? quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1
2529 : quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
2530
2531 ReviseFirstByteByVersion(packet_ietf);
2532 PacketFragments& fragments =
2533 VersionHasIetfQuicFrames(framer_.transport_version())
2534 ? packet_ietf
2535 : (framer_.version().HasLongHeaderLengths() ? packet49 : packet);
2536 std::unique_ptr<QuicEncryptedPacket> encrypted(
2537 AssemblePacketFromFragments(fragments));
2538 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2539
2540 EXPECT_THAT(framer_.error(), IsQuicNoError());
2541 ASSERT_TRUE(visitor_.header_.get());
2542 EXPECT_TRUE(CheckDecryption(
2543 *encrypted, kIncludeVersion, !kIncludeDiversificationNonce,
2544 kPacket8ByteConnectionId, kPacket0ByteConnectionId,
2545 retry_token_length_length, retry_token_length, length_length));
2546
2547 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2548 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2549 // Stream ID should be the last 3 bytes of kStreamId.
2550 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2551 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2552 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2553 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2554
2555 CheckFramingBoundaries(fragments, framer_.version().HasLongHeaderLengths()
2556 ? QUIC_INVALID_PACKET_HEADER
2557 : QUIC_INVALID_STREAM_DATA);
2558 }
2559
TEST_P(QuicFramerTest,RejectPacket)2560 TEST_P(QuicFramerTest, RejectPacket) {
2561 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2562 visitor_.accept_packet_ = false;
2563
2564 // clang-format off
2565 unsigned char packet[] = {
2566 // type (short header, 4 byte packet number)
2567 0x43,
2568 // connection_id
2569 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2570 // packet number
2571 0x12, 0x34, 0x56, 0x78,
2572
2573 // frame type (STREAM Frame with FIN, LEN, and OFFSET bits set)
2574 0x10 | 0x01 | 0x02 | 0x04,
2575 // stream id
2576 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
2577 // offset
2578 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2579 0x32, 0x10, 0x76, 0x54,
2580 // data length
2581 kVarInt62OneByte + 0x0c,
2582 // data
2583 'h', 'e', 'l', 'l',
2584 'o', ' ', 'w', 'o',
2585 'r', 'l', 'd', '!',
2586 };
2587 // clang-format on
2588
2589 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
2590 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2591
2592 EXPECT_THAT(framer_.error(), IsQuicNoError());
2593 ASSERT_TRUE(visitor_.header_.get());
2594 EXPECT_TRUE(CheckDecryption(
2595 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2596 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2597
2598 ASSERT_EQ(0u, visitor_.stream_frames_.size());
2599 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2600 }
2601
TEST_P(QuicFramerTest,RejectPublicHeader)2602 TEST_P(QuicFramerTest, RejectPublicHeader) {
2603 visitor_.accept_public_header_ = false;
2604
2605 // clang-format off
2606 unsigned char packet[] = {
2607 // type (short header, 1 byte packet number)
2608 0x40,
2609 // connection_id
2610 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2611 // packet number
2612 0x01,
2613 };
2614 // clang-format on
2615
2616 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
2617 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2618
2619 EXPECT_THAT(framer_.error(), IsQuicNoError());
2620 ASSERT_TRUE(visitor_.header_.get());
2621 EXPECT_FALSE(visitor_.header_->packet_number.IsInitialized());
2622 }
2623
TEST_P(QuicFramerTest,AckFrameOneAckBlock)2624 TEST_P(QuicFramerTest, AckFrameOneAckBlock) {
2625 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2626 // clang-format off
2627 PacketFragments packet = {
2628 // type (short packet, 4 byte packet number)
2629 {"",
2630 {0x43}},
2631 // connection_id
2632 {"",
2633 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2634 // packet number
2635 {"",
2636 {0x12, 0x34, 0x56, 0x78}},
2637 // frame type (ack frame)
2638 // (one ack block, 2 byte largest observed, 2 byte block length)
2639 {"",
2640 {0x45}},
2641 // largest acked
2642 {"Unable to read largest acked.",
2643 {0x12, 0x34}},
2644 // Zero delta time.
2645 {"Unable to read ack delay time.",
2646 {0x00, 0x00}},
2647 // first ack block length.
2648 {"Unable to read first ack block length.",
2649 {0x12, 0x34}},
2650 // num timestamps.
2651 {"Unable to read num received packets.",
2652 {0x00}}
2653 };
2654
2655 PacketFragments packet_ietf = {
2656 // type (short packet, 4 byte packet number)
2657 {"",
2658 {0x43}},
2659 // connection_id
2660 {"",
2661 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2662 // packet number
2663 {"",
2664 {0x12, 0x34, 0x56, 0x78}},
2665 // frame type (IETF_ACK)
2666 // (one ack block, 2 byte largest observed, 2 byte block length)
2667 // IETF-Quic ignores the bit-fields in the ack type, all of
2668 // that information is encoded elsewhere in the frame.
2669 {"",
2670 {0x02}},
2671 // largest acked
2672 {"Unable to read largest acked.",
2673 {kVarInt62TwoBytes + 0x12, 0x34}},
2674 // Zero delta time.
2675 {"Unable to read ack delay time.",
2676 {kVarInt62OneByte + 0x00}},
2677 // Ack block count (0 -- no blocks after the first)
2678 {"Unable to read ack block count.",
2679 {kVarInt62OneByte + 0x00}},
2680 // first ack block length - 1.
2681 // IETF Quic defines the ack block's value as the "number of
2682 // packets that preceed the largest packet number in the block"
2683 // which for the 1st ack block is the largest acked field,
2684 // above. This means that if we are acking just packet 0x1234
2685 // then the 1st ack block will be 0.
2686 {"Unable to read first ack block length.",
2687 {kVarInt62TwoBytes + 0x12, 0x33}}
2688 };
2689 // clang-format on
2690
2691 PacketFragments& fragments =
2692 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2693 : packet;
2694 std::unique_ptr<QuicEncryptedPacket> encrypted(
2695 AssemblePacketFromFragments(fragments));
2696 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2697
2698 EXPECT_THAT(framer_.error(), IsQuicNoError());
2699 ASSERT_TRUE(visitor_.header_.get());
2700 EXPECT_TRUE(CheckDecryption(
2701 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2702 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2703
2704 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2705 ASSERT_EQ(1u, visitor_.ack_frames_.size());
2706 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
2707 EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
2708 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
2709
2710 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
2711 }
2712
2713 // This test checks that the ack frame processor correctly identifies
2714 // and handles the case where the first ack block is larger than the
2715 // largest_acked packet.
TEST_P(QuicFramerTest,FirstAckFrameUnderflow)2716 TEST_P(QuicFramerTest, FirstAckFrameUnderflow) {
2717 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2718 // clang-format off
2719 PacketFragments packet = {
2720 // type (short header, 4 byte packet number)
2721 {"",
2722 {0x43}},
2723 // connection_id
2724 {"",
2725 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2726 // packet number
2727 {"",
2728 {0x12, 0x34, 0x56, 0x78}},
2729 // frame type (ack frame)
2730 // (one ack block, 2 byte largest observed, 2 byte block length)
2731 {"",
2732 {0x45}},
2733 // largest acked
2734 {"Unable to read largest acked.",
2735 {0x12, 0x34}},
2736 // Zero delta time.
2737 {"Unable to read ack delay time.",
2738 {0x00, 0x00}},
2739 // first ack block length.
2740 {"Unable to read first ack block length.",
2741 {0x88, 0x88}},
2742 // num timestamps.
2743 {"Underflow with first ack block length 34952 largest acked is 4660.",
2744 {0x00}}
2745 };
2746
2747 PacketFragments packet_ietf = {
2748 // type (short header, 4 byte packet number)
2749 {"",
2750 {0x43}},
2751 // connection_id
2752 {"",
2753 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2754 // packet number
2755 {"",
2756 {0x12, 0x34, 0x56, 0x78}},
2757 // frame type (IETF_ACK)
2758 {"",
2759 {0x02}},
2760 // largest acked
2761 {"Unable to read largest acked.",
2762 {kVarInt62TwoBytes + 0x12, 0x34}},
2763 // Zero delta time.
2764 {"Unable to read ack delay time.",
2765 {kVarInt62OneByte + 0x00}},
2766 // Ack block count (0 -- no blocks after the first)
2767 {"Unable to read ack block count.",
2768 {kVarInt62OneByte + 0x00}},
2769 // first ack block length.
2770 {"Unable to read first ack block length.",
2771 {kVarInt62TwoBytes + 0x28, 0x88}}
2772 };
2773 // clang-format on
2774
2775 PacketFragments& fragments =
2776 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2777 : packet;
2778 std::unique_ptr<QuicEncryptedPacket> encrypted(
2779 AssemblePacketFromFragments(fragments));
2780 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
2781 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
2782 }
2783
2784 // This test checks that the ack frame processor correctly identifies
2785 // and handles the case where the third ack block's gap is larger than the
2786 // available space in the ack range.
TEST_P(QuicFramerTest,ThirdAckBlockUnderflowGap)2787 TEST_P(QuicFramerTest, ThirdAckBlockUnderflowGap) {
2788 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2789 // Test originally written for development of IETF QUIC. The test may
2790 // also apply to Google QUIC. If so, the test should be extended to
2791 // include Google QUIC (frame formats, etc). See b/141858819.
2792 return;
2793 }
2794 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2795 // clang-format off
2796 PacketFragments packet_ietf = {
2797 // type (short header, 4 byte packet number)
2798 {"",
2799 {0x43}},
2800 // connection_id
2801 {"",
2802 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2803 // packet number
2804 {"",
2805 {0x12, 0x34, 0x56, 0x78}},
2806 // frame type (IETF_ACK frame)
2807 {"",
2808 {0x02}},
2809 // largest acked
2810 {"Unable to read largest acked.",
2811 {kVarInt62OneByte + 63}},
2812 // Zero delta time.
2813 {"Unable to read ack delay time.",
2814 {kVarInt62OneByte + 0x00}},
2815 // Ack block count (2 -- 2 blocks after the first)
2816 {"Unable to read ack block count.",
2817 {kVarInt62OneByte + 0x02}},
2818 // first ack block length.
2819 {"Unable to read first ack block length.",
2820 {kVarInt62OneByte + 13}}, // Ack 14 packets, range 50..63 (inclusive)
2821
2822 {"Unable to read gap block value.",
2823 {kVarInt62OneByte + 9}}, // Gap 10 packets, 40..49 (inclusive)
2824 {"Unable to read ack block value.",
2825 {kVarInt62OneByte + 9}}, // Ack 10 packets, 30..39 (inclusive)
2826 {"Unable to read gap block value.",
2827 {kVarInt62OneByte + 29}}, // A gap of 30 packets (0..29 inclusive)
2828 // should be too big, leaving no room
2829 // for the ack.
2830 {"Underflow with gap block length 30 previous ack block start is 30.",
2831 {kVarInt62OneByte + 10}}, // Don't care
2832 };
2833 // clang-format on
2834
2835 std::unique_ptr<QuicEncryptedPacket> encrypted(
2836 AssemblePacketFromFragments(packet_ietf));
2837 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
2838 EXPECT_EQ(
2839 framer_.detailed_error(),
2840 "Underflow with gap block length 30 previous ack block start is 30.");
2841 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
2842 }
2843
2844 // This test checks that the ack frame processor correctly identifies
2845 // and handles the case where the third ack block's length is larger than the
2846 // available space in the ack range.
TEST_P(QuicFramerTest,ThirdAckBlockUnderflowAck)2847 TEST_P(QuicFramerTest, ThirdAckBlockUnderflowAck) {
2848 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2849 // Test originally written for development of IETF QUIC. The test may
2850 // also apply to Google QUIC. If so, the test should be extended to
2851 // include Google QUIC (frame formats, etc). See b/141858819.
2852 return;
2853 }
2854 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2855 // clang-format off
2856 PacketFragments packet_ietf = {
2857 // type (short header, 4 byte packet number)
2858 {"",
2859 {0x43}},
2860 // connection_id
2861 {"",
2862 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2863 // packet number
2864 {"",
2865 {0x12, 0x34, 0x56, 0x78}},
2866 // frame type (IETF_ACK frame)
2867 {"",
2868 {0x02}},
2869 // largest acked
2870 {"Unable to read largest acked.",
2871 {kVarInt62OneByte + 63}},
2872 // Zero delta time.
2873 {"Unable to read ack delay time.",
2874 {kVarInt62OneByte + 0x00}},
2875 // Ack block count (2 -- 2 blocks after the first)
2876 {"Unable to read ack block count.",
2877 {kVarInt62OneByte + 0x02}},
2878 // first ack block length.
2879 {"Unable to read first ack block length.",
2880 {kVarInt62OneByte + 13}}, // only 50 packet numbers "left"
2881
2882 {"Unable to read gap block value.",
2883 {kVarInt62OneByte + 10}}, // Only 40 packet numbers left
2884 {"Unable to read ack block value.",
2885 {kVarInt62OneByte + 10}}, // only 30 packet numbers left.
2886 {"Unable to read gap block value.",
2887 {kVarInt62OneByte + 1}}, // Gap is OK, 29 packet numbers left
2888 {"Unable to read ack block value.",
2889 {kVarInt62OneByte + 30}}, // Use up all 30, should be an error
2890 };
2891 // clang-format on
2892
2893 std::unique_ptr<QuicEncryptedPacket> encrypted(
2894 AssemblePacketFromFragments(packet_ietf));
2895 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
2896 EXPECT_EQ(framer_.detailed_error(),
2897 "Underflow with ack block length 31 latest ack block end is 25.");
2898 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
2899 }
2900
2901 // Tests a variety of ack block wrap scenarios. For example, if the
2902 // N-1th block causes packet 0 to be acked, then a gap would wrap
2903 // around to 0x3fffffff ffffffff... Make sure we detect this
2904 // condition.
TEST_P(QuicFramerTest,AckBlockUnderflowGapWrap)2905 TEST_P(QuicFramerTest, AckBlockUnderflowGapWrap) {
2906 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2907 // Test originally written for development of IETF QUIC. The test may
2908 // also apply to Google QUIC. If so, the test should be extended to
2909 // include Google QUIC (frame formats, etc). See b/141858819.
2910 return;
2911 }
2912 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2913 // clang-format off
2914 PacketFragments packet_ietf = {
2915 // type (short header, 4 byte packet number)
2916 {"",
2917 {0x43}},
2918 // connection_id
2919 {"",
2920 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2921 // packet number
2922 {"",
2923 {0x12, 0x34, 0x56, 0x78}},
2924 // frame type (IETF_ACK frame)
2925 {"",
2926 {0x02}},
2927 // largest acked
2928 {"Unable to read largest acked.",
2929 {kVarInt62OneByte + 10}},
2930 // Zero delta time.
2931 {"Unable to read ack delay time.",
2932 {kVarInt62OneByte + 0x00}},
2933 // Ack block count (1 -- 1 blocks after the first)
2934 {"Unable to read ack block count.",
2935 {kVarInt62OneByte + 1}},
2936 // first ack block length.
2937 {"Unable to read first ack block length.",
2938 {kVarInt62OneByte + 9}}, // Ack packets 1..10 (inclusive)
2939
2940 {"Unable to read gap block value.",
2941 {kVarInt62OneByte + 1}}, // Gap of 2 packets (-1...0), should wrap
2942 {"Underflow with gap block length 2 previous ack block start is 1.",
2943 {kVarInt62OneByte + 9}}, // irrelevant
2944 };
2945 // clang-format on
2946
2947 std::unique_ptr<QuicEncryptedPacket> encrypted(
2948 AssemblePacketFromFragments(packet_ietf));
2949 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
2950 EXPECT_EQ(framer_.detailed_error(),
2951 "Underflow with gap block length 2 previous ack block start is 1.");
2952 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
2953 }
2954
2955 // As AckBlockUnderflowGapWrap, but in this test, it's the ack
2956 // component of the ack-block that causes the wrap, not the gap.
TEST_P(QuicFramerTest,AckBlockUnderflowAckWrap)2957 TEST_P(QuicFramerTest, AckBlockUnderflowAckWrap) {
2958 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2959 // Test originally written for development of IETF QUIC. The test may
2960 // also apply to Google QUIC. If so, the test should be extended to
2961 // include Google QUIC (frame formats, etc). See b/141858819.
2962 return;
2963 }
2964 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2965 // clang-format off
2966 PacketFragments packet_ietf = {
2967 // type (short header, 4 byte packet number)
2968 {"",
2969 {0x43}},
2970 // connection_id
2971 {"",
2972 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2973 // packet number
2974 {"",
2975 {0x12, 0x34, 0x56, 0x78}},
2976 // frame type (IETF_ACK frame)
2977 {"",
2978 {0x02}},
2979 // largest acked
2980 {"Unable to read largest acked.",
2981 {kVarInt62OneByte + 10}},
2982 // Zero delta time.
2983 {"Unable to read ack delay time.",
2984 {kVarInt62OneByte + 0x00}},
2985 // Ack block count (1 -- 1 blocks after the first)
2986 {"Unable to read ack block count.",
2987 {kVarInt62OneByte + 1}},
2988 // first ack block length.
2989 {"Unable to read first ack block length.",
2990 {kVarInt62OneByte + 6}}, // Ack packets 4..10 (inclusive)
2991
2992 {"Unable to read gap block value.",
2993 {kVarInt62OneByte + 1}}, // Gap of 2 packets (2..3)
2994 {"Unable to read ack block value.",
2995 {kVarInt62OneByte + 9}}, // Should wrap.
2996 };
2997 // clang-format on
2998
2999 std::unique_ptr<QuicEncryptedPacket> encrypted(
3000 AssemblePacketFromFragments(packet_ietf));
3001 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3002 EXPECT_EQ(framer_.detailed_error(),
3003 "Underflow with ack block length 10 latest ack block end is 1.");
3004 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
3005 }
3006
3007 // An ack block that acks the entire range, 1...0x3fffffffffffffff
TEST_P(QuicFramerTest,AckBlockAcksEverything)3008 TEST_P(QuicFramerTest, AckBlockAcksEverything) {
3009 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3010 // Test originally written for development of IETF QUIC. The test may
3011 // also apply to Google QUIC. If so, the test should be extended to
3012 // include Google QUIC (frame formats, etc). See b/141858819.
3013 return;
3014 }
3015 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3016 // clang-format off
3017 PacketFragments packet_ietf = {
3018 // type (short header, 4 byte packet number)
3019 {"",
3020 {0x43}},
3021 // connection_id
3022 {"",
3023 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3024 // packet number
3025 {"",
3026 {0x12, 0x34, 0x56, 0x78}},
3027 // frame type (IETF_ACK frame)
3028 {"",
3029 {0x02}},
3030 // largest acked
3031 {"Unable to read largest acked.",
3032 {kVarInt62EightBytes + 0x3f, 0xff, 0xff, 0xff,
3033 0xff, 0xff, 0xff, 0xff}},
3034 // Zero delta time.
3035 {"Unable to read ack delay time.",
3036 {kVarInt62OneByte + 0x00}},
3037 // Ack block count No additional blocks
3038 {"Unable to read ack block count.",
3039 {kVarInt62OneByte + 0}},
3040 // first ack block length.
3041 {"Unable to read first ack block length.",
3042 {kVarInt62EightBytes + 0x3f, 0xff, 0xff, 0xff,
3043 0xff, 0xff, 0xff, 0xfe}},
3044 };
3045 // clang-format on
3046
3047 std::unique_ptr<QuicEncryptedPacket> encrypted(
3048 AssemblePacketFromFragments(packet_ietf));
3049 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3050 EXPECT_EQ(1u, visitor_.ack_frames_.size());
3051 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3052 EXPECT_EQ(1u, frame.packets.NumIntervals());
3053 EXPECT_EQ(kLargestIetfLargestObserved, LargestAcked(frame));
3054 EXPECT_EQ(kLargestIetfLargestObserved.ToUint64(),
3055 frame.packets.NumPacketsSlow());
3056 }
3057
3058 // This test looks for a malformed ack where
3059 // - There is a largest-acked value (that is, the frame is acking
3060 // something,
3061 // - But the length of the first ack block is 0 saying that no frames
3062 // are being acked with the largest-acked value or there are no
3063 // additional ack blocks.
3064 //
TEST_P(QuicFramerTest,AckFrameFirstAckBlockLengthZero)3065 TEST_P(QuicFramerTest, AckFrameFirstAckBlockLengthZero) {
3066 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3067 // Not applicable to version 99 -- first ack block contains the
3068 // number of packets that preceed the largest_acked packet.
3069 // A value of 0 means no packets preceed --- that the block's
3070 // length is 1. Therefore the condition that this test checks can
3071 // not arise.
3072 return;
3073 }
3074 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3075
3076 // clang-format off
3077 PacketFragments packet = {
3078 // type (short header, 4 byte packet number)
3079 {"",
3080 { 0x43 }},
3081 // connection_id
3082 {"",
3083 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3084 // packet number
3085 {"",
3086 { 0x12, 0x34, 0x56, 0x78 }},
3087
3088 // frame type (ack frame)
3089 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3090 {"",
3091 { 0x65 }},
3092 // largest acked
3093 {"Unable to read largest acked.",
3094 { 0x12, 0x34 }},
3095 // Zero delta time.
3096 {"Unable to read ack delay time.",
3097 { 0x00, 0x00 }},
3098 // num ack blocks ranges.
3099 {"Unable to read num of ack blocks.",
3100 { 0x01 }},
3101 // first ack block length.
3102 {"Unable to read first ack block length.",
3103 { 0x00, 0x00 }},
3104 // gap to next block.
3105 { "First block length is zero.",
3106 { 0x01 }},
3107 // ack block length.
3108 { "First block length is zero.",
3109 { 0x0e, 0xaf }},
3110 // Number of timestamps.
3111 { "First block length is zero.",
3112 { 0x00 }},
3113 };
3114
3115 // clang-format on
3116 std::unique_ptr<QuicEncryptedPacket> encrypted(
3117 AssemblePacketFromFragments(packet));
3118
3119 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3120 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_ACK_DATA));
3121
3122 ASSERT_TRUE(visitor_.header_.get());
3123 EXPECT_TRUE(CheckDecryption(
3124 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3125 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3126
3127 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3128 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3129
3130 CheckFramingBoundaries(packet, QUIC_INVALID_ACK_DATA);
3131 }
3132
TEST_P(QuicFramerTest,AckFrameOneAckBlockMaxLength)3133 TEST_P(QuicFramerTest, AckFrameOneAckBlockMaxLength) {
3134 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3135 // clang-format off
3136 PacketFragments packet = {
3137 // type (short header, 4 byte packet number)
3138 {"",
3139 {0x43}},
3140 // connection_id
3141 {"",
3142 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3143 // packet number
3144 {"",
3145 {0x56, 0x78, 0x9A, 0xBC}},
3146 // frame type (ack frame)
3147 // (one ack block, 4 byte largest observed, 2 byte block length)
3148 {"",
3149 {0x49}},
3150 // largest acked
3151 {"Unable to read largest acked.",
3152 {0x12, 0x34, 0x56, 0x78}},
3153 // Zero delta time.
3154 {"Unable to read ack delay time.",
3155 {0x00, 0x00}},
3156 // first ack block length.
3157 {"Unable to read first ack block length.",
3158 {0x12, 0x34}},
3159 // num timestamps.
3160 {"Unable to read num received packets.",
3161 {0x00}}
3162 };
3163
3164 PacketFragments packet_ietf = {
3165 // type (short header, 4 byte packet number)
3166 {"",
3167 {0x43}},
3168 // connection_id
3169 {"",
3170 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3171 // packet number
3172 {"",
3173 {0x56, 0x78, 0x9A, 0xBC}},
3174 // frame type (IETF_ACK frame)
3175 {"",
3176 {0x02}},
3177 // largest acked
3178 {"Unable to read largest acked.",
3179 {kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78}},
3180 // Zero delta time.
3181 {"Unable to read ack delay time.",
3182 {kVarInt62OneByte + 0x00}},
3183 // Number of ack blocks after first
3184 {"Unable to read ack block count.",
3185 {kVarInt62OneByte + 0x00}},
3186 // first ack block length.
3187 {"Unable to read first ack block length.",
3188 {kVarInt62TwoBytes + 0x12, 0x33}}
3189 };
3190 // clang-format on
3191
3192 PacketFragments& fragments =
3193 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
3194 : packet;
3195 std::unique_ptr<QuicEncryptedPacket> encrypted(
3196 AssemblePacketFromFragments(fragments));
3197 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3198
3199 EXPECT_THAT(framer_.error(), IsQuicNoError());
3200 ASSERT_TRUE(visitor_.header_.get());
3201 EXPECT_TRUE(CheckDecryption(
3202 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3203 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3204
3205 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3206 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3207 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3208 EXPECT_EQ(kPacketNumber, LargestAcked(frame));
3209 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
3210
3211 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3212 }
3213
3214 // Tests ability to handle multiple ackblocks after the first ack
3215 // block. Non-version-99 tests include multiple timestamps as well.
TEST_P(QuicFramerTest,AckFrameTwoTimeStampsMultipleAckBlocks)3216 TEST_P(QuicFramerTest, AckFrameTwoTimeStampsMultipleAckBlocks) {
3217 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3218 // clang-format off
3219 PacketFragments packet = {
3220 // type (short header, 4 byte packet number)
3221 {"",
3222 { 0x43 }},
3223 // connection_id
3224 {"",
3225 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3226 // packet number
3227 {"",
3228 { 0x12, 0x34, 0x56, 0x78 }},
3229
3230 // frame type (ack frame)
3231 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3232 {"",
3233 { 0x65 }},
3234 // largest acked
3235 {"Unable to read largest acked.",
3236 { 0x12, 0x34 }},
3237 // Zero delta time.
3238 {"Unable to read ack delay time.",
3239 { 0x00, 0x00 }},
3240 // num ack blocks ranges.
3241 {"Unable to read num of ack blocks.",
3242 { 0x04 }},
3243 // first ack block length.
3244 {"Unable to read first ack block length.",
3245 { 0x00, 0x01 }},
3246 // gap to next block.
3247 { "Unable to read gap to next ack block.",
3248 { 0x01 }},
3249 // ack block length.
3250 { "Unable to ack block length.",
3251 { 0x0e, 0xaf }},
3252 // gap to next block.
3253 { "Unable to read gap to next ack block.",
3254 { 0xff }},
3255 // ack block length.
3256 { "Unable to ack block length.",
3257 { 0x00, 0x00 }},
3258 // gap to next block.
3259 { "Unable to read gap to next ack block.",
3260 { 0x91 }},
3261 // ack block length.
3262 { "Unable to ack block length.",
3263 { 0x01, 0xea }},
3264 // gap to next block.
3265 { "Unable to read gap to next ack block.",
3266 { 0x05 }},
3267 // ack block length.
3268 { "Unable to ack block length.",
3269 { 0x00, 0x04 }},
3270 // Number of timestamps.
3271 { "Unable to read num received packets.",
3272 { 0x02 }},
3273 // Delta from largest observed.
3274 { "Unable to read sequence delta in received packets.",
3275 { 0x01 }},
3276 // Delta time.
3277 { "Unable to read time delta in received packets.",
3278 { 0x76, 0x54, 0x32, 0x10 }},
3279 // Delta from largest observed.
3280 { "Unable to read sequence delta in received packets.",
3281 { 0x02 }},
3282 // Delta time.
3283 { "Unable to read incremental time delta in received packets.",
3284 { 0x32, 0x10 }},
3285 };
3286
3287 PacketFragments packet_ietf = {
3288 // type (short header, 4 byte packet number)
3289 {"",
3290 { 0x43 }},
3291 // connection_id
3292 {"",
3293 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3294 // packet number
3295 {"",
3296 { 0x12, 0x34, 0x56, 0x78 }},
3297
3298 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3299 {"",
3300 { 0x22 }},
3301 // largest acked
3302 {"Unable to read largest acked.",
3303 { kVarInt62TwoBytes + 0x12, 0x34 }}, // = 4660
3304 // Zero delta time.
3305 {"Unable to read ack delay time.",
3306 { kVarInt62OneByte + 0x00 }},
3307 // number of additional ack blocks
3308 {"Unable to read ack block count.",
3309 { kVarInt62OneByte + 0x03 }},
3310 // first ack block length.
3311 {"Unable to read first ack block length.",
3312 { kVarInt62OneByte + 0x00 }}, // 1st block length = 1
3313
3314 // Additional ACK Block #1
3315 // gap to next block.
3316 { "Unable to read gap block value.",
3317 { kVarInt62OneByte + 0x00 }}, // gap of 1 packet
3318 // ack block length.
3319 { "Unable to read ack block value.",
3320 { kVarInt62TwoBytes + 0x0e, 0xae }}, // 3759
3321
3322 // pre-version-99 test includes an ack block of 0 length. this
3323 // can not happen in version 99. ergo the second block is not
3324 // present in the v99 test and the gap length of the next block
3325 // is the sum of the two gaps in the pre-version-99 tests.
3326 // Additional ACK Block #2
3327 // gap to next block.
3328 { "Unable to read gap block value.",
3329 { kVarInt62TwoBytes + 0x01, 0x8f }}, // Gap is 400 (0x190) pkts
3330 // ack block length.
3331 { "Unable to read ack block value.",
3332 { kVarInt62TwoBytes + 0x01, 0xe9 }}, // block is 389 (x1ea) pkts
3333
3334 // Additional ACK Block #3
3335 // gap to next block.
3336 { "Unable to read gap block value.",
3337 { kVarInt62OneByte + 0x04 }}, // Gap is 5 packets.
3338 // ack block length.
3339 { "Unable to read ack block value.",
3340 { kVarInt62OneByte + 0x03 }}, // block is 3 packets.
3341
3342 // Receive Timestamps.
3343 { "Unable to read receive timestamp range count.",
3344 { kVarInt62OneByte + 0x01 }},
3345 { "Unable to read receive timestamp gap.",
3346 { kVarInt62OneByte + 0x01 }},
3347 { "Unable to read receive timestamp count.",
3348 { kVarInt62OneByte + 0x02 }},
3349 { "Unable to read receive timestamp delta.",
3350 { kVarInt62FourBytes + 0x36, 0x54, 0x32, 0x10 }},
3351 { "Unable to read receive timestamp delta.",
3352 { kVarInt62TwoBytes + 0x32, 0x10 }},
3353 };
3354
3355 // clang-format on
3356 PacketFragments& fragments =
3357 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
3358 : packet;
3359
3360 std::unique_ptr<QuicEncryptedPacket> encrypted(
3361 AssemblePacketFromFragments(fragments));
3362
3363 framer_.set_process_timestamps(true);
3364 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3365
3366 EXPECT_THAT(framer_.error(), IsQuicNoError());
3367 ASSERT_TRUE(visitor_.header_.get());
3368 EXPECT_TRUE(CheckDecryption(
3369 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3370 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3371
3372 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3373 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3374 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3375 EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
3376 ASSERT_EQ(4254u, frame.packets.NumPacketsSlow());
3377 EXPECT_EQ(4u, frame.packets.NumIntervals());
3378 EXPECT_EQ(2u, frame.received_packet_times.size());
3379 }
3380
TEST_P(QuicFramerTest,AckFrameMultipleReceiveTimestampRanges)3381 TEST_P(QuicFramerTest, AckFrameMultipleReceiveTimestampRanges) {
3382 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3383 return;
3384 }
3385 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3386 // clang-format off
3387 PacketFragments packet_ietf = {
3388 // type (short header, 4 byte packet number)
3389 {"",
3390 { 0x43 }},
3391 // connection_id
3392 {"",
3393 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3394 // packet number
3395 {"",
3396 { 0x12, 0x34, 0x56, 0x78 }},
3397
3398 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3399 {"",
3400 { 0x22 }},
3401 // largest acked
3402 {"Unable to read largest acked.",
3403 { kVarInt62TwoBytes + 0x12, 0x34 }}, // = 4660
3404 // Zero delta time.
3405 {"Unable to read ack delay time.",
3406 { kVarInt62OneByte + 0x00 }},
3407 // number of additional ack blocks
3408 {"Unable to read ack block count.",
3409 { kVarInt62OneByte + 0x00 }},
3410 // first ack block length.
3411 {"Unable to read first ack block length.",
3412 { kVarInt62OneByte + 0x00 }}, // 1st block length = 1
3413
3414 // Receive Timestamps.
3415 { "Unable to read receive timestamp range count.",
3416 { kVarInt62OneByte + 0x03 }},
3417
3418 // Timestamp range 1 (three packets).
3419 { "Unable to read receive timestamp gap.",
3420 { kVarInt62OneByte + 0x02 }},
3421 { "Unable to read receive timestamp count.",
3422 { kVarInt62OneByte + 0x03 }},
3423 { "Unable to read receive timestamp delta.",
3424 { kVarInt62FourBytes + 0x29, 0xff, 0xff, 0xff}},
3425 { "Unable to read receive timestamp delta.",
3426 { kVarInt62TwoBytes + 0x11, 0x11 }},
3427 { "Unable to read receive timestamp delta.",
3428 { kVarInt62OneByte + 0x01}},
3429
3430 // Timestamp range 2 (one packet).
3431 { "Unable to read receive timestamp gap.",
3432 { kVarInt62OneByte + 0x05 }},
3433 { "Unable to read receive timestamp count.",
3434 { kVarInt62OneByte + 0x01 }},
3435 { "Unable to read receive timestamp delta.",
3436 { kVarInt62TwoBytes + 0x10, 0x00 }},
3437
3438 // Timestamp range 3 (two packets).
3439 { "Unable to read receive timestamp gap.",
3440 { kVarInt62OneByte + 0x08 }},
3441 { "Unable to read receive timestamp count.",
3442 { kVarInt62OneByte + 0x02 }},
3443 { "Unable to read receive timestamp delta.",
3444 { kVarInt62OneByte + 0x10 }},
3445 { "Unable to read receive timestamp delta.",
3446 { kVarInt62TwoBytes + 0x01, 0x00 }},
3447 };
3448 // clang-format on
3449
3450 std::unique_ptr<QuicEncryptedPacket> encrypted(
3451 AssemblePacketFromFragments(packet_ietf));
3452
3453 framer_.set_process_timestamps(true);
3454 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3455 EXPECT_THAT(framer_.error(), IsQuicNoError());
3456 ASSERT_TRUE(visitor_.header_.get());
3457 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3458
3459 EXPECT_THAT(frame.received_packet_times,
3460 ContainerEq(PacketTimeVector{
3461 // Timestamp Range 1.
3462 {LargestAcked(frame) - 2, CreationTimePlus(0x29ffffff)},
3463 {LargestAcked(frame) - 3, CreationTimePlus(0x29ffeeee)},
3464 {LargestAcked(frame) - 4, CreationTimePlus(0x29ffeeed)},
3465 // Timestamp Range 2.
3466 {LargestAcked(frame) - 11, CreationTimePlus(0x29ffdeed)},
3467 // Timestamp Range 3.
3468 {LargestAcked(frame) - 21, CreationTimePlus(0x29ffdedd)},
3469 {LargestAcked(frame) - 22, CreationTimePlus(0x29ffdddd)},
3470 }));
3471 }
3472
TEST_P(QuicFramerTest,AckFrameReceiveTimestampWithExponent)3473 TEST_P(QuicFramerTest, AckFrameReceiveTimestampWithExponent) {
3474 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3475 return;
3476 }
3477 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3478 // clang-format off
3479 PacketFragments packet_ietf = {
3480 // type (short header, 4 byte packet number)
3481 {"",
3482 { 0x43 }},
3483 // connection_id
3484 {"",
3485 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3486 // packet number
3487 {"",
3488 { 0x12, 0x34, 0x56, 0x78 }},
3489
3490 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3491 {"",
3492 { 0x22 }},
3493 // largest acked
3494 {"Unable to read largest acked.",
3495 { kVarInt62TwoBytes + 0x12, 0x34 }}, // = 4660
3496 // Zero delta time.
3497 {"Unable to read ack delay time.",
3498 { kVarInt62OneByte + 0x00 }},
3499 // number of additional ack blocks
3500 {"Unable to read ack block count.",
3501 { kVarInt62OneByte + 0x00 }},
3502 // first ack block length.
3503 {"Unable to read first ack block length.",
3504 { kVarInt62OneByte + 0x00 }}, // 1st block length = 1
3505
3506 // Receive Timestamps.
3507 { "Unable to read receive timestamp range count.",
3508 { kVarInt62OneByte + 0x01 }},
3509 { "Unable to read receive timestamp gap.",
3510 { kVarInt62OneByte + 0x00 }},
3511 { "Unable to read receive timestamp count.",
3512 { kVarInt62OneByte + 0x03 }},
3513 { "Unable to read receive timestamp delta.",
3514 { kVarInt62TwoBytes + 0x29, 0xff}},
3515 { "Unable to read receive timestamp delta.",
3516 { kVarInt62TwoBytes + 0x11, 0x11 }},
3517 { "Unable to read receive timestamp delta.",
3518 { kVarInt62OneByte + 0x01}},
3519 };
3520 // clang-format on
3521
3522 std::unique_ptr<QuicEncryptedPacket> encrypted(
3523 AssemblePacketFromFragments(packet_ietf));
3524
3525 framer_.set_receive_timestamps_exponent(3);
3526 framer_.set_process_timestamps(true);
3527 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3528 EXPECT_THAT(framer_.error(), IsQuicNoError());
3529 ASSERT_TRUE(visitor_.header_.get());
3530 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3531
3532 EXPECT_THAT(frame.received_packet_times,
3533 ContainerEq(PacketTimeVector{
3534 // Timestamp Range 1.
3535 {LargestAcked(frame), CreationTimePlus(0x29ff << 3)},
3536 {LargestAcked(frame) - 1, CreationTimePlus(0x18ee << 3)},
3537 {LargestAcked(frame) - 2, CreationTimePlus(0x18ed << 3)},
3538 }));
3539 }
3540
TEST_P(QuicFramerTest,AckFrameReceiveTimestampGapTooHigh)3541 TEST_P(QuicFramerTest, AckFrameReceiveTimestampGapTooHigh) {
3542 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3543 return;
3544 }
3545 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3546 // clang-format off
3547 PacketFragments packet_ietf = {
3548 // type (short header, 4 byte packet number)
3549 {"",
3550 { 0x43 }},
3551 // connection_id
3552 {"",
3553 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3554 // packet number
3555 {"",
3556 { 0x12, 0x34, 0x56, 0x78 }},
3557
3558 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3559 {"",
3560 { 0x22 }},
3561 // largest acked
3562 {"Unable to read largest acked.",
3563 { kVarInt62TwoBytes + 0x12, 0x34 }}, // = 4660
3564 // Zero delta time.
3565 {"Unable to read ack delay time.",
3566 { kVarInt62OneByte + 0x00 }},
3567 // number of additional ack blocks
3568 {"Unable to read ack block count.",
3569 { kVarInt62OneByte + 0x00 }},
3570 // first ack block length.
3571 {"Unable to read first ack block length.",
3572 { kVarInt62OneByte + 0x00 }}, // 1st block length = 1
3573
3574 // Receive Timestamps.
3575 { "Unable to read receive timestamp range count.",
3576 { kVarInt62OneByte + 0x01 }},
3577 { "Unable to read receive timestamp gap.",
3578 { kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x79 }},
3579 { "Unable to read receive timestamp count.",
3580 { kVarInt62OneByte + 0x01 }},
3581 { "Unable to read receive timestamp delta.",
3582 { kVarInt62TwoBytes + 0x29, 0xff}},
3583 };
3584 // clang-format on
3585
3586 std::unique_ptr<QuicEncryptedPacket> encrypted(
3587 AssemblePacketFromFragments(packet_ietf));
3588
3589 framer_.set_process_timestamps(true);
3590 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3591 EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3592 "Receive timestamp gap too high."));
3593 }
3594
TEST_P(QuicFramerTest,AckFrameReceiveTimestampCountTooHigh)3595 TEST_P(QuicFramerTest, AckFrameReceiveTimestampCountTooHigh) {
3596 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3597 return;
3598 }
3599 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3600 // clang-format off
3601 PacketFragments packet_ietf = {
3602 // type (short header, 4 byte packet number)
3603 {"",
3604 { 0x43 }},
3605 // connection_id
3606 {"",
3607 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3608 // packet number
3609 {"",
3610 { 0x12, 0x34, 0x56, 0x78 }},
3611
3612 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3613 {"",
3614 { 0x22 }},
3615 // largest acked
3616 {"Unable to read largest acked.",
3617 { kVarInt62TwoBytes + 0x12, 0x34 }}, // = 4660
3618 // Zero delta time.
3619 {"Unable to read ack delay time.",
3620 { kVarInt62OneByte + 0x00 }},
3621 // number of additional ack blocks
3622 {"Unable to read ack block count.",
3623 { kVarInt62OneByte + 0x00 }},
3624 // first ack block length.
3625 {"Unable to read first ack block length.",
3626 { kVarInt62OneByte + 0x00 }}, // 1st block length = 1
3627
3628 // Receive Timestamps.
3629 { "Unable to read receive timestamp range count.",
3630 { kVarInt62OneByte + 0x01 }},
3631 { "Unable to read receive timestamp gap.",
3632 { kVarInt62OneByte + 0x02 }},
3633 { "Unable to read receive timestamp count.",
3634 { kVarInt62OneByte + 0x02 }},
3635 { "Unable to read receive timestamp delta.",
3636 { kVarInt62OneByte + 0x0a}},
3637 { "Unable to read receive timestamp delta.",
3638 { kVarInt62OneByte + 0x0b}},
3639 };
3640 // clang-format on
3641
3642 std::unique_ptr<QuicEncryptedPacket> encrypted(
3643 AssemblePacketFromFragments(packet_ietf));
3644
3645 framer_.set_process_timestamps(true);
3646 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3647 EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3648 "Receive timestamp delta too high."));
3649 }
3650
TEST_P(QuicFramerTest,AckFrameReceiveTimestampDeltaTooHigh)3651 TEST_P(QuicFramerTest, AckFrameReceiveTimestampDeltaTooHigh) {
3652 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3653 return;
3654 }
3655 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3656 // clang-format off
3657 PacketFragments packet_ietf = {
3658 // type (short header, 4 byte packet number)
3659 {"",
3660 { 0x43 }},
3661 // connection_id
3662 {"",
3663 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3664 // packet number
3665 {"",
3666 { 0x12, 0x34, 0x56, 0x78 }},
3667
3668 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3669 {"",
3670 { 0x22 }},
3671 // largest acked
3672 {"Unable to read largest acked.",
3673 { kVarInt62TwoBytes + 0x12, 0x34 }}, // = 4660
3674 // Zero delta time.
3675 {"Unable to read ack delay time.",
3676 { kVarInt62OneByte + 0x00 }},
3677 // number of additional ack blocks
3678 {"Unable to read ack block count.",
3679 { kVarInt62OneByte + 0x00 }},
3680 // first ack block length.
3681 {"Unable to read first ack block length.",
3682 { kVarInt62OneByte + 0x00 }}, // 1st block length = 1
3683
3684 // Receive Timestamps.
3685 { "Unable to read receive timestamp range count.",
3686 { kVarInt62OneByte + 0x01 }},
3687 { "Unable to read receive timestamp gap.",
3688 { kVarInt62OneByte + 0x02 }},
3689 { "Unable to read receive timestamp count.",
3690 { kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77 }},
3691 { "Unable to read receive timestamp delta.",
3692 { kVarInt62TwoBytes + 0x29, 0xff}},
3693 };
3694 // clang-format on
3695
3696 std::unique_ptr<QuicEncryptedPacket> encrypted(
3697 AssemblePacketFromFragments(packet_ietf));
3698
3699 framer_.set_process_timestamps(true);
3700 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3701 EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3702 "Receive timestamp count too high."));
3703 }
3704
TEST_P(QuicFramerTest,AckFrameTimeStampDeltaTooHigh)3705 TEST_P(QuicFramerTest, AckFrameTimeStampDeltaTooHigh) {
3706 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3707 // clang-format off
3708 unsigned char packet[] = {
3709 // type (short header, 4 byte packet number)
3710 0x43,
3711 // connection_id
3712 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3713 // packet number
3714 0x12, 0x34, 0x56, 0x78,
3715
3716 // frame type (ack frame)
3717 // (no ack blocks, 1 byte largest observed, 1 byte block length)
3718 0x40,
3719 // largest acked
3720 0x01,
3721 // Zero delta time.
3722 0x00, 0x00,
3723 // first ack block length.
3724 0x01,
3725 // num timestamps.
3726 0x01,
3727 // Delta from largest observed.
3728 0x01,
3729 // Delta time.
3730 0x10, 0x32, 0x54, 0x76,
3731 };
3732 // clang-format on
3733 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3734 // ACK Timestamp is not a feature of IETF QUIC.
3735 return;
3736 }
3737 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
3738 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
3739 EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3740 "delta_from_largest_observed too high"));
3741 }
3742
TEST_P(QuicFramerTest,AckFrameTimeStampSecondDeltaTooHigh)3743 TEST_P(QuicFramerTest, AckFrameTimeStampSecondDeltaTooHigh) {
3744 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3745 // clang-format off
3746 unsigned char packet[] = {
3747 // type (short header, 4 byte packet number)
3748 0x43,
3749 // connection_id
3750 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3751 // packet number
3752 0x12, 0x34, 0x56, 0x78,
3753
3754 // frame type (ack frame)
3755 // (no ack blocks, 1 byte largest observed, 1 byte block length)
3756 0x40,
3757 // largest acked
3758 0x03,
3759 // Zero delta time.
3760 0x00, 0x00,
3761 // first ack block length.
3762 0x03,
3763 // num timestamps.
3764 0x02,
3765 // Delta from largest observed.
3766 0x01,
3767 // Delta time.
3768 0x10, 0x32, 0x54, 0x76,
3769 // Delta from largest observed.
3770 0x03,
3771 // Delta time.
3772 0x10, 0x32,
3773 };
3774 // clang-format on
3775 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3776 // ACK Timestamp is not a feature of IETF QUIC.
3777 return;
3778 }
3779 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
3780 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
3781 EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3782 "delta_from_largest_observed too high"));
3783 }
3784
TEST_P(QuicFramerTest,NewStopWaitingFrame)3785 TEST_P(QuicFramerTest, NewStopWaitingFrame) {
3786 if (VersionHasIetfQuicFrames(version_.transport_version)) {
3787 // The Stop Waiting frame is not in IETF QUIC
3788 return;
3789 }
3790 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3791 // clang-format off
3792 PacketFragments packet = {
3793 // type (short header, 4 byte packet number)
3794 {"",
3795 {0x43}},
3796 // connection_id
3797 {"",
3798 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3799 // packet number
3800 {"",
3801 {0x12, 0x34, 0x56, 0x78}},
3802 // frame type (stop waiting frame)
3803 {"",
3804 {0x06}},
3805 // least packet number awaiting an ack, delta from packet number.
3806 {"Unable to read least unacked delta.",
3807 {0x00, 0x00, 0x00, 0x08}}
3808 };
3809 // clang-format on
3810
3811 std::unique_ptr<QuicEncryptedPacket> encrypted(
3812 AssemblePacketFromFragments(packet));
3813
3814 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3815 EXPECT_THAT(framer_.error(), IsQuicNoError());
3816 ASSERT_TRUE(visitor_.header_.get());
3817 EXPECT_TRUE(CheckDecryption(
3818 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3819 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3820
3821 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3822 ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size());
3823 const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0];
3824 EXPECT_EQ(kLeastUnacked, frame.least_unacked);
3825
3826 CheckFramingBoundaries(packet, QUIC_INVALID_STOP_WAITING_DATA);
3827 }
3828
TEST_P(QuicFramerTest,InvalidNewStopWaitingFrame)3829 TEST_P(QuicFramerTest, InvalidNewStopWaitingFrame) {
3830 // The Stop Waiting frame is not in IETF QUIC
3831 if (VersionHasIetfQuicFrames(version_.transport_version)) {
3832 return;
3833 }
3834 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3835 // clang-format off
3836 unsigned char packet[] = {
3837 // type (short header, 4 byte packet number)
3838 0x43,
3839 // connection_id
3840 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3841 // packet number
3842 0x12, 0x34, 0x56, 0x78,
3843 // frame type (stop waiting frame)
3844 0x06,
3845 // least packet number awaiting an ack, delta from packet number.
3846 0x57, 0x78, 0x9A, 0xA8,
3847 };
3848 // clang-format on
3849
3850 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
3851 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
3852 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_STOP_WAITING_DATA));
3853 EXPECT_EQ("Invalid unacked delta.", framer_.detailed_error());
3854 }
3855
TEST_P(QuicFramerTest,RstStreamFrame)3856 TEST_P(QuicFramerTest, RstStreamFrame) {
3857 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3858 // clang-format off
3859 PacketFragments packet = {
3860 // type (short header, 4 byte packet number)
3861 {"",
3862 {0x43}},
3863 // connection_id
3864 {"",
3865 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3866 // packet number
3867 {"",
3868 {0x12, 0x34, 0x56, 0x78}},
3869 // frame type (rst stream frame)
3870 {"",
3871 {0x01}},
3872 // stream id
3873 {"Unable to read stream_id.",
3874 {0x01, 0x02, 0x03, 0x04}},
3875 // sent byte offset
3876 {"Unable to read rst stream sent byte offset.",
3877 {0x3A, 0x98, 0xFE, 0xDC,
3878 0x32, 0x10, 0x76, 0x54}},
3879 // error code QUIC_STREAM_CANCELLED
3880 {"Unable to read rst stream error code.",
3881 {0x00, 0x00, 0x00, 0x06}}
3882 };
3883
3884 PacketFragments packet_ietf = {
3885 // type (short header, 4 byte packet number)
3886 {"",
3887 {0x43}},
3888 // connection_id
3889 {"",
3890 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3891 // packet number
3892 {"",
3893 {0x12, 0x34, 0x56, 0x78}},
3894 // frame type (IETF_RST_STREAM frame)
3895 {"",
3896 {0x04}},
3897 // stream id
3898 {"Unable to read IETF_RST_STREAM frame stream id/count.",
3899 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
3900 // application error code H3_REQUEST_CANCELLED gets translated to
3901 // QuicRstStreamErrorCode::QUIC_STREAM_CANCELLED.
3902 {"Unable to read rst stream error code.",
3903 {kVarInt62TwoBytes + 0x01, 0x0c}},
3904 // Final Offset
3905 {"Unable to read rst stream sent byte offset.",
3906 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}}
3907 };
3908 // clang-format on
3909
3910 PacketFragments& fragments =
3911 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
3912 : packet;
3913 std::unique_ptr<QuicEncryptedPacket> encrypted(
3914 AssemblePacketFromFragments(fragments));
3915 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3916
3917 EXPECT_THAT(framer_.error(), IsQuicNoError());
3918 ASSERT_TRUE(visitor_.header_.get());
3919 EXPECT_TRUE(CheckDecryption(
3920 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3921 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3922
3923 EXPECT_EQ(kStreamId, visitor_.rst_stream_frame_.stream_id);
3924 EXPECT_EQ(QUIC_STREAM_CANCELLED, visitor_.rst_stream_frame_.error_code);
3925 EXPECT_EQ(kStreamOffset, visitor_.rst_stream_frame_.byte_offset);
3926 CheckFramingBoundaries(fragments, QUIC_INVALID_RST_STREAM_DATA);
3927 }
3928
TEST_P(QuicFramerTest,ConnectionCloseFrame)3929 TEST_P(QuicFramerTest, ConnectionCloseFrame) {
3930 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3931 // clang-format off
3932 PacketFragments packet = {
3933 // type (short header, 4 byte packet number)
3934 {"",
3935 {0x43}},
3936 // connection_id
3937 {"",
3938 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3939 // packet number
3940 {"",
3941 {0x12, 0x34, 0x56, 0x78}},
3942 // frame type (connection close frame)
3943 {"",
3944 {0x02}},
3945 // error code
3946 {"Unable to read connection close error code.",
3947 {0x00, 0x00, 0x00, 0x11}},
3948 {"Unable to read connection close error details.",
3949 {
3950 // error details length
3951 0x0, 0x0d,
3952 // error details
3953 'b', 'e', 'c', 'a',
3954 'u', 's', 'e', ' ',
3955 'I', ' ', 'c', 'a',
3956 'n'}
3957 }
3958 };
3959
3960 PacketFragments packet_ietf = {
3961 // type (short header, 4 byte packet number)
3962 {"",
3963 {0x43}},
3964 // connection_id
3965 {"",
3966 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3967 // packet number
3968 {"",
3969 {0x12, 0x34, 0x56, 0x78}},
3970 // frame type (IETF Transport CONNECTION_CLOSE frame)
3971 {"",
3972 {0x1c}},
3973 // error code
3974 {"Unable to read connection close error code.",
3975 {kVarInt62TwoBytes + 0x00, 0x11}},
3976 {"Unable to read connection close frame type.",
3977 {kVarInt62TwoBytes + 0x12, 0x34 }},
3978 {"Unable to read connection close error details.",
3979 {
3980 // error details length
3981 kVarInt62OneByte + 0x11,
3982 // error details with QuicErrorCode serialized
3983 '1', '1', '5', ':',
3984 'b', 'e', 'c', 'a',
3985 'u', 's', 'e', ' ',
3986 'I', ' ', 'c', 'a',
3987 'n'}
3988 }
3989 };
3990 // clang-format on
3991
3992 PacketFragments& fragments =
3993 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
3994 : packet;
3995 std::unique_ptr<QuicEncryptedPacket> encrypted(
3996 AssemblePacketFromFragments(fragments));
3997 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3998
3999 EXPECT_THAT(framer_.error(), IsQuicNoError());
4000 ASSERT_TRUE(visitor_.header_.get());
4001 EXPECT_TRUE(CheckDecryption(
4002 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4003 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4004
4005 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4006 EXPECT_EQ(0x11u, static_cast<unsigned>(
4007 visitor_.connection_close_frame_.wire_error_code));
4008 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4009 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4010 EXPECT_EQ(0x1234u,
4011 visitor_.connection_close_frame_.transport_close_frame_type);
4012 EXPECT_EQ(115u, visitor_.connection_close_frame_.quic_error_code);
4013 } else {
4014 // For Google QUIC frame, |quic_error_code| and |wire_error_code| has the
4015 // same value.
4016 EXPECT_EQ(0x11u, static_cast<unsigned>(
4017 visitor_.connection_close_frame_.quic_error_code));
4018 }
4019
4020 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4021
4022 CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4023 }
4024
TEST_P(QuicFramerTest,ConnectionCloseFrameWithUnknownErrorCode)4025 TEST_P(QuicFramerTest, ConnectionCloseFrameWithUnknownErrorCode) {
4026 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4027 // clang-format off
4028 PacketFragments packet = {
4029 // type (short header, 4 byte packet number)
4030 {"",
4031 {0x43}},
4032 // connection_id
4033 {"",
4034 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4035 // packet number
4036 {"",
4037 {0x12, 0x34, 0x56, 0x78}},
4038 // frame type (connection close frame)
4039 {"",
4040 {0x02}},
4041 // error code larger than QUIC_LAST_ERROR
4042 {"Unable to read connection close error code.",
4043 {0x00, 0x00, 0xC0, 0xDE}},
4044 {"Unable to read connection close error details.",
4045 {
4046 // error details length
4047 0x0, 0x0d,
4048 // error details
4049 'b', 'e', 'c', 'a',
4050 'u', 's', 'e', ' ',
4051 'I', ' ', 'c', 'a',
4052 'n'}
4053 }
4054 };
4055
4056 PacketFragments packet_ietf = {
4057 // type (short header, 4 byte packet number)
4058 {"",
4059 {0x43}},
4060 // connection_id
4061 {"",
4062 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4063 // packet number
4064 {"",
4065 {0x12, 0x34, 0x56, 0x78}},
4066 // frame type (IETF Transport CONNECTION_CLOSE frame)
4067 {"",
4068 {0x1c}},
4069 // error code
4070 {"Unable to read connection close error code.",
4071 {kVarInt62FourBytes + 0x00, 0x00, 0xC0, 0xDE}},
4072 {"Unable to read connection close frame type.",
4073 {kVarInt62TwoBytes + 0x12, 0x34 }},
4074 {"Unable to read connection close error details.",
4075 {
4076 // error details length
4077 kVarInt62OneByte + 0x11,
4078 // error details with QuicErrorCode larger than QUIC_LAST_ERROR
4079 '8', '4', '9', ':',
4080 'b', 'e', 'c', 'a',
4081 'u', 's', 'e', ' ',
4082 'I', ' ', 'c', 'a',
4083 'n'}
4084 }
4085 };
4086 // clang-format on
4087
4088 PacketFragments& fragments =
4089 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
4090 : packet;
4091 std::unique_ptr<QuicEncryptedPacket> encrypted(
4092 AssemblePacketFromFragments(fragments));
4093 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4094
4095 EXPECT_THAT(framer_.error(), IsQuicNoError());
4096 ASSERT_TRUE(visitor_.header_.get());
4097 EXPECT_TRUE(CheckDecryption(
4098 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4099 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4100
4101 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4102 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4103 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4104 EXPECT_EQ(0x1234u,
4105 visitor_.connection_close_frame_.transport_close_frame_type);
4106 EXPECT_EQ(0xC0DEu, visitor_.connection_close_frame_.wire_error_code);
4107 EXPECT_EQ(849u, visitor_.connection_close_frame_.quic_error_code);
4108 } else {
4109 // For Google QUIC frame, |quic_error_code| and |wire_error_code| has the
4110 // same value.
4111 EXPECT_EQ(0xC0DEu, visitor_.connection_close_frame_.wire_error_code);
4112 EXPECT_EQ(0xC0DEu, visitor_.connection_close_frame_.quic_error_code);
4113 }
4114
4115 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4116
4117 CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4118 }
4119
4120 // As above, but checks that for Google-QUIC, if there happens
4121 // to be an ErrorCode string at the start of the details, it is
4122 // NOT extracted/parsed/folded/spindled/and/mutilated.
TEST_P(QuicFramerTest,ConnectionCloseFrameWithExtractedInfoIgnoreGCuic)4123 TEST_P(QuicFramerTest, ConnectionCloseFrameWithExtractedInfoIgnoreGCuic) {
4124 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4125
4126 // clang-format off
4127 PacketFragments packet = {
4128 // type (short header, 4 byte packet number)
4129 {"",
4130 {0x43}},
4131 // connection_id
4132 {"",
4133 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4134 // packet number
4135 {"",
4136 {0x12, 0x34, 0x56, 0x78}},
4137 // frame type (connection close frame)
4138 {"",
4139 {0x02}},
4140 // error code
4141 {"Unable to read connection close error code.",
4142 {0x00, 0x00, 0x00, 0x11}},
4143 {"Unable to read connection close error details.",
4144 {
4145 // error details length
4146 0x0, 0x13,
4147 // error details
4148 '1', '7', '7', '6',
4149 '7', ':', 'b', 'e',
4150 'c', 'a', 'u', 's',
4151 'e', ' ', 'I', ' ',
4152 'c', 'a', 'n'}
4153 }
4154 };
4155
4156 PacketFragments packet_ietf = {
4157 // type (short header, 4 byte packet number)
4158 {"",
4159 {0x43}},
4160 // connection_id
4161 {"",
4162 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4163 // packet number
4164 {"",
4165 {0x12, 0x34, 0x56, 0x78}},
4166 // frame type (IETF Transport CONNECTION_CLOSE frame)
4167 {"",
4168 {0x1c}},
4169 // error code
4170 {"Unable to read connection close error code.",
4171 {kVarInt62OneByte + 0x11}},
4172 {"Unable to read connection close frame type.",
4173 {kVarInt62TwoBytes + 0x12, 0x34 }},
4174 {"Unable to read connection close error details.",
4175 {
4176 // error details length
4177 kVarInt62OneByte + 0x13,
4178 // error details
4179 '1', '7', '7', '6',
4180 '7', ':', 'b', 'e',
4181 'c', 'a', 'u', 's',
4182 'e', ' ', 'I', ' ',
4183 'c', 'a', 'n'}
4184 }
4185 };
4186 // clang-format on
4187
4188 PacketFragments& fragments =
4189 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
4190 : packet;
4191 std::unique_ptr<QuicEncryptedPacket> encrypted(
4192 AssemblePacketFromFragments(fragments));
4193 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4194
4195 EXPECT_THAT(framer_.error(), IsQuicNoError());
4196 ASSERT_TRUE(visitor_.header_.get());
4197 EXPECT_TRUE(CheckDecryption(
4198 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4199 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4200
4201 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4202 EXPECT_EQ(0x11u, static_cast<unsigned>(
4203 visitor_.connection_close_frame_.wire_error_code));
4204
4205 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4206 EXPECT_EQ(0x1234u,
4207 visitor_.connection_close_frame_.transport_close_frame_type);
4208 EXPECT_EQ(17767u, visitor_.connection_close_frame_.quic_error_code);
4209 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4210 } else {
4211 EXPECT_EQ(0x11u, visitor_.connection_close_frame_.quic_error_code);
4212 // Error code is not prepended in GQUIC, so it is not removed and should
4213 // remain in the reason phrase.
4214 EXPECT_EQ("17767:because I can",
4215 visitor_.connection_close_frame_.error_details);
4216 }
4217
4218 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4219
4220 CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4221 }
4222
4223 // Test the CONNECTION_CLOSE/Application variant.
TEST_P(QuicFramerTest,ApplicationCloseFrame)4224 TEST_P(QuicFramerTest, ApplicationCloseFrame) {
4225 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4226 // This frame is only in IETF QUIC.
4227 return;
4228 }
4229 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4230
4231 // clang-format off
4232 PacketFragments packet_ietf = {
4233 // type (short header, 4 byte packet number)
4234 {"",
4235 {0x43}},
4236 // connection_id
4237 {"",
4238 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4239 // packet number
4240 {"",
4241 {0x12, 0x34, 0x56, 0x78}},
4242 // frame type (IETF_CONNECTION_CLOSE/Application frame)
4243 {"",
4244 {0x1d}},
4245 // error code
4246 {"Unable to read connection close error code.",
4247 {kVarInt62TwoBytes + 0x00, 0x11}},
4248 {"Unable to read connection close error details.",
4249 {
4250 // error details length
4251 kVarInt62OneByte + 0x0d,
4252 // error details
4253 'b', 'e', 'c', 'a',
4254 'u', 's', 'e', ' ',
4255 'I', ' ', 'c', 'a',
4256 'n'}
4257 }
4258 };
4259 // clang-format on
4260
4261 std::unique_ptr<QuicEncryptedPacket> encrypted(
4262 AssemblePacketFromFragments(packet_ietf));
4263 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4264
4265 EXPECT_THAT(framer_.error(), IsQuicNoError());
4266 ASSERT_TRUE(visitor_.header_.get());
4267 EXPECT_TRUE(CheckDecryption(
4268 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4269 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4270
4271 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4272
4273 EXPECT_EQ(IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
4274 visitor_.connection_close_frame_.close_type);
4275 EXPECT_EQ(122u, visitor_.connection_close_frame_.quic_error_code);
4276 EXPECT_EQ(0x11u, visitor_.connection_close_frame_.wire_error_code);
4277 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4278
4279 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4280
4281 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4282 }
4283
4284 // Check that we can extract an error code from an application close.
TEST_P(QuicFramerTest,ApplicationCloseFrameExtract)4285 TEST_P(QuicFramerTest, ApplicationCloseFrameExtract) {
4286 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4287 // This frame is only in IETF QUIC.
4288 return;
4289 }
4290 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4291
4292 // clang-format off
4293 PacketFragments packet_ietf = {
4294 // type (short header, 4 byte packet number)
4295 {"",
4296 {0x43}},
4297 // connection_id
4298 {"",
4299 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4300 // packet number
4301 {"",
4302 {0x12, 0x34, 0x56, 0x78}},
4303 // frame type (IETF_CONNECTION_CLOSE/Application frame)
4304 {"",
4305 {0x1d}},
4306 // error code
4307 {"Unable to read connection close error code.",
4308 {kVarInt62OneByte + 0x11}},
4309 {"Unable to read connection close error details.",
4310 {
4311 // error details length
4312 kVarInt62OneByte + 0x13,
4313 // error details
4314 '1', '7', '7', '6',
4315 '7', ':', 'b', 'e',
4316 'c', 'a', 'u', 's',
4317 'e', ' ', 'I', ' ',
4318 'c', 'a', 'n'}
4319 }
4320 };
4321 // clang-format on
4322
4323 std::unique_ptr<QuicEncryptedPacket> encrypted(
4324 AssemblePacketFromFragments(packet_ietf));
4325 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4326
4327 EXPECT_THAT(framer_.error(), IsQuicNoError());
4328 ASSERT_TRUE(visitor_.header_.get());
4329 EXPECT_TRUE(CheckDecryption(
4330 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4331 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4332
4333 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4334
4335 EXPECT_EQ(IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
4336 visitor_.connection_close_frame_.close_type);
4337 EXPECT_EQ(17767u, visitor_.connection_close_frame_.quic_error_code);
4338 EXPECT_EQ(0x11u, visitor_.connection_close_frame_.wire_error_code);
4339 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4340
4341 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4342
4343 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4344 }
4345
TEST_P(QuicFramerTest,GoAwayFrame)4346 TEST_P(QuicFramerTest, GoAwayFrame) {
4347 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4348 // This frame is not in IETF QUIC.
4349 return;
4350 }
4351 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4352 // clang-format off
4353 PacketFragments packet = {
4354 // type (short header, 4 byte packet number)
4355 {"",
4356 {0x43}},
4357 // connection_id
4358 {"",
4359 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4360 // packet number
4361 {"",
4362 {0x12, 0x34, 0x56, 0x78}},
4363 // frame type (go away frame)
4364 {"",
4365 {0x03}},
4366 // error code
4367 {"Unable to read go away error code.",
4368 {0x00, 0x00, 0x00, 0x09}},
4369 // stream id
4370 {"Unable to read last good stream id.",
4371 {0x01, 0x02, 0x03, 0x04}},
4372 // stream id
4373 {"Unable to read goaway reason.",
4374 {
4375 // error details length
4376 0x0, 0x0d,
4377 // error details
4378 'b', 'e', 'c', 'a',
4379 'u', 's', 'e', ' ',
4380 'I', ' ', 'c', 'a',
4381 'n'}
4382 }
4383 };
4384 // clang-format on
4385
4386 std::unique_ptr<QuicEncryptedPacket> encrypted(
4387 AssemblePacketFromFragments(packet));
4388 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4389
4390 EXPECT_THAT(framer_.error(), IsQuicNoError());
4391 ASSERT_TRUE(visitor_.header_.get());
4392 EXPECT_TRUE(CheckDecryption(
4393 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4394 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4395
4396 EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id);
4397 EXPECT_EQ(0x9u, visitor_.goaway_frame_.error_code);
4398 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase);
4399
4400 CheckFramingBoundaries(packet, QUIC_INVALID_GOAWAY_DATA);
4401 }
4402
TEST_P(QuicFramerTest,GoAwayFrameWithUnknownErrorCode)4403 TEST_P(QuicFramerTest, GoAwayFrameWithUnknownErrorCode) {
4404 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4405 // This frame is not in IETF QUIC.
4406 return;
4407 }
4408 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4409 // clang-format off
4410 PacketFragments packet = {
4411 // type (short header, 4 byte packet number)
4412 {"",
4413 {0x43}},
4414 // connection_id
4415 {"",
4416 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4417 // packet number
4418 {"",
4419 {0x12, 0x34, 0x56, 0x78}},
4420 // frame type (go away frame)
4421 {"",
4422 {0x03}},
4423 // error code larger than QUIC_LAST_ERROR
4424 {"Unable to read go away error code.",
4425 {0x00, 0x00, 0xC0, 0xDE}},
4426 // stream id
4427 {"Unable to read last good stream id.",
4428 {0x01, 0x02, 0x03, 0x04}},
4429 // stream id
4430 {"Unable to read goaway reason.",
4431 {
4432 // error details length
4433 0x0, 0x0d,
4434 // error details
4435 'b', 'e', 'c', 'a',
4436 'u', 's', 'e', ' ',
4437 'I', ' ', 'c', 'a',
4438 'n'}
4439 }
4440 };
4441 // clang-format on
4442
4443 std::unique_ptr<QuicEncryptedPacket> encrypted(
4444 AssemblePacketFromFragments(packet));
4445 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4446
4447 EXPECT_THAT(framer_.error(), IsQuicNoError());
4448 ASSERT_TRUE(visitor_.header_.get());
4449 EXPECT_TRUE(CheckDecryption(
4450 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4451 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4452
4453 EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id);
4454 EXPECT_EQ(0xC0DE, visitor_.goaway_frame_.error_code);
4455 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase);
4456
4457 CheckFramingBoundaries(packet, QUIC_INVALID_GOAWAY_DATA);
4458 }
4459
TEST_P(QuicFramerTest,WindowUpdateFrame)4460 TEST_P(QuicFramerTest, WindowUpdateFrame) {
4461 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4462 // This frame is not in IETF QUIC, see MaxDataFrame and MaxStreamDataFrame
4463 // for IETF QUIC equivalents.
4464 return;
4465 }
4466 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4467 // clang-format off
4468 PacketFragments packet = {
4469 // type (short header, 4 byte packet number)
4470 {"",
4471 {0x43}},
4472 // connection_id
4473 {"",
4474 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4475 // packet number
4476 {"",
4477 {0x12, 0x34, 0x56, 0x78}},
4478 // frame type (window update frame)
4479 {"",
4480 {0x04}},
4481 // stream id
4482 {"Unable to read stream_id.",
4483 {0x01, 0x02, 0x03, 0x04}},
4484 // byte offset
4485 {"Unable to read window byte_offset.",
4486 {0x3A, 0x98, 0xFE, 0xDC,
4487 0x32, 0x10, 0x76, 0x54}},
4488 };
4489
4490 // clang-format on
4491
4492 std::unique_ptr<QuicEncryptedPacket> encrypted(
4493 AssemblePacketFromFragments(packet));
4494 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4495
4496 EXPECT_THAT(framer_.error(), IsQuicNoError());
4497 ASSERT_TRUE(visitor_.header_.get());
4498 EXPECT_TRUE(CheckDecryption(
4499 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4500 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4501
4502 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
4503 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
4504
4505 CheckFramingBoundaries(packet, QUIC_INVALID_WINDOW_UPDATE_DATA);
4506 }
4507
TEST_P(QuicFramerTest,MaxDataFrame)4508 TEST_P(QuicFramerTest, MaxDataFrame) {
4509 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4510 // This frame is available only in IETF QUIC.
4511 return;
4512 }
4513 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4514 // clang-format off
4515 PacketFragments packet_ietf = {
4516 // type (short header, 4 byte packet number)
4517 {"",
4518 {0x43}},
4519 // connection_id
4520 {"",
4521 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4522 // packet number
4523 {"",
4524 {0x12, 0x34, 0x56, 0x78}},
4525 // frame type (IETF_MAX_DATA frame)
4526 {"",
4527 {0x10}},
4528 // byte offset
4529 {"Can not read MAX_DATA byte-offset",
4530 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
4531 0x32, 0x10, 0x76, 0x54}},
4532 };
4533 // clang-format on
4534
4535 std::unique_ptr<QuicEncryptedPacket> encrypted(
4536 AssemblePacketFromFragments(packet_ietf));
4537 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4538
4539 EXPECT_THAT(framer_.error(), IsQuicNoError());
4540 ASSERT_TRUE(visitor_.header_.get());
4541 EXPECT_TRUE(CheckDecryption(
4542 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4543 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4544
4545 EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
4546 visitor_.window_update_frame_.stream_id);
4547 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
4548
4549 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_MAX_DATA_FRAME_DATA);
4550 }
4551
TEST_P(QuicFramerTest,MaxStreamDataFrame)4552 TEST_P(QuicFramerTest, MaxStreamDataFrame) {
4553 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4554 // This frame available only in IETF QUIC.
4555 return;
4556 }
4557 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4558 // clang-format off
4559 PacketFragments packet_ietf = {
4560 // type (short header, 4 byte packet number)
4561 {"",
4562 {0x43}},
4563 // connection_id
4564 {"",
4565 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4566 // packet number
4567 {"",
4568 {0x12, 0x34, 0x56, 0x78}},
4569 // frame type (IETF_MAX_STREAM_DATA frame)
4570 {"",
4571 {0x11}},
4572 // stream id
4573 {"Unable to read IETF_MAX_STREAM_DATA frame stream id/count.",
4574 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4575 // byte offset
4576 {"Can not read MAX_STREAM_DATA byte-count",
4577 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
4578 0x32, 0x10, 0x76, 0x54}},
4579 };
4580 // clang-format on
4581
4582 std::unique_ptr<QuicEncryptedPacket> encrypted(
4583 AssemblePacketFromFragments(packet_ietf));
4584 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4585
4586 EXPECT_THAT(framer_.error(), IsQuicNoError());
4587 ASSERT_TRUE(visitor_.header_.get());
4588 EXPECT_TRUE(CheckDecryption(
4589 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4590 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4591
4592 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
4593 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
4594
4595 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA);
4596 }
4597
TEST_P(QuicFramerTest,BlockedFrame)4598 TEST_P(QuicFramerTest, BlockedFrame) {
4599 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4600 // clang-format off
4601 PacketFragments packet = {
4602 // type (short header, 4 byte packet number)
4603 {"",
4604 {0x43}},
4605 // connection_id
4606 {"",
4607 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4608 // packet number
4609 {"",
4610 {0x12, 0x34, 0x56, 0x78}},
4611 // frame type (blocked frame)
4612 {"",
4613 {0x05}},
4614 // stream id
4615 {"Unable to read stream_id.",
4616 {0x01, 0x02, 0x03, 0x04}},
4617 };
4618
4619 PacketFragments packet_ietf = {
4620 // type (short header, 4 byte packet number)
4621 {"",
4622 {0x43}},
4623 // connection_id
4624 {"",
4625 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4626 // packet number
4627 {"",
4628 {0x12, 0x34, 0x56, 0x78}},
4629 // frame type (IETF_STREAM_BLOCKED frame)
4630 {"",
4631 {0x15}},
4632 // stream id
4633 {"Unable to read IETF_STREAM_DATA_BLOCKED frame stream id/count.",
4634 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4635 // Offset
4636 {"Can not read stream blocked offset.",
4637 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
4638 };
4639 // clang-format on
4640
4641 PacketFragments& fragments =
4642 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
4643 : packet;
4644 std::unique_ptr<QuicEncryptedPacket> encrypted(
4645 AssemblePacketFromFragments(fragments));
4646 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4647
4648 EXPECT_THAT(framer_.error(), IsQuicNoError());
4649 ASSERT_TRUE(visitor_.header_.get());
4650 EXPECT_TRUE(CheckDecryption(
4651 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4652 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4653
4654 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4655 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
4656 } else {
4657 EXPECT_EQ(0u, visitor_.blocked_frame_.offset);
4658 }
4659 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
4660
4661 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4662 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_BLOCKED_DATA);
4663 } else {
4664 CheckFramingBoundaries(fragments, QUIC_INVALID_BLOCKED_DATA);
4665 }
4666 }
4667
TEST_P(QuicFramerTest,PingFrame)4668 TEST_P(QuicFramerTest, PingFrame) {
4669 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4670 // clang-format off
4671 unsigned char packet[] = {
4672 // type (short header, 4 byte packet number)
4673 0x43,
4674 // connection_id
4675 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4676 // packet number
4677 0x12, 0x34, 0x56, 0x78,
4678
4679 // frame type
4680 0x07,
4681 };
4682
4683 unsigned char packet_ietf[] = {
4684 // type (short header, 4 byte packet number)
4685 0x43,
4686 // connection_id
4687 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4688 // packet number
4689 0x12, 0x34, 0x56, 0x78,
4690
4691 // frame type (IETF_PING frame)
4692 0x01,
4693 };
4694 // clang-format on
4695
4696 QuicEncryptedPacket encrypted(
4697 AsChars(VersionHasIetfQuicFrames(framer_.transport_version())
4698 ? packet_ietf
4699 : packet),
4700 VersionHasIetfQuicFrames(framer_.transport_version())
4701 ? ABSL_ARRAYSIZE(packet_ietf)
4702 : ABSL_ARRAYSIZE(packet),
4703 false);
4704 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4705
4706 EXPECT_THAT(framer_.error(), IsQuicNoError());
4707 ASSERT_TRUE(visitor_.header_.get());
4708 EXPECT_TRUE(CheckDecryption(
4709 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4710 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4711
4712 EXPECT_EQ(1u, visitor_.ping_frames_.size());
4713
4714 // No need to check the PING frame boundaries because it has no payload.
4715 }
4716
TEST_P(QuicFramerTest,HandshakeDoneFrame)4717 TEST_P(QuicFramerTest, HandshakeDoneFrame) {
4718 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4719 // clang-format off
4720 unsigned char packet[] = {
4721 // type (short header, 4 byte packet number)
4722 0x43,
4723 // connection_id
4724 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4725 // packet number
4726 0x12, 0x34, 0x56, 0x78,
4727
4728 // frame type (Handshake done frame)
4729 0x1e,
4730 };
4731 // clang-format on
4732
4733 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4734 return;
4735 }
4736
4737 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
4738 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4739
4740 EXPECT_THAT(framer_.error(), IsQuicNoError());
4741 ASSERT_TRUE(visitor_.header_.get());
4742 EXPECT_TRUE(CheckDecryption(
4743 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4744 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4745
4746 EXPECT_EQ(1u, visitor_.handshake_done_frames_.size());
4747 }
4748
TEST_P(QuicFramerTest,ParseAckFrequencyFrame)4749 TEST_P(QuicFramerTest, ParseAckFrequencyFrame) {
4750 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4751 // clang-format off
4752 unsigned char packet[] = {
4753 // type (short header, 4 byte packet number)
4754 0x43,
4755 // connection_id
4756 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4757 // packet number
4758 0x12, 0x34, 0x56, 0x78,
4759
4760 // ack frequency frame type (which needs two bytes as it is > 0x3F)
4761 0x40, 0xAF,
4762 // sequence_number
4763 0x11,
4764 // packet_tolerance
4765 0x02,
4766 // max_ack_delay_us = 2'5000 us
4767 0x80, 0x00, 0x61, 0xA8,
4768 // ignore_order
4769 0x01
4770 };
4771 // clang-format on
4772
4773 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4774 return;
4775 }
4776
4777 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
4778 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4779
4780 EXPECT_THAT(framer_.error(), IsQuicNoError());
4781 ASSERT_TRUE(visitor_.header_.get());
4782 EXPECT_TRUE(CheckDecryption(
4783 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4784 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4785
4786 ASSERT_EQ(1u, visitor_.ack_frequency_frames_.size());
4787 const auto& frame = visitor_.ack_frequency_frames_.front();
4788 EXPECT_EQ(17u, frame->sequence_number);
4789 EXPECT_EQ(2u, frame->packet_tolerance);
4790 EXPECT_EQ(2'5000u, frame->max_ack_delay.ToMicroseconds());
4791 EXPECT_EQ(true, frame->ignore_order);
4792 }
4793
TEST_P(QuicFramerTest,MessageFrame)4794 TEST_P(QuicFramerTest, MessageFrame) {
4795 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4796 // clang-format off
4797 PacketFragments packet = {
4798 // type (short header, 4 byte packet number)
4799 {"",
4800 {0x43}},
4801 // connection_id
4802 {"",
4803 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4804 // packet number
4805 {"",
4806 {0x12, 0x34, 0x56, 0x78}},
4807 // message frame type.
4808 {"",
4809 { 0x21 }},
4810 // message length
4811 {"Unable to read message length",
4812 {0x07}},
4813 // message data
4814 {"Unable to read message data",
4815 {'m', 'e', 's', 's', 'a', 'g', 'e'}},
4816 // message frame no length.
4817 {"",
4818 { 0x20 }},
4819 // message data
4820 {{},
4821 {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
4822 };
4823 PacketFragments packet_ietf = {
4824 // type (short header, 4 byte packet number)
4825 {"",
4826 {0x43}},
4827 // connection_id
4828 {"",
4829 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4830 // packet number
4831 {"",
4832 {0x12, 0x34, 0x56, 0x78}},
4833 // message frame type.
4834 {"",
4835 { 0x31 }},
4836 // message length
4837 {"Unable to read message length",
4838 {0x07}},
4839 // message data
4840 {"Unable to read message data",
4841 {'m', 'e', 's', 's', 'a', 'g', 'e'}},
4842 // message frame no length.
4843 {"",
4844 { 0x30 }},
4845 // message data
4846 {{},
4847 {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
4848 };
4849 // clang-format on
4850
4851 std::unique_ptr<QuicEncryptedPacket> encrypted;
4852 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4853 encrypted = AssemblePacketFromFragments(packet_ietf);
4854 } else {
4855 encrypted = AssemblePacketFromFragments(packet);
4856 }
4857 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4858
4859 EXPECT_THAT(framer_.error(), IsQuicNoError());
4860 ASSERT_TRUE(visitor_.header_.get());
4861 EXPECT_TRUE(CheckDecryption(
4862 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4863 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4864
4865 ASSERT_EQ(2u, visitor_.message_frames_.size());
4866 EXPECT_EQ(7u, visitor_.message_frames_[0]->message_length);
4867 EXPECT_EQ(8u, visitor_.message_frames_[1]->message_length);
4868
4869 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4870 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_MESSAGE_DATA);
4871 } else {
4872 CheckFramingBoundaries(packet, QUIC_INVALID_MESSAGE_DATA);
4873 }
4874 }
4875
TEST_P(QuicFramerTest,IetfStatelessResetPacket)4876 TEST_P(QuicFramerTest, IetfStatelessResetPacket) {
4877 // clang-format off
4878 unsigned char packet[] = {
4879 // type (short packet, 1 byte packet number)
4880 0x50,
4881 // Random bytes
4882 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4883 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4884 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4885 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4886 // stateless reset token
4887 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
4888 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
4889 };
4890 // clang-format on
4891 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
4892 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
4893 TestConnectionId(0x33));
4894 decrypter_ = new test::TestDecrypter();
4895 if (framer_.version().KnowsWhichDecrypterToUse()) {
4896 framer_.InstallDecrypter(
4897 ENCRYPTION_INITIAL,
4898 std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
4899 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
4900 std::unique_ptr<QuicDecrypter>(decrypter_));
4901 } else {
4902 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
4903 Perspective::IS_CLIENT));
4904 framer_.SetAlternativeDecrypter(
4905 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
4906 }
4907 // This packet cannot be decrypted because diversification nonce is missing.
4908 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
4909 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4910 ASSERT_THAT(framer_.error(), IsQuicNoError());
4911 ASSERT_TRUE(visitor_.stateless_reset_packet_.get());
4912 EXPECT_EQ(kTestStatelessResetToken,
4913 visitor_.stateless_reset_packet_->stateless_reset_token);
4914 }
4915
TEST_P(QuicFramerTest,IetfStatelessResetPacketInvalidStatelessResetToken)4916 TEST_P(QuicFramerTest, IetfStatelessResetPacketInvalidStatelessResetToken) {
4917 // clang-format off
4918 unsigned char packet[] = {
4919 // type (short packet, 1 byte packet number)
4920 0x50,
4921 // Random bytes
4922 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4923 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4924 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4925 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4926 // stateless reset token
4927 0xB6, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
4928 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4929 };
4930 // clang-format on
4931 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
4932 TestConnectionId(0x33));
4933 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
4934 decrypter_ = new test::TestDecrypter();
4935 if (framer_.version().KnowsWhichDecrypterToUse()) {
4936 framer_.InstallDecrypter(
4937 ENCRYPTION_INITIAL,
4938 std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
4939 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
4940 std::unique_ptr<QuicDecrypter>(decrypter_));
4941 } else {
4942 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
4943 Perspective::IS_CLIENT));
4944 framer_.SetAlternativeDecrypter(
4945 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
4946 }
4947 // This packet cannot be decrypted because diversification nonce is missing.
4948 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
4949 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
4950 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
4951 ASSERT_FALSE(visitor_.stateless_reset_packet_);
4952 }
4953
TEST_P(QuicFramerTest,VersionNegotiationPacketClient)4954 TEST_P(QuicFramerTest, VersionNegotiationPacketClient) {
4955 // clang-format off
4956 PacketFragments packet = {
4957 // type (long header)
4958 {"",
4959 {0x8F}},
4960 // version tag
4961 {"",
4962 {0x00, 0x00, 0x00, 0x00}},
4963 {"",
4964 {0x05}},
4965 // connection_id
4966 {"",
4967 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4968 // Supported versions
4969 {"Unable to read supported version in negotiation.",
4970 {QUIC_VERSION_BYTES,
4971 'Q', '2', '.', '0'}},
4972 };
4973
4974 PacketFragments packet49 = {
4975 // type (long header)
4976 {"",
4977 {0x8F}},
4978 // version tag
4979 {"",
4980 {0x00, 0x00, 0x00, 0x00}},
4981 {"",
4982 {0x08}},
4983 // connection_id
4984 {"",
4985 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4986 {"",
4987 {0x00}},
4988 // Supported versions
4989 {"Unable to read supported version in negotiation.",
4990 {QUIC_VERSION_BYTES,
4991 'Q', '2', '.', '0'}},
4992 };
4993 // clang-format on
4994
4995 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
4996
4997 PacketFragments& fragments =
4998 framer_.version().HasLongHeaderLengths() ? packet49 : packet;
4999 std::unique_ptr<QuicEncryptedPacket> encrypted(
5000 AssemblePacketFromFragments(fragments));
5001 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5002 ASSERT_THAT(framer_.error(), IsQuicNoError());
5003 ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
5004 EXPECT_EQ(1u, visitor_.version_negotiation_packet_->versions.size());
5005 EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]);
5006
5007 // Remove the last version from the packet so that every truncated
5008 // version of the packet is invalid, otherwise checking boundaries
5009 // is annoyingly complicated.
5010 for (size_t i = 0; i < 4; ++i) {
5011 fragments.back().fragment.pop_back();
5012 }
5013 CheckFramingBoundaries(fragments, QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
5014 }
5015
TEST_P(QuicFramerTest,VersionNegotiationPacketServer)5016 TEST_P(QuicFramerTest, VersionNegotiationPacketServer) {
5017 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
5018 // clang-format off
5019 unsigned char packet[] = {
5020 // public flags (long header with all ignored bits set)
5021 0xFF,
5022 // version
5023 0x00, 0x00, 0x00, 0x00,
5024 // connection ID lengths
5025 0x50,
5026 // destination connection ID
5027 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5028 // supported versions
5029 QUIC_VERSION_BYTES,
5030 'Q', '2', '.', '0',
5031 };
5032 unsigned char packet2[] = {
5033 // public flags (long header with all ignored bits set)
5034 0xFF,
5035 // version
5036 0x00, 0x00, 0x00, 0x00,
5037 // destination connection ID length
5038 0x08,
5039 // destination connection ID
5040 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5041 // source connection ID length
5042 0x00,
5043 // supported versions
5044 QUIC_VERSION_BYTES,
5045 'Q', '2', '.', '0',
5046 };
5047 // clang-format on
5048 unsigned char* p = packet;
5049 size_t p_length = ABSL_ARRAYSIZE(packet);
5050 if (framer_.version().HasLengthPrefixedConnectionIds()) {
5051 p = packet2;
5052 p_length = ABSL_ARRAYSIZE(packet2);
5053 }
5054
5055 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
5056 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5057 EXPECT_THAT(framer_.error(),
5058 IsError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET));
5059 EXPECT_EQ("Server received version negotiation packet.",
5060 framer_.detailed_error());
5061 EXPECT_FALSE(visitor_.version_negotiation_packet_.get());
5062 }
5063
TEST_P(QuicFramerTest,ParseIetfRetryPacket)5064 TEST_P(QuicFramerTest, ParseIetfRetryPacket) {
5065 if (!framer_.version().SupportsRetry()) {
5066 return;
5067 }
5068 // IETF RETRY is only sent from client to server.
5069 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5070 // clang-format off
5071 unsigned char packet[] = {
5072 // public flags (long header with packet type RETRY and ODCIL=8)
5073 0xF5,
5074 // version
5075 QUIC_VERSION_BYTES,
5076 // connection ID lengths
5077 0x05,
5078 // source connection ID
5079 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5080 // original destination connection ID
5081 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5082 // retry token
5083 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5084 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5085 };
5086 unsigned char packet49[] = {
5087 // public flags (long header with packet type RETRY)
5088 0xF0,
5089 // version
5090 QUIC_VERSION_BYTES,
5091 // destination connection ID length
5092 0x00,
5093 // source connection ID length
5094 0x08,
5095 // source connection ID
5096 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5097 // original destination connection ID length
5098 0x08,
5099 // original destination connection ID
5100 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5101 // retry token
5102 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5103 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5104 };
5105 unsigned char packet_with_tag[] = {
5106 // public flags (long header with packet type RETRY)
5107 0xF0,
5108 // version
5109 QUIC_VERSION_BYTES,
5110 // destination connection ID length
5111 0x00,
5112 // source connection ID length
5113 0x08,
5114 // source connection ID
5115 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5116 // retry token
5117 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5118 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5119 // retry token integrity tag
5120 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
5121 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
5122 };
5123 // clang-format on
5124
5125 unsigned char* p = packet;
5126 size_t p_length = ABSL_ARRAYSIZE(packet);
5127 if (framer_.version().UsesTls()) {
5128 ReviseFirstByteByVersion(packet_with_tag);
5129 p = packet_with_tag;
5130 p_length = ABSL_ARRAYSIZE(packet_with_tag);
5131 } else if (framer_.version().HasLongHeaderLengths()) {
5132 p = packet49;
5133 p_length = ABSL_ARRAYSIZE(packet49);
5134 }
5135 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
5136 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5137
5138 EXPECT_THAT(framer_.error(), IsQuicNoError());
5139 ASSERT_TRUE(visitor_.header_.get());
5140
5141 ASSERT_TRUE(visitor_.on_retry_packet_called_);
5142 ASSERT_TRUE(visitor_.retry_new_connection_id_.get());
5143 ASSERT_TRUE(visitor_.retry_token_.get());
5144
5145 if (framer_.version().UsesTls()) {
5146 ASSERT_TRUE(visitor_.retry_token_integrity_tag_.get());
5147 static const unsigned char expected_integrity_tag[16] = {
5148 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
5149 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
5150 };
5151 quiche::test::CompareCharArraysWithHexError(
5152 "retry integrity tag", visitor_.retry_token_integrity_tag_->data(),
5153 visitor_.retry_token_integrity_tag_->length(),
5154 reinterpret_cast<const char*>(expected_integrity_tag),
5155 ABSL_ARRAYSIZE(expected_integrity_tag));
5156 ASSERT_TRUE(visitor_.retry_without_tag_.get());
5157 quiche::test::CompareCharArraysWithHexError(
5158 "retry without tag", visitor_.retry_without_tag_->data(),
5159 visitor_.retry_without_tag_->length(),
5160 reinterpret_cast<const char*>(packet_with_tag), 35);
5161 } else {
5162 ASSERT_TRUE(visitor_.retry_original_connection_id_.get());
5163 EXPECT_EQ(FramerTestConnectionId(),
5164 *visitor_.retry_original_connection_id_.get());
5165 }
5166
5167 EXPECT_EQ(FramerTestConnectionIdPlusOne(),
5168 *visitor_.retry_new_connection_id_.get());
5169 EXPECT_EQ("Hello this is RETRY!", *visitor_.retry_token_.get());
5170
5171 // IETF RETRY is only sent from client to server, the rest of this test
5172 // ensures that the server correctly drops them without acting on them.
5173 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
5174 // Reset our visitor state to default settings.
5175 visitor_.retry_original_connection_id_.reset();
5176 visitor_.retry_new_connection_id_.reset();
5177 visitor_.retry_token_.reset();
5178 visitor_.retry_token_integrity_tag_.reset();
5179 visitor_.retry_without_tag_.reset();
5180 visitor_.on_retry_packet_called_ = false;
5181
5182 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5183
5184 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
5185 EXPECT_EQ("Client-initiated RETRY is invalid.", framer_.detailed_error());
5186
5187 EXPECT_FALSE(visitor_.on_retry_packet_called_);
5188 EXPECT_FALSE(visitor_.retry_new_connection_id_.get());
5189 EXPECT_FALSE(visitor_.retry_token_.get());
5190 EXPECT_FALSE(visitor_.retry_token_integrity_tag_.get());
5191 EXPECT_FALSE(visitor_.retry_without_tag_.get());
5192 }
5193
TEST_P(QuicFramerTest,BuildPaddingFramePacket)5194 TEST_P(QuicFramerTest, BuildPaddingFramePacket) {
5195 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5196 QuicPacketHeader header;
5197 header.destination_connection_id = FramerTestConnectionId();
5198 header.reset_flag = false;
5199 header.version_flag = false;
5200 header.packet_number = kPacketNumber;
5201
5202 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5203
5204 // clang-format off
5205 unsigned char packet[kMaxOutgoingPacketSize] = {
5206 // type (short header, 4 byte packet number)
5207 0x43,
5208 // connection_id
5209 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5210 // packet number
5211 0x12, 0x34, 0x56, 0x78,
5212
5213 // frame type (padding frame)
5214 0x00,
5215 0x00, 0x00, 0x00, 0x00
5216 };
5217
5218 unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
5219 // type (short header, 4 byte packet number)
5220 0x43,
5221 // connection_id
5222 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5223 // packet number
5224 0x12, 0x34, 0x56, 0x78,
5225
5226 // frame type (padding frame)
5227 0x00,
5228 0x00, 0x00, 0x00, 0x00
5229 };
5230 // clang-format on
5231
5232 unsigned char* p = packet;
5233 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5234 p = packet_ietf;
5235 }
5236
5237 uint64_t header_size = GetPacketHeaderSize(
5238 framer_.transport_version(), kPacket8ByteConnectionId,
5239 kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
5240 PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
5241 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
5242 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
5243
5244 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5245 ASSERT_TRUE(data != nullptr);
5246
5247 quiche::test::CompareCharArraysWithHexError(
5248 "constructed packet", data->data(), data->length(), AsChars(p),
5249 ABSL_ARRAYSIZE(packet));
5250 }
5251
TEST_P(QuicFramerTest,BuildStreamFramePacketWithNewPaddingFrame)5252 TEST_P(QuicFramerTest, BuildStreamFramePacketWithNewPaddingFrame) {
5253 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5254 QuicPacketHeader header;
5255 header.destination_connection_id = FramerTestConnectionId();
5256 header.reset_flag = false;
5257 header.version_flag = false;
5258 header.packet_number = kPacketNumber;
5259 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
5260 absl::string_view("hello world!"));
5261 QuicPaddingFrame padding_frame(2);
5262 QuicFrames frames = {QuicFrame(padding_frame), QuicFrame(stream_frame),
5263 QuicFrame(padding_frame)};
5264
5265 // clang-format off
5266 unsigned char packet[] = {
5267 // type (short header, 4 byte packet number)
5268 0x43,
5269 // connection_id
5270 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5271 // packet number
5272 0x12, 0x34, 0x56, 0x78,
5273
5274 // paddings
5275 0x00, 0x00,
5276 // frame type (stream frame with fin)
5277 0xFF,
5278 // stream id
5279 0x01, 0x02, 0x03, 0x04,
5280 // offset
5281 0x3A, 0x98, 0xFE, 0xDC,
5282 0x32, 0x10, 0x76, 0x54,
5283 // data length
5284 0x00, 0x0c,
5285 // data
5286 'h', 'e', 'l', 'l',
5287 'o', ' ', 'w', 'o',
5288 'r', 'l', 'd', '!',
5289 // paddings
5290 0x00, 0x00,
5291 };
5292
5293 unsigned char packet_ietf[] = {
5294 // type (short header, 4 byte packet number)
5295 0x43,
5296 // connection_id
5297 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5298 // packet number
5299 0x12, 0x34, 0x56, 0x78,
5300
5301 // paddings
5302 0x00, 0x00,
5303 // frame type (IETF_STREAM with FIN, LEN, and OFFSET bits set)
5304 0x08 | 0x01 | 0x02 | 0x04,
5305 // stream id
5306 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
5307 // offset
5308 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5309 0x32, 0x10, 0x76, 0x54,
5310 // data length
5311 kVarInt62OneByte + 0x0c,
5312 // data
5313 'h', 'e', 'l', 'l',
5314 'o', ' ', 'w', 'o',
5315 'r', 'l', 'd', '!',
5316 // paddings
5317 0x00, 0x00,
5318 };
5319 // clang-format on
5320
5321 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5322 ASSERT_TRUE(data != nullptr);
5323
5324 unsigned char* p = packet;
5325 size_t p_size = ABSL_ARRAYSIZE(packet);
5326 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5327 p = packet_ietf;
5328 p_size = ABSL_ARRAYSIZE(packet_ietf);
5329 }
5330 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
5331
5332 quiche::test::CompareCharArraysWithHexError(
5333 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
5334 }
5335
TEST_P(QuicFramerTest,Build4ByteSequenceNumberPaddingFramePacket)5336 TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) {
5337 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5338 QuicPacketHeader header;
5339 header.destination_connection_id = FramerTestConnectionId();
5340 header.reset_flag = false;
5341 header.version_flag = false;
5342 header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
5343 header.packet_number = kPacketNumber;
5344
5345 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5346
5347 // clang-format off
5348 unsigned char packet[kMaxOutgoingPacketSize] = {
5349 // type (short header, 4 byte packet number)
5350 0x43,
5351 // connection_id
5352 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5353 // packet number
5354 0x12, 0x34, 0x56, 0x78,
5355
5356 // frame type (padding frame)
5357 0x00,
5358 0x00, 0x00, 0x00, 0x00
5359 };
5360
5361 unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
5362 // type (short header, 4 byte packet number)
5363 0x43,
5364 // connection_id
5365 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5366 // packet number
5367 0x12, 0x34, 0x56, 0x78,
5368
5369 // frame type (padding frame)
5370 0x00,
5371 0x00, 0x00, 0x00, 0x00
5372 };
5373 // clang-format on
5374
5375 unsigned char* p = packet;
5376 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5377 p = packet_ietf;
5378 }
5379
5380 uint64_t header_size = GetPacketHeaderSize(
5381 framer_.transport_version(), kPacket8ByteConnectionId,
5382 kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
5383 PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
5384 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
5385 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
5386
5387 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5388 ASSERT_TRUE(data != nullptr);
5389
5390 quiche::test::CompareCharArraysWithHexError(
5391 "constructed packet", data->data(), data->length(), AsChars(p),
5392 ABSL_ARRAYSIZE(packet));
5393 }
5394
TEST_P(QuicFramerTest,Build2ByteSequenceNumberPaddingFramePacket)5395 TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) {
5396 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5397 QuicPacketHeader header;
5398 header.destination_connection_id = FramerTestConnectionId();
5399 header.reset_flag = false;
5400 header.version_flag = false;
5401 header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
5402 header.packet_number = kPacketNumber;
5403
5404 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5405
5406 // clang-format off
5407 unsigned char packet[kMaxOutgoingPacketSize] = {
5408 // type (short header, 2 byte packet number)
5409 0x41,
5410 // connection_id
5411 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5412 // packet number
5413 0x56, 0x78,
5414
5415 // frame type (padding frame)
5416 0x00,
5417 0x00, 0x00, 0x00, 0x00
5418 };
5419
5420 unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
5421 // type (short header, 2 byte packet number)
5422 0x41,
5423 // connection_id
5424 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5425 // packet number
5426 0x56, 0x78,
5427
5428 // frame type (padding frame)
5429 0x00,
5430 0x00, 0x00, 0x00, 0x00
5431 };
5432 // clang-format on
5433
5434 unsigned char* p = packet;
5435 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5436 p = packet_ietf;
5437 }
5438
5439 uint64_t header_size = GetPacketHeaderSize(
5440 framer_.transport_version(), kPacket8ByteConnectionId,
5441 kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
5442 PACKET_2BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
5443 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
5444 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
5445
5446 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5447 ASSERT_TRUE(data != nullptr);
5448
5449 quiche::test::CompareCharArraysWithHexError(
5450 "constructed packet", data->data(), data->length(), AsChars(p),
5451 ABSL_ARRAYSIZE(packet));
5452 }
5453
TEST_P(QuicFramerTest,Build1ByteSequenceNumberPaddingFramePacket)5454 TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) {
5455 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5456 QuicPacketHeader header;
5457 header.destination_connection_id = FramerTestConnectionId();
5458 header.reset_flag = false;
5459 header.version_flag = false;
5460 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
5461 header.packet_number = kPacketNumber;
5462
5463 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5464
5465 // clang-format off
5466 unsigned char packet[kMaxOutgoingPacketSize] = {
5467 // type (short header, 1 byte packet number)
5468 0x40,
5469 // connection_id
5470 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5471 // packet number
5472 0x78,
5473
5474 // frame type (padding frame)
5475 0x00,
5476 0x00, 0x00, 0x00, 0x00
5477 };
5478
5479 unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
5480 // type (short header, 1 byte packet number)
5481 0x40,
5482 // connection_id
5483 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5484 // packet number
5485 0x78,
5486
5487 // frame type (padding frame)
5488 0x00,
5489 0x00, 0x00, 0x00, 0x00
5490 };
5491 // clang-format on
5492
5493 unsigned char* p = packet;
5494 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5495 p = packet_ietf;
5496 }
5497
5498 uint64_t header_size = GetPacketHeaderSize(
5499 framer_.transport_version(), kPacket8ByteConnectionId,
5500 kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
5501 PACKET_1BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
5502 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
5503 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
5504
5505 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5506 ASSERT_TRUE(data != nullptr);
5507
5508 quiche::test::CompareCharArraysWithHexError(
5509 "constructed packet", data->data(), data->length(), AsChars(p),
5510 ABSL_ARRAYSIZE(packet));
5511 }
5512
TEST_P(QuicFramerTest,BuildStreamFramePacket)5513 TEST_P(QuicFramerTest, BuildStreamFramePacket) {
5514 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5515 QuicPacketHeader header;
5516 header.destination_connection_id = FramerTestConnectionId();
5517 header.reset_flag = false;
5518 header.version_flag = false;
5519 header.packet_number = kPacketNumber;
5520 if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
5521 header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
5522 }
5523
5524 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
5525 absl::string_view("hello world!"));
5526
5527 QuicFrames frames = {QuicFrame(stream_frame)};
5528
5529 // clang-format off
5530 unsigned char packet[] = {
5531 // type (short header, 4 byte packet number)
5532 0x43,
5533 // connection_id
5534 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5535 // packet number
5536 0x12, 0x34, 0x56, 0x78,
5537
5538 // frame type (stream frame with fin and no length)
5539 0xDF,
5540 // stream id
5541 0x01, 0x02, 0x03, 0x04,
5542 // offset
5543 0x3A, 0x98, 0xFE, 0xDC,
5544 0x32, 0x10, 0x76, 0x54,
5545 // data
5546 'h', 'e', 'l', 'l',
5547 'o', ' ', 'w', 'o',
5548 'r', 'l', 'd', '!',
5549 };
5550
5551 unsigned char packet_ietf[] = {
5552 // type (short header, 4 byte packet number)
5553 0x43,
5554 // connection_id
5555 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5556 // packet number
5557 0x12, 0x34, 0x56, 0x78,
5558
5559 // frame type (IETF_STREAM frame with FIN and OFFSET, no length)
5560 0x08 | 0x01 | 0x04,
5561 // stream id
5562 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
5563 // offset
5564 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5565 0x32, 0x10, 0x76, 0x54,
5566 // data
5567 'h', 'e', 'l', 'l',
5568 'o', ' ', 'w', 'o',
5569 'r', 'l', 'd', '!',
5570 };
5571 // clang-format on
5572
5573 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5574 ASSERT_TRUE(data != nullptr);
5575
5576 unsigned char* p = packet;
5577 size_t p_size = ABSL_ARRAYSIZE(packet);
5578 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5579 p = packet_ietf;
5580 p_size = ABSL_ARRAYSIZE(packet_ietf);
5581 }
5582 quiche::test::CompareCharArraysWithHexError(
5583 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
5584 }
5585
TEST_P(QuicFramerTest,BuildStreamFramePacketWithVersionFlag)5586 TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) {
5587 QuicPacketHeader header;
5588 header.destination_connection_id = FramerTestConnectionId();
5589 header.reset_flag = false;
5590 header.version_flag = true;
5591 header.long_packet_type = ZERO_RTT_PROTECTED;
5592 header.packet_number = kPacketNumber;
5593 if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
5594 header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
5595 }
5596
5597 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
5598 absl::string_view("hello world!"));
5599 QuicFrames frames = {QuicFrame(stream_frame)};
5600
5601 // clang-format off
5602 unsigned char packet[] = {
5603 // type (long header with packet type ZERO_RTT_PROTECTED)
5604 0xD3,
5605 // version tag
5606 QUIC_VERSION_BYTES,
5607 // connection_id length
5608 0x50,
5609 // connection_id
5610 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5611 // packet number
5612 0x12, 0x34, 0x56, 0x78,
5613
5614 // frame type (stream frame with fin and no length)
5615 0xDF,
5616 // stream id
5617 0x01, 0x02, 0x03, 0x04,
5618 // offset
5619 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
5620 // data
5621 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
5622 };
5623
5624 unsigned char packet49[] = {
5625 // type (long header with packet type ZERO_RTT_PROTECTED)
5626 0xD3,
5627 // version tag
5628 QUIC_VERSION_BYTES,
5629 // destination connection ID length
5630 0x08,
5631 // destination connection ID
5632 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5633 // source connection ID length
5634 0x00,
5635 // length
5636 0x40, 0x1D,
5637 // packet number
5638 0x12, 0x34, 0x56, 0x78,
5639
5640 // frame type (stream frame with fin and no length)
5641 0xDF,
5642 // stream id
5643 0x01, 0x02, 0x03, 0x04,
5644 // offset
5645 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
5646 // data
5647 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
5648 };
5649
5650 unsigned char packet_ietf[] = {
5651 // type (long header with packet type ZERO_RTT_PROTECTED)
5652 0xD3,
5653 // version tag
5654 QUIC_VERSION_BYTES,
5655 // destination connection ID length
5656 0x08,
5657 // destination connection ID
5658 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5659 // source connection ID length
5660 0x00,
5661 // length
5662 0x40, 0x1D,
5663 // packet number
5664 0x12, 0x34, 0x56, 0x78,
5665
5666 // frame type (IETF_STREAM frame with fin and offset, no length)
5667 0x08 | 0x01 | 0x04,
5668 // stream id
5669 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
5670 // offset
5671 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
5672 // data
5673 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
5674 };
5675 // clang-format on
5676
5677 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5678 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5679 ASSERT_TRUE(data != nullptr);
5680
5681 unsigned char* p = packet;
5682 size_t p_size = ABSL_ARRAYSIZE(packet);
5683 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5684 ReviseFirstByteByVersion(packet_ietf);
5685 p = packet_ietf;
5686 p_size = ABSL_ARRAYSIZE(packet_ietf);
5687 } else if (framer_.version().HasLongHeaderLengths()) {
5688 p = packet49;
5689 p_size = ABSL_ARRAYSIZE(packet49);
5690 }
5691 quiche::test::CompareCharArraysWithHexError(
5692 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
5693 }
5694
TEST_P(QuicFramerTest,BuildCryptoFramePacket)5695 TEST_P(QuicFramerTest, BuildCryptoFramePacket) {
5696 if (!QuicVersionUsesCryptoFrames(framer_.transport_version())) {
5697 return;
5698 }
5699 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5700 QuicPacketHeader header;
5701 header.destination_connection_id = FramerTestConnectionId();
5702 header.reset_flag = false;
5703 header.version_flag = false;
5704 header.packet_number = kPacketNumber;
5705
5706 SimpleDataProducer data_producer;
5707 framer_.set_data_producer(&data_producer);
5708
5709 absl::string_view crypto_frame_contents("hello world!");
5710 QuicCryptoFrame crypto_frame(ENCRYPTION_INITIAL, kStreamOffset,
5711 crypto_frame_contents.length());
5712 data_producer.SaveCryptoData(ENCRYPTION_INITIAL, kStreamOffset,
5713 crypto_frame_contents);
5714
5715 QuicFrames frames = {QuicFrame(&crypto_frame)};
5716
5717 // clang-format off
5718 unsigned char packet48[] = {
5719 // type (short header, 4 byte packet number)
5720 0x43,
5721 // connection_id
5722 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5723 // packet number
5724 0x12, 0x34, 0x56, 0x78,
5725
5726 // frame type (QuicFrameType CRYPTO_FRAME)
5727 0x08,
5728 // offset
5729 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5730 0x32, 0x10, 0x76, 0x54,
5731 // length
5732 kVarInt62OneByte + 12,
5733 // data
5734 'h', 'e', 'l', 'l',
5735 'o', ' ', 'w', 'o',
5736 'r', 'l', 'd', '!',
5737 };
5738
5739 unsigned char packet_ietf[] = {
5740 // type (short header, 4 byte packet number)
5741 0x43,
5742 // connection_id
5743 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5744 // packet number
5745 0x12, 0x34, 0x56, 0x78,
5746
5747 // frame type (IETF_CRYPTO frame)
5748 0x06,
5749 // offset
5750 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5751 0x32, 0x10, 0x76, 0x54,
5752 // length
5753 kVarInt62OneByte + 12,
5754 // data
5755 'h', 'e', 'l', 'l',
5756 'o', ' ', 'w', 'o',
5757 'r', 'l', 'd', '!',
5758 };
5759 // clang-format on
5760
5761 unsigned char* packet = packet48;
5762 size_t packet_size = ABSL_ARRAYSIZE(packet48);
5763 if (framer_.version().HasIetfQuicFrames()) {
5764 packet = packet_ietf;
5765 packet_size = ABSL_ARRAYSIZE(packet_ietf);
5766 }
5767
5768 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5769 ASSERT_TRUE(data != nullptr);
5770 quiche::test::CompareCharArraysWithHexError("constructed packet",
5771 data->data(), data->length(),
5772 AsChars(packet), packet_size);
5773 }
5774
TEST_P(QuicFramerTest,CryptoFrame)5775 TEST_P(QuicFramerTest, CryptoFrame) {
5776 if (!QuicVersionUsesCryptoFrames(framer_.transport_version())) {
5777 // CRYPTO frames aren't supported prior to v48.
5778 return;
5779 }
5780 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
5781
5782 // clang-format off
5783 PacketFragments packet48 = {
5784 // type (short header, 4 byte packet number)
5785 {"",
5786 {0x43}},
5787 // connection_id
5788 {"",
5789 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5790 // packet number
5791 {"",
5792 {0x12, 0x34, 0x56, 0x78}},
5793 // frame type (QuicFrameType CRYPTO_FRAME)
5794 {"",
5795 {0x08}},
5796 // offset
5797 {"",
5798 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5799 0x32, 0x10, 0x76, 0x54}},
5800 // data length
5801 {"Invalid data length.",
5802 {kVarInt62OneByte + 12}},
5803 // data
5804 {"Unable to read frame data.",
5805 {'h', 'e', 'l', 'l',
5806 'o', ' ', 'w', 'o',
5807 'r', 'l', 'd', '!'}},
5808 };
5809
5810 PacketFragments packet_ietf = {
5811 // type (short header, 4 byte packet number)
5812 {"",
5813 {0x43}},
5814 // connection_id
5815 {"",
5816 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5817 // packet number
5818 {"",
5819 {0x12, 0x34, 0x56, 0x78}},
5820 // frame type (IETF_CRYPTO frame)
5821 {"",
5822 {0x06}},
5823 // offset
5824 {"",
5825 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5826 0x32, 0x10, 0x76, 0x54}},
5827 // data length
5828 {"Invalid data length.",
5829 {kVarInt62OneByte + 12}},
5830 // data
5831 {"Unable to read frame data.",
5832 {'h', 'e', 'l', 'l',
5833 'o', ' ', 'w', 'o',
5834 'r', 'l', 'd', '!'}},
5835 };
5836 // clang-format on
5837
5838 PacketFragments& fragments =
5839 framer_.version().HasIetfQuicFrames() ? packet_ietf : packet48;
5840 std::unique_ptr<QuicEncryptedPacket> encrypted(
5841 AssemblePacketFromFragments(fragments));
5842 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5843
5844 EXPECT_THAT(framer_.error(), IsQuicNoError());
5845 ASSERT_TRUE(visitor_.header_.get());
5846 EXPECT_TRUE(CheckDecryption(
5847 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5848 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
5849 ASSERT_EQ(1u, visitor_.crypto_frames_.size());
5850 QuicCryptoFrame* frame = visitor_.crypto_frames_[0].get();
5851 EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, frame->level);
5852 EXPECT_EQ(kStreamOffset, frame->offset);
5853 EXPECT_EQ("hello world!",
5854 std::string(frame->data_buffer, frame->data_length));
5855
5856 CheckFramingBoundaries(fragments, QUIC_INVALID_FRAME_DATA);
5857 }
5858
TEST_P(QuicFramerTest,BuildOldVersionNegotiationPacket)5859 TEST_P(QuicFramerTest, BuildOldVersionNegotiationPacket) {
5860 SetQuicFlag(quic_disable_version_negotiation_grease_randomness, true);
5861 // clang-format off
5862 unsigned char packet[] = {
5863 // public flags (version, 8 byte connection_id)
5864 0x0D,
5865 // connection_id
5866 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5867 // supported versions
5868 0xDA, 0x5A, 0x3A, 0x3A,
5869 QUIC_VERSION_BYTES,
5870 };
5871 QuicConnectionId connection_id = FramerTestConnectionId();
5872 std::unique_ptr<QuicEncryptedPacket> data(
5873 QuicFramer::BuildVersionNegotiationPacket(
5874 connection_id, EmptyQuicConnectionId(), /*ietf_quic=*/false,
5875 /*use_length_prefix=*/false,
5876 SupportedVersions(GetParam())));
5877 quiche::test::CompareCharArraysWithHexError(
5878 "constructed packet", data->data(), data->length(), AsChars(packet),
5879 ABSL_ARRAYSIZE(packet));
5880 }
5881
TEST_P(QuicFramerTest,BuildVersionNegotiationPacket)5882 TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) {
5883 SetQuicFlag(quic_disable_version_negotiation_grease_randomness, true);
5884 // clang-format off
5885 unsigned char packet[] = {
5886 // type (long header)
5887 0xC0,
5888 // version tag
5889 0x00, 0x00, 0x00, 0x00,
5890 // connection_id length
5891 0x05,
5892 // connection_id
5893 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5894 // supported versions
5895 0xDA, 0x5A, 0x3A, 0x3A,
5896 QUIC_VERSION_BYTES,
5897 };
5898 unsigned char packet49[] = {
5899 // type (long header)
5900 0xC0,
5901 // version tag
5902 0x00, 0x00, 0x00, 0x00,
5903 // destination connection ID length
5904 0x00,
5905 // source connection ID length
5906 0x08,
5907 // source connection ID
5908 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5909 // supported versions
5910 0xDA, 0x5A, 0x3A, 0x3A,
5911 QUIC_VERSION_BYTES,
5912 };
5913 // clang-format on
5914 unsigned char* p = packet;
5915 size_t p_size = ABSL_ARRAYSIZE(packet);
5916 if (framer_.version().HasLongHeaderLengths()) {
5917 p = packet49;
5918 p_size = ABSL_ARRAYSIZE(packet49);
5919 }
5920
5921 QuicConnectionId connection_id = FramerTestConnectionId();
5922 std::unique_ptr<QuicEncryptedPacket> data(
5923 QuicFramer::BuildVersionNegotiationPacket(
5924 connection_id, EmptyQuicConnectionId(), /*ietf_quic=*/true,
5925 framer_.version().HasLengthPrefixedConnectionIds(),
5926 SupportedVersions(GetParam())));
5927 quiche::test::CompareCharArraysWithHexError(
5928 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
5929 }
5930
TEST_P(QuicFramerTest,BuildVersionNegotiationPacketWithClientConnectionId)5931 TEST_P(QuicFramerTest, BuildVersionNegotiationPacketWithClientConnectionId) {
5932 if (!framer_.version().SupportsClientConnectionIds()) {
5933 return;
5934 }
5935
5936 SetQuicFlag(quic_disable_version_negotiation_grease_randomness, true);
5937
5938 // clang-format off
5939 unsigned char packet[] = {
5940 // type (long header)
5941 0xC0,
5942 // version tag
5943 0x00, 0x00, 0x00, 0x00,
5944 // client/destination connection ID
5945 0x08,
5946 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5947 // server/source connection ID
5948 0x08,
5949 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5950 // supported versions
5951 0xDA, 0x5A, 0x3A, 0x3A,
5952 QUIC_VERSION_BYTES,
5953 };
5954 // clang-format on
5955
5956 QuicConnectionId server_connection_id = FramerTestConnectionId();
5957 QuicConnectionId client_connection_id = FramerTestConnectionIdPlusOne();
5958 std::unique_ptr<QuicEncryptedPacket> data(
5959 QuicFramer::BuildVersionNegotiationPacket(
5960 server_connection_id, client_connection_id, true, true,
5961 SupportedVersions(GetParam())));
5962 quiche::test::CompareCharArraysWithHexError(
5963 "constructed packet", data->data(), data->length(), AsChars(packet),
5964 ABSL_ARRAYSIZE(packet));
5965 }
5966
TEST_P(QuicFramerTest,BuildAckFramePacketOneAckBlock)5967 TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlock) {
5968 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5969 QuicPacketHeader header;
5970 header.destination_connection_id = FramerTestConnectionId();
5971 header.reset_flag = false;
5972 header.version_flag = false;
5973 header.packet_number = kPacketNumber;
5974
5975 // Use kSmallLargestObserved to make this test finished in a short time.
5976 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
5977 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
5978
5979 QuicFrames frames = {QuicFrame(&ack_frame)};
5980
5981 // clang-format off
5982 unsigned char packet[] = {
5983 // type (short header, 4 byte packet number)
5984 0x43,
5985 // connection_id
5986 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5987 // packet number
5988 0x12, 0x34, 0x56, 0x78,
5989
5990 // frame type (ack frame)
5991 // (no ack blocks, 2 byte largest observed, 2 byte block length)
5992 0x45,
5993 // largest acked
5994 0x12, 0x34,
5995 // Zero delta time.
5996 0x00, 0x00,
5997 // first ack block length.
5998 0x12, 0x34,
5999 // num timestamps.
6000 0x00,
6001 };
6002
6003 unsigned char packet_ietf[] = {
6004 // type (short header, 4 byte packet number)
6005 0x43,
6006 // connection_id
6007 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6008 // packet number
6009 0x12, 0x34, 0x56, 0x78,
6010
6011 // frame type (IETF_ACK frame)
6012 0x02,
6013 // largest acked
6014 kVarInt62TwoBytes + 0x12, 0x34,
6015 // Zero delta time.
6016 kVarInt62OneByte + 0x00,
6017 // Number of additional ack blocks.
6018 kVarInt62OneByte + 0x00,
6019 // first ack block length.
6020 kVarInt62TwoBytes + 0x12, 0x33,
6021 };
6022 // clang-format on
6023 unsigned char* p = packet;
6024 size_t p_size = ABSL_ARRAYSIZE(packet);
6025 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
6026 p = packet_ietf;
6027 p_size = ABSL_ARRAYSIZE(packet_ietf);
6028 }
6029
6030 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6031 ASSERT_TRUE(data != nullptr);
6032 quiche::test::CompareCharArraysWithHexError(
6033 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
6034 }
6035
TEST_P(QuicFramerTest,BuildAckReceiveTimestampsFrameMultipleRanges)6036 TEST_P(QuicFramerTest, BuildAckReceiveTimestampsFrameMultipleRanges) {
6037 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6038 return;
6039 }
6040
6041 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6042 QuicPacketHeader header;
6043 header.destination_connection_id = FramerTestConnectionId();
6044 header.reset_flag = false;
6045 header.version_flag = false;
6046 header.packet_number = kPacketNumber;
6047
6048 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6049 ack_frame.received_packet_times = PacketTimeVector{
6050 // Timestamp Range 3.
6051 {kSmallLargestObserved - 22, CreationTimePlus(0x29ffdddd)},
6052 {kSmallLargestObserved - 21, CreationTimePlus(0x29ffdedd)},
6053 // Timestamp Range 2.
6054 {kSmallLargestObserved - 11, CreationTimePlus(0x29ffdeed)},
6055 // Timestamp Range 1.
6056 {kSmallLargestObserved - 4, CreationTimePlus(0x29ffeeed)},
6057 {kSmallLargestObserved - 3, CreationTimePlus(0x29ffeeee)},
6058 {kSmallLargestObserved - 2, CreationTimePlus(0x29ffffff)},
6059 };
6060 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6061 QuicFrames frames = {QuicFrame(&ack_frame)};
6062
6063 unsigned char packet_ietf[] = {
6064 // type (short header, 4 byte packet number)
6065 0x43,
6066 // connection_id
6067 0xFE,
6068 0xDC,
6069 0xBA,
6070 0x98,
6071 0x76,
6072 0x54,
6073 0x32,
6074 0x10,
6075 // packet number
6076 0x12,
6077 0x34,
6078 0x56,
6079 0x78,
6080
6081 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
6082 0x22,
6083 // largest acked
6084 kVarInt62TwoBytes + 0x12,
6085 0x34, // = 4660
6086 // Zero delta time.
6087 kVarInt62OneByte + 0x00,
6088 // number of additional ack blocks
6089 kVarInt62OneByte + 0x00,
6090 // first ack block length.
6091 kVarInt62TwoBytes + 0x12,
6092 0x33,
6093
6094 // Receive Timestamps.
6095
6096 // Timestamp Range Count
6097 kVarInt62OneByte + 0x03,
6098
6099 // Timestamp range 1 (three packets).
6100 // Gap
6101 kVarInt62OneByte + 0x02,
6102 // Timestamp Range Count
6103 kVarInt62OneByte + 0x03,
6104 // Timestamp Delta
6105 kVarInt62FourBytes + 0x29,
6106 0xff,
6107 0xff,
6108 0xff,
6109 // Timestamp Delta
6110 kVarInt62TwoBytes + 0x11,
6111 0x11,
6112 // Timestamp Delta
6113 kVarInt62OneByte + 0x01,
6114
6115 // Timestamp range 2 (one packet).
6116 // Gap
6117 kVarInt62OneByte + 0x05,
6118 // Timestamp Range Count
6119 kVarInt62OneByte + 0x01,
6120 // Timestamp Delta
6121 kVarInt62TwoBytes + 0x10,
6122 0x00,
6123
6124 // Timestamp range 3 (two packets).
6125 // Gap
6126 kVarInt62OneByte + 0x08,
6127 // Timestamp Range Count
6128 kVarInt62OneByte + 0x02,
6129 // Timestamp Delta
6130 kVarInt62OneByte + 0x10,
6131 // Timestamp Delta
6132 kVarInt62TwoBytes + 0x01,
6133 0x00,
6134 };
6135 // clang-format on
6136
6137 framer_.set_process_timestamps(true);
6138 framer_.set_max_receive_timestamps_per_ack(8);
6139 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6140 ASSERT_TRUE(data != nullptr);
6141 quiche::test::CompareCharArraysWithHexError(
6142 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
6143 ABSL_ARRAYSIZE(packet_ietf));
6144 }
6145
TEST_P(QuicFramerTest,BuildAckReceiveTimestampsFrameExceedsMaxTimestamps)6146 TEST_P(QuicFramerTest, BuildAckReceiveTimestampsFrameExceedsMaxTimestamps) {
6147 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6148 return;
6149 }
6150
6151 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6152 QuicPacketHeader header;
6153 header.destination_connection_id = FramerTestConnectionId();
6154 header.reset_flag = false;
6155 header.version_flag = false;
6156 header.packet_number = kPacketNumber;
6157
6158 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6159 ack_frame.received_packet_times = PacketTimeVector{
6160 // Timestamp Range 3 (not included because max receive timestamps = 4).
6161 {kSmallLargestObserved - 20, CreationTimePlus(0x29ffdddd)},
6162 // Timestamp Range 2.
6163 {kSmallLargestObserved - 10, CreationTimePlus(0x29ffdedd)},
6164 {kSmallLargestObserved - 9, CreationTimePlus(0x29ffdeed)},
6165 // Timestamp Range 1.
6166 {kSmallLargestObserved - 2, CreationTimePlus(0x29ffeeed)},
6167 {kSmallLargestObserved - 1, CreationTimePlus(0x29ffeeee)},
6168 {kSmallLargestObserved, CreationTimePlus(0x29ffffff)},
6169 };
6170 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6171 QuicFrames frames = {QuicFrame(&ack_frame)};
6172
6173 unsigned char packet_ietf[] = {
6174 // type (short header, 4 byte packet number)
6175 0x43,
6176 // connection_id
6177 0xFE,
6178 0xDC,
6179 0xBA,
6180 0x98,
6181 0x76,
6182 0x54,
6183 0x32,
6184 0x10,
6185 // packet number
6186 0x12,
6187 0x34,
6188 0x56,
6189 0x78,
6190
6191 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
6192 0x22,
6193 // largest acked
6194 kVarInt62TwoBytes + 0x12,
6195 0x34, // = 4660
6196 // Zero delta time.
6197 kVarInt62OneByte + 0x00,
6198 // number of additional ack blocks
6199 kVarInt62OneByte + 0x00,
6200 // first ack block length.
6201 kVarInt62TwoBytes + 0x12,
6202 0x33,
6203
6204 // Receive Timestamps.
6205
6206 // Timestamp Range Count
6207 kVarInt62OneByte + 0x02,
6208
6209 // Timestamp range 1 (three packets).
6210 // Gap
6211 kVarInt62OneByte + 0x00,
6212 // Timestamp Range Count
6213 kVarInt62OneByte + 0x03,
6214 // Timestamp Delta
6215 kVarInt62FourBytes + 0x29,
6216 0xff,
6217 0xff,
6218 0xff,
6219 // Timestamp Delta
6220 kVarInt62TwoBytes + 0x11,
6221 0x11,
6222 // Timestamp Delta
6223 kVarInt62OneByte + 0x01,
6224
6225 // Timestamp range 2 (one packet).
6226 // Gap
6227 kVarInt62OneByte + 0x05,
6228 // Timestamp Range Count
6229 kVarInt62OneByte + 0x01,
6230 // Timestamp Delta
6231 kVarInt62TwoBytes + 0x10,
6232 0x00,
6233 };
6234 // clang-format on
6235
6236 framer_.set_process_timestamps(true);
6237 framer_.set_max_receive_timestamps_per_ack(4);
6238 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6239 ASSERT_TRUE(data != nullptr);
6240 quiche::test::CompareCharArraysWithHexError(
6241 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
6242 ABSL_ARRAYSIZE(packet_ietf));
6243 }
6244
TEST_P(QuicFramerTest,BuildAckReceiveTimestampsFrameWithExponentEncoding)6245 TEST_P(QuicFramerTest, BuildAckReceiveTimestampsFrameWithExponentEncoding) {
6246 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6247 return;
6248 }
6249
6250 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6251 QuicPacketHeader header;
6252 header.destination_connection_id = FramerTestConnectionId();
6253 header.reset_flag = false;
6254 header.version_flag = false;
6255 header.packet_number = kPacketNumber;
6256
6257 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6258 ack_frame.received_packet_times = PacketTimeVector{
6259 // Timestamp Range 2.
6260 {kSmallLargestObserved - 12, CreationTimePlus((0x06c00 << 3) + 0x03)},
6261 {kSmallLargestObserved - 11, CreationTimePlus((0x28e00 << 3) + 0x00)},
6262 // Timestamp Range 1.
6263 {kSmallLargestObserved - 5, CreationTimePlus((0x29f00 << 3) + 0x00)},
6264 {kSmallLargestObserved - 4, CreationTimePlus((0x29f00 << 3) + 0x01)},
6265 {kSmallLargestObserved - 3, CreationTimePlus((0x29f00 << 3) + 0x02)},
6266 {kSmallLargestObserved - 2, CreationTimePlus((0x29f00 << 3) + 0x03)},
6267 };
6268 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6269
6270 QuicFrames frames = {QuicFrame(&ack_frame)};
6271
6272 unsigned char packet_ietf[] = {
6273 // type (short header, 4 byte packet number)
6274 0x43,
6275 // connection_id
6276 0xFE,
6277 0xDC,
6278 0xBA,
6279 0x98,
6280 0x76,
6281 0x54,
6282 0x32,
6283 0x10,
6284 // packet number
6285 0x12,
6286 0x34,
6287 0x56,
6288 0x78,
6289
6290 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
6291 0x22,
6292 // largest acked
6293 kVarInt62TwoBytes + 0x12,
6294 0x34, // = 4660
6295 // Zero delta time.
6296 kVarInt62OneByte + 0x00,
6297 // number of additional ack blocks
6298 kVarInt62OneByte + 0x00,
6299 // first ack block length.
6300 kVarInt62TwoBytes + 0x12,
6301 0x33,
6302
6303 // Receive Timestamps.
6304
6305 // Timestamp Range Count
6306 kVarInt62OneByte + 0x02,
6307
6308 // Timestamp range 1 (three packets).
6309 // Gap
6310 kVarInt62OneByte + 0x02,
6311 // Timestamp Range Count
6312 kVarInt62OneByte + 0x04,
6313 // Timestamp Delta
6314 kVarInt62FourBytes + 0x00,
6315 0x02,
6316 0x9f,
6317 0x01, // round up
6318 // Timestamp Delta
6319 kVarInt62OneByte + 0x00,
6320 // Timestamp Delta
6321 kVarInt62OneByte + 0x00,
6322 // Timestamp Delta
6323 kVarInt62OneByte + 0x01,
6324
6325 // Timestamp range 2 (one packet).
6326 // Gap
6327 kVarInt62OneByte + 0x04,
6328 // Timestamp Range Count
6329 kVarInt62OneByte + 0x02,
6330 // Timestamp Delta
6331 kVarInt62TwoBytes + 0x11,
6332 0x00,
6333 // Timestamp Delta
6334 kVarInt62FourBytes + 0x00,
6335 0x02,
6336 0x21,
6337 0xff,
6338 };
6339 // clang-format on
6340
6341 framer_.set_process_timestamps(true);
6342 framer_.set_max_receive_timestamps_per_ack(8);
6343 framer_.set_receive_timestamps_exponent(3);
6344 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6345 ASSERT_TRUE(data != nullptr);
6346 quiche::test::CompareCharArraysWithHexError(
6347 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
6348 ABSL_ARRAYSIZE(packet_ietf));
6349 }
6350
TEST_P(QuicFramerTest,BuildAndProcessAckReceiveTimestampsWithMultipleRanges)6351 TEST_P(QuicFramerTest, BuildAndProcessAckReceiveTimestampsWithMultipleRanges) {
6352 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6353 return;
6354 }
6355 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6356 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6357 framer_.SetKeyUpdateSupportForConnection(true);
6358 framer_.set_process_timestamps(true);
6359 framer_.set_max_receive_timestamps_per_ack(8);
6360
6361 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6362 QuicPacketHeader header;
6363 header.destination_connection_id = FramerTestConnectionId();
6364 header.reset_flag = false;
6365 header.version_flag = false;
6366 header.packet_number = kPacketNumber;
6367
6368 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6369 ack_frame.received_packet_times = PacketTimeVector{
6370 {kSmallLargestObserved - 1201, CreationTimePlus(0x8bcaef234)},
6371 {kSmallLargestObserved - 1200, CreationTimePlus(0x8bcdef123)},
6372 {kSmallLargestObserved - 1000, CreationTimePlus(0xaacdef123)},
6373 {kSmallLargestObserved - 4, CreationTimePlus(0xabcdea125)},
6374 {kSmallLargestObserved - 2, CreationTimePlus(0xabcdee124)},
6375 {kSmallLargestObserved - 1, CreationTimePlus(0xabcdef123)},
6376 {kSmallLargestObserved, CreationTimePlus(0xabcdef123)},
6377 };
6378 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6379 QuicFrames frames = {QuicFrame(&ack_frame)};
6380
6381 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6382 ASSERT_TRUE(data != nullptr);
6383 std::unique_ptr<QuicEncryptedPacket> encrypted(
6384 EncryptPacketWithTagAndPhase(*data, 0, false));
6385 ASSERT_TRUE(encrypted);
6386 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6387 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6388 EXPECT_THAT(framer_.error(), IsQuicNoError());
6389
6390 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6391 EXPECT_THAT(frame.received_packet_times,
6392 ContainerEq(PacketTimeVector{
6393 {kSmallLargestObserved, CreationTimePlus(0xabcdef123)},
6394 {kSmallLargestObserved - 1, CreationTimePlus(0xabcdef123)},
6395 {kSmallLargestObserved - 2, CreationTimePlus(0xabcdee124)},
6396 {kSmallLargestObserved - 4, CreationTimePlus(0xabcdea125)},
6397 {kSmallLargestObserved - 1000, CreationTimePlus(0xaacdef123)},
6398 {kSmallLargestObserved - 1200, CreationTimePlus(0x8bcdef123)},
6399 {kSmallLargestObserved - 1201, CreationTimePlus(0x8bcaef234)},
6400 }));
6401 }
6402
TEST_P(QuicFramerTest,BuildAndProcessAckReceiveTimestampsExceedsMaxTimestamps)6403 TEST_P(QuicFramerTest,
6404 BuildAndProcessAckReceiveTimestampsExceedsMaxTimestamps) {
6405 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6406 return;
6407 }
6408 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6409 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6410 framer_.SetKeyUpdateSupportForConnection(true);
6411 framer_.set_process_timestamps(true);
6412 framer_.set_max_receive_timestamps_per_ack(2);
6413
6414 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6415 QuicPacketHeader header;
6416 header.destination_connection_id = FramerTestConnectionId();
6417 header.reset_flag = false;
6418 header.version_flag = false;
6419 header.packet_number = kPacketNumber;
6420
6421 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6422 ack_frame.received_packet_times = PacketTimeVector{
6423 {kSmallLargestObserved - 1201, CreationTimePlus(0x8bcaef234)},
6424 {kSmallLargestObserved - 1200, CreationTimePlus(0x8bcdef123)},
6425 {kSmallLargestObserved - 1000, CreationTimePlus(0xaacdef123)},
6426 {kSmallLargestObserved - 5, CreationTimePlus(0xabcdea125)},
6427 {kSmallLargestObserved - 3, CreationTimePlus(0xabcded124)},
6428 {kSmallLargestObserved - 2, CreationTimePlus(0xabcdee124)},
6429 {kSmallLargestObserved - 1, CreationTimePlus(0xabcdef123)},
6430 };
6431 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6432 QuicFrames frames = {QuicFrame(&ack_frame)};
6433
6434 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6435 ASSERT_TRUE(data != nullptr);
6436 std::unique_ptr<QuicEncryptedPacket> encrypted(
6437 EncryptPacketWithTagAndPhase(*data, 0, false));
6438 ASSERT_TRUE(encrypted);
6439 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6440 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6441 EXPECT_THAT(framer_.error(), IsQuicNoError());
6442
6443 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6444 EXPECT_THAT(frame.received_packet_times,
6445 ContainerEq(PacketTimeVector{
6446 {kSmallLargestObserved - 1, CreationTimePlus(0xabcdef123)},
6447 {kSmallLargestObserved - 2, CreationTimePlus(0xabcdee124)},
6448 }));
6449 }
6450
TEST_P(QuicFramerTest,BuildAndProcessAckReceiveTimestampsWithExponentNoTruncation)6451 TEST_P(QuicFramerTest,
6452 BuildAndProcessAckReceiveTimestampsWithExponentNoTruncation) {
6453 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6454 return;
6455 }
6456 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6457 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6458 framer_.SetKeyUpdateSupportForConnection(true);
6459 framer_.set_process_timestamps(true);
6460 framer_.set_max_receive_timestamps_per_ack(8);
6461 framer_.set_receive_timestamps_exponent(3);
6462
6463 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6464 QuicPacketHeader header;
6465 header.destination_connection_id = FramerTestConnectionId();
6466 header.reset_flag = false;
6467 header.version_flag = false;
6468 header.packet_number = kPacketNumber;
6469
6470 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6471 ack_frame.received_packet_times = PacketTimeVector{
6472 {kSmallLargestObserved - 8, CreationTimePlus(0x1add << 3)},
6473 {kSmallLargestObserved - 7, CreationTimePlus(0x29ed << 3)},
6474 {kSmallLargestObserved - 3, CreationTimePlus(0x29fe << 3)},
6475 {kSmallLargestObserved - 2, CreationTimePlus(0x29ff << 3)},
6476 };
6477 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6478 QuicFrames frames = {QuicFrame(&ack_frame)};
6479
6480 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6481 ASSERT_TRUE(data != nullptr);
6482 std::unique_ptr<QuicEncryptedPacket> encrypted(
6483 EncryptPacketWithTagAndPhase(*data, 0, false));
6484 ASSERT_TRUE(encrypted);
6485 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6486 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6487 EXPECT_THAT(framer_.error(), IsQuicNoError());
6488
6489 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6490 EXPECT_THAT(frame.received_packet_times,
6491 ContainerEq(PacketTimeVector{
6492 {kSmallLargestObserved - 2, CreationTimePlus(0x29ff << 3)},
6493 {kSmallLargestObserved - 3, CreationTimePlus(0x29fe << 3)},
6494 {kSmallLargestObserved - 7, CreationTimePlus(0x29ed << 3)},
6495 {kSmallLargestObserved - 8, CreationTimePlus(0x1add << 3)},
6496 }));
6497 }
6498
TEST_P(QuicFramerTest,BuildAndProcessAckReceiveTimestampsWithExponentTruncation)6499 TEST_P(QuicFramerTest,
6500 BuildAndProcessAckReceiveTimestampsWithExponentTruncation) {
6501 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6502 return;
6503 }
6504 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6505 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6506 framer_.SetKeyUpdateSupportForConnection(true);
6507 framer_.set_process_timestamps(true);
6508 framer_.set_max_receive_timestamps_per_ack(8);
6509 framer_.set_receive_timestamps_exponent(3);
6510
6511 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6512 QuicPacketHeader header;
6513 header.destination_connection_id = FramerTestConnectionId();
6514 header.reset_flag = false;
6515 header.version_flag = false;
6516 header.packet_number = kPacketNumber;
6517
6518 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6519 ack_frame.received_packet_times = PacketTimeVector{
6520 {kSmallLargestObserved - 10, CreationTimePlus((0x1001 << 3) + 1)},
6521 {kSmallLargestObserved - 9, CreationTimePlus((0x2995 << 3) - 1)},
6522 {kSmallLargestObserved - 8, CreationTimePlus((0x2995 << 3) + 0)},
6523 {kSmallLargestObserved - 7, CreationTimePlus((0x2995 << 3) + 1)},
6524 {kSmallLargestObserved - 6, CreationTimePlus((0x2995 << 3) + 2)},
6525 {kSmallLargestObserved - 3, CreationTimePlus((0x2995 << 3) + 3)},
6526 {kSmallLargestObserved - 2, CreationTimePlus((0x2995 << 3) + 4)},
6527 };
6528 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6529 QuicFrames frames = {QuicFrame(&ack_frame)};
6530
6531 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6532 ASSERT_TRUE(data != nullptr);
6533 std::unique_ptr<QuicEncryptedPacket> encrypted(
6534 EncryptPacketWithTagAndPhase(*data, 0, false));
6535 ASSERT_TRUE(encrypted);
6536 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6537 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6538 EXPECT_THAT(framer_.error(), IsQuicNoError());
6539
6540 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6541 EXPECT_THAT(frame.received_packet_times,
6542 ContainerEq(PacketTimeVector{
6543 {kSmallLargestObserved - 2, CreationTimePlus(0x2996 << 3)},
6544 {kSmallLargestObserved - 3, CreationTimePlus(0x2996 << 3)},
6545 {kSmallLargestObserved - 6, CreationTimePlus(0x2996 << 3)},
6546 {kSmallLargestObserved - 7, CreationTimePlus(0x2996 << 3)},
6547 {kSmallLargestObserved - 8, CreationTimePlus(0x2995 << 3)},
6548 {kSmallLargestObserved - 9, CreationTimePlus(0x2995 << 3)},
6549 {kSmallLargestObserved - 10, CreationTimePlus(0x1002 << 3)},
6550 }));
6551 }
6552
TEST_P(QuicFramerTest,AckReceiveTimestamps)6553 TEST_P(QuicFramerTest, AckReceiveTimestamps) {
6554 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6555 return;
6556 }
6557 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6558 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6559 framer_.SetKeyUpdateSupportForConnection(true);
6560 framer_.set_process_timestamps(true);
6561 framer_.set_max_receive_timestamps_per_ack(8);
6562 framer_.set_receive_timestamps_exponent(3);
6563
6564 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6565 QuicPacketHeader header;
6566 header.destination_connection_id = FramerTestConnectionId();
6567 header.reset_flag = false;
6568 header.version_flag = false;
6569 header.packet_number = kPacketNumber;
6570
6571 // Use kSmallLargestObserved to make this test finished in a short time.
6572 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6573 ack_frame.received_packet_times = PacketTimeVector{
6574 {kSmallLargestObserved - 5, CreationTimePlus((0x29ff << 3))},
6575 {kSmallLargestObserved - 4, CreationTimePlus((0x29ff << 3))},
6576 {kSmallLargestObserved - 3, CreationTimePlus((0x29ff << 3))},
6577 {kSmallLargestObserved - 2, CreationTimePlus((0x29ff << 3))},
6578 };
6579 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6580 QuicFrames frames = {QuicFrame(&ack_frame)};
6581
6582 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6583 ASSERT_TRUE(data != nullptr);
6584 std::unique_ptr<QuicEncryptedPacket> encrypted(
6585 EncryptPacketWithTagAndPhase(*data, 0, false));
6586 ASSERT_TRUE(encrypted);
6587 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6588 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6589 EXPECT_THAT(framer_.error(), IsQuicNoError());
6590
6591 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6592 EXPECT_THAT(frame.received_packet_times,
6593 ContainerEq(PacketTimeVector{
6594 {kSmallLargestObserved - 2, CreationTimePlus(0x29ff << 3)},
6595 {kSmallLargestObserved - 3, CreationTimePlus(0x29ff << 3)},
6596 {kSmallLargestObserved - 4, CreationTimePlus(0x29ff << 3)},
6597 {kSmallLargestObserved - 5, CreationTimePlus(0x29ff << 3)},
6598 }));
6599 }
6600
TEST_P(QuicFramerTest,AckReceiveTimestampsPacketOutOfOrder)6601 TEST_P(QuicFramerTest, AckReceiveTimestampsPacketOutOfOrder) {
6602 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6603 return;
6604 }
6605 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6606 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6607 framer_.SetKeyUpdateSupportForConnection(true);
6608 framer_.set_process_timestamps(true);
6609 framer_.set_max_receive_timestamps_per_ack(8);
6610 framer_.set_receive_timestamps_exponent(3);
6611
6612 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6613 QuicPacketHeader header;
6614 header.destination_connection_id = FramerTestConnectionId();
6615 header.reset_flag = false;
6616 header.version_flag = false;
6617 header.packet_number = kPacketNumber;
6618
6619 // Use kSmallLargestObserved to make this test finished in a short time.
6620 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6621
6622 // The packet numbers below are out of order, this is impossible because we
6623 // don't record out of order packets in received_packet_times. The test is
6624 // intended to ensure this error is raised when it happens.
6625 ack_frame.received_packet_times = PacketTimeVector{
6626 {kSmallLargestObserved - 5, CreationTimePlus((0x29ff << 3))},
6627 {kSmallLargestObserved - 2, CreationTimePlus((0x29ff << 3))},
6628 {kSmallLargestObserved - 4, CreationTimePlus((0x29ff << 3))},
6629 {kSmallLargestObserved - 3, CreationTimePlus((0x29ff << 3))},
6630 };
6631 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6632 QuicFrames frames = {QuicFrame(&ack_frame)};
6633
6634 EXPECT_QUIC_BUG(BuildDataPacket(header, frames),
6635 "Packet number and/or receive time not in order.");
6636 }
6637
6638 // If there's insufficient room for IETF ack receive timestamps, don't write any
6639 // timestamp ranges.
TEST_P(QuicFramerTest,IetfAckReceiveTimestampsTruncate)6640 TEST_P(QuicFramerTest, IetfAckReceiveTimestampsTruncate) {
6641 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6642 return;
6643 }
6644 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6645 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6646 framer_.SetKeyUpdateSupportForConnection(true);
6647 framer_.set_process_timestamps(true);
6648 framer_.set_max_receive_timestamps_per_ack(8192);
6649 framer_.set_receive_timestamps_exponent(3);
6650
6651 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6652 QuicPacketHeader header;
6653 header.destination_connection_id = FramerTestConnectionId();
6654 header.reset_flag = false;
6655 header.version_flag = false;
6656 header.packet_number = kPacketNumber;
6657
6658 // Use kSmallLargestObserved to make this test finished in a short time.
6659 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6660 for (QuicPacketNumber i(1); i <= kSmallLargestObserved; i += 2) {
6661 ack_frame.received_packet_times.push_back(
6662 {i, CreationTimePlus((0x29ff << 3))});
6663 }
6664
6665 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6666 QuicFrames frames = {QuicFrame(&ack_frame)};
6667
6668 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6669 ASSERT_TRUE(data != nullptr);
6670 std::unique_ptr<QuicEncryptedPacket> encrypted(
6671 EncryptPacketWithTagAndPhase(*data, 0, false));
6672 ASSERT_TRUE(encrypted);
6673 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6674 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6675 EXPECT_THAT(framer_.error(), IsQuicNoError());
6676
6677 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6678 EXPECT_TRUE(frame.received_packet_times.empty());
6679 }
6680
6681 // If there are too many ack ranges, they will be truncated to make room for a
6682 // timestamp range count of 0.
TEST_P(QuicFramerTest,IetfAckReceiveTimestampsAckRangeTruncation)6683 TEST_P(QuicFramerTest, IetfAckReceiveTimestampsAckRangeTruncation) {
6684 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6685 return;
6686 }
6687 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
6688 framer_.set_process_timestamps(true);
6689 framer_.set_max_receive_timestamps_per_ack(8);
6690 framer_.set_receive_timestamps_exponent(3);
6691
6692 QuicPacketHeader header;
6693 header.destination_connection_id = FramerTestConnectionId();
6694 header.reset_flag = false;
6695 header.version_flag = false;
6696 header.packet_number = kPacketNumber;
6697
6698 QuicAckFrame ack_frame;
6699 // Create a packet with just the ack.
6700 ack_frame = MakeAckFrameWithGaps(/*gap_size=*/0xffffffff,
6701 /*max_num_gaps=*/200,
6702 /*largest_acked=*/kMaxIetfVarInt);
6703 ack_frame.received_packet_times = PacketTimeVector{
6704 {QuicPacketNumber(kMaxIetfVarInt) - 2, CreationTimePlus((0x29ff << 3))},
6705 };
6706 QuicFrames frames = {QuicFrame(&ack_frame)};
6707 // Build an ACK packet.
6708 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6709 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
6710 ASSERT_TRUE(raw_ack_packet != nullptr);
6711 char buffer[kMaxOutgoingPacketSize];
6712 size_t encrypted_length =
6713 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
6714 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
6715 ASSERT_NE(0u, encrypted_length);
6716 // Now make sure we can turn our ack packet back into an ack frame.
6717 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6718 ASSERT_TRUE(framer_.ProcessPacket(
6719 QuicEncryptedPacket(buffer, encrypted_length, false)));
6720 ASSERT_EQ(1u, visitor_.ack_frames_.size());
6721 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
6722 EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
6723 LargestAcked(processed_ack_frame));
6724 // Verify ACK ranges in the frame gets truncated.
6725 ASSERT_LT(processed_ack_frame.packets.NumPacketsSlow(),
6726 ack_frame.packets.NumIntervals());
6727 EXPECT_EQ(158u, processed_ack_frame.packets.NumPacketsSlow());
6728 EXPECT_LT(processed_ack_frame.packets.NumIntervals(),
6729 ack_frame.packets.NumIntervals());
6730 EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
6731 processed_ack_frame.packets.Max());
6732 // But the receive timestamps are not truncated because they are small.
6733 EXPECT_FALSE(processed_ack_frame.received_packet_times.empty());
6734 }
6735
TEST_P(QuicFramerTest,BuildAckFramePacketOneAckBlockMaxLength)6736 TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlockMaxLength) {
6737 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6738 QuicPacketHeader header;
6739 header.destination_connection_id = FramerTestConnectionId();
6740 header.reset_flag = false;
6741 header.version_flag = false;
6742 header.packet_number = kPacketNumber;
6743
6744 QuicAckFrame ack_frame = InitAckFrame(kPacketNumber);
6745 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6746
6747 QuicFrames frames = {QuicFrame(&ack_frame)};
6748
6749 // clang-format off
6750 unsigned char packet[] = {
6751 // type (short header, 4 byte packet number)
6752 0x43,
6753 // connection_id
6754 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6755 // packet number
6756 0x12, 0x34, 0x56, 0x78,
6757
6758 // frame type (ack frame)
6759 // (no ack blocks, 4 byte largest observed, 4 byte block length)
6760 0x4A,
6761 // largest acked
6762 0x12, 0x34, 0x56, 0x78,
6763 // Zero delta time.
6764 0x00, 0x00,
6765 // first ack block length.
6766 0x12, 0x34, 0x56, 0x78,
6767 // num timestamps.
6768 0x00,
6769 };
6770
6771
6772 unsigned char packet_ietf[] = {
6773 // type (short header, 4 byte packet number)
6774 0x43,
6775 // connection_id
6776 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6777 // packet number
6778 0x12, 0x34, 0x56, 0x78,
6779
6780 // frame type (IETF_ACK frame)
6781 0x02,
6782 // largest acked
6783 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
6784 // Zero delta time.
6785 kVarInt62OneByte + 0x00,
6786 // Nr. of additional ack blocks
6787 kVarInt62OneByte + 0x00,
6788 // first ack block length.
6789 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
6790 };
6791 // clang-format on
6792 unsigned char* p = packet;
6793 size_t p_size = ABSL_ARRAYSIZE(packet);
6794 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
6795 p = packet_ietf;
6796 p_size = ABSL_ARRAYSIZE(packet_ietf);
6797 }
6798
6799 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6800 ASSERT_TRUE(data != nullptr);
6801 quiche::test::CompareCharArraysWithHexError(
6802 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
6803 }
6804
TEST_P(QuicFramerTest,BuildAckFramePacketMultipleAckBlocks)6805 TEST_P(QuicFramerTest, BuildAckFramePacketMultipleAckBlocks) {
6806 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6807 QuicPacketHeader header;
6808 header.destination_connection_id = FramerTestConnectionId();
6809 header.reset_flag = false;
6810 header.version_flag = false;
6811 header.packet_number = kPacketNumber;
6812
6813 // Use kSmallLargestObserved to make this test finished in a short time.
6814 QuicAckFrame ack_frame =
6815 InitAckFrame({{QuicPacketNumber(1), QuicPacketNumber(5)},
6816 {QuicPacketNumber(10), QuicPacketNumber(500)},
6817 {QuicPacketNumber(900), kSmallMissingPacket},
6818 {kSmallMissingPacket + 1, kSmallLargestObserved + 1}});
6819 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6820
6821 QuicFrames frames = {QuicFrame(&ack_frame)};
6822
6823 // clang-format off
6824 unsigned char packet[] = {
6825 // type (short header, 4 byte packet number)
6826 0x43,
6827 // connection_id
6828 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6829 // packet number
6830 0x12, 0x34, 0x56, 0x78,
6831
6832 // frame type (ack frame)
6833 // (has ack blocks, 2 byte largest observed, 2 byte block length)
6834 0x65,
6835 // largest acked
6836 0x12, 0x34,
6837 // Zero delta time.
6838 0x00, 0x00,
6839 // num ack blocks ranges.
6840 0x04,
6841 // first ack block length.
6842 0x00, 0x01,
6843 // gap to next block.
6844 0x01,
6845 // ack block length.
6846 0x0e, 0xaf,
6847 // gap to next block.
6848 0xff,
6849 // ack block length.
6850 0x00, 0x00,
6851 // gap to next block.
6852 0x91,
6853 // ack block length.
6854 0x01, 0xea,
6855 // gap to next block.
6856 0x05,
6857 // ack block length.
6858 0x00, 0x04,
6859 // num timestamps.
6860 0x00,
6861 };
6862
6863 unsigned char packet_ietf[] = {
6864 // type (short header, 4 byte packet number)
6865 0x43,
6866 // connection_id
6867 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6868 // packet number
6869 0x12, 0x34, 0x56, 0x78,
6870
6871 // frame type (IETF_ACK frame)
6872 0x02,
6873 // largest acked
6874 kVarInt62TwoBytes + 0x12, 0x34,
6875 // Zero delta time.
6876 kVarInt62OneByte + 0x00,
6877 // num additional ack blocks.
6878 kVarInt62OneByte + 0x03,
6879 // first ack block length.
6880 kVarInt62OneByte + 0x00,
6881
6882 // gap to next block.
6883 kVarInt62OneByte + 0x00,
6884 // ack block length.
6885 kVarInt62TwoBytes + 0x0e, 0xae,
6886
6887 // gap to next block.
6888 kVarInt62TwoBytes + 0x01, 0x8f,
6889 // ack block length.
6890 kVarInt62TwoBytes + 0x01, 0xe9,
6891
6892 // gap to next block.
6893 kVarInt62OneByte + 0x04,
6894 // ack block length.
6895 kVarInt62OneByte + 0x03,
6896 };
6897 // clang-format on
6898 unsigned char* p = packet;
6899 size_t p_size = ABSL_ARRAYSIZE(packet);
6900 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
6901 p = packet_ietf;
6902 p_size = ABSL_ARRAYSIZE(packet_ietf);
6903 }
6904
6905 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6906 ASSERT_TRUE(data != nullptr);
6907
6908 quiche::test::CompareCharArraysWithHexError(
6909 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
6910 }
6911
TEST_P(QuicFramerTest,BuildAckFramePacketMaxAckBlocks)6912 TEST_P(QuicFramerTest, BuildAckFramePacketMaxAckBlocks) {
6913 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6914 QuicPacketHeader header;
6915 header.destination_connection_id = FramerTestConnectionId();
6916 header.reset_flag = false;
6917 header.version_flag = false;
6918 header.packet_number = kPacketNumber;
6919
6920 // Use kSmallLargestObservedto make this test finished in a short time.
6921 QuicAckFrame ack_frame;
6922 ack_frame.largest_acked = kSmallLargestObserved;
6923 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6924 // 300 ack blocks.
6925 for (size_t i = 2; i < 2 * 300; i += 2) {
6926 ack_frame.packets.Add(QuicPacketNumber(i));
6927 }
6928 ack_frame.packets.AddRange(QuicPacketNumber(600), kSmallLargestObserved + 1);
6929
6930 QuicFrames frames = {QuicFrame(&ack_frame)};
6931
6932 // clang-format off
6933 unsigned char packet[] = {
6934 // type (short header, 4 byte packet number)
6935 0x43,
6936 // connection_id
6937 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6938 // packet number
6939 0x12, 0x34, 0x56, 0x78,
6940 // frame type (ack frame)
6941 // (has ack blocks, 2 byte largest observed, 2 byte block length)
6942 0x65,
6943 // largest acked
6944 0x12, 0x34,
6945 // Zero delta time.
6946 0x00, 0x00,
6947 // num ack blocks ranges.
6948 0xff,
6949 // first ack block length.
6950 0x0f, 0xdd,
6951 // 255 = 4 * 63 + 3
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 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6960 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6961 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6962
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 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6971 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6972 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6973
6974 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6975 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6976 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6977 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6978 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6979 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6980 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6981 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6982 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6983 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6984
6985 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6986 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6987 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6988 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6989 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6990 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6991 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6992 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6993 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6994 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6995
6996 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6997 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6998 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6999 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7000 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7001 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7002 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7003 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7004 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7005 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7006
7007 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7008 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7009 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7010 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7011 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7012 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7013 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7014 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7015 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7016 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7017
7018 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7019 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7020 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7021 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7022 // num timestamps.
7023 0x00,
7024 };
7025
7026 unsigned char packet_ietf[] = {
7027 // type (short header, 4 byte packet number)
7028 0x43,
7029 // connection_id
7030 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7031 // packet number
7032 0x12, 0x34, 0x56, 0x78,
7033 // frame type (IETF_ACK frame)
7034 0x02,
7035 // largest acked
7036 kVarInt62TwoBytes + 0x12, 0x34,
7037 // Zero delta time.
7038 kVarInt62OneByte + 0x00,
7039 // num ack blocks ranges.
7040 kVarInt62TwoBytes + 0x01, 0x2b,
7041 // first ack block length.
7042 kVarInt62TwoBytes + 0x0f, 0xdc,
7043 // 255 added blocks of gap_size == 1, ack_size == 1
7044 #define V99AddedBLOCK kVarInt62OneByte + 0x00, kVarInt62OneByte + 0x00
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, V99AddedBLOCK,
7060 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7061 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7062 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7063 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7064 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7065
7066 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7067 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7068 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7069 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7070 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7071 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7072 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7073 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7074 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7075 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7076 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7077 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7078 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7079 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7080 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7081 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7082 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7083 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7084 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7085 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7086
7087 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7088 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7089 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7090 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7091 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7092 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7093 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7094 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7095 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7096 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7097 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7098 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7099 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7100 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7101 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7102 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7103 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7104 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7105 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7106 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7107
7108 #undef V99AddedBLOCK
7109 };
7110 // clang-format on
7111 unsigned char* p = packet;
7112 size_t p_size = ABSL_ARRAYSIZE(packet);
7113 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7114 p = packet_ietf;
7115 p_size = ABSL_ARRAYSIZE(packet_ietf);
7116 }
7117
7118 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7119 ASSERT_TRUE(data != nullptr);
7120
7121 quiche::test::CompareCharArraysWithHexError(
7122 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7123 }
7124
TEST_P(QuicFramerTest,BuildRstFramePacketQuic)7125 TEST_P(QuicFramerTest, BuildRstFramePacketQuic) {
7126 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7127 QuicPacketHeader header;
7128 header.destination_connection_id = FramerTestConnectionId();
7129 header.reset_flag = false;
7130 header.version_flag = false;
7131 header.packet_number = kPacketNumber;
7132
7133 QuicRstStreamFrame rst_frame;
7134 rst_frame.stream_id = kStreamId;
7135 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7136 rst_frame.ietf_error_code = 0x01;
7137 } else {
7138 rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708);
7139 }
7140 rst_frame.byte_offset = 0x0807060504030201;
7141
7142 // clang-format off
7143 unsigned char packet[] = {
7144 // type (short packet, 4 byte packet number)
7145 0x43,
7146 // connection_id
7147 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7148 // packet number
7149 0x12, 0x34, 0x56, 0x78,
7150
7151 // frame type (rst stream frame)
7152 0x01,
7153 // stream id
7154 0x01, 0x02, 0x03, 0x04,
7155 // sent byte offset
7156 0x08, 0x07, 0x06, 0x05,
7157 0x04, 0x03, 0x02, 0x01,
7158 // error code
7159 0x05, 0x06, 0x07, 0x08,
7160 };
7161
7162 unsigned char packet_ietf[] = {
7163 // type (short packet, 4 byte packet number)
7164 0x43,
7165 // connection_id
7166 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7167 // packet number
7168 0x12, 0x34, 0x56, 0x78,
7169
7170 // frame type (IETF_RST_STREAM frame)
7171 0x04,
7172 // stream id
7173 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
7174 // error code
7175 kVarInt62OneByte + 0x01,
7176 // sent byte offset
7177 kVarInt62EightBytes + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01
7178 };
7179 // clang-format on
7180
7181 QuicFrames frames = {QuicFrame(&rst_frame)};
7182
7183 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7184 ASSERT_TRUE(data != nullptr);
7185
7186 unsigned char* p = packet;
7187 size_t p_size = ABSL_ARRAYSIZE(packet);
7188 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7189 p = packet_ietf;
7190 p_size = ABSL_ARRAYSIZE(packet_ietf);
7191 }
7192 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
7193
7194 quiche::test::CompareCharArraysWithHexError(
7195 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7196 }
7197
TEST_P(QuicFramerTest,BuildCloseFramePacket)7198 TEST_P(QuicFramerTest, BuildCloseFramePacket) {
7199 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7200 QuicPacketHeader header;
7201 header.destination_connection_id = FramerTestConnectionId();
7202 header.reset_flag = false;
7203 header.version_flag = false;
7204 header.packet_number = kPacketNumber;
7205
7206 QuicConnectionCloseFrame close_frame(framer_.transport_version(),
7207 QUIC_INTERNAL_ERROR, NO_IETF_QUIC_ERROR,
7208 "because I can", 0x05);
7209 QuicFrames frames = {QuicFrame(&close_frame)};
7210
7211 // clang-format off
7212 unsigned char packet[] = {
7213 // type (short header, 4 byte packet number)
7214 0x43,
7215 // connection_id
7216 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7217 // packet number
7218 0x12, 0x34, 0x56, 0x78,
7219
7220 // frame type (connection close frame)
7221 0x02,
7222 // error code
7223 0x00, 0x00, 0x00, 0x01,
7224 // error details length
7225 0x00, 0x0d,
7226 // error details
7227 'b', 'e', 'c', 'a',
7228 'u', 's', 'e', ' ',
7229 'I', ' ', 'c', 'a',
7230 'n',
7231 };
7232
7233 unsigned char packet_ietf[] = {
7234 // type (short header, 4 byte packet number)
7235 0x43,
7236 // connection_id
7237 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7238 // packet number
7239 0x12, 0x34, 0x56, 0x78,
7240
7241 // frame type (IETF_CONNECTION_CLOSE frame)
7242 0x1c,
7243 // error code
7244 kVarInt62OneByte + 0x01,
7245 // Frame type within the CONNECTION_CLOSE frame
7246 kVarInt62OneByte + 0x05,
7247 // error details length
7248 kVarInt62OneByte + 0x0f,
7249 // error details
7250 '1', ':', 'b', 'e',
7251 'c', 'a', 'u', 's',
7252 'e', ' ', 'I', ' ',
7253 'c', 'a', 'n',
7254 };
7255 // clang-format on
7256
7257 unsigned char* p = packet;
7258 size_t p_size = ABSL_ARRAYSIZE(packet);
7259 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7260 p = packet_ietf;
7261 p_size = ABSL_ARRAYSIZE(packet_ietf);
7262 }
7263
7264 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7265 ASSERT_TRUE(data != nullptr);
7266
7267 quiche::test::CompareCharArraysWithHexError(
7268 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7269 }
7270
TEST_P(QuicFramerTest,BuildCloseFramePacketExtendedInfo)7271 TEST_P(QuicFramerTest, BuildCloseFramePacketExtendedInfo) {
7272 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7273 QuicPacketHeader header;
7274 header.destination_connection_id = FramerTestConnectionId();
7275 header.reset_flag = false;
7276 header.version_flag = false;
7277 header.packet_number = kPacketNumber;
7278
7279 QuicConnectionCloseFrame close_frame(
7280 framer_.transport_version(),
7281 static_cast<QuicErrorCode>(
7282 VersionHasIetfQuicFrames(framer_.transport_version()) ? 0x01
7283 : 0x05060708),
7284 NO_IETF_QUIC_ERROR, "because I can", 0x05);
7285 // Set this so that it is "there" for both Google QUIC and IETF QUIC
7286 // framing. It better not show up for Google QUIC!
7287 close_frame.quic_error_code = static_cast<QuicErrorCode>(0x4567);
7288
7289 QuicFrames frames = {QuicFrame(&close_frame)};
7290
7291 // clang-format off
7292 unsigned char packet[] = {
7293 // type (short header, 4 byte packet number)
7294 0x43,
7295 // connection_id
7296 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7297 // packet number
7298 0x12, 0x34, 0x56, 0x78,
7299
7300 // frame type (connection close frame)
7301 0x02,
7302 // error code
7303 0x05, 0x06, 0x07, 0x08,
7304 // error details length
7305 0x00, 0x0d,
7306 // error details
7307 'b', 'e', 'c', 'a',
7308 'u', 's', 'e', ' ',
7309 'I', ' ', 'c', 'a',
7310 'n',
7311 };
7312
7313 unsigned char packet_ietf[] = {
7314 // type (short header, 4 byte packet number)
7315 0x43,
7316 // connection_id
7317 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7318 // packet number
7319 0x12, 0x34, 0x56, 0x78,
7320
7321 // frame type (IETF_CONNECTION_CLOSE frame)
7322 0x1c,
7323 // IETF error code INTERNAL_ERROR = 0x01 corresponding to
7324 // QuicErrorCode::QUIC_INTERNAL_ERROR = 0x01.
7325 kVarInt62OneByte + 0x01,
7326 // Frame type within the CONNECTION_CLOSE frame
7327 kVarInt62OneByte + 0x05,
7328 // error details length
7329 kVarInt62OneByte + 0x13,
7330 // error details
7331 '1', '7', '7', '6',
7332 '7', ':', 'b', 'e',
7333 'c', 'a', 'u', 's',
7334 'e', ' ', 'I', ' ',
7335 'c', 'a', 'n'
7336 };
7337 // clang-format on
7338
7339 unsigned char* p = packet;
7340 size_t p_size = ABSL_ARRAYSIZE(packet);
7341 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7342 p = packet_ietf;
7343 p_size = ABSL_ARRAYSIZE(packet_ietf);
7344 }
7345
7346 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7347 ASSERT_TRUE(data != nullptr);
7348
7349 quiche::test::CompareCharArraysWithHexError(
7350 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7351 }
7352
TEST_P(QuicFramerTest,BuildTruncatedCloseFramePacket)7353 TEST_P(QuicFramerTest, BuildTruncatedCloseFramePacket) {
7354 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7355 QuicPacketHeader header;
7356 header.destination_connection_id = FramerTestConnectionId();
7357 header.reset_flag = false;
7358 header.version_flag = false;
7359 header.packet_number = kPacketNumber;
7360
7361 QuicConnectionCloseFrame close_frame(framer_.transport_version(),
7362 QUIC_INTERNAL_ERROR, NO_IETF_QUIC_ERROR,
7363 std::string(2048, 'A'), 0x05);
7364 QuicFrames frames = {QuicFrame(&close_frame)};
7365
7366 // clang-format off
7367 unsigned char packet[] = {
7368 // type (short header, 4 byte packet number)
7369 0x43,
7370 // connection_id
7371 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7372 // packet number
7373 0x12, 0x34, 0x56, 0x78,
7374
7375 // frame type (connection close frame)
7376 0x02,
7377 // error code
7378 0x00, 0x00, 0x00, 0x01,
7379 // error details length
7380 0x01, 0x00,
7381 // error details (truncated to 256 bytes)
7382 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7383 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7384 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7385 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7386 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7387 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7388 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7389 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7390 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7391 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7392 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7393 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7394 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7395 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7396 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7397 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7398 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7399 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7400 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7401 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7402 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7403 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7404 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7405 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7406 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7407 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7408 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7409 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7410 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7411 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7412 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7413 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7414 };
7415
7416 unsigned char packet_ietf[] = {
7417 // type (short header, 4 byte packet number)
7418 0x43,
7419 // connection_id
7420 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7421 // packet number
7422 0x12, 0x34, 0x56, 0x78,
7423
7424 // frame type (IETF_CONNECTION_CLOSE frame)
7425 0x1c,
7426 // error code
7427 kVarInt62OneByte + 0x01,
7428 // Frame type within the CONNECTION_CLOSE frame
7429 kVarInt62OneByte + 0x05,
7430 // error details length
7431 kVarInt62TwoBytes + 0x01, 0x00,
7432 // error details (truncated to 256 bytes)
7433 '1', ':', 'A', 'A', 'A', 'A', 'A', 'A',
7434 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7435 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7436 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7437 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7438 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7439 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7440 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7441 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7442 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7443 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7444 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7445 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7446 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7447 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7448 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7449 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7450 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7451 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7452 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7453 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7454 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7455 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7456 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7457 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7458 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7459 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7460 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7461 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7462 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7463 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7464 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7465 };
7466 // clang-format on
7467
7468 unsigned char* p = packet;
7469 size_t p_size = ABSL_ARRAYSIZE(packet);
7470 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7471 p = packet_ietf;
7472 p_size = ABSL_ARRAYSIZE(packet_ietf);
7473 }
7474
7475 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7476 ASSERT_TRUE(data != nullptr);
7477
7478 quiche::test::CompareCharArraysWithHexError(
7479 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7480 }
7481
TEST_P(QuicFramerTest,BuildApplicationCloseFramePacket)7482 TEST_P(QuicFramerTest, BuildApplicationCloseFramePacket) {
7483 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
7484 // This frame is only for IETF QUIC.
7485 return;
7486 }
7487 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7488 QuicPacketHeader header;
7489 header.destination_connection_id = FramerTestConnectionId();
7490 header.reset_flag = false;
7491 header.version_flag = false;
7492 header.packet_number = kPacketNumber;
7493
7494 QuicConnectionCloseFrame app_close_frame;
7495 app_close_frame.wire_error_code = 0x11;
7496 app_close_frame.error_details = "because I can";
7497 app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
7498
7499 QuicFrames frames = {QuicFrame(&app_close_frame)};
7500
7501 // clang-format off
7502
7503 unsigned char packet_ietf[] = {
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 (IETF_APPLICATION_CLOSE frame)
7512 0x1d,
7513 // error code
7514 kVarInt62OneByte + 0x11,
7515 // error details length
7516 kVarInt62OneByte + 0x0f,
7517 // error details, note that it includes an extended error code.
7518 '0', ':', 'b', 'e',
7519 'c', 'a', 'u', 's',
7520 'e', ' ', 'I', ' ',
7521 'c', 'a', 'n',
7522 };
7523 // clang-format on
7524
7525 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7526 ASSERT_TRUE(data != nullptr);
7527
7528 quiche::test::CompareCharArraysWithHexError(
7529 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
7530 ABSL_ARRAYSIZE(packet_ietf));
7531 }
7532
TEST_P(QuicFramerTest,BuildTruncatedApplicationCloseFramePacket)7533 TEST_P(QuicFramerTest, BuildTruncatedApplicationCloseFramePacket) {
7534 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
7535 // This frame is only for IETF QUIC.
7536 return;
7537 }
7538 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7539 QuicPacketHeader header;
7540 header.destination_connection_id = FramerTestConnectionId();
7541 header.reset_flag = false;
7542 header.version_flag = false;
7543 header.packet_number = kPacketNumber;
7544
7545 QuicConnectionCloseFrame app_close_frame;
7546 app_close_frame.wire_error_code = 0x11;
7547 app_close_frame.error_details = std::string(2048, 'A');
7548 app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
7549 // Setting to missing ensures that if it is missing, the extended
7550 // code is not added to the text message.
7551 app_close_frame.quic_error_code = QUIC_IETF_GQUIC_ERROR_MISSING;
7552
7553 QuicFrames frames = {QuicFrame(&app_close_frame)};
7554
7555 // clang-format off
7556 unsigned char packet_ietf[] = {
7557 // type (short header, 4 byte packet number)
7558 0x43,
7559 // connection_id
7560 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7561 // packet number
7562 0x12, 0x34, 0x56, 0x78,
7563
7564 // frame type (IETF_APPLICATION_CLOSE frame)
7565 0x1d,
7566 // error code
7567 kVarInt62OneByte + 0x11,
7568 // error details length
7569 kVarInt62TwoBytes + 0x01, 0x00,
7570 // error details (truncated to 256 bytes)
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 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7602 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7603 };
7604 // clang-format on
7605
7606 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7607 ASSERT_TRUE(data != nullptr);
7608
7609 quiche::test::CompareCharArraysWithHexError(
7610 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
7611 ABSL_ARRAYSIZE(packet_ietf));
7612 }
7613
TEST_P(QuicFramerTest,BuildGoAwayPacket)7614 TEST_P(QuicFramerTest, BuildGoAwayPacket) {
7615 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7616 // This frame is only for Google QUIC.
7617 return;
7618 }
7619 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7620 QuicPacketHeader header;
7621 header.destination_connection_id = FramerTestConnectionId();
7622 header.reset_flag = false;
7623 header.version_flag = false;
7624 header.packet_number = kPacketNumber;
7625
7626 QuicGoAwayFrame goaway_frame;
7627 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
7628 goaway_frame.last_good_stream_id = kStreamId;
7629 goaway_frame.reason_phrase = "because I can";
7630
7631 QuicFrames frames = {QuicFrame(&goaway_frame)};
7632
7633 // clang-format off
7634 unsigned char packet[] = {
7635 // type (short header, 4 byte packet number)
7636 0x43,
7637 // connection_id
7638 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7639 // packet number
7640 0x12, 0x34, 0x56, 0x78,
7641
7642 // frame type (go away frame)
7643 0x03,
7644 // error code
7645 0x05, 0x06, 0x07, 0x08,
7646 // stream id
7647 0x01, 0x02, 0x03, 0x04,
7648 // error details length
7649 0x00, 0x0d,
7650 // error details
7651 'b', 'e', 'c', 'a',
7652 'u', 's', 'e', ' ',
7653 'I', ' ', 'c', 'a',
7654 'n',
7655 };
7656
7657 // clang-format on
7658 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7659 ASSERT_TRUE(data != nullptr);
7660
7661 quiche::test::CompareCharArraysWithHexError(
7662 "constructed packet", data->data(), data->length(), AsChars(packet),
7663 ABSL_ARRAYSIZE(packet));
7664 }
7665
TEST_P(QuicFramerTest,BuildTruncatedGoAwayPacket)7666 TEST_P(QuicFramerTest, BuildTruncatedGoAwayPacket) {
7667 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7668 // This frame is only for Google QUIC.
7669 return;
7670 }
7671 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7672 QuicPacketHeader header;
7673 header.destination_connection_id = FramerTestConnectionId();
7674 header.reset_flag = false;
7675 header.version_flag = false;
7676 header.packet_number = kPacketNumber;
7677
7678 QuicGoAwayFrame goaway_frame;
7679 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
7680 goaway_frame.last_good_stream_id = kStreamId;
7681 goaway_frame.reason_phrase = std::string(2048, 'A');
7682
7683 QuicFrames frames = {QuicFrame(&goaway_frame)};
7684
7685 // clang-format off
7686 unsigned char packet[] = {
7687 // type (short header, 4 byte packet number)
7688 0x43,
7689 // connection_id
7690 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7691 // packet number
7692 0x12, 0x34, 0x56, 0x78,
7693
7694 // frame type (go away frame)
7695 0x03,
7696 // error code
7697 0x05, 0x06, 0x07, 0x08,
7698 // stream id
7699 0x01, 0x02, 0x03, 0x04,
7700 // error details length
7701 0x01, 0x00,
7702 // error details (truncated to 256 bytes)
7703 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7704 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7705 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7706 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7707 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7708 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7709 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7710 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7711 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7712 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7713 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7714 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7715 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7716 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7717 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7718 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7719 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7720 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7721 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7722 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7723 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7724 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7725 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7726 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7727 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7728 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7729 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7730 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7731 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7732 '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 };
7736 // clang-format on
7737
7738 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7739 ASSERT_TRUE(data != nullptr);
7740
7741 quiche::test::CompareCharArraysWithHexError(
7742 "constructed packet", data->data(), data->length(), AsChars(packet),
7743 ABSL_ARRAYSIZE(packet));
7744 }
7745
TEST_P(QuicFramerTest,BuildWindowUpdatePacket)7746 TEST_P(QuicFramerTest, BuildWindowUpdatePacket) {
7747 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7748 QuicPacketHeader header;
7749 header.destination_connection_id = FramerTestConnectionId();
7750 header.reset_flag = false;
7751 header.version_flag = false;
7752 header.packet_number = kPacketNumber;
7753
7754 QuicWindowUpdateFrame window_update_frame;
7755 window_update_frame.stream_id = kStreamId;
7756 window_update_frame.max_data = 0x1122334455667788;
7757
7758 QuicFrames frames = {QuicFrame(window_update_frame)};
7759
7760 // clang-format off
7761 unsigned char packet[] = {
7762 // type (short header, 4 byte packet number)
7763 0x43,
7764 // connection_id
7765 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7766 // packet number
7767 0x12, 0x34, 0x56, 0x78,
7768
7769 // frame type (window update frame)
7770 0x04,
7771 // stream id
7772 0x01, 0x02, 0x03, 0x04,
7773 // byte offset
7774 0x11, 0x22, 0x33, 0x44,
7775 0x55, 0x66, 0x77, 0x88,
7776 };
7777
7778 unsigned char packet_ietf[] = {
7779 // type (short header, 4 byte packet number)
7780 0x43,
7781 // connection_id
7782 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7783 // packet number
7784 0x12, 0x34, 0x56, 0x78,
7785
7786 // frame type (IETF_MAX_STREAM_DATA frame)
7787 0x11,
7788 // stream id
7789 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
7790 // byte offset
7791 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
7792 0x55, 0x66, 0x77, 0x88,
7793 };
7794 // clang-format on
7795
7796 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7797 ASSERT_TRUE(data != nullptr);
7798
7799 unsigned char* p = packet;
7800 size_t p_size = ABSL_ARRAYSIZE(packet);
7801 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7802 p = packet_ietf;
7803 p_size = ABSL_ARRAYSIZE(packet_ietf);
7804 }
7805
7806 quiche::test::CompareCharArraysWithHexError(
7807 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7808 }
7809
TEST_P(QuicFramerTest,BuildMaxStreamDataPacket)7810 TEST_P(QuicFramerTest, BuildMaxStreamDataPacket) {
7811 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
7812 // This frame is only for IETF QUIC.
7813 return;
7814 }
7815 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7816 QuicPacketHeader header;
7817 header.destination_connection_id = FramerTestConnectionId();
7818 header.reset_flag = false;
7819 header.version_flag = false;
7820 header.packet_number = kPacketNumber;
7821
7822 QuicWindowUpdateFrame window_update_frame;
7823 window_update_frame.stream_id = kStreamId;
7824 window_update_frame.max_data = 0x1122334455667788;
7825
7826 QuicFrames frames = {QuicFrame(window_update_frame)};
7827
7828 // clang-format off
7829 unsigned char packet_ietf[] = {
7830 // type (short header, 4 byte packet number)
7831 0x43,
7832 // connection_id
7833 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7834 // packet number
7835 0x12, 0x34, 0x56, 0x78,
7836
7837 // frame type (IETF_MAX_STREAM_DATA frame)
7838 0x11,
7839 // stream id
7840 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
7841 // byte offset
7842 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
7843 0x55, 0x66, 0x77, 0x88,
7844 };
7845 // clang-format on
7846
7847 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7848 ASSERT_TRUE(data != nullptr);
7849
7850 quiche::test::CompareCharArraysWithHexError(
7851 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
7852 ABSL_ARRAYSIZE(packet_ietf));
7853 }
7854
TEST_P(QuicFramerTest,BuildMaxDataPacket)7855 TEST_P(QuicFramerTest, BuildMaxDataPacket) {
7856 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
7857 // This frame is only for IETF QUIC.
7858 return;
7859 }
7860 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7861 QuicPacketHeader header;
7862 header.destination_connection_id = FramerTestConnectionId();
7863 header.reset_flag = false;
7864 header.version_flag = false;
7865 header.packet_number = kPacketNumber;
7866
7867 QuicWindowUpdateFrame window_update_frame;
7868 window_update_frame.stream_id =
7869 QuicUtils::GetInvalidStreamId(framer_.transport_version());
7870 window_update_frame.max_data = 0x1122334455667788;
7871
7872 QuicFrames frames = {QuicFrame(window_update_frame)};
7873
7874 // clang-format off
7875 unsigned char packet_ietf[] = {
7876 // type (short header, 4 byte packet number)
7877 0x43,
7878 // connection_id
7879 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7880 // packet number
7881 0x12, 0x34, 0x56, 0x78,
7882
7883 // frame type (IETF_MAX_DATA frame)
7884 0x10,
7885 // byte offset
7886 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
7887 0x55, 0x66, 0x77, 0x88,
7888 };
7889 // clang-format on
7890
7891 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7892 ASSERT_TRUE(data != nullptr);
7893
7894 quiche::test::CompareCharArraysWithHexError(
7895 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
7896 ABSL_ARRAYSIZE(packet_ietf));
7897 }
7898
TEST_P(QuicFramerTest,BuildBlockedPacket)7899 TEST_P(QuicFramerTest, BuildBlockedPacket) {
7900 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7901 QuicPacketHeader header;
7902 header.destination_connection_id = FramerTestConnectionId();
7903 header.reset_flag = false;
7904 header.version_flag = false;
7905 header.packet_number = kPacketNumber;
7906
7907 QuicBlockedFrame blocked_frame;
7908 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7909 // For IETF QUIC, the stream ID must be <invalid> for the frame
7910 // to be a BLOCKED frame. if it's valid, it will be a
7911 // STREAM_BLOCKED frame.
7912 blocked_frame.stream_id =
7913 QuicUtils::GetInvalidStreamId(framer_.transport_version());
7914 } else {
7915 blocked_frame.stream_id = kStreamId;
7916 }
7917 blocked_frame.offset = kStreamOffset;
7918
7919 QuicFrames frames = {QuicFrame(blocked_frame)};
7920
7921 // clang-format off
7922 unsigned char packet[] = {
7923 // type (short packet, 4 byte packet number)
7924 0x43,
7925 // connection_id
7926 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7927 // packet number
7928 0x12, 0x34, 0x56, 0x78,
7929
7930 // frame type (blocked frame)
7931 0x05,
7932 // stream id
7933 0x01, 0x02, 0x03, 0x04,
7934 };
7935
7936 unsigned char packet_ietf[] = {
7937 // type (short packet, 4 byte packet number)
7938 0x43,
7939 // connection_id
7940 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7941 // packet number
7942 0x12, 0x34, 0x56, 0x78,
7943
7944 // frame type (IETF_DATA_BLOCKED frame)
7945 0x14,
7946 // Offset
7947 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
7948 };
7949 // clang-format on
7950
7951 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7952 ASSERT_TRUE(data != nullptr);
7953
7954 unsigned char* p = packet;
7955 size_t p_size = ABSL_ARRAYSIZE(packet);
7956 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7957 p = packet_ietf;
7958 p_size = ABSL_ARRAYSIZE(packet_ietf);
7959 }
7960
7961 quiche::test::CompareCharArraysWithHexError(
7962 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7963 }
7964
TEST_P(QuicFramerTest,BuildPingPacket)7965 TEST_P(QuicFramerTest, BuildPingPacket) {
7966 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7967 QuicPacketHeader header;
7968 header.destination_connection_id = FramerTestConnectionId();
7969 header.reset_flag = false;
7970 header.version_flag = false;
7971 header.packet_number = kPacketNumber;
7972
7973 QuicFrames frames = {QuicFrame(QuicPingFrame())};
7974
7975 // clang-format off
7976 unsigned char packet[] = {
7977 // type (short header, 4 byte packet number)
7978 0x43,
7979 // connection_id
7980 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7981 // packet number
7982 0x12, 0x34, 0x56, 0x78,
7983
7984 // frame type
7985 0x07,
7986 };
7987
7988 unsigned char packet_ietf[] = {
7989 // type (short header, 4 byte packet number)
7990 0x43,
7991 // connection_id
7992 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7993 // packet number
7994 0x12, 0x34, 0x56, 0x78,
7995
7996 // frame type (IETF_PING frame)
7997 0x01,
7998 };
7999 // clang-format on
8000
8001 unsigned char* p = packet;
8002 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8003 p = packet_ietf;
8004 }
8005
8006 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8007 ASSERT_TRUE(data != nullptr);
8008
8009 quiche::test::CompareCharArraysWithHexError(
8010 "constructed packet", data->data(), data->length(), AsChars(p),
8011 ABSL_ARRAYSIZE(packet));
8012 }
8013
TEST_P(QuicFramerTest,BuildHandshakeDonePacket)8014 TEST_P(QuicFramerTest, BuildHandshakeDonePacket) {
8015 QuicPacketHeader header;
8016 header.destination_connection_id = FramerTestConnectionId();
8017 header.reset_flag = false;
8018 header.version_flag = false;
8019 header.packet_number = kPacketNumber;
8020
8021 QuicFrames frames = {QuicFrame(QuicHandshakeDoneFrame())};
8022
8023 // clang-format off
8024 unsigned char packet[] = {
8025 // type (short header, 4 byte packet number)
8026 0x43,
8027 // connection_id
8028 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8029 // packet number
8030 0x12, 0x34, 0x56, 0x78,
8031
8032 // frame type (Handshake done frame)
8033 0x1e,
8034 };
8035 // clang-format on
8036 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8037 return;
8038 }
8039
8040 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8041 ASSERT_TRUE(data != nullptr);
8042
8043 quiche::test::CompareCharArraysWithHexError(
8044 "constructed packet", data->data(), data->length(), AsChars(packet),
8045 ABSL_ARRAYSIZE(packet));
8046 }
8047
TEST_P(QuicFramerTest,BuildAckFrequencyPacket)8048 TEST_P(QuicFramerTest, BuildAckFrequencyPacket) {
8049 QuicPacketHeader header;
8050 header.destination_connection_id = FramerTestConnectionId();
8051 header.reset_flag = false;
8052 header.version_flag = false;
8053 header.packet_number = kPacketNumber;
8054
8055 QuicAckFrequencyFrame ack_frequency_frame;
8056 ack_frequency_frame.sequence_number = 3;
8057 ack_frequency_frame.packet_tolerance = 5;
8058 ack_frequency_frame.max_ack_delay = QuicTime::Delta::FromMicroseconds(0x3fff);
8059 ack_frequency_frame.ignore_order = false;
8060 QuicFrames frames = {QuicFrame(&ack_frequency_frame)};
8061
8062 // clang-format off
8063 unsigned char packet[] = {
8064 // type (short header, 4 byte packet number)
8065 0x43,
8066 // connection_id
8067 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8068 // packet number
8069 0x12, 0x34, 0x56, 0x78,
8070
8071 // frame type (Ack Frequency frame)
8072 0x40, 0xaf,
8073 // sequence number
8074 0x03,
8075 // packet tolerance
8076 0x05,
8077 // max_ack_delay_us
8078 0x7f, 0xff,
8079 // ignore_oder
8080 0x00
8081 };
8082 // clang-format on
8083 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8084 return;
8085 }
8086
8087 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8088 ASSERT_TRUE(data != nullptr);
8089
8090 quiche::test::CompareCharArraysWithHexError(
8091 "constructed packet", data->data(), data->length(), AsChars(packet),
8092 ABSL_ARRAYSIZE(packet));
8093 }
8094
TEST_P(QuicFramerTest,BuildMessagePacket)8095 TEST_P(QuicFramerTest, BuildMessagePacket) {
8096 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8097 QuicPacketHeader header;
8098 header.destination_connection_id = FramerTestConnectionId();
8099 header.reset_flag = false;
8100 header.version_flag = false;
8101 header.packet_number = kPacketNumber;
8102
8103 QuicMessageFrame frame(1, MemSliceFromString("message"));
8104 QuicMessageFrame frame2(2, MemSliceFromString("message2"));
8105 QuicFrames frames = {QuicFrame(&frame), QuicFrame(&frame2)};
8106
8107 // clang-format off
8108 unsigned char packet[] = {
8109 // type (short header, 4 byte packet number)
8110 0x43,
8111 // connection_id
8112 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8113 // packet number
8114 0x12, 0x34, 0x56, 0x78,
8115
8116 // frame type (message frame)
8117 0x21,
8118 // Length
8119 0x07,
8120 // Message Data
8121 'm', 'e', 's', 's', 'a', 'g', 'e',
8122 // frame type (message frame no length)
8123 0x20,
8124 // Message Data
8125 'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8126 };
8127
8128 unsigned char packet_ietf[] = {
8129 // type (short header, 4 byte packet number)
8130 0x43,
8131 // connection_id
8132 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8133 // packet number
8134 0x12, 0x34, 0x56, 0x78,
8135
8136 // frame type (IETF_MESSAGE frame)
8137 0x31,
8138 // Length
8139 0x07,
8140 // Message Data
8141 'm', 'e', 's', 's', 'a', 'g', 'e',
8142 // frame type (message frame no length)
8143 0x30,
8144 // Message Data
8145 'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8146 };
8147 // clang-format on
8148
8149 unsigned char* p = packet;
8150 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8151 p = packet_ietf;
8152 }
8153
8154 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8155 ASSERT_TRUE(data != nullptr);
8156
8157 quiche::test::CompareCharArraysWithHexError(
8158 "constructed packet", data->data(), data->length(), AsChars(p),
8159 ABSL_ARRAYSIZE(packet));
8160 }
8161
8162 // Test that the MTU discovery packet is serialized correctly as a PING packet.
TEST_P(QuicFramerTest,BuildMtuDiscoveryPacket)8163 TEST_P(QuicFramerTest, BuildMtuDiscoveryPacket) {
8164 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8165 QuicPacketHeader header;
8166 header.destination_connection_id = FramerTestConnectionId();
8167 header.reset_flag = false;
8168 header.version_flag = false;
8169 header.packet_number = kPacketNumber;
8170
8171 QuicFrames frames = {QuicFrame(QuicMtuDiscoveryFrame())};
8172
8173 // clang-format off
8174 unsigned char packet[] = {
8175 // type (short header, 4 byte packet number)
8176 0x43,
8177 // connection_id
8178 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8179 // packet number
8180 0x12, 0x34, 0x56, 0x78,
8181
8182 // frame type
8183 0x07,
8184 };
8185
8186 unsigned char packet_ietf[] = {
8187 // type (short header, 4 byte packet number)
8188 0x43,
8189 // connection_id
8190 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8191 // packet number
8192 0x12, 0x34, 0x56, 0x78,
8193
8194 // frame type (IETF_PING frame)
8195 0x01,
8196 };
8197 // clang-format on
8198
8199 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8200 ASSERT_TRUE(data != nullptr);
8201
8202 unsigned char* p = packet;
8203 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8204 p = packet_ietf;
8205 }
8206
8207 quiche::test::CompareCharArraysWithHexError(
8208 "constructed packet", data->data(), data->length(), AsChars(p),
8209 ABSL_ARRAYSIZE(packet));
8210 }
8211
TEST_P(QuicFramerTest,BuildPublicResetPacket)8212 TEST_P(QuicFramerTest, BuildPublicResetPacket) {
8213 QuicPublicResetPacket reset_packet;
8214 reset_packet.connection_id = FramerTestConnectionId();
8215 reset_packet.nonce_proof = kNonceProof;
8216
8217 // clang-format off
8218 unsigned char packet[] = {
8219 // public flags (public reset, 8 byte ConnectionId)
8220 0x0E,
8221 // connection_id
8222 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8223 // message tag (kPRST)
8224 'P', 'R', 'S', 'T',
8225 // num_entries (1) + padding
8226 0x01, 0x00, 0x00, 0x00,
8227 // tag kRNON
8228 'R', 'N', 'O', 'N',
8229 // end offset 8
8230 0x08, 0x00, 0x00, 0x00,
8231 // nonce proof
8232 0x89, 0x67, 0x45, 0x23,
8233 0x01, 0xEF, 0xCD, 0xAB,
8234 };
8235 // clang-format on
8236
8237 std::unique_ptr<QuicEncryptedPacket> data(
8238 framer_.BuildPublicResetPacket(reset_packet));
8239 ASSERT_TRUE(data != nullptr);
8240 quiche::test::CompareCharArraysWithHexError(
8241 "constructed packet", data->data(), data->length(), AsChars(packet),
8242 ABSL_ARRAYSIZE(packet));
8243 }
8244
TEST_P(QuicFramerTest,BuildPublicResetPacketWithClientAddress)8245 TEST_P(QuicFramerTest, BuildPublicResetPacketWithClientAddress) {
8246 QuicPublicResetPacket reset_packet;
8247 reset_packet.connection_id = FramerTestConnectionId();
8248 reset_packet.nonce_proof = kNonceProof;
8249 reset_packet.client_address =
8250 QuicSocketAddress(QuicIpAddress::Loopback4(), 0x1234);
8251
8252 // clang-format off
8253 unsigned char packet[] = {
8254 // public flags (public reset, 8 byte ConnectionId)
8255 0x0E,
8256 // connection_id
8257 0xFE, 0xDC, 0xBA, 0x98,
8258 0x76, 0x54, 0x32, 0x10,
8259 // message tag (kPRST)
8260 'P', 'R', 'S', 'T',
8261 // num_entries (2) + padding
8262 0x02, 0x00, 0x00, 0x00,
8263 // tag kRNON
8264 'R', 'N', 'O', 'N',
8265 // end offset 8
8266 0x08, 0x00, 0x00, 0x00,
8267 // tag kCADR
8268 'C', 'A', 'D', 'R',
8269 // end offset 16
8270 0x10, 0x00, 0x00, 0x00,
8271 // nonce proof
8272 0x89, 0x67, 0x45, 0x23,
8273 0x01, 0xEF, 0xCD, 0xAB,
8274 // client address
8275 0x02, 0x00,
8276 0x7F, 0x00, 0x00, 0x01,
8277 0x34, 0x12,
8278 };
8279 // clang-format on
8280
8281 std::unique_ptr<QuicEncryptedPacket> data(
8282 framer_.BuildPublicResetPacket(reset_packet));
8283 ASSERT_TRUE(data != nullptr);
8284
8285 quiche::test::CompareCharArraysWithHexError(
8286 "constructed packet", data->data(), data->length(), AsChars(packet),
8287 ABSL_ARRAYSIZE(packet));
8288 }
8289
TEST_P(QuicFramerTest,BuildPublicResetPacketWithEndpointId)8290 TEST_P(QuicFramerTest, BuildPublicResetPacketWithEndpointId) {
8291 QuicPublicResetPacket reset_packet;
8292 reset_packet.connection_id = FramerTestConnectionId();
8293 reset_packet.nonce_proof = kNonceProof;
8294 reset_packet.endpoint_id = "FakeServerId";
8295
8296 // The tag value map in CryptoHandshakeMessage is a std::map, so the two tags
8297 // in the packet, kRNON and kEPID, have unspecified ordering w.r.t each other.
8298 // clang-format off
8299 unsigned char packet_variant1[] = {
8300 // public flags (public reset, 8 byte ConnectionId)
8301 0x0E,
8302 // connection_id
8303 0xFE, 0xDC, 0xBA, 0x98,
8304 0x76, 0x54, 0x32, 0x10,
8305 // message tag (kPRST)
8306 'P', 'R', 'S', 'T',
8307 // num_entries (2) + padding
8308 0x02, 0x00, 0x00, 0x00,
8309 // tag kRNON
8310 'R', 'N', 'O', 'N',
8311 // end offset 8
8312 0x08, 0x00, 0x00, 0x00,
8313 // tag kEPID
8314 'E', 'P', 'I', 'D',
8315 // end offset 20
8316 0x14, 0x00, 0x00, 0x00,
8317 // nonce proof
8318 0x89, 0x67, 0x45, 0x23,
8319 0x01, 0xEF, 0xCD, 0xAB,
8320 // Endpoint ID
8321 'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
8322 };
8323 unsigned char packet_variant2[] = {
8324 // public flags (public reset, 8 byte ConnectionId)
8325 0x0E,
8326 // connection_id
8327 0xFE, 0xDC, 0xBA, 0x98,
8328 0x76, 0x54, 0x32, 0x10,
8329 // message tag (kPRST)
8330 'P', 'R', 'S', 'T',
8331 // num_entries (2) + padding
8332 0x02, 0x00, 0x00, 0x00,
8333 // tag kEPID
8334 'E', 'P', 'I', 'D',
8335 // end offset 12
8336 0x0C, 0x00, 0x00, 0x00,
8337 // tag kRNON
8338 'R', 'N', 'O', 'N',
8339 // end offset 20
8340 0x14, 0x00, 0x00, 0x00,
8341 // Endpoint ID
8342 'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
8343 // nonce proof
8344 0x89, 0x67, 0x45, 0x23,
8345 0x01, 0xEF, 0xCD, 0xAB,
8346 };
8347 // clang-format on
8348
8349 std::unique_ptr<QuicEncryptedPacket> data(
8350 framer_.BuildPublicResetPacket(reset_packet));
8351 ASSERT_TRUE(data != nullptr);
8352
8353 // Variant 1 ends with char 'd'. Variant 1 ends with char 0xAB.
8354 if ('d' == data->data()[data->length() - 1]) {
8355 quiche::test::CompareCharArraysWithHexError(
8356 "constructed packet", data->data(), data->length(),
8357 AsChars(packet_variant1), ABSL_ARRAYSIZE(packet_variant1));
8358 } else {
8359 quiche::test::CompareCharArraysWithHexError(
8360 "constructed packet", data->data(), data->length(),
8361 AsChars(packet_variant2), ABSL_ARRAYSIZE(packet_variant2));
8362 }
8363 }
8364
TEST_P(QuicFramerTest,BuildIetfStatelessResetPacket)8365 TEST_P(QuicFramerTest, BuildIetfStatelessResetPacket) {
8366 // clang-format off
8367 unsigned char packet[] = {
8368 // 1st byte 01XX XXXX
8369 0x40,
8370 // At least 4 bytes of random bytes.
8371 0x00, 0x00, 0x00, 0x00,
8372 // stateless reset token
8373 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
8374 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
8375 };
8376 // clang-format on
8377
8378 // Build the minimal stateless reset packet.
8379 std::unique_ptr<QuicEncryptedPacket> data(
8380 framer_.BuildIetfStatelessResetPacket(
8381 FramerTestConnectionId(),
8382 QuicFramer::GetMinStatelessResetPacketLength() + 1,
8383 kTestStatelessResetToken));
8384 ASSERT_TRUE(data);
8385 EXPECT_EQ(QuicFramer::GetMinStatelessResetPacketLength(), data->length());
8386 // Verify the first 2 bits are 01.
8387 EXPECT_FALSE(data->data()[0] & FLAGS_LONG_HEADER);
8388 EXPECT_TRUE(data->data()[0] & FLAGS_FIXED_BIT);
8389 // Verify stateless reset token.
8390 quiche::test::CompareCharArraysWithHexError(
8391 "constructed packet",
8392 data->data() + data->length() - kStatelessResetTokenLength,
8393 kStatelessResetTokenLength,
8394 AsChars(packet) + ABSL_ARRAYSIZE(packet) - kStatelessResetTokenLength,
8395 kStatelessResetTokenLength);
8396
8397 // Packets with length <= minimal stateless reset does not trigger stateless
8398 // reset.
8399 std::unique_ptr<QuicEncryptedPacket> data2(
8400 framer_.BuildIetfStatelessResetPacket(
8401 FramerTestConnectionId(),
8402 QuicFramer::GetMinStatelessResetPacketLength(),
8403 kTestStatelessResetToken));
8404 ASSERT_FALSE(data2);
8405
8406 // Do not send stateless reset >= minimal stateless reset + 1 + max
8407 // connection ID length.
8408 std::unique_ptr<QuicEncryptedPacket> data3(
8409 framer_.BuildIetfStatelessResetPacket(FramerTestConnectionId(), 1000,
8410 kTestStatelessResetToken));
8411 ASSERT_TRUE(data3);
8412 EXPECT_EQ(QuicFramer::GetMinStatelessResetPacketLength() + 1 +
8413 kQuicMaxConnectionIdWithLengthPrefixLength,
8414 data3->length());
8415 }
8416
TEST_P(QuicFramerTest,BuildIetfStatelessResetPacketCallerProvidedRandomBytes)8417 TEST_P(QuicFramerTest, BuildIetfStatelessResetPacketCallerProvidedRandomBytes) {
8418 // clang-format off
8419 unsigned char packet[] = {
8420 // 1st byte 01XX XXXX
8421 0x7c,
8422 // Random bytes
8423 0x7c, 0x7c, 0x7c, 0x7c,
8424 // stateless reset token
8425 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
8426 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
8427 };
8428 // clang-format on
8429
8430 // Build the minimal stateless reset packet with caller-provided random bytes.
8431 MockRandom random;
8432 auto generate_random_bytes = [](void* data, size_t len) {
8433 std::string bytes(len, 0x7c);
8434 memcpy(data, bytes.data(), bytes.size());
8435 };
8436 EXPECT_CALL(random, InsecureRandBytes(_, _))
8437 .WillOnce(testing::Invoke(generate_random_bytes));
8438 std::unique_ptr<QuicEncryptedPacket> data(
8439 framer_.BuildIetfStatelessResetPacket(
8440 FramerTestConnectionId(),
8441 QuicFramer::GetMinStatelessResetPacketLength() + 1,
8442 kTestStatelessResetToken, &random));
8443 ASSERT_TRUE(data);
8444 EXPECT_EQ(QuicFramer::GetMinStatelessResetPacketLength(), data->length());
8445 // Verify the first 2 bits are 01.
8446 EXPECT_FALSE(data->data()[0] & FLAGS_LONG_HEADER);
8447 EXPECT_TRUE(data->data()[0] & FLAGS_FIXED_BIT);
8448 // Verify the entire packet.
8449 quiche::test::CompareCharArraysWithHexError(
8450 "constructed packet", data->data(), data->length(), AsChars(packet),
8451 ABSL_ARRAYSIZE(packet));
8452 }
8453
TEST_P(QuicFramerTest,EncryptPacket)8454 TEST_P(QuicFramerTest, EncryptPacket) {
8455 QuicPacketNumber packet_number = kPacketNumber;
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 // redundancy
8466 'a', 'b', 'c', 'd',
8467 'e', 'f', 'g', 'h',
8468 'i', 'j', 'k', 'l',
8469 'm', 'n', 'o', 'p',
8470 };
8471
8472 unsigned char packet50[] = {
8473 // type (short header, 4 byte packet number)
8474 0x43,
8475 // connection_id
8476 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8477 // packet number
8478 0x12, 0x34, 0x56, 0x78,
8479
8480 // redundancy
8481 'a', 'b', 'c', 'd',
8482 'e', 'f', 'g', 'h',
8483 'i', 'j', 'k', 'l',
8484 'm', 'n', 'o', 'p',
8485 'q', 'r', 's', 't',
8486 };
8487 // clang-format on
8488
8489 unsigned char* p = packet;
8490 size_t p_size = ABSL_ARRAYSIZE(packet);
8491 if (framer_.version().HasHeaderProtection()) {
8492 p = packet50;
8493 p_size = ABSL_ARRAYSIZE(packet50);
8494 }
8495
8496 std::unique_ptr<QuicPacket> raw(new QuicPacket(
8497 AsChars(p), p_size, false, kPacket8ByteConnectionId,
8498 kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
8499 PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
8500 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0));
8501 char buffer[kMaxOutgoingPacketSize];
8502 size_t encrypted_length = framer_.EncryptPayload(
8503 ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
8504
8505 ASSERT_NE(0u, encrypted_length);
8506 EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
8507 }
8508
8509 // Regression test for b/158014497.
TEST_P(QuicFramerTest,EncryptEmptyPacket)8510 TEST_P(QuicFramerTest, EncryptEmptyPacket) {
8511 auto packet = std::make_unique<QuicPacket>(
8512 new char[100], 0, true, kPacket8ByteConnectionId,
8513 kPacket0ByteConnectionId,
8514 /*includes_version=*/true,
8515 /*includes_diversification_nonce=*/true, PACKET_1BYTE_PACKET_NUMBER,
8516 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
8517 /*retry_token_length=*/0, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
8518 char buffer[kMaxOutgoingPacketSize];
8519 size_t encrypted_length = 1;
8520 EXPECT_QUIC_BUG(
8521 {
8522 encrypted_length =
8523 framer_.EncryptPayload(ENCRYPTION_INITIAL, kPacketNumber, *packet,
8524 buffer, kMaxOutgoingPacketSize);
8525 EXPECT_EQ(0u, encrypted_length);
8526 },
8527 "packet is shorter than associated data length");
8528 }
8529
TEST_P(QuicFramerTest,EncryptPacketWithVersionFlag)8530 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) {
8531 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8532 QuicPacketNumber packet_number = kPacketNumber;
8533 // clang-format off
8534 unsigned char packet[] = {
8535 // type (long header with packet type ZERO_RTT_PROTECTED)
8536 0xD3,
8537 // version tag
8538 'Q', '.', '1', '0',
8539 // connection_id length
8540 0x50,
8541 // connection_id
8542 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8543 // packet number
8544 0x12, 0x34, 0x56, 0x78,
8545
8546 // redundancy
8547 'a', 'b', 'c', 'd',
8548 'e', 'f', 'g', 'h',
8549 'i', 'j', 'k', 'l',
8550 'm', 'n', 'o', 'p',
8551 };
8552
8553 unsigned char packet50[] = {
8554 // type (long header with packet type ZERO_RTT_PROTECTED)
8555 0xD3,
8556 // version tag
8557 'Q', '.', '1', '0',
8558 // destination connection ID length
8559 0x08,
8560 // destination connection ID
8561 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8562 // source connection ID length
8563 0x00,
8564 // packet number
8565 0x12, 0x34, 0x56, 0x78,
8566
8567 // redundancy
8568 'a', 'b', 'c', 'd',
8569 'e', 'f', 'g', 'h',
8570 'i', 'j', 'k', 'l',
8571 'm', 'n', 'o', 'p',
8572 'q', 'r', 's', 't',
8573 };
8574 // clang-format on
8575
8576 unsigned char* p = packet;
8577 size_t p_size = ABSL_ARRAYSIZE(packet);
8578 // TODO(ianswett): see todo in previous test.
8579 if (framer_.version().HasHeaderProtection()) {
8580 p = packet50;
8581 p_size = ABSL_ARRAYSIZE(packet50);
8582 }
8583
8584 std::unique_ptr<QuicPacket> raw(new QuicPacket(
8585 AsChars(p), p_size, false, kPacket8ByteConnectionId,
8586 kPacket0ByteConnectionId, kIncludeVersion, !kIncludeDiversificationNonce,
8587 PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
8588 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0));
8589 char buffer[kMaxOutgoingPacketSize];
8590 size_t encrypted_length = framer_.EncryptPayload(
8591 ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
8592
8593 ASSERT_NE(0u, encrypted_length);
8594 EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
8595 }
8596
TEST_P(QuicFramerTest,AckTruncationLargePacket)8597 TEST_P(QuicFramerTest, AckTruncationLargePacket) {
8598 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8599 // This test is not applicable to this version; the range count is
8600 // effectively unlimited
8601 return;
8602 }
8603 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8604
8605 QuicPacketHeader header;
8606 header.destination_connection_id = FramerTestConnectionId();
8607 header.reset_flag = false;
8608 header.version_flag = false;
8609 header.packet_number = kPacketNumber;
8610
8611 QuicAckFrame ack_frame;
8612 // Create a packet with just the ack.
8613 ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
8614 QuicFrames frames = {QuicFrame(&ack_frame)};
8615
8616 // Build an ack packet with truncation due to limit in number of nack ranges.
8617 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8618 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
8619 ASSERT_TRUE(raw_ack_packet != nullptr);
8620 char buffer[kMaxOutgoingPacketSize];
8621 size_t encrypted_length =
8622 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
8623 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
8624 ASSERT_NE(0u, encrypted_length);
8625 // Now make sure we can turn our ack packet back into an ack frame.
8626 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
8627 ASSERT_TRUE(framer_.ProcessPacket(
8628 QuicEncryptedPacket(buffer, encrypted_length, false)));
8629 ASSERT_EQ(1u, visitor_.ack_frames_.size());
8630 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
8631 EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
8632 ASSERT_EQ(256u, processed_ack_frame.packets.NumPacketsSlow());
8633 EXPECT_EQ(QuicPacketNumber(90u), processed_ack_frame.packets.Min());
8634 EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
8635 }
8636
8637 // Regression test for b/150386368.
TEST_P(QuicFramerTest,IetfAckFrameTruncation)8638 TEST_P(QuicFramerTest, IetfAckFrameTruncation) {
8639 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8640 return;
8641 }
8642 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8643
8644 QuicPacketHeader header;
8645 header.destination_connection_id = FramerTestConnectionId();
8646 header.reset_flag = false;
8647 header.version_flag = false;
8648 header.packet_number = kPacketNumber;
8649
8650 QuicAckFrame ack_frame;
8651 // Create a packet with just the ack.
8652 ack_frame = MakeAckFrameWithGaps(/*gap_size=*/0xffffffff,
8653 /*max_num_gaps=*/200,
8654 /*largest_acked=*/kMaxIetfVarInt);
8655 ack_frame.ecn_counters = QuicEcnCounts(100, 10000, 1000000);
8656 QuicFrames frames = {QuicFrame(&ack_frame)};
8657 // Build an ACK packet.
8658 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8659 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
8660 ASSERT_TRUE(raw_ack_packet != nullptr);
8661 char buffer[kMaxOutgoingPacketSize];
8662 size_t encrypted_length =
8663 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
8664 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
8665 ASSERT_NE(0u, encrypted_length);
8666 // Now make sure we can turn our ack packet back into an ack frame.
8667 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
8668 ASSERT_TRUE(framer_.ProcessPacket(
8669 QuicEncryptedPacket(buffer, encrypted_length, false)));
8670 ASSERT_EQ(1u, visitor_.ack_frames_.size());
8671 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
8672 EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
8673 LargestAcked(processed_ack_frame));
8674 // Verify ACK frame gets truncated.
8675 ASSERT_LT(processed_ack_frame.packets.NumPacketsSlow(),
8676 ack_frame.packets.NumIntervals());
8677 EXPECT_EQ(157u, processed_ack_frame.packets.NumPacketsSlow());
8678 EXPECT_LT(processed_ack_frame.packets.NumIntervals(),
8679 ack_frame.packets.NumIntervals());
8680 EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
8681 processed_ack_frame.packets.Max());
8682 }
8683
TEST_P(QuicFramerTest,AckTruncationSmallPacket)8684 TEST_P(QuicFramerTest, AckTruncationSmallPacket) {
8685 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8686 // This test is not applicable to this version; the range count is
8687 // effectively unlimited
8688 return;
8689 }
8690 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8691
8692 QuicPacketHeader header;
8693 header.destination_connection_id = FramerTestConnectionId();
8694 header.reset_flag = false;
8695 header.version_flag = false;
8696 header.packet_number = kPacketNumber;
8697
8698 // Create a packet with just the ack.
8699 QuicAckFrame ack_frame;
8700 ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
8701 QuicFrames frames = {QuicFrame(&ack_frame)};
8702
8703 // Build an ack packet with truncation due to limit in number of nack ranges.
8704 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8705 std::unique_ptr<QuicPacket> raw_ack_packet(
8706 BuildDataPacket(header, frames, 500));
8707 ASSERT_TRUE(raw_ack_packet != nullptr);
8708 char buffer[kMaxOutgoingPacketSize];
8709 size_t encrypted_length =
8710 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
8711 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
8712 ASSERT_NE(0u, encrypted_length);
8713 // Now make sure we can turn our ack packet back into an ack frame.
8714 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
8715 ASSERT_TRUE(framer_.ProcessPacket(
8716 QuicEncryptedPacket(buffer, encrypted_length, false)));
8717 ASSERT_EQ(1u, visitor_.ack_frames_.size());
8718 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
8719 EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
8720 ASSERT_EQ(240u, processed_ack_frame.packets.NumPacketsSlow());
8721 EXPECT_EQ(QuicPacketNumber(122u), processed_ack_frame.packets.Min());
8722 EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
8723 }
8724
TEST_P(QuicFramerTest,CleanTruncation)8725 TEST_P(QuicFramerTest, CleanTruncation) {
8726 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8727 // This test is not applicable to this version; the range count is
8728 // effectively unlimited
8729 return;
8730 }
8731 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8732
8733 QuicPacketHeader header;
8734 header.destination_connection_id = FramerTestConnectionId();
8735 header.reset_flag = false;
8736 header.version_flag = false;
8737 header.packet_number = kPacketNumber;
8738
8739 QuicAckFrame ack_frame = InitAckFrame(201);
8740
8741 // Create a packet with just the ack.
8742 QuicFrames frames = {QuicFrame(&ack_frame)};
8743 if (framer_.version().HasHeaderProtection()) {
8744 frames.push_back(QuicFrame(QuicPaddingFrame(12)));
8745 }
8746 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8747 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
8748 ASSERT_TRUE(raw_ack_packet != nullptr);
8749
8750 char buffer[kMaxOutgoingPacketSize];
8751 size_t encrypted_length =
8752 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
8753 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
8754 ASSERT_NE(0u, encrypted_length);
8755
8756 // Now make sure we can turn our ack packet back into an ack frame.
8757 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
8758 ASSERT_TRUE(framer_.ProcessPacket(
8759 QuicEncryptedPacket(buffer, encrypted_length, false)));
8760
8761 // Test for clean truncation of the ack by comparing the length of the
8762 // original packets to the re-serialized packets.
8763 frames.clear();
8764 frames.push_back(QuicFrame(visitor_.ack_frames_[0].get()));
8765 if (framer_.version().HasHeaderProtection()) {
8766 frames.push_back(QuicFrame(*visitor_.padding_frames_[0].get()));
8767 }
8768
8769 size_t original_raw_length = raw_ack_packet->length();
8770 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8771 raw_ack_packet = BuildDataPacket(header, frames);
8772 ASSERT_TRUE(raw_ack_packet != nullptr);
8773 EXPECT_EQ(original_raw_length, raw_ack_packet->length());
8774 ASSERT_TRUE(raw_ack_packet != nullptr);
8775 }
8776
TEST_P(QuicFramerTest,StopPacketProcessing)8777 TEST_P(QuicFramerTest, StopPacketProcessing) {
8778 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8779 // clang-format off
8780 unsigned char packet[] = {
8781 // type (short header, 4 byte packet number)
8782 0x43,
8783 // connection_id
8784 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8785 // packet number
8786 0x12, 0x34, 0x56, 0x78,
8787
8788 // frame type (stream frame with fin)
8789 0xFF,
8790 // stream id
8791 0x01, 0x02, 0x03, 0x04,
8792 // offset
8793 0x3A, 0x98, 0xFE, 0xDC,
8794 0x32, 0x10, 0x76, 0x54,
8795 // data length
8796 0x00, 0x0c,
8797 // data
8798 'h', 'e', 'l', 'l',
8799 'o', ' ', 'w', 'o',
8800 'r', 'l', 'd', '!',
8801
8802 // frame type (ack frame)
8803 0x40,
8804 // least packet number awaiting an ack
8805 0x12, 0x34, 0x56, 0x78,
8806 0x9A, 0xA0,
8807 // largest observed packet number
8808 0x12, 0x34, 0x56, 0x78,
8809 0x9A, 0xBF,
8810 // num missing packets
8811 0x01,
8812 // missing packet
8813 0x12, 0x34, 0x56, 0x78,
8814 0x9A, 0xBE,
8815 };
8816
8817 unsigned char packet_ietf[] = {
8818 // type (short header, 4 byte packet number)
8819 0x43,
8820 // connection_id
8821 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8822 // packet number
8823 0x12, 0x34, 0x56, 0x78,
8824
8825 // frame type (IETF_STREAM frame with fin, length, and offset bits set)
8826 0x08 | 0x01 | 0x02 | 0x04,
8827 // stream id
8828 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
8829 // offset
8830 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
8831 0x32, 0x10, 0x76, 0x54,
8832 // data length
8833 kVarInt62TwoBytes + 0x00, 0x0c,
8834 // data
8835 'h', 'e', 'l', 'l',
8836 'o', ' ', 'w', 'o',
8837 'r', 'l', 'd', '!',
8838
8839 // frame type (ack frame)
8840 0x0d,
8841 // largest observed packet number
8842 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
8843 // Delta time
8844 kVarInt62OneByte + 0x00,
8845 // Ack Block count
8846 kVarInt62OneByte + 0x01,
8847 // First block size (one packet)
8848 kVarInt62OneByte + 0x00,
8849
8850 // Next gap size & ack. Missing all preceding packets
8851 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
8852 kVarInt62OneByte + 0x00,
8853 };
8854 // clang-format on
8855
8856 MockFramerVisitor visitor;
8857 framer_.set_visitor(&visitor);
8858 EXPECT_CALL(visitor, OnPacket());
8859 EXPECT_CALL(visitor, OnPacketHeader(_));
8860 EXPECT_CALL(visitor, OnStreamFrame(_)).WillOnce(Return(false));
8861 EXPECT_CALL(visitor, OnPacketComplete());
8862 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true));
8863 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_)).WillOnce(Return(true));
8864 EXPECT_CALL(visitor, OnDecryptedPacket(_, _));
8865
8866 unsigned char* p = packet;
8867 size_t p_size = ABSL_ARRAYSIZE(packet);
8868 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8869 p = packet_ietf;
8870 p_size = ABSL_ARRAYSIZE(packet_ietf);
8871 }
8872 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
8873 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
8874 EXPECT_THAT(framer_.error(), IsQuicNoError());
8875 }
8876
8877 static char kTestString[] = "At least 20 characters.";
8878 static QuicStreamId kTestQuicStreamId = 1;
8879
8880 MATCHER_P(ExpectedStreamFrame, version, "") {
8881 return (arg.stream_id == kTestQuicStreamId ||
8882 QuicUtils::IsCryptoStreamId(version.transport_version,
8883 arg.stream_id)) &&
8884 !arg.fin && arg.offset == 0 &&
8885 std::string(arg.data_buffer, arg.data_length) == kTestString;
8886 // FIN is hard-coded false in ConstructEncryptedPacket.
8887 // Offset 0 is hard-coded in ConstructEncryptedPacket.
8888 }
8889
8890 // Verify that the packet returned by ConstructEncryptedPacket() can be properly
8891 // parsed by the framer.
TEST_P(QuicFramerTest,ConstructEncryptedPacket)8892 TEST_P(QuicFramerTest, ConstructEncryptedPacket) {
8893 // Since we are using ConstructEncryptedPacket, we have to set the framer's
8894 // crypto to be Null.
8895 if (framer_.version().KnowsWhichDecrypterToUse()) {
8896 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
8897 std::make_unique<StrictTaggingDecrypter>(
8898 (uint8_t)ENCRYPTION_FORWARD_SECURE));
8899 } else {
8900 framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
8901 std::make_unique<StrictTaggingDecrypter>(
8902 (uint8_t)ENCRYPTION_FORWARD_SECURE));
8903 }
8904 ParsedQuicVersionVector versions;
8905 versions.push_back(framer_.version());
8906 std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket(
8907 TestConnectionId(), EmptyQuicConnectionId(), false, false,
8908 kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
8909 CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, &versions));
8910
8911 MockFramerVisitor visitor;
8912 framer_.set_visitor(&visitor);
8913 EXPECT_CALL(visitor, OnPacket()).Times(1);
8914 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
8915 .Times(1)
8916 .WillOnce(Return(true));
8917 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
8918 .Times(1)
8919 .WillOnce(Return(true));
8920 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1).WillOnce(Return(true));
8921 EXPECT_CALL(visitor, OnDecryptedPacket(_, _)).Times(1);
8922 EXPECT_CALL(visitor, OnError(_)).Times(0);
8923 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
8924 if (!QuicVersionUsesCryptoFrames(framer_.version().transport_version)) {
8925 EXPECT_CALL(visitor, OnStreamFrame(ExpectedStreamFrame(framer_.version())))
8926 .Times(1);
8927 } else {
8928 EXPECT_CALL(visitor, OnCryptoFrame(_)).Times(1);
8929 }
8930 EXPECT_CALL(visitor, OnPacketComplete()).Times(1);
8931
8932 EXPECT_TRUE(framer_.ProcessPacket(*packet));
8933 EXPECT_THAT(framer_.error(), IsQuicNoError());
8934 }
8935
8936 // Verify that the packet returned by ConstructMisFramedEncryptedPacket()
8937 // does cause the framer to return an error.
TEST_P(QuicFramerTest,ConstructMisFramedEncryptedPacket)8938 TEST_P(QuicFramerTest, ConstructMisFramedEncryptedPacket) {
8939 // Since we are using ConstructEncryptedPacket, we have to set the framer's
8940 // crypto to be Null.
8941 if (framer_.version().KnowsWhichDecrypterToUse()) {
8942 framer_.InstallDecrypter(
8943 ENCRYPTION_FORWARD_SECURE,
8944 std::make_unique<StrictTaggingDecrypter>(ENCRYPTION_FORWARD_SECURE));
8945 }
8946 std::unique_ptr<QuicEncryptedPacket> packet(ConstructMisFramedEncryptedPacket(
8947 TestConnectionId(), EmptyQuicConnectionId(), false, false,
8948 kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
8949 CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, framer_.version(),
8950 Perspective::IS_CLIENT));
8951
8952 MockFramerVisitor visitor;
8953 framer_.set_visitor(&visitor);
8954 EXPECT_CALL(visitor, OnPacket()).Times(1);
8955 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
8956 .Times(1)
8957 .WillOnce(Return(true));
8958 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
8959 .Times(1)
8960 .WillOnce(Return(true));
8961 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1);
8962 EXPECT_CALL(visitor, OnDecryptedPacket(_, _)).Times(1);
8963 EXPECT_CALL(visitor, OnError(_)).Times(1);
8964 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
8965 EXPECT_CALL(visitor, OnPacketComplete()).Times(0);
8966
8967 EXPECT_FALSE(framer_.ProcessPacket(*packet));
8968 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
8969 }
8970
TEST_P(QuicFramerTest,IetfBlockedFrame)8971 TEST_P(QuicFramerTest, IetfBlockedFrame) {
8972 // This frame is only for IETF QUIC.
8973 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8974 return;
8975 }
8976 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8977
8978 // clang-format off
8979 PacketFragments packet_ietf = {
8980 // type (short header, 4 byte packet number)
8981 {"",
8982 {0x43}},
8983 // connection_id
8984 {"",
8985 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
8986 // packet number
8987 {"",
8988 {0x12, 0x34, 0x9A, 0xBC}},
8989 // frame type (IETF_DATA_BLOCKED)
8990 {"",
8991 {0x14}},
8992 // blocked offset
8993 {"Can not read blocked offset.",
8994 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
8995 };
8996 // clang-format on
8997
8998 std::unique_ptr<QuicEncryptedPacket> encrypted(
8999 AssemblePacketFromFragments(packet_ietf));
9000 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9001
9002 EXPECT_THAT(framer_.error(), IsQuicNoError());
9003 ASSERT_TRUE(visitor_.header_.get());
9004 EXPECT_TRUE(CheckDecryption(
9005 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9006 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9007
9008 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
9009
9010 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_BLOCKED_DATA);
9011 }
9012
TEST_P(QuicFramerTest,BuildIetfBlockedPacket)9013 TEST_P(QuicFramerTest, BuildIetfBlockedPacket) {
9014 // This frame is only for IETF QUIC.
9015 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9016 return;
9017 }
9018
9019 QuicPacketHeader header;
9020 header.destination_connection_id = FramerTestConnectionId();
9021 header.reset_flag = false;
9022 header.version_flag = false;
9023 header.packet_number = kPacketNumber;
9024
9025 QuicBlockedFrame frame;
9026 frame.stream_id = QuicUtils::GetInvalidStreamId(framer_.transport_version());
9027 frame.offset = kStreamOffset;
9028 QuicFrames frames = {QuicFrame(frame)};
9029
9030 // clang-format off
9031 unsigned char packet_ietf[] = {
9032 // type (short header, 4 byte packet number)
9033 0x43,
9034 // connection_id
9035 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9036 // packet number
9037 0x12, 0x34, 0x56, 0x78,
9038
9039 // frame type (IETF_DATA_BLOCKED)
9040 0x14,
9041 // Offset
9042 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
9043 };
9044 // clang-format on
9045
9046 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9047 ASSERT_TRUE(data != nullptr);
9048
9049 quiche::test::CompareCharArraysWithHexError(
9050 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9051 ABSL_ARRAYSIZE(packet_ietf));
9052 }
9053
TEST_P(QuicFramerTest,IetfStreamBlockedFrame)9054 TEST_P(QuicFramerTest, IetfStreamBlockedFrame) {
9055 // This frame is only for IETF QUIC.
9056 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9057 return;
9058 }
9059 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9060
9061 // clang-format off
9062 PacketFragments packet_ietf = {
9063 // type (short header, 4 byte packet number)
9064 {"",
9065 {0x43}},
9066 // connection_id
9067 {"",
9068 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9069 // packet number
9070 {"",
9071 {0x12, 0x34, 0x9A, 0xBC}},
9072 // frame type (IETF_STREAM_DATA_BLOCKED)
9073 {"",
9074 {0x15}},
9075 // blocked offset
9076 {"Unable to read IETF_STREAM_DATA_BLOCKED frame stream id/count.",
9077 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
9078 {"Can not read stream blocked offset.",
9079 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
9080 };
9081 // clang-format on
9082
9083 std::unique_ptr<QuicEncryptedPacket> encrypted(
9084 AssemblePacketFromFragments(packet_ietf));
9085 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9086
9087 EXPECT_THAT(framer_.error(), IsQuicNoError());
9088 ASSERT_TRUE(visitor_.header_.get());
9089 EXPECT_TRUE(CheckDecryption(
9090 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9091 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9092
9093 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
9094 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
9095
9096 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_STREAM_BLOCKED_DATA);
9097 }
9098
TEST_P(QuicFramerTest,BuildIetfStreamBlockedPacket)9099 TEST_P(QuicFramerTest, BuildIetfStreamBlockedPacket) {
9100 // This frame is only for IETF QUIC.
9101 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9102 return;
9103 }
9104
9105 QuicPacketHeader header;
9106 header.destination_connection_id = FramerTestConnectionId();
9107 header.reset_flag = false;
9108 header.version_flag = false;
9109 header.packet_number = kPacketNumber;
9110
9111 QuicBlockedFrame frame;
9112 frame.stream_id = kStreamId;
9113 frame.offset = kStreamOffset;
9114 QuicFrames frames = {QuicFrame(frame)};
9115
9116 // clang-format off
9117 unsigned char packet_ietf[] = {
9118 // type (short header, 4 byte packet number)
9119 0x43,
9120 // connection_id
9121 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9122 // packet number
9123 0x12, 0x34, 0x56, 0x78,
9124
9125 // frame type (IETF_STREAM_DATA_BLOCKED)
9126 0x15,
9127 // Stream ID
9128 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
9129 // Offset
9130 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
9131 };
9132 // clang-format on
9133
9134 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9135 ASSERT_TRUE(data != nullptr);
9136
9137 quiche::test::CompareCharArraysWithHexError(
9138 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9139 ABSL_ARRAYSIZE(packet_ietf));
9140 }
9141
TEST_P(QuicFramerTest,BiDiMaxStreamsFrame)9142 TEST_P(QuicFramerTest, BiDiMaxStreamsFrame) {
9143 // This frame is only for IETF QUIC.
9144 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9145 return;
9146 }
9147 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9148
9149 // clang-format off
9150 PacketFragments packet_ietf = {
9151 // type (short header, 4 byte packet number)
9152 {"",
9153 {0x43}},
9154 // connection_id
9155 {"",
9156 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9157 // packet number
9158 {"",
9159 {0x12, 0x34, 0x9A, 0xBC}},
9160 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9161 {"",
9162 {0x12}},
9163 // max. streams
9164 {"Unable to read IETF_MAX_STREAMS_BIDIRECTIONAL frame stream id/count.",
9165 {kVarInt62OneByte + 0x03}},
9166 };
9167 // clang-format on
9168
9169 std::unique_ptr<QuicEncryptedPacket> encrypted(
9170 AssemblePacketFromFragments(packet_ietf));
9171 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9172
9173 EXPECT_THAT(framer_.error(), IsQuicNoError());
9174 ASSERT_TRUE(visitor_.header_.get());
9175 EXPECT_TRUE(CheckDecryption(
9176 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9177 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9178
9179 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9180 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
9181 CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9182 }
9183
TEST_P(QuicFramerTest,UniDiMaxStreamsFrame)9184 TEST_P(QuicFramerTest, UniDiMaxStreamsFrame) {
9185 // This frame is only for IETF QUIC.
9186 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9187 return;
9188 }
9189 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9190
9191 // clang-format off
9192 PacketFragments packet_ietf = {
9193 // type (short header, 4 byte packet number)
9194 {"",
9195 {0x43}},
9196 // Test runs in client mode, no connection id
9197 // packet number
9198 {"",
9199 {0x12, 0x34, 0x9A, 0xBC}},
9200 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9201 {"",
9202 {0x13}},
9203 // max. streams
9204 {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
9205 {kVarInt62OneByte + 0x03}},
9206 };
9207 // clang-format on
9208
9209 std::unique_ptr<QuicEncryptedPacket> encrypted(
9210 AssemblePacketFromFragments(packet_ietf));
9211 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9212 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9213
9214 EXPECT_THAT(framer_.error(), IsQuicNoError());
9215 ASSERT_TRUE(visitor_.header_.get());
9216 EXPECT_TRUE(CheckDecryption(
9217 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9218 kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9219
9220 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9221 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9222 CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9223 }
9224
TEST_P(QuicFramerTest,ServerUniDiMaxStreamsFrame)9225 TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrame) {
9226 // This frame is only for IETF QUIC.
9227 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9228 return;
9229 }
9230 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9231
9232 // clang-format off
9233 PacketFragments packet_ietf = {
9234 // type (short header, 4 byte packet number)
9235 {"",
9236 {0x43}},
9237 // connection_id
9238 {"",
9239 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9240 // packet number
9241 {"",
9242 {0x12, 0x34, 0x9A, 0xBC}},
9243 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9244 {"",
9245 {0x13}},
9246 // max. streams
9247 {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
9248 {kVarInt62OneByte + 0x03}},
9249 };
9250 // clang-format on
9251
9252 std::unique_ptr<QuicEncryptedPacket> encrypted(
9253 AssemblePacketFromFragments(packet_ietf));
9254 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9255
9256 EXPECT_THAT(framer_.error(), IsQuicNoError());
9257 ASSERT_TRUE(visitor_.header_.get());
9258 EXPECT_TRUE(CheckDecryption(
9259 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9260 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9261
9262 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9263 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9264 CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9265 }
9266
TEST_P(QuicFramerTest,ClientUniDiMaxStreamsFrame)9267 TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrame) {
9268 // This frame is only for IETF QUIC.
9269 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9270 return;
9271 }
9272 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9273
9274 // clang-format off
9275 PacketFragments packet_ietf = {
9276 // type (short header, 4 byte packet number)
9277 {"",
9278 {0x43}},
9279 // Test runs in client mode, no connection id
9280 // packet number
9281 {"",
9282 {0x12, 0x34, 0x9A, 0xBC}},
9283 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9284 {"",
9285 {0x13}},
9286 // max. streams
9287 {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
9288 {kVarInt62OneByte + 0x03}},
9289 };
9290 // clang-format on
9291
9292 std::unique_ptr<QuicEncryptedPacket> encrypted(
9293 AssemblePacketFromFragments(packet_ietf));
9294 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9295 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9296
9297 EXPECT_THAT(framer_.error(), IsQuicNoError());
9298 ASSERT_TRUE(visitor_.header_.get());
9299 EXPECT_TRUE(CheckDecryption(
9300 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9301 kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9302
9303 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9304 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9305 CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9306 }
9307
9308 // The following four tests ensure that the framer can deserialize a stream
9309 // count that is large enough to cause the resulting stream ID to exceed the
9310 // current implementation limit(32 bits). The intent is that when this happens,
9311 // the stream limit is pegged to the maximum supported value. There are four
9312 // tests, for the four combinations of uni- and bi-directional, server- and
9313 // client- initiated.
TEST_P(QuicFramerTest,BiDiMaxStreamsFrameTooBig)9314 TEST_P(QuicFramerTest, BiDiMaxStreamsFrameTooBig) {
9315 // This frame is only for IETF QUIC.
9316 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9317 return;
9318 }
9319 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9320
9321 // clang-format off
9322 unsigned char packet_ietf[] = {
9323 // type (short header, 4 byte packet number)
9324 0x43,
9325 // connection_id
9326 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9327 // packet number
9328 0x12, 0x34, 0x9A, 0xBC,
9329 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9330 0x12,
9331
9332 // max. streams. Max stream ID allowed is 0xffffffff
9333 // This encodes a count of 0x40000000, leading to stream
9334 // IDs in the range 0x1 00000000 to 0x1 00000003.
9335 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9336 };
9337 // clang-format on
9338
9339 QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9340 ABSL_ARRAYSIZE(packet_ietf), false);
9341 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9342 EXPECT_THAT(framer_.error(), IsQuicNoError());
9343 ASSERT_TRUE(visitor_.header_.get());
9344 EXPECT_TRUE(CheckDecryption(
9345 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9346 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9347
9348 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
9349 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
9350 }
9351
TEST_P(QuicFramerTest,ClientBiDiMaxStreamsFrameTooBig)9352 TEST_P(QuicFramerTest, ClientBiDiMaxStreamsFrameTooBig) {
9353 // This frame is only for IETF QUIC.
9354 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9355 return;
9356 }
9357 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9358
9359 // clang-format off
9360 unsigned char packet_ietf[] = {
9361 // type (short header, 4 byte packet number)
9362 0x43,
9363 // Test runs in client mode, no connection id
9364 // packet number
9365 0x12, 0x34, 0x9A, 0xBC,
9366 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9367 0x12,
9368
9369 // max. streams. Max stream ID allowed is 0xffffffff
9370 // This encodes a count of 0x40000000, leading to stream
9371 // IDs in the range 0x1 00000000 to 0x1 00000003.
9372 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9373 };
9374 // clang-format on
9375
9376 QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9377 ABSL_ARRAYSIZE(packet_ietf), false);
9378 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9379 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9380
9381 EXPECT_THAT(framer_.error(), IsQuicNoError());
9382 ASSERT_TRUE(visitor_.header_.get());
9383 EXPECT_TRUE(CheckDecryption(
9384 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9385 kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9386
9387 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
9388 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
9389 }
9390
TEST_P(QuicFramerTest,ServerUniDiMaxStreamsFrameTooBig)9391 TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrameTooBig) {
9392 // This frame is only for IETF QUIC.
9393 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9394 return;
9395 }
9396 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9397
9398 // clang-format off
9399 unsigned char packet_ietf[] = {
9400 // type (short header, 4 byte packet number)
9401 0x43,
9402 // connection_id
9403 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9404 // packet number
9405 0x12, 0x34, 0x9A, 0xBC,
9406 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9407 0x13,
9408
9409 // max. streams. Max stream ID allowed is 0xffffffff
9410 // This encodes a count of 0x40000000, leading to stream
9411 // IDs in the range 0x1 00000000 to 0x1 00000003.
9412 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9413 };
9414 // clang-format on
9415
9416 QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9417 ABSL_ARRAYSIZE(packet_ietf), false);
9418 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9419
9420 EXPECT_THAT(framer_.error(), IsQuicNoError());
9421 ASSERT_TRUE(visitor_.header_.get());
9422 EXPECT_TRUE(CheckDecryption(
9423 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9424 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9425
9426 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
9427 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9428 }
9429
TEST_P(QuicFramerTest,ClientUniDiMaxStreamsFrameTooBig)9430 TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrameTooBig) {
9431 // This frame is only for IETF QUIC.
9432 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9433 return;
9434 }
9435 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9436
9437 // clang-format off
9438 unsigned char packet_ietf[] = {
9439 // type (short header, 4 byte packet number)
9440 0x43,
9441 // Test runs in client mode, no connection id
9442 // packet number
9443 0x12, 0x34, 0x9A, 0xBC,
9444 // frame type (IETF_MAX_STREAMS_UNDIRECTIONAL)
9445 0x13,
9446
9447 // max. streams. Max stream ID allowed is 0xffffffff
9448 // This encodes a count of 0x40000000, leading to stream
9449 // IDs in the range 0x1 00000000 to 0x1 00000003.
9450 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9451 };
9452 // clang-format on
9453
9454 QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9455 ABSL_ARRAYSIZE(packet_ietf), false);
9456 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9457 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9458
9459 EXPECT_THAT(framer_.error(), IsQuicNoError());
9460 ASSERT_TRUE(visitor_.header_.get());
9461 EXPECT_TRUE(CheckDecryption(
9462 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9463 kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9464
9465 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
9466 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9467 }
9468
9469 // Specifically test that count==0 is accepted.
TEST_P(QuicFramerTest,MaxStreamsFrameZeroCount)9470 TEST_P(QuicFramerTest, MaxStreamsFrameZeroCount) {
9471 // This frame is only for IETF QUIC.
9472 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9473 return;
9474 }
9475 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9476
9477 // clang-format off
9478 unsigned char packet_ietf[] = {
9479 // type (short header, 4 byte packet number)
9480 0x43,
9481 // connection_id
9482 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9483 // packet number
9484 0x12, 0x34, 0x9A, 0xBC,
9485 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9486 0x12,
9487 // max. streams == 0.
9488 kVarInt62OneByte + 0x00
9489 };
9490 // clang-format on
9491
9492 QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9493 ABSL_ARRAYSIZE(packet_ietf), false);
9494 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9495 }
9496
TEST_P(QuicFramerTest,ServerBiDiStreamsBlockedFrame)9497 TEST_P(QuicFramerTest, ServerBiDiStreamsBlockedFrame) {
9498 // This frame is only for IETF QUIC.
9499 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9500 return;
9501 }
9502 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9503
9504 // clang-format off
9505 PacketFragments packet_ietf = {
9506 // type (short header, 4 byte packet number)
9507 {"",
9508 {0x43}},
9509 // connection_id
9510 {"",
9511 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9512 // packet number
9513 {"",
9514 {0x12, 0x34, 0x9A, 0xBC}},
9515 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
9516 {"",
9517 {0x13}},
9518 // stream count
9519 {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
9520 {kVarInt62OneByte + 0x00}},
9521 };
9522 // clang-format on
9523
9524 std::unique_ptr<QuicEncryptedPacket> encrypted(
9525 AssemblePacketFromFragments(packet_ietf));
9526 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9527
9528 EXPECT_THAT(framer_.error(), IsQuicNoError());
9529 ASSERT_TRUE(visitor_.header_.get());
9530 EXPECT_TRUE(CheckDecryption(
9531 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9532 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9533
9534 EXPECT_EQ(0u, visitor_.max_streams_frame_.stream_count);
9535 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9536
9537 CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9538 }
9539
TEST_P(QuicFramerTest,BiDiStreamsBlockedFrame)9540 TEST_P(QuicFramerTest, BiDiStreamsBlockedFrame) {
9541 // This frame is only for IETF QUIC.
9542 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9543 return;
9544 }
9545 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9546
9547 // clang-format off
9548 PacketFragments packet_ietf = {
9549 // type (short header, 4 byte packet number)
9550 {"",
9551 {0x43}},
9552 // connection_id
9553 {"",
9554 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9555 // packet number
9556 {"",
9557 {0x12, 0x34, 0x9A, 0xBC}},
9558 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
9559 {"",
9560 {0x16}},
9561 // stream id
9562 {"Unable to read IETF_STREAMS_BLOCKED_BIDIRECTIONAL "
9563 "frame stream id/count.",
9564 {kVarInt62OneByte + 0x03}},
9565 };
9566 // clang-format on
9567
9568 std::unique_ptr<QuicEncryptedPacket> encrypted(
9569 AssemblePacketFromFragments(packet_ietf));
9570 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9571
9572 EXPECT_THAT(framer_.error(), IsQuicNoError());
9573 ASSERT_TRUE(visitor_.header_.get());
9574 EXPECT_TRUE(CheckDecryption(
9575 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9576 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9577
9578 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
9579 EXPECT_FALSE(visitor_.streams_blocked_frame_.unidirectional);
9580
9581 CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
9582 }
9583
TEST_P(QuicFramerTest,UniDiStreamsBlockedFrame)9584 TEST_P(QuicFramerTest, UniDiStreamsBlockedFrame) {
9585 // This frame is only for IETF QUIC.
9586 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9587 return;
9588 }
9589 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9590
9591 // clang-format off
9592 PacketFragments packet_ietf = {
9593 // type (short header, 4 byte packet number)
9594 {"",
9595 {0x43}},
9596 // connection_id
9597 {"",
9598 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9599 // packet number
9600 {"",
9601 {0x12, 0x34, 0x9A, 0xBC}},
9602 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
9603 {"",
9604 {0x17}},
9605 // stream id
9606 {"Unable to read IETF_STREAMS_BLOCKED_UNIDIRECTIONAL "
9607 "frame stream id/count.",
9608 {kVarInt62OneByte + 0x03}},
9609 };
9610 // clang-format on
9611
9612 std::unique_ptr<QuicEncryptedPacket> encrypted(
9613 AssemblePacketFromFragments(packet_ietf));
9614 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9615
9616 EXPECT_THAT(framer_.error(), IsQuicNoError());
9617 ASSERT_TRUE(visitor_.header_.get());
9618 EXPECT_TRUE(CheckDecryption(
9619 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9620 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9621
9622 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
9623 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
9624 CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
9625 }
9626
TEST_P(QuicFramerTest,ClientUniDiStreamsBlockedFrame)9627 TEST_P(QuicFramerTest, ClientUniDiStreamsBlockedFrame) {
9628 // This frame is only for IETF QUIC.
9629 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9630 return;
9631 }
9632 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9633
9634 // clang-format off
9635 PacketFragments packet_ietf = {
9636 // type (short header, 4 byte packet number)
9637 {"",
9638 {0x43}},
9639 // Test runs in client mode, no connection id
9640 // packet number
9641 {"",
9642 {0x12, 0x34, 0x9A, 0xBC}},
9643 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
9644 {"",
9645 {0x17}},
9646 // stream id
9647 {"Unable to read IETF_STREAMS_BLOCKED_UNIDIRECTIONAL "
9648 "frame stream id/count.",
9649 {kVarInt62OneByte + 0x03}},
9650 };
9651 // clang-format on
9652
9653 std::unique_ptr<QuicEncryptedPacket> encrypted(
9654 AssemblePacketFromFragments(packet_ietf));
9655 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9656 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9657
9658 EXPECT_THAT(framer_.error(), IsQuicNoError());
9659 ASSERT_TRUE(visitor_.header_.get());
9660 EXPECT_TRUE(CheckDecryption(
9661 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9662 kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9663
9664 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
9665 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
9666 CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
9667 }
9668
9669 // Check that when we get a STREAMS_BLOCKED frame that specifies too large
9670 // a stream count, we reject with an appropriate error. There is no need to
9671 // check for different combinations of Uni/Bi directional and client/server
9672 // initiated; the logic does not take these into account.
TEST_P(QuicFramerTest,StreamsBlockedFrameTooBig)9673 TEST_P(QuicFramerTest, StreamsBlockedFrameTooBig) {
9674 // This frame is only for IETF QUIC.
9675 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9676 return;
9677 }
9678 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9679
9680 // clang-format off
9681 unsigned char packet_ietf[] = {
9682 // type (short header, 4 byte packet number)
9683 0x43,
9684 // Test runs in client mode, no connection id
9685 // packet number
9686 0x12, 0x34, 0x9A, 0xBC,
9687 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL)
9688 0x16,
9689
9690 // max. streams. Max stream ID allowed is 0xffffffff
9691 // This encodes a count of 0x40000000, leading to stream
9692 // IDs in the range 0x1 00000000 to 0x1 00000003.
9693 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01
9694 };
9695 // clang-format on
9696
9697 QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9698 ABSL_ARRAYSIZE(packet_ietf), false);
9699 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9700 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
9701
9702 EXPECT_THAT(framer_.error(), IsError(QUIC_STREAMS_BLOCKED_DATA));
9703 EXPECT_EQ(framer_.detailed_error(),
9704 "STREAMS_BLOCKED stream count exceeds implementation limit.");
9705 }
9706
9707 // Specifically test that count==0 is accepted.
TEST_P(QuicFramerTest,StreamsBlockedFrameZeroCount)9708 TEST_P(QuicFramerTest, StreamsBlockedFrameZeroCount) {
9709 // This frame is only for IETF QUIC.
9710 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9711 return;
9712 }
9713
9714 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9715
9716 // clang-format off
9717 PacketFragments packet_ietf = {
9718 // type (short header, 4 byte packet number)
9719 {"",
9720 {0x43}},
9721 // connection_id
9722 {"",
9723 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9724 // packet number
9725 {"",
9726 {0x12, 0x34, 0x9A, 0xBC}},
9727 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
9728 {"",
9729 {0x17}},
9730 // stream id
9731 {"Unable to read IETF_STREAMS_BLOCKED_UNIDIRECTIONAL "
9732 "frame stream id/count.",
9733 {kVarInt62OneByte + 0x00}},
9734 };
9735 // clang-format on
9736
9737 std::unique_ptr<QuicEncryptedPacket> encrypted(
9738 AssemblePacketFromFragments(packet_ietf));
9739 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9740
9741 EXPECT_THAT(framer_.error(), IsQuicNoError());
9742 ASSERT_TRUE(visitor_.header_.get());
9743 EXPECT_TRUE(CheckDecryption(
9744 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9745 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9746
9747 EXPECT_EQ(0u, visitor_.streams_blocked_frame_.stream_count);
9748 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
9749
9750 CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
9751 }
9752
TEST_P(QuicFramerTest,BuildBiDiStreamsBlockedPacket)9753 TEST_P(QuicFramerTest, BuildBiDiStreamsBlockedPacket) {
9754 // This frame is only for IETF QUIC.
9755 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9756 return;
9757 }
9758
9759 QuicPacketHeader header;
9760 header.destination_connection_id = FramerTestConnectionId();
9761 header.reset_flag = false;
9762 header.version_flag = false;
9763 header.packet_number = kPacketNumber;
9764
9765 QuicStreamsBlockedFrame frame;
9766 frame.stream_count = 3;
9767 frame.unidirectional = false;
9768
9769 QuicFrames frames = {QuicFrame(frame)};
9770
9771 // clang-format off
9772 unsigned char packet_ietf[] = {
9773 // type (short header, 4 byte packet number)
9774 0x43,
9775 // connection_id
9776 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9777 // packet number
9778 0x12, 0x34, 0x56, 0x78,
9779
9780 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
9781 0x16,
9782 // Stream count
9783 kVarInt62OneByte + 0x03
9784 };
9785 // clang-format on
9786
9787 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9788 ASSERT_TRUE(data != nullptr);
9789
9790 quiche::test::CompareCharArraysWithHexError(
9791 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9792 ABSL_ARRAYSIZE(packet_ietf));
9793 }
9794
TEST_P(QuicFramerTest,BuildUniStreamsBlockedPacket)9795 TEST_P(QuicFramerTest, BuildUniStreamsBlockedPacket) {
9796 // This frame is only for IETF QUIC.
9797 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9798 return;
9799 }
9800
9801 QuicPacketHeader header;
9802 header.destination_connection_id = FramerTestConnectionId();
9803 header.reset_flag = false;
9804 header.version_flag = false;
9805 header.packet_number = kPacketNumber;
9806
9807 QuicStreamsBlockedFrame frame;
9808 frame.stream_count = 3;
9809 frame.unidirectional = true;
9810
9811 QuicFrames frames = {QuicFrame(frame)};
9812
9813 // clang-format off
9814 unsigned char packet_ietf[] = {
9815 // type (short header, 4 byte packet number)
9816 0x43,
9817 // connection_id
9818 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9819 // packet number
9820 0x12, 0x34, 0x56, 0x78,
9821
9822 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
9823 0x17,
9824 // Stream count
9825 kVarInt62OneByte + 0x03
9826 };
9827 // clang-format on
9828
9829 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9830 ASSERT_TRUE(data != nullptr);
9831
9832 quiche::test::CompareCharArraysWithHexError(
9833 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9834 ABSL_ARRAYSIZE(packet_ietf));
9835 }
9836
TEST_P(QuicFramerTest,BuildBiDiMaxStreamsPacket)9837 TEST_P(QuicFramerTest, BuildBiDiMaxStreamsPacket) {
9838 // This frame is only for IETF QUIC.
9839 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9840 return;
9841 }
9842
9843 QuicPacketHeader header;
9844 header.destination_connection_id = FramerTestConnectionId();
9845 header.reset_flag = false;
9846 header.version_flag = false;
9847 header.packet_number = kPacketNumber;
9848
9849 QuicMaxStreamsFrame frame;
9850 frame.stream_count = 3;
9851 frame.unidirectional = false;
9852
9853 QuicFrames frames = {QuicFrame(frame)};
9854
9855 // clang-format off
9856 unsigned char packet_ietf[] = {
9857 // type (short header, 4 byte packet number)
9858 0x43,
9859 // connection_id
9860 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9861 // packet number
9862 0x12, 0x34, 0x56, 0x78,
9863
9864 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL frame)
9865 0x12,
9866 // Stream count
9867 kVarInt62OneByte + 0x03
9868 };
9869 // clang-format on
9870
9871 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9872 ASSERT_TRUE(data != nullptr);
9873
9874 quiche::test::CompareCharArraysWithHexError(
9875 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9876 ABSL_ARRAYSIZE(packet_ietf));
9877 }
9878
TEST_P(QuicFramerTest,BuildUniDiMaxStreamsPacket)9879 TEST_P(QuicFramerTest, BuildUniDiMaxStreamsPacket) {
9880 // This frame is only for IETF QUIC.
9881 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9882 return;
9883 }
9884
9885 // This test runs in client mode.
9886 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9887
9888 QuicPacketHeader header;
9889 header.destination_connection_id = FramerTestConnectionId();
9890 header.reset_flag = false;
9891 header.version_flag = false;
9892 header.packet_number = kPacketNumber;
9893
9894 QuicMaxStreamsFrame frame;
9895 frame.stream_count = 3;
9896 frame.unidirectional = true;
9897
9898 QuicFrames frames = {QuicFrame(frame)};
9899
9900 // clang-format off
9901 unsigned char packet_ietf[] = {
9902 // type (short header, 4 byte packet number)
9903 0x43,
9904 // connection_id
9905 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9906 // packet number
9907 0x12, 0x34, 0x56, 0x78,
9908
9909 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
9910 0x13,
9911 // Stream count
9912 kVarInt62OneByte + 0x03
9913 };
9914 // clang-format on
9915
9916 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9917 ASSERT_TRUE(data != nullptr);
9918
9919 quiche::test::CompareCharArraysWithHexError(
9920 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9921 ABSL_ARRAYSIZE(packet_ietf));
9922 }
9923
TEST_P(QuicFramerTest,NewConnectionIdFrame)9924 TEST_P(QuicFramerTest, NewConnectionIdFrame) {
9925 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9926 // This frame is only for IETF QUIC.
9927 return;
9928 }
9929 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9930 // clang-format off
9931 PacketFragments packet_ietf = {
9932 // type (short header, 4 byte packet number)
9933 {"",
9934 {0x43}},
9935 // connection_id
9936 {"",
9937 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9938 // packet number
9939 {"",
9940 {0x12, 0x34, 0x56, 0x78}},
9941 // frame type (IETF_NEW_CONNECTION_ID frame)
9942 {"",
9943 {0x18}},
9944 // error code
9945 {"Unable to read new connection ID frame sequence number.",
9946 {kVarInt62OneByte + 0x11}},
9947 {"Unable to read new connection ID frame retire_prior_to.",
9948 {kVarInt62OneByte + 0x09}},
9949 {"Unable to read new connection ID frame connection id.",
9950 {0x08}}, // connection ID length
9951 {"Unable to read new connection ID frame connection id.",
9952 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11}},
9953 {"Can not read new connection ID frame reset token.",
9954 {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
9955 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}}
9956 };
9957 // clang-format on
9958
9959 std::unique_ptr<QuicEncryptedPacket> encrypted(
9960 AssemblePacketFromFragments(packet_ietf));
9961 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9962
9963 EXPECT_THAT(framer_.error(), IsQuicNoError());
9964 ASSERT_TRUE(visitor_.header_.get());
9965 EXPECT_TRUE(CheckDecryption(
9966 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9967 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9968
9969 EXPECT_EQ(0u, visitor_.stream_frames_.size());
9970
9971 EXPECT_EQ(FramerTestConnectionIdPlusOne(),
9972 visitor_.new_connection_id_.connection_id);
9973 EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
9974 EXPECT_EQ(0x09u, visitor_.new_connection_id_.retire_prior_to);
9975 EXPECT_EQ(kTestStatelessResetToken,
9976 visitor_.new_connection_id_.stateless_reset_token);
9977
9978 ASSERT_EQ(0u, visitor_.ack_frames_.size());
9979
9980 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
9981 }
9982
TEST_P(QuicFramerTest,NewConnectionIdFrameVariableLength)9983 TEST_P(QuicFramerTest, NewConnectionIdFrameVariableLength) {
9984 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9985 // This frame is only for IETF QUIC.
9986 return;
9987 }
9988 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9989 // clang-format off
9990 PacketFragments packet_ietf = {
9991 // type (short header, 4 byte packet number)
9992 {"",
9993 {0x43}},
9994 // connection_id
9995 {"",
9996 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9997 // packet number
9998 {"",
9999 {0x12, 0x34, 0x56, 0x78}},
10000 // frame type (IETF_NEW_CONNECTION_ID frame)
10001 {"",
10002 {0x18}},
10003 // error code
10004 {"Unable to read new connection ID frame sequence number.",
10005 {kVarInt62OneByte + 0x11}},
10006 {"Unable to read new connection ID frame retire_prior_to.",
10007 {kVarInt62OneByte + 0x0a}},
10008 {"Unable to read new connection ID frame connection id.",
10009 {0x09}}, // connection ID length
10010 {"Unable to read new connection ID frame connection id.",
10011 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
10012 {"Can not read new connection ID frame reset token.",
10013 {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
10014 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}}
10015 };
10016 // clang-format on
10017
10018 std::unique_ptr<QuicEncryptedPacket> encrypted(
10019 AssemblePacketFromFragments(packet_ietf));
10020 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10021
10022 EXPECT_THAT(framer_.error(), IsQuicNoError());
10023 ASSERT_TRUE(visitor_.header_.get());
10024 EXPECT_TRUE(CheckDecryption(
10025 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10026 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10027
10028 EXPECT_EQ(0u, visitor_.stream_frames_.size());
10029
10030 EXPECT_EQ(FramerTestConnectionIdNineBytes(),
10031 visitor_.new_connection_id_.connection_id);
10032 EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
10033 EXPECT_EQ(0x0au, visitor_.new_connection_id_.retire_prior_to);
10034 EXPECT_EQ(kTestStatelessResetToken,
10035 visitor_.new_connection_id_.stateless_reset_token);
10036
10037 ASSERT_EQ(0u, visitor_.ack_frames_.size());
10038
10039 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
10040 }
10041
10042 // Verifies that parsing a NEW_CONNECTION_ID frame with a length above the
10043 // specified maximum fails.
TEST_P(QuicFramerTest,InvalidLongNewConnectionIdFrame)10044 TEST_P(QuicFramerTest, InvalidLongNewConnectionIdFrame) {
10045 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10046 // The NEW_CONNECTION_ID frame is only for IETF QUIC.
10047 return;
10048 }
10049 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10050 // clang-format off
10051 PacketFragments packet_ietf = {
10052 // type (short header, 4 byte packet number)
10053 {"",
10054 {0x43}},
10055 // connection_id
10056 {"",
10057 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10058 // packet number
10059 {"",
10060 {0x12, 0x34, 0x56, 0x78}},
10061 // frame type (IETF_NEW_CONNECTION_ID frame)
10062 {"",
10063 {0x18}},
10064 // error code
10065 {"Unable to read new connection ID frame sequence number.",
10066 {kVarInt62OneByte + 0x11}},
10067 {"Unable to read new connection ID frame retire_prior_to.",
10068 {kVarInt62OneByte + 0x0b}},
10069 {"Unable to read new connection ID frame connection id.",
10070 {0x40}}, // connection ID length
10071 {"Unable to read new connection ID frame connection id.",
10072 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10073 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10074 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10075 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10076 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10077 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10078 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10079 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E}},
10080 {"Can not read new connection ID frame reset token.",
10081 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10082 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10083 };
10084 // clang-format on
10085
10086 std::unique_ptr<QuicEncryptedPacket> encrypted(
10087 AssemblePacketFromFragments(packet_ietf));
10088 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10089 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_NEW_CONNECTION_ID_DATA));
10090 EXPECT_EQ("Invalid new connection ID length for version.",
10091 framer_.detailed_error());
10092 }
10093
10094 // Verifies that parsing a NEW_CONNECTION_ID frame with an invalid
10095 // retire-prior-to fails.
TEST_P(QuicFramerTest,InvalidRetirePriorToNewConnectionIdFrame)10096 TEST_P(QuicFramerTest, InvalidRetirePriorToNewConnectionIdFrame) {
10097 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10098 // This frame is only for IETF QUIC only.
10099 return;
10100 }
10101 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10102 // clang-format off
10103 PacketFragments packet_ietf = {
10104 // type (short header, 4 byte packet number)
10105 {"",
10106 {0x43}},
10107 // connection_id
10108 {"",
10109 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10110 // packet number
10111 {"",
10112 {0x12, 0x34, 0x56, 0x78}},
10113 // frame type (IETF_NEW_CONNECTION_ID frame)
10114 {"",
10115 {0x18}},
10116 // sequence number
10117 {"Unable to read new connection ID frame sequence number.",
10118 {kVarInt62OneByte + 0x11}},
10119 {"Unable to read new connection ID frame retire_prior_to.",
10120 {kVarInt62OneByte + 0x1b}},
10121 {"Unable to read new connection ID frame connection id length.",
10122 {0x08}}, // connection ID length
10123 {"Unable to read new connection ID frame connection id.",
10124 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11}},
10125 {"Can not read new connection ID frame reset token.",
10126 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10127 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10128 };
10129 // clang-format on
10130
10131 std::unique_ptr<QuicEncryptedPacket> encrypted(
10132 AssemblePacketFromFragments(packet_ietf));
10133 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10134 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_NEW_CONNECTION_ID_DATA));
10135 EXPECT_EQ("Retire_prior_to > sequence_number.", framer_.detailed_error());
10136 }
10137
TEST_P(QuicFramerTest,BuildNewConnectionIdFramePacket)10138 TEST_P(QuicFramerTest, BuildNewConnectionIdFramePacket) {
10139 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10140 // This frame is only for IETF QUIC only.
10141 return;
10142 }
10143 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10144 QuicPacketHeader header;
10145 header.destination_connection_id = FramerTestConnectionId();
10146 header.reset_flag = false;
10147 header.version_flag = false;
10148 header.packet_number = kPacketNumber;
10149
10150 QuicNewConnectionIdFrame frame;
10151 frame.sequence_number = 0x11;
10152 frame.retire_prior_to = 0x0c;
10153 // Use this value to force a 4-byte encoded variable length connection ID
10154 // in the frame.
10155 frame.connection_id = FramerTestConnectionIdPlusOne();
10156 frame.stateless_reset_token = kTestStatelessResetToken;
10157
10158 QuicFrames frames = {QuicFrame(&frame)};
10159
10160 // clang-format off
10161 unsigned char packet_ietf[] = {
10162 // type (short header, 4 byte packet number)
10163 0x43,
10164 // connection_id
10165 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10166 // packet number
10167 0x12, 0x34, 0x56, 0x78,
10168
10169 // frame type (IETF_NEW_CONNECTION_ID frame)
10170 0x18,
10171 // sequence number
10172 kVarInt62OneByte + 0x11,
10173 // retire_prior_to
10174 kVarInt62OneByte + 0x0c,
10175 // new connection id length
10176 0x08,
10177 // new connection id
10178 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
10179 // stateless reset token
10180 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
10181 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
10182 };
10183 // clang-format on
10184
10185 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10186 ASSERT_TRUE(data != nullptr);
10187
10188 quiche::test::CompareCharArraysWithHexError(
10189 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10190 ABSL_ARRAYSIZE(packet_ietf));
10191 }
10192
TEST_P(QuicFramerTest,NewTokenFrame)10193 TEST_P(QuicFramerTest, NewTokenFrame) {
10194 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10195 // This frame is only for IETF QUIC only.
10196 return;
10197 }
10198 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10199 // clang-format off
10200 PacketFragments packet = {
10201 // type (short header, 4 byte packet number)
10202 {"",
10203 {0x43}},
10204 // connection_id
10205 {"",
10206 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10207 // packet number
10208 {"",
10209 {0x12, 0x34, 0x56, 0x78}},
10210 // frame type (IETF_NEW_TOKEN frame)
10211 {"",
10212 {0x07}},
10213 // Length
10214 {"Unable to read new token length.",
10215 {kVarInt62OneByte + 0x08}},
10216 {"Unable to read new token data.",
10217 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}}
10218 };
10219 // clang-format on
10220 uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
10221 0x04, 0x05, 0x06, 0x07};
10222
10223 std::unique_ptr<QuicEncryptedPacket> encrypted(
10224 AssemblePacketFromFragments(packet));
10225 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10226
10227 EXPECT_THAT(framer_.error(), IsQuicNoError());
10228 ASSERT_TRUE(visitor_.header_.get());
10229 EXPECT_TRUE(CheckDecryption(
10230 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10231 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10232
10233 EXPECT_EQ(0u, visitor_.stream_frames_.size());
10234
10235 EXPECT_EQ(sizeof(expected_token_value), visitor_.new_token_.token.length());
10236 EXPECT_EQ(0, memcmp(expected_token_value, visitor_.new_token_.token.data(),
10237 sizeof(expected_token_value)));
10238
10239 CheckFramingBoundaries(packet, QUIC_INVALID_NEW_TOKEN);
10240 }
10241
TEST_P(QuicFramerTest,BuildNewTokenFramePacket)10242 TEST_P(QuicFramerTest, BuildNewTokenFramePacket) {
10243 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10244 // This frame is only for IETF QUIC only.
10245 return;
10246 }
10247 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10248 QuicPacketHeader header;
10249 header.destination_connection_id = FramerTestConnectionId();
10250 header.reset_flag = false;
10251 header.version_flag = false;
10252 header.packet_number = kPacketNumber;
10253
10254 uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
10255 0x04, 0x05, 0x06, 0x07};
10256
10257 QuicNewTokenFrame frame(0,
10258 absl::string_view((const char*)(expected_token_value),
10259 sizeof(expected_token_value)));
10260
10261 QuicFrames frames = {QuicFrame(&frame)};
10262
10263 // clang-format off
10264 unsigned char packet[] = {
10265 // type (short header, 4 byte packet number)
10266 0x43,
10267 // connection_id
10268 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10269 // packet number
10270 0x12, 0x34, 0x56, 0x78,
10271
10272 // frame type (IETF_NEW_TOKEN frame)
10273 0x07,
10274 // Length and token
10275 kVarInt62OneByte + 0x08,
10276 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
10277 };
10278 // clang-format on
10279
10280 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10281 ASSERT_TRUE(data != nullptr);
10282
10283 quiche::test::CompareCharArraysWithHexError(
10284 "constructed packet", data->data(), data->length(), AsChars(packet),
10285 ABSL_ARRAYSIZE(packet));
10286 }
10287
TEST_P(QuicFramerTest,IetfStopSendingFrame)10288 TEST_P(QuicFramerTest, IetfStopSendingFrame) {
10289 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10290 // Stop sending frame is IETF QUIC only.
10291 return;
10292 }
10293 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10294
10295 // clang-format off
10296 PacketFragments packet_ietf = {
10297 // type (short header, 4 byte packet number)
10298 {"",
10299 {0x43}},
10300 // connection_id
10301 {"",
10302 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10303 // packet number
10304 {"",
10305 {0x12, 0x34, 0x9A, 0xBC}},
10306 // frame type (IETF_STOP_SENDING frame)
10307 {"",
10308 {0x05}},
10309 // stream id
10310 {"Unable to read IETF_STOP_SENDING frame stream id/count.",
10311 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
10312 {"Unable to read stop sending application error code.",
10313 {kVarInt62FourBytes + 0x00, 0x00, 0x76, 0x54}},
10314 };
10315 // clang-format on
10316
10317 std::unique_ptr<QuicEncryptedPacket> encrypted(
10318 AssemblePacketFromFragments(packet_ietf));
10319 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10320
10321 EXPECT_THAT(framer_.error(), IsQuicNoError());
10322 ASSERT_TRUE(visitor_.header_.get());
10323 EXPECT_TRUE(CheckDecryption(
10324 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10325 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10326
10327 EXPECT_EQ(kStreamId, visitor_.stop_sending_frame_.stream_id);
10328 EXPECT_EQ(QUIC_STREAM_UNKNOWN_APPLICATION_ERROR_CODE,
10329 visitor_.stop_sending_frame_.error_code);
10330 EXPECT_EQ(static_cast<uint64_t>(0x7654),
10331 visitor_.stop_sending_frame_.ietf_error_code);
10332
10333 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_STOP_SENDING_FRAME_DATA);
10334 }
10335
TEST_P(QuicFramerTest,BuildIetfStopSendingPacket)10336 TEST_P(QuicFramerTest, BuildIetfStopSendingPacket) {
10337 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10338 // Stop sending frame is IETF QUIC only.
10339 return;
10340 }
10341
10342 QuicPacketHeader header;
10343 header.destination_connection_id = FramerTestConnectionId();
10344 header.reset_flag = false;
10345 header.version_flag = false;
10346 header.packet_number = kPacketNumber;
10347
10348 QuicStopSendingFrame frame;
10349 frame.stream_id = kStreamId;
10350 frame.error_code = QUIC_STREAM_ENCODER_STREAM_ERROR;
10351 frame.ietf_error_code =
10352 static_cast<uint64_t>(QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR);
10353 QuicFrames frames = {QuicFrame(frame)};
10354
10355 // clang-format off
10356 unsigned char packet_ietf[] = {
10357 // type (short header, 4 byte packet number)
10358 0x43,
10359 // connection_id
10360 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10361 // packet number
10362 0x12, 0x34, 0x56, 0x78,
10363
10364 // frame type (IETF_STOP_SENDING frame)
10365 0x05,
10366 // Stream ID
10367 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
10368 // Application error code
10369 kVarInt62TwoBytes + 0x02, 0x01,
10370 };
10371 // clang-format on
10372
10373 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10374 ASSERT_TRUE(data != nullptr);
10375
10376 quiche::test::CompareCharArraysWithHexError(
10377 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10378 ABSL_ARRAYSIZE(packet_ietf));
10379 }
10380
TEST_P(QuicFramerTest,IetfPathChallengeFrame)10381 TEST_P(QuicFramerTest, IetfPathChallengeFrame) {
10382 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10383 // Path Challenge frame is IETF QUIC only.
10384 return;
10385 }
10386 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10387
10388 // clang-format off
10389 PacketFragments packet_ietf = {
10390 // type (short header, 4 byte packet number)
10391 {"",
10392 {0x43}},
10393 // connection_id
10394 {"",
10395 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10396 // packet number
10397 {"",
10398 {0x12, 0x34, 0x9A, 0xBC}},
10399 // frame type (IETF_PATH_CHALLENGE)
10400 {"",
10401 {0x1a}},
10402 // data
10403 {"Can not read path challenge data.",
10404 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
10405 };
10406 // clang-format on
10407
10408 std::unique_ptr<QuicEncryptedPacket> encrypted(
10409 AssemblePacketFromFragments(packet_ietf));
10410 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10411
10412 EXPECT_THAT(framer_.error(), IsQuicNoError());
10413 ASSERT_TRUE(visitor_.header_.get());
10414 EXPECT_TRUE(CheckDecryption(
10415 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10416 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10417
10418 EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
10419 visitor_.path_challenge_frame_.data_buffer);
10420
10421 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_PATH_CHALLENGE_DATA);
10422 }
10423
TEST_P(QuicFramerTest,BuildIetfPathChallengePacket)10424 TEST_P(QuicFramerTest, BuildIetfPathChallengePacket) {
10425 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10426 // Path Challenge frame is IETF QUIC only.
10427 return;
10428 }
10429
10430 QuicPacketHeader header;
10431 header.destination_connection_id = FramerTestConnectionId();
10432 header.reset_flag = false;
10433 header.version_flag = false;
10434 header.packet_number = kPacketNumber;
10435
10436 QuicPathChallengeFrame frame;
10437 frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
10438 QuicFrames frames = {QuicFrame(frame)};
10439
10440 // clang-format off
10441 unsigned char packet_ietf[] = {
10442 // type (short header, 4 byte packet number)
10443 0x43,
10444 // connection_id
10445 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10446 // packet number
10447 0x12, 0x34, 0x56, 0x78,
10448
10449 // frame type (IETF_PATH_CHALLENGE)
10450 0x1a,
10451 // Data
10452 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
10453 };
10454 // clang-format on
10455
10456 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10457 ASSERT_TRUE(data != nullptr);
10458
10459 quiche::test::CompareCharArraysWithHexError(
10460 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10461 ABSL_ARRAYSIZE(packet_ietf));
10462 }
10463
TEST_P(QuicFramerTest,IetfPathResponseFrame)10464 TEST_P(QuicFramerTest, IetfPathResponseFrame) {
10465 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10466 // Path response frame is IETF QUIC only.
10467 return;
10468 }
10469 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10470
10471 // clang-format off
10472 PacketFragments packet_ietf = {
10473 // type (short header, 4 byte packet number)
10474 {"",
10475 {0x43}},
10476 // connection_id
10477 {"",
10478 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10479 // packet number
10480 {"",
10481 {0x12, 0x34, 0x9A, 0xBC}},
10482 // frame type (IETF_PATH_RESPONSE)
10483 {"",
10484 {0x1b}},
10485 // data
10486 {"Can not read path response data.",
10487 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
10488 };
10489 // clang-format on
10490
10491 std::unique_ptr<QuicEncryptedPacket> encrypted(
10492 AssemblePacketFromFragments(packet_ietf));
10493 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10494
10495 EXPECT_THAT(framer_.error(), IsQuicNoError());
10496 ASSERT_TRUE(visitor_.header_.get());
10497 EXPECT_TRUE(CheckDecryption(
10498 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10499 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10500
10501 EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
10502 visitor_.path_response_frame_.data_buffer);
10503
10504 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_PATH_RESPONSE_DATA);
10505 }
10506
TEST_P(QuicFramerTest,BuildIetfPathResponsePacket)10507 TEST_P(QuicFramerTest, BuildIetfPathResponsePacket) {
10508 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10509 // Path response frame is IETF QUIC only
10510 return;
10511 }
10512
10513 QuicPacketHeader header;
10514 header.destination_connection_id = FramerTestConnectionId();
10515 header.reset_flag = false;
10516 header.version_flag = false;
10517 header.packet_number = kPacketNumber;
10518
10519 QuicPathResponseFrame frame;
10520 frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
10521 QuicFrames frames = {QuicFrame(frame)};
10522
10523 // clang-format off
10524 unsigned char packet_ietf[] = {
10525 // type (short header, 4 byte packet number)
10526 0x43,
10527 // connection_id
10528 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10529 // packet number
10530 0x12, 0x34, 0x56, 0x78,
10531
10532 // frame type (IETF_PATH_RESPONSE)
10533 0x1b,
10534 // Data
10535 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
10536 };
10537 // clang-format on
10538
10539 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10540 ASSERT_TRUE(data != nullptr);
10541
10542 quiche::test::CompareCharArraysWithHexError(
10543 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10544 ABSL_ARRAYSIZE(packet_ietf));
10545 }
10546
TEST_P(QuicFramerTest,GetRetransmittableControlFrameSize)10547 TEST_P(QuicFramerTest, GetRetransmittableControlFrameSize) {
10548 QuicRstStreamFrame rst_stream(1, 3, QUIC_STREAM_CANCELLED, 1024);
10549 EXPECT_EQ(QuicFramer::GetRstStreamFrameSize(framer_.transport_version(),
10550 rst_stream),
10551 QuicFramer::GetRetransmittableControlFrameSize(
10552 framer_.transport_version(), QuicFrame(&rst_stream)));
10553
10554 std::string error_detail(2048, 'e');
10555 QuicConnectionCloseFrame connection_close(framer_.transport_version(),
10556 QUIC_NETWORK_IDLE_TIMEOUT,
10557 NO_IETF_QUIC_ERROR, error_detail,
10558 /*transport_close_frame_type=*/0);
10559
10560 EXPECT_EQ(QuicFramer::GetConnectionCloseFrameSize(framer_.transport_version(),
10561 connection_close),
10562 QuicFramer::GetRetransmittableControlFrameSize(
10563 framer_.transport_version(), QuicFrame(&connection_close)));
10564
10565 QuicGoAwayFrame goaway(2, QUIC_PEER_GOING_AWAY, 3, error_detail);
10566 EXPECT_EQ(QuicFramer::GetMinGoAwayFrameSize() + 256,
10567 QuicFramer::GetRetransmittableControlFrameSize(
10568 framer_.transport_version(), QuicFrame(&goaway)));
10569
10570 QuicWindowUpdateFrame window_update(3, 3, 1024);
10571 EXPECT_EQ(QuicFramer::GetWindowUpdateFrameSize(framer_.transport_version(),
10572 window_update),
10573 QuicFramer::GetRetransmittableControlFrameSize(
10574 framer_.transport_version(), QuicFrame(window_update)));
10575
10576 QuicBlockedFrame blocked(4, 3, 1024);
10577 EXPECT_EQ(
10578 QuicFramer::GetBlockedFrameSize(framer_.transport_version(), blocked),
10579 QuicFramer::GetRetransmittableControlFrameSize(
10580 framer_.transport_version(), QuicFrame(blocked)));
10581
10582 // Following frames are IETF QUIC frames only.
10583 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10584 return;
10585 }
10586
10587 QuicNewConnectionIdFrame new_connection_id(5, TestConnectionId(), 1,
10588 kTestStatelessResetToken, 1);
10589 EXPECT_EQ(QuicFramer::GetNewConnectionIdFrameSize(new_connection_id),
10590 QuicFramer::GetRetransmittableControlFrameSize(
10591 framer_.transport_version(), QuicFrame(&new_connection_id)));
10592
10593 QuicMaxStreamsFrame max_streams(6, 3, /*unidirectional=*/false);
10594 EXPECT_EQ(QuicFramer::GetMaxStreamsFrameSize(framer_.transport_version(),
10595 max_streams),
10596 QuicFramer::GetRetransmittableControlFrameSize(
10597 framer_.transport_version(), QuicFrame(max_streams)));
10598
10599 QuicStreamsBlockedFrame streams_blocked(7, 3, /*unidirectional=*/false);
10600 EXPECT_EQ(QuicFramer::GetStreamsBlockedFrameSize(framer_.transport_version(),
10601 streams_blocked),
10602 QuicFramer::GetRetransmittableControlFrameSize(
10603 framer_.transport_version(), QuicFrame(streams_blocked)));
10604
10605 QuicPathFrameBuffer buffer = {
10606 {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
10607 QuicPathResponseFrame path_response_frame(8, buffer);
10608 EXPECT_EQ(QuicFramer::GetPathResponseFrameSize(path_response_frame),
10609 QuicFramer::GetRetransmittableControlFrameSize(
10610 framer_.transport_version(), QuicFrame(path_response_frame)));
10611
10612 QuicPathChallengeFrame path_challenge_frame(9, buffer);
10613 EXPECT_EQ(QuicFramer::GetPathChallengeFrameSize(path_challenge_frame),
10614 QuicFramer::GetRetransmittableControlFrameSize(
10615 framer_.transport_version(), QuicFrame(path_challenge_frame)));
10616
10617 QuicStopSendingFrame stop_sending_frame(10, 3, QUIC_STREAM_CANCELLED);
10618 EXPECT_EQ(QuicFramer::GetStopSendingFrameSize(stop_sending_frame),
10619 QuicFramer::GetRetransmittableControlFrameSize(
10620 framer_.transport_version(), QuicFrame(stop_sending_frame)));
10621 }
10622
10623 // A set of tests to ensure that bad frame-type encodings
10624 // are properly detected and handled.
10625 // First, four tests to see that unknown frame types generate
10626 // a QUIC_INVALID_FRAME_DATA error with detailed information
10627 // "Illegal frame type." This regardless of the encoding of the type
10628 // (1/2/4/8 bytes).
10629 // This only for version 99.
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorUnknown1Byte)10630 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown1Byte) {
10631 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10632 // Only IETF QUIC encodes frame types such that this test is relevant.
10633 return;
10634 }
10635 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10636 // clang-format off
10637 PacketFragments packet = {
10638 // type (short header, 4 byte packet number)
10639 {"",
10640 {0x43}},
10641 // connection_id
10642 {"",
10643 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10644 // packet number
10645 {"",
10646 {0x12, 0x34, 0x9A, 0xBC}},
10647 // frame type (unknown value, single-byte encoding)
10648 {"",
10649 {0x38}}
10650 };
10651 // clang-format on
10652
10653 std::unique_ptr<QuicEncryptedPacket> encrypted(
10654 AssemblePacketFromFragments(packet));
10655
10656 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10657
10658 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
10659 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
10660 }
10661
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorUnknown2Bytes)10662 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown2Bytes) {
10663 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10664 // Only IETF QUIC encodes frame types such that this test is relevant.
10665 return;
10666 }
10667 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10668
10669 // clang-format off
10670 PacketFragments packet = {
10671 // type (short header, 4 byte packet number)
10672 {"",
10673 {0x43}},
10674 // connection_id
10675 {"",
10676 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10677 // packet number
10678 {"",
10679 {0x12, 0x34, 0x9A, 0xBC}},
10680 // frame type (unknown value, two-byte encoding)
10681 {"",
10682 {kVarInt62TwoBytes + 0x01, 0x38}}
10683 };
10684 // clang-format on
10685
10686 std::unique_ptr<QuicEncryptedPacket> encrypted(
10687 AssemblePacketFromFragments(packet));
10688
10689 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10690
10691 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
10692 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
10693 }
10694
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorUnknown4Bytes)10695 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown4Bytes) {
10696 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10697 // Only IETF QUIC encodes frame types such that this test is relevant.
10698 return;
10699 }
10700 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10701
10702 // clang-format off
10703 PacketFragments packet = {
10704 // type (short header, 4 byte packet number)
10705 {"",
10706 {0x43}},
10707 // connection_id
10708 {"",
10709 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10710 // packet number
10711 {"",
10712 {0x12, 0x34, 0x9A, 0xBC}},
10713 // frame type (unknown value, four-byte encoding)
10714 {"",
10715 {kVarInt62FourBytes + 0x01, 0x00, 0x00, 0x38}}
10716 };
10717 // clang-format on
10718
10719 std::unique_ptr<QuicEncryptedPacket> encrypted(
10720 AssemblePacketFromFragments(packet));
10721
10722 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10723
10724 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
10725 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
10726 }
10727
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorUnknown8Bytes)10728 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown8Bytes) {
10729 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10730 // Only IETF QUIC encodes frame types such that this test is relevant.
10731 return;
10732 }
10733 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10734 // clang-format off
10735 PacketFragments packet = {
10736 // type (short header, 4 byte packet number)
10737 {"",
10738 {0x43}},
10739 // connection_id
10740 {"",
10741 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10742 // packet number
10743 {"",
10744 {0x12, 0x34, 0x9A, 0xBC}},
10745 // frame type (unknown value, eight-byte encoding)
10746 {"",
10747 {kVarInt62EightBytes + 0x01, 0x00, 0x00, 0x01, 0x02, 0x34, 0x56, 0x38}}
10748 };
10749 // clang-format on
10750
10751 std::unique_ptr<QuicEncryptedPacket> encrypted(
10752 AssemblePacketFromFragments(packet));
10753
10754 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10755
10756 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
10757 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
10758 }
10759
10760 // Three tests to check that known frame types that are not minimally
10761 // encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
10762 // information "Frame type not minimally encoded."
10763 // Look at the frame-type encoded in 2, 4, and 8 bytes.
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorKnown2Bytes)10764 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2Bytes) {
10765 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10766 // Only IETF QUIC encodes frame types such that this test is relevant.
10767 return;
10768 }
10769 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10770
10771 // clang-format off
10772 PacketFragments packet = {
10773 // type (short header, 4 byte packet number)
10774 {"",
10775 {0x43}},
10776 // connection_id
10777 {"",
10778 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10779 // packet number
10780 {"",
10781 {0x12, 0x34, 0x9A, 0xBC}},
10782 // frame type (Blocked, two-byte encoding)
10783 {"",
10784 {kVarInt62TwoBytes + 0x00, 0x08}}
10785 };
10786 // clang-format on
10787
10788 std::unique_ptr<QuicEncryptedPacket> encrypted(
10789 AssemblePacketFromFragments(packet));
10790
10791 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10792
10793 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
10794 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
10795 }
10796
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorKnown4Bytes)10797 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown4Bytes) {
10798 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10799 // Only IETF QUIC encodes frame types such that this test is relevant.
10800 return;
10801 }
10802 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10803
10804 // clang-format off
10805 PacketFragments packet = {
10806 // type (short header, 4 byte packet number)
10807 {"",
10808 {0x43}},
10809 // connection_id
10810 {"",
10811 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10812 // packet number
10813 {"",
10814 {0x12, 0x34, 0x9A, 0xBC}},
10815 // frame type (Blocked, four-byte encoding)
10816 {"",
10817 {kVarInt62FourBytes + 0x00, 0x00, 0x00, 0x08}}
10818 };
10819 // clang-format on
10820
10821 std::unique_ptr<QuicEncryptedPacket> encrypted(
10822 AssemblePacketFromFragments(packet));
10823
10824 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10825
10826 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
10827 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
10828 }
10829
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorKnown8Bytes)10830 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown8Bytes) {
10831 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10832 // Only IETF QUIC encodes frame types such that this test is relevant.
10833 return;
10834 }
10835 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10836 // clang-format off
10837 PacketFragments packet = {
10838 // type (short header, 4 byte packet number)
10839 {"",
10840 {0x43}},
10841 // connection_id
10842 {"",
10843 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10844 // packet number
10845 {"",
10846 {0x12, 0x34, 0x9A, 0xBC}},
10847 // frame type (Blocked, eight-byte encoding)
10848 {"",
10849 {kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08}}
10850 };
10851 // clang-format on
10852
10853 std::unique_ptr<QuicEncryptedPacket> encrypted(
10854 AssemblePacketFromFragments(packet));
10855
10856 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10857
10858 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
10859 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
10860 }
10861
10862 // Tests to check that all known IETF frame types that are not minimally
10863 // encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
10864 // information "Frame type not minimally encoded."
10865 // Just look at 2-byte encoding.
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorKnown2BytesAllTypes)10866 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2BytesAllTypes) {
10867 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10868 // Only IETF QUIC encodes frame types such that this test is relevant.
10869 return;
10870 }
10871 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10872
10873 // clang-format off
10874 PacketFragments packets[] = {
10875 {
10876 // type (short header, 4 byte packet number)
10877 {"",
10878 {0x43}},
10879 // connection_id
10880 {"",
10881 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10882 // packet number
10883 {"",
10884 {0x12, 0x34, 0x9A, 0xBC}},
10885 // frame type (two-byte encoding)
10886 {"",
10887 {kVarInt62TwoBytes + 0x00, 0x00}}
10888 },
10889 {
10890 // type (short header, 4 byte packet number)
10891 {"",
10892 {0x43}},
10893 // connection_id
10894 {"",
10895 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10896 // packet number
10897 {"",
10898 {0x12, 0x34, 0x9A, 0xBC}},
10899 // frame type (two-byte encoding)
10900 {"",
10901 {kVarInt62TwoBytes + 0x00, 0x01}}
10902 },
10903 {
10904 // type (short header, 4 byte packet number)
10905 {"",
10906 {0x43}},
10907 // connection_id
10908 {"",
10909 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10910 // packet number
10911 {"",
10912 {0x12, 0x34, 0x9A, 0xBC}},
10913 // frame type (two-byte encoding)
10914 {"",
10915 {kVarInt62TwoBytes + 0x00, 0x02}}
10916 },
10917 {
10918 // type (short header, 4 byte packet number)
10919 {"",
10920 {0x43}},
10921 // connection_id
10922 {"",
10923 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10924 // packet number
10925 {"",
10926 {0x12, 0x34, 0x9A, 0xBC}},
10927 // frame type (two-byte encoding)
10928 {"",
10929 {kVarInt62TwoBytes + 0x00, 0x03}}
10930 },
10931 {
10932 // type (short header, 4 byte packet number)
10933 {"",
10934 {0x43}},
10935 // connection_id
10936 {"",
10937 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10938 // packet number
10939 {"",
10940 {0x12, 0x34, 0x9A, 0xBC}},
10941 // frame type (two-byte encoding)
10942 {"",
10943 {kVarInt62TwoBytes + 0x00, 0x04}}
10944 },
10945 {
10946 // type (short header, 4 byte packet number)
10947 {"",
10948 {0x43}},
10949 // connection_id
10950 {"",
10951 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10952 // packet number
10953 {"",
10954 {0x12, 0x34, 0x9A, 0xBC}},
10955 // frame type (two-byte encoding)
10956 {"",
10957 {kVarInt62TwoBytes + 0x00, 0x05}}
10958 },
10959 {
10960 // type (short header, 4 byte packet number)
10961 {"",
10962 {0x43}},
10963 // connection_id
10964 {"",
10965 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10966 // packet number
10967 {"",
10968 {0x12, 0x34, 0x9A, 0xBC}},
10969 // frame type (two-byte encoding)
10970 {"",
10971 {kVarInt62TwoBytes + 0x00, 0x06}}
10972 },
10973 {
10974 // type (short header, 4 byte packet number)
10975 {"",
10976 {0x43}},
10977 // connection_id
10978 {"",
10979 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10980 // packet number
10981 {"",
10982 {0x12, 0x34, 0x9A, 0xBC}},
10983 // frame type (two-byte encoding)
10984 {"",
10985 {kVarInt62TwoBytes + 0x00, 0x07}}
10986 },
10987 {
10988 // type (short header, 4 byte packet number)
10989 {"",
10990 {0x43}},
10991 // connection_id
10992 {"",
10993 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10994 // packet number
10995 {"",
10996 {0x12, 0x34, 0x9A, 0xBC}},
10997 // frame type (two-byte encoding)
10998 {"",
10999 {kVarInt62TwoBytes + 0x00, 0x08}}
11000 },
11001 {
11002 // type (short header, 4 byte packet number)
11003 {"",
11004 {0x43}},
11005 // connection_id
11006 {"",
11007 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11008 // packet number
11009 {"",
11010 {0x12, 0x34, 0x9A, 0xBC}},
11011 // frame type (two-byte encoding)
11012 {"",
11013 {kVarInt62TwoBytes + 0x00, 0x09}}
11014 },
11015 {
11016 // type (short header, 4 byte packet number)
11017 {"",
11018 {0x43}},
11019 // connection_id
11020 {"",
11021 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11022 // packet number
11023 {"",
11024 {0x12, 0x34, 0x9A, 0xBC}},
11025 // frame type (two-byte encoding)
11026 {"",
11027 {kVarInt62TwoBytes + 0x00, 0x0a}}
11028 },
11029 {
11030 // type (short header, 4 byte packet number)
11031 {"",
11032 {0x43}},
11033 // connection_id
11034 {"",
11035 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11036 // packet number
11037 {"",
11038 {0x12, 0x34, 0x9A, 0xBC}},
11039 // frame type (two-byte encoding)
11040 {"",
11041 {kVarInt62TwoBytes + 0x00, 0x0b}}
11042 },
11043 {
11044 // type (short header, 4 byte packet number)
11045 {"",
11046 {0x43}},
11047 // connection_id
11048 {"",
11049 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11050 // packet number
11051 {"",
11052 {0x12, 0x34, 0x9A, 0xBC}},
11053 // frame type (two-byte encoding)
11054 {"",
11055 {kVarInt62TwoBytes + 0x00, 0x0c}}
11056 },
11057 {
11058 // type (short header, 4 byte packet number)
11059 {"",
11060 {0x43}},
11061 // connection_id
11062 {"",
11063 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11064 // packet number
11065 {"",
11066 {0x12, 0x34, 0x9A, 0xBC}},
11067 // frame type (two-byte encoding)
11068 {"",
11069 {kVarInt62TwoBytes + 0x00, 0x0d}}
11070 },
11071 {
11072 // type (short header, 4 byte packet number)
11073 {"",
11074 {0x43}},
11075 // connection_id
11076 {"",
11077 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11078 // packet number
11079 {"",
11080 {0x12, 0x34, 0x9A, 0xBC}},
11081 // frame type (two-byte encoding)
11082 {"",
11083 {kVarInt62TwoBytes + 0x00, 0x0e}}
11084 },
11085 {
11086 // type (short header, 4 byte packet number)
11087 {"",
11088 {0x43}},
11089 // connection_id
11090 {"",
11091 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11092 // packet number
11093 {"",
11094 {0x12, 0x34, 0x9A, 0xBC}},
11095 // frame type (two-byte encoding)
11096 {"",
11097 {kVarInt62TwoBytes + 0x00, 0x0f}}
11098 },
11099 {
11100 // type (short header, 4 byte packet number)
11101 {"",
11102 {0x43}},
11103 // connection_id
11104 {"",
11105 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11106 // packet number
11107 {"",
11108 {0x12, 0x34, 0x9A, 0xBC}},
11109 // frame type (two-byte encoding)
11110 {"",
11111 {kVarInt62TwoBytes + 0x00, 0x10}}
11112 },
11113 {
11114 // type (short header, 4 byte packet number)
11115 {"",
11116 {0x43}},
11117 // connection_id
11118 {"",
11119 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11120 // packet number
11121 {"",
11122 {0x12, 0x34, 0x9A, 0xBC}},
11123 // frame type (two-byte encoding)
11124 {"",
11125 {kVarInt62TwoBytes + 0x00, 0x11}}
11126 },
11127 {
11128 // type (short header, 4 byte packet number)
11129 {"",
11130 {0x43}},
11131 // connection_id
11132 {"",
11133 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11134 // packet number
11135 {"",
11136 {0x12, 0x34, 0x9A, 0xBC}},
11137 // frame type (two-byte encoding)
11138 {"",
11139 {kVarInt62TwoBytes + 0x00, 0x12}}
11140 },
11141 {
11142 // type (short header, 4 byte packet number)
11143 {"",
11144 {0x43}},
11145 // connection_id
11146 {"",
11147 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11148 // packet number
11149 {"",
11150 {0x12, 0x34, 0x9A, 0xBC}},
11151 // frame type (two-byte encoding)
11152 {"",
11153 {kVarInt62TwoBytes + 0x00, 0x13}}
11154 },
11155 {
11156 // type (short header, 4 byte packet number)
11157 {"",
11158 {0x43}},
11159 // connection_id
11160 {"",
11161 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11162 // packet number
11163 {"",
11164 {0x12, 0x34, 0x9A, 0xBC}},
11165 // frame type (two-byte encoding)
11166 {"",
11167 {kVarInt62TwoBytes + 0x00, 0x14}}
11168 },
11169 {
11170 // type (short header, 4 byte packet number)
11171 {"",
11172 {0x43}},
11173 // connection_id
11174 {"",
11175 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11176 // packet number
11177 {"",
11178 {0x12, 0x34, 0x9A, 0xBC}},
11179 // frame type (two-byte encoding)
11180 {"",
11181 {kVarInt62TwoBytes + 0x00, 0x15}}
11182 },
11183 {
11184 // type (short header, 4 byte packet number)
11185 {"",
11186 {0x43}},
11187 // connection_id
11188 {"",
11189 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11190 // packet number
11191 {"",
11192 {0x12, 0x34, 0x9A, 0xBC}},
11193 // frame type (two-byte encoding)
11194 {"",
11195 {kVarInt62TwoBytes + 0x00, 0x16}}
11196 },
11197 {
11198 // type (short header, 4 byte packet number)
11199 {"",
11200 {0x43}},
11201 // connection_id
11202 {"",
11203 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11204 // packet number
11205 {"",
11206 {0x12, 0x34, 0x9A, 0xBC}},
11207 // frame type (two-byte encoding)
11208 {"",
11209 {kVarInt62TwoBytes + 0x00, 0x17}}
11210 },
11211 {
11212 // type (short header, 4 byte packet number)
11213 {"",
11214 {0x43}},
11215 // connection_id
11216 {"",
11217 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11218 // packet number
11219 {"",
11220 {0x12, 0x34, 0x9A, 0xBC}},
11221 // frame type (two-byte encoding)
11222 {"",
11223 {kVarInt62TwoBytes + 0x00, 0x18}}
11224 },
11225 {
11226 // type (short header, 4 byte packet number)
11227 {"",
11228 {0x43}},
11229 // connection_id
11230 {"",
11231 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11232 // packet number
11233 {"",
11234 {0x12, 0x34, 0x9A, 0xBC}},
11235 // frame type (two-byte encoding)
11236 {"",
11237 {kVarInt62TwoBytes + 0x00, 0x20}}
11238 },
11239 {
11240 // type (short header, 4 byte packet number)
11241 {"",
11242 {0x43}},
11243 // connection_id
11244 {"",
11245 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11246 // packet number
11247 {"",
11248 {0x12, 0x34, 0x9A, 0xBC}},
11249 // frame type (two-byte encoding)
11250 {"",
11251 {kVarInt62TwoBytes + 0x00, 0x21}}
11252 },
11253 };
11254 // clang-format on
11255
11256 for (PacketFragments& packet : packets) {
11257 std::unique_ptr<QuicEncryptedPacket> encrypted(
11258 AssemblePacketFromFragments(packet));
11259
11260 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11261
11262 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
11263 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11264 }
11265 }
11266
TEST_P(QuicFramerTest,RetireConnectionIdFrame)11267 TEST_P(QuicFramerTest, RetireConnectionIdFrame) {
11268 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
11269 // This frame is only for version 99.
11270 return;
11271 }
11272 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11273 // clang-format off
11274 PacketFragments packet_ietf = {
11275 // type (short header, 4 byte packet number)
11276 {"",
11277 {0x43}},
11278 // connection_id
11279 {"",
11280 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11281 // packet number
11282 {"",
11283 {0x12, 0x34, 0x56, 0x78}},
11284 // frame type (IETF_RETIRE_CONNECTION_ID frame)
11285 {"",
11286 {0x19}},
11287 // Sequence number
11288 {"Unable to read retire connection ID frame sequence number.",
11289 {kVarInt62TwoBytes + 0x11, 0x22}}
11290 };
11291 // clang-format on
11292
11293 std::unique_ptr<QuicEncryptedPacket> encrypted(
11294 AssemblePacketFromFragments(packet_ietf));
11295 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11296
11297 EXPECT_THAT(framer_.error(), IsQuicNoError());
11298 ASSERT_TRUE(visitor_.header_.get());
11299 EXPECT_TRUE(CheckDecryption(
11300 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11301 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
11302
11303 EXPECT_EQ(0u, visitor_.stream_frames_.size());
11304
11305 EXPECT_EQ(0x1122u, visitor_.retire_connection_id_.sequence_number);
11306
11307 ASSERT_EQ(0u, visitor_.ack_frames_.size());
11308
11309 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_RETIRE_CONNECTION_ID_DATA);
11310 }
11311
TEST_P(QuicFramerTest,BuildRetireConnectionIdFramePacket)11312 TEST_P(QuicFramerTest, BuildRetireConnectionIdFramePacket) {
11313 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
11314 // This frame is only for version 99.
11315 return;
11316 }
11317 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
11318 QuicPacketHeader header;
11319 header.destination_connection_id = FramerTestConnectionId();
11320 header.reset_flag = false;
11321 header.version_flag = false;
11322 header.packet_number = kPacketNumber;
11323
11324 QuicRetireConnectionIdFrame frame;
11325 frame.sequence_number = 0x1122;
11326
11327 QuicFrames frames = {QuicFrame(&frame)};
11328
11329 // clang-format off
11330 unsigned char packet_ietf[] = {
11331 // type (short header, 4 byte packet number)
11332 0x43,
11333 // connection_id
11334 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11335 // packet number
11336 0x12, 0x34, 0x56, 0x78,
11337
11338 // frame type (IETF_RETIRE_CONNECTION_ID frame)
11339 0x19,
11340 // sequence number
11341 kVarInt62TwoBytes + 0x11, 0x22
11342 };
11343 // clang-format on
11344
11345 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11346 ASSERT_TRUE(data != nullptr);
11347
11348 quiche::test::CompareCharArraysWithHexError(
11349 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
11350 ABSL_ARRAYSIZE(packet_ietf));
11351 }
11352
TEST_P(QuicFramerTest,AckFrameWithInvalidLargestObserved)11353 TEST_P(QuicFramerTest, AckFrameWithInvalidLargestObserved) {
11354 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11355 // clang-format off
11356 unsigned char packet[] = {
11357 // type (short header, 4 byte packet number)
11358 0x43,
11359 // connection_id
11360 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11361 // packet number
11362 0x12, 0x34, 0x56, 0x78,
11363
11364 // frame type (ack frame)
11365 0x45,
11366 // largest observed
11367 0x00, 0x00,
11368 // Zero delta time.
11369 0x00, 0x00,
11370 // first ack block length.
11371 0x00, 0x00,
11372 // num timestamps.
11373 0x00
11374 };
11375
11376 unsigned char packet_ietf[] = {
11377 // type (short header, 4 byte packet number)
11378 0x43,
11379 // connection_id
11380 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11381 // packet number
11382 0x12, 0x34, 0x56, 0x78,
11383
11384 // frame type (IETF_ACK frame)
11385 0x02,
11386 // Largest acked
11387 kVarInt62OneByte + 0x00,
11388 // Zero delta time.
11389 kVarInt62OneByte + 0x00,
11390 // Ack block count 0
11391 kVarInt62OneByte + 0x00,
11392 // First ack block length
11393 kVarInt62OneByte + 0x00,
11394 };
11395 // clang-format on
11396
11397 unsigned char* p = packet;
11398 size_t p_size = ABSL_ARRAYSIZE(packet);
11399 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
11400 p = packet_ietf;
11401 p_size = ABSL_ARRAYSIZE(packet_ietf);
11402 }
11403
11404 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
11405 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
11406 EXPECT_EQ(framer_.detailed_error(), "Largest acked is 0.");
11407 }
11408
TEST_P(QuicFramerTest,FirstAckBlockJustUnderFlow)11409 TEST_P(QuicFramerTest, FirstAckBlockJustUnderFlow) {
11410 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11411 // clang-format off
11412 unsigned char packet[] = {
11413 // type (short header, 4 byte packet number)
11414 0x43,
11415 // connection_id
11416 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11417 // packet number
11418 0x12, 0x34, 0x56, 0x78,
11419
11420 // frame type (ack frame)
11421 0x45,
11422 // largest observed
11423 0x00, 0x02,
11424 // Zero delta time.
11425 0x00, 0x00,
11426 // first ack block length.
11427 0x00, 0x03,
11428 // num timestamps.
11429 0x00
11430 };
11431
11432 unsigned char packet_ietf[] = {
11433 // type (short header, 4 byte packet number)
11434 0x43,
11435 // connection_id
11436 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11437 // packet number
11438 0x12, 0x34, 0x56, 0x78,
11439
11440 // frame type (IETF_ACK frame)
11441 0x02,
11442 // Largest acked
11443 kVarInt62OneByte + 0x02,
11444 // Zero delta time.
11445 kVarInt62OneByte + 0x00,
11446 // Ack block count 0
11447 kVarInt62OneByte + 0x00,
11448 // First ack block length
11449 kVarInt62OneByte + 0x02,
11450 };
11451 // clang-format on
11452
11453 unsigned char* p = packet;
11454 size_t p_size = ABSL_ARRAYSIZE(packet);
11455 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
11456 p = packet_ietf;
11457 p_size = ABSL_ARRAYSIZE(packet_ietf);
11458 }
11459
11460 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
11461 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
11462 EXPECT_EQ(framer_.detailed_error(),
11463 "Underflow with first ack block length 3 largest acked is 2.");
11464 }
11465
TEST_P(QuicFramerTest,ThirdAckBlockJustUnderflow)11466 TEST_P(QuicFramerTest, ThirdAckBlockJustUnderflow) {
11467 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11468 // clang-format off
11469 unsigned char packet[] = {
11470 // type (short header, 4 byte packet number)
11471 0x43,
11472 // connection_id
11473 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11474 // packet number
11475 0x12, 0x34, 0x56, 0x78,
11476
11477 // frame type (ack frame)
11478 0x60,
11479 // largest observed
11480 0x0A,
11481 // Zero delta time.
11482 0x00, 0x00,
11483 // Num of ack blocks
11484 0x02,
11485 // first ack block length.
11486 0x02,
11487 // gap to next block
11488 0x01,
11489 // ack block length
11490 0x01,
11491 // gap to next block
11492 0x01,
11493 // ack block length
11494 0x06,
11495 // num timestamps.
11496 0x00
11497 };
11498
11499 unsigned char packet_ietf[] = {
11500 // type (short header, 4 byte packet number)
11501 0x43,
11502 // connection_id
11503 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11504 // packet number
11505 0x12, 0x34, 0x56, 0x78,
11506
11507 // frame type (IETF_ACK frame)
11508 0x02,
11509 // Largest acked
11510 kVarInt62OneByte + 0x0A,
11511 // Zero delta time.
11512 kVarInt62OneByte + 0x00,
11513 // Ack block count 2
11514 kVarInt62OneByte + 0x02,
11515 // First ack block length
11516 kVarInt62OneByte + 0x01,
11517 // gap to next block length
11518 kVarInt62OneByte + 0x00,
11519 // ack block length
11520 kVarInt62OneByte + 0x00,
11521 // gap to next block length
11522 kVarInt62OneByte + 0x00,
11523 // ack block length
11524 kVarInt62OneByte + 0x05,
11525 };
11526 // clang-format on
11527
11528 unsigned char* p = packet;
11529 size_t p_size = ABSL_ARRAYSIZE(packet);
11530 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
11531 p = packet_ietf;
11532 p_size = ABSL_ARRAYSIZE(packet_ietf);
11533 }
11534
11535 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
11536 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
11537 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
11538 EXPECT_EQ(framer_.detailed_error(),
11539 "Underflow with ack block length 6 latest ack block end is 5.");
11540 } else {
11541 EXPECT_EQ(framer_.detailed_error(),
11542 "Underflow with ack block length 6, end of block is 6.");
11543 }
11544 }
11545
TEST_P(QuicFramerTest,CoalescedPacket)11546 TEST_P(QuicFramerTest, CoalescedPacket) {
11547 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
11548 return;
11549 }
11550 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
11551 // clang-format off
11552 unsigned char packet[] = {
11553 // first coalesced packet
11554 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11555 // 4-byte packet number)
11556 0xD3,
11557 // version
11558 QUIC_VERSION_BYTES,
11559 // destination connection ID length
11560 0x08,
11561 // destination connection ID
11562 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11563 // source connection ID length
11564 0x00,
11565 // long header packet length
11566 0x1E,
11567 // packet number
11568 0x12, 0x34, 0x56, 0x78,
11569 // frame type (stream frame with fin)
11570 0xFE,
11571 // stream id
11572 0x02, 0x03, 0x04,
11573 // offset
11574 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11575 // data length
11576 0x00, 0x0c,
11577 // data
11578 'h', 'e', 'l', 'l',
11579 'o', ' ', 'w', 'o',
11580 'r', 'l', 'd', '!',
11581 // second coalesced packet
11582 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11583 // 4-byte packet number)
11584 0xD3,
11585 // version
11586 QUIC_VERSION_BYTES,
11587 // destination connection ID length
11588 0x08,
11589 // destination connection ID
11590 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11591 // source connection ID length
11592 0x00,
11593 // long header packet length
11594 0x1E,
11595 // packet number
11596 0x12, 0x34, 0x56, 0x79,
11597 // frame type (stream frame with fin)
11598 0xFE,
11599 // stream id
11600 0x02, 0x03, 0x04,
11601 // offset
11602 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11603 // data length
11604 0x00, 0x0c,
11605 // data
11606 'H', 'E', 'L', 'L',
11607 'O', '_', 'W', 'O',
11608 'R', 'L', 'D', '?',
11609 };
11610 unsigned char packet_ietf[] = {
11611 // first coalesced packet
11612 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11613 // 4-byte packet number)
11614 0xD3,
11615 // version
11616 QUIC_VERSION_BYTES,
11617 // destination connection ID length
11618 0x08,
11619 // destination connection ID
11620 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11621 // source connection ID length
11622 0x00,
11623 // long header packet length
11624 0x1E,
11625 // packet number
11626 0x12, 0x34, 0x56, 0x78,
11627 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
11628 0x08 | 0x01 | 0x02 | 0x04,
11629 // stream id
11630 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
11631 // offset
11632 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
11633 0x32, 0x10, 0x76, 0x54,
11634 // data length
11635 kVarInt62OneByte + 0x0c,
11636 // data
11637 'h', 'e', 'l', 'l',
11638 'o', ' ', 'w', 'o',
11639 'r', 'l', 'd', '!',
11640 // second coalesced packet
11641 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11642 // 4-byte packet number)
11643 0xD3,
11644 // version
11645 QUIC_VERSION_BYTES,
11646 // destination connection ID length
11647 0x08,
11648 // destination connection ID
11649 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11650 // source connection ID length
11651 0x00,
11652 // long header packet length
11653 0x1E,
11654 // packet number
11655 0x12, 0x34, 0x56, 0x79,
11656 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
11657 0x08 | 0x01 | 0x02 | 0x04,
11658 // stream id
11659 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
11660 // offset
11661 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
11662 0x32, 0x10, 0x76, 0x54,
11663 // data length
11664 kVarInt62OneByte + 0x0c,
11665 // data
11666 'H', 'E', 'L', 'L',
11667 'O', '_', 'W', 'O',
11668 'R', 'L', 'D', '?',
11669 };
11670 // clang-format on
11671 const size_t first_packet_ietf_size = 46;
11672 // If the first packet changes, the attempt to fix the first byte of the
11673 // second packet will fail.
11674 EXPECT_EQ(packet_ietf[first_packet_ietf_size], 0xD3);
11675
11676 unsigned char* p = packet;
11677 size_t p_length = ABSL_ARRAYSIZE(packet);
11678 if (framer_.version().HasIetfQuicFrames()) {
11679 ReviseFirstByteByVersion(packet_ietf);
11680 ReviseFirstByteByVersion(&packet_ietf[first_packet_ietf_size]);
11681 p = packet_ietf;
11682 p_length = ABSL_ARRAYSIZE(packet_ietf);
11683 }
11684
11685 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
11686 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
11687
11688 EXPECT_THAT(framer_.error(), IsQuicNoError());
11689 ASSERT_TRUE(visitor_.header_.get());
11690
11691 ASSERT_EQ(1u, visitor_.stream_frames_.size());
11692 EXPECT_EQ(0u, visitor_.ack_frames_.size());
11693
11694 // Stream ID should be the last 3 bytes of kStreamId.
11695 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
11696 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
11697 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
11698 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
11699
11700 ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
11701 EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
11702
11703 EXPECT_THAT(framer_.error(), IsQuicNoError());
11704 ASSERT_TRUE(visitor_.header_.get());
11705
11706 ASSERT_EQ(2u, visitor_.stream_frames_.size());
11707 EXPECT_EQ(0u, visitor_.ack_frames_.size());
11708
11709 // Stream ID should be the last 3 bytes of kStreamId.
11710 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[1]->stream_id);
11711 EXPECT_TRUE(visitor_.stream_frames_[1]->fin);
11712 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[1]->offset);
11713 CheckStreamFrameData("HELLO_WORLD?", visitor_.stream_frames_[1].get());
11714 }
11715
TEST_P(QuicFramerTest,CoalescedPacketWithUdpPadding)11716 TEST_P(QuicFramerTest, CoalescedPacketWithUdpPadding) {
11717 if (!framer_.version().HasLongHeaderLengths()) {
11718 return;
11719 }
11720 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
11721 // clang-format off
11722 unsigned char packet[] = {
11723 // first coalesced packet
11724 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11725 // 4-byte packet number)
11726 0xD3,
11727 // version
11728 QUIC_VERSION_BYTES,
11729 // destination connection ID length
11730 0x08,
11731 // destination connection ID
11732 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11733 // source connection ID length
11734 0x00,
11735 // long header packet length
11736 0x1E,
11737 // packet number
11738 0x12, 0x34, 0x56, 0x78,
11739 // frame type (stream frame with fin)
11740 0xFE,
11741 // stream id
11742 0x02, 0x03, 0x04,
11743 // offset
11744 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11745 // data length
11746 0x00, 0x0c,
11747 // data
11748 'h', 'e', 'l', 'l',
11749 'o', ' ', 'w', 'o',
11750 'r', 'l', 'd', '!',
11751 // padding
11752 0x00, 0x00, 0x00, 0x00,
11753 0x00, 0x00, 0x00, 0x00,
11754 0x00, 0x00, 0x00, 0x00,
11755 0x00, 0x00, 0x00, 0x00,
11756 0x00, 0x00, 0x00, 0x00,
11757 };
11758 unsigned char packet_ietf[] = {
11759 // first coalesced packet
11760 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11761 // 4-byte packet number)
11762 0xD3,
11763 // version
11764 QUIC_VERSION_BYTES,
11765 // destination connection ID length
11766 0x08,
11767 // destination connection ID
11768 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11769 // source connection ID length
11770 0x00,
11771 // long header packet length
11772 0x1E,
11773 // packet number
11774 0x12, 0x34, 0x56, 0x78,
11775 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
11776 0x08 | 0x01 | 0x02 | 0x04,
11777 // stream id
11778 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
11779 // offset
11780 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
11781 0x32, 0x10, 0x76, 0x54,
11782 // data length
11783 kVarInt62OneByte + 0x0c,
11784 // data
11785 'h', 'e', 'l', 'l',
11786 'o', ' ', 'w', 'o',
11787 'r', 'l', 'd', '!',
11788 // padding
11789 0x00, 0x00, 0x00, 0x00,
11790 0x00, 0x00, 0x00, 0x00,
11791 0x00, 0x00, 0x00, 0x00,
11792 0x00, 0x00, 0x00, 0x00,
11793 0x00, 0x00, 0x00, 0x00,
11794 };
11795 // clang-format on
11796
11797 unsigned char* p = packet;
11798 size_t p_length = ABSL_ARRAYSIZE(packet);
11799 if (framer_.version().HasIetfQuicFrames()) {
11800 ReviseFirstByteByVersion(packet_ietf);
11801 p = packet_ietf;
11802 p_length = ABSL_ARRAYSIZE(packet_ietf);
11803 }
11804
11805 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
11806 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
11807
11808 EXPECT_THAT(framer_.error(), IsQuicNoError());
11809 ASSERT_TRUE(visitor_.header_.get());
11810
11811 ASSERT_EQ(1u, visitor_.stream_frames_.size());
11812 EXPECT_EQ(0u, visitor_.ack_frames_.size());
11813
11814 // Stream ID should be the last 3 bytes of kStreamId.
11815 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
11816 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
11817 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
11818 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
11819
11820 EXPECT_EQ(visitor_.coalesced_packets_.size(), 0u);
11821 }
11822
TEST_P(QuicFramerTest,CoalescedPacketWithDifferentVersion)11823 TEST_P(QuicFramerTest, CoalescedPacketWithDifferentVersion) {
11824 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
11825 return;
11826 }
11827 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
11828 // clang-format off
11829 unsigned char packet[] = {
11830 // first coalesced packet
11831 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11832 // 4-byte packet number)
11833 0xD3,
11834 // version
11835 QUIC_VERSION_BYTES,
11836 // destination connection ID length
11837 0x08,
11838 // destination connection ID
11839 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11840 // source connection ID length
11841 0x00,
11842 // long header packet length
11843 0x1E,
11844 // packet number
11845 0x12, 0x34, 0x56, 0x78,
11846 // frame type (stream frame with fin)
11847 0xFE,
11848 // stream id
11849 0x02, 0x03, 0x04,
11850 // offset
11851 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11852 // data length
11853 0x00, 0x0c,
11854 // data
11855 'h', 'e', 'l', 'l',
11856 'o', ' ', 'w', 'o',
11857 'r', 'l', 'd', '!',
11858 // second coalesced packet
11859 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11860 // 4-byte packet number)
11861 0xD3,
11862 // garbage version
11863 'G', 'A', 'B', 'G',
11864 // destination connection ID length
11865 0x08,
11866 // destination connection ID
11867 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11868 // source connection ID length
11869 0x00,
11870 // long header packet length
11871 0x1E,
11872 // packet number
11873 0x12, 0x34, 0x56, 0x79,
11874 // frame type (stream frame with fin)
11875 0xFE,
11876 // stream id
11877 0x02, 0x03, 0x04,
11878 // offset
11879 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11880 // data length
11881 0x00, 0x0c,
11882 // data
11883 'H', 'E', 'L', 'L',
11884 'O', '_', 'W', 'O',
11885 'R', 'L', 'D', '?',
11886 };
11887 unsigned char packet_ietf[] = {
11888 // first coalesced packet
11889 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11890 // 4-byte packet number)
11891 0xD3,
11892 // version
11893 QUIC_VERSION_BYTES,
11894 // destination connection ID length
11895 0x08,
11896 // destination connection ID
11897 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11898 // source connection ID length
11899 0x00,
11900 // long header packet length
11901 0x1E,
11902 // packet number
11903 0x12, 0x34, 0x56, 0x78,
11904 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
11905 0x08 | 0x01 | 0x02 | 0x04,
11906 // stream id
11907 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
11908 // offset
11909 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
11910 0x32, 0x10, 0x76, 0x54,
11911 // data length
11912 kVarInt62OneByte + 0x0c,
11913 // data
11914 'h', 'e', 'l', 'l',
11915 'o', ' ', 'w', 'o',
11916 'r', 'l', 'd', '!',
11917 // second coalesced packet
11918 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11919 // 4-byte packet number)
11920 0xD3,
11921 // garbage version
11922 'G', 'A', 'B', 'G',
11923 // destination connection ID length
11924 0x08,
11925 // destination connection ID
11926 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11927 // source connection ID length
11928 0x00,
11929 // long header packet length
11930 0x1E,
11931 // packet number
11932 0x12, 0x34, 0x56, 0x79,
11933 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
11934 0x08 | 0x01 | 0x02 | 0x04,
11935 // stream id
11936 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
11937 // offset
11938 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
11939 0x32, 0x10, 0x76, 0x54,
11940 // data length
11941 kVarInt62OneByte + 0x0c,
11942 // data
11943 'H', 'E', 'L', 'L',
11944 'O', '_', 'W', 'O',
11945 'R', 'L', 'D', '?',
11946 };
11947 // clang-format on
11948 const size_t first_packet_ietf_size = 46;
11949 // If the first packet changes, the attempt to fix the first byte of the
11950 // second packet will fail.
11951 EXPECT_EQ(packet_ietf[first_packet_ietf_size], 0xD3);
11952
11953 unsigned char* p = packet;
11954 size_t p_length = ABSL_ARRAYSIZE(packet);
11955 if (framer_.version().HasIetfQuicFrames()) {
11956 ReviseFirstByteByVersion(packet_ietf);
11957 ReviseFirstByteByVersion(&packet_ietf[first_packet_ietf_size]);
11958 p = packet_ietf;
11959 p_length = ABSL_ARRAYSIZE(packet_ietf);
11960 }
11961
11962 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
11963 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
11964
11965 EXPECT_THAT(framer_.error(), IsQuicNoError());
11966 ASSERT_TRUE(visitor_.header_.get());
11967
11968 ASSERT_EQ(1u, visitor_.stream_frames_.size());
11969 EXPECT_EQ(0u, visitor_.ack_frames_.size());
11970
11971 // Stream ID should be the last 3 bytes of kStreamId.
11972 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
11973 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
11974 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
11975 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
11976
11977 ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
11978 EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
11979
11980 EXPECT_THAT(framer_.error(), IsQuicNoError());
11981 ASSERT_TRUE(visitor_.header_.get());
11982
11983 ASSERT_EQ(1u, visitor_.stream_frames_.size());
11984 // Verify version mismatch gets reported.
11985 EXPECT_EQ(1, visitor_.version_mismatch_);
11986 }
11987
TEST_P(QuicFramerTest,UndecryptablePacketWithoutDecrypter)11988 TEST_P(QuicFramerTest, UndecryptablePacketWithoutDecrypter) {
11989 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
11990
11991 if (!framer_.version().KnowsWhichDecrypterToUse()) {
11992 // We create a bad client decrypter by using initial encryption with a
11993 // bogus connection ID; it should fail to decrypt everything.
11994 QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
11995 CrypterPair bogus_crypters;
11996 CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
11997 framer_.version(),
11998 bogus_connection_id, &bogus_crypters);
11999 // This removes all other decrypters.
12000 framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
12001 std::move(bogus_crypters.decrypter));
12002 }
12003
12004 // clang-format off
12005 unsigned char packet[] = {
12006 // public flags (long header with packet type HANDSHAKE and
12007 // 4-byte packet number)
12008 0xE3,
12009 // version
12010 QUIC_VERSION_BYTES,
12011 // connection ID lengths
12012 0x05,
12013 // source connection ID
12014 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12015 // long header packet length
12016 0x05,
12017 // packet number
12018 0x12, 0x34, 0x56, 0x00,
12019 // padding frames
12020 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12021 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12022 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12023 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12024 };
12025 unsigned char packet49[] = {
12026 // public flags (long header with packet type HANDSHAKE and
12027 // 4-byte packet number)
12028 0xE3,
12029 // version
12030 QUIC_VERSION_BYTES,
12031 // destination connection ID length
12032 0x00,
12033 // source connection ID length
12034 0x08,
12035 // source connection ID
12036 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12037 // long header packet length
12038 0x24,
12039 // packet number
12040 0x12, 0x34, 0x56, 0x00,
12041 // padding frames
12042 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12043 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12044 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12045 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12046 };
12047 // clang-format on
12048 unsigned char* p = packet;
12049 size_t p_length = ABSL_ARRAYSIZE(packet);
12050 if (framer_.version().HasLongHeaderLengths()) {
12051 ReviseFirstByteByVersion(packet49);
12052 p = packet49;
12053 p_length = ABSL_ARRAYSIZE(packet49);
12054 }
12055 // First attempt decryption without the handshake crypter.
12056 EXPECT_FALSE(
12057 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false)));
12058 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
12059 ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12060 ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12061 ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12062 quiche::test::CompareCharArraysWithHexError(
12063 "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
12064 visitor_.undecryptable_packets_[0]->length(), AsChars(p), p_length);
12065 if (framer_.version().KnowsWhichDecrypterToUse()) {
12066 EXPECT_EQ(ENCRYPTION_HANDSHAKE,
12067 visitor_.undecryptable_decryption_levels_[0]);
12068 }
12069 EXPECT_FALSE(visitor_.undecryptable_has_decryption_keys_[0]);
12070 }
12071
TEST_P(QuicFramerTest,UndecryptablePacketWithDecrypter)12072 TEST_P(QuicFramerTest, UndecryptablePacketWithDecrypter) {
12073 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12074
12075 // We create a bad client decrypter by using initial encryption with a
12076 // bogus connection ID; it should fail to decrypt everything.
12077 QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
12078 CrypterPair bad_handshake_crypters;
12079 CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12080 framer_.version(), bogus_connection_id,
12081 &bad_handshake_crypters);
12082 if (framer_.version().KnowsWhichDecrypterToUse()) {
12083 framer_.InstallDecrypter(ENCRYPTION_HANDSHAKE,
12084 std::move(bad_handshake_crypters.decrypter));
12085 } else {
12086 framer_.SetDecrypter(ENCRYPTION_HANDSHAKE,
12087 std::move(bad_handshake_crypters.decrypter));
12088 }
12089
12090 // clang-format off
12091 unsigned char packet[] = {
12092 // public flags (long header with packet type HANDSHAKE and
12093 // 4-byte packet number)
12094 0xE3,
12095 // version
12096 QUIC_VERSION_BYTES,
12097 // connection ID lengths
12098 0x05,
12099 // source connection ID
12100 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12101 // long header packet length
12102 0x05,
12103 // packet number
12104 0x12, 0x34, 0x56, 0x00,
12105 // padding frames
12106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12110 };
12111 unsigned char packet49[] = {
12112 // public flags (long header with packet type HANDSHAKE and
12113 // 4-byte packet number)
12114 0xE3,
12115 // version
12116 QUIC_VERSION_BYTES,
12117 // destination connection ID length
12118 0x00,
12119 // source connection ID length
12120 0x08,
12121 // source connection ID
12122 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12123 // long header packet length
12124 0x24,
12125 // packet number
12126 0x12, 0x34, 0x56, 0x00,
12127 // padding frames
12128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12132 };
12133 // clang-format on
12134 unsigned char* p = packet;
12135 size_t p_length = ABSL_ARRAYSIZE(packet);
12136 if (framer_.version().HasLongHeaderLengths()) {
12137 ReviseFirstByteByVersion(packet49);
12138 p = packet49;
12139 p_length = ABSL_ARRAYSIZE(packet49);
12140 }
12141
12142 EXPECT_FALSE(
12143 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false)));
12144 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
12145 ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12146 ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12147 ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12148 quiche::test::CompareCharArraysWithHexError(
12149 "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
12150 visitor_.undecryptable_packets_[0]->length(), AsChars(p), p_length);
12151 if (framer_.version().KnowsWhichDecrypterToUse()) {
12152 EXPECT_EQ(ENCRYPTION_HANDSHAKE,
12153 visitor_.undecryptable_decryption_levels_[0]);
12154 }
12155 EXPECT_EQ(framer_.version().KnowsWhichDecrypterToUse(),
12156 visitor_.undecryptable_has_decryption_keys_[0]);
12157 }
12158
TEST_P(QuicFramerTest,UndecryptableCoalescedPacket)12159 TEST_P(QuicFramerTest, UndecryptableCoalescedPacket) {
12160 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12161 return;
12162 }
12163 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
12164 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
12165 // We create a bad client decrypter by using initial encryption with a
12166 // bogus connection ID; it should fail to decrypt everything.
12167 QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
12168 CrypterPair bad_handshake_crypters;
12169 CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12170 framer_.version(), bogus_connection_id,
12171 &bad_handshake_crypters);
12172 framer_.InstallDecrypter(ENCRYPTION_HANDSHAKE,
12173 std::move(bad_handshake_crypters.decrypter));
12174 // clang-format off
12175 unsigned char packet[] = {
12176 // first coalesced packet
12177 // public flags (long header with packet type HANDSHAKE and
12178 // 4-byte packet number)
12179 0xE3,
12180 // version
12181 QUIC_VERSION_BYTES,
12182 // destination connection ID length
12183 0x08,
12184 // destination connection ID
12185 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12186 // source connection ID length
12187 0x00,
12188 // long header packet length
12189 0x1E,
12190 // packet number
12191 0x12, 0x34, 0x56, 0x78,
12192 // frame type (stream frame with fin)
12193 0xFE,
12194 // stream id
12195 0x02, 0x03, 0x04,
12196 // offset
12197 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12198 // data length
12199 0x00, 0x0c,
12200 // data
12201 'h', 'e', 'l', 'l',
12202 'o', ' ', 'w', 'o',
12203 'r', 'l', 'd', '!',
12204 // second coalesced packet
12205 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12206 // 4-byte packet number)
12207 0xD3,
12208 // version
12209 QUIC_VERSION_BYTES,
12210 // destination connection ID length
12211 0x08,
12212 // destination connection ID
12213 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12214 // source connection ID length
12215 0x00,
12216 // long header packet length
12217 0x1E,
12218 // packet number
12219 0x12, 0x34, 0x56, 0x79,
12220 // frame type (stream frame with fin)
12221 0xFE,
12222 // stream id
12223 0x02, 0x03, 0x04,
12224 // offset
12225 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12226 // data length
12227 0x00, 0x0c,
12228 // data
12229 'H', 'E', 'L', 'L',
12230 'O', '_', 'W', 'O',
12231 'R', 'L', 'D', '?',
12232 };
12233 unsigned char packet_ietf[] = {
12234 // first coalesced packet
12235 // public flags (long header with packet type HANDSHAKE and
12236 // 4-byte packet number)
12237 0xE3,
12238 // version
12239 QUIC_VERSION_BYTES,
12240 // destination connection ID length
12241 0x08,
12242 // destination connection ID
12243 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12244 // source connection ID length
12245 0x00,
12246 // long header packet length
12247 0x1E,
12248 // packet number
12249 0x12, 0x34, 0x56, 0x78,
12250 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12251 0x08 | 0x01 | 0x02 | 0x04,
12252 // stream id
12253 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12254 // offset
12255 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12256 0x32, 0x10, 0x76, 0x54,
12257 // data length
12258 kVarInt62OneByte + 0x0c,
12259 // data
12260 'h', 'e', 'l', 'l',
12261 'o', ' ', 'w', 'o',
12262 'r', 'l', 'd', '!',
12263 // second coalesced packet
12264 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12265 // 4-byte packet number)
12266 0xD3,
12267 // version
12268 QUIC_VERSION_BYTES,
12269 // destination connection ID length
12270 0x08,
12271 // destination connection ID
12272 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12273 // source connection ID length
12274 0x00,
12275 // long header packet length
12276 0x1E,
12277 // packet number
12278 0x12, 0x34, 0x56, 0x79,
12279 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12280 0x08 | 0x01 | 0x02 | 0x04,
12281 // stream id
12282 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12283 // offset
12284 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12285 0x32, 0x10, 0x76, 0x54,
12286 // data length
12287 kVarInt62OneByte + 0x0c,
12288 // data
12289 'H', 'E', 'L', 'L',
12290 'O', '_', 'W', 'O',
12291 'R', 'L', 'D', '?',
12292 };
12293 // clang-format on
12294 const size_t length_of_first_coalesced_packet = 46;
12295 // If the first packet changes, the attempt to fix the first byte of the
12296 // second packet will fail.
12297 EXPECT_EQ(packet_ietf[length_of_first_coalesced_packet], 0xD3);
12298
12299 unsigned char* p = packet;
12300 size_t p_length = ABSL_ARRAYSIZE(packet);
12301 if (framer_.version().HasIetfQuicFrames()) {
12302 ReviseFirstByteByVersion(packet_ietf);
12303 ReviseFirstByteByVersion(&packet_ietf[length_of_first_coalesced_packet]);
12304 p = packet_ietf;
12305 p_length = ABSL_ARRAYSIZE(packet_ietf);
12306 }
12307
12308 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12309
12310 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12311
12312 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
12313
12314 ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12315 ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12316 ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12317 // Make sure we only receive the first undecryptable packet and not the
12318 // full packet including the second coalesced packet.
12319 quiche::test::CompareCharArraysWithHexError(
12320 "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
12321 visitor_.undecryptable_packets_[0]->length(), AsChars(p),
12322 length_of_first_coalesced_packet);
12323 EXPECT_EQ(ENCRYPTION_HANDSHAKE, visitor_.undecryptable_decryption_levels_[0]);
12324 EXPECT_TRUE(visitor_.undecryptable_has_decryption_keys_[0]);
12325
12326 // Make sure the second coalesced packet is parsed correctly.
12327 ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
12328 EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
12329
12330 ASSERT_TRUE(visitor_.header_.get());
12331
12332 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12333 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12334
12335 // Stream ID should be the last 3 bytes of kStreamId.
12336 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12337 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12338 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12339 CheckStreamFrameData("HELLO_WORLD?", visitor_.stream_frames_[0].get());
12340 }
12341
TEST_P(QuicFramerTest,MismatchedCoalescedPacket)12342 TEST_P(QuicFramerTest, MismatchedCoalescedPacket) {
12343 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12344 return;
12345 }
12346 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
12347 // clang-format off
12348 unsigned char packet[] = {
12349 // first coalesced packet
12350 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12351 // 4-byte packet number)
12352 0xD3,
12353 // version
12354 QUIC_VERSION_BYTES,
12355 // destination connection ID length
12356 0x08,
12357 // destination connection ID
12358 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12359 // source connection ID length
12360 0x00,
12361 // long header packet length
12362 0x1E,
12363 // packet number
12364 0x12, 0x34, 0x56, 0x78,
12365 // frame type (stream frame with fin)
12366 0xFE,
12367 // stream id
12368 0x02, 0x03, 0x04,
12369 // offset
12370 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12371 // data length
12372 0x00, 0x0c,
12373 // data
12374 'h', 'e', 'l', 'l',
12375 'o', ' ', 'w', 'o',
12376 'r', 'l', 'd', '!',
12377 // second coalesced packet
12378 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12379 // 4-byte packet number)
12380 0xD3,
12381 // version
12382 QUIC_VERSION_BYTES,
12383 // destination connection ID length
12384 0x08,
12385 // destination connection ID
12386 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
12387 // source connection ID length
12388 0x00,
12389 // long header packet length
12390 0x1E,
12391 // packet number
12392 0x12, 0x34, 0x56, 0x79,
12393 // frame type (stream frame with fin)
12394 0xFE,
12395 // stream id
12396 0x02, 0x03, 0x04,
12397 // offset
12398 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12399 // data length
12400 0x00, 0x0c,
12401 // data
12402 'H', 'E', 'L', 'L',
12403 'O', '_', 'W', 'O',
12404 'R', 'L', 'D', '?',
12405 };
12406 unsigned char packet_ietf[] = {
12407 // first coalesced packet
12408 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12409 // 4-byte packet number)
12410 0xD3,
12411 // version
12412 QUIC_VERSION_BYTES,
12413 // destination connection ID length
12414 0x08,
12415 // destination connection ID
12416 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12417 // source connection ID length
12418 0x00,
12419 // long header packet length
12420 0x1E,
12421 // packet number
12422 0x12, 0x34, 0x56, 0x78,
12423 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12424 0x08 | 0x01 | 0x02 | 0x04,
12425 // stream id
12426 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12427 // offset
12428 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12429 0x32, 0x10, 0x76, 0x54,
12430 // data length
12431 kVarInt62OneByte + 0x0c,
12432 // data
12433 'h', 'e', 'l', 'l',
12434 'o', ' ', 'w', 'o',
12435 'r', 'l', 'd', '!',
12436 // second coalesced packet
12437 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12438 // 4-byte packet number)
12439 0xD3,
12440 // version
12441 QUIC_VERSION_BYTES,
12442 // destination connection ID length
12443 0x08,
12444 // destination connection ID
12445 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
12446 // source connection ID length
12447 0x00,
12448 // long header packet length
12449 0x1E,
12450 // packet number
12451 0x12, 0x34, 0x56, 0x79,
12452 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12453 0x08 | 0x01 | 0x02 | 0x04,
12454 // stream id
12455 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12456 // offset
12457 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12458 0x32, 0x10, 0x76, 0x54,
12459 // data length
12460 kVarInt62OneByte + 0x0c,
12461 // data
12462 'H', 'E', 'L', 'L',
12463 'O', '_', 'W', 'O',
12464 'R', 'L', 'D', '?',
12465 };
12466 // clang-format on
12467 const size_t length_of_first_coalesced_packet = 46;
12468 // If the first packet changes, the attempt to fix the first byte of the
12469 // second packet will fail.
12470 EXPECT_EQ(packet_ietf[length_of_first_coalesced_packet], 0xD3);
12471
12472 unsigned char* p = packet;
12473 size_t p_length = ABSL_ARRAYSIZE(packet);
12474 if (framer_.version().HasIetfQuicFrames()) {
12475 ReviseFirstByteByVersion(packet_ietf);
12476 ReviseFirstByteByVersion(&packet_ietf[length_of_first_coalesced_packet]);
12477 p = packet_ietf;
12478 p_length = ABSL_ARRAYSIZE(packet_ietf);
12479 }
12480
12481 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12482
12483 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12484
12485 EXPECT_THAT(framer_.error(), IsQuicNoError());
12486 ASSERT_TRUE(visitor_.header_.get());
12487
12488 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12489 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12490
12491 // Stream ID should be the last 3 bytes of kStreamId.
12492 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12493 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12494 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12495 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12496
12497 ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
12498 }
12499
TEST_P(QuicFramerTest,InvalidCoalescedPacket)12500 TEST_P(QuicFramerTest, InvalidCoalescedPacket) {
12501 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12502 return;
12503 }
12504 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
12505 // clang-format off
12506 unsigned char packet[] = {
12507 // first coalesced packet
12508 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12509 // 4-byte packet number)
12510 0xD3,
12511 // version
12512 QUIC_VERSION_BYTES,
12513 // destination connection ID length
12514 0x08,
12515 // destination connection ID
12516 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12517 // source connection ID length
12518 0x00,
12519 // long header packet length
12520 0x1E,
12521 // packet number
12522 0x12, 0x34, 0x56, 0x78,
12523 // frame type (stream frame with fin)
12524 0xFE,
12525 // stream id
12526 0x02, 0x03, 0x04,
12527 // offset
12528 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12529 // data length
12530 0x00, 0x0c,
12531 // data
12532 'h', 'e', 'l', 'l',
12533 'o', ' ', 'w', 'o',
12534 'r', 'l', 'd', '!',
12535 // second coalesced packet
12536 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12537 // 4-byte packet number)
12538 0xD3,
12539 // version would be here but we cut off the invalid coalesced header.
12540 };
12541 unsigned char packet_ietf[] = {
12542 // first coalesced packet
12543 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12544 // 4-byte packet number)
12545 0xD3,
12546 // version
12547 QUIC_VERSION_BYTES,
12548 // destination connection ID length
12549 0x08,
12550 // destination connection ID
12551 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12552 // source connection ID length
12553 0x00,
12554 // long header packet length
12555 0x1E,
12556 // packet number
12557 0x12, 0x34, 0x56, 0x78,
12558 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12559 0x08 | 0x01 | 0x02 | 0x04,
12560 // stream id
12561 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12562 // offset
12563 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12564 0x32, 0x10, 0x76, 0x54,
12565 // data length
12566 kVarInt62OneByte + 0x0c,
12567 // data
12568 'h', 'e', 'l', 'l',
12569 'o', ' ', 'w', 'o',
12570 'r', 'l', 'd', '!',
12571 // second coalesced packet
12572 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12573 // 4-byte packet number)
12574 0xD3,
12575 // version would be here but we cut off the invalid coalesced header.
12576 };
12577 // clang-format on
12578 const size_t length_of_first_coalesced_packet = 46;
12579 // If the first packet changes, the attempt to fix the first byte of the
12580 // second packet will fail.
12581 EXPECT_EQ(packet_ietf[length_of_first_coalesced_packet], 0xD3);
12582
12583 unsigned char* p = packet;
12584 size_t p_length = ABSL_ARRAYSIZE(packet);
12585 if (framer_.version().HasIetfQuicFrames()) {
12586 ReviseFirstByteByVersion(packet_ietf);
12587 ReviseFirstByteByVersion(&packet_ietf[length_of_first_coalesced_packet]);
12588 p = packet_ietf;
12589 p_length = ABSL_ARRAYSIZE(packet_ietf);
12590 }
12591
12592 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12593
12594 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12595
12596 EXPECT_THAT(framer_.error(), IsQuicNoError());
12597 ASSERT_TRUE(visitor_.header_.get());
12598
12599 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12600 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12601
12602 // Stream ID should be the last 3 bytes of kStreamId.
12603 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12604 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12605 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12606 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12607
12608 ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
12609 }
12610
12611 // Some IETF implementations send an initial followed by zeroes instead of
12612 // padding inside the initial. We need to make sure that we still process
12613 // the initial correctly and ignore the zeroes.
TEST_P(QuicFramerTest,CoalescedPacketWithZeroesRoundTrip)12614 TEST_P(QuicFramerTest, CoalescedPacketWithZeroesRoundTrip) {
12615 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version()) ||
12616 !framer_.version().UsesInitialObfuscators()) {
12617 return;
12618 }
12619 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
12620 QuicConnectionId connection_id = FramerTestConnectionId();
12621 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12622
12623 CrypterPair client_crypters;
12624 CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12625 framer_.version(), connection_id,
12626 &client_crypters);
12627 framer_.SetEncrypter(ENCRYPTION_INITIAL,
12628 std::move(client_crypters.encrypter));
12629
12630 QuicPacketHeader header;
12631 header.destination_connection_id = connection_id;
12632 header.version_flag = true;
12633 header.packet_number = kPacketNumber;
12634 header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
12635 header.long_packet_type = INITIAL;
12636 header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
12637 header.retry_token_length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1;
12638 QuicFrames frames = {QuicFrame(QuicPingFrame()),
12639 QuicFrame(QuicPaddingFrame(3))};
12640
12641 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
12642 ASSERT_NE(nullptr, data);
12643
12644 // Add zeroes after the valid initial packet.
12645 unsigned char packet[kMaxOutgoingPacketSize] = {};
12646 size_t encrypted_length =
12647 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number, *data,
12648 AsChars(packet), ABSL_ARRAYSIZE(packet));
12649 ASSERT_NE(0u, encrypted_length);
12650
12651 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
12652 CrypterPair server_crypters;
12653 CryptoUtils::CreateInitialObfuscators(Perspective::IS_SERVER,
12654 framer_.version(), connection_id,
12655 &server_crypters);
12656 framer_.InstallDecrypter(ENCRYPTION_INITIAL,
12657 std::move(server_crypters.decrypter));
12658
12659 // Make sure the first long header initial packet parses correctly.
12660 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
12661
12662 // Make sure we discard the subsequent zeroes.
12663 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12664 EXPECT_TRUE(visitor_.coalesced_packets_.empty());
12665 }
12666
TEST_P(QuicFramerTest,ClientReceivesWrongVersion)12667 TEST_P(QuicFramerTest, ClientReceivesWrongVersion) {
12668 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12669
12670 // clang-format off
12671 unsigned char packet[] = {
12672 // public flags (long header with packet type INITIAL)
12673 0xC3,
12674 // version that is different from the framer's version
12675 'Q', '0', '4', '3',
12676 // connection ID lengths
12677 0x05,
12678 // source connection ID
12679 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12680 // packet number
12681 0x01,
12682 // padding frame
12683 0x00,
12684 };
12685 // clang-format on
12686
12687 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
12688 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12689
12690 EXPECT_THAT(framer_.error(), IsError(QUIC_PACKET_WRONG_VERSION));
12691 EXPECT_EQ("Client received unexpected version.", framer_.detailed_error());
12692 }
12693
TEST_P(QuicFramerTest,PacketHeaderWithVariableLengthConnectionId)12694 TEST_P(QuicFramerTest, PacketHeaderWithVariableLengthConnectionId) {
12695 if (!framer_.version().AllowsVariableLengthConnectionIds()) {
12696 return;
12697 }
12698 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
12699 uint8_t connection_id_bytes[9] = {0xFE, 0xDC, 0xBA, 0x98, 0x76,
12700 0x54, 0x32, 0x10, 0x42};
12701 QuicConnectionId connection_id(reinterpret_cast<char*>(connection_id_bytes),
12702 sizeof(connection_id_bytes));
12703 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
12704 QuicFramerPeer::SetExpectedServerConnectionIDLength(&framer_,
12705 connection_id.length());
12706
12707 // clang-format off
12708 PacketFragments packet = {
12709 // type (8 byte connection_id and 1 byte packet number)
12710 {"Unable to read first byte.",
12711 {0x40}},
12712 // connection_id
12713 {"Unable to read destination connection ID.",
12714 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
12715 // packet number
12716 {"Unable to read packet number.",
12717 {0x78}},
12718 };
12719
12720 PacketFragments packet_with_padding = {
12721 // type (8 byte connection_id and 1 byte packet number)
12722 {"Unable to read first byte.",
12723 {0x40}},
12724 // connection_id
12725 {"Unable to read destination connection ID.",
12726 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
12727 // packet number
12728 {"",
12729 {0x78}},
12730 // padding
12731 {"", {0x00, 0x00, 0x00}},
12732 };
12733 // clang-format on
12734
12735 PacketFragments& fragments =
12736 framer_.version().HasHeaderProtection() ? packet_with_padding : packet;
12737 std::unique_ptr<QuicEncryptedPacket> encrypted(
12738 AssemblePacketFromFragments(fragments));
12739 if (framer_.version().HasHeaderProtection()) {
12740 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
12741 EXPECT_THAT(framer_.error(), IsQuicNoError());
12742 } else {
12743 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
12744 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
12745 }
12746 ASSERT_TRUE(visitor_.header_.get());
12747 EXPECT_EQ(connection_id, visitor_.header_->destination_connection_id);
12748 EXPECT_FALSE(visitor_.header_->reset_flag);
12749 EXPECT_FALSE(visitor_.header_->version_flag);
12750 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
12751 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
12752
12753 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
12754 }
12755
TEST_P(QuicFramerTest,MultiplePacketNumberSpaces)12756 TEST_P(QuicFramerTest, MultiplePacketNumberSpaces) {
12757 framer_.EnableMultiplePacketNumberSpacesSupport();
12758
12759 // clang-format off
12760 unsigned char long_header_packet[] = {
12761 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12762 // 4-byte packet number)
12763 0xD3,
12764 // version
12765 QUIC_VERSION_BYTES,
12766 // destination connection ID length
12767 0x50,
12768 // destination connection ID
12769 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12770 // packet number
12771 0x12, 0x34, 0x56, 0x78,
12772 // padding frame
12773 0x00,
12774 };
12775 unsigned char long_header_packet_ietf[] = {
12776 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12777 // 4-byte packet number)
12778 0xD3,
12779 // version
12780 QUIC_VERSION_BYTES,
12781 // destination connection ID length
12782 0x08,
12783 // destination connection ID
12784 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12785 // source connection ID length
12786 0x00,
12787 // long header packet length
12788 0x05,
12789 // packet number
12790 0x12, 0x34, 0x56, 0x78,
12791 // padding frame
12792 0x00,
12793 };
12794 // clang-format on
12795
12796 if (framer_.version().KnowsWhichDecrypterToUse()) {
12797 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
12798 std::make_unique<TestDecrypter>());
12799 framer_.RemoveDecrypter(ENCRYPTION_INITIAL);
12800 } else {
12801 framer_.SetDecrypter(ENCRYPTION_ZERO_RTT,
12802 std::make_unique<TestDecrypter>());
12803 }
12804 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12805 EXPECT_TRUE(framer_.ProcessPacket(
12806 QuicEncryptedPacket(AsChars(long_header_packet),
12807 ABSL_ARRAYSIZE(long_header_packet), false)));
12808 } else {
12809 ReviseFirstByteByVersion(long_header_packet_ietf);
12810 EXPECT_TRUE(framer_.ProcessPacket(
12811 QuicEncryptedPacket(AsChars(long_header_packet_ietf),
12812 ABSL_ARRAYSIZE(long_header_packet_ietf), false)));
12813 }
12814
12815 EXPECT_THAT(framer_.error(), IsQuicNoError());
12816 EXPECT_FALSE(
12817 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
12818 .IsInitialized());
12819 EXPECT_FALSE(
12820 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
12821 .IsInitialized());
12822 EXPECT_EQ(kPacketNumber, QuicFramerPeer::GetLargestDecryptedPacketNumber(
12823 &framer_, APPLICATION_DATA));
12824
12825 // clang-format off
12826 unsigned char short_header_packet[] = {
12827 // type (short header, 1 byte packet number)
12828 0x40,
12829 // connection_id
12830 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12831 // packet number
12832 0x79,
12833 // padding frame
12834 0x00, 0x00, 0x00,
12835 };
12836 // clang-format on
12837
12838 QuicEncryptedPacket short_header_encrypted(
12839 AsChars(short_header_packet), ABSL_ARRAYSIZE(short_header_packet), false);
12840 if (framer_.version().KnowsWhichDecrypterToUse()) {
12841 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
12842 std::make_unique<TestDecrypter>());
12843 framer_.RemoveDecrypter(ENCRYPTION_ZERO_RTT);
12844 } else {
12845 framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
12846 std::make_unique<TestDecrypter>());
12847 }
12848 EXPECT_TRUE(framer_.ProcessPacket(short_header_encrypted));
12849
12850 EXPECT_THAT(framer_.error(), IsQuicNoError());
12851 EXPECT_FALSE(
12852 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
12853 .IsInitialized());
12854 EXPECT_FALSE(
12855 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
12856 .IsInitialized());
12857 EXPECT_EQ(kPacketNumber + 1, QuicFramerPeer::GetLargestDecryptedPacketNumber(
12858 &framer_, APPLICATION_DATA));
12859 }
12860
TEST_P(QuicFramerTest,IetfRetryPacketRejected)12861 TEST_P(QuicFramerTest, IetfRetryPacketRejected) {
12862 if (!framer_.version().KnowsWhichDecrypterToUse() ||
12863 framer_.version().SupportsRetry()) {
12864 return;
12865 }
12866
12867 // clang-format off
12868 PacketFragments packet = {
12869 // public flags (IETF Retry packet, 0-length original destination CID)
12870 {"Unable to read first byte.",
12871 {0xf0}},
12872 // version tag
12873 {"Unable to read protocol version.",
12874 {QUIC_VERSION_BYTES}},
12875 // connection_id length
12876 {"RETRY not supported in this version.",
12877 {0x00}},
12878 };
12879 // clang-format on
12880
12881 std::unique_ptr<QuicEncryptedPacket> encrypted(
12882 AssemblePacketFromFragments(packet));
12883
12884 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
12885 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
12886 CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
12887 }
12888
TEST_P(QuicFramerTest,RetryPacketRejectedWithMultiplePacketNumberSpaces)12889 TEST_P(QuicFramerTest, RetryPacketRejectedWithMultiplePacketNumberSpaces) {
12890 if (framer_.version().SupportsRetry()) {
12891 return;
12892 }
12893 framer_.EnableMultiplePacketNumberSpacesSupport();
12894
12895 // clang-format off
12896 PacketFragments packet = {
12897 // public flags (IETF Retry packet, 0-length original destination CID)
12898 {"Unable to read first byte.",
12899 {0xf0}},
12900 // version tag
12901 {"Unable to read protocol version.",
12902 {QUIC_VERSION_BYTES}},
12903 // connection_id length
12904 {"RETRY not supported in this version.",
12905 {0x00}},
12906 };
12907 // clang-format on
12908
12909 std::unique_ptr<QuicEncryptedPacket> encrypted(
12910 AssemblePacketFromFragments(packet));
12911
12912 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
12913 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
12914 CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
12915 }
12916
TEST_P(QuicFramerTest,WriteClientVersionNegotiationProbePacket)12917 TEST_P(QuicFramerTest, WriteClientVersionNegotiationProbePacket) {
12918 // clang-format off
12919 static const uint8_t expected_packet[1200] = {
12920 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
12921 0xc0,
12922 // Version, part of the IETF space reserved for negotiation.
12923 0xca, 0xba, 0xda, 0xda,
12924 // Destination connection ID length 8.
12925 0x08,
12926 // 8-byte destination connection ID.
12927 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
12928 // Source connection ID length 0.
12929 0x00,
12930 // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
12931 // not parse with any known version.
12932 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12933 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
12934 // zeroes to pad to 16 byte boundary.
12935 0x00,
12936 // A polite greeting in case a human sees this in tcpdump.
12937 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
12938 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
12939 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
12940 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
12941 0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
12942 0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
12943 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
12944 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
12945 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
12946 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
12947 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
12948 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
12949 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
12950 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
12951 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
12952 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
12953 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
12954 0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
12955 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
12956 0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
12957 0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
12958 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
12959 0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
12960 };
12961 // clang-format on
12962 char packet[1200];
12963 char destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
12964 0x6c, 0x7a, 0x20, 0x21};
12965 EXPECT_TRUE(QuicFramer::WriteClientVersionNegotiationProbePacket(
12966 packet, sizeof(packet), destination_connection_id_bytes,
12967 sizeof(destination_connection_id_bytes)));
12968 quiche::test::CompareCharArraysWithHexError(
12969 "constructed packet", packet, sizeof(packet),
12970 reinterpret_cast<const char*>(expected_packet), sizeof(expected_packet));
12971 QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
12972 sizeof(packet), false);
12973 if (!framer_.version().HasLengthPrefixedConnectionIds()) {
12974 // We can only parse the connection ID with a parser expecting
12975 // length-prefixed connection IDs.
12976 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12977 return;
12978 }
12979 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12980 ASSERT_TRUE(visitor_.header_.get());
12981 QuicConnectionId probe_payload_connection_id(
12982 reinterpret_cast<const char*>(destination_connection_id_bytes),
12983 sizeof(destination_connection_id_bytes));
12984 EXPECT_EQ(probe_payload_connection_id,
12985 visitor_.header_.get()->destination_connection_id);
12986 }
12987
TEST_P(QuicFramerTest,DispatcherParseOldClientVersionNegotiationProbePacket)12988 TEST_P(QuicFramerTest, DispatcherParseOldClientVersionNegotiationProbePacket) {
12989 // clang-format off
12990 static const uint8_t packet[1200] = {
12991 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
12992 0xc0,
12993 // Version, part of the IETF space reserved for negotiation.
12994 0xca, 0xba, 0xda, 0xba,
12995 // Destination connection ID length 8, source connection ID length 0.
12996 0x50,
12997 // 8-byte destination connection ID.
12998 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
12999 // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13000 // not parse with any known version.
13001 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13002 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13003 // 2 bytes of zeroes to pad to 16 byte boundary.
13004 0x00, 0x00,
13005 // A polite greeting in case a human sees this in tcpdump.
13006 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13007 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13008 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13009 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13010 0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13011 0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13012 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13013 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13014 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13015 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13016 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13017 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13018 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13019 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13020 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13021 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13022 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13023 0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13024 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13025 0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13026 0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13027 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13028 0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13029 };
13030 // clang-format on
13031 char expected_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13032 0x6c, 0x7a, 0x20, 0x21};
13033 QuicConnectionId expected_destination_connection_id(
13034 reinterpret_cast<const char*>(expected_destination_connection_id_bytes),
13035 sizeof(expected_destination_connection_id_bytes));
13036
13037 QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13038 sizeof(packet));
13039 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
13040 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
13041 bool version_present = false, has_length_prefix = true;
13042 QuicVersionLabel version_label = 33;
13043 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
13044 QuicConnectionId destination_connection_id = TestConnectionId(1);
13045 QuicConnectionId source_connection_id = TestConnectionId(2);
13046 std::optional<absl::string_view> retry_token;
13047 std::string detailed_error = "foobar";
13048 QuicErrorCode header_parse_result = QuicFramer::ParsePublicHeaderDispatcher(
13049 encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
13050 &version_present, &has_length_prefix, &version_label, &parsed_version,
13051 &destination_connection_id, &source_connection_id, &retry_token,
13052 &detailed_error);
13053 EXPECT_THAT(header_parse_result, IsQuicNoError());
13054 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
13055 EXPECT_TRUE(version_present);
13056 EXPECT_FALSE(has_length_prefix);
13057 EXPECT_EQ(0xcabadaba, version_label);
13058 EXPECT_EQ(expected_destination_connection_id, destination_connection_id);
13059 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
13060 EXPECT_FALSE(retry_token.has_value());
13061 EXPECT_EQ("", detailed_error);
13062 }
13063
TEST_P(QuicFramerTest,DispatcherParseClientVersionNegotiationProbePacket)13064 TEST_P(QuicFramerTest, DispatcherParseClientVersionNegotiationProbePacket) {
13065 // clang-format off
13066 static const uint8_t packet[1200] = {
13067 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13068 0xc0,
13069 // Version, part of the IETF space reserved for negotiation.
13070 0xca, 0xba, 0xda, 0xba,
13071 // Destination connection ID length 8.
13072 0x08,
13073 // 8-byte destination connection ID.
13074 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13075 // Source connection ID length 0.
13076 0x00,
13077 // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13078 // not parse with any known version.
13079 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13080 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13081 // 1 byte of zeroes to pad to 16 byte boundary.
13082 0x00,
13083 // A polite greeting in case a human sees this in tcpdump.
13084 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13085 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13086 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13087 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13088 0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13089 0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13090 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13091 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13092 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13093 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13094 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13095 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13096 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13097 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13098 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13099 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13100 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13101 0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13102 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13103 0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13104 0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13105 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13106 0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13107 };
13108 // clang-format on
13109 char expected_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13110 0x6c, 0x7a, 0x20, 0x21};
13111 QuicConnectionId expected_destination_connection_id(
13112 reinterpret_cast<const char*>(expected_destination_connection_id_bytes),
13113 sizeof(expected_destination_connection_id_bytes));
13114
13115 QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13116 sizeof(packet));
13117 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
13118 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
13119 bool version_present = false, has_length_prefix = false;
13120 QuicVersionLabel version_label = 33;
13121 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
13122 QuicConnectionId destination_connection_id = TestConnectionId(1);
13123 QuicConnectionId source_connection_id = TestConnectionId(2);
13124 std::optional<absl::string_view> retry_token;
13125 std::string detailed_error = "foobar";
13126 QuicErrorCode header_parse_result = QuicFramer::ParsePublicHeaderDispatcher(
13127 encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
13128 &version_present, &has_length_prefix, &version_label, &parsed_version,
13129 &destination_connection_id, &source_connection_id, &retry_token,
13130 &detailed_error);
13131 EXPECT_THAT(header_parse_result, IsQuicNoError());
13132 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
13133 EXPECT_TRUE(version_present);
13134 EXPECT_TRUE(has_length_prefix);
13135 EXPECT_EQ(0xcabadaba, version_label);
13136 EXPECT_EQ(expected_destination_connection_id, destination_connection_id);
13137 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
13138 EXPECT_EQ("", detailed_error);
13139 }
13140
TEST_P(QuicFramerTest,ParseServerVersionNegotiationProbeResponse)13141 TEST_P(QuicFramerTest, ParseServerVersionNegotiationProbeResponse) {
13142 // clang-format off
13143 const uint8_t packet[] = {
13144 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13145 0xc0,
13146 // Version of 0, indicating version negotiation.
13147 0x00, 0x00, 0x00, 0x00,
13148 // Destination connection ID length 0, source connection ID length 8.
13149 0x00, 0x08,
13150 // 8-byte source connection ID.
13151 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13152 // A few supported versions.
13153 0xaa, 0xaa, 0xaa, 0xaa,
13154 QUIC_VERSION_BYTES,
13155 };
13156 // clang-format on
13157 char probe_payload_bytes[] = {0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21};
13158 char parsed_probe_payload_bytes[255] = {};
13159 uint8_t parsed_probe_payload_length = sizeof(parsed_probe_payload_bytes);
13160 std::string parse_detailed_error = "";
13161 EXPECT_TRUE(QuicFramer::ParseServerVersionNegotiationProbeResponse(
13162 reinterpret_cast<const char*>(packet), sizeof(packet),
13163 reinterpret_cast<char*>(parsed_probe_payload_bytes),
13164 &parsed_probe_payload_length, &parse_detailed_error));
13165 EXPECT_EQ("", parse_detailed_error);
13166 quiche::test::CompareCharArraysWithHexError(
13167 "parsed probe", parsed_probe_payload_bytes, parsed_probe_payload_length,
13168 probe_payload_bytes, sizeof(probe_payload_bytes));
13169 }
13170
TEST_P(QuicFramerTest,ParseClientVersionNegotiationProbePacket)13171 TEST_P(QuicFramerTest, ParseClientVersionNegotiationProbePacket) {
13172 char packet[1200];
13173 char input_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13174 0x6c, 0x7a, 0x20, 0x21};
13175 ASSERT_TRUE(QuicFramer::WriteClientVersionNegotiationProbePacket(
13176 packet, sizeof(packet), input_destination_connection_id_bytes,
13177 sizeof(input_destination_connection_id_bytes)));
13178 char parsed_destination_connection_id_bytes[255] = {0};
13179 uint8_t parsed_destination_connection_id_length =
13180 sizeof(parsed_destination_connection_id_bytes);
13181 ASSERT_TRUE(ParseClientVersionNegotiationProbePacket(
13182 packet, sizeof(packet), parsed_destination_connection_id_bytes,
13183 &parsed_destination_connection_id_length));
13184 quiche::test::CompareCharArraysWithHexError(
13185 "parsed destination connection ID",
13186 parsed_destination_connection_id_bytes,
13187 parsed_destination_connection_id_length,
13188 input_destination_connection_id_bytes,
13189 sizeof(input_destination_connection_id_bytes));
13190 }
13191
TEST_P(QuicFramerTest,WriteServerVersionNegotiationProbeResponse)13192 TEST_P(QuicFramerTest, WriteServerVersionNegotiationProbeResponse) {
13193 char packet[1200];
13194 size_t packet_length = sizeof(packet);
13195 char input_source_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13196 0x6c, 0x7a, 0x20, 0x21};
13197 ASSERT_TRUE(WriteServerVersionNegotiationProbeResponse(
13198 packet, &packet_length, input_source_connection_id_bytes,
13199 sizeof(input_source_connection_id_bytes)));
13200 char parsed_source_connection_id_bytes[255] = {0};
13201 uint8_t parsed_source_connection_id_length =
13202 sizeof(parsed_source_connection_id_bytes);
13203 std::string detailed_error;
13204 ASSERT_TRUE(QuicFramer::ParseServerVersionNegotiationProbeResponse(
13205 packet, packet_length, parsed_source_connection_id_bytes,
13206 &parsed_source_connection_id_length, &detailed_error))
13207 << detailed_error;
13208 quiche::test::CompareCharArraysWithHexError(
13209 "parsed destination connection ID", parsed_source_connection_id_bytes,
13210 parsed_source_connection_id_length, input_source_connection_id_bytes,
13211 sizeof(input_source_connection_id_bytes));
13212 }
13213
TEST_P(QuicFramerTest,ClientConnectionIdFromLongHeaderToClient)13214 TEST_P(QuicFramerTest, ClientConnectionIdFromLongHeaderToClient) {
13215 SetDecrypterLevel(ENCRYPTION_HANDSHAKE);
13216 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13217 // clang-format off
13218 unsigned char packet[] = {
13219 // public flags (long header with packet type HANDSHAKE and
13220 // 4-byte packet number)
13221 0xE3,
13222 // version
13223 QUIC_VERSION_BYTES,
13224 // connection ID lengths
13225 0x50,
13226 // destination connection ID
13227 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13228 // long header packet length
13229 0x05,
13230 // packet number
13231 0x12, 0x34, 0x56, 0x00,
13232 // padding frame
13233 0x00,
13234 };
13235 unsigned char packet49[] = {
13236 // public flags (long header with packet type HANDSHAKE and
13237 // 4-byte packet number)
13238 0xE3,
13239 // version
13240 QUIC_VERSION_BYTES,
13241 // destination connection ID length
13242 0x08,
13243 // destination connection ID
13244 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13245 // source connection ID length
13246 0x00,
13247 // long header packet length
13248 0x05,
13249 // packet number
13250 0x12, 0x34, 0x56, 0x00,
13251 // padding frame
13252 0x00,
13253 };
13254 // clang-format on
13255
13256 unsigned char* p = packet;
13257 size_t p_length = ABSL_ARRAYSIZE(packet);
13258 if (framer_.version().HasLongHeaderLengths()) {
13259 ReviseFirstByteByVersion(packet49);
13260 p = packet49;
13261 p_length = ABSL_ARRAYSIZE(packet49);
13262 }
13263 const bool parse_success =
13264 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false));
13265 if (!framer_.version().AllowsVariableLengthConnectionIds()) {
13266 EXPECT_FALSE(parse_success);
13267 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
13268 EXPECT_EQ("Invalid ConnectionId length.", framer_.detailed_error());
13269 return;
13270 }
13271 EXPECT_TRUE(parse_success);
13272 EXPECT_THAT(framer_.error(), IsQuicNoError());
13273 EXPECT_EQ("", framer_.detailed_error());
13274 ASSERT_TRUE(visitor_.header_.get());
13275 EXPECT_EQ(FramerTestConnectionId(),
13276 visitor_.header_.get()->destination_connection_id);
13277 }
13278
TEST_P(QuicFramerTest,ClientConnectionIdFromLongHeaderToServer)13279 TEST_P(QuicFramerTest, ClientConnectionIdFromLongHeaderToServer) {
13280 SetDecrypterLevel(ENCRYPTION_HANDSHAKE);
13281 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13282 // clang-format off
13283 unsigned char packet[] = {
13284 // public flags (long header with packet type HANDSHAKE and
13285 // 4-byte packet number)
13286 0xE3,
13287 // version
13288 QUIC_VERSION_BYTES,
13289 // connection ID lengths
13290 0x05,
13291 // source connection ID
13292 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13293 // long header packet length
13294 0x05,
13295 // packet number
13296 0x12, 0x34, 0x56, 0x00,
13297 // padding frame
13298 0x00,
13299 };
13300 unsigned char packet49[] = {
13301 // public flags (long header with packet type HANDSHAKE and
13302 // 4-byte packet number)
13303 0xE3,
13304 // version
13305 QUIC_VERSION_BYTES,
13306 // connection ID lengths
13307 0x00, 0x08,
13308 // source connection ID
13309 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13310 // long header packet length
13311 0x05,
13312 // packet number
13313 0x12, 0x34, 0x56, 0x00,
13314 // padding frame
13315 0x00,
13316 };
13317 // clang-format on
13318 unsigned char* p = packet;
13319 size_t p_length = ABSL_ARRAYSIZE(packet);
13320 if (framer_.version().HasLongHeaderLengths()) {
13321 ReviseFirstByteByVersion(packet49);
13322 p = packet49;
13323 p_length = ABSL_ARRAYSIZE(packet49);
13324 }
13325 const bool parse_success =
13326 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false));
13327 if (!framer_.version().AllowsVariableLengthConnectionIds()) {
13328 EXPECT_FALSE(parse_success);
13329 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
13330 EXPECT_EQ("Invalid ConnectionId length.", framer_.detailed_error());
13331 return;
13332 }
13333 if (!framer_.version().SupportsClientConnectionIds()) {
13334 EXPECT_FALSE(parse_success);
13335 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
13336 EXPECT_EQ("Client connection ID not supported in this version.",
13337 framer_.detailed_error());
13338 return;
13339 }
13340 EXPECT_TRUE(parse_success);
13341 EXPECT_THAT(framer_.error(), IsQuicNoError());
13342 EXPECT_EQ("", framer_.detailed_error());
13343 ASSERT_TRUE(visitor_.header_.get());
13344 EXPECT_EQ(FramerTestConnectionId(),
13345 visitor_.header_.get()->source_connection_id);
13346 }
13347
TEST_P(QuicFramerTest,ProcessAndValidateIetfConnectionIdLengthClient)13348 TEST_P(QuicFramerTest, ProcessAndValidateIetfConnectionIdLengthClient) {
13349 char connection_id_lengths = 0x05;
13350 QuicDataReader reader(&connection_id_lengths, 1);
13351
13352 bool should_update_expected_server_connection_id_length = false;
13353 uint8_t expected_server_connection_id_length = 8;
13354 uint8_t destination_connection_id_length = 0;
13355 uint8_t source_connection_id_length = 8;
13356 std::string detailed_error = "";
13357
13358 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13359 &reader, framer_.version(), Perspective::IS_CLIENT,
13360 should_update_expected_server_connection_id_length,
13361 &expected_server_connection_id_length, &destination_connection_id_length,
13362 &source_connection_id_length, &detailed_error));
13363 EXPECT_EQ(8, expected_server_connection_id_length);
13364 EXPECT_EQ(0, destination_connection_id_length);
13365 EXPECT_EQ(8, source_connection_id_length);
13366 EXPECT_EQ("", detailed_error);
13367
13368 QuicDataReader reader2(&connection_id_lengths, 1);
13369 should_update_expected_server_connection_id_length = true;
13370 expected_server_connection_id_length = 33;
13371 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13372 &reader2, framer_.version(), Perspective::IS_CLIENT,
13373 should_update_expected_server_connection_id_length,
13374 &expected_server_connection_id_length, &destination_connection_id_length,
13375 &source_connection_id_length, &detailed_error));
13376 EXPECT_EQ(8, expected_server_connection_id_length);
13377 EXPECT_EQ(0, destination_connection_id_length);
13378 EXPECT_EQ(8, source_connection_id_length);
13379 EXPECT_EQ("", detailed_error);
13380 }
13381
TEST_P(QuicFramerTest,ProcessAndValidateIetfConnectionIdLengthServer)13382 TEST_P(QuicFramerTest, ProcessAndValidateIetfConnectionIdLengthServer) {
13383 char connection_id_lengths = 0x50;
13384 QuicDataReader reader(&connection_id_lengths, 1);
13385
13386 bool should_update_expected_server_connection_id_length = false;
13387 uint8_t expected_server_connection_id_length = 8;
13388 uint8_t destination_connection_id_length = 8;
13389 uint8_t source_connection_id_length = 0;
13390 std::string detailed_error = "";
13391
13392 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13393 &reader, framer_.version(), Perspective::IS_SERVER,
13394 should_update_expected_server_connection_id_length,
13395 &expected_server_connection_id_length, &destination_connection_id_length,
13396 &source_connection_id_length, &detailed_error));
13397 EXPECT_EQ(8, expected_server_connection_id_length);
13398 EXPECT_EQ(8, destination_connection_id_length);
13399 EXPECT_EQ(0, source_connection_id_length);
13400 EXPECT_EQ("", detailed_error);
13401
13402 QuicDataReader reader2(&connection_id_lengths, 1);
13403 should_update_expected_server_connection_id_length = true;
13404 expected_server_connection_id_length = 33;
13405 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13406 &reader2, framer_.version(), Perspective::IS_SERVER,
13407 should_update_expected_server_connection_id_length,
13408 &expected_server_connection_id_length, &destination_connection_id_length,
13409 &source_connection_id_length, &detailed_error));
13410 EXPECT_EQ(8, expected_server_connection_id_length);
13411 EXPECT_EQ(8, destination_connection_id_length);
13412 EXPECT_EQ(0, source_connection_id_length);
13413 EXPECT_EQ("", detailed_error);
13414 }
13415
TEST_P(QuicFramerTest,TestExtendedErrorCodeParser)13416 TEST_P(QuicFramerTest, TestExtendedErrorCodeParser) {
13417 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
13418 // Extended error codes only in IETF QUIC
13419 return;
13420 }
13421 QuicConnectionCloseFrame frame;
13422
13423 frame.error_details = "this has no error code info in it";
13424 MaybeExtractQuicErrorCode(&frame);
13425 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13426 EXPECT_EQ("this has no error code info in it", frame.error_details);
13427
13428 frame.error_details = "1234this does not have the colon in it";
13429 MaybeExtractQuicErrorCode(&frame);
13430 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13431 EXPECT_EQ("1234this does not have the colon in it", frame.error_details);
13432
13433 frame.error_details = "1a234:this has a colon, but a malformed error number";
13434 MaybeExtractQuicErrorCode(&frame);
13435 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13436 EXPECT_EQ("1a234:this has a colon, but a malformed error number",
13437 frame.error_details);
13438
13439 frame.error_details = "1234:this is good";
13440 MaybeExtractQuicErrorCode(&frame);
13441 EXPECT_EQ(1234u, frame.quic_error_code);
13442 EXPECT_EQ("this is good", frame.error_details);
13443
13444 frame.error_details =
13445 "1234 :this is not good, space between last digit and colon";
13446 MaybeExtractQuicErrorCode(&frame);
13447 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13448 EXPECT_EQ("1234 :this is not good, space between last digit and colon",
13449 frame.error_details);
13450
13451 frame.error_details = "123456789";
13452 MaybeExtractQuicErrorCode(&frame);
13453 EXPECT_THAT(
13454 frame.quic_error_code,
13455 IsError(QUIC_IETF_GQUIC_ERROR_MISSING)); // Not good, all numbers, no :
13456 EXPECT_EQ("123456789", frame.error_details);
13457
13458 frame.error_details = "1234:";
13459 MaybeExtractQuicErrorCode(&frame);
13460 EXPECT_EQ(1234u,
13461 frame.quic_error_code); // corner case.
13462 EXPECT_EQ("", frame.error_details);
13463
13464 frame.error_details = "1234:5678";
13465 MaybeExtractQuicErrorCode(&frame);
13466 EXPECT_EQ(1234u,
13467 frame.quic_error_code); // another corner case.
13468 EXPECT_EQ("5678", frame.error_details);
13469
13470 frame.error_details = "12345 6789:";
13471 MaybeExtractQuicErrorCode(&frame);
13472 EXPECT_THAT(frame.quic_error_code,
13473 IsError(QUIC_IETF_GQUIC_ERROR_MISSING)); // Not good
13474 EXPECT_EQ("12345 6789:", frame.error_details);
13475
13476 frame.error_details = ":no numbers, is not good";
13477 MaybeExtractQuicErrorCode(&frame);
13478 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13479 EXPECT_EQ(":no numbers, is not good", frame.error_details);
13480
13481 frame.error_details = "qwer:also no numbers, is not good";
13482 MaybeExtractQuicErrorCode(&frame);
13483 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13484 EXPECT_EQ("qwer:also no numbers, is not good", frame.error_details);
13485
13486 frame.error_details = " 1234:this is not good, space before first digit";
13487 MaybeExtractQuicErrorCode(&frame);
13488 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13489 EXPECT_EQ(" 1234:this is not good, space before first digit",
13490 frame.error_details);
13491
13492 frame.error_details = "1234:";
13493 MaybeExtractQuicErrorCode(&frame);
13494 EXPECT_EQ(1234u,
13495 frame.quic_error_code); // this is good
13496 EXPECT_EQ("", frame.error_details);
13497
13498 // Value does not fit in uint32_t.
13499 frame.error_details = "12345678901:";
13500 MaybeExtractQuicErrorCode(&frame);
13501 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13502 EXPECT_EQ("12345678901:", frame.error_details);
13503 }
13504
13505 // Regression test for crbug/1029636.
TEST_P(QuicFramerTest,OverlyLargeAckDelay)13506 TEST_P(QuicFramerTest, OverlyLargeAckDelay) {
13507 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
13508 return;
13509 }
13510 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
13511 // clang-format off
13512 unsigned char packet_ietf[] = {
13513 // type (short header, 4 byte packet number)
13514 0x43,
13515 // connection_id
13516 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13517 // packet number
13518 0x12, 0x34, 0x56, 0x78,
13519
13520 // frame type (IETF_ACK frame)
13521 0x02,
13522 // largest acked
13523 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
13524 // ack delay time.
13525 kVarInt62EightBytes + 0x31, 0x00, 0x00, 0x00, 0xF3, 0xA0, 0x81, 0xE0,
13526 // Nr. of additional ack blocks
13527 kVarInt62OneByte + 0x00,
13528 // first ack block length.
13529 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
13530 };
13531 // clang-format on
13532
13533 framer_.ProcessPacket(QuicEncryptedPacket(
13534 AsChars(packet_ietf), ABSL_ARRAYSIZE(packet_ietf), false));
13535 ASSERT_EQ(1u, visitor_.ack_frames_.size());
13536 // Verify ack_delay_time is set correctly.
13537 EXPECT_EQ(QuicTime::Delta::Infinite(),
13538 visitor_.ack_frames_[0]->ack_delay_time);
13539 }
13540
TEST_P(QuicFramerTest,KeyUpdate)13541 TEST_P(QuicFramerTest, KeyUpdate) {
13542 if (!framer_.version().UsesTls()) {
13543 // Key update is only used in QUIC+TLS.
13544 return;
13545 }
13546 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13547 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13548 // instead of TestDecrypter.
13549 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13550 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13551 framer_.SetKeyUpdateSupportForConnection(true);
13552
13553 QuicPacketHeader header;
13554 header.destination_connection_id = FramerTestConnectionId();
13555 header.reset_flag = false;
13556 header.version_flag = false;
13557 header.packet_number = kPacketNumber;
13558
13559 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13560
13561 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13562 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13563 ASSERT_TRUE(data != nullptr);
13564 std::unique_ptr<QuicEncryptedPacket> encrypted(
13565 EncryptPacketWithTagAndPhase(*data, 0, false));
13566 ASSERT_TRUE(encrypted);
13567
13568 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13569 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13570 // Processed valid packet with phase=0, key=1: no key update.
13571 EXPECT_EQ(0u, visitor_.key_update_count());
13572 EXPECT_EQ(0, visitor_.derive_next_key_count_);
13573 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13574
13575 header.packet_number += 1;
13576 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13577 data = BuildDataPacket(header, frames);
13578 ASSERT_TRUE(data != nullptr);
13579 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13580 ASSERT_TRUE(encrypted);
13581 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13582 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13583 // Processed valid packet with phase=1, key=2: key update should have
13584 // occurred.
13585 ASSERT_EQ(1u, visitor_.key_update_count());
13586 EXPECT_EQ(KeyUpdateReason::kRemote, visitor_.key_update_reasons_[0]);
13587 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13588 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13589
13590 header.packet_number += 1;
13591 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13592 data = BuildDataPacket(header, frames);
13593 ASSERT_TRUE(data != nullptr);
13594 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13595 ASSERT_TRUE(encrypted);
13596 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13597 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13598 // Processed another valid packet with phase=1, key=2: no key update.
13599 EXPECT_EQ(1u, visitor_.key_update_count());
13600 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13601 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13602
13603 // Process another key update.
13604 header.packet_number += 1;
13605 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13606 data = BuildDataPacket(header, frames);
13607 ASSERT_TRUE(data != nullptr);
13608 encrypted = EncryptPacketWithTagAndPhase(*data, 2, false);
13609 ASSERT_TRUE(encrypted);
13610 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13611 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13612 ASSERT_EQ(2u, visitor_.key_update_count());
13613 EXPECT_EQ(KeyUpdateReason::kRemote, visitor_.key_update_reasons_[1]);
13614 EXPECT_EQ(2, visitor_.derive_next_key_count_);
13615 EXPECT_EQ(3, visitor_.decrypted_first_packet_in_key_phase_count_);
13616 }
13617
TEST_P(QuicFramerTest,KeyUpdateOldPacketAfterUpdate)13618 TEST_P(QuicFramerTest, KeyUpdateOldPacketAfterUpdate) {
13619 if (!framer_.version().UsesTls()) {
13620 // Key update is only used in QUIC+TLS.
13621 return;
13622 }
13623 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13624 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13625 // instead of TestDecrypter.
13626 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13627 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13628 framer_.SetKeyUpdateSupportForConnection(true);
13629
13630 QuicPacketHeader header;
13631 header.destination_connection_id = FramerTestConnectionId();
13632 header.reset_flag = false;
13633 header.version_flag = false;
13634 header.packet_number = kPacketNumber;
13635
13636 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13637
13638 // Process packet N with phase 0.
13639 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13640 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13641 ASSERT_TRUE(data != nullptr);
13642 std::unique_ptr<QuicEncryptedPacket> encrypted(
13643 EncryptPacketWithTagAndPhase(*data, 0, false));
13644 ASSERT_TRUE(encrypted);
13645 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13646 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13647 EXPECT_EQ(0u, visitor_.key_update_count());
13648 EXPECT_EQ(0, visitor_.derive_next_key_count_);
13649 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13650
13651 // Process packet N+2 with phase 1.
13652 header.packet_number = kPacketNumber + 2;
13653 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13654 data = BuildDataPacket(header, frames);
13655 ASSERT_TRUE(data != nullptr);
13656 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13657 ASSERT_TRUE(encrypted);
13658 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13659 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13660 EXPECT_EQ(1u, visitor_.key_update_count());
13661 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13662 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13663
13664 // Process packet N+1 with phase 0. (Receiving packet from previous phase
13665 // after packet from new phase was received.)
13666 header.packet_number = kPacketNumber + 1;
13667 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13668 data = BuildDataPacket(header, frames);
13669 ASSERT_TRUE(data != nullptr);
13670 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
13671 ASSERT_TRUE(encrypted);
13672 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13673 // Packet should decrypt and key update count should not change.
13674 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13675 EXPECT_EQ(1u, visitor_.key_update_count());
13676 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13677 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13678 }
13679
TEST_P(QuicFramerTest,KeyUpdateOldPacketAfterDiscardPreviousOneRttKeys)13680 TEST_P(QuicFramerTest, KeyUpdateOldPacketAfterDiscardPreviousOneRttKeys) {
13681 if (!framer_.version().UsesTls()) {
13682 // Key update is only used in QUIC+TLS.
13683 return;
13684 }
13685 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13686 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13687 // instead of TestDecrypter.
13688 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13689 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13690 framer_.SetKeyUpdateSupportForConnection(true);
13691
13692 QuicPacketHeader header;
13693 header.destination_connection_id = FramerTestConnectionId();
13694 header.reset_flag = false;
13695 header.version_flag = false;
13696 header.packet_number = kPacketNumber;
13697
13698 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13699
13700 // Process packet N with phase 0.
13701 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13702 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13703 ASSERT_TRUE(data != nullptr);
13704 std::unique_ptr<QuicEncryptedPacket> encrypted(
13705 EncryptPacketWithTagAndPhase(*data, 0, false));
13706 ASSERT_TRUE(encrypted);
13707 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13708 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13709 EXPECT_EQ(0u, visitor_.key_update_count());
13710 EXPECT_EQ(0, visitor_.derive_next_key_count_);
13711 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13712
13713 // Process packet N+2 with phase 1.
13714 header.packet_number = kPacketNumber + 2;
13715 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13716 data = BuildDataPacket(header, frames);
13717 ASSERT_TRUE(data != nullptr);
13718 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13719 ASSERT_TRUE(encrypted);
13720 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13721 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13722 EXPECT_EQ(1u, visitor_.key_update_count());
13723 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13724 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13725
13726 // Discard keys for previous key phase.
13727 framer_.DiscardPreviousOneRttKeys();
13728
13729 // Process packet N+1 with phase 0. (Receiving packet from previous phase
13730 // after packet from new phase was received.)
13731 header.packet_number = kPacketNumber + 1;
13732 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13733 data = BuildDataPacket(header, frames);
13734 ASSERT_TRUE(data != nullptr);
13735 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
13736 ASSERT_TRUE(encrypted);
13737 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13738 // Packet should not decrypt and key update count should not change.
13739 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13740 EXPECT_EQ(1u, visitor_.key_update_count());
13741 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13742 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13743 }
13744
TEST_P(QuicFramerTest,KeyUpdatePacketsOutOfOrder)13745 TEST_P(QuicFramerTest, KeyUpdatePacketsOutOfOrder) {
13746 if (!framer_.version().UsesTls()) {
13747 // Key update is only used in QUIC+TLS.
13748 return;
13749 }
13750 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13751 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13752 // instead of TestDecrypter.
13753 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13754 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13755 framer_.SetKeyUpdateSupportForConnection(true);
13756
13757 QuicPacketHeader header;
13758 header.destination_connection_id = FramerTestConnectionId();
13759 header.reset_flag = false;
13760 header.version_flag = false;
13761 header.packet_number = kPacketNumber;
13762
13763 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13764
13765 // Process packet N with phase 0.
13766 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13767 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13768 ASSERT_TRUE(data != nullptr);
13769 std::unique_ptr<QuicEncryptedPacket> encrypted(
13770 EncryptPacketWithTagAndPhase(*data, 0, false));
13771 ASSERT_TRUE(encrypted);
13772 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13773 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13774 EXPECT_EQ(0u, visitor_.key_update_count());
13775 EXPECT_EQ(0, visitor_.derive_next_key_count_);
13776 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13777
13778 // Process packet N+2 with phase 1.
13779 header.packet_number = kPacketNumber + 2;
13780 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13781 data = BuildDataPacket(header, frames);
13782 ASSERT_TRUE(data != nullptr);
13783 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13784 ASSERT_TRUE(encrypted);
13785 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13786 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13787 EXPECT_EQ(1u, visitor_.key_update_count());
13788 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13789 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13790
13791 // Process packet N+1 with phase 1. (Receiving packet from new phase out of
13792 // order.)
13793 header.packet_number = kPacketNumber + 1;
13794 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13795 data = BuildDataPacket(header, frames);
13796 ASSERT_TRUE(data != nullptr);
13797 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13798 ASSERT_TRUE(encrypted);
13799 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13800 // Packet should decrypt and key update count should not change.
13801 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13802 EXPECT_EQ(1u, visitor_.key_update_count());
13803 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13804 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13805 }
13806
TEST_P(QuicFramerTest,KeyUpdateWrongKey)13807 TEST_P(QuicFramerTest, KeyUpdateWrongKey) {
13808 if (!framer_.version().UsesTls()) {
13809 // Key update is only used in QUIC+TLS.
13810 return;
13811 }
13812 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13813 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13814 // instead of TestDecrypter.
13815 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13816 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13817 framer_.SetKeyUpdateSupportForConnection(true);
13818
13819 QuicPacketHeader header;
13820 header.destination_connection_id = FramerTestConnectionId();
13821 header.reset_flag = false;
13822 header.version_flag = false;
13823 header.packet_number = kPacketNumber;
13824
13825 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13826
13827 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13828 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13829 ASSERT_TRUE(data != nullptr);
13830 std::unique_ptr<QuicEncryptedPacket> encrypted(
13831 EncryptPacketWithTagAndPhase(*data, 0, false));
13832 ASSERT_TRUE(encrypted);
13833
13834 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13835 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13836 // Processed valid packet with phase=0, key=1: no key update.
13837 EXPECT_EQ(0u, visitor_.key_update_count());
13838 EXPECT_EQ(0, visitor_.derive_next_key_count_);
13839 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13840 EXPECT_EQ(0u, framer_.PotentialPeerKeyUpdateAttemptCount());
13841
13842 header.packet_number += 1;
13843 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13844 data = BuildDataPacket(header, frames);
13845 ASSERT_TRUE(data != nullptr);
13846 encrypted = EncryptPacketWithTagAndPhase(*data, 2, true);
13847 ASSERT_TRUE(encrypted);
13848 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13849 // Packet with phase=1 but key=3, should not process and should not cause key
13850 // update, but next decrypter key should have been created to attempt to
13851 // decode it.
13852 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13853 EXPECT_EQ(0u, visitor_.key_update_count());
13854 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13855 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13856 EXPECT_EQ(1u, framer_.PotentialPeerKeyUpdateAttemptCount());
13857
13858 header.packet_number += 1;
13859 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13860 data = BuildDataPacket(header, frames);
13861 ASSERT_TRUE(data != nullptr);
13862 encrypted = EncryptPacketWithTagAndPhase(*data, 0, true);
13863 ASSERT_TRUE(encrypted);
13864 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13865 // Packet with phase=1 but key=1, should not process and should not cause key
13866 // update.
13867 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13868 EXPECT_EQ(0u, visitor_.key_update_count());
13869 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13870 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13871 EXPECT_EQ(2u, framer_.PotentialPeerKeyUpdateAttemptCount());
13872
13873 header.packet_number += 1;
13874 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13875 data = BuildDataPacket(header, frames);
13876 ASSERT_TRUE(data != nullptr);
13877 encrypted = EncryptPacketWithTagAndPhase(*data, 1, false);
13878 ASSERT_TRUE(encrypted);
13879 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13880 // Packet with phase=0 but key=2, should not process and should not cause key
13881 // update.
13882 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13883 EXPECT_EQ(0u, visitor_.key_update_count());
13884 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13885 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13886 EXPECT_EQ(2u, framer_.PotentialPeerKeyUpdateAttemptCount());
13887
13888 header.packet_number += 1;
13889 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13890 data = BuildDataPacket(header, frames);
13891 ASSERT_TRUE(data != nullptr);
13892 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
13893 ASSERT_TRUE(encrypted);
13894 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13895 // Packet with phase=0 and key=0, should process and reset
13896 // potential_peer_key_update_attempt_count_.
13897 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13898 EXPECT_EQ(0u, visitor_.key_update_count());
13899 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13900 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13901 EXPECT_EQ(0u, framer_.PotentialPeerKeyUpdateAttemptCount());
13902 }
13903
TEST_P(QuicFramerTest,KeyUpdateReceivedWhenNotEnabled)13904 TEST_P(QuicFramerTest, KeyUpdateReceivedWhenNotEnabled) {
13905 if (!framer_.version().UsesTls()) {
13906 // Key update is only used in QUIC+TLS.
13907 return;
13908 }
13909 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13910 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13911 // instead of TestDecrypter.
13912 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13913 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13914
13915 QuicPacketHeader header;
13916 header.destination_connection_id = FramerTestConnectionId();
13917 header.reset_flag = false;
13918 header.version_flag = false;
13919 header.packet_number = kPacketNumber;
13920
13921 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13922
13923 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13924 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13925 ASSERT_TRUE(data != nullptr);
13926 std::unique_ptr<QuicEncryptedPacket> encrypted(
13927 EncryptPacketWithTagAndPhase(*data, 1, true));
13928 ASSERT_TRUE(encrypted);
13929
13930 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13931 // Received a packet with key phase updated even though framer hasn't had key
13932 // update enabled (SetNextOneRttCrypters never called). Should fail to
13933 // process.
13934 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13935 EXPECT_EQ(0u, visitor_.key_update_count());
13936 EXPECT_EQ(0, visitor_.derive_next_key_count_);
13937 EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
13938 }
13939
TEST_P(QuicFramerTest,KeyUpdateLocallyInitiated)13940 TEST_P(QuicFramerTest, KeyUpdateLocallyInitiated) {
13941 if (!framer_.version().UsesTls()) {
13942 // Key update is only used in QUIC+TLS.
13943 return;
13944 }
13945 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13946 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13947 // instead of TestDecrypter.
13948 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13949 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13950 framer_.SetKeyUpdateSupportForConnection(true);
13951
13952 EXPECT_TRUE(framer_.DoKeyUpdate(KeyUpdateReason::kLocalForTests));
13953 // Key update count should be updated, but haven't received packet from peer
13954 // with new key phase.
13955 ASSERT_EQ(1u, visitor_.key_update_count());
13956 EXPECT_EQ(KeyUpdateReason::kLocalForTests, visitor_.key_update_reasons_[0]);
13957 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13958 EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
13959
13960 QuicPacketHeader header;
13961 header.destination_connection_id = FramerTestConnectionId();
13962 header.reset_flag = false;
13963 header.version_flag = false;
13964 header.packet_number = kPacketNumber;
13965
13966 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13967
13968 // Process packet N with phase 1.
13969 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13970 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13971 ASSERT_TRUE(data != nullptr);
13972 std::unique_ptr<QuicEncryptedPacket> encrypted(
13973 EncryptPacketWithTagAndPhase(*data, 1, true));
13974 ASSERT_TRUE(encrypted);
13975
13976 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13977 // Packet should decrypt and key update count should not change and
13978 // OnDecryptedFirstPacketInKeyPhase should have been called.
13979 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13980 EXPECT_EQ(1u, visitor_.key_update_count());
13981 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13982 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13983
13984 // Process packet N-1 with phase 0. (Receiving packet from previous phase
13985 // after packet from new phase was received.)
13986 header.packet_number = kPacketNumber - 1;
13987 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13988 data = BuildDataPacket(header, frames);
13989 ASSERT_TRUE(data != nullptr);
13990 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
13991 ASSERT_TRUE(encrypted);
13992 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13993 // Packet should decrypt and key update count should not change.
13994 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13995 EXPECT_EQ(1u, visitor_.key_update_count());
13996 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13997 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13998
13999 // Process packet N+1 with phase 0 and key 1. This should not decrypt even
14000 // though it's using the previous key, since the packet number is higher than
14001 // a packet number received using the current key.
14002 header.packet_number = kPacketNumber + 1;
14003 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14004 data = BuildDataPacket(header, frames);
14005 ASSERT_TRUE(data != nullptr);
14006 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
14007 ASSERT_TRUE(encrypted);
14008 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14009 // Packet should not decrypt and key update count should not change.
14010 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
14011 EXPECT_EQ(1u, visitor_.key_update_count());
14012 EXPECT_EQ(2, visitor_.derive_next_key_count_);
14013 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14014 }
14015
TEST_P(QuicFramerTest,KeyUpdateLocallyInitiatedReceivedOldPacket)14016 TEST_P(QuicFramerTest, KeyUpdateLocallyInitiatedReceivedOldPacket) {
14017 if (!framer_.version().UsesTls()) {
14018 // Key update is only used in QUIC+TLS.
14019 return;
14020 }
14021 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14022 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14023 // instead of TestDecrypter.
14024 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14025 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14026 framer_.SetKeyUpdateSupportForConnection(true);
14027
14028 EXPECT_TRUE(framer_.DoKeyUpdate(KeyUpdateReason::kLocalForTests));
14029 // Key update count should be updated, but haven't received packet
14030 // from peer with new key phase.
14031 EXPECT_EQ(1u, visitor_.key_update_count());
14032 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14033 EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
14034
14035 QuicPacketHeader header;
14036 header.destination_connection_id = FramerTestConnectionId();
14037 header.reset_flag = false;
14038 header.version_flag = false;
14039 header.packet_number = kPacketNumber;
14040
14041 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
14042
14043 // Process packet N with phase 0. (Receiving packet from previous phase
14044 // after locally initiated key update, but before any packet from new phase
14045 // was received.)
14046 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14047 std::unique_ptr<QuicPacket> data = BuildDataPacket(header, frames);
14048 ASSERT_TRUE(data != nullptr);
14049 std::unique_ptr<QuicEncryptedPacket> encrypted =
14050 EncryptPacketWithTagAndPhase(*data, 0, false);
14051 ASSERT_TRUE(encrypted);
14052 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14053 // Packet should decrypt and key update count should not change and
14054 // OnDecryptedFirstPacketInKeyPhase should not have been called since the
14055 // packet was from the previous key phase.
14056 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14057 EXPECT_EQ(1u, visitor_.key_update_count());
14058 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14059 EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
14060
14061 // Process packet N+1 with phase 1.
14062 header.packet_number = kPacketNumber + 1;
14063 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14064 data = BuildDataPacket(header, frames);
14065 ASSERT_TRUE(data != nullptr);
14066 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
14067 ASSERT_TRUE(encrypted);
14068 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14069 // Packet should decrypt and key update count should not change, but
14070 // OnDecryptedFirstPacketInKeyPhase should have been called.
14071 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14072 EXPECT_EQ(1u, visitor_.key_update_count());
14073 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14074 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14075
14076 // Process packet N+2 with phase 0 and key 1. This should not decrypt even
14077 // though it's using the previous key, since the packet number is higher than
14078 // a packet number received using the current key.
14079 header.packet_number = kPacketNumber + 2;
14080 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14081 data = BuildDataPacket(header, frames);
14082 ASSERT_TRUE(data != nullptr);
14083 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
14084 ASSERT_TRUE(encrypted);
14085 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14086 // Packet should not decrypt and key update count should not change.
14087 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
14088 EXPECT_EQ(1u, visitor_.key_update_count());
14089 EXPECT_EQ(2, visitor_.derive_next_key_count_);
14090 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14091 }
14092
TEST_P(QuicFramerTest,KeyUpdateOnFirstReceivedPacket)14093 TEST_P(QuicFramerTest, KeyUpdateOnFirstReceivedPacket) {
14094 if (!framer_.version().UsesTls()) {
14095 // Key update is only used in QUIC+TLS.
14096 return;
14097 }
14098 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14099 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14100 // instead of TestDecrypter.
14101 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14102 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14103 framer_.SetKeyUpdateSupportForConnection(true);
14104
14105 QuicPacketHeader header;
14106 header.destination_connection_id = FramerTestConnectionId();
14107 header.reset_flag = false;
14108 header.version_flag = false;
14109 header.packet_number = QuicPacketNumber(123);
14110
14111 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
14112
14113 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14114 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
14115 ASSERT_TRUE(data != nullptr);
14116 std::unique_ptr<QuicEncryptedPacket> encrypted(
14117 EncryptPacketWithTagAndPhase(*data, /*tag=*/1, /*phase=*/true));
14118 ASSERT_TRUE(encrypted);
14119
14120 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14121 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14122 // Processed valid packet with phase=1, key=1: do key update.
14123 EXPECT_EQ(1u, visitor_.key_update_count());
14124 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14125 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14126 }
14127
TEST_P(QuicFramerTest,ErrorWhenUnexpectedFrameTypeEncountered)14128 TEST_P(QuicFramerTest, ErrorWhenUnexpectedFrameTypeEncountered) {
14129 if (!VersionHasIetfQuicFrames(framer_.transport_version()) ||
14130 !QuicVersionHasLongHeaderLengths(framer_.transport_version()) ||
14131 !framer_.version().HasLongHeaderLengths()) {
14132 return;
14133 }
14134 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
14135 // clang-format off
14136 unsigned char packet[] = {
14137 // public flags (long header with packet type ZERO_RTT_PROTECTED and
14138 // 4-byte packet number)
14139 0xD3,
14140 // version
14141 QUIC_VERSION_BYTES,
14142 // destination connection ID length
14143 0x08,
14144 // destination connection ID
14145 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
14146 // source connection ID length
14147 0x08,
14148 // source connection ID
14149 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
14150 // long header packet length
14151 0x05,
14152 // packet number
14153 0x12, 0x34, 0x56, 0x00,
14154 // unexpected ietf ack frame type in 0-RTT packet
14155 0x02,
14156 };
14157 // clang-format on
14158
14159 ReviseFirstByteByVersion(packet);
14160 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
14161
14162 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
14163
14164 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
14165 EXPECT_EQ(
14166 "IETF frame type IETF_ACK is unexpected at encryption level "
14167 "ENCRYPTION_ZERO_RTT",
14168 framer_.detailed_error());
14169 }
14170
TEST_P(QuicFramerTest,ShortHeaderWithNonDefaultConnectionIdLength)14171 TEST_P(QuicFramerTest, ShortHeaderWithNonDefaultConnectionIdLength) {
14172 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
14173 // clang-format off
14174 unsigned char packet[kMaxIncomingPacketSize + 1] = {
14175 // type (short header, 4 byte packet number)
14176 0x43,
14177 // connection_id
14178 0x28, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x48,
14179 // packet number
14180 0x12, 0x34, 0x56, 0x78,
14181
14182 // frame type (padding frame)
14183 0x00,
14184 0x00, 0x00, 0x00, 0x00
14185 };
14186 MockConnectionIdGenerator generator;
14187 EXPECT_CALL(generator, ConnectionIdLength(0x28)).WillOnce(Return(9));
14188 unsigned char* p = packet;
14189 size_t p_size = ABSL_ARRAYSIZE(packet);
14190
14191 const size_t header_size = GetPacketHeaderSize(
14192 framer_.transport_version(), kPacket8ByteConnectionId + 1,
14193 kPacket0ByteConnectionId, !kIncludeVersion,
14194 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
14195 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
14196 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0) + 1;
14197 // Add one because it's a 9 byte connection ID.
14198
14199 memset(p + header_size, 0, kMaxIncomingPacketSize - header_size);
14200
14201 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
14202 PacketHeaderFormat format;
14203 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
14204 bool version_flag;
14205 QuicConnectionId destination_connection_id, source_connection_id;
14206 QuicVersionLabel version_label;
14207 std::string detailed_error;
14208 bool use_length_prefix;
14209 std::optional<absl::string_view> retry_token;
14210 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
14211 EXPECT_EQ(QUIC_NO_ERROR,
14212 QuicFramer::ParsePublicHeaderDispatcherShortHeaderLengthUnknown(
14213 encrypted, &format, &long_packet_type, &version_flag,
14214 &use_length_prefix, &version_label, &parsed_version,
14215 &destination_connection_id, &source_connection_id, &retry_token,
14216 &detailed_error, generator));
14217 EXPECT_EQ(format, IETF_QUIC_SHORT_HEADER_PACKET);
14218 EXPECT_EQ(destination_connection_id.length(), 9);
14219 EXPECT_EQ(long_packet_type, INVALID_PACKET_TYPE);
14220 EXPECT_FALSE(version_flag);
14221 EXPECT_FALSE(use_length_prefix);
14222 EXPECT_EQ(version_label, 0);
14223 EXPECT_EQ(parsed_version, UnsupportedQuicVersion());
14224 EXPECT_EQ(source_connection_id.length(), 0);
14225 EXPECT_FALSE(retry_token.has_value());
14226 EXPECT_EQ(detailed_error, "");
14227 }
14228
TEST_P(QuicFramerTest,ReportEcnCountsIfPresent)14229 TEST_P(QuicFramerTest, ReportEcnCountsIfPresent) {
14230 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
14231 return;
14232 }
14233 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
14234
14235 QuicPacketHeader header;
14236 header.destination_connection_id = FramerTestConnectionId();
14237 header.reset_flag = false;
14238 header.version_flag = false;
14239 header.packet_number = kPacketNumber;
14240
14241 for (bool ecn_marks : { false, true }) {
14242 // Add some padding, because TestEncrypter doesn't add an authentication
14243 // tag. For a small packet, this will cause QuicFramer to fail to get a
14244 // header protection sample.
14245 QuicPaddingFrame padding_frame(kTagSize);
14246 // Create a packet with just an ack.
14247 QuicAckFrame ack_frame = InitAckFrame(5);
14248 if (ecn_marks) {
14249 ack_frame.ecn_counters = QuicEcnCounts(100, 10000, 1000000);
14250 } else {
14251 ack_frame.ecn_counters = std::nullopt;
14252 }
14253 QuicFrames frames = {QuicFrame(padding_frame), QuicFrame(&ack_frame)};
14254 // Build an ACK packet.
14255 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14256 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
14257 ASSERT_TRUE(raw_ack_packet != nullptr);
14258 char buffer[kMaxOutgoingPacketSize];
14259 size_t encrypted_length =
14260 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
14261 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
14262 ASSERT_NE(0u, encrypted_length);
14263 // Now make sure we can turn our ack packet back into an ack frame.
14264 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14265 MockFramerVisitor visitor;
14266 framer_.set_visitor(&visitor);
14267 EXPECT_CALL(visitor, OnPacket()).Times(1);
14268 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
14269 .Times(1)
14270 .WillOnce(Return(true));
14271 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
14272 .Times(1)
14273 .WillOnce(Return(true));
14274 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1);
14275 EXPECT_CALL(visitor, OnDecryptedPacket(_, _)).Times(1);
14276 EXPECT_CALL(visitor, OnAckFrameStart(_, _)).Times(1).WillOnce(Return(true));
14277 EXPECT_CALL(visitor, OnAckRange(_, _)).Times(1).WillOnce(Return(true));
14278 EXPECT_CALL(visitor, OnAckFrameEnd(_, ack_frame.ecn_counters))
14279 .Times(1).WillOnce(Return(true));
14280 EXPECT_CALL(visitor, OnPacketComplete()).Times(1);
14281 ASSERT_TRUE(framer_.ProcessPacket(
14282 QuicEncryptedPacket(buffer, encrypted_length, false)));
14283 }
14284 }
14285
14286 } // namespace
14287 } // namespace test
14288 } // namespace quic
14289