xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/core/quic_framer_test.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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/frames/quic_reset_stream_at_frame.h"
26 #include "quiche/quic/core/quic_connection_id.h"
27 #include "quiche/quic/core/quic_error_codes.h"
28 #include "quiche/quic/core/quic_packets.h"
29 #include "quiche/quic/core/quic_types.h"
30 #include "quiche/quic/core/quic_utils.h"
31 #include "quiche/quic/core/quic_versions.h"
32 #include "quiche/quic/platform/api/quic_expect_bug.h"
33 #include "quiche/quic/platform/api/quic_flags.h"
34 #include "quiche/quic/platform/api/quic_ip_address.h"
35 #include "quiche/quic/platform/api/quic_ip_address_family.h"
36 #include "quiche/quic/platform/api/quic_logging.h"
37 #include "quiche/quic/platform/api/quic_test.h"
38 #include "quiche/quic/test_tools/quic_framer_peer.h"
39 #include "quiche/quic/test_tools/quic_test_utils.h"
40 #include "quiche/quic/test_tools/simple_data_producer.h"
41 #include "quiche/common/test_tools/quiche_test_utils.h"
42 
43 using testing::_;
44 using testing::ContainerEq;
45 using testing::Return;
46 
47 namespace quic {
48 namespace test {
49 namespace {
50 
51 const uint64_t kEpoch = UINT64_C(1) << 32;
52 const uint64_t kMask = kEpoch - 1;
53 const uint8_t kPacket0ByteConnectionId = 0;
54 const uint8_t kPacket8ByteConnectionId = 8;
55 constexpr size_t kTagSize = 16;
56 
57 const StatelessResetToken kTestStatelessResetToken{
58     0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
59     0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f};
60 
61 // Use fields in which each byte is distinct to ensure that every byte is
62 // framed correctly. The values are otherwise arbitrary.
FramerTestConnectionId()63 QuicConnectionId FramerTestConnectionId() {
64   return TestConnectionId(UINT64_C(0xFEDCBA9876543210));
65 }
66 
FramerTestConnectionIdPlusOne()67 QuicConnectionId FramerTestConnectionIdPlusOne() {
68   return TestConnectionId(UINT64_C(0xFEDCBA9876543211));
69 }
70 
FramerTestConnectionIdNineBytes()71 QuicConnectionId FramerTestConnectionIdNineBytes() {
72   uint8_t connection_id_bytes[9] = {0xFE, 0xDC, 0xBA, 0x98, 0x76,
73                                     0x54, 0x32, 0x10, 0x42};
74   return QuicConnectionId(reinterpret_cast<char*>(connection_id_bytes),
75                           sizeof(connection_id_bytes));
76 }
77 
78 const QuicPacketNumber kPacketNumber = QuicPacketNumber(UINT64_C(0x12345678));
79 const QuicPacketNumber kSmallLargestObserved =
80     QuicPacketNumber(UINT16_C(0x1234));
81 const QuicPacketNumber kSmallMissingPacket = QuicPacketNumber(UINT16_C(0x1233));
82 const QuicPacketNumber kLeastUnacked = QuicPacketNumber(UINT64_C(0x012345670));
83 const QuicStreamId kStreamId = UINT64_C(0x01020304);
84 // Note that the high 4 bits of the stream offset must be less than 0x40
85 // in order to ensure that the value can be encoded using VarInt62 encoding.
86 const QuicStreamOffset kStreamOffset = UINT64_C(0x3A98FEDC32107654);
87 const QuicPublicResetNonceProof kNonceProof = UINT64_C(0xABCDEF0123456789);
88 
89 // In testing that we can ack the full range of packets...
90 // This is the largest packet number that can be represented in IETF QUIC
91 // varint62 format.
92 const QuicPacketNumber kLargestIetfLargestObserved =
93     QuicPacketNumber(UINT64_C(0x3fffffffffffffff));
94 // Encodings for the two bits in a VarInt62 that
95 // describe the length of the VarInt61. For binary packet
96 // formats in this file, the convention is to code the
97 // first byte as
98 //   kVarInt62FourBytes + 0x<value_in_that_byte>
99 const uint8_t kVarInt62OneByte = 0x00;
100 const uint8_t kVarInt62TwoBytes = 0x40;
101 const uint8_t kVarInt62FourBytes = 0x80;
102 const uint8_t kVarInt62EightBytes = 0xc0;
103 
104 class TestEncrypter : public QuicEncrypter {
105  public:
~TestEncrypter()106   ~TestEncrypter() override {}
SetKey(absl::string_view)107   bool SetKey(absl::string_view /*key*/) override { return true; }
SetNoncePrefix(absl::string_view)108   bool SetNoncePrefix(absl::string_view /*nonce_prefix*/) override {
109     return true;
110   }
SetIV(absl::string_view)111   bool SetIV(absl::string_view /*iv*/) override { return true; }
SetHeaderProtectionKey(absl::string_view)112   bool SetHeaderProtectionKey(absl::string_view /*key*/) override {
113     return true;
114   }
EncryptPacket(uint64_t packet_number,absl::string_view associated_data,absl::string_view plaintext,char * output,size_t * output_length,size_t)115   bool EncryptPacket(uint64_t packet_number, absl::string_view associated_data,
116                      absl::string_view plaintext, char* output,
117                      size_t* output_length,
118                      size_t /*max_output_length*/) override {
119     packet_number_ = QuicPacketNumber(packet_number);
120     associated_data_ = std::string(associated_data);
121     plaintext_ = std::string(plaintext);
122     memcpy(output, plaintext.data(), plaintext.length());
123     *output_length = plaintext.length();
124     return true;
125   }
GenerateHeaderProtectionMask(absl::string_view)126   std::string GenerateHeaderProtectionMask(
127       absl::string_view /*sample*/) override {
128     return std::string(5, 0);
129   }
GetKeySize() const130   size_t GetKeySize() const override { return 0; }
GetNoncePrefixSize() const131   size_t GetNoncePrefixSize() const override { return 0; }
GetIVSize() const132   size_t GetIVSize() const override { return 0; }
GetMaxPlaintextSize(size_t ciphertext_size) const133   size_t GetMaxPlaintextSize(size_t ciphertext_size) const override {
134     return ciphertext_size;
135   }
GetCiphertextSize(size_t plaintext_size) const136   size_t GetCiphertextSize(size_t plaintext_size) const override {
137     return plaintext_size;
138   }
GetConfidentialityLimit() const139   QuicPacketCount GetConfidentialityLimit() const override {
140     return std::numeric_limits<QuicPacketCount>::max();
141   }
GetKey() const142   absl::string_view GetKey() const override { return absl::string_view(); }
GetNoncePrefix() const143   absl::string_view GetNoncePrefix() const override {
144     return absl::string_view();
145   }
146 
147   QuicPacketNumber packet_number_;
148   std::string associated_data_;
149   std::string plaintext_;
150 };
151 
152 class TestDecrypter : public QuicDecrypter {
153  public:
~TestDecrypter()154   ~TestDecrypter() override {}
SetKey(absl::string_view)155   bool SetKey(absl::string_view /*key*/) override { return true; }
SetNoncePrefix(absl::string_view)156   bool SetNoncePrefix(absl::string_view /*nonce_prefix*/) override {
157     return true;
158   }
SetIV(absl::string_view)159   bool SetIV(absl::string_view /*iv*/) override { return true; }
SetHeaderProtectionKey(absl::string_view)160   bool SetHeaderProtectionKey(absl::string_view /*key*/) override {
161     return true;
162   }
SetPreliminaryKey(absl::string_view)163   bool SetPreliminaryKey(absl::string_view /*key*/) override {
164     QUIC_BUG(quic_bug_10486_1) << "should not be called";
165     return false;
166   }
SetDiversificationNonce(const DiversificationNonce &)167   bool SetDiversificationNonce(const DiversificationNonce& /*key*/) override {
168     return true;
169   }
DecryptPacket(uint64_t packet_number,absl::string_view associated_data,absl::string_view ciphertext,char * output,size_t * output_length,size_t)170   bool DecryptPacket(uint64_t packet_number, absl::string_view associated_data,
171                      absl::string_view ciphertext, char* output,
172                      size_t* output_length,
173                      size_t /*max_output_length*/) override {
174     packet_number_ = QuicPacketNumber(packet_number);
175     associated_data_ = std::string(associated_data);
176     ciphertext_ = std::string(ciphertext);
177     memcpy(output, ciphertext.data(), ciphertext.length());
178     *output_length = ciphertext.length();
179     return true;
180   }
GenerateHeaderProtectionMask(QuicDataReader *)181   std::string GenerateHeaderProtectionMask(
182       QuicDataReader* /*sample_reader*/) override {
183     return std::string(5, 0);
184   }
GetKeySize() const185   size_t GetKeySize() const override { return 0; }
GetNoncePrefixSize() const186   size_t GetNoncePrefixSize() const override { return 0; }
GetIVSize() const187   size_t GetIVSize() const override { return 0; }
GetKey() const188   absl::string_view GetKey() const override { return absl::string_view(); }
GetNoncePrefix() const189   absl::string_view GetNoncePrefix() const override {
190     return absl::string_view();
191   }
192   // Use a distinct value starting with 0xFFFFFF, which is never used by TLS.
cipher_id() const193   uint32_t cipher_id() const override { return 0xFFFFFFF2; }
GetIntegrityLimit() const194   QuicPacketCount GetIntegrityLimit() const override {
195     return std::numeric_limits<QuicPacketCount>::max();
196   }
197   QuicPacketNumber packet_number_;
198   std::string associated_data_;
199   std::string ciphertext_;
200 };
201 
EncryptPacketWithTagAndPhase(const QuicPacket & packet,uint8_t tag,bool phase)202 std::unique_ptr<QuicEncryptedPacket> EncryptPacketWithTagAndPhase(
203     const QuicPacket& packet, uint8_t tag, bool phase) {
204   std::string packet_data = std::string(packet.AsStringPiece());
205   if (phase) {
206     packet_data[0] |= FLAGS_KEY_PHASE_BIT;
207   } else {
208     packet_data[0] &= ~FLAGS_KEY_PHASE_BIT;
209   }
210 
211   TaggingEncrypter crypter(tag);
212   const size_t packet_size = crypter.GetCiphertextSize(packet_data.size());
213   char* buffer = new char[packet_size];
214   size_t buf_len = 0;
215   if (!crypter.EncryptPacket(0, absl::string_view(), packet_data, buffer,
216                              &buf_len, packet_size)) {
217     delete[] buffer;
218     return nullptr;
219   }
220 
221   return std::make_unique<QuicEncryptedPacket>(buffer, buf_len,
222                                                /*owns_buffer=*/true);
223 }
224 
225 class TestQuicVisitor : public QuicFramerVisitorInterface {
226  public:
TestQuicVisitor()227   TestQuicVisitor()
228       : error_count_(0),
229         version_mismatch_(0),
230         packet_count_(0),
231         frame_count_(0),
232         complete_packets_(0),
233         derive_next_key_count_(0),
234         decrypted_first_packet_in_key_phase_count_(0),
235         accept_packet_(true),
236         accept_public_header_(true) {}
237 
~TestQuicVisitor()238   ~TestQuicVisitor() override {}
239 
OnError(QuicFramer * f)240   void OnError(QuicFramer* f) override {
241     QUIC_DLOG(INFO) << "QuicFramer Error: " << QuicErrorCodeToString(f->error())
242                     << " (" << f->error() << ")";
243     ++error_count_;
244   }
245 
OnPacket()246   void OnPacket() override {}
247 
OnVersionNegotiationPacket(const QuicVersionNegotiationPacket & packet)248   void OnVersionNegotiationPacket(
249       const QuicVersionNegotiationPacket& packet) override {
250     version_negotiation_packet_ =
251         std::make_unique<QuicVersionNegotiationPacket>((packet));
252     EXPECT_EQ(0u, framer_->current_received_frame_type());
253   }
254 
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)255   void OnRetryPacket(QuicConnectionId original_connection_id,
256                      QuicConnectionId new_connection_id,
257                      absl::string_view retry_token,
258                      absl::string_view retry_integrity_tag,
259                      absl::string_view retry_without_tag) override {
260     on_retry_packet_called_ = true;
261     retry_original_connection_id_ =
262         std::make_unique<QuicConnectionId>(original_connection_id);
263     retry_new_connection_id_ =
264         std::make_unique<QuicConnectionId>(new_connection_id);
265     retry_token_ = std::make_unique<std::string>(std::string(retry_token));
266     retry_token_integrity_tag_ =
267         std::make_unique<std::string>(std::string(retry_integrity_tag));
268     retry_without_tag_ =
269         std::make_unique<std::string>(std::string(retry_without_tag));
270     EXPECT_EQ(0u, framer_->current_received_frame_type());
271   }
272 
OnProtocolVersionMismatch(ParsedQuicVersion received_version)273   bool OnProtocolVersionMismatch(ParsedQuicVersion received_version) override {
274     QUIC_DLOG(INFO) << "QuicFramer Version Mismatch, version: "
275                     << received_version;
276     ++version_mismatch_;
277     EXPECT_EQ(0u, framer_->current_received_frame_type());
278     return false;
279   }
280 
OnUnauthenticatedPublicHeader(const QuicPacketHeader & header)281   bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override {
282     header_ = std::make_unique<QuicPacketHeader>((header));
283     EXPECT_EQ(0u, framer_->current_received_frame_type());
284     return accept_public_header_;
285   }
286 
OnUnauthenticatedHeader(const QuicPacketHeader &)287   bool OnUnauthenticatedHeader(const QuicPacketHeader& /*header*/) override {
288     EXPECT_EQ(0u, framer_->current_received_frame_type());
289     return true;
290   }
291 
OnDecryptedPacket(size_t,EncryptionLevel)292   void OnDecryptedPacket(size_t /*length*/,
293                          EncryptionLevel /*level*/) override {
294     EXPECT_EQ(0u, framer_->current_received_frame_type());
295   }
296 
OnPacketHeader(const QuicPacketHeader & header)297   bool OnPacketHeader(const QuicPacketHeader& header) override {
298     ++packet_count_;
299     header_ = std::make_unique<QuicPacketHeader>((header));
300     EXPECT_EQ(0u, framer_->current_received_frame_type());
301     return accept_packet_;
302   }
303 
OnCoalescedPacket(const QuicEncryptedPacket & packet)304   void OnCoalescedPacket(const QuicEncryptedPacket& packet) override {
305     coalesced_packets_.push_back(packet.Clone());
306   }
307 
OnUndecryptablePacket(const QuicEncryptedPacket & packet,EncryptionLevel decryption_level,bool has_decryption_key)308   void OnUndecryptablePacket(const QuicEncryptedPacket& packet,
309                              EncryptionLevel decryption_level,
310                              bool has_decryption_key) override {
311     undecryptable_packets_.push_back(packet.Clone());
312     undecryptable_decryption_levels_.push_back(decryption_level);
313     undecryptable_has_decryption_keys_.push_back(has_decryption_key);
314   }
315 
OnStreamFrame(const QuicStreamFrame & frame)316   bool OnStreamFrame(const QuicStreamFrame& frame) override {
317     ++frame_count_;
318     // Save a copy of the data so it is valid after the packet is processed.
319     std::string* string_data =
320         new std::string(frame.data_buffer, frame.data_length);
321     stream_data_.push_back(absl::WrapUnique(string_data));
322     stream_frames_.push_back(std::make_unique<QuicStreamFrame>(
323         frame.stream_id, frame.fin, frame.offset, *string_data));
324     if (VersionHasIetfQuicFrames(transport_version_)) {
325       // Low order bits of type encode flags, ignore them for this test.
326       EXPECT_TRUE(IS_IETF_STREAM_FRAME(framer_->current_received_frame_type()));
327     } else {
328       EXPECT_EQ(0u, framer_->current_received_frame_type());
329     }
330     return true;
331   }
332 
OnCryptoFrame(const QuicCryptoFrame & frame)333   bool OnCryptoFrame(const QuicCryptoFrame& frame) override {
334     ++frame_count_;
335     // Save a copy of the data so it is valid after the packet is processed.
336     std::string* string_data =
337         new std::string(frame.data_buffer, frame.data_length);
338     crypto_data_.push_back(absl::WrapUnique(string_data));
339     crypto_frames_.push_back(std::make_unique<QuicCryptoFrame>(
340         frame.level, frame.offset, *string_data));
341     if (VersionHasIetfQuicFrames(transport_version_)) {
342       EXPECT_EQ(IETF_CRYPTO, framer_->current_received_frame_type());
343     } else {
344       EXPECT_EQ(0u, framer_->current_received_frame_type());
345     }
346     return true;
347   }
348 
OnAckFrameStart(QuicPacketNumber largest_acked,QuicTime::Delta ack_delay_time)349   bool OnAckFrameStart(QuicPacketNumber largest_acked,
350                        QuicTime::Delta ack_delay_time) override {
351     ++frame_count_;
352     QuicAckFrame ack_frame;
353     ack_frame.largest_acked = largest_acked;
354     ack_frame.ack_delay_time = ack_delay_time;
355     ack_frames_.push_back(std::make_unique<QuicAckFrame>(ack_frame));
356     if (VersionHasIetfQuicFrames(transport_version_)) {
357       EXPECT_TRUE(IETF_ACK == framer_->current_received_frame_type() ||
358                   IETF_ACK_ECN == framer_->current_received_frame_type() ||
359                   IETF_ACK_RECEIVE_TIMESTAMPS ==
360                       framer_->current_received_frame_type());
361     } else {
362       EXPECT_EQ(0u, framer_->current_received_frame_type());
363     }
364     return true;
365   }
366 
OnAckRange(QuicPacketNumber start,QuicPacketNumber end)367   bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) override {
368     QUICHE_DCHECK(!ack_frames_.empty());
369     ack_frames_[ack_frames_.size() - 1]->packets.AddRange(start, end);
370     if (VersionHasIetfQuicFrames(transport_version_)) {
371       EXPECT_TRUE(IETF_ACK == framer_->current_received_frame_type() ||
372                   IETF_ACK_ECN == framer_->current_received_frame_type() ||
373                   IETF_ACK_RECEIVE_TIMESTAMPS ==
374                       framer_->current_received_frame_type());
375     } else {
376       EXPECT_EQ(0u, framer_->current_received_frame_type());
377     }
378     return true;
379   }
380 
OnAckTimestamp(QuicPacketNumber packet_number,QuicTime timestamp)381   bool OnAckTimestamp(QuicPacketNumber packet_number,
382                       QuicTime timestamp) override {
383     ack_frames_[ack_frames_.size() - 1]->received_packet_times.push_back(
384         std::make_pair(packet_number, timestamp));
385     if (VersionHasIetfQuicFrames(transport_version_)) {
386       EXPECT_TRUE(IETF_ACK == framer_->current_received_frame_type() ||
387                   IETF_ACK_ECN == framer_->current_received_frame_type() ||
388                   IETF_ACK_RECEIVE_TIMESTAMPS ==
389                       framer_->current_received_frame_type());
390     } else {
391       EXPECT_EQ(0u, framer_->current_received_frame_type());
392     }
393     return true;
394   }
395 
OnAckFrameEnd(QuicPacketNumber,const std::optional<QuicEcnCounts> &)396   bool OnAckFrameEnd(
397       QuicPacketNumber /*start*/,
398       const std::optional<QuicEcnCounts>& /*ecn_counts*/) override {
399     return true;
400   }
401 
OnStopWaitingFrame(const QuicStopWaitingFrame & frame)402   bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override {
403     ++frame_count_;
404     stop_waiting_frames_.push_back(
405         std::make_unique<QuicStopWaitingFrame>(frame));
406     EXPECT_EQ(0u, framer_->current_received_frame_type());
407     return true;
408   }
409 
OnPaddingFrame(const QuicPaddingFrame & frame)410   bool OnPaddingFrame(const QuicPaddingFrame& frame) override {
411     padding_frames_.push_back(std::make_unique<QuicPaddingFrame>(frame));
412     if (VersionHasIetfQuicFrames(transport_version_)) {
413       EXPECT_EQ(IETF_PADDING, framer_->current_received_frame_type());
414     } else {
415       EXPECT_EQ(0u, framer_->current_received_frame_type());
416     }
417     return true;
418   }
419 
OnPingFrame(const QuicPingFrame & frame)420   bool OnPingFrame(const QuicPingFrame& frame) override {
421     ++frame_count_;
422     ping_frames_.push_back(std::make_unique<QuicPingFrame>(frame));
423     if (VersionHasIetfQuicFrames(transport_version_)) {
424       EXPECT_EQ(IETF_PING, framer_->current_received_frame_type());
425     } else {
426       EXPECT_EQ(0u, framer_->current_received_frame_type());
427     }
428     return true;
429   }
430 
OnMessageFrame(const QuicMessageFrame & frame)431   bool OnMessageFrame(const QuicMessageFrame& frame) override {
432     ++frame_count_;
433     message_frames_.push_back(
434         std::make_unique<QuicMessageFrame>(frame.data, frame.message_length));
435     if (VersionHasIetfQuicFrames(transport_version_)) {
436       EXPECT_TRUE(IETF_EXTENSION_MESSAGE_NO_LENGTH_V99 ==
437                       framer_->current_received_frame_type() ||
438                   IETF_EXTENSION_MESSAGE_V99 ==
439                       framer_->current_received_frame_type());
440     } else {
441       EXPECT_EQ(0u, framer_->current_received_frame_type());
442     }
443     return true;
444   }
445 
OnHandshakeDoneFrame(const QuicHandshakeDoneFrame & frame)446   bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) override {
447     ++frame_count_;
448     handshake_done_frames_.push_back(
449         std::make_unique<QuicHandshakeDoneFrame>(frame));
450     QUICHE_DCHECK(VersionHasIetfQuicFrames(transport_version_));
451     EXPECT_EQ(IETF_HANDSHAKE_DONE, framer_->current_received_frame_type());
452     return true;
453   }
454 
OnAckFrequencyFrame(const QuicAckFrequencyFrame & frame)455   bool OnAckFrequencyFrame(const QuicAckFrequencyFrame& frame) override {
456     ++frame_count_;
457     ack_frequency_frames_.emplace_back(
458         std::make_unique<QuicAckFrequencyFrame>(frame));
459     QUICHE_DCHECK(VersionHasIetfQuicFrames(transport_version_));
460     EXPECT_EQ(IETF_ACK_FREQUENCY, framer_->current_received_frame_type());
461     return true;
462   }
463 
OnResetStreamAtFrame(const QuicResetStreamAtFrame & frame)464   bool OnResetStreamAtFrame(const QuicResetStreamAtFrame& frame) override {
465     ++frame_count_;
466     reset_stream_at_frames_.push_back(
467         std::make_unique<QuicResetStreamAtFrame>(frame));
468     EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
469     EXPECT_EQ(IETF_RESET_STREAM_AT, framer_->current_received_frame_type());
470     return true;
471   }
472 
OnPacketComplete()473   void OnPacketComplete() override { ++complete_packets_; }
474 
OnRstStreamFrame(const QuicRstStreamFrame & frame)475   bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override {
476     rst_stream_frame_ = frame;
477     if (VersionHasIetfQuicFrames(transport_version_)) {
478       EXPECT_EQ(IETF_RST_STREAM, framer_->current_received_frame_type());
479     } else {
480       EXPECT_EQ(0u, framer_->current_received_frame_type());
481     }
482     return true;
483   }
484 
OnConnectionCloseFrame(const QuicConnectionCloseFrame & frame)485   bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override {
486     connection_close_frame_ = frame;
487     if (VersionHasIetfQuicFrames(transport_version_)) {
488       EXPECT_NE(GOOGLE_QUIC_CONNECTION_CLOSE, frame.close_type);
489       if (frame.close_type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
490         EXPECT_EQ(IETF_CONNECTION_CLOSE,
491                   framer_->current_received_frame_type());
492       } else {
493         EXPECT_EQ(IETF_APPLICATION_CLOSE,
494                   framer_->current_received_frame_type());
495       }
496     } else {
497       EXPECT_EQ(0u, framer_->current_received_frame_type());
498     }
499     return true;
500   }
501 
OnStopSendingFrame(const QuicStopSendingFrame & frame)502   bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override {
503     stop_sending_frame_ = frame;
504     EXPECT_EQ(IETF_STOP_SENDING, framer_->current_received_frame_type());
505     EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
506     return true;
507   }
508 
OnPathChallengeFrame(const QuicPathChallengeFrame & frame)509   bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override {
510     path_challenge_frame_ = frame;
511     EXPECT_EQ(IETF_PATH_CHALLENGE, framer_->current_received_frame_type());
512     EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
513     return true;
514   }
515 
OnPathResponseFrame(const QuicPathResponseFrame & frame)516   bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override {
517     path_response_frame_ = frame;
518     EXPECT_EQ(IETF_PATH_RESPONSE, framer_->current_received_frame_type());
519     EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
520     return true;
521   }
522 
OnGoAwayFrame(const QuicGoAwayFrame & frame)523   bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override {
524     goaway_frame_ = frame;
525     EXPECT_FALSE(VersionHasIetfQuicFrames(transport_version_));
526     EXPECT_EQ(0u, framer_->current_received_frame_type());
527     return true;
528   }
529 
OnMaxStreamsFrame(const QuicMaxStreamsFrame & frame)530   bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& frame) override {
531     max_streams_frame_ = frame;
532     EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
533     EXPECT_TRUE(IETF_MAX_STREAMS_UNIDIRECTIONAL ==
534                     framer_->current_received_frame_type() ||
535                 IETF_MAX_STREAMS_BIDIRECTIONAL ==
536                     framer_->current_received_frame_type());
537     return true;
538   }
539 
OnStreamsBlockedFrame(const QuicStreamsBlockedFrame & frame)540   bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame) override {
541     streams_blocked_frame_ = frame;
542     EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
543     EXPECT_TRUE(IETF_STREAMS_BLOCKED_UNIDIRECTIONAL ==
544                     framer_->current_received_frame_type() ||
545                 IETF_STREAMS_BLOCKED_BIDIRECTIONAL ==
546                     framer_->current_received_frame_type());
547     return true;
548   }
549 
OnWindowUpdateFrame(const QuicWindowUpdateFrame & frame)550   bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override {
551     window_update_frame_ = frame;
552     if (VersionHasIetfQuicFrames(transport_version_)) {
553       EXPECT_TRUE(IETF_MAX_DATA == framer_->current_received_frame_type() ||
554                   IETF_MAX_STREAM_DATA ==
555                       framer_->current_received_frame_type());
556     } else {
557       EXPECT_EQ(0u, framer_->current_received_frame_type());
558     }
559     return true;
560   }
561 
OnBlockedFrame(const QuicBlockedFrame & frame)562   bool OnBlockedFrame(const QuicBlockedFrame& frame) override {
563     blocked_frame_ = frame;
564     if (VersionHasIetfQuicFrames(transport_version_)) {
565       EXPECT_TRUE(IETF_DATA_BLOCKED == framer_->current_received_frame_type() ||
566                   IETF_STREAM_DATA_BLOCKED ==
567                       framer_->current_received_frame_type());
568     } else {
569       EXPECT_EQ(0u, framer_->current_received_frame_type());
570     }
571     return true;
572   }
573 
OnNewConnectionIdFrame(const QuicNewConnectionIdFrame & frame)574   bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override {
575     new_connection_id_ = frame;
576     EXPECT_EQ(IETF_NEW_CONNECTION_ID, framer_->current_received_frame_type());
577     EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
578     return true;
579   }
580 
OnRetireConnectionIdFrame(const QuicRetireConnectionIdFrame & frame)581   bool OnRetireConnectionIdFrame(
582       const QuicRetireConnectionIdFrame& frame) override {
583     EXPECT_EQ(IETF_RETIRE_CONNECTION_ID,
584               framer_->current_received_frame_type());
585     EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
586     retire_connection_id_ = frame;
587     return true;
588   }
589 
OnNewTokenFrame(const QuicNewTokenFrame & frame)590   bool OnNewTokenFrame(const QuicNewTokenFrame& frame) override {
591     new_token_ = frame;
592     EXPECT_EQ(IETF_NEW_TOKEN, framer_->current_received_frame_type());
593     EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
594     return true;
595   }
596 
IsValidStatelessResetToken(const StatelessResetToken & token) const597   bool IsValidStatelessResetToken(
598       const StatelessResetToken& token) const override {
599     EXPECT_EQ(0u, framer_->current_received_frame_type());
600     return token == kTestStatelessResetToken;
601   }
602 
OnAuthenticatedIetfStatelessResetPacket(const QuicIetfStatelessResetPacket & packet)603   void OnAuthenticatedIetfStatelessResetPacket(
604       const QuicIetfStatelessResetPacket& packet) override {
605     stateless_reset_packet_ =
606         std::make_unique<QuicIetfStatelessResetPacket>(packet);
607     EXPECT_EQ(0u, framer_->current_received_frame_type());
608   }
609 
OnKeyUpdate(KeyUpdateReason reason)610   void OnKeyUpdate(KeyUpdateReason reason) override {
611     key_update_reasons_.push_back(reason);
612   }
613 
OnDecryptedFirstPacketInKeyPhase()614   void OnDecryptedFirstPacketInKeyPhase() override {
615     decrypted_first_packet_in_key_phase_count_++;
616   }
617 
AdvanceKeysAndCreateCurrentOneRttDecrypter()618   std::unique_ptr<QuicDecrypter> AdvanceKeysAndCreateCurrentOneRttDecrypter()
619       override {
620     derive_next_key_count_++;
621     return std::make_unique<StrictTaggingDecrypter>(derive_next_key_count_);
622   }
CreateCurrentOneRttEncrypter()623   std::unique_ptr<QuicEncrypter> CreateCurrentOneRttEncrypter() override {
624     return std::make_unique<TaggingEncrypter>(derive_next_key_count_);
625   }
626 
set_framer(QuicFramer * framer)627   void set_framer(QuicFramer* framer) {
628     framer_ = framer;
629     transport_version_ = framer->transport_version();
630   }
631 
key_update_count() const632   size_t key_update_count() const { return key_update_reasons_.size(); }
633 
634   // Counters from the visitor_ callbacks.
635   int error_count_;
636   int version_mismatch_;
637   int packet_count_;
638   int frame_count_;
639   int complete_packets_;
640   std::vector<KeyUpdateReason> key_update_reasons_;
641   int derive_next_key_count_;
642   int decrypted_first_packet_in_key_phase_count_;
643   bool accept_packet_;
644   bool accept_public_header_;
645 
646   std::unique_ptr<QuicPacketHeader> header_;
647   std::unique_ptr<QuicIetfStatelessResetPacket> stateless_reset_packet_;
648   std::unique_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_;
649   std::unique_ptr<QuicConnectionId> retry_original_connection_id_;
650   std::unique_ptr<QuicConnectionId> retry_new_connection_id_;
651   std::unique_ptr<std::string> retry_token_;
652   std::unique_ptr<std::string> retry_token_integrity_tag_;
653   std::unique_ptr<std::string> retry_without_tag_;
654   bool on_retry_packet_called_ = false;
655   std::vector<std::unique_ptr<QuicStreamFrame>> stream_frames_;
656   std::vector<std::unique_ptr<QuicCryptoFrame>> crypto_frames_;
657   std::vector<std::unique_ptr<QuicAckFrame>> ack_frames_;
658   std::vector<std::unique_ptr<QuicStopWaitingFrame>> stop_waiting_frames_;
659   std::vector<std::unique_ptr<QuicPaddingFrame>> padding_frames_;
660   std::vector<std::unique_ptr<QuicPingFrame>> ping_frames_;
661   std::vector<std::unique_ptr<QuicMessageFrame>> message_frames_;
662   std::vector<std::unique_ptr<QuicHandshakeDoneFrame>> handshake_done_frames_;
663   std::vector<std::unique_ptr<QuicAckFrequencyFrame>> ack_frequency_frames_;
664   std::vector<std::unique_ptr<QuicResetStreamAtFrame>> reset_stream_at_frames_;
665   std::vector<std::unique_ptr<QuicEncryptedPacket>> coalesced_packets_;
666   std::vector<std::unique_ptr<QuicEncryptedPacket>> undecryptable_packets_;
667   std::vector<EncryptionLevel> undecryptable_decryption_levels_;
668   std::vector<bool> undecryptable_has_decryption_keys_;
669   QuicRstStreamFrame rst_stream_frame_;
670   QuicConnectionCloseFrame connection_close_frame_;
671   QuicStopSendingFrame stop_sending_frame_;
672   QuicGoAwayFrame goaway_frame_;
673   QuicPathChallengeFrame path_challenge_frame_;
674   QuicPathResponseFrame path_response_frame_;
675   QuicWindowUpdateFrame window_update_frame_;
676   QuicBlockedFrame blocked_frame_;
677   QuicStreamsBlockedFrame streams_blocked_frame_;
678   QuicMaxStreamsFrame max_streams_frame_;
679   QuicNewConnectionIdFrame new_connection_id_;
680   QuicRetireConnectionIdFrame retire_connection_id_;
681   QuicNewTokenFrame new_token_;
682   std::vector<std::unique_ptr<std::string>> stream_data_;
683   std::vector<std::unique_ptr<std::string>> crypto_data_;
684   QuicTransportVersion transport_version_;
685   QuicFramer* framer_;
686 };
687 
688 // Simple struct for defining a packet's content, and associated
689 // parse error.
690 struct PacketFragment {
691   std::string error_if_missing;
692   std::vector<unsigned char> fragment;
693 };
694 
695 using PacketFragments = std::vector<struct PacketFragment>;
696 
697 class QuicFramerTest : public QuicTestWithParam<ParsedQuicVersion> {
698  public:
QuicFramerTest()699   QuicFramerTest()
700       : encrypter_(new test::TestEncrypter()),
701         decrypter_(new test::TestDecrypter()),
702         version_(GetParam()),
703         start_(QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(0x10)),
704         framer_(AllSupportedVersions(), start_, Perspective::IS_SERVER,
705                 kQuicDefaultConnectionIdLength) {
706     framer_.set_version(version_);
707     if (framer_.version().KnowsWhichDecrypterToUse()) {
708       framer_.InstallDecrypter(ENCRYPTION_INITIAL,
709                                std::unique_ptr<QuicDecrypter>(decrypter_));
710     } else {
711       framer_.SetDecrypter(ENCRYPTION_INITIAL,
712                            std::unique_ptr<QuicDecrypter>(decrypter_));
713     }
714     framer_.SetEncrypter(ENCRYPTION_INITIAL,
715                          std::unique_ptr<QuicEncrypter>(encrypter_));
716 
717     framer_.set_visitor(&visitor_);
718     visitor_.set_framer(&framer_);
719   }
720 
SetDecrypterLevel(EncryptionLevel level)721   void SetDecrypterLevel(EncryptionLevel level) {
722     if (!framer_.version().KnowsWhichDecrypterToUse()) {
723       return;
724     }
725     decrypter_ = new TestDecrypter();
726     framer_.InstallDecrypter(level, std::unique_ptr<QuicDecrypter>(decrypter_));
727   }
728 
729   // Helper function to get unsigned char representation of the handshake
730   // protocol byte at position |pos| of the current QUIC version number.
GetQuicVersionByte(int pos)731   unsigned char GetQuicVersionByte(int pos) {
732     return (CreateQuicVersionLabel(version_) >> 8 * (3 - pos)) & 0xff;
733   }
734 
735   // Helper functions to take a v1 long header packet and make it v2. These are
736   // not needed for short header packets, but if sent, this function will exit
737   // cleanly. It needs to be called twice for coalesced packets (see references
738   // to length_of_first_coalesced_packet below for examples of how to do this).
ReviseFirstByteByVersion(unsigned char packet_ietf[])739   inline void ReviseFirstByteByVersion(unsigned char packet_ietf[]) {
740     if (version_.UsesV2PacketTypes() && (packet_ietf[0] >= 0x80)) {
741       packet_ietf[0] = (packet_ietf[0] + 0x10) | 0xc0;
742     }
743   }
ReviseFirstByteByVersion(PacketFragments & packet_ietf)744   inline void ReviseFirstByteByVersion(PacketFragments& packet_ietf) {
745     ReviseFirstByteByVersion(&packet_ietf[0].fragment[0]);
746   }
747 
CheckEncryption(QuicPacketNumber packet_number,QuicPacket * packet)748   bool CheckEncryption(QuicPacketNumber packet_number, QuicPacket* packet) {
749     if (packet_number != encrypter_->packet_number_) {
750       QUIC_LOG(ERROR) << "Encrypted incorrect packet number.  expected "
751                       << packet_number
752                       << " actual: " << encrypter_->packet_number_;
753       return false;
754     }
755     if (packet->AssociatedData(framer_.transport_version()) !=
756         encrypter_->associated_data_) {
757       QUIC_LOG(ERROR) << "Encrypted incorrect associated data.  expected "
758                       << packet->AssociatedData(framer_.transport_version())
759                       << " actual: " << encrypter_->associated_data_;
760       return false;
761     }
762     if (packet->Plaintext(framer_.transport_version()) !=
763         encrypter_->plaintext_) {
764       QUIC_LOG(ERROR) << "Encrypted incorrect plaintext data.  expected "
765                       << packet->Plaintext(framer_.transport_version())
766                       << " actual: " << encrypter_->plaintext_;
767       return false;
768     }
769     return true;
770   }
771 
CheckDecryption(const QuicEncryptedPacket & encrypted,bool includes_version,bool includes_diversification_nonce,uint8_t destination_connection_id_length,uint8_t source_connection_id_length)772   bool CheckDecryption(const QuicEncryptedPacket& encrypted,
773                        bool includes_version,
774                        bool includes_diversification_nonce,
775                        uint8_t destination_connection_id_length,
776                        uint8_t source_connection_id_length) {
777     return CheckDecryption(
778         encrypted, includes_version, includes_diversification_nonce,
779         destination_connection_id_length, source_connection_id_length,
780         quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
781         quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
782   }
783 
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)784   bool CheckDecryption(
785       const QuicEncryptedPacket& encrypted, bool includes_version,
786       bool includes_diversification_nonce,
787       uint8_t destination_connection_id_length,
788       uint8_t source_connection_id_length,
789       quiche::QuicheVariableLengthIntegerLength retry_token_length_length,
790       size_t retry_token_length,
791       quiche::QuicheVariableLengthIntegerLength length_length) {
792     if (visitor_.header_->packet_number != decrypter_->packet_number_) {
793       QUIC_LOG(ERROR) << "Decrypted incorrect packet number.  expected "
794                       << visitor_.header_->packet_number
795                       << " actual: " << decrypter_->packet_number_;
796       return false;
797     }
798     absl::string_view associated_data =
799         QuicFramer::GetAssociatedDataFromEncryptedPacket(
800             framer_.transport_version(), encrypted,
801             destination_connection_id_length, source_connection_id_length,
802             includes_version, includes_diversification_nonce,
803             PACKET_4BYTE_PACKET_NUMBER, retry_token_length_length,
804             retry_token_length, length_length);
805     if (associated_data != decrypter_->associated_data_) {
806       QUIC_LOG(ERROR) << "Decrypted incorrect associated data.  expected "
807                       << absl::BytesToHexString(associated_data) << " actual: "
808                       << absl::BytesToHexString(decrypter_->associated_data_);
809       return false;
810     }
811     absl::string_view ciphertext(
812         encrypted.AsStringPiece().substr(GetStartOfEncryptedData(
813             framer_.transport_version(), destination_connection_id_length,
814             source_connection_id_length, includes_version,
815             includes_diversification_nonce, PACKET_4BYTE_PACKET_NUMBER,
816             retry_token_length_length, retry_token_length, length_length)));
817     if (ciphertext != decrypter_->ciphertext_) {
818       QUIC_LOG(ERROR) << "Decrypted incorrect ciphertext data.  expected "
819                       << absl::BytesToHexString(ciphertext) << " actual: "
820                       << absl::BytesToHexString(decrypter_->ciphertext_)
821                       << " associated data: "
822                       << absl::BytesToHexString(associated_data);
823       return false;
824     }
825     return true;
826   }
827 
AsChars(unsigned char * data)828   char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); }
829 
830   // Creates a new QuicEncryptedPacket by concatenating the various
831   // packet fragments in |fragments|.
AssemblePacketFromFragments(const PacketFragments & fragments)832   std::unique_ptr<QuicEncryptedPacket> AssemblePacketFromFragments(
833       const PacketFragments& fragments) {
834     char* buffer = new char[kMaxOutgoingPacketSize + 1];
835     size_t len = 0;
836     for (const auto& fragment : fragments) {
837       memcpy(buffer + len, fragment.fragment.data(), fragment.fragment.size());
838       len += fragment.fragment.size();
839     }
840     return std::make_unique<QuicEncryptedPacket>(buffer, len, true);
841   }
842 
CheckFramingBoundaries(const PacketFragments & fragments,QuicErrorCode error_code)843   void CheckFramingBoundaries(const PacketFragments& fragments,
844                               QuicErrorCode error_code) {
845     std::unique_ptr<QuicEncryptedPacket> packet(
846         AssemblePacketFromFragments(fragments));
847     // Check all the various prefixes of |packet| for the expected
848     // parse error and error code.
849     for (size_t i = 0; i < packet->length(); ++i) {
850       std::string expected_error;
851       size_t len = 0;
852       for (const auto& fragment : fragments) {
853         len += fragment.fragment.size();
854         if (i < len) {
855           expected_error = fragment.error_if_missing;
856           break;
857         }
858       }
859 
860       if (expected_error.empty()) continue;
861 
862       CheckProcessingFails(*packet, i, expected_error, error_code);
863     }
864   }
865 
CheckProcessingFails(const QuicEncryptedPacket & packet,size_t len,std::string expected_error,QuicErrorCode error_code)866   void CheckProcessingFails(const QuicEncryptedPacket& packet, size_t len,
867                             std::string expected_error,
868                             QuicErrorCode error_code) {
869     QuicEncryptedPacket encrypted(packet.data(), len, false);
870     EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
871     EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len;
872     EXPECT_EQ(error_code, framer_.error()) << "len: " << len;
873   }
874 
CheckProcessingFails(unsigned char * packet,size_t len,std::string expected_error,QuicErrorCode error_code)875   void CheckProcessingFails(unsigned char* packet, size_t len,
876                             std::string expected_error,
877                             QuicErrorCode error_code) {
878     QuicEncryptedPacket encrypted(AsChars(packet), len, false);
879     EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
880     EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len;
881     EXPECT_EQ(error_code, framer_.error()) << "len: " << len;
882   }
883 
884   // Checks if the supplied string matches data in the supplied StreamFrame.
CheckStreamFrameData(std::string str,QuicStreamFrame * frame)885   void CheckStreamFrameData(std::string str, QuicStreamFrame* frame) {
886     EXPECT_EQ(str, std::string(frame->data_buffer, frame->data_length));
887   }
888 
CheckCalculatePacketNumber(uint64_t expected_packet_number,QuicPacketNumber last_packet_number)889   void CheckCalculatePacketNumber(uint64_t expected_packet_number,
890                                   QuicPacketNumber last_packet_number) {
891     uint64_t wire_packet_number = expected_packet_number & kMask;
892     EXPECT_EQ(expected_packet_number,
893               QuicFramerPeer::CalculatePacketNumberFromWire(
894                   &framer_, PACKET_4BYTE_PACKET_NUMBER, last_packet_number,
895                   wire_packet_number))
896         << "last_packet_number: " << last_packet_number
897         << " wire_packet_number: " << wire_packet_number;
898   }
899 
BuildDataPacket(const QuicPacketHeader & header,const QuicFrames & frames)900   std::unique_ptr<QuicPacket> BuildDataPacket(const QuicPacketHeader& header,
901                                               const QuicFrames& frames) {
902     return BuildUnsizedDataPacket(&framer_, header, frames);
903   }
904 
BuildDataPacket(const QuicPacketHeader & header,const QuicFrames & frames,size_t packet_size)905   std::unique_ptr<QuicPacket> BuildDataPacket(const QuicPacketHeader& header,
906                                               const QuicFrames& frames,
907                                               size_t packet_size) {
908     return BuildUnsizedDataPacket(&framer_, header, frames, packet_size);
909   }
910 
911   // N starts at 1.
GetNthStreamid(QuicTransportVersion transport_version,Perspective perspective,bool bidirectional,int n)912   QuicStreamId GetNthStreamid(QuicTransportVersion transport_version,
913                               Perspective perspective, bool bidirectional,
914                               int n) {
915     if (bidirectional) {
916       return QuicUtils::GetFirstBidirectionalStreamId(transport_version,
917                                                       perspective) +
918              ((n - 1) * QuicUtils::StreamIdDelta(transport_version));
919     }
920     // Unidirectional
921     return QuicUtils::GetFirstUnidirectionalStreamId(transport_version,
922                                                      perspective) +
923            ((n - 1) * QuicUtils::StreamIdDelta(transport_version));
924   }
925 
CreationTimePlus(uint64_t offset_us)926   QuicTime CreationTimePlus(uint64_t offset_us) {
927     return framer_.creation_time() +
928            QuicTime::Delta::FromMicroseconds(offset_us);
929   }
930 
931   test::TestEncrypter* encrypter_;
932   test::TestDecrypter* decrypter_;
933   ParsedQuicVersion version_;
934   QuicTime start_;
935   QuicFramer framer_;
936   test::TestQuicVisitor visitor_;
937   quiche::SimpleBufferAllocator allocator_;
938 };
939 
940 // Multiple test cases of QuicFramerTest use byte arrays to define packets for
941 // testing, and these byte arrays contain the QUIC version. This macro explodes
942 // the 32-bit version into four bytes in network order. Since it uses methods of
943 // QuicFramerTest, it is only valid to use this in a QuicFramerTest.
944 #define QUIC_VERSION_BYTES                                             \
945   GetQuicVersionByte(0), GetQuicVersionByte(1), GetQuicVersionByte(2), \
946       GetQuicVersionByte(3)
947 
948 // Run all framer tests with all supported versions of QUIC.
949 INSTANTIATE_TEST_SUITE_P(QuicFramerTests, QuicFramerTest,
950                          ::testing::ValuesIn(AllSupportedVersions()),
951                          ::testing::PrintToStringParamName());
952 
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearEpochStart)953 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochStart) {
954   // A few quick manual sanity checks.
955   CheckCalculatePacketNumber(UINT64_C(1), QuicPacketNumber());
956   CheckCalculatePacketNumber(kEpoch + 1, QuicPacketNumber(kMask));
957   CheckCalculatePacketNumber(kEpoch, QuicPacketNumber(kMask));
958   for (uint64_t j = 0; j < 10; j++) {
959     CheckCalculatePacketNumber(j, QuicPacketNumber());
960     CheckCalculatePacketNumber(kEpoch - 1 - j, QuicPacketNumber());
961   }
962 
963   // Cases where the last number was close to the start of the range.
964   for (QuicPacketNumber last = QuicPacketNumber(1); last < QuicPacketNumber(10);
965        last++) {
966     // Small numbers should not wrap (even if they're out of order).
967     for (uint64_t j = 0; j < 10; j++) {
968       CheckCalculatePacketNumber(j, last);
969     }
970 
971     // Large numbers should not wrap either (because we're near 0 already).
972     for (uint64_t j = 0; j < 10; j++) {
973       CheckCalculatePacketNumber(kEpoch - 1 - j, last);
974     }
975   }
976 }
977 
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearEpochEnd)978 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochEnd) {
979   // Cases where the last number was close to the end of the range
980   for (uint64_t i = 0; i < 10; i++) {
981     QuicPacketNumber last = QuicPacketNumber(kEpoch - i);
982 
983     // Small numbers should wrap.
984     for (uint64_t j = 0; j < 10; j++) {
985       CheckCalculatePacketNumber(kEpoch + j, last);
986     }
987 
988     // Large numbers should not (even if they're out of order).
989     for (uint64_t j = 0; j < 10; j++) {
990       CheckCalculatePacketNumber(kEpoch - 1 - j, last);
991     }
992   }
993 }
994 
995 // Next check where we're in a non-zero epoch to verify we handle
996 // reverse wrapping, too.
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearPrevEpoch)997 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearPrevEpoch) {
998   const uint64_t prev_epoch = 1 * kEpoch;
999   const uint64_t cur_epoch = 2 * kEpoch;
1000   // Cases where the last number was close to the start of the range
1001   for (uint64_t i = 0; i < 10; i++) {
1002     QuicPacketNumber last = QuicPacketNumber(cur_epoch + i);
1003     // Small number should not wrap (even if they're out of order).
1004     for (uint64_t j = 0; j < 10; j++) {
1005       CheckCalculatePacketNumber(cur_epoch + j, last);
1006     }
1007 
1008     // But large numbers should reverse wrap.
1009     for (uint64_t j = 0; j < 10; j++) {
1010       uint64_t num = kEpoch - 1 - j;
1011       CheckCalculatePacketNumber(prev_epoch + num, last);
1012     }
1013   }
1014 }
1015 
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearNextEpoch)1016 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextEpoch) {
1017   const uint64_t cur_epoch = 2 * kEpoch;
1018   const uint64_t next_epoch = 3 * kEpoch;
1019   // Cases where the last number was close to the end of the range
1020   for (uint64_t i = 0; i < 10; i++) {
1021     QuicPacketNumber last = QuicPacketNumber(next_epoch - 1 - i);
1022 
1023     // Small numbers should wrap.
1024     for (uint64_t j = 0; j < 10; j++) {
1025       CheckCalculatePacketNumber(next_epoch + j, last);
1026     }
1027 
1028     // but large numbers should not (even if they're out of order).
1029     for (uint64_t j = 0; j < 10; j++) {
1030       uint64_t num = kEpoch - 1 - j;
1031       CheckCalculatePacketNumber(cur_epoch + num, last);
1032     }
1033   }
1034 }
1035 
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearNextMax)1036 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextMax) {
1037   const uint64_t max_number = std::numeric_limits<uint64_t>::max();
1038   const uint64_t max_epoch = max_number & ~kMask;
1039 
1040   // Cases where the last number was close to the end of the range
1041   for (uint64_t i = 0; i < 10; i++) {
1042     // Subtract 1, because the expected next packet number is 1 more than the
1043     // last packet number.
1044     QuicPacketNumber last = QuicPacketNumber(max_number - i - 1);
1045 
1046     // Small numbers should not wrap, because they have nowhere to go.
1047     for (uint64_t j = 0; j < 10; j++) {
1048       CheckCalculatePacketNumber(max_epoch + j, last);
1049     }
1050 
1051     // Large numbers should not wrap either.
1052     for (uint64_t j = 0; j < 10; j++) {
1053       uint64_t num = kEpoch - 1 - j;
1054       CheckCalculatePacketNumber(max_epoch + num, last);
1055     }
1056   }
1057 }
1058 
TEST_P(QuicFramerTest,EmptyPacket)1059 TEST_P(QuicFramerTest, EmptyPacket) {
1060   char packet[] = {0x00};
1061   QuicEncryptedPacket encrypted(packet, 0, false);
1062   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
1063   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
1064 }
1065 
TEST_P(QuicFramerTest,LargePacket)1066 TEST_P(QuicFramerTest, LargePacket) {
1067   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1068   // clang-format off
1069   unsigned char packet[kMaxIncomingPacketSize + 1] = {
1070     // type (short header 4 byte packet number)
1071     0x43,
1072     // connection_id
1073     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1074     // packet number
1075     0x78, 0x56, 0x34, 0x12,
1076   };
1077   // clang-format on
1078 
1079   const size_t header_size = GetPacketHeaderSize(
1080       framer_.transport_version(), kPacket8ByteConnectionId,
1081       kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
1082       PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
1083       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
1084 
1085   memset(packet + header_size, 0, kMaxIncomingPacketSize - header_size);
1086 
1087   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
1088   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
1089 
1090   ASSERT_TRUE(visitor_.header_.get());
1091   // Make sure we've parsed the packet header, so we can send an error.
1092   EXPECT_EQ(FramerTestConnectionId(),
1093             visitor_.header_->destination_connection_id);
1094   // Make sure the correct error is propagated.
1095   EXPECT_THAT(framer_.error(), IsError(QUIC_PACKET_TOO_LARGE));
1096   EXPECT_EQ("Packet too large.", framer_.detailed_error());
1097 }
1098 
TEST_P(QuicFramerTest,LongPacketHeader)1099 TEST_P(QuicFramerTest, LongPacketHeader) {
1100   // clang-format off
1101   PacketFragments packet = {
1102     // type (long header with packet type ZERO_RTT)
1103     {"Unable to read first byte.",
1104      {0xD3}},
1105     // version tag
1106     {"Unable to read protocol version.",
1107      {QUIC_VERSION_BYTES}},
1108     // connection_id length
1109     {"Unable to read ConnectionId length.",
1110      {0x50}},
1111     // connection_id
1112     {"Unable to read destination connection ID.",
1113      {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1114     // packet number
1115     {"Unable to read packet number.",
1116      {0x12, 0x34, 0x56, 0x78}},
1117   };
1118   // clang-format on
1119 
1120   if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
1121     return;
1122   }
1123 
1124   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
1125   std::unique_ptr<QuicEncryptedPacket> encrypted(
1126       AssemblePacketFromFragments(packet));
1127 
1128   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1129   EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1130   ASSERT_TRUE(visitor_.header_.get());
1131   EXPECT_EQ(FramerTestConnectionId(),
1132             visitor_.header_->destination_connection_id);
1133   EXPECT_FALSE(visitor_.header_->reset_flag);
1134   EXPECT_TRUE(visitor_.header_->version_flag);
1135   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1136 
1137   CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
1138 
1139   PacketHeaderFormat format;
1140   QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1141   bool version_flag;
1142   QuicConnectionId destination_connection_id, source_connection_id;
1143   QuicVersionLabel version_label;
1144   std::string detailed_error;
1145   bool use_length_prefix;
1146   std::optional<absl::string_view> retry_token;
1147   ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1148   const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1149       *encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1150       &version_flag, &use_length_prefix, &version_label, &parsed_version,
1151       &destination_connection_id, &source_connection_id, &retry_token,
1152       &detailed_error);
1153   EXPECT_THAT(error_code, IsQuicNoError());
1154   EXPECT_EQ("", detailed_error);
1155   EXPECT_FALSE(retry_token.has_value());
1156   EXPECT_FALSE(use_length_prefix);
1157   EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1158   EXPECT_TRUE(version_flag);
1159   EXPECT_EQ(kQuicDefaultConnectionIdLength, destination_connection_id.length());
1160   EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1161   EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1162 }
1163 
TEST_P(QuicFramerTest,LongPacketHeaderWithBothConnectionIds)1164 TEST_P(QuicFramerTest, LongPacketHeaderWithBothConnectionIds) {
1165   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
1166   // clang-format off
1167   unsigned char packet[] = {
1168     // public flags (long header with packet type ZERO_RTT_PROTECTED and
1169     // 4-byte packet number)
1170     0xD3,
1171     // version
1172     QUIC_VERSION_BYTES,
1173     // connection ID lengths
1174     0x55,
1175     // destination connection ID
1176     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1177     // source connection ID
1178     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
1179     // packet number
1180     0x12, 0x34, 0x56, 0x00,
1181     // padding frame
1182     0x00,
1183   };
1184   unsigned char packet49[] = {
1185     // public flags (long header with packet type ZERO_RTT_PROTECTED and
1186     // 4-byte packet number)
1187     0xD3,
1188     // version
1189     QUIC_VERSION_BYTES,
1190     // destination connection ID length
1191     0x08,
1192     // destination connection ID
1193     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1194     // source connection ID length
1195     0x08,
1196     // source connection ID
1197     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
1198     // long header packet length
1199     0x05,
1200     // packet number
1201     0x12, 0x34, 0x56, 0x00,
1202     // padding frame
1203     0x00,
1204   };
1205   // clang-format on
1206 
1207   unsigned char* p = packet;
1208   size_t p_length = ABSL_ARRAYSIZE(packet);
1209   if (framer_.version().HasLongHeaderLengths()) {
1210     ReviseFirstByteByVersion(packet49);
1211     p = packet49;
1212     p_length = ABSL_ARRAYSIZE(packet49);
1213   }
1214 
1215   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
1216   PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1217   QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1218   bool version_flag = false;
1219   QuicConnectionId destination_connection_id, source_connection_id;
1220   QuicVersionLabel version_label = 0;
1221   std::string detailed_error = "";
1222   bool use_length_prefix;
1223   std::optional<absl::string_view> retry_token;
1224   ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1225   const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1226       encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1227       &version_flag, &use_length_prefix, &version_label, &parsed_version,
1228       &destination_connection_id, &source_connection_id, &retry_token,
1229       &detailed_error);
1230   EXPECT_THAT(error_code, IsQuicNoError());
1231   EXPECT_FALSE(retry_token.has_value());
1232   EXPECT_EQ(framer_.version().HasLengthPrefixedConnectionIds(),
1233             use_length_prefix);
1234   EXPECT_EQ("", detailed_error);
1235   EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1236   EXPECT_TRUE(version_flag);
1237   EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1238   EXPECT_EQ(FramerTestConnectionIdPlusOne(), source_connection_id);
1239 }
1240 
TEST_P(QuicFramerTest,AllZeroPacketParsingFails)1241 TEST_P(QuicFramerTest, AllZeroPacketParsingFails) {
1242   unsigned char packet[1200] = {};
1243   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
1244   PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1245   QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1246   bool version_flag = false;
1247   QuicConnectionId destination_connection_id, source_connection_id;
1248   QuicVersionLabel version_label = 0;
1249   std::string detailed_error = "";
1250   bool use_length_prefix;
1251   std::optional<absl::string_view> retry_token;
1252   ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1253   const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1254       encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1255       &version_flag, &use_length_prefix, &version_label, &parsed_version,
1256       &destination_connection_id, &source_connection_id, &retry_token,
1257       &detailed_error);
1258   EXPECT_EQ(error_code, QUIC_INVALID_PACKET_HEADER);
1259   EXPECT_EQ(detailed_error, "Invalid flags.");
1260 }
1261 
TEST_P(QuicFramerTest,ParsePublicHeader)1262 TEST_P(QuicFramerTest, ParsePublicHeader) {
1263   // clang-format off
1264   unsigned char packet[] = {
1265       // public flags (long header with packet type HANDSHAKE and
1266       // 4-byte packet number)
1267       0xE3,
1268       // version
1269       QUIC_VERSION_BYTES,
1270       // connection ID lengths
1271       0x50,
1272       // destination connection ID
1273       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1274       // long header packet length
1275       0x05,
1276       // packet number
1277       0x12, 0x34, 0x56, 0x78,
1278       // padding frame
1279       0x00,
1280   };
1281   unsigned char packet49[] = {
1282     // public flags (long header with packet type HANDSHAKE and
1283     // 4-byte packet number)
1284     0xE3,
1285     // version
1286     QUIC_VERSION_BYTES,
1287     // destination connection ID length
1288     0x08,
1289     // destination connection ID
1290     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1291     // source connection ID length
1292     0x00,
1293     // long header packet length
1294     0x05,
1295     // packet number
1296     0x12, 0x34, 0x56, 0x78,
1297     // padding frame
1298     0x00,
1299   };
1300   // clang-format on
1301   unsigned char* p = packet;
1302   size_t p_length = ABSL_ARRAYSIZE(packet);
1303   if (framer_.version().HasLongHeaderLengths()) {
1304     ReviseFirstByteByVersion(packet49);
1305     p = packet49;
1306     p_length = ABSL_ARRAYSIZE(packet49);
1307   }
1308 
1309   uint8_t first_byte = 0x33;
1310   PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1311   bool version_present = false, has_length_prefix = false;
1312   QuicVersionLabel version_label = 0;
1313   ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1314   QuicConnectionId destination_connection_id = EmptyQuicConnectionId(),
1315                    source_connection_id = EmptyQuicConnectionId();
1316   QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1317   quiche::QuicheVariableLengthIntegerLength retry_token_length_length =
1318       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_4;
1319   absl::string_view retry_token;
1320   std::string detailed_error = "foobar";
1321 
1322   QuicDataReader reader(AsChars(p), p_length);
1323   const QuicErrorCode parse_error = QuicFramer::ParsePublicHeader(
1324       &reader, kQuicDefaultConnectionIdLength, /*ietf_format=*/true,
1325       &first_byte, &format, &version_present, &has_length_prefix,
1326       &version_label, &parsed_version, &destination_connection_id,
1327       &source_connection_id, &long_packet_type, &retry_token_length_length,
1328       &retry_token, &detailed_error);
1329   EXPECT_THAT(parse_error, IsQuicNoError());
1330   EXPECT_EQ("", detailed_error);
1331   EXPECT_EQ(p[0], first_byte);
1332   EXPECT_TRUE(version_present);
1333   EXPECT_EQ(framer_.version().HasLengthPrefixedConnectionIds(),
1334             has_length_prefix);
1335   EXPECT_EQ(CreateQuicVersionLabel(framer_.version()), version_label);
1336   EXPECT_EQ(framer_.version(), parsed_version);
1337   EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1338   EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1339   EXPECT_EQ(quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
1340             retry_token_length_length);
1341   EXPECT_EQ(absl::string_view(), retry_token);
1342   EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1343   EXPECT_EQ(HANDSHAKE, long_packet_type);
1344 }
1345 
TEST_P(QuicFramerTest,ParsePublicHeaderProxBadSourceConnectionIdLength)1346 TEST_P(QuicFramerTest, ParsePublicHeaderProxBadSourceConnectionIdLength) {
1347   if (!framer_.version().HasLengthPrefixedConnectionIds()) {
1348     return;
1349   }
1350   // clang-format off
1351   unsigned char packet[] = {
1352     // public flags (long header with packet type HANDSHAKE and
1353     // 4-byte packet number)
1354     0xE3,
1355     // version
1356     'P', 'R', 'O', 'X',
1357     // destination connection ID length
1358     0x08,
1359     // destination connection ID
1360     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1361     // source connection ID length (bogus)
1362     0xEE,
1363     // long header packet length
1364     0x05,
1365     // packet number
1366     0x12, 0x34, 0x56, 0x78,
1367     // padding frame
1368     0x00,
1369   };
1370   // clang-format on
1371   unsigned char* p = packet;
1372   size_t p_length = ABSL_ARRAYSIZE(packet);
1373 
1374   uint8_t first_byte = 0x33;
1375   PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1376   bool version_present = false, has_length_prefix = false;
1377   QuicVersionLabel version_label = 0;
1378   ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1379   QuicConnectionId destination_connection_id = EmptyQuicConnectionId(),
1380                    source_connection_id = EmptyQuicConnectionId();
1381   QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1382   quiche::QuicheVariableLengthIntegerLength retry_token_length_length =
1383       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_4;
1384   absl::string_view retry_token;
1385   std::string detailed_error = "foobar";
1386 
1387   QuicDataReader reader(AsChars(p), p_length);
1388   const QuicErrorCode parse_error = QuicFramer::ParsePublicHeader(
1389       &reader, kQuicDefaultConnectionIdLength,
1390       /*ietf_format=*/true, &first_byte, &format, &version_present,
1391       &has_length_prefix, &version_label, &parsed_version,
1392       &destination_connection_id, &source_connection_id, &long_packet_type,
1393       &retry_token_length_length, &retry_token, &detailed_error);
1394   EXPECT_THAT(parse_error, IsQuicNoError());
1395   EXPECT_EQ("", detailed_error);
1396   EXPECT_EQ(p[0], first_byte);
1397   EXPECT_TRUE(version_present);
1398   EXPECT_TRUE(has_length_prefix);
1399   EXPECT_EQ(0x50524F58u, version_label);  // "PROX"
1400   EXPECT_EQ(UnsupportedQuicVersion(), parsed_version);
1401   EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1402   EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1403   EXPECT_EQ(quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
1404             retry_token_length_length);
1405   EXPECT_EQ(absl::string_view(), retry_token);
1406   EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1407 }
1408 
TEST_P(QuicFramerTest,ClientConnectionIdFromShortHeaderToClient)1409 TEST_P(QuicFramerTest, ClientConnectionIdFromShortHeaderToClient) {
1410   if (!framer_.version().SupportsClientConnectionIds()) {
1411     return;
1412   }
1413   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1414   QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
1415                                                       TestConnectionId(0x33));
1416   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1417   framer_.SetExpectedClientConnectionIdLength(kQuicDefaultConnectionIdLength);
1418   // clang-format off
1419   unsigned char packet[] = {
1420     // type (short header, 4 byte packet number)
1421     0x43,
1422     // connection_id
1423     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1424     // packet number
1425     0x13, 0x37, 0x42, 0x33,
1426     // padding frame
1427     0x00,
1428   };
1429   // clang-format on
1430   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
1431   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1432   EXPECT_THAT(framer_.error(), IsQuicNoError());
1433   EXPECT_EQ("", framer_.detailed_error());
1434   ASSERT_TRUE(visitor_.header_.get());
1435   EXPECT_EQ(FramerTestConnectionId(),
1436             visitor_.header_->destination_connection_id);
1437 }
1438 
1439 // In short header packets from client to server, the client connection ID
1440 // is omitted, but the framer adds it to the header struct using its
1441 // last serialized client connection ID. This test ensures that this
1442 // mechanism behaves as expected.
TEST_P(QuicFramerTest,ClientConnectionIdFromShortHeaderToServer)1443 TEST_P(QuicFramerTest, ClientConnectionIdFromShortHeaderToServer) {
1444   if (!framer_.version().SupportsClientConnectionIds()) {
1445     return;
1446   }
1447   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1448   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1449   // clang-format off
1450   unsigned char packet[] = {
1451     // type (short header, 4 byte packet number)
1452     0x43,
1453     // connection_id
1454     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1455     // packet number
1456     0x13, 0x37, 0x42, 0x33,
1457     // padding frame
1458     0x00,
1459   };
1460   // clang-format on
1461   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
1462   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1463   EXPECT_THAT(framer_.error(), IsQuicNoError());
1464   EXPECT_EQ("", framer_.detailed_error());
1465   ASSERT_TRUE(visitor_.header_.get());
1466   EXPECT_EQ(FramerTestConnectionId(),
1467             visitor_.header_->destination_connection_id);
1468 }
1469 
TEST_P(QuicFramerTest,PacketHeaderWith0ByteConnectionId)1470 TEST_P(QuicFramerTest, PacketHeaderWith0ByteConnectionId) {
1471   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1472   QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
1473                                                       FramerTestConnectionId());
1474   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1475 
1476   // clang-format off
1477   PacketFragments packet = {
1478         // type (short header, 4 byte packet number)
1479         {"Unable to read first byte.",
1480          {0x43}},
1481         // connection_id
1482         // packet number
1483         {"Unable to read packet number.",
1484          {0x12, 0x34, 0x56, 0x78}},
1485    };
1486 
1487   PacketFragments packet_hp = {
1488         // type (short header, 4 byte packet number)
1489         {"Unable to read first byte.",
1490          {0x43}},
1491         // connection_id
1492         // packet number
1493         {"",
1494          {0x12, 0x34, 0x56, 0x78}},
1495    };
1496   // clang-format on
1497 
1498   PacketFragments& fragments =
1499       framer_.version().HasHeaderProtection() ? packet_hp : packet;
1500   std::unique_ptr<QuicEncryptedPacket> encrypted(
1501       AssemblePacketFromFragments(fragments));
1502   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1503   EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1504   ASSERT_TRUE(visitor_.header_.get());
1505   EXPECT_FALSE(visitor_.header_->reset_flag);
1506   EXPECT_FALSE(visitor_.header_->version_flag);
1507   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1508 
1509   CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1510 }
1511 
TEST_P(QuicFramerTest,PacketHeaderWithVersionFlag)1512 TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) {
1513   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
1514   // clang-format off
1515   PacketFragments packet = {
1516       // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1517       // packet number)
1518       {"Unable to read first byte.",
1519        {0xD3}},
1520       // version tag
1521       {"Unable to read protocol version.",
1522        {QUIC_VERSION_BYTES}},
1523       // connection_id length
1524       {"Unable to read ConnectionId length.",
1525        {0x50}},
1526       // connection_id
1527       {"Unable to read destination connection ID.",
1528        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1529       // packet number
1530       {"Unable to read packet number.",
1531        {0x12, 0x34, 0x56, 0x78}},
1532   };
1533 
1534   PacketFragments packet49 = {
1535       // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1536       // packet number)
1537       {"Unable to read first byte.",
1538        {0xD3}},
1539       // version tag
1540       {"Unable to read protocol version.",
1541        {QUIC_VERSION_BYTES}},
1542       // destination connection ID length
1543       {"Unable to read destination connection ID.",
1544        {0x08}},
1545       // destination connection ID
1546       {"Unable to read destination connection ID.",
1547        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1548       // source connection ID length
1549       {"Unable to read source connection ID.",
1550        {0x00}},
1551       // long header packet length
1552       {"Unable to read long header payload length.",
1553        {0x04}},
1554       // packet number
1555       {"Long header payload length longer than packet.",
1556        {0x12, 0x34, 0x56, 0x78}},
1557   };
1558   // clang-format on
1559 
1560   ReviseFirstByteByVersion(packet49);
1561   PacketFragments& fragments =
1562       framer_.version().HasLongHeaderLengths() ? packet49 : packet;
1563   std::unique_ptr<QuicEncryptedPacket> encrypted(
1564       AssemblePacketFromFragments(fragments));
1565   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1566   EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1567   ASSERT_TRUE(visitor_.header_.get());
1568   EXPECT_EQ(FramerTestConnectionId(),
1569             visitor_.header_->destination_connection_id);
1570   EXPECT_FALSE(visitor_.header_->reset_flag);
1571   EXPECT_TRUE(visitor_.header_->version_flag);
1572   EXPECT_EQ(GetParam(), visitor_.header_->version);
1573   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1574 
1575   CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1576 }
1577 
TEST_P(QuicFramerTest,PacketHeaderWith4BytePacketNumber)1578 TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) {
1579   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1580   QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1581 
1582   // clang-format off
1583   PacketFragments packet = {
1584       // type (short header, 4 byte packet number)
1585       {"Unable to read first byte.",
1586        {0x43}},
1587       // connection_id
1588       {"Unable to read destination connection ID.",
1589        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1590       // packet number
1591       {"Unable to read packet number.",
1592        {0x12, 0x34, 0x56, 0x78}},
1593   };
1594 
1595   PacketFragments packet_hp = {
1596       // type (short header, 4 byte packet number)
1597       {"Unable to read first byte.",
1598        {0x43}},
1599       // connection_id
1600       {"Unable to read destination connection ID.",
1601        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1602       // packet number
1603       {"",
1604        {0x12, 0x34, 0x56, 0x78}},
1605   };
1606   // clang-format on
1607 
1608   PacketFragments& fragments =
1609       framer_.version().HasHeaderProtection() ? packet_hp : packet;
1610   std::unique_ptr<QuicEncryptedPacket> encrypted(
1611       AssemblePacketFromFragments(fragments));
1612   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1613   EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1614   ASSERT_TRUE(visitor_.header_.get());
1615   EXPECT_EQ(FramerTestConnectionId(),
1616             visitor_.header_->destination_connection_id);
1617   EXPECT_FALSE(visitor_.header_->reset_flag);
1618   EXPECT_FALSE(visitor_.header_->version_flag);
1619   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1620 
1621   CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1622 }
1623 
TEST_P(QuicFramerTest,PacketHeaderWith2BytePacketNumber)1624 TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) {
1625   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1626   QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1627 
1628   // clang-format off
1629   PacketFragments packet = {
1630       // type (short header, 2 byte packet number)
1631       {"Unable to read first byte.",
1632        {0x41}},
1633       // connection_id
1634       {"Unable to read destination connection ID.",
1635        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1636       // packet number
1637       {"Unable to read packet number.",
1638        {0x56, 0x78}},
1639   };
1640 
1641   PacketFragments packet_hp = {
1642       // type (short header, 2 byte packet number)
1643       {"Unable to read first byte.",
1644        {0x41}},
1645       // connection_id
1646       {"Unable to read destination connection ID.",
1647        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1648       // packet number
1649       {"",
1650        {0x56, 0x78}},
1651       // padding
1652       {"", {0x00, 0x00}},
1653   };
1654   // clang-format on
1655 
1656   PacketFragments& fragments =
1657       framer_.version().HasHeaderProtection() ? packet_hp : packet;
1658   std::unique_ptr<QuicEncryptedPacket> encrypted(
1659       AssemblePacketFromFragments(fragments));
1660   if (framer_.version().HasHeaderProtection()) {
1661     EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
1662     EXPECT_THAT(framer_.error(), IsQuicNoError());
1663   } else {
1664     EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1665     EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1666   }
1667   ASSERT_TRUE(visitor_.header_.get());
1668   EXPECT_EQ(FramerTestConnectionId(),
1669             visitor_.header_->destination_connection_id);
1670   EXPECT_FALSE(visitor_.header_->reset_flag);
1671   EXPECT_FALSE(visitor_.header_->version_flag);
1672   EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1673   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1674 
1675   CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1676 }
1677 
TEST_P(QuicFramerTest,PacketHeaderWith1BytePacketNumber)1678 TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) {
1679   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1680   QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1681 
1682   // clang-format off
1683   PacketFragments packet = {
1684       // type (8 byte connection_id and 1 byte packet number)
1685       {"Unable to read first byte.",
1686        {0x40}},
1687       // connection_id
1688       {"Unable to read destination connection ID.",
1689        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1690       // packet number
1691       {"Unable to read packet number.",
1692        {0x78}},
1693   };
1694 
1695   PacketFragments packet_hp = {
1696       // type (8 byte connection_id and 1 byte packet number)
1697       {"Unable to read first byte.",
1698        {0x40}},
1699       // connection_id
1700       {"Unable to read destination connection ID.",
1701        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1702       // packet number
1703       {"",
1704        {0x78}},
1705       // padding
1706       {"", {0x00, 0x00, 0x00}},
1707   };
1708 
1709   // clang-format on
1710 
1711   PacketFragments& fragments =
1712       framer_.version().HasHeaderProtection() ? packet_hp : packet;
1713   std::unique_ptr<QuicEncryptedPacket> encrypted(
1714       AssemblePacketFromFragments(fragments));
1715   if (framer_.version().HasHeaderProtection()) {
1716     EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
1717     EXPECT_THAT(framer_.error(), IsQuicNoError());
1718   } else {
1719     EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1720     EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1721   }
1722   ASSERT_TRUE(visitor_.header_.get());
1723   EXPECT_EQ(FramerTestConnectionId(),
1724             visitor_.header_->destination_connection_id);
1725   EXPECT_FALSE(visitor_.header_->reset_flag);
1726   EXPECT_FALSE(visitor_.header_->version_flag);
1727   EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1728   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1729 
1730   CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1731 }
1732 
TEST_P(QuicFramerTest,PacketNumberDecreasesThenIncreases)1733 TEST_P(QuicFramerTest, PacketNumberDecreasesThenIncreases) {
1734   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1735   // Test the case when a packet is received from the past and future packet
1736   // numbers are still calculated relative to the largest received packet.
1737   QuicPacketHeader header;
1738   header.destination_connection_id = FramerTestConnectionId();
1739   header.reset_flag = false;
1740   header.version_flag = false;
1741   header.packet_number = kPacketNumber - 2;
1742 
1743   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
1744   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1745   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
1746   ASSERT_TRUE(data != nullptr);
1747 
1748   QuicEncryptedPacket encrypted(data->data(), data->length(), false);
1749   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1750   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1751   ASSERT_TRUE(visitor_.header_.get());
1752   EXPECT_EQ(FramerTestConnectionId(),
1753             visitor_.header_->destination_connection_id);
1754   EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1755   EXPECT_EQ(kPacketNumber - 2, visitor_.header_->packet_number);
1756 
1757   // Receive a 1 byte packet number.
1758   header.packet_number = kPacketNumber;
1759   header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1760   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1761   data = BuildDataPacket(header, frames);
1762   QuicEncryptedPacket encrypted1(data->data(), data->length(), false);
1763   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1764   EXPECT_TRUE(framer_.ProcessPacket(encrypted1));
1765   ASSERT_TRUE(visitor_.header_.get());
1766   EXPECT_EQ(FramerTestConnectionId(),
1767             visitor_.header_->destination_connection_id);
1768   EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1769   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1770 
1771   // Process a 2 byte packet number 256 packets ago.
1772   header.packet_number = kPacketNumber - 256;
1773   header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
1774   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1775   data = BuildDataPacket(header, frames);
1776   QuicEncryptedPacket encrypted2(data->data(), data->length(), false);
1777   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1778   EXPECT_TRUE(framer_.ProcessPacket(encrypted2));
1779   ASSERT_TRUE(visitor_.header_.get());
1780   EXPECT_EQ(FramerTestConnectionId(),
1781             visitor_.header_->destination_connection_id);
1782   EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1783   EXPECT_EQ(kPacketNumber - 256, visitor_.header_->packet_number);
1784 
1785   // Process another 1 byte packet number and ensure it works.
1786   header.packet_number = kPacketNumber - 1;
1787   header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1788   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1789   data = BuildDataPacket(header, frames);
1790   QuicEncryptedPacket encrypted3(data->data(), data->length(), false);
1791   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1792   EXPECT_TRUE(framer_.ProcessPacket(encrypted3));
1793   ASSERT_TRUE(visitor_.header_.get());
1794   EXPECT_EQ(FramerTestConnectionId(),
1795             visitor_.header_->destination_connection_id);
1796   EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1797   EXPECT_EQ(kPacketNumber - 1, visitor_.header_->packet_number);
1798 }
1799 
TEST_P(QuicFramerTest,PacketWithDiversificationNonce)1800 TEST_P(QuicFramerTest, PacketWithDiversificationNonce) {
1801   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
1802   // clang-format off
1803   unsigned char packet[] = {
1804     // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1805     // number.
1806     0xD0,
1807     // version tag
1808     QUIC_VERSION_BYTES,
1809     // connection_id length
1810     0x05,
1811     // connection_id
1812     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1813     // packet number
1814     0x78,
1815     // nonce
1816     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1817     0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1818     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1819     0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1820 
1821     // frame type (padding)
1822     0x00,
1823     0x00, 0x00, 0x00, 0x00
1824   };
1825 
1826   unsigned char packet49[] = {
1827     // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1828     // number.
1829     0xD0,
1830     // version tag
1831     QUIC_VERSION_BYTES,
1832     // destination connection ID length
1833     0x00,
1834     // source connection ID length
1835     0x08,
1836     // source connection ID
1837     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1838     // long header packet length
1839     0x26,
1840     // packet number
1841     0x78,
1842     // nonce
1843     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1844     0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1845     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1846     0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1847 
1848     // frame type (padding)
1849     0x00,
1850     0x00, 0x00, 0x00, 0x00
1851   };
1852   // clang-format on
1853 
1854   if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
1855     return;
1856   }
1857 
1858   unsigned char* p = packet;
1859   size_t p_size = ABSL_ARRAYSIZE(packet);
1860   if (framer_.version().HasLongHeaderLengths()) {
1861     p = packet49;
1862     p_size = ABSL_ARRAYSIZE(packet49);
1863   }
1864 
1865   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1866   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1867   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1868   ASSERT_TRUE(visitor_.header_->nonce != nullptr);
1869   for (char i = 0; i < 32; ++i) {
1870     EXPECT_EQ(i, (*visitor_.header_->nonce)[static_cast<size_t>(i)]);
1871   }
1872   EXPECT_EQ(1u, visitor_.padding_frames_.size());
1873   EXPECT_EQ(5, visitor_.padding_frames_[0]->num_padding_bytes);
1874 }
1875 
TEST_P(QuicFramerTest,LargePublicFlagWithMismatchedVersions)1876 TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) {
1877   // clang-format off
1878   unsigned char packet[] = {
1879     // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
1880     0xD3,
1881     // version tag
1882     'Q', '0', '0', '0',
1883     // connection_id length
1884     0x50,
1885     // connection_id
1886     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1887     // packet number
1888     0x12, 0x34, 0x56, 0x78,
1889 
1890     // frame type (padding frame)
1891     0x00,
1892     0x00, 0x00, 0x00, 0x00
1893   };
1894 
1895   unsigned char packet49[] = {
1896     // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
1897     0xD3,
1898     // version tag
1899     'Q', '0', '0', '0',
1900     // destination connection ID length
1901     0x08,
1902     // destination connection ID
1903     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1904     // source connection ID length
1905     0x00,
1906     // packet number
1907     0x12, 0x34, 0x56, 0x78,
1908 
1909     // frame type (padding frame)
1910     0x00,
1911     0x00, 0x00, 0x00, 0x00
1912   };
1913   // clang-format on
1914 
1915   unsigned char* p = packet;
1916   size_t p_size = ABSL_ARRAYSIZE(packet);
1917   if (framer_.version().HasLongHeaderLengths()) {
1918     p = packet49;
1919     p_size = ABSL_ARRAYSIZE(packet49);
1920   }
1921   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1922   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1923   EXPECT_THAT(framer_.error(), IsQuicNoError());
1924   ASSERT_TRUE(visitor_.header_.get());
1925   EXPECT_EQ(0, visitor_.frame_count_);
1926   EXPECT_EQ(1, visitor_.version_mismatch_);
1927 }
1928 
TEST_P(QuicFramerTest,PaddingFrame)1929 TEST_P(QuicFramerTest, PaddingFrame) {
1930   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1931   // clang-format off
1932   unsigned char packet[] = {
1933     // type (short header, 4 byte packet number)
1934     0x43,
1935     // connection_id
1936     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1937     // packet number
1938     0x12, 0x34, 0x56, 0x78,
1939 
1940     // paddings
1941     0x00, 0x00,
1942     // frame type (stream frame with fin)
1943     0xFF,
1944     // stream id
1945     0x01, 0x02, 0x03, 0x04,
1946     // offset
1947     0x3A, 0x98, 0xFE, 0xDC,
1948     0x32, 0x10, 0x76, 0x54,
1949     // data length
1950     0x00, 0x0c,
1951     // data
1952     'h',  'e',  'l',  'l',
1953     'o',  ' ',  'w',  'o',
1954     'r',  'l',  'd',  '!',
1955     // paddings
1956     0x00, 0x00,
1957   };
1958 
1959   unsigned char packet_ietf[] = {
1960     // type (short header, 4 byte packet number)
1961     0x43,
1962     // connection_id
1963     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1964     // packet number
1965     0x12, 0x34, 0x56, 0x78,
1966 
1967     // paddings
1968     0x00, 0x00,
1969     // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
1970     0x08 | 0x01 | 0x02 | 0x04,
1971 
1972     // stream id
1973     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
1974     // offset
1975     kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
1976     0x32, 0x10, 0x76, 0x54,
1977     // data length
1978     kVarInt62OneByte + 0x0c,
1979     // data
1980     'h',  'e',  'l',  'l',
1981     'o',  ' ',  'w',  'o',
1982     'r',  'l',  'd',  '!',
1983     // paddings
1984     0x00, 0x00,
1985   };
1986   // clang-format on
1987 
1988   unsigned char* p = packet;
1989   size_t p_size = ABSL_ARRAYSIZE(packet);
1990   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
1991     p = packet_ietf;
1992     p_size = ABSL_ARRAYSIZE(packet_ietf);
1993   }
1994 
1995   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1996   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1997   EXPECT_THAT(framer_.error(), IsQuicNoError());
1998   ASSERT_TRUE(visitor_.header_.get());
1999   EXPECT_TRUE(CheckDecryption(
2000       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2001       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2002 
2003   ASSERT_EQ(1u, visitor_.stream_frames_.size());
2004   EXPECT_EQ(0u, visitor_.ack_frames_.size());
2005   EXPECT_EQ(2u, visitor_.padding_frames_.size());
2006   EXPECT_EQ(2, visitor_.padding_frames_[0]->num_padding_bytes);
2007   EXPECT_EQ(2, visitor_.padding_frames_[1]->num_padding_bytes);
2008   EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2009   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2010   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2011   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2012 }
2013 
TEST_P(QuicFramerTest,StreamFrame)2014 TEST_P(QuicFramerTest, StreamFrame) {
2015   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2016   // clang-format off
2017   PacketFragments packet = {
2018       // type (short header, 4 byte packet number)
2019       {"",
2020        {0x43}},
2021       // connection_id
2022       {"",
2023        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2024       // packet number
2025       {"",
2026        {0x12, 0x34, 0x56, 0x78}},
2027       // frame type (stream frame with fin)
2028       {"",
2029        {0xFF}},
2030       // stream id
2031       {"Unable to read stream_id.",
2032        {0x01, 0x02, 0x03, 0x04}},
2033       // offset
2034       {"Unable to read offset.",
2035        {0x3A, 0x98, 0xFE, 0xDC,
2036         0x32, 0x10, 0x76, 0x54}},
2037       {"Unable to read frame data.",
2038        {
2039          // data length
2040          0x00, 0x0c,
2041          // data
2042          'h',  'e',  'l',  'l',
2043          'o',  ' ',  'w',  'o',
2044          'r',  'l',  'd',  '!'}},
2045   };
2046 
2047   PacketFragments packet_ietf = {
2048       // type (short header, 4 byte packet number)
2049       {"",
2050        {0x43}},
2051       // connection_id
2052       {"",
2053        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2054       // packet number
2055       {"",
2056        {0x12, 0x34, 0x56, 0x78}},
2057       // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
2058       {"",
2059        { 0x08 | 0x01 | 0x02 | 0x04 }},
2060       // stream id
2061       {"Unable to read IETF_STREAM frame stream id/count.",
2062        {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
2063       // offset
2064       {"Unable to read stream data offset.",
2065        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2066         0x32, 0x10, 0x76, 0x54}},
2067       // data length
2068       {"Unable to read stream data length.",
2069        {kVarInt62OneByte + 0x0c}},
2070       // data
2071       {"Unable to read frame data.",
2072        { 'h',  'e',  'l',  'l',
2073          'o',  ' ',  'w',  'o',
2074          'r',  'l',  'd',  '!'}},
2075   };
2076   // clang-format on
2077 
2078   PacketFragments& fragments =
2079       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2080                                                             : packet;
2081   std::unique_ptr<QuicEncryptedPacket> encrypted(
2082       AssemblePacketFromFragments(fragments));
2083   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2084 
2085   EXPECT_THAT(framer_.error(), IsQuicNoError());
2086   ASSERT_TRUE(visitor_.header_.get());
2087   EXPECT_TRUE(CheckDecryption(
2088       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2089       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2090 
2091   ASSERT_EQ(1u, visitor_.stream_frames_.size());
2092   EXPECT_EQ(0u, visitor_.ack_frames_.size());
2093   EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2094   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2095   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2096   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2097 
2098   CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2099 }
2100 
2101 // Test an empty (no data) stream frame.
TEST_P(QuicFramerTest,EmptyStreamFrame)2102 TEST_P(QuicFramerTest, EmptyStreamFrame) {
2103   // Only the IETF QUIC spec explicitly says that empty
2104   // stream frames are supported.
2105   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2106     return;
2107   }
2108   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2109   // clang-format off
2110   PacketFragments packet = {
2111       // type (short header, 4 byte packet number)
2112       {"",
2113        {0x43}},
2114       // connection_id
2115       {"",
2116        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2117       // packet number
2118       {"",
2119        {0x12, 0x34, 0x56, 0x78}},
2120       // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
2121       {"",
2122        { 0x08 | 0x01 | 0x02 | 0x04 }},
2123       // stream id
2124       {"Unable to read IETF_STREAM frame stream id/count.",
2125        {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
2126       // offset
2127       {"Unable to read stream data offset.",
2128        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2129         0x32, 0x10, 0x76, 0x54}},
2130       // data length
2131       {"Unable to read stream data length.",
2132        {kVarInt62OneByte + 0x00}},
2133   };
2134   // clang-format on
2135 
2136   std::unique_ptr<QuicEncryptedPacket> encrypted(
2137       AssemblePacketFromFragments(packet));
2138   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2139 
2140   EXPECT_THAT(framer_.error(), IsQuicNoError());
2141   ASSERT_TRUE(visitor_.header_.get());
2142   EXPECT_TRUE(CheckDecryption(
2143       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2144       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2145 
2146   ASSERT_EQ(1u, visitor_.stream_frames_.size());
2147   EXPECT_EQ(0u, visitor_.ack_frames_.size());
2148   EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2149   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2150   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2151   EXPECT_EQ(visitor_.stream_frames_[0].get()->data_length, 0u);
2152 
2153   CheckFramingBoundaries(packet, QUIC_INVALID_STREAM_DATA);
2154 }
2155 
TEST_P(QuicFramerTest,MissingDiversificationNonce)2156 TEST_P(QuicFramerTest, MissingDiversificationNonce) {
2157   if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
2158     // TLS does not use diversification nonces.
2159     return;
2160   }
2161   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
2162   decrypter_ = new test::TestDecrypter();
2163   if (framer_.version().KnowsWhichDecrypterToUse()) {
2164     framer_.InstallDecrypter(
2165         ENCRYPTION_INITIAL,
2166         std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
2167     framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
2168                              std::unique_ptr<QuicDecrypter>(decrypter_));
2169   } else {
2170     framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
2171                                                  Perspective::IS_CLIENT));
2172     framer_.SetAlternativeDecrypter(
2173         ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
2174   }
2175 
2176   // clang-format off
2177   unsigned char packet[] = {
2178         // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2179         0xD3,
2180         // version tag
2181         QUIC_VERSION_BYTES,
2182         // connection_id length
2183         0x05,
2184         // connection_id
2185         0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2186         // packet number
2187         0x12, 0x34, 0x56, 0x78,
2188         // padding frame
2189         0x00,
2190     };
2191 
2192   unsigned char packet49[] = {
2193         // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2194         0xD3,
2195         // version tag
2196         QUIC_VERSION_BYTES,
2197         // destination connection ID length
2198         0x00,
2199         // source connection ID length
2200         0x08,
2201         // source connection ID
2202         0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2203         // IETF long header payload length
2204         0x05,
2205         // packet number
2206         0x12, 0x34, 0x56, 0x78,
2207         // padding frame
2208         0x00,
2209     };
2210   // clang-format on
2211 
2212   unsigned char* p = packet;
2213   size_t p_length = ABSL_ARRAYSIZE(packet);
2214   if (framer_.version().HasLongHeaderLengths()) {
2215     p = packet49;
2216     p_length = ABSL_ARRAYSIZE(packet49);
2217   }
2218   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
2219   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
2220   if (framer_.version().HasHeaderProtection()) {
2221     EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
2222     EXPECT_EQ("Unable to decrypt ENCRYPTION_ZERO_RTT header protection.",
2223               framer_.detailed_error());
2224   } else {
2225     // Cannot read diversification nonce.
2226     EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
2227     EXPECT_EQ("Unable to read nonce.", framer_.detailed_error());
2228   }
2229 }
2230 
TEST_P(QuicFramerTest,StreamFrame2ByteStreamId)2231 TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) {
2232   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2233   // clang-format off
2234   PacketFragments packet = {
2235       // type (short header, 4 byte packet number)
2236       {"",
2237        {0x43}},
2238       // connection_id
2239       {"",
2240        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2241       // packet number
2242       {"",
2243        {0x12, 0x34, 0x56, 0x78}},
2244        // frame type (stream frame with fin)
2245        {"",
2246         {0xFD}},
2247        // stream id
2248        {"Unable to read stream_id.",
2249         {0x03, 0x04}},
2250        // offset
2251        {"Unable to read offset.",
2252         {0x3A, 0x98, 0xFE, 0xDC,
2253          0x32, 0x10, 0x76, 0x54}},
2254        {"Unable to read frame data.",
2255         {
2256           // data length
2257           0x00, 0x0c,
2258           // data
2259           'h',  'e',  'l',  'l',
2260           'o',  ' ',  'w',  'o',
2261           'r',  'l',  'd',  '!'}},
2262   };
2263 
2264   PacketFragments packet_ietf = {
2265       // type (short header, 4 byte packet number)
2266       {"",
2267        {0x43}},
2268       // connection_id
2269       {"",
2270        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2271       // packet number
2272       {"",
2273        {0x12, 0x34, 0x56, 0x78}},
2274       // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2275       {"",
2276        {0x08 | 0x01 | 0x02 | 0x04}},
2277       // stream id
2278       {"Unable to read IETF_STREAM frame stream id/count.",
2279        {kVarInt62TwoBytes + 0x03, 0x04}},
2280       // offset
2281       {"Unable to read stream data offset.",
2282        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2283         0x32, 0x10, 0x76, 0x54}},
2284       // data length
2285       {"Unable to read stream data length.",
2286        {kVarInt62OneByte + 0x0c}},
2287       // data
2288       {"Unable to read frame data.",
2289        { 'h',  'e',  'l',  'l',
2290          'o',  ' ',  'w',  'o',
2291          'r',  'l',  'd',  '!'}},
2292   };
2293   // clang-format on
2294 
2295   PacketFragments& fragments =
2296       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2297                                                             : packet;
2298   std::unique_ptr<QuicEncryptedPacket> encrypted(
2299       AssemblePacketFromFragments(fragments));
2300   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2301 
2302   EXPECT_THAT(framer_.error(), IsQuicNoError());
2303   ASSERT_TRUE(visitor_.header_.get());
2304   EXPECT_TRUE(CheckDecryption(
2305       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2306       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2307 
2308   ASSERT_EQ(1u, visitor_.stream_frames_.size());
2309   EXPECT_EQ(0u, visitor_.ack_frames_.size());
2310   // Stream ID should be the last 2 bytes of kStreamId.
2311   EXPECT_EQ(0x0000FFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2312   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2313   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2314   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2315 
2316   CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2317 }
2318 
TEST_P(QuicFramerTest,StreamFrame1ByteStreamId)2319 TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) {
2320   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2321   // clang-format off
2322   PacketFragments packet = {
2323       // type (short header, 4 byte packet number)
2324       {"",
2325        {0x43}},
2326       // connection_id
2327       {"",
2328        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2329       // packet number
2330       {"",
2331        {0x12, 0x34, 0x56, 0x78}},
2332       // frame type (stream frame with fin)
2333       {"",
2334        {0xFC}},
2335       // stream id
2336       {"Unable to read stream_id.",
2337        {0x04}},
2338       // offset
2339       {"Unable to read offset.",
2340        {0x3A, 0x98, 0xFE, 0xDC,
2341         0x32, 0x10, 0x76, 0x54}},
2342       {"Unable to read frame data.",
2343        {
2344          // data length
2345          0x00, 0x0c,
2346          // data
2347          'h',  'e',  'l',  'l',
2348          'o',  ' ',  'w',  'o',
2349          'r',  'l',  'd',  '!'}},
2350   };
2351 
2352   PacketFragments packet_ietf = {
2353       // type (short header, 4 byte packet number)
2354       {"",
2355        {0x43}},
2356       // connection_id
2357       {"",
2358        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2359       // packet number
2360       {"",
2361        {0x12, 0x34, 0x56, 0x78}},
2362       // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2363       {"",
2364        {0x08 | 0x01 | 0x02 | 0x04}},
2365       // stream id
2366       {"Unable to read IETF_STREAM frame stream id/count.",
2367        {kVarInt62OneByte + 0x04}},
2368       // offset
2369       {"Unable to read stream data offset.",
2370        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2371         0x32, 0x10, 0x76, 0x54}},
2372       // data length
2373       {"Unable to read stream data length.",
2374        {kVarInt62OneByte + 0x0c}},
2375       // data
2376       {"Unable to read frame data.",
2377        { 'h',  'e',  'l',  'l',
2378          'o',  ' ',  'w',  'o',
2379          'r',  'l',  'd',  '!'}},
2380   };
2381   // clang-format on
2382 
2383   PacketFragments& fragments =
2384       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2385                                                             : packet;
2386   std::unique_ptr<QuicEncryptedPacket> encrypted(
2387       AssemblePacketFromFragments(fragments));
2388   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2389 
2390   EXPECT_THAT(framer_.error(), IsQuicNoError());
2391   ASSERT_TRUE(visitor_.header_.get());
2392   EXPECT_TRUE(CheckDecryption(
2393       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2394       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2395 
2396   ASSERT_EQ(1u, visitor_.stream_frames_.size());
2397   EXPECT_EQ(0u, visitor_.ack_frames_.size());
2398   // Stream ID should be the last 1 byte of kStreamId.
2399   EXPECT_EQ(0x000000FF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2400   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2401   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2402   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2403 
2404   CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2405 }
2406 
TEST_P(QuicFramerTest,StreamFrameWithVersion)2407 TEST_P(QuicFramerTest, StreamFrameWithVersion) {
2408   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
2409   // clang-format off
2410   PacketFragments packet = {
2411       // public flags (long header with packet type ZERO_RTT_PROTECTED and
2412       // 4-byte packet number)
2413       {"",
2414        {0xD3}},
2415       // version tag
2416       {"",
2417        {QUIC_VERSION_BYTES}},
2418       // connection_id length
2419       {"",
2420        {0x50}},
2421       // connection_id
2422       {"",
2423        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2424       // packet number
2425       {"",
2426        {0x12, 0x34, 0x56, 0x78}},
2427       // frame type (stream frame with fin)
2428       {"",
2429        {0xFE}},
2430       // stream id
2431       {"Unable to read stream_id.",
2432        {0x02, 0x03, 0x04}},
2433       // offset
2434       {"Unable to read offset.",
2435        {0x3A, 0x98, 0xFE, 0xDC,
2436         0x32, 0x10, 0x76, 0x54}},
2437       {"Unable to read frame data.",
2438        {
2439          // data length
2440          0x00, 0x0c,
2441          // data
2442          'h',  'e',  'l',  'l',
2443          'o',  ' ',  'w',  'o',
2444          'r',  'l',  'd',  '!'}},
2445   };
2446 
2447   PacketFragments packet49 = {
2448       // public flags (long header with packet type ZERO_RTT_PROTECTED and
2449       // 4-byte packet number)
2450       {"",
2451        {0xD3}},
2452       // version tag
2453       {"",
2454        {QUIC_VERSION_BYTES}},
2455       // destination connection ID length
2456       {"",
2457        {0x08}},
2458       // destination connection ID
2459       {"",
2460        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2461       // source connection ID length
2462       {"",
2463        {0x00}},
2464       // long header packet length
2465       {"",
2466        {0x1E}},
2467       // packet number
2468       {"",
2469        {0x12, 0x34, 0x56, 0x78}},
2470       // frame type (stream frame with fin)
2471       {"",
2472        {0xFE}},
2473       // stream id
2474       {"Long header payload length longer than packet.",
2475        {0x02, 0x03, 0x04}},
2476       // offset
2477       {"Long header payload length longer than packet.",
2478        {0x3A, 0x98, 0xFE, 0xDC,
2479         0x32, 0x10, 0x76, 0x54}},
2480       {"Long header payload length longer than packet.",
2481        {
2482          // data length
2483          0x00, 0x0c,
2484          // data
2485          'h',  'e',  'l',  'l',
2486          'o',  ' ',  'w',  'o',
2487          'r',  'l',  'd',  '!'}},
2488   };
2489 
2490   PacketFragments packet_ietf = {
2491       // public flags (long header with packet type ZERO_RTT_PROTECTED and
2492       // 4-byte packet number)
2493       {"",
2494        {0xD3}},
2495       // version tag
2496       {"",
2497        {QUIC_VERSION_BYTES}},
2498       // destination connection ID length
2499       {"",
2500        {0x08}},
2501       // destination connection ID
2502       {"",
2503        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2504       // source connection ID length
2505       {"",
2506        {0x00}},
2507       // long header packet length
2508       {"",
2509        {0x1E}},
2510       // packet number
2511       {"",
2512        {0x12, 0x34, 0x56, 0x78}},
2513       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
2514       {"",
2515        {0x08 | 0x01 | 0x02 | 0x04}},
2516       // stream id
2517       {"Long header payload length longer than packet.",
2518        {kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04}},
2519       // offset
2520       {"Long header payload length longer than packet.",
2521        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2522         0x32, 0x10, 0x76, 0x54}},
2523       // data length
2524       {"Long header payload length longer than packet.",
2525        {kVarInt62OneByte + 0x0c}},
2526       // data
2527       {"Long header payload length longer than packet.",
2528        { 'h',  'e',  'l',  'l',
2529          'o',  ' ',  'w',  'o',
2530          'r',  'l',  'd',  '!'}},
2531   };
2532   // clang-format on
2533 
2534   quiche::QuicheVariableLengthIntegerLength retry_token_length_length =
2535       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
2536   size_t retry_token_length = 0;
2537   quiche::QuicheVariableLengthIntegerLength length_length =
2538       QuicVersionHasLongHeaderLengths(framer_.transport_version())
2539           ? quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1
2540           : quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
2541 
2542   ReviseFirstByteByVersion(packet_ietf);
2543   PacketFragments& fragments =
2544       VersionHasIetfQuicFrames(framer_.transport_version())
2545           ? packet_ietf
2546           : (framer_.version().HasLongHeaderLengths() ? packet49 : packet);
2547   std::unique_ptr<QuicEncryptedPacket> encrypted(
2548       AssemblePacketFromFragments(fragments));
2549   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2550 
2551   EXPECT_THAT(framer_.error(), IsQuicNoError());
2552   ASSERT_TRUE(visitor_.header_.get());
2553   EXPECT_TRUE(CheckDecryption(
2554       *encrypted, kIncludeVersion, !kIncludeDiversificationNonce,
2555       kPacket8ByteConnectionId, kPacket0ByteConnectionId,
2556       retry_token_length_length, retry_token_length, length_length));
2557 
2558   ASSERT_EQ(1u, visitor_.stream_frames_.size());
2559   EXPECT_EQ(0u, visitor_.ack_frames_.size());
2560   // Stream ID should be the last 3 bytes of kStreamId.
2561   EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2562   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2563   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2564   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2565 
2566   CheckFramingBoundaries(fragments, framer_.version().HasLongHeaderLengths()
2567                                         ? QUIC_INVALID_PACKET_HEADER
2568                                         : QUIC_INVALID_STREAM_DATA);
2569 }
2570 
TEST_P(QuicFramerTest,RejectPacket)2571 TEST_P(QuicFramerTest, RejectPacket) {
2572   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2573   visitor_.accept_packet_ = false;
2574 
2575   // clang-format off
2576   unsigned char packet[] = {
2577       // type (short header, 4 byte packet number)
2578       0x43,
2579       // connection_id
2580       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2581       // packet number
2582       0x12, 0x34, 0x56, 0x78,
2583 
2584       // frame type (STREAM Frame with FIN, LEN, and OFFSET bits set)
2585       0x10 | 0x01 | 0x02 | 0x04,
2586       // stream id
2587       kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
2588       // offset
2589       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2590       0x32, 0x10, 0x76, 0x54,
2591       // data length
2592       kVarInt62OneByte + 0x0c,
2593       // data
2594       'h',  'e',  'l',  'l',
2595       'o',  ' ',  'w',  'o',
2596       'r',  'l',  'd',  '!',
2597   };
2598   // clang-format on
2599 
2600   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
2601   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2602 
2603   EXPECT_THAT(framer_.error(), IsQuicNoError());
2604   ASSERT_TRUE(visitor_.header_.get());
2605   EXPECT_TRUE(CheckDecryption(
2606       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2607       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2608 
2609   ASSERT_EQ(0u, visitor_.stream_frames_.size());
2610   EXPECT_EQ(0u, visitor_.ack_frames_.size());
2611 }
2612 
TEST_P(QuicFramerTest,RejectPublicHeader)2613 TEST_P(QuicFramerTest, RejectPublicHeader) {
2614   visitor_.accept_public_header_ = false;
2615 
2616   // clang-format off
2617   unsigned char packet[] = {
2618     // type (short header, 1 byte packet number)
2619     0x40,
2620     // connection_id
2621     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2622     // packet number
2623     0x01,
2624   };
2625   // clang-format on
2626 
2627   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
2628   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2629 
2630   EXPECT_THAT(framer_.error(), IsQuicNoError());
2631   ASSERT_TRUE(visitor_.header_.get());
2632   EXPECT_FALSE(visitor_.header_->packet_number.IsInitialized());
2633 }
2634 
TEST_P(QuicFramerTest,AckFrameOneAckBlock)2635 TEST_P(QuicFramerTest, AckFrameOneAckBlock) {
2636   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2637   // clang-format off
2638   PacketFragments packet = {
2639       // type (short packet, 4 byte packet number)
2640       {"",
2641        {0x43}},
2642       // connection_id
2643       {"",
2644        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2645       // packet number
2646       {"",
2647        {0x12, 0x34, 0x56, 0x78}},
2648       // frame type (ack frame)
2649       // (one ack block, 2 byte largest observed, 2 byte block length)
2650       {"",
2651        {0x45}},
2652       // largest acked
2653       {"Unable to read largest acked.",
2654        {0x12, 0x34}},
2655       // Zero delta time.
2656       {"Unable to read ack delay time.",
2657        {0x00, 0x00}},
2658       // first ack block length.
2659       {"Unable to read first ack block length.",
2660        {0x12, 0x34}},
2661       // num timestamps.
2662       {"Unable to read num received packets.",
2663        {0x00}}
2664   };
2665 
2666   PacketFragments packet_ietf = {
2667       // type (short packet, 4 byte packet number)
2668       {"",
2669        {0x43}},
2670       // connection_id
2671       {"",
2672        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2673       // packet number
2674       {"",
2675        {0x12, 0x34, 0x56, 0x78}},
2676        // frame type (IETF_ACK)
2677        // (one ack block, 2 byte largest observed, 2 byte block length)
2678        // IETF-Quic ignores the bit-fields in the ack type, all of
2679        // that information is encoded elsewhere in the frame.
2680        {"",
2681         {0x02}},
2682        // largest acked
2683        {"Unable to read largest acked.",
2684         {kVarInt62TwoBytes  + 0x12, 0x34}},
2685        // Zero delta time.
2686        {"Unable to read ack delay time.",
2687         {kVarInt62OneByte + 0x00}},
2688       // Ack block count (0 -- no blocks after the first)
2689       {"Unable to read ack block count.",
2690        {kVarInt62OneByte + 0x00}},
2691        // first ack block length - 1.
2692        // IETF Quic defines the ack block's value as the "number of
2693        // packets that preceed the largest packet number in the block"
2694        // which for the 1st ack block is the largest acked field,
2695        // above. This means that if we are acking just packet 0x1234
2696        // then the 1st ack block will be 0.
2697        {"Unable to read first ack block length.",
2698         {kVarInt62TwoBytes + 0x12, 0x33}}
2699   };
2700   // clang-format on
2701 
2702   PacketFragments& fragments =
2703       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2704                                                             : packet;
2705   std::unique_ptr<QuicEncryptedPacket> encrypted(
2706       AssemblePacketFromFragments(fragments));
2707   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2708 
2709   EXPECT_THAT(framer_.error(), IsQuicNoError());
2710   ASSERT_TRUE(visitor_.header_.get());
2711   EXPECT_TRUE(CheckDecryption(
2712       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2713       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2714 
2715   EXPECT_EQ(0u, visitor_.stream_frames_.size());
2716   ASSERT_EQ(1u, visitor_.ack_frames_.size());
2717   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
2718   EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
2719   ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
2720 
2721   CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
2722 }
2723 
2724 // This test checks that the ack frame processor correctly identifies
2725 // and handles the case where the first ack block is larger than the
2726 // largest_acked packet.
TEST_P(QuicFramerTest,FirstAckFrameUnderflow)2727 TEST_P(QuicFramerTest, FirstAckFrameUnderflow) {
2728   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2729   // clang-format off
2730   PacketFragments packet = {
2731       // type (short header, 4 byte packet number)
2732       {"",
2733        {0x43}},
2734       // connection_id
2735       {"",
2736        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2737       // packet number
2738       {"",
2739        {0x12, 0x34, 0x56, 0x78}},
2740       // frame type (ack frame)
2741       // (one ack block, 2 byte largest observed, 2 byte block length)
2742       {"",
2743        {0x45}},
2744       // largest acked
2745       {"Unable to read largest acked.",
2746        {0x12, 0x34}},
2747       // Zero delta time.
2748       {"Unable to read ack delay time.",
2749        {0x00, 0x00}},
2750       // first ack block length.
2751       {"Unable to read first ack block length.",
2752        {0x88, 0x88}},
2753       // num timestamps.
2754       {"Underflow with first ack block length 34952 largest acked is 4660.",
2755        {0x00}}
2756   };
2757 
2758   PacketFragments packet_ietf = {
2759       // type (short header, 4 byte packet number)
2760       {"",
2761        {0x43}},
2762       // connection_id
2763       {"",
2764        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2765       // packet number
2766       {"",
2767        {0x12, 0x34, 0x56, 0x78}},
2768        // frame type (IETF_ACK)
2769        {"",
2770         {0x02}},
2771        // largest acked
2772        {"Unable to read largest acked.",
2773         {kVarInt62TwoBytes  + 0x12, 0x34}},
2774        // Zero delta time.
2775        {"Unable to read ack delay time.",
2776         {kVarInt62OneByte + 0x00}},
2777        // Ack block count (0 -- no blocks after the first)
2778        {"Unable to read ack block count.",
2779         {kVarInt62OneByte + 0x00}},
2780        // first ack block length.
2781        {"Unable to read first ack block length.",
2782         {kVarInt62TwoBytes + 0x28, 0x88}}
2783   };
2784   // clang-format on
2785 
2786   PacketFragments& fragments =
2787       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2788                                                             : packet;
2789   std::unique_ptr<QuicEncryptedPacket> encrypted(
2790       AssemblePacketFromFragments(fragments));
2791   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
2792   CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
2793 }
2794 
2795 // This test checks that the ack frame processor correctly identifies
2796 // and handles the case where the third ack block's gap is larger than the
2797 // available space in the ack range.
TEST_P(QuicFramerTest,ThirdAckBlockUnderflowGap)2798 TEST_P(QuicFramerTest, ThirdAckBlockUnderflowGap) {
2799   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2800     // Test originally written for development of IETF QUIC. The test may
2801     // also apply to Google QUIC. If so, the test should be extended to
2802     // include Google QUIC (frame formats, etc). See b/141858819.
2803     return;
2804   }
2805   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2806   // clang-format off
2807   PacketFragments packet_ietf = {
2808       // type (short header, 4 byte packet number)
2809       {"",
2810        {0x43}},
2811       // connection_id
2812       {"",
2813        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2814       // packet number
2815       {"",
2816        {0x12, 0x34, 0x56, 0x78}},
2817        // frame type (IETF_ACK frame)
2818        {"",
2819         {0x02}},
2820        // largest acked
2821        {"Unable to read largest acked.",
2822         {kVarInt62OneByte  + 63}},
2823        // Zero delta time.
2824        {"Unable to read ack delay time.",
2825         {kVarInt62OneByte + 0x00}},
2826        // Ack block count (2 -- 2 blocks after the first)
2827        {"Unable to read ack block count.",
2828         {kVarInt62OneByte + 0x02}},
2829        // first ack block length.
2830        {"Unable to read first ack block length.",
2831         {kVarInt62OneByte + 13}},  // Ack 14 packets, range 50..63 (inclusive)
2832 
2833        {"Unable to read gap block value.",
2834         {kVarInt62OneByte + 9}},  // Gap 10 packets, 40..49 (inclusive)
2835        {"Unable to read ack block value.",
2836         {kVarInt62OneByte + 9}},  // Ack 10 packets, 30..39 (inclusive)
2837        {"Unable to read gap block value.",
2838         {kVarInt62OneByte + 29}},  // A gap of 30 packets (0..29 inclusive)
2839                                    // should be too big, leaving no room
2840                                    // for the ack.
2841        {"Underflow with gap block length 30 previous ack block start is 30.",
2842         {kVarInt62OneByte + 10}},  // Don't care
2843   };
2844   // clang-format on
2845 
2846   std::unique_ptr<QuicEncryptedPacket> encrypted(
2847       AssemblePacketFromFragments(packet_ietf));
2848   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
2849   EXPECT_EQ(
2850       framer_.detailed_error(),
2851       "Underflow with gap block length 30 previous ack block start is 30.");
2852   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
2853 }
2854 
2855 // This test checks that the ack frame processor correctly identifies
2856 // and handles the case where the third ack block's length is larger than the
2857 // available space in the ack range.
TEST_P(QuicFramerTest,ThirdAckBlockUnderflowAck)2858 TEST_P(QuicFramerTest, ThirdAckBlockUnderflowAck) {
2859   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2860     // Test originally written for development of IETF QUIC. The test may
2861     // also apply to Google QUIC. If so, the test should be extended to
2862     // include Google QUIC (frame formats, etc). See b/141858819.
2863     return;
2864   }
2865   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2866   // clang-format off
2867   PacketFragments packet_ietf = {
2868       // type (short header, 4 byte packet number)
2869       {"",
2870        {0x43}},
2871       // connection_id
2872       {"",
2873        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2874       // packet number
2875       {"",
2876        {0x12, 0x34, 0x56, 0x78}},
2877        // frame type (IETF_ACK frame)
2878        {"",
2879         {0x02}},
2880        // largest acked
2881        {"Unable to read largest acked.",
2882         {kVarInt62OneByte  + 63}},
2883        // Zero delta time.
2884        {"Unable to read ack delay time.",
2885         {kVarInt62OneByte + 0x00}},
2886        // Ack block count (2 -- 2 blocks after the first)
2887        {"Unable to read ack block count.",
2888         {kVarInt62OneByte + 0x02}},
2889        // first ack block length.
2890        {"Unable to read first ack block length.",
2891         {kVarInt62OneByte + 13}},  // only 50 packet numbers "left"
2892 
2893        {"Unable to read gap block value.",
2894         {kVarInt62OneByte + 10}},  // Only 40 packet numbers left
2895        {"Unable to read ack block value.",
2896         {kVarInt62OneByte + 10}},  // only 30 packet numbers left.
2897        {"Unable to read gap block value.",
2898         {kVarInt62OneByte + 1}},  // Gap is OK, 29 packet numbers left
2899       {"Unable to read ack block value.",
2900         {kVarInt62OneByte + 30}},  // Use up all 30, should be an error
2901   };
2902   // clang-format on
2903 
2904   std::unique_ptr<QuicEncryptedPacket> encrypted(
2905       AssemblePacketFromFragments(packet_ietf));
2906   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
2907   EXPECT_EQ(framer_.detailed_error(),
2908             "Underflow with ack block length 31 latest ack block end is 25.");
2909   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
2910 }
2911 
2912 // Tests a variety of ack block wrap scenarios. For example, if the
2913 // N-1th block causes packet 0 to be acked, then a gap would wrap
2914 // around to 0x3fffffff ffffffff... Make sure we detect this
2915 // condition.
TEST_P(QuicFramerTest,AckBlockUnderflowGapWrap)2916 TEST_P(QuicFramerTest, AckBlockUnderflowGapWrap) {
2917   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2918     // Test originally written for development of IETF QUIC. The test may
2919     // also apply to Google QUIC. If so, the test should be extended to
2920     // include Google QUIC (frame formats, etc). See b/141858819.
2921     return;
2922   }
2923   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2924   // clang-format off
2925   PacketFragments packet_ietf = {
2926       // type (short header, 4 byte packet number)
2927       {"",
2928        {0x43}},
2929       // connection_id
2930       {"",
2931        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2932       // packet number
2933       {"",
2934        {0x12, 0x34, 0x56, 0x78}},
2935        // frame type (IETF_ACK frame)
2936        {"",
2937         {0x02}},
2938        // largest acked
2939        {"Unable to read largest acked.",
2940         {kVarInt62OneByte  + 10}},
2941        // Zero delta time.
2942        {"Unable to read ack delay time.",
2943         {kVarInt62OneByte + 0x00}},
2944        // Ack block count (1 -- 1 blocks after the first)
2945        {"Unable to read ack block count.",
2946         {kVarInt62OneByte + 1}},
2947        // first ack block length.
2948        {"Unable to read first ack block length.",
2949         {kVarInt62OneByte + 9}},  // Ack packets 1..10 (inclusive)
2950 
2951        {"Unable to read gap block value.",
2952         {kVarInt62OneByte + 1}},  // Gap of 2 packets (-1...0), should wrap
2953        {"Underflow with gap block length 2 previous ack block start is 1.",
2954         {kVarInt62OneByte + 9}},  // irrelevant
2955   };
2956   // clang-format on
2957 
2958   std::unique_ptr<QuicEncryptedPacket> encrypted(
2959       AssemblePacketFromFragments(packet_ietf));
2960   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
2961   EXPECT_EQ(framer_.detailed_error(),
2962             "Underflow with gap block length 2 previous ack block start is 1.");
2963   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
2964 }
2965 
2966 // As AckBlockUnderflowGapWrap, but in this test, it's the ack
2967 // component of the ack-block that causes the wrap, not the gap.
TEST_P(QuicFramerTest,AckBlockUnderflowAckWrap)2968 TEST_P(QuicFramerTest, AckBlockUnderflowAckWrap) {
2969   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2970     // Test originally written for development of IETF QUIC. The test may
2971     // also apply to Google QUIC. If so, the test should be extended to
2972     // include Google QUIC (frame formats, etc). See b/141858819.
2973     return;
2974   }
2975   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2976   // clang-format off
2977   PacketFragments packet_ietf = {
2978       // type (short header, 4 byte packet number)
2979       {"",
2980        {0x43}},
2981       // connection_id
2982       {"",
2983        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2984       // packet number
2985       {"",
2986        {0x12, 0x34, 0x56, 0x78}},
2987        // frame type (IETF_ACK frame)
2988        {"",
2989         {0x02}},
2990        // largest acked
2991        {"Unable to read largest acked.",
2992         {kVarInt62OneByte  + 10}},
2993        // Zero delta time.
2994        {"Unable to read ack delay time.",
2995         {kVarInt62OneByte + 0x00}},
2996        // Ack block count (1 -- 1 blocks after the first)
2997        {"Unable to read ack block count.",
2998         {kVarInt62OneByte + 1}},
2999        // first ack block length.
3000        {"Unable to read first ack block length.",
3001         {kVarInt62OneByte + 6}},  // Ack packets 4..10 (inclusive)
3002 
3003        {"Unable to read gap block value.",
3004         {kVarInt62OneByte + 1}},  // Gap of 2 packets (2..3)
3005        {"Unable to read ack block value.",
3006         {kVarInt62OneByte + 9}},  // Should wrap.
3007   };
3008   // clang-format on
3009 
3010   std::unique_ptr<QuicEncryptedPacket> encrypted(
3011       AssemblePacketFromFragments(packet_ietf));
3012   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3013   EXPECT_EQ(framer_.detailed_error(),
3014             "Underflow with ack block length 10 latest ack block end is 1.");
3015   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
3016 }
3017 
3018 // An ack block that acks the entire range, 1...0x3fffffffffffffff
TEST_P(QuicFramerTest,AckBlockAcksEverything)3019 TEST_P(QuicFramerTest, AckBlockAcksEverything) {
3020   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3021     // Test originally written for development of IETF QUIC. The test may
3022     // also apply to Google QUIC. If so, the test should be extended to
3023     // include Google QUIC (frame formats, etc). See b/141858819.
3024     return;
3025   }
3026   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3027   // clang-format off
3028   PacketFragments packet_ietf = {
3029       // type (short header, 4 byte packet number)
3030       {"",
3031        {0x43}},
3032       // connection_id
3033       {"",
3034        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3035       // packet number
3036       {"",
3037        {0x12, 0x34, 0x56, 0x78}},
3038        // frame type (IETF_ACK frame)
3039        {"",
3040         {0x02}},
3041        // largest acked
3042        {"Unable to read largest acked.",
3043         {kVarInt62EightBytes  + 0x3f, 0xff, 0xff, 0xff,
3044          0xff, 0xff, 0xff, 0xff}},
3045        // Zero delta time.
3046        {"Unable to read ack delay time.",
3047         {kVarInt62OneByte + 0x00}},
3048        // Ack block count No additional blocks
3049        {"Unable to read ack block count.",
3050         {kVarInt62OneByte + 0}},
3051        // first ack block length.
3052        {"Unable to read first ack block length.",
3053         {kVarInt62EightBytes  + 0x3f, 0xff, 0xff, 0xff,
3054          0xff, 0xff, 0xff, 0xfe}},
3055   };
3056   // clang-format on
3057 
3058   std::unique_ptr<QuicEncryptedPacket> encrypted(
3059       AssemblePacketFromFragments(packet_ietf));
3060   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3061   EXPECT_EQ(1u, visitor_.ack_frames_.size());
3062   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3063   EXPECT_EQ(1u, frame.packets.NumIntervals());
3064   EXPECT_EQ(kLargestIetfLargestObserved, LargestAcked(frame));
3065   EXPECT_EQ(kLargestIetfLargestObserved.ToUint64(),
3066             frame.packets.NumPacketsSlow());
3067 }
3068 
3069 // This test looks for a malformed ack where
3070 //  - There is a largest-acked value (that is, the frame is acking
3071 //    something,
3072 //  - But the length of the first ack block is 0 saying that no frames
3073 //    are being acked with the largest-acked value or there are no
3074 //    additional ack blocks.
3075 //
TEST_P(QuicFramerTest,AckFrameFirstAckBlockLengthZero)3076 TEST_P(QuicFramerTest, AckFrameFirstAckBlockLengthZero) {
3077   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3078     // Not applicable to version 99 -- first ack block contains the
3079     // number of packets that preceed the largest_acked packet.
3080     // A value of 0 means no packets preceed --- that the block's
3081     // length is 1. Therefore the condition that this test checks can
3082     // not arise.
3083     return;
3084   }
3085   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3086 
3087   // clang-format off
3088   PacketFragments packet = {
3089       // type (short header, 4 byte packet number)
3090       {"",
3091        { 0x43 }},
3092       // connection_id
3093       {"",
3094        { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3095       // packet number
3096       {"",
3097        { 0x12, 0x34, 0x56, 0x78 }},
3098 
3099       // frame type (ack frame)
3100       // (more than one ack block, 2 byte largest observed, 2 byte block length)
3101       {"",
3102        { 0x65 }},
3103       // largest acked
3104       {"Unable to read largest acked.",
3105        { 0x12, 0x34 }},
3106       // Zero delta time.
3107       {"Unable to read ack delay time.",
3108        { 0x00, 0x00 }},
3109       // num ack blocks ranges.
3110       {"Unable to read num of ack blocks.",
3111        { 0x01 }},
3112       // first ack block length.
3113       {"Unable to read first ack block length.",
3114        { 0x00, 0x00 }},
3115       // gap to next block.
3116       { "First block length is zero.",
3117         { 0x01 }},
3118       // ack block length.
3119       { "First block length is zero.",
3120         { 0x0e, 0xaf }},
3121       // Number of timestamps.
3122       { "First block length is zero.",
3123         { 0x00 }},
3124   };
3125 
3126   // clang-format on
3127   std::unique_ptr<QuicEncryptedPacket> encrypted(
3128       AssemblePacketFromFragments(packet));
3129 
3130   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3131   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_ACK_DATA));
3132 
3133   ASSERT_TRUE(visitor_.header_.get());
3134   EXPECT_TRUE(CheckDecryption(
3135       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3136       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3137 
3138   EXPECT_EQ(0u, visitor_.stream_frames_.size());
3139   ASSERT_EQ(1u, visitor_.ack_frames_.size());
3140 
3141   CheckFramingBoundaries(packet, QUIC_INVALID_ACK_DATA);
3142 }
3143 
TEST_P(QuicFramerTest,AckFrameOneAckBlockMaxLength)3144 TEST_P(QuicFramerTest, AckFrameOneAckBlockMaxLength) {
3145   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3146   // clang-format off
3147   PacketFragments packet = {
3148       // type (short header, 4 byte packet number)
3149       {"",
3150        {0x43}},
3151       // connection_id
3152       {"",
3153        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3154       // packet number
3155       {"",
3156        {0x56, 0x78, 0x9A, 0xBC}},
3157       // frame type (ack frame)
3158       // (one ack block, 4 byte largest observed, 2 byte block length)
3159       {"",
3160        {0x49}},
3161       // largest acked
3162       {"Unable to read largest acked.",
3163        {0x12, 0x34, 0x56, 0x78}},
3164       // Zero delta time.
3165       {"Unable to read ack delay time.",
3166        {0x00, 0x00}},
3167       // first ack block length.
3168       {"Unable to read first ack block length.",
3169        {0x12, 0x34}},
3170       // num timestamps.
3171       {"Unable to read num received packets.",
3172        {0x00}}
3173   };
3174 
3175   PacketFragments packet_ietf = {
3176       // type (short header, 4 byte packet number)
3177       {"",
3178        {0x43}},
3179       // connection_id
3180       {"",
3181        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3182       // packet number
3183       {"",
3184        {0x56, 0x78, 0x9A, 0xBC}},
3185        // frame type (IETF_ACK frame)
3186        {"",
3187         {0x02}},
3188        // largest acked
3189        {"Unable to read largest acked.",
3190         {kVarInt62FourBytes  + 0x12, 0x34, 0x56, 0x78}},
3191        // Zero delta time.
3192        {"Unable to read ack delay time.",
3193         {kVarInt62OneByte + 0x00}},
3194        // Number of ack blocks after first
3195        {"Unable to read ack block count.",
3196         {kVarInt62OneByte + 0x00}},
3197        // first ack block length.
3198        {"Unable to read first ack block length.",
3199         {kVarInt62TwoBytes  + 0x12, 0x33}}
3200   };
3201   // clang-format on
3202 
3203   PacketFragments& fragments =
3204       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
3205                                                             : packet;
3206   std::unique_ptr<QuicEncryptedPacket> encrypted(
3207       AssemblePacketFromFragments(fragments));
3208   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3209 
3210   EXPECT_THAT(framer_.error(), IsQuicNoError());
3211   ASSERT_TRUE(visitor_.header_.get());
3212   EXPECT_TRUE(CheckDecryption(
3213       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3214       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3215 
3216   EXPECT_EQ(0u, visitor_.stream_frames_.size());
3217   ASSERT_EQ(1u, visitor_.ack_frames_.size());
3218   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3219   EXPECT_EQ(kPacketNumber, LargestAcked(frame));
3220   ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
3221 
3222   CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3223 }
3224 
3225 // Tests ability to handle multiple ackblocks after the first ack
3226 // block. Non-version-99 tests include multiple timestamps as well.
TEST_P(QuicFramerTest,AckFrameTwoTimeStampsMultipleAckBlocks)3227 TEST_P(QuicFramerTest, AckFrameTwoTimeStampsMultipleAckBlocks) {
3228   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3229   // clang-format off
3230   PacketFragments packet = {
3231       // type (short header, 4 byte packet number)
3232       {"",
3233        { 0x43 }},
3234       // connection_id
3235       {"",
3236        { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3237       // packet number
3238       {"",
3239        { 0x12, 0x34, 0x56, 0x78 }},
3240 
3241       // frame type (ack frame)
3242       // (more than one ack block, 2 byte largest observed, 2 byte block length)
3243       {"",
3244        { 0x65 }},
3245       // largest acked
3246       {"Unable to read largest acked.",
3247        { 0x12, 0x34 }},
3248       // Zero delta time.
3249       {"Unable to read ack delay time.",
3250        { 0x00, 0x00 }},
3251       // num ack blocks ranges.
3252       {"Unable to read num of ack blocks.",
3253        { 0x04 }},
3254       // first ack block length.
3255       {"Unable to read first ack block length.",
3256        { 0x00, 0x01 }},
3257       // gap to next block.
3258       { "Unable to read gap to next ack block.",
3259         { 0x01 }},
3260       // ack block length.
3261       { "Unable to ack block length.",
3262         { 0x0e, 0xaf }},
3263       // gap to next block.
3264       { "Unable to read gap to next ack block.",
3265         { 0xff }},
3266       // ack block length.
3267       { "Unable to ack block length.",
3268         { 0x00, 0x00 }},
3269       // gap to next block.
3270       { "Unable to read gap to next ack block.",
3271         { 0x91 }},
3272       // ack block length.
3273       { "Unable to ack block length.",
3274         { 0x01, 0xea }},
3275       // gap to next block.
3276       { "Unable to read gap to next ack block.",
3277         { 0x05 }},
3278       // ack block length.
3279       { "Unable to ack block length.",
3280         { 0x00, 0x04 }},
3281       // Number of timestamps.
3282       { "Unable to read num received packets.",
3283         { 0x02 }},
3284       // Delta from largest observed.
3285       { "Unable to read sequence delta in received packets.",
3286         { 0x01 }},
3287       // Delta time.
3288       { "Unable to read time delta in received packets.",
3289         { 0x76, 0x54, 0x32, 0x10 }},
3290       // Delta from largest observed.
3291       { "Unable to read sequence delta in received packets.",
3292         { 0x02 }},
3293       // Delta time.
3294       { "Unable to read incremental time delta in received packets.",
3295         { 0x32, 0x10 }},
3296   };
3297 
3298   PacketFragments packet_ietf = {
3299       // type (short header, 4 byte packet number)
3300       {"",
3301        { 0x43 }},
3302       // connection_id
3303       {"",
3304        { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3305       // packet number
3306       {"",
3307        { 0x12, 0x34, 0x56, 0x78 }},
3308 
3309       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3310       {"",
3311        { 0x22 }},
3312        // largest acked
3313        {"Unable to read largest acked.",
3314         { kVarInt62TwoBytes + 0x12, 0x34 }},   // = 4660
3315        // Zero delta time.
3316        {"Unable to read ack delay time.",
3317         { kVarInt62OneByte + 0x00 }},
3318        // number of additional ack blocks
3319        {"Unable to read ack block count.",
3320         { kVarInt62OneByte + 0x03 }},
3321        // first ack block length.
3322        {"Unable to read first ack block length.",
3323         { kVarInt62OneByte + 0x00 }},  // 1st block length = 1
3324 
3325        // Additional ACK Block #1
3326        // gap to next block.
3327        { "Unable to read gap block value.",
3328          { kVarInt62OneByte + 0x00 }},   // gap of 1 packet
3329        // ack block length.
3330        { "Unable to read ack block value.",
3331          { kVarInt62TwoBytes + 0x0e, 0xae }},   // 3759
3332 
3333        // pre-version-99 test includes an ack block of 0 length. this
3334        // can not happen in version 99. ergo the second block is not
3335        // present in the v99 test and the gap length of the next block
3336        // is the sum of the two gaps in the pre-version-99 tests.
3337        // Additional ACK Block #2
3338        // gap to next block.
3339        { "Unable to read gap block value.",
3340          { kVarInt62TwoBytes + 0x01, 0x8f }},  // Gap is 400 (0x190) pkts
3341        // ack block length.
3342        { "Unable to read ack block value.",
3343          { kVarInt62TwoBytes + 0x01, 0xe9 }},  // block is 389 (x1ea) pkts
3344 
3345        // Additional ACK Block #3
3346        // gap to next block.
3347        { "Unable to read gap block value.",
3348          { kVarInt62OneByte + 0x04 }},   // Gap is 5 packets.
3349        // ack block length.
3350        { "Unable to read ack block value.",
3351          { kVarInt62OneByte + 0x03 }},   // block is 3 packets.
3352 
3353        // Receive Timestamps.
3354        { "Unable to read receive timestamp range count.",
3355          { kVarInt62OneByte + 0x01 }},
3356        { "Unable to read receive timestamp gap.",
3357          { kVarInt62OneByte + 0x01 }},
3358        { "Unable to read receive timestamp count.",
3359          { kVarInt62OneByte + 0x02 }},
3360        { "Unable to read receive timestamp delta.",
3361          { kVarInt62FourBytes + 0x36, 0x54, 0x32, 0x10 }},
3362        { "Unable to read receive timestamp delta.",
3363          { kVarInt62TwoBytes + 0x32, 0x10 }},
3364   };
3365 
3366   // clang-format on
3367   PacketFragments& fragments =
3368       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
3369                                                             : packet;
3370 
3371   std::unique_ptr<QuicEncryptedPacket> encrypted(
3372       AssemblePacketFromFragments(fragments));
3373 
3374   framer_.set_process_timestamps(true);
3375   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3376 
3377   EXPECT_THAT(framer_.error(), IsQuicNoError());
3378   ASSERT_TRUE(visitor_.header_.get());
3379   EXPECT_TRUE(CheckDecryption(
3380       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3381       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3382 
3383   EXPECT_EQ(0u, visitor_.stream_frames_.size());
3384   ASSERT_EQ(1u, visitor_.ack_frames_.size());
3385   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3386   EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
3387   ASSERT_EQ(4254u, frame.packets.NumPacketsSlow());
3388   EXPECT_EQ(4u, frame.packets.NumIntervals());
3389   EXPECT_EQ(2u, frame.received_packet_times.size());
3390 }
3391 
TEST_P(QuicFramerTest,AckFrameMultipleReceiveTimestampRanges)3392 TEST_P(QuicFramerTest, AckFrameMultipleReceiveTimestampRanges) {
3393   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3394     return;
3395   }
3396   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3397   // clang-format off
3398   PacketFragments packet_ietf = {
3399       // type (short header, 4 byte packet number)
3400       {"",
3401        { 0x43 }},
3402       // connection_id
3403       {"",
3404        { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3405       // packet number
3406       {"",
3407        { 0x12, 0x34, 0x56, 0x78 }},
3408 
3409       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3410       {"",
3411        { 0x22 }},
3412        // largest acked
3413        {"Unable to read largest acked.",
3414         { kVarInt62TwoBytes + 0x12, 0x34 }},   // = 4660
3415        // Zero delta time.
3416        {"Unable to read ack delay time.",
3417         { kVarInt62OneByte + 0x00 }},
3418        // number of additional ack blocks
3419        {"Unable to read ack block count.",
3420         { kVarInt62OneByte + 0x00 }},
3421        // first ack block length.
3422        {"Unable to read first ack block length.",
3423         { kVarInt62OneByte + 0x00 }},  // 1st block length = 1
3424 
3425        // Receive Timestamps.
3426        { "Unable to read receive timestamp range count.",
3427          { kVarInt62OneByte + 0x03 }},
3428 
3429        // Timestamp range 1 (three packets).
3430        { "Unable to read receive timestamp gap.",
3431          { kVarInt62OneByte + 0x02 }},
3432        { "Unable to read receive timestamp count.",
3433          { kVarInt62OneByte + 0x03 }},
3434        { "Unable to read receive timestamp delta.",
3435          { kVarInt62FourBytes + 0x29, 0xff, 0xff, 0xff}},
3436        { "Unable to read receive timestamp delta.",
3437          { kVarInt62TwoBytes + 0x11, 0x11 }},
3438        { "Unable to read receive timestamp delta.",
3439          { kVarInt62OneByte + 0x01}},
3440 
3441        // Timestamp range 2 (one packet).
3442        { "Unable to read receive timestamp gap.",
3443          { kVarInt62OneByte + 0x05 }},
3444        { "Unable to read receive timestamp count.",
3445          { kVarInt62OneByte + 0x01 }},
3446        { "Unable to read receive timestamp delta.",
3447          { kVarInt62TwoBytes + 0x10, 0x00 }},
3448 
3449        // Timestamp range 3 (two packets).
3450        { "Unable to read receive timestamp gap.",
3451          { kVarInt62OneByte + 0x08 }},
3452        { "Unable to read receive timestamp count.",
3453          { kVarInt62OneByte + 0x02 }},
3454        { "Unable to read receive timestamp delta.",
3455          { kVarInt62OneByte + 0x10 }},
3456        { "Unable to read receive timestamp delta.",
3457          { kVarInt62TwoBytes + 0x01, 0x00 }},
3458   };
3459   // clang-format on
3460 
3461   std::unique_ptr<QuicEncryptedPacket> encrypted(
3462       AssemblePacketFromFragments(packet_ietf));
3463 
3464   framer_.set_process_timestamps(true);
3465   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3466   EXPECT_THAT(framer_.error(), IsQuicNoError());
3467   ASSERT_TRUE(visitor_.header_.get());
3468   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3469 
3470   EXPECT_THAT(frame.received_packet_times,
3471               ContainerEq(PacketTimeVector{
3472                   // Timestamp Range 1.
3473                   {LargestAcked(frame) - 2, CreationTimePlus(0x29ffffff)},
3474                   {LargestAcked(frame) - 3, CreationTimePlus(0x29ffeeee)},
3475                   {LargestAcked(frame) - 4, CreationTimePlus(0x29ffeeed)},
3476                   // Timestamp Range 2.
3477                   {LargestAcked(frame) - 11, CreationTimePlus(0x29ffdeed)},
3478                   // Timestamp Range 3.
3479                   {LargestAcked(frame) - 21, CreationTimePlus(0x29ffdedd)},
3480                   {LargestAcked(frame) - 22, CreationTimePlus(0x29ffdddd)},
3481               }));
3482 }
3483 
TEST_P(QuicFramerTest,AckFrameReceiveTimestampWithExponent)3484 TEST_P(QuicFramerTest, AckFrameReceiveTimestampWithExponent) {
3485   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3486     return;
3487   }
3488   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3489   // clang-format off
3490   PacketFragments packet_ietf = {
3491       // type (short header, 4 byte packet number)
3492       {"",
3493        { 0x43 }},
3494       // connection_id
3495       {"",
3496        { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3497       // packet number
3498       {"",
3499        { 0x12, 0x34, 0x56, 0x78 }},
3500 
3501       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3502       {"",
3503        { 0x22 }},
3504        // largest acked
3505        {"Unable to read largest acked.",
3506         { kVarInt62TwoBytes + 0x12, 0x34 }},   // = 4660
3507        // Zero delta time.
3508        {"Unable to read ack delay time.",
3509         { kVarInt62OneByte + 0x00 }},
3510        // number of additional ack blocks
3511        {"Unable to read ack block count.",
3512         { kVarInt62OneByte + 0x00 }},
3513        // first ack block length.
3514        {"Unable to read first ack block length.",
3515         { kVarInt62OneByte + 0x00 }},  // 1st block length = 1
3516 
3517        // Receive Timestamps.
3518        { "Unable to read receive timestamp range count.",
3519          { kVarInt62OneByte + 0x01 }},
3520        { "Unable to read receive timestamp gap.",
3521          { kVarInt62OneByte + 0x00 }},
3522        { "Unable to read receive timestamp count.",
3523          { kVarInt62OneByte + 0x03 }},
3524        { "Unable to read receive timestamp delta.",
3525          { kVarInt62TwoBytes + 0x29, 0xff}},
3526        { "Unable to read receive timestamp delta.",
3527          { kVarInt62TwoBytes + 0x11, 0x11 }},
3528        { "Unable to read receive timestamp delta.",
3529          { kVarInt62OneByte + 0x01}},
3530   };
3531   // clang-format on
3532 
3533   std::unique_ptr<QuicEncryptedPacket> encrypted(
3534       AssemblePacketFromFragments(packet_ietf));
3535 
3536   framer_.set_receive_timestamps_exponent(3);
3537   framer_.set_process_timestamps(true);
3538   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3539   EXPECT_THAT(framer_.error(), IsQuicNoError());
3540   ASSERT_TRUE(visitor_.header_.get());
3541   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3542 
3543   EXPECT_THAT(frame.received_packet_times,
3544               ContainerEq(PacketTimeVector{
3545                   // Timestamp Range 1.
3546                   {LargestAcked(frame), CreationTimePlus(0x29ff << 3)},
3547                   {LargestAcked(frame) - 1, CreationTimePlus(0x18ee << 3)},
3548                   {LargestAcked(frame) - 2, CreationTimePlus(0x18ed << 3)},
3549               }));
3550 }
3551 
TEST_P(QuicFramerTest,AckFrameReceiveTimestampGapTooHigh)3552 TEST_P(QuicFramerTest, AckFrameReceiveTimestampGapTooHigh) {
3553   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3554     return;
3555   }
3556   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3557   // clang-format off
3558   PacketFragments packet_ietf = {
3559       // type (short header, 4 byte packet number)
3560       {"",
3561        { 0x43 }},
3562       // connection_id
3563       {"",
3564        { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3565       // packet number
3566       {"",
3567        { 0x12, 0x34, 0x56, 0x78 }},
3568 
3569       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3570       {"",
3571        { 0x22 }},
3572        // largest acked
3573        {"Unable to read largest acked.",
3574         { kVarInt62TwoBytes + 0x12, 0x34 }},   // = 4660
3575        // Zero delta time.
3576        {"Unable to read ack delay time.",
3577         { kVarInt62OneByte + 0x00 }},
3578        // number of additional ack blocks
3579        {"Unable to read ack block count.",
3580         { kVarInt62OneByte + 0x00 }},
3581        // first ack block length.
3582        {"Unable to read first ack block length.",
3583         { kVarInt62OneByte + 0x00 }},  // 1st block length = 1
3584 
3585        // Receive Timestamps.
3586        { "Unable to read receive timestamp range count.",
3587          { kVarInt62OneByte + 0x01 }},
3588        { "Unable to read receive timestamp gap.",
3589          { kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x79 }},
3590        { "Unable to read receive timestamp count.",
3591          { kVarInt62OneByte + 0x01 }},
3592        { "Unable to read receive timestamp delta.",
3593          { kVarInt62TwoBytes + 0x29, 0xff}},
3594   };
3595   // clang-format on
3596 
3597   std::unique_ptr<QuicEncryptedPacket> encrypted(
3598       AssemblePacketFromFragments(packet_ietf));
3599 
3600   framer_.set_process_timestamps(true);
3601   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3602   EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3603                                "Receive timestamp gap too high."));
3604 }
3605 
TEST_P(QuicFramerTest,AckFrameReceiveTimestampCountTooHigh)3606 TEST_P(QuicFramerTest, AckFrameReceiveTimestampCountTooHigh) {
3607   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3608     return;
3609   }
3610   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3611   // clang-format off
3612   PacketFragments packet_ietf = {
3613       // type (short header, 4 byte packet number)
3614       {"",
3615        { 0x43 }},
3616       // connection_id
3617       {"",
3618        { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3619       // packet number
3620       {"",
3621        { 0x12, 0x34, 0x56, 0x78 }},
3622 
3623       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3624       {"",
3625        { 0x22 }},
3626        // largest acked
3627        {"Unable to read largest acked.",
3628         { kVarInt62TwoBytes + 0x12, 0x34 }},   // = 4660
3629        // Zero delta time.
3630        {"Unable to read ack delay time.",
3631         { kVarInt62OneByte + 0x00 }},
3632        // number of additional ack blocks
3633        {"Unable to read ack block count.",
3634         { kVarInt62OneByte + 0x00 }},
3635        // first ack block length.
3636        {"Unable to read first ack block length.",
3637         { kVarInt62OneByte + 0x00 }},  // 1st block length = 1
3638 
3639        // Receive Timestamps.
3640        { "Unable to read receive timestamp range count.",
3641          { kVarInt62OneByte + 0x01 }},
3642        { "Unable to read receive timestamp gap.",
3643          { kVarInt62OneByte + 0x02 }},
3644        { "Unable to read receive timestamp count.",
3645          { kVarInt62OneByte + 0x02 }},
3646        { "Unable to read receive timestamp delta.",
3647          { kVarInt62OneByte + 0x0a}},
3648        { "Unable to read receive timestamp delta.",
3649          { kVarInt62OneByte + 0x0b}},
3650   };
3651   // clang-format on
3652 
3653   std::unique_ptr<QuicEncryptedPacket> encrypted(
3654       AssemblePacketFromFragments(packet_ietf));
3655 
3656   framer_.set_process_timestamps(true);
3657   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3658   EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3659                                "Receive timestamp delta too high."));
3660 }
3661 
TEST_P(QuicFramerTest,AckFrameReceiveTimestampDeltaTooHigh)3662 TEST_P(QuicFramerTest, AckFrameReceiveTimestampDeltaTooHigh) {
3663   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3664     return;
3665   }
3666   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3667   // clang-format off
3668   PacketFragments packet_ietf = {
3669       // type (short header, 4 byte packet number)
3670       {"",
3671        { 0x43 }},
3672       // connection_id
3673       {"",
3674        { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3675       // packet number
3676       {"",
3677        { 0x12, 0x34, 0x56, 0x78 }},
3678 
3679       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3680       {"",
3681        { 0x22 }},
3682        // largest acked
3683        {"Unable to read largest acked.",
3684         { kVarInt62TwoBytes + 0x12, 0x34 }},   // = 4660
3685        // Zero delta time.
3686        {"Unable to read ack delay time.",
3687         { kVarInt62OneByte + 0x00 }},
3688        // number of additional ack blocks
3689        {"Unable to read ack block count.",
3690         { kVarInt62OneByte + 0x00 }},
3691        // first ack block length.
3692        {"Unable to read first ack block length.",
3693         { kVarInt62OneByte + 0x00 }},  // 1st block length = 1
3694 
3695        // Receive Timestamps.
3696        { "Unable to read receive timestamp range count.",
3697          { kVarInt62OneByte + 0x01 }},
3698        { "Unable to read receive timestamp gap.",
3699          { kVarInt62OneByte + 0x02 }},
3700        { "Unable to read receive timestamp count.",
3701          { kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77 }},
3702        { "Unable to read receive timestamp delta.",
3703          { kVarInt62TwoBytes + 0x29, 0xff}},
3704   };
3705   // clang-format on
3706 
3707   std::unique_ptr<QuicEncryptedPacket> encrypted(
3708       AssemblePacketFromFragments(packet_ietf));
3709 
3710   framer_.set_process_timestamps(true);
3711   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3712   EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3713                                "Receive timestamp count too high."));
3714 }
3715 
TEST_P(QuicFramerTest,AckFrameTimeStampDeltaTooHigh)3716 TEST_P(QuicFramerTest, AckFrameTimeStampDeltaTooHigh) {
3717   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3718   // clang-format off
3719   unsigned char packet[] = {
3720       // type (short header, 4 byte packet number)
3721       0x43,
3722       // connection_id
3723       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3724       // packet number
3725       0x12, 0x34, 0x56, 0x78,
3726 
3727       // frame type (ack frame)
3728       // (no ack blocks, 1 byte largest observed, 1 byte block length)
3729       0x40,
3730       // largest acked
3731       0x01,
3732       // Zero delta time.
3733       0x00, 0x00,
3734       // first ack block length.
3735       0x01,
3736       // num timestamps.
3737       0x01,
3738       // Delta from largest observed.
3739       0x01,
3740       // Delta time.
3741       0x10, 0x32, 0x54, 0x76,
3742   };
3743   // clang-format on
3744   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3745     // ACK Timestamp is not a feature of IETF QUIC.
3746     return;
3747   }
3748   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
3749   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
3750   EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3751                                "delta_from_largest_observed too high"));
3752 }
3753 
TEST_P(QuicFramerTest,AckFrameTimeStampSecondDeltaTooHigh)3754 TEST_P(QuicFramerTest, AckFrameTimeStampSecondDeltaTooHigh) {
3755   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3756   // clang-format off
3757   unsigned char packet[] = {
3758       // type (short header, 4 byte packet number)
3759       0x43,
3760       // connection_id
3761       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3762       // packet number
3763       0x12, 0x34, 0x56, 0x78,
3764 
3765       // frame type (ack frame)
3766       // (no ack blocks, 1 byte largest observed, 1 byte block length)
3767       0x40,
3768       // largest acked
3769       0x03,
3770       // Zero delta time.
3771       0x00, 0x00,
3772       // first ack block length.
3773       0x03,
3774       // num timestamps.
3775       0x02,
3776       // Delta from largest observed.
3777       0x01,
3778       // Delta time.
3779       0x10, 0x32, 0x54, 0x76,
3780       // Delta from largest observed.
3781       0x03,
3782       // Delta time.
3783       0x10, 0x32,
3784   };
3785   // clang-format on
3786   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3787     // ACK Timestamp is not a feature of IETF QUIC.
3788     return;
3789   }
3790   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
3791   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
3792   EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3793                                "delta_from_largest_observed too high"));
3794 }
3795 
TEST_P(QuicFramerTest,NewStopWaitingFrame)3796 TEST_P(QuicFramerTest, NewStopWaitingFrame) {
3797   if (VersionHasIetfQuicFrames(version_.transport_version)) {
3798     // The Stop Waiting frame is not in IETF QUIC
3799     return;
3800   }
3801   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3802   // clang-format off
3803   PacketFragments packet = {
3804       // type (short header, 4 byte packet number)
3805       {"",
3806        {0x43}},
3807       // connection_id
3808       {"",
3809        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3810       // packet number
3811       {"",
3812        {0x12, 0x34, 0x56, 0x78}},
3813       // frame type (stop waiting frame)
3814       {"",
3815        {0x06}},
3816       // least packet number awaiting an ack, delta from packet number.
3817       {"Unable to read least unacked delta.",
3818         {0x00, 0x00, 0x00, 0x08}}
3819   };
3820   // clang-format on
3821 
3822   std::unique_ptr<QuicEncryptedPacket> encrypted(
3823       AssemblePacketFromFragments(packet));
3824 
3825   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3826   EXPECT_THAT(framer_.error(), IsQuicNoError());
3827   ASSERT_TRUE(visitor_.header_.get());
3828   EXPECT_TRUE(CheckDecryption(
3829       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3830       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3831 
3832   EXPECT_EQ(0u, visitor_.stream_frames_.size());
3833   ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size());
3834   const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0];
3835   EXPECT_EQ(kLeastUnacked, frame.least_unacked);
3836 
3837   CheckFramingBoundaries(packet, QUIC_INVALID_STOP_WAITING_DATA);
3838 }
3839 
TEST_P(QuicFramerTest,InvalidNewStopWaitingFrame)3840 TEST_P(QuicFramerTest, InvalidNewStopWaitingFrame) {
3841   // The Stop Waiting frame is not in IETF QUIC
3842   if (VersionHasIetfQuicFrames(version_.transport_version)) {
3843     return;
3844   }
3845   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3846   // clang-format off
3847   unsigned char packet[] = {
3848     // type (short header, 4 byte packet number)
3849     0x43,
3850     // connection_id
3851     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3852     // packet number
3853     0x12, 0x34, 0x56, 0x78,
3854     // frame type (stop waiting frame)
3855     0x06,
3856     // least packet number awaiting an ack, delta from packet number.
3857     0x57, 0x78, 0x9A, 0xA8,
3858   };
3859   // clang-format on
3860 
3861   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
3862   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
3863   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_STOP_WAITING_DATA));
3864   EXPECT_EQ("Invalid unacked delta.", framer_.detailed_error());
3865 }
3866 
TEST_P(QuicFramerTest,RstStreamFrame)3867 TEST_P(QuicFramerTest, RstStreamFrame) {
3868   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3869   // clang-format off
3870   PacketFragments packet = {
3871       // type (short header, 4 byte packet number)
3872       {"",
3873        {0x43}},
3874       // connection_id
3875       {"",
3876        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3877       // packet number
3878       {"",
3879        {0x12, 0x34, 0x56, 0x78}},
3880       // frame type (rst stream frame)
3881       {"",
3882        {0x01}},
3883       // stream id
3884       {"Unable to read stream_id.",
3885        {0x01, 0x02, 0x03, 0x04}},
3886       // sent byte offset
3887       {"Unable to read rst stream sent byte offset.",
3888        {0x3A, 0x98, 0xFE, 0xDC,
3889         0x32, 0x10, 0x76, 0x54}},
3890       // error code QUIC_STREAM_CANCELLED
3891       {"Unable to read rst stream error code.",
3892        {0x00, 0x00, 0x00, 0x06}}
3893   };
3894 
3895   PacketFragments packet_ietf = {
3896       // type (short header, 4 byte packet number)
3897       {"",
3898        {0x43}},
3899       // connection_id
3900       {"",
3901        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3902       // packet number
3903       {"",
3904        {0x12, 0x34, 0x56, 0x78}},
3905       // frame type (IETF_RST_STREAM frame)
3906       {"",
3907        {0x04}},
3908       // stream id
3909       {"Unable to read IETF_RST_STREAM frame stream id/count.",
3910        {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
3911       // application error code H3_REQUEST_CANCELLED gets translated to
3912       // QuicRstStreamErrorCode::QUIC_STREAM_CANCELLED.
3913       {"Unable to read rst stream error code.",
3914        {kVarInt62TwoBytes + 0x01, 0x0c}},
3915       // Final Offset
3916       {"Unable to read rst stream sent byte offset.",
3917        {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}}
3918   };
3919   // clang-format on
3920 
3921   PacketFragments& fragments =
3922       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
3923                                                             : packet;
3924   std::unique_ptr<QuicEncryptedPacket> encrypted(
3925       AssemblePacketFromFragments(fragments));
3926   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3927 
3928   EXPECT_THAT(framer_.error(), IsQuicNoError());
3929   ASSERT_TRUE(visitor_.header_.get());
3930   EXPECT_TRUE(CheckDecryption(
3931       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3932       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3933 
3934   EXPECT_EQ(kStreamId, visitor_.rst_stream_frame_.stream_id);
3935   EXPECT_EQ(QUIC_STREAM_CANCELLED, visitor_.rst_stream_frame_.error_code);
3936   EXPECT_EQ(kStreamOffset, visitor_.rst_stream_frame_.byte_offset);
3937   CheckFramingBoundaries(fragments, QUIC_INVALID_RST_STREAM_DATA);
3938 }
3939 
TEST_P(QuicFramerTest,ConnectionCloseFrame)3940 TEST_P(QuicFramerTest, ConnectionCloseFrame) {
3941   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3942   // clang-format off
3943   PacketFragments packet = {
3944       // type (short header, 4 byte packet number)
3945       {"",
3946        {0x43}},
3947       // connection_id
3948       {"",
3949        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3950       // packet number
3951       {"",
3952        {0x12, 0x34, 0x56, 0x78}},
3953       // frame type (connection close frame)
3954       {"",
3955        {0x02}},
3956       // error code
3957       {"Unable to read connection close error code.",
3958        {0x00, 0x00, 0x00, 0x11}},
3959       {"Unable to read connection close error details.",
3960        {
3961          // error details length
3962          0x0, 0x0d,
3963          // error details
3964          'b',  'e',  'c',  'a',
3965          'u',  's',  'e',  ' ',
3966          'I',  ' ',  'c',  'a',
3967          'n'}
3968       }
3969   };
3970 
3971   PacketFragments packet_ietf = {
3972       // type (short header, 4 byte packet number)
3973       {"",
3974        {0x43}},
3975       // connection_id
3976       {"",
3977        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3978       // packet number
3979       {"",
3980        {0x12, 0x34, 0x56, 0x78}},
3981       // frame type (IETF Transport CONNECTION_CLOSE frame)
3982       {"",
3983        {0x1c}},
3984       // error code
3985       {"Unable to read connection close error code.",
3986        {kVarInt62TwoBytes + 0x00, 0x11}},
3987       {"Unable to read connection close frame type.",
3988        {kVarInt62TwoBytes + 0x12, 0x34 }},
3989       {"Unable to read connection close error details.",
3990        {
3991          // error details length
3992          kVarInt62OneByte + 0x11,
3993          // error details with QuicErrorCode serialized
3994          '1',  '1',  '5',  ':',
3995          'b',  'e',  'c',  'a',
3996          'u',  's',  'e',  ' ',
3997          'I',  ' ',  'c',  'a',
3998          'n'}
3999       }
4000   };
4001   // clang-format on
4002 
4003   PacketFragments& fragments =
4004       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
4005                                                             : packet;
4006   std::unique_ptr<QuicEncryptedPacket> encrypted(
4007       AssemblePacketFromFragments(fragments));
4008   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4009 
4010   EXPECT_THAT(framer_.error(), IsQuicNoError());
4011   ASSERT_TRUE(visitor_.header_.get());
4012   EXPECT_TRUE(CheckDecryption(
4013       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4014       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4015 
4016   EXPECT_EQ(0u, visitor_.stream_frames_.size());
4017   EXPECT_EQ(0x11u, static_cast<unsigned>(
4018                        visitor_.connection_close_frame_.wire_error_code));
4019   EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4020   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4021     EXPECT_EQ(0x1234u,
4022               visitor_.connection_close_frame_.transport_close_frame_type);
4023     EXPECT_EQ(115u, visitor_.connection_close_frame_.quic_error_code);
4024   } else {
4025     // For Google QUIC frame, |quic_error_code| and |wire_error_code| has the
4026     // same value.
4027     EXPECT_EQ(0x11u, static_cast<unsigned>(
4028                          visitor_.connection_close_frame_.quic_error_code));
4029   }
4030 
4031   ASSERT_EQ(0u, visitor_.ack_frames_.size());
4032 
4033   CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4034 }
4035 
TEST_P(QuicFramerTest,ConnectionCloseFrameWithUnknownErrorCode)4036 TEST_P(QuicFramerTest, ConnectionCloseFrameWithUnknownErrorCode) {
4037   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4038   // clang-format off
4039   PacketFragments packet = {
4040       // type (short header, 4 byte packet number)
4041       {"",
4042        {0x43}},
4043       // connection_id
4044       {"",
4045        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4046       // packet number
4047       {"",
4048        {0x12, 0x34, 0x56, 0x78}},
4049       // frame type (connection close frame)
4050       {"",
4051        {0x02}},
4052       // error code larger than QUIC_LAST_ERROR
4053       {"Unable to read connection close error code.",
4054        {0x00, 0x00, 0xC0, 0xDE}},
4055       {"Unable to read connection close error details.",
4056        {
4057          // error details length
4058          0x0, 0x0d,
4059          // error details
4060          'b',  'e',  'c',  'a',
4061          'u',  's',  'e',  ' ',
4062          'I',  ' ',  'c',  'a',
4063          'n'}
4064       }
4065   };
4066 
4067   PacketFragments packet_ietf = {
4068       // type (short header, 4 byte packet number)
4069       {"",
4070        {0x43}},
4071       // connection_id
4072       {"",
4073        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4074       // packet number
4075       {"",
4076        {0x12, 0x34, 0x56, 0x78}},
4077       // frame type (IETF Transport CONNECTION_CLOSE frame)
4078       {"",
4079        {0x1c}},
4080       // error code
4081       {"Unable to read connection close error code.",
4082        {kVarInt62FourBytes + 0x00, 0x00, 0xC0, 0xDE}},
4083       {"Unable to read connection close frame type.",
4084        {kVarInt62TwoBytes + 0x12, 0x34 }},
4085       {"Unable to read connection close error details.",
4086        {
4087          // error details length
4088          kVarInt62OneByte + 0x11,
4089          // error details with QuicErrorCode larger than QUIC_LAST_ERROR
4090          '8',  '4',  '9',  ':',
4091          'b',  'e',  'c',  'a',
4092          'u',  's',  'e',  ' ',
4093          'I',  ' ',  'c',  'a',
4094          'n'}
4095       }
4096   };
4097   // clang-format on
4098 
4099   PacketFragments& fragments =
4100       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
4101                                                             : packet;
4102   std::unique_ptr<QuicEncryptedPacket> encrypted(
4103       AssemblePacketFromFragments(fragments));
4104   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4105 
4106   EXPECT_THAT(framer_.error(), IsQuicNoError());
4107   ASSERT_TRUE(visitor_.header_.get());
4108   EXPECT_TRUE(CheckDecryption(
4109       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4110       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4111 
4112   EXPECT_EQ(0u, visitor_.stream_frames_.size());
4113   EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4114   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4115     EXPECT_EQ(0x1234u,
4116               visitor_.connection_close_frame_.transport_close_frame_type);
4117     EXPECT_EQ(0xC0DEu, visitor_.connection_close_frame_.wire_error_code);
4118     EXPECT_EQ(849u, visitor_.connection_close_frame_.quic_error_code);
4119   } else {
4120     // For Google QUIC frame, |quic_error_code| and |wire_error_code| has the
4121     // same value.
4122     EXPECT_EQ(0xC0DEu, visitor_.connection_close_frame_.wire_error_code);
4123     EXPECT_EQ(0xC0DEu, visitor_.connection_close_frame_.quic_error_code);
4124   }
4125 
4126   ASSERT_EQ(0u, visitor_.ack_frames_.size());
4127 
4128   CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4129 }
4130 
4131 // As above, but checks that for Google-QUIC, if there happens
4132 // to be an ErrorCode string at the start of the details, it is
4133 // NOT extracted/parsed/folded/spindled/and/mutilated.
TEST_P(QuicFramerTest,ConnectionCloseFrameWithExtractedInfoIgnoreGCuic)4134 TEST_P(QuicFramerTest, ConnectionCloseFrameWithExtractedInfoIgnoreGCuic) {
4135   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4136 
4137   // clang-format off
4138   PacketFragments packet = {
4139     // type (short header, 4 byte packet number)
4140     {"",
4141      {0x43}},
4142     // connection_id
4143     {"",
4144      {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4145     // packet number
4146     {"",
4147      {0x12, 0x34, 0x56, 0x78}},
4148     // frame type (connection close frame)
4149     {"",
4150      {0x02}},
4151     // error code
4152     {"Unable to read connection close error code.",
4153      {0x00, 0x00, 0x00, 0x11}},
4154     {"Unable to read connection close error details.",
4155      {
4156        // error details length
4157        0x0, 0x13,
4158        // error details
4159       '1',  '7',  '7',  '6',
4160       '7',  ':',  'b',  'e',
4161       'c',  'a',  'u',  's',
4162       'e',  ' ',  'I',  ' ',
4163       'c',  'a',  'n'}
4164     }
4165   };
4166 
4167   PacketFragments packet_ietf = {
4168     // type (short header, 4 byte packet number)
4169     {"",
4170      {0x43}},
4171     // connection_id
4172     {"",
4173      {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4174     // packet number
4175     {"",
4176      {0x12, 0x34, 0x56, 0x78}},
4177     // frame type (IETF Transport CONNECTION_CLOSE frame)
4178     {"",
4179      {0x1c}},
4180     // error code
4181     {"Unable to read connection close error code.",
4182      {kVarInt62OneByte + 0x11}},
4183     {"Unable to read connection close frame type.",
4184      {kVarInt62TwoBytes + 0x12, 0x34 }},
4185     {"Unable to read connection close error details.",
4186      {
4187        // error details length
4188        kVarInt62OneByte + 0x13,
4189        // error details
4190       '1',  '7',  '7',  '6',
4191       '7',  ':',  'b',  'e',
4192       'c',  'a',  'u',  's',
4193       'e',  ' ',  'I',  ' ',
4194       'c',  'a',  'n'}
4195     }
4196   };
4197   // clang-format on
4198 
4199   PacketFragments& fragments =
4200       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
4201                                                             : packet;
4202   std::unique_ptr<QuicEncryptedPacket> encrypted(
4203       AssemblePacketFromFragments(fragments));
4204   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4205 
4206   EXPECT_THAT(framer_.error(), IsQuicNoError());
4207   ASSERT_TRUE(visitor_.header_.get());
4208   EXPECT_TRUE(CheckDecryption(
4209       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4210       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4211 
4212   EXPECT_EQ(0u, visitor_.stream_frames_.size());
4213   EXPECT_EQ(0x11u, static_cast<unsigned>(
4214                        visitor_.connection_close_frame_.wire_error_code));
4215 
4216   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4217     EXPECT_EQ(0x1234u,
4218               visitor_.connection_close_frame_.transport_close_frame_type);
4219     EXPECT_EQ(17767u, visitor_.connection_close_frame_.quic_error_code);
4220     EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4221   } else {
4222     EXPECT_EQ(0x11u, visitor_.connection_close_frame_.quic_error_code);
4223     // Error code is not prepended in GQUIC, so it is not removed and should
4224     // remain in the reason phrase.
4225     EXPECT_EQ("17767:because I can",
4226               visitor_.connection_close_frame_.error_details);
4227   }
4228 
4229   ASSERT_EQ(0u, visitor_.ack_frames_.size());
4230 
4231   CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4232 }
4233 
4234 // Test the CONNECTION_CLOSE/Application variant.
TEST_P(QuicFramerTest,ApplicationCloseFrame)4235 TEST_P(QuicFramerTest, ApplicationCloseFrame) {
4236   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4237     // This frame is only in IETF QUIC.
4238     return;
4239   }
4240   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4241 
4242   // clang-format off
4243   PacketFragments packet_ietf = {
4244       // type (short header, 4 byte packet number)
4245       {"",
4246        {0x43}},
4247       // connection_id
4248       {"",
4249        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4250       // packet number
4251       {"",
4252        {0x12, 0x34, 0x56, 0x78}},
4253       // frame type (IETF_CONNECTION_CLOSE/Application frame)
4254       {"",
4255        {0x1d}},
4256       // error code
4257       {"Unable to read connection close error code.",
4258        {kVarInt62TwoBytes + 0x00, 0x11}},
4259       {"Unable to read connection close error details.",
4260        {
4261          // error details length
4262          kVarInt62OneByte + 0x0d,
4263          // error details
4264          'b',  'e',  'c',  'a',
4265          'u',  's',  'e',  ' ',
4266          'I',  ' ',  'c',  'a',
4267          'n'}
4268       }
4269   };
4270   // clang-format on
4271 
4272   std::unique_ptr<QuicEncryptedPacket> encrypted(
4273       AssemblePacketFromFragments(packet_ietf));
4274   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4275 
4276   EXPECT_THAT(framer_.error(), IsQuicNoError());
4277   ASSERT_TRUE(visitor_.header_.get());
4278   EXPECT_TRUE(CheckDecryption(
4279       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4280       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4281 
4282   EXPECT_EQ(0u, visitor_.stream_frames_.size());
4283 
4284   EXPECT_EQ(IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
4285             visitor_.connection_close_frame_.close_type);
4286   EXPECT_EQ(122u, visitor_.connection_close_frame_.quic_error_code);
4287   EXPECT_EQ(0x11u, visitor_.connection_close_frame_.wire_error_code);
4288   EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4289 
4290   ASSERT_EQ(0u, visitor_.ack_frames_.size());
4291 
4292   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4293 }
4294 
4295 // Check that we can extract an error code from an application close.
TEST_P(QuicFramerTest,ApplicationCloseFrameExtract)4296 TEST_P(QuicFramerTest, ApplicationCloseFrameExtract) {
4297   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4298     // This frame is only in IETF QUIC.
4299     return;
4300   }
4301   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4302 
4303   // clang-format off
4304   PacketFragments packet_ietf = {
4305       // type (short header, 4 byte packet number)
4306       {"",
4307        {0x43}},
4308       // connection_id
4309       {"",
4310        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4311       // packet number
4312       {"",
4313        {0x12, 0x34, 0x56, 0x78}},
4314       // frame type (IETF_CONNECTION_CLOSE/Application frame)
4315       {"",
4316        {0x1d}},
4317       // error code
4318       {"Unable to read connection close error code.",
4319        {kVarInt62OneByte + 0x11}},
4320       {"Unable to read connection close error details.",
4321        {
4322        // error details length
4323        kVarInt62OneByte + 0x13,
4324        // error details
4325        '1',  '7',  '7',  '6',
4326        '7',  ':',  'b',  'e',
4327        'c',  'a',  'u',  's',
4328        'e',  ' ',  'I',  ' ',
4329        'c',  'a',  'n'}
4330       }
4331   };
4332   // clang-format on
4333 
4334   std::unique_ptr<QuicEncryptedPacket> encrypted(
4335       AssemblePacketFromFragments(packet_ietf));
4336   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4337 
4338   EXPECT_THAT(framer_.error(), IsQuicNoError());
4339   ASSERT_TRUE(visitor_.header_.get());
4340   EXPECT_TRUE(CheckDecryption(
4341       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4342       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4343 
4344   EXPECT_EQ(0u, visitor_.stream_frames_.size());
4345 
4346   EXPECT_EQ(IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
4347             visitor_.connection_close_frame_.close_type);
4348   EXPECT_EQ(17767u, visitor_.connection_close_frame_.quic_error_code);
4349   EXPECT_EQ(0x11u, visitor_.connection_close_frame_.wire_error_code);
4350   EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4351 
4352   ASSERT_EQ(0u, visitor_.ack_frames_.size());
4353 
4354   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4355 }
4356 
TEST_P(QuicFramerTest,GoAwayFrame)4357 TEST_P(QuicFramerTest, GoAwayFrame) {
4358   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4359     // This frame is not in IETF QUIC.
4360     return;
4361   }
4362   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4363   // clang-format off
4364   PacketFragments packet = {
4365       // type (short header, 4 byte packet number)
4366       {"",
4367        {0x43}},
4368       // connection_id
4369       {"",
4370        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4371       // packet number
4372       {"",
4373        {0x12, 0x34, 0x56, 0x78}},
4374       // frame type (go away frame)
4375       {"",
4376        {0x03}},
4377       // error code
4378       {"Unable to read go away error code.",
4379        {0x00, 0x00, 0x00, 0x09}},
4380       // stream id
4381       {"Unable to read last good stream id.",
4382        {0x01, 0x02, 0x03, 0x04}},
4383       // stream id
4384       {"Unable to read goaway reason.",
4385        {
4386          // error details length
4387          0x0, 0x0d,
4388          // error details
4389          'b',  'e',  'c',  'a',
4390          'u',  's',  'e',  ' ',
4391          'I',  ' ',  'c',  'a',
4392          'n'}
4393       }
4394   };
4395   // clang-format on
4396 
4397   std::unique_ptr<QuicEncryptedPacket> encrypted(
4398       AssemblePacketFromFragments(packet));
4399   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4400 
4401   EXPECT_THAT(framer_.error(), IsQuicNoError());
4402   ASSERT_TRUE(visitor_.header_.get());
4403   EXPECT_TRUE(CheckDecryption(
4404       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4405       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4406 
4407   EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id);
4408   EXPECT_EQ(0x9u, visitor_.goaway_frame_.error_code);
4409   EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase);
4410 
4411   CheckFramingBoundaries(packet, QUIC_INVALID_GOAWAY_DATA);
4412 }
4413 
TEST_P(QuicFramerTest,GoAwayFrameWithUnknownErrorCode)4414 TEST_P(QuicFramerTest, GoAwayFrameWithUnknownErrorCode) {
4415   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4416     // This frame is not in IETF QUIC.
4417     return;
4418   }
4419   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4420   // clang-format off
4421   PacketFragments packet = {
4422       // type (short header, 4 byte packet number)
4423       {"",
4424        {0x43}},
4425       // connection_id
4426       {"",
4427        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4428       // packet number
4429       {"",
4430        {0x12, 0x34, 0x56, 0x78}},
4431       // frame type (go away frame)
4432       {"",
4433        {0x03}},
4434       // error code larger than QUIC_LAST_ERROR
4435       {"Unable to read go away error code.",
4436        {0x00, 0x00, 0xC0, 0xDE}},
4437       // stream id
4438       {"Unable to read last good stream id.",
4439        {0x01, 0x02, 0x03, 0x04}},
4440       // stream id
4441       {"Unable to read goaway reason.",
4442        {
4443          // error details length
4444          0x0, 0x0d,
4445          // error details
4446          'b',  'e',  'c',  'a',
4447          'u',  's',  'e',  ' ',
4448          'I',  ' ',  'c',  'a',
4449          'n'}
4450       }
4451   };
4452   // clang-format on
4453 
4454   std::unique_ptr<QuicEncryptedPacket> encrypted(
4455       AssemblePacketFromFragments(packet));
4456   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4457 
4458   EXPECT_THAT(framer_.error(), IsQuicNoError());
4459   ASSERT_TRUE(visitor_.header_.get());
4460   EXPECT_TRUE(CheckDecryption(
4461       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4462       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4463 
4464   EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id);
4465   EXPECT_EQ(0xC0DE, visitor_.goaway_frame_.error_code);
4466   EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase);
4467 
4468   CheckFramingBoundaries(packet, QUIC_INVALID_GOAWAY_DATA);
4469 }
4470 
TEST_P(QuicFramerTest,WindowUpdateFrame)4471 TEST_P(QuicFramerTest, WindowUpdateFrame) {
4472   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4473     // This frame is not in IETF QUIC, see MaxDataFrame and MaxStreamDataFrame
4474     // for IETF QUIC equivalents.
4475     return;
4476   }
4477   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4478   // clang-format off
4479   PacketFragments packet = {
4480       // type (short header, 4 byte packet number)
4481       {"",
4482        {0x43}},
4483       // connection_id
4484       {"",
4485        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4486       // packet number
4487       {"",
4488        {0x12, 0x34, 0x56, 0x78}},
4489       // frame type (window update frame)
4490       {"",
4491        {0x04}},
4492       // stream id
4493       {"Unable to read stream_id.",
4494        {0x01, 0x02, 0x03, 0x04}},
4495       // byte offset
4496       {"Unable to read window byte_offset.",
4497        {0x3A, 0x98, 0xFE, 0xDC,
4498         0x32, 0x10, 0x76, 0x54}},
4499   };
4500 
4501   // clang-format on
4502 
4503   std::unique_ptr<QuicEncryptedPacket> encrypted(
4504       AssemblePacketFromFragments(packet));
4505   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4506 
4507   EXPECT_THAT(framer_.error(), IsQuicNoError());
4508   ASSERT_TRUE(visitor_.header_.get());
4509   EXPECT_TRUE(CheckDecryption(
4510       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4511       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4512 
4513   EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
4514   EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
4515 
4516   CheckFramingBoundaries(packet, QUIC_INVALID_WINDOW_UPDATE_DATA);
4517 }
4518 
TEST_P(QuicFramerTest,MaxDataFrame)4519 TEST_P(QuicFramerTest, MaxDataFrame) {
4520   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4521     // This frame is available only in IETF QUIC.
4522     return;
4523   }
4524   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4525   // clang-format off
4526   PacketFragments packet_ietf = {
4527       // type (short header, 4 byte packet number)
4528       {"",
4529        {0x43}},
4530       // connection_id
4531       {"",
4532        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4533       // packet number
4534       {"",
4535        {0x12, 0x34, 0x56, 0x78}},
4536       // frame type (IETF_MAX_DATA frame)
4537       {"",
4538        {0x10}},
4539       // byte offset
4540       {"Can not read MAX_DATA byte-offset",
4541        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
4542         0x32, 0x10, 0x76, 0x54}},
4543   };
4544   // clang-format on
4545 
4546   std::unique_ptr<QuicEncryptedPacket> encrypted(
4547       AssemblePacketFromFragments(packet_ietf));
4548   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4549 
4550   EXPECT_THAT(framer_.error(), IsQuicNoError());
4551   ASSERT_TRUE(visitor_.header_.get());
4552   EXPECT_TRUE(CheckDecryption(
4553       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4554       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4555 
4556   EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
4557             visitor_.window_update_frame_.stream_id);
4558   EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
4559 
4560   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_MAX_DATA_FRAME_DATA);
4561 }
4562 
TEST_P(QuicFramerTest,MaxStreamDataFrame)4563 TEST_P(QuicFramerTest, MaxStreamDataFrame) {
4564   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4565     // This frame available only in IETF QUIC.
4566     return;
4567   }
4568   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4569   // clang-format off
4570   PacketFragments packet_ietf = {
4571       // type (short header, 4 byte packet number)
4572       {"",
4573        {0x43}},
4574       // connection_id
4575       {"",
4576        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4577       // packet number
4578       {"",
4579        {0x12, 0x34, 0x56, 0x78}},
4580       // frame type (IETF_MAX_STREAM_DATA frame)
4581       {"",
4582        {0x11}},
4583       // stream id
4584       {"Unable to read IETF_MAX_STREAM_DATA frame stream id/count.",
4585        {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4586       // byte offset
4587       {"Can not read MAX_STREAM_DATA byte-count",
4588        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
4589         0x32, 0x10, 0x76, 0x54}},
4590   };
4591   // clang-format on
4592 
4593   std::unique_ptr<QuicEncryptedPacket> encrypted(
4594       AssemblePacketFromFragments(packet_ietf));
4595   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4596 
4597   EXPECT_THAT(framer_.error(), IsQuicNoError());
4598   ASSERT_TRUE(visitor_.header_.get());
4599   EXPECT_TRUE(CheckDecryption(
4600       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4601       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4602 
4603   EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
4604   EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
4605 
4606   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA);
4607 }
4608 
TEST_P(QuicFramerTest,BlockedFrame)4609 TEST_P(QuicFramerTest, BlockedFrame) {
4610   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4611   // clang-format off
4612   PacketFragments packet = {
4613       // type (short header, 4 byte packet number)
4614       {"",
4615        {0x43}},
4616       // connection_id
4617       {"",
4618        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4619       // packet number
4620       {"",
4621        {0x12, 0x34, 0x56, 0x78}},
4622       // frame type (blocked frame)
4623       {"",
4624        {0x05}},
4625       // stream id
4626       {"Unable to read stream_id.",
4627        {0x01, 0x02, 0x03, 0x04}},
4628   };
4629 
4630   PacketFragments packet_ietf = {
4631       // type (short header, 4 byte packet number)
4632       {"",
4633        {0x43}},
4634       // connection_id
4635       {"",
4636        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4637       // packet number
4638       {"",
4639        {0x12, 0x34, 0x56, 0x78}},
4640       // frame type (IETF_STREAM_BLOCKED frame)
4641       {"",
4642        {0x15}},
4643       // stream id
4644       {"Unable to read IETF_STREAM_DATA_BLOCKED frame stream id/count.",
4645        {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4646       // Offset
4647       {"Can not read stream blocked offset.",
4648        {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
4649   };
4650   // clang-format on
4651 
4652   PacketFragments& fragments =
4653       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
4654                                                             : packet;
4655   std::unique_ptr<QuicEncryptedPacket> encrypted(
4656       AssemblePacketFromFragments(fragments));
4657   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4658 
4659   EXPECT_THAT(framer_.error(), IsQuicNoError());
4660   ASSERT_TRUE(visitor_.header_.get());
4661   EXPECT_TRUE(CheckDecryption(
4662       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4663       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4664 
4665   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4666     EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
4667   } else {
4668     EXPECT_EQ(0u, visitor_.blocked_frame_.offset);
4669   }
4670   EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
4671 
4672   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4673     CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_BLOCKED_DATA);
4674   } else {
4675     CheckFramingBoundaries(fragments, QUIC_INVALID_BLOCKED_DATA);
4676   }
4677 }
4678 
TEST_P(QuicFramerTest,PingFrame)4679 TEST_P(QuicFramerTest, PingFrame) {
4680   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4681   // clang-format off
4682   unsigned char packet[] = {
4683      // type (short header, 4 byte packet number)
4684      0x43,
4685      // connection_id
4686      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4687      // packet number
4688      0x12, 0x34, 0x56, 0x78,
4689 
4690      // frame type
4691      0x07,
4692     };
4693 
4694   unsigned char packet_ietf[] = {
4695      // type (short header, 4 byte packet number)
4696      0x43,
4697      // connection_id
4698      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4699      // packet number
4700      0x12, 0x34, 0x56, 0x78,
4701 
4702      // frame type (IETF_PING frame)
4703      0x01,
4704     };
4705   // clang-format on
4706 
4707   QuicEncryptedPacket encrypted(
4708       AsChars(VersionHasIetfQuicFrames(framer_.transport_version())
4709                   ? packet_ietf
4710                   : packet),
4711       VersionHasIetfQuicFrames(framer_.transport_version())
4712           ? ABSL_ARRAYSIZE(packet_ietf)
4713           : ABSL_ARRAYSIZE(packet),
4714       false);
4715   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4716 
4717   EXPECT_THAT(framer_.error(), IsQuicNoError());
4718   ASSERT_TRUE(visitor_.header_.get());
4719   EXPECT_TRUE(CheckDecryption(
4720       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4721       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4722 
4723   EXPECT_EQ(1u, visitor_.ping_frames_.size());
4724 
4725   // No need to check the PING frame boundaries because it has no payload.
4726 }
4727 
TEST_P(QuicFramerTest,HandshakeDoneFrame)4728 TEST_P(QuicFramerTest, HandshakeDoneFrame) {
4729   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4730   // clang-format off
4731   unsigned char packet[] = {
4732      // type (short header, 4 byte packet number)
4733      0x43,
4734      // connection_id
4735      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4736      // packet number
4737      0x12, 0x34, 0x56, 0x78,
4738 
4739      // frame type (Handshake done frame)
4740      0x1e,
4741     };
4742   // clang-format on
4743 
4744   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4745     return;
4746   }
4747 
4748   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
4749   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4750 
4751   EXPECT_THAT(framer_.error(), IsQuicNoError());
4752   ASSERT_TRUE(visitor_.header_.get());
4753   EXPECT_TRUE(CheckDecryption(
4754       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4755       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4756 
4757   EXPECT_EQ(1u, visitor_.handshake_done_frames_.size());
4758 }
4759 
TEST_P(QuicFramerTest,ParseAckFrequencyFrame)4760 TEST_P(QuicFramerTest, ParseAckFrequencyFrame) {
4761   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4762   // clang-format off
4763   unsigned char packet[] = {
4764      // type (short header, 4 byte packet number)
4765      0x43,
4766      // connection_id
4767      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4768      // packet number
4769      0x12, 0x34, 0x56, 0x78,
4770 
4771      // ack frequency frame type (which needs two bytes as it is > 0x3F)
4772      0x40, 0xAF,
4773      // sequence_number
4774      0x11,
4775      // packet_tolerance
4776      0x02,
4777      // max_ack_delay_us = 2'5000 us
4778      0x80, 0x00, 0x61, 0xA8,
4779      // ignore_order
4780      0x01
4781   };
4782   // clang-format on
4783 
4784   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4785     return;
4786   }
4787 
4788   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
4789   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4790 
4791   EXPECT_THAT(framer_.error(), IsQuicNoError());
4792   ASSERT_TRUE(visitor_.header_.get());
4793   EXPECT_TRUE(CheckDecryption(
4794       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4795       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4796 
4797   ASSERT_EQ(1u, visitor_.ack_frequency_frames_.size());
4798   const auto& frame = visitor_.ack_frequency_frames_.front();
4799   EXPECT_EQ(17u, frame->sequence_number);
4800   EXPECT_EQ(2u, frame->packet_tolerance);
4801   EXPECT_EQ(2'5000u, frame->max_ack_delay.ToMicroseconds());
4802   EXPECT_EQ(true, frame->ignore_order);
4803 }
4804 
TEST_P(QuicFramerTest,ParseResetStreamAtFrame)4805 TEST_P(QuicFramerTest, ParseResetStreamAtFrame) {
4806   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4807   // clang-format off
4808   unsigned char packet[] = {
4809       // type (short header, 4 byte packet number)
4810       0x43,
4811       // connection_id
4812       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4813       // packet number
4814       0x12, 0x34, 0x56, 0x78,
4815 
4816       // type = RESET_STREAM_AT
4817       0x24,
4818       // stream ID
4819       0x00,
4820       // application error code
4821       0x1e,
4822       // final size
4823       0x20,
4824       // reliable size
4825       0x10,
4826   };
4827   // clang-format on
4828 
4829   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4830     return;
4831   }
4832   framer_.set_process_reset_stream_at(true);
4833 
4834   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
4835   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4836 
4837   EXPECT_THAT(framer_.error(), IsQuicNoError());
4838   ASSERT_TRUE(visitor_.header_.get());
4839   EXPECT_TRUE(CheckDecryption(
4840       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4841       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4842 
4843   ASSERT_EQ(visitor_.reset_stream_at_frames_.size(), 1);
4844   const QuicResetStreamAtFrame& frame = *visitor_.reset_stream_at_frames_[0];
4845   EXPECT_EQ(frame.stream_id, 0x00);
4846   EXPECT_EQ(frame.error, 0x1e);
4847   EXPECT_EQ(frame.final_offset, 0x20);
4848   EXPECT_EQ(frame.reliable_offset, 0x10);
4849 }
4850 
TEST_P(QuicFramerTest,ParseInvalidResetStreamAtFrame)4851 TEST_P(QuicFramerTest, ParseInvalidResetStreamAtFrame) {
4852   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4853   // clang-format off
4854   unsigned char packet[] = {
4855       // type (short header, 4 byte packet number)
4856       0x43,
4857       // connection_id
4858       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4859       // packet number
4860       0x12, 0x34, 0x56, 0x78,
4861 
4862       // type = RESET_STREAM_AT
4863       0x24,
4864       // stream ID
4865       0x00,
4866       // application error code
4867       0x1e,
4868       // final size
4869       0x20,
4870       // reliable size
4871       0x30,
4872   };
4873   // clang-format on
4874 
4875   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4876     return;
4877   }
4878   framer_.set_process_reset_stream_at(true);
4879 
4880   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
4881   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
4882   EXPECT_EQ(framer_.error(), QUIC_INVALID_FRAME_DATA);
4883   EXPECT_EQ(visitor_.reset_stream_at_frames_.size(), 0);
4884 }
4885 
TEST_P(QuicFramerTest,MessageFrame)4886 TEST_P(QuicFramerTest, MessageFrame) {
4887   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4888   // clang-format off
4889   PacketFragments packet = {
4890        // type (short header, 4 byte packet number)
4891        {"",
4892         {0x43}},
4893        // connection_id
4894        {"",
4895         {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4896        // packet number
4897        {"",
4898         {0x12, 0x34, 0x56, 0x78}},
4899        // message frame type.
4900        {"",
4901         { 0x21 }},
4902        // message length
4903        {"Unable to read message length",
4904         {0x07}},
4905        // message data
4906        {"Unable to read message data",
4907         {'m', 'e', 's', 's', 'a', 'g', 'e'}},
4908         // message frame no length.
4909         {"",
4910          { 0x20 }},
4911         // message data
4912         {{},
4913          {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
4914    };
4915   PacketFragments packet_ietf = {
4916        // type (short header, 4 byte packet number)
4917        {"",
4918         {0x43}},
4919        // connection_id
4920        {"",
4921         {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4922        // packet number
4923        {"",
4924         {0x12, 0x34, 0x56, 0x78}},
4925        // message frame type.
4926        {"",
4927         { 0x31 }},
4928        // message length
4929        {"Unable to read message length",
4930         {0x07}},
4931        // message data
4932        {"Unable to read message data",
4933         {'m', 'e', 's', 's', 'a', 'g', 'e'}},
4934         // message frame no length.
4935         {"",
4936          { 0x30 }},
4937         // message data
4938         {{},
4939          {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
4940    };
4941   // clang-format on
4942 
4943   std::unique_ptr<QuicEncryptedPacket> encrypted;
4944   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4945     encrypted = AssemblePacketFromFragments(packet_ietf);
4946   } else {
4947     encrypted = AssemblePacketFromFragments(packet);
4948   }
4949   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4950 
4951   EXPECT_THAT(framer_.error(), IsQuicNoError());
4952   ASSERT_TRUE(visitor_.header_.get());
4953   EXPECT_TRUE(CheckDecryption(
4954       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4955       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4956 
4957   ASSERT_EQ(2u, visitor_.message_frames_.size());
4958   EXPECT_EQ(7u, visitor_.message_frames_[0]->message_length);
4959   EXPECT_EQ(8u, visitor_.message_frames_[1]->message_length);
4960 
4961   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4962     CheckFramingBoundaries(packet_ietf, QUIC_INVALID_MESSAGE_DATA);
4963   } else {
4964     CheckFramingBoundaries(packet, QUIC_INVALID_MESSAGE_DATA);
4965   }
4966 }
4967 
TEST_P(QuicFramerTest,IetfStatelessResetPacket)4968 TEST_P(QuicFramerTest, IetfStatelessResetPacket) {
4969   // clang-format off
4970   unsigned char packet[] = {
4971       // type (short packet, 1 byte packet number)
4972       0x50,
4973       // Random bytes
4974       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4975       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4976       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4977       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4978       // stateless reset token
4979       0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
4980       0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
4981   };
4982   // clang-format on
4983   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
4984   QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
4985                                                       TestConnectionId(0x33));
4986   decrypter_ = new test::TestDecrypter();
4987   if (framer_.version().KnowsWhichDecrypterToUse()) {
4988     framer_.InstallDecrypter(
4989         ENCRYPTION_INITIAL,
4990         std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
4991     framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
4992                              std::unique_ptr<QuicDecrypter>(decrypter_));
4993   } else {
4994     framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
4995                                                  Perspective::IS_CLIENT));
4996     framer_.SetAlternativeDecrypter(
4997         ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
4998   }
4999   // This packet cannot be decrypted because diversification nonce is missing.
5000   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
5001   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5002   ASSERT_THAT(framer_.error(), IsQuicNoError());
5003   ASSERT_TRUE(visitor_.stateless_reset_packet_.get());
5004   EXPECT_EQ(kTestStatelessResetToken,
5005             visitor_.stateless_reset_packet_->stateless_reset_token);
5006 }
5007 
TEST_P(QuicFramerTest,IetfStatelessResetPacketInvalidStatelessResetToken)5008 TEST_P(QuicFramerTest, IetfStatelessResetPacketInvalidStatelessResetToken) {
5009   // clang-format off
5010   unsigned char packet[] = {
5011       // type (short packet, 1 byte packet number)
5012       0x50,
5013       // Random bytes
5014       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5015       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5016       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5017       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5018       // stateless reset token
5019       0xB6, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
5020       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5021   };
5022   // clang-format on
5023   QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
5024                                                       TestConnectionId(0x33));
5025   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5026   decrypter_ = new test::TestDecrypter();
5027   if (framer_.version().KnowsWhichDecrypterToUse()) {
5028     framer_.InstallDecrypter(
5029         ENCRYPTION_INITIAL,
5030         std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
5031     framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
5032                              std::unique_ptr<QuicDecrypter>(decrypter_));
5033   } else {
5034     framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
5035                                                  Perspective::IS_CLIENT));
5036     framer_.SetAlternativeDecrypter(
5037         ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
5038   }
5039   // This packet cannot be decrypted because diversification nonce is missing.
5040   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
5041   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5042   EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
5043   ASSERT_FALSE(visitor_.stateless_reset_packet_);
5044 }
5045 
TEST_P(QuicFramerTest,VersionNegotiationPacketClient)5046 TEST_P(QuicFramerTest, VersionNegotiationPacketClient) {
5047   // clang-format off
5048   PacketFragments packet = {
5049       // type (long header)
5050       {"",
5051        {0x8F}},
5052       // version tag
5053       {"",
5054        {0x00, 0x00, 0x00, 0x00}},
5055       {"",
5056        {0x05}},
5057       // connection_id
5058       {"",
5059        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5060       // Supported versions
5061       {"Unable to read supported version in negotiation.",
5062        {QUIC_VERSION_BYTES,
5063         'Q', '2', '.', '0'}},
5064   };
5065 
5066   PacketFragments packet49 = {
5067       // type (long header)
5068       {"",
5069        {0x8F}},
5070       // version tag
5071       {"",
5072        {0x00, 0x00, 0x00, 0x00}},
5073       {"",
5074        {0x08}},
5075       // connection_id
5076       {"",
5077        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5078       {"",
5079        {0x00}},
5080       // Supported versions
5081       {"Unable to read supported version in negotiation.",
5082        {QUIC_VERSION_BYTES,
5083         'Q', '2', '.', '0'}},
5084   };
5085   // clang-format on
5086 
5087   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5088 
5089   PacketFragments& fragments =
5090       framer_.version().HasLongHeaderLengths() ? packet49 : packet;
5091   std::unique_ptr<QuicEncryptedPacket> encrypted(
5092       AssemblePacketFromFragments(fragments));
5093   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5094   ASSERT_THAT(framer_.error(), IsQuicNoError());
5095   ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
5096   EXPECT_EQ(1u, visitor_.version_negotiation_packet_->versions.size());
5097   EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]);
5098 
5099   // Remove the last version from the packet so that every truncated
5100   // version of the packet is invalid, otherwise checking boundaries
5101   // is annoyingly complicated.
5102   for (size_t i = 0; i < 4; ++i) {
5103     fragments.back().fragment.pop_back();
5104   }
5105   CheckFramingBoundaries(fragments, QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
5106 }
5107 
TEST_P(QuicFramerTest,VersionNegotiationPacketServer)5108 TEST_P(QuicFramerTest, VersionNegotiationPacketServer) {
5109   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
5110   // clang-format off
5111   unsigned char packet[] = {
5112       // public flags (long header with all ignored bits set)
5113       0xFF,
5114       // version
5115       0x00, 0x00, 0x00, 0x00,
5116       // connection ID lengths
5117       0x50,
5118       // destination connection ID
5119       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5120       // supported versions
5121       QUIC_VERSION_BYTES,
5122       'Q', '2', '.', '0',
5123   };
5124   unsigned char packet2[] = {
5125       // public flags (long header with all ignored bits set)
5126       0xFF,
5127       // version
5128       0x00, 0x00, 0x00, 0x00,
5129       // destination connection ID length
5130       0x08,
5131       // destination connection ID
5132       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5133       // source connection ID length
5134       0x00,
5135       // supported versions
5136       QUIC_VERSION_BYTES,
5137       'Q', '2', '.', '0',
5138   };
5139   // clang-format on
5140   unsigned char* p = packet;
5141   size_t p_length = ABSL_ARRAYSIZE(packet);
5142   if (framer_.version().HasLengthPrefixedConnectionIds()) {
5143     p = packet2;
5144     p_length = ABSL_ARRAYSIZE(packet2);
5145   }
5146 
5147   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
5148   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5149   EXPECT_THAT(framer_.error(),
5150               IsError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET));
5151   EXPECT_EQ("Server received version negotiation packet.",
5152             framer_.detailed_error());
5153   EXPECT_FALSE(visitor_.version_negotiation_packet_.get());
5154 }
5155 
TEST_P(QuicFramerTest,ParseIetfRetryPacket)5156 TEST_P(QuicFramerTest, ParseIetfRetryPacket) {
5157   if (!framer_.version().SupportsRetry()) {
5158     return;
5159   }
5160   // IETF RETRY is only sent from client to server.
5161   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5162   // clang-format off
5163   unsigned char packet[] = {
5164       // public flags (long header with packet type RETRY and ODCIL=8)
5165       0xF5,
5166       // version
5167       QUIC_VERSION_BYTES,
5168       // connection ID lengths
5169       0x05,
5170       // source connection ID
5171       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5172       // original destination connection ID
5173       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5174       // retry token
5175       'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5176       ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5177   };
5178   unsigned char packet49[] = {
5179       // public flags (long header with packet type RETRY)
5180       0xF0,
5181       // version
5182       QUIC_VERSION_BYTES,
5183       // destination connection ID length
5184       0x00,
5185       // source connection ID length
5186       0x08,
5187       // source connection ID
5188       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5189       // original destination connection ID length
5190       0x08,
5191       // original destination connection ID
5192       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5193       // retry token
5194       'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5195       ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5196   };
5197   unsigned char packet_with_tag[] = {
5198       // public flags (long header with packet type RETRY)
5199       0xF0,
5200       // version
5201       QUIC_VERSION_BYTES,
5202       // destination connection ID length
5203       0x00,
5204       // source connection ID length
5205       0x08,
5206       // source connection ID
5207       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5208       // retry token
5209       'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5210       ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5211       // retry token integrity tag
5212       0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
5213       0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
5214   };
5215   // clang-format on
5216 
5217   unsigned char* p = packet;
5218   size_t p_length = ABSL_ARRAYSIZE(packet);
5219   if (framer_.version().UsesTls()) {
5220     ReviseFirstByteByVersion(packet_with_tag);
5221     p = packet_with_tag;
5222     p_length = ABSL_ARRAYSIZE(packet_with_tag);
5223   } else if (framer_.version().HasLongHeaderLengths()) {
5224     p = packet49;
5225     p_length = ABSL_ARRAYSIZE(packet49);
5226   }
5227   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
5228   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5229 
5230   EXPECT_THAT(framer_.error(), IsQuicNoError());
5231   ASSERT_TRUE(visitor_.header_.get());
5232 
5233   ASSERT_TRUE(visitor_.on_retry_packet_called_);
5234   ASSERT_TRUE(visitor_.retry_new_connection_id_.get());
5235   ASSERT_TRUE(visitor_.retry_token_.get());
5236 
5237   if (framer_.version().UsesTls()) {
5238     ASSERT_TRUE(visitor_.retry_token_integrity_tag_.get());
5239     static const unsigned char expected_integrity_tag[16] = {
5240         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
5241         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
5242     };
5243     quiche::test::CompareCharArraysWithHexError(
5244         "retry integrity tag", visitor_.retry_token_integrity_tag_->data(),
5245         visitor_.retry_token_integrity_tag_->length(),
5246         reinterpret_cast<const char*>(expected_integrity_tag),
5247         ABSL_ARRAYSIZE(expected_integrity_tag));
5248     ASSERT_TRUE(visitor_.retry_without_tag_.get());
5249     quiche::test::CompareCharArraysWithHexError(
5250         "retry without tag", visitor_.retry_without_tag_->data(),
5251         visitor_.retry_without_tag_->length(),
5252         reinterpret_cast<const char*>(packet_with_tag), 35);
5253   } else {
5254     ASSERT_TRUE(visitor_.retry_original_connection_id_.get());
5255     EXPECT_EQ(FramerTestConnectionId(),
5256               *visitor_.retry_original_connection_id_.get());
5257   }
5258 
5259   EXPECT_EQ(FramerTestConnectionIdPlusOne(),
5260             *visitor_.retry_new_connection_id_.get());
5261   EXPECT_EQ("Hello this is RETRY!", *visitor_.retry_token_.get());
5262 
5263   // IETF RETRY is only sent from client to server, the rest of this test
5264   // ensures that the server correctly drops them without acting on them.
5265   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
5266   // Reset our visitor state to default settings.
5267   visitor_.retry_original_connection_id_.reset();
5268   visitor_.retry_new_connection_id_.reset();
5269   visitor_.retry_token_.reset();
5270   visitor_.retry_token_integrity_tag_.reset();
5271   visitor_.retry_without_tag_.reset();
5272   visitor_.on_retry_packet_called_ = false;
5273 
5274   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5275 
5276   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
5277   EXPECT_EQ("Client-initiated RETRY is invalid.", framer_.detailed_error());
5278 
5279   EXPECT_FALSE(visitor_.on_retry_packet_called_);
5280   EXPECT_FALSE(visitor_.retry_new_connection_id_.get());
5281   EXPECT_FALSE(visitor_.retry_token_.get());
5282   EXPECT_FALSE(visitor_.retry_token_integrity_tag_.get());
5283   EXPECT_FALSE(visitor_.retry_without_tag_.get());
5284 }
5285 
TEST_P(QuicFramerTest,BuildPaddingFramePacket)5286 TEST_P(QuicFramerTest, BuildPaddingFramePacket) {
5287   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5288   QuicPacketHeader header;
5289   header.destination_connection_id = FramerTestConnectionId();
5290   header.reset_flag = false;
5291   header.version_flag = false;
5292   header.packet_number = kPacketNumber;
5293 
5294   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5295 
5296   // clang-format off
5297   unsigned char packet[kMaxOutgoingPacketSize] = {
5298     // type (short header, 4 byte packet number)
5299     0x43,
5300     // connection_id
5301     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5302     // packet number
5303     0x12, 0x34, 0x56, 0x78,
5304 
5305     // frame type (padding frame)
5306     0x00,
5307     0x00, 0x00, 0x00, 0x00
5308   };
5309 
5310   unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
5311     // type (short header, 4 byte packet number)
5312     0x43,
5313     // connection_id
5314     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5315     // packet number
5316     0x12, 0x34, 0x56, 0x78,
5317 
5318     // frame type (padding frame)
5319     0x00,
5320     0x00, 0x00, 0x00, 0x00
5321   };
5322   // clang-format on
5323 
5324   unsigned char* p = packet;
5325   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5326     p = packet_ietf;
5327   }
5328 
5329   uint64_t header_size = GetPacketHeaderSize(
5330       framer_.transport_version(), kPacket8ByteConnectionId,
5331       kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
5332       PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
5333       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
5334   memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
5335 
5336   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5337   ASSERT_TRUE(data != nullptr);
5338 
5339   quiche::test::CompareCharArraysWithHexError(
5340       "constructed packet", data->data(), data->length(), AsChars(p),
5341       ABSL_ARRAYSIZE(packet));
5342 }
5343 
TEST_P(QuicFramerTest,BuildStreamFramePacketWithNewPaddingFrame)5344 TEST_P(QuicFramerTest, BuildStreamFramePacketWithNewPaddingFrame) {
5345   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5346   QuicPacketHeader header;
5347   header.destination_connection_id = FramerTestConnectionId();
5348   header.reset_flag = false;
5349   header.version_flag = false;
5350   header.packet_number = kPacketNumber;
5351   QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
5352                                absl::string_view("hello world!"));
5353   QuicPaddingFrame padding_frame(2);
5354   QuicFrames frames = {QuicFrame(padding_frame), QuicFrame(stream_frame),
5355                        QuicFrame(padding_frame)};
5356 
5357   // clang-format off
5358   unsigned char packet[] = {
5359     // type (short header, 4 byte packet number)
5360     0x43,
5361     // connection_id
5362     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5363     // packet number
5364     0x12, 0x34, 0x56, 0x78,
5365 
5366     // paddings
5367     0x00, 0x00,
5368     // frame type (stream frame with fin)
5369     0xFF,
5370     // stream id
5371     0x01, 0x02, 0x03, 0x04,
5372     // offset
5373     0x3A, 0x98, 0xFE, 0xDC,
5374     0x32, 0x10, 0x76, 0x54,
5375     // data length
5376     0x00, 0x0c,
5377     // data
5378     'h',  'e',  'l',  'l',
5379     'o',  ' ',  'w',  'o',
5380     'r',  'l',  'd',  '!',
5381     // paddings
5382     0x00, 0x00,
5383   };
5384 
5385   unsigned char packet_ietf[] = {
5386     // type (short header, 4 byte packet number)
5387     0x43,
5388     // connection_id
5389     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5390     // packet number
5391     0x12, 0x34, 0x56, 0x78,
5392 
5393     // paddings
5394     0x00, 0x00,
5395     // frame type (IETF_STREAM with FIN, LEN, and OFFSET bits set)
5396     0x08 | 0x01 | 0x02 | 0x04,
5397     // stream id
5398     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
5399     // offset
5400     kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5401     0x32, 0x10, 0x76, 0x54,
5402     // data length
5403     kVarInt62OneByte + 0x0c,
5404     // data
5405     'h',  'e',  'l',  'l',
5406     'o',  ' ',  'w',  'o',
5407     'r',  'l',  'd',  '!',
5408     // paddings
5409     0x00, 0x00,
5410   };
5411   // clang-format on
5412 
5413   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5414   ASSERT_TRUE(data != nullptr);
5415 
5416   unsigned char* p = packet;
5417   size_t p_size = ABSL_ARRAYSIZE(packet);
5418   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5419     p = packet_ietf;
5420     p_size = ABSL_ARRAYSIZE(packet_ietf);
5421   }
5422   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
5423 
5424   quiche::test::CompareCharArraysWithHexError(
5425       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
5426 }
5427 
TEST_P(QuicFramerTest,Build4ByteSequenceNumberPaddingFramePacket)5428 TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) {
5429   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5430   QuicPacketHeader header;
5431   header.destination_connection_id = FramerTestConnectionId();
5432   header.reset_flag = false;
5433   header.version_flag = false;
5434   header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
5435   header.packet_number = kPacketNumber;
5436 
5437   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5438 
5439   // clang-format off
5440   unsigned char packet[kMaxOutgoingPacketSize] = {
5441     // type (short header, 4 byte packet number)
5442     0x43,
5443     // connection_id
5444     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5445     // packet number
5446     0x12, 0x34, 0x56, 0x78,
5447 
5448     // frame type (padding frame)
5449     0x00,
5450     0x00, 0x00, 0x00, 0x00
5451   };
5452 
5453   unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
5454     // type (short header, 4 byte packet number)
5455     0x43,
5456     // connection_id
5457     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5458     // packet number
5459     0x12, 0x34, 0x56, 0x78,
5460 
5461     // frame type (padding frame)
5462     0x00,
5463     0x00, 0x00, 0x00, 0x00
5464   };
5465   // clang-format on
5466 
5467   unsigned char* p = packet;
5468   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5469     p = packet_ietf;
5470   }
5471 
5472   uint64_t header_size = GetPacketHeaderSize(
5473       framer_.transport_version(), kPacket8ByteConnectionId,
5474       kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
5475       PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
5476       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
5477   memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
5478 
5479   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5480   ASSERT_TRUE(data != nullptr);
5481 
5482   quiche::test::CompareCharArraysWithHexError(
5483       "constructed packet", data->data(), data->length(), AsChars(p),
5484       ABSL_ARRAYSIZE(packet));
5485 }
5486 
TEST_P(QuicFramerTest,Build2ByteSequenceNumberPaddingFramePacket)5487 TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) {
5488   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5489   QuicPacketHeader header;
5490   header.destination_connection_id = FramerTestConnectionId();
5491   header.reset_flag = false;
5492   header.version_flag = false;
5493   header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
5494   header.packet_number = kPacketNumber;
5495 
5496   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5497 
5498   // clang-format off
5499   unsigned char packet[kMaxOutgoingPacketSize] = {
5500     // type (short header, 2 byte packet number)
5501     0x41,
5502     // connection_id
5503     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5504     // packet number
5505     0x56, 0x78,
5506 
5507     // frame type (padding frame)
5508     0x00,
5509     0x00, 0x00, 0x00, 0x00
5510   };
5511 
5512   unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
5513     // type (short header, 2 byte packet number)
5514     0x41,
5515     // connection_id
5516     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5517     // packet number
5518     0x56, 0x78,
5519 
5520     // frame type (padding frame)
5521     0x00,
5522     0x00, 0x00, 0x00, 0x00
5523   };
5524   // clang-format on
5525 
5526   unsigned char* p = packet;
5527   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5528     p = packet_ietf;
5529   }
5530 
5531   uint64_t header_size = GetPacketHeaderSize(
5532       framer_.transport_version(), kPacket8ByteConnectionId,
5533       kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
5534       PACKET_2BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
5535       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
5536   memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
5537 
5538   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5539   ASSERT_TRUE(data != nullptr);
5540 
5541   quiche::test::CompareCharArraysWithHexError(
5542       "constructed packet", data->data(), data->length(), AsChars(p),
5543       ABSL_ARRAYSIZE(packet));
5544 }
5545 
TEST_P(QuicFramerTest,Build1ByteSequenceNumberPaddingFramePacket)5546 TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) {
5547   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5548   QuicPacketHeader header;
5549   header.destination_connection_id = FramerTestConnectionId();
5550   header.reset_flag = false;
5551   header.version_flag = false;
5552   header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
5553   header.packet_number = kPacketNumber;
5554 
5555   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5556 
5557   // clang-format off
5558   unsigned char packet[kMaxOutgoingPacketSize] = {
5559     // type (short header, 1 byte packet number)
5560     0x40,
5561     // connection_id
5562     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5563     // packet number
5564     0x78,
5565 
5566     // frame type (padding frame)
5567     0x00,
5568     0x00, 0x00, 0x00, 0x00
5569   };
5570 
5571   unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
5572     // type (short header, 1 byte packet number)
5573     0x40,
5574     // connection_id
5575     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5576     // packet number
5577     0x78,
5578 
5579     // frame type (padding frame)
5580     0x00,
5581     0x00, 0x00, 0x00, 0x00
5582   };
5583   // clang-format on
5584 
5585   unsigned char* p = packet;
5586   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5587     p = packet_ietf;
5588   }
5589 
5590   uint64_t header_size = GetPacketHeaderSize(
5591       framer_.transport_version(), kPacket8ByteConnectionId,
5592       kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
5593       PACKET_1BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
5594       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
5595   memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
5596 
5597   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5598   ASSERT_TRUE(data != nullptr);
5599 
5600   quiche::test::CompareCharArraysWithHexError(
5601       "constructed packet", data->data(), data->length(), AsChars(p),
5602       ABSL_ARRAYSIZE(packet));
5603 }
5604 
TEST_P(QuicFramerTest,BuildStreamFramePacket)5605 TEST_P(QuicFramerTest, BuildStreamFramePacket) {
5606   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5607   QuicPacketHeader header;
5608   header.destination_connection_id = FramerTestConnectionId();
5609   header.reset_flag = false;
5610   header.version_flag = false;
5611   header.packet_number = kPacketNumber;
5612   if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
5613     header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
5614   }
5615 
5616   QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
5617                                absl::string_view("hello world!"));
5618 
5619   QuicFrames frames = {QuicFrame(stream_frame)};
5620 
5621   // clang-format off
5622   unsigned char packet[] = {
5623     // type (short header, 4 byte packet number)
5624     0x43,
5625     // connection_id
5626     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5627     // packet number
5628     0x12, 0x34, 0x56, 0x78,
5629 
5630     // frame type (stream frame with fin and no length)
5631     0xDF,
5632     // stream id
5633     0x01, 0x02, 0x03, 0x04,
5634     // offset
5635     0x3A, 0x98, 0xFE, 0xDC,
5636     0x32, 0x10, 0x76, 0x54,
5637     // data
5638     'h',  'e',  'l',  'l',
5639     'o',  ' ',  'w',  'o',
5640     'r',  'l',  'd',  '!',
5641   };
5642 
5643   unsigned char packet_ietf[] = {
5644     // type (short header, 4 byte packet number)
5645     0x43,
5646     // connection_id
5647     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5648     // packet number
5649     0x12, 0x34, 0x56, 0x78,
5650 
5651     // frame type (IETF_STREAM frame with FIN and OFFSET, no length)
5652     0x08 | 0x01 | 0x04,
5653     // stream id
5654     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
5655     // offset
5656     kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5657     0x32, 0x10, 0x76, 0x54,
5658     // data
5659     'h',  'e',  'l',  'l',
5660     'o',  ' ',  'w',  'o',
5661     'r',  'l',  'd',  '!',
5662   };
5663   // clang-format on
5664 
5665   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5666   ASSERT_TRUE(data != nullptr);
5667 
5668   unsigned char* p = packet;
5669   size_t p_size = ABSL_ARRAYSIZE(packet);
5670   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5671     p = packet_ietf;
5672     p_size = ABSL_ARRAYSIZE(packet_ietf);
5673   }
5674   quiche::test::CompareCharArraysWithHexError(
5675       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
5676 }
5677 
TEST_P(QuicFramerTest,BuildStreamFramePacketWithVersionFlag)5678 TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) {
5679   QuicPacketHeader header;
5680   header.destination_connection_id = FramerTestConnectionId();
5681   header.reset_flag = false;
5682   header.version_flag = true;
5683   header.long_packet_type = ZERO_RTT_PROTECTED;
5684   header.packet_number = kPacketNumber;
5685   if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
5686     header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
5687   }
5688 
5689   QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
5690                                absl::string_view("hello world!"));
5691   QuicFrames frames = {QuicFrame(stream_frame)};
5692 
5693   // clang-format off
5694   unsigned char packet[] = {
5695       // type (long header with packet type ZERO_RTT_PROTECTED)
5696       0xD3,
5697       // version tag
5698       QUIC_VERSION_BYTES,
5699       // connection_id length
5700       0x50,
5701       // connection_id
5702       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5703       // packet number
5704       0x12, 0x34, 0x56, 0x78,
5705 
5706       // frame type (stream frame with fin and no length)
5707       0xDF,
5708       // stream id
5709       0x01, 0x02, 0x03, 0x04,
5710       // offset
5711       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
5712       // data
5713       'h',  'e',  'l',  'l',  'o',  ' ',  'w',  'o',  'r', 'l', 'd', '!',
5714   };
5715 
5716   unsigned char packet49[] = {
5717       // type (long header with packet type ZERO_RTT_PROTECTED)
5718       0xD3,
5719       // version tag
5720       QUIC_VERSION_BYTES,
5721       // destination connection ID length
5722       0x08,
5723       // destination connection ID
5724       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5725       // source connection ID length
5726       0x00,
5727       // length
5728       0x40, 0x1D,
5729       // packet number
5730       0x12, 0x34, 0x56, 0x78,
5731 
5732       // frame type (stream frame with fin and no length)
5733       0xDF,
5734       // stream id
5735       0x01, 0x02, 0x03, 0x04,
5736       // offset
5737       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
5738       // data
5739       'h',  'e',  'l',  'l',  'o',  ' ',  'w',  'o',  'r', 'l', 'd', '!',
5740   };
5741 
5742   unsigned char packet_ietf[] = {
5743       // type (long header with packet type ZERO_RTT_PROTECTED)
5744       0xD3,
5745       // version tag
5746       QUIC_VERSION_BYTES,
5747       // destination connection ID length
5748       0x08,
5749       // destination connection ID
5750       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5751       // source connection ID length
5752       0x00,
5753       // length
5754       0x40, 0x1D,
5755       // packet number
5756       0x12, 0x34, 0x56, 0x78,
5757 
5758       // frame type (IETF_STREAM frame with fin and offset, no length)
5759       0x08 | 0x01 | 0x04,
5760       // stream id
5761       kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
5762       // offset
5763       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
5764       // data
5765       'h',  'e',  'l',  'l',  'o',  ' ',  'w',  'o',  'r', 'l', 'd', '!',
5766   };
5767   // clang-format on
5768 
5769   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5770   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5771   ASSERT_TRUE(data != nullptr);
5772 
5773   unsigned char* p = packet;
5774   size_t p_size = ABSL_ARRAYSIZE(packet);
5775   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5776     ReviseFirstByteByVersion(packet_ietf);
5777     p = packet_ietf;
5778     p_size = ABSL_ARRAYSIZE(packet_ietf);
5779   } else if (framer_.version().HasLongHeaderLengths()) {
5780     p = packet49;
5781     p_size = ABSL_ARRAYSIZE(packet49);
5782   }
5783   quiche::test::CompareCharArraysWithHexError(
5784       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
5785 }
5786 
TEST_P(QuicFramerTest,BuildCryptoFramePacket)5787 TEST_P(QuicFramerTest, BuildCryptoFramePacket) {
5788   if (!QuicVersionUsesCryptoFrames(framer_.transport_version())) {
5789     return;
5790   }
5791   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5792   QuicPacketHeader header;
5793   header.destination_connection_id = FramerTestConnectionId();
5794   header.reset_flag = false;
5795   header.version_flag = false;
5796   header.packet_number = kPacketNumber;
5797 
5798   SimpleDataProducer data_producer;
5799   framer_.set_data_producer(&data_producer);
5800 
5801   absl::string_view crypto_frame_contents("hello world!");
5802   QuicCryptoFrame crypto_frame(ENCRYPTION_INITIAL, kStreamOffset,
5803                                crypto_frame_contents.length());
5804   data_producer.SaveCryptoData(ENCRYPTION_INITIAL, kStreamOffset,
5805                                crypto_frame_contents);
5806 
5807   QuicFrames frames = {QuicFrame(&crypto_frame)};
5808 
5809   // clang-format off
5810   unsigned char packet48[] = {
5811     // type (short header, 4 byte packet number)
5812     0x43,
5813     // connection_id
5814     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5815     // packet number
5816     0x12, 0x34, 0x56, 0x78,
5817 
5818     // frame type (QuicFrameType CRYPTO_FRAME)
5819     0x08,
5820     // offset
5821     kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5822     0x32, 0x10, 0x76, 0x54,
5823     // length
5824     kVarInt62OneByte + 12,
5825     // data
5826     'h',  'e',  'l',  'l',
5827     'o',  ' ',  'w',  'o',
5828     'r',  'l',  'd',  '!',
5829   };
5830 
5831   unsigned char packet_ietf[] = {
5832     // type (short header, 4 byte packet number)
5833     0x43,
5834     // connection_id
5835     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5836     // packet number
5837     0x12, 0x34, 0x56, 0x78,
5838 
5839     // frame type (IETF_CRYPTO frame)
5840     0x06,
5841     // offset
5842     kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5843     0x32, 0x10, 0x76, 0x54,
5844     // length
5845     kVarInt62OneByte + 12,
5846     // data
5847     'h',  'e',  'l',  'l',
5848     'o',  ' ',  'w',  'o',
5849     'r',  'l',  'd',  '!',
5850   };
5851   // clang-format on
5852 
5853   unsigned char* packet = packet48;
5854   size_t packet_size = ABSL_ARRAYSIZE(packet48);
5855   if (framer_.version().HasIetfQuicFrames()) {
5856     packet = packet_ietf;
5857     packet_size = ABSL_ARRAYSIZE(packet_ietf);
5858   }
5859 
5860   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5861   ASSERT_TRUE(data != nullptr);
5862   quiche::test::CompareCharArraysWithHexError("constructed packet",
5863                                               data->data(), data->length(),
5864                                               AsChars(packet), packet_size);
5865 }
5866 
TEST_P(QuicFramerTest,CryptoFrame)5867 TEST_P(QuicFramerTest, CryptoFrame) {
5868   if (!QuicVersionUsesCryptoFrames(framer_.transport_version())) {
5869     // CRYPTO frames aren't supported prior to v48.
5870     return;
5871   }
5872   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
5873 
5874   // clang-format off
5875   PacketFragments packet48 = {
5876       // type (short header, 4 byte packet number)
5877       {"",
5878        {0x43}},
5879       // connection_id
5880       {"",
5881        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5882       // packet number
5883       {"",
5884        {0x12, 0x34, 0x56, 0x78}},
5885       // frame type (QuicFrameType CRYPTO_FRAME)
5886       {"",
5887        {0x08}},
5888       // offset
5889       {"",
5890        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5891         0x32, 0x10, 0x76, 0x54}},
5892       // data length
5893       {"Invalid data length.",
5894        {kVarInt62OneByte + 12}},
5895       // data
5896       {"Unable to read frame data.",
5897        {'h',  'e',  'l',  'l',
5898         'o',  ' ',  'w',  'o',
5899         'r',  'l',  'd',  '!'}},
5900   };
5901 
5902   PacketFragments packet_ietf = {
5903       // type (short header, 4 byte packet number)
5904       {"",
5905        {0x43}},
5906       // connection_id
5907       {"",
5908        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5909       // packet number
5910       {"",
5911        {0x12, 0x34, 0x56, 0x78}},
5912       // frame type (IETF_CRYPTO frame)
5913       {"",
5914        {0x06}},
5915       // offset
5916       {"",
5917        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5918         0x32, 0x10, 0x76, 0x54}},
5919       // data length
5920       {"Invalid data length.",
5921        {kVarInt62OneByte + 12}},
5922       // data
5923       {"Unable to read frame data.",
5924        {'h',  'e',  'l',  'l',
5925         'o',  ' ',  'w',  'o',
5926         'r',  'l',  'd',  '!'}},
5927   };
5928   // clang-format on
5929 
5930   PacketFragments& fragments =
5931       framer_.version().HasIetfQuicFrames() ? packet_ietf : packet48;
5932   std::unique_ptr<QuicEncryptedPacket> encrypted(
5933       AssemblePacketFromFragments(fragments));
5934   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5935 
5936   EXPECT_THAT(framer_.error(), IsQuicNoError());
5937   ASSERT_TRUE(visitor_.header_.get());
5938   EXPECT_TRUE(CheckDecryption(
5939       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5940       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
5941   ASSERT_EQ(1u, visitor_.crypto_frames_.size());
5942   QuicCryptoFrame* frame = visitor_.crypto_frames_[0].get();
5943   EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, frame->level);
5944   EXPECT_EQ(kStreamOffset, frame->offset);
5945   EXPECT_EQ("hello world!",
5946             std::string(frame->data_buffer, frame->data_length));
5947 
5948   CheckFramingBoundaries(fragments, QUIC_INVALID_FRAME_DATA);
5949 }
5950 
TEST_P(QuicFramerTest,BuildOldVersionNegotiationPacket)5951 TEST_P(QuicFramerTest, BuildOldVersionNegotiationPacket) {
5952   SetQuicFlag(quic_disable_version_negotiation_grease_randomness, true);
5953   // clang-format off
5954   unsigned char packet[] = {
5955       // public flags (version, 8 byte connection_id)
5956       0x0D,
5957       // connection_id
5958       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5959       // supported versions
5960       0xDA, 0x5A, 0x3A, 0x3A,
5961       QUIC_VERSION_BYTES,
5962   };
5963   QuicConnectionId connection_id = FramerTestConnectionId();
5964   std::unique_ptr<QuicEncryptedPacket> data(
5965       QuicFramer::BuildVersionNegotiationPacket(
5966           connection_id, EmptyQuicConnectionId(), /*ietf_quic=*/false,
5967           /*use_length_prefix=*/false,
5968           SupportedVersions(GetParam())));
5969   quiche::test::CompareCharArraysWithHexError(
5970       "constructed packet", data->data(), data->length(), AsChars(packet),
5971       ABSL_ARRAYSIZE(packet));
5972 }
5973 
TEST_P(QuicFramerTest,BuildVersionNegotiationPacket)5974 TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) {
5975   SetQuicFlag(quic_disable_version_negotiation_grease_randomness, true);
5976   // clang-format off
5977   unsigned char packet[] = {
5978       // type (long header)
5979       0xC0,
5980       // version tag
5981       0x00, 0x00, 0x00, 0x00,
5982       // connection_id length
5983       0x05,
5984       // connection_id
5985       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5986       // supported versions
5987       0xDA, 0x5A, 0x3A, 0x3A,
5988       QUIC_VERSION_BYTES,
5989   };
5990   unsigned char packet49[] = {
5991       // type (long header)
5992       0xC0,
5993       // version tag
5994       0x00, 0x00, 0x00, 0x00,
5995       // destination connection ID length
5996       0x00,
5997       // source connection ID length
5998       0x08,
5999       // source connection ID
6000       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6001       // supported versions
6002       0xDA, 0x5A, 0x3A, 0x3A,
6003       QUIC_VERSION_BYTES,
6004   };
6005   // clang-format on
6006   unsigned char* p = packet;
6007   size_t p_size = ABSL_ARRAYSIZE(packet);
6008   if (framer_.version().HasLongHeaderLengths()) {
6009     p = packet49;
6010     p_size = ABSL_ARRAYSIZE(packet49);
6011   }
6012 
6013   QuicConnectionId connection_id = FramerTestConnectionId();
6014   std::unique_ptr<QuicEncryptedPacket> data(
6015       QuicFramer::BuildVersionNegotiationPacket(
6016           connection_id, EmptyQuicConnectionId(), /*ietf_quic=*/true,
6017           framer_.version().HasLengthPrefixedConnectionIds(),
6018           SupportedVersions(GetParam())));
6019   quiche::test::CompareCharArraysWithHexError(
6020       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
6021 }
6022 
TEST_P(QuicFramerTest,BuildVersionNegotiationPacketWithClientConnectionId)6023 TEST_P(QuicFramerTest, BuildVersionNegotiationPacketWithClientConnectionId) {
6024   if (!framer_.version().SupportsClientConnectionIds()) {
6025     return;
6026   }
6027 
6028   SetQuicFlag(quic_disable_version_negotiation_grease_randomness, true);
6029 
6030   // clang-format off
6031   unsigned char packet[] = {
6032       // type (long header)
6033       0xC0,
6034       // version tag
6035       0x00, 0x00, 0x00, 0x00,
6036       // client/destination connection ID
6037       0x08,
6038       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
6039       // server/source connection ID
6040       0x08,
6041       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6042       // supported versions
6043       0xDA, 0x5A, 0x3A, 0x3A,
6044       QUIC_VERSION_BYTES,
6045   };
6046   // clang-format on
6047 
6048   QuicConnectionId server_connection_id = FramerTestConnectionId();
6049   QuicConnectionId client_connection_id = FramerTestConnectionIdPlusOne();
6050   std::unique_ptr<QuicEncryptedPacket> data(
6051       QuicFramer::BuildVersionNegotiationPacket(
6052           server_connection_id, client_connection_id, true, true,
6053           SupportedVersions(GetParam())));
6054   quiche::test::CompareCharArraysWithHexError(
6055       "constructed packet", data->data(), data->length(), AsChars(packet),
6056       ABSL_ARRAYSIZE(packet));
6057 }
6058 
TEST_P(QuicFramerTest,BuildAckFramePacketOneAckBlock)6059 TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlock) {
6060   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6061   QuicPacketHeader header;
6062   header.destination_connection_id = FramerTestConnectionId();
6063   header.reset_flag = false;
6064   header.version_flag = false;
6065   header.packet_number = kPacketNumber;
6066 
6067   // Use kSmallLargestObserved to make this test finished in a short time.
6068   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6069   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6070 
6071   QuicFrames frames = {QuicFrame(&ack_frame)};
6072 
6073   // clang-format off
6074   unsigned char packet[] = {
6075       // type (short header, 4 byte packet number)
6076       0x43,
6077       // connection_id
6078       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6079       // packet number
6080       0x12, 0x34, 0x56, 0x78,
6081 
6082       // frame type (ack frame)
6083       // (no ack blocks, 2 byte largest observed, 2 byte block length)
6084       0x45,
6085       // largest acked
6086       0x12, 0x34,
6087       // Zero delta time.
6088       0x00, 0x00,
6089       // first ack block length.
6090       0x12, 0x34,
6091       // num timestamps.
6092       0x00,
6093   };
6094 
6095   unsigned char packet_ietf[] = {
6096       // type (short header, 4 byte packet number)
6097       0x43,
6098       // connection_id
6099       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6100       // packet number
6101       0x12, 0x34, 0x56, 0x78,
6102 
6103       // frame type (IETF_ACK frame)
6104       0x02,
6105       // largest acked
6106       kVarInt62TwoBytes + 0x12, 0x34,
6107       // Zero delta time.
6108       kVarInt62OneByte + 0x00,
6109       // Number of additional ack blocks.
6110       kVarInt62OneByte + 0x00,
6111       // first ack block length.
6112       kVarInt62TwoBytes + 0x12, 0x33,
6113   };
6114   // clang-format on
6115   unsigned char* p = packet;
6116   size_t p_size = ABSL_ARRAYSIZE(packet);
6117   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
6118     p = packet_ietf;
6119     p_size = ABSL_ARRAYSIZE(packet_ietf);
6120   }
6121 
6122   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6123   ASSERT_TRUE(data != nullptr);
6124   quiche::test::CompareCharArraysWithHexError(
6125       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
6126 }
6127 
TEST_P(QuicFramerTest,BuildAckReceiveTimestampsFrameMultipleRanges)6128 TEST_P(QuicFramerTest, BuildAckReceiveTimestampsFrameMultipleRanges) {
6129   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6130     return;
6131   }
6132 
6133   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6134   QuicPacketHeader header;
6135   header.destination_connection_id = FramerTestConnectionId();
6136   header.reset_flag = false;
6137   header.version_flag = false;
6138   header.packet_number = kPacketNumber;
6139 
6140   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6141   ack_frame.received_packet_times = PacketTimeVector{
6142       // Timestamp Range 3.
6143       {kSmallLargestObserved - 22, CreationTimePlus(0x29ffdddd)},
6144       {kSmallLargestObserved - 21, CreationTimePlus(0x29ffdedd)},
6145       // Timestamp Range 2.
6146       {kSmallLargestObserved - 11, CreationTimePlus(0x29ffdeed)},
6147       // Timestamp Range 1.
6148       {kSmallLargestObserved - 4, CreationTimePlus(0x29ffeeed)},
6149       {kSmallLargestObserved - 3, CreationTimePlus(0x29ffeeee)},
6150       {kSmallLargestObserved - 2, CreationTimePlus(0x29ffffff)},
6151   };
6152   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6153   QuicFrames frames = {QuicFrame(&ack_frame)};
6154 
6155   unsigned char packet_ietf[] = {
6156       // type (short header, 4 byte packet number)
6157       0x43,
6158       // connection_id
6159       0xFE,
6160       0xDC,
6161       0xBA,
6162       0x98,
6163       0x76,
6164       0x54,
6165       0x32,
6166       0x10,
6167       // packet number
6168       0x12,
6169       0x34,
6170       0x56,
6171       0x78,
6172 
6173       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
6174       0x22,
6175       // largest acked
6176       kVarInt62TwoBytes + 0x12,
6177       0x34,  // = 4660
6178       // Zero delta time.
6179       kVarInt62OneByte + 0x00,
6180       // number of additional ack blocks
6181       kVarInt62OneByte + 0x00,
6182       // first ack block length.
6183       kVarInt62TwoBytes + 0x12,
6184       0x33,
6185 
6186       // Receive Timestamps.
6187 
6188       // Timestamp Range Count
6189       kVarInt62OneByte + 0x03,
6190 
6191       // Timestamp range 1 (three packets).
6192       // Gap
6193       kVarInt62OneByte + 0x02,
6194       // Timestamp Range Count
6195       kVarInt62OneByte + 0x03,
6196       // Timestamp Delta
6197       kVarInt62FourBytes + 0x29,
6198       0xff,
6199       0xff,
6200       0xff,
6201       // Timestamp Delta
6202       kVarInt62TwoBytes + 0x11,
6203       0x11,
6204       // Timestamp Delta
6205       kVarInt62OneByte + 0x01,
6206 
6207       // Timestamp range 2 (one packet).
6208       // Gap
6209       kVarInt62OneByte + 0x05,
6210       // Timestamp Range Count
6211       kVarInt62OneByte + 0x01,
6212       // Timestamp Delta
6213       kVarInt62TwoBytes + 0x10,
6214       0x00,
6215 
6216       // Timestamp range 3 (two packets).
6217       // Gap
6218       kVarInt62OneByte + 0x08,
6219       // Timestamp Range Count
6220       kVarInt62OneByte + 0x02,
6221       // Timestamp Delta
6222       kVarInt62OneByte + 0x10,
6223       // Timestamp Delta
6224       kVarInt62TwoBytes + 0x01,
6225       0x00,
6226   };
6227   // clang-format on
6228 
6229   framer_.set_process_timestamps(true);
6230   framer_.set_max_receive_timestamps_per_ack(8);
6231   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6232   ASSERT_TRUE(data != nullptr);
6233   quiche::test::CompareCharArraysWithHexError(
6234       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
6235       ABSL_ARRAYSIZE(packet_ietf));
6236 }
6237 
TEST_P(QuicFramerTest,BuildAckReceiveTimestampsFrameExceedsMaxTimestamps)6238 TEST_P(QuicFramerTest, BuildAckReceiveTimestampsFrameExceedsMaxTimestamps) {
6239   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6240     return;
6241   }
6242 
6243   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6244   QuicPacketHeader header;
6245   header.destination_connection_id = FramerTestConnectionId();
6246   header.reset_flag = false;
6247   header.version_flag = false;
6248   header.packet_number = kPacketNumber;
6249 
6250   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6251   ack_frame.received_packet_times = PacketTimeVector{
6252       // Timestamp Range 3 (not included because max receive timestamps = 4).
6253       {kSmallLargestObserved - 20, CreationTimePlus(0x29ffdddd)},
6254       // Timestamp Range 2.
6255       {kSmallLargestObserved - 10, CreationTimePlus(0x29ffdedd)},
6256       {kSmallLargestObserved - 9, CreationTimePlus(0x29ffdeed)},
6257       // Timestamp Range 1.
6258       {kSmallLargestObserved - 2, CreationTimePlus(0x29ffeeed)},
6259       {kSmallLargestObserved - 1, CreationTimePlus(0x29ffeeee)},
6260       {kSmallLargestObserved, CreationTimePlus(0x29ffffff)},
6261   };
6262   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6263   QuicFrames frames = {QuicFrame(&ack_frame)};
6264 
6265   unsigned char packet_ietf[] = {
6266       // type (short header, 4 byte packet number)
6267       0x43,
6268       // connection_id
6269       0xFE,
6270       0xDC,
6271       0xBA,
6272       0x98,
6273       0x76,
6274       0x54,
6275       0x32,
6276       0x10,
6277       // packet number
6278       0x12,
6279       0x34,
6280       0x56,
6281       0x78,
6282 
6283       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
6284       0x22,
6285       // largest acked
6286       kVarInt62TwoBytes + 0x12,
6287       0x34,  // = 4660
6288       // Zero delta time.
6289       kVarInt62OneByte + 0x00,
6290       // number of additional ack blocks
6291       kVarInt62OneByte + 0x00,
6292       // first ack block length.
6293       kVarInt62TwoBytes + 0x12,
6294       0x33,
6295 
6296       // Receive Timestamps.
6297 
6298       // Timestamp Range Count
6299       kVarInt62OneByte + 0x02,
6300 
6301       // Timestamp range 1 (three packets).
6302       // Gap
6303       kVarInt62OneByte + 0x00,
6304       // Timestamp Range Count
6305       kVarInt62OneByte + 0x03,
6306       // Timestamp Delta
6307       kVarInt62FourBytes + 0x29,
6308       0xff,
6309       0xff,
6310       0xff,
6311       // Timestamp Delta
6312       kVarInt62TwoBytes + 0x11,
6313       0x11,
6314       // Timestamp Delta
6315       kVarInt62OneByte + 0x01,
6316 
6317       // Timestamp range 2 (one packet).
6318       // Gap
6319       kVarInt62OneByte + 0x05,
6320       // Timestamp Range Count
6321       kVarInt62OneByte + 0x01,
6322       // Timestamp Delta
6323       kVarInt62TwoBytes + 0x10,
6324       0x00,
6325   };
6326   // clang-format on
6327 
6328   framer_.set_process_timestamps(true);
6329   framer_.set_max_receive_timestamps_per_ack(4);
6330   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6331   ASSERT_TRUE(data != nullptr);
6332   quiche::test::CompareCharArraysWithHexError(
6333       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
6334       ABSL_ARRAYSIZE(packet_ietf));
6335 }
6336 
TEST_P(QuicFramerTest,BuildAckReceiveTimestampsFrameWithExponentEncoding)6337 TEST_P(QuicFramerTest, BuildAckReceiveTimestampsFrameWithExponentEncoding) {
6338   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6339     return;
6340   }
6341 
6342   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6343   QuicPacketHeader header;
6344   header.destination_connection_id = FramerTestConnectionId();
6345   header.reset_flag = false;
6346   header.version_flag = false;
6347   header.packet_number = kPacketNumber;
6348 
6349   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6350   ack_frame.received_packet_times = PacketTimeVector{
6351       // Timestamp Range 2.
6352       {kSmallLargestObserved - 12, CreationTimePlus((0x06c00 << 3) + 0x03)},
6353       {kSmallLargestObserved - 11, CreationTimePlus((0x28e00 << 3) + 0x00)},
6354       // Timestamp Range 1.
6355       {kSmallLargestObserved - 5, CreationTimePlus((0x29f00 << 3) + 0x00)},
6356       {kSmallLargestObserved - 4, CreationTimePlus((0x29f00 << 3) + 0x01)},
6357       {kSmallLargestObserved - 3, CreationTimePlus((0x29f00 << 3) + 0x02)},
6358       {kSmallLargestObserved - 2, CreationTimePlus((0x29f00 << 3) + 0x03)},
6359   };
6360   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6361 
6362   QuicFrames frames = {QuicFrame(&ack_frame)};
6363 
6364   unsigned char packet_ietf[] = {
6365       // type (short header, 4 byte packet number)
6366       0x43,
6367       // connection_id
6368       0xFE,
6369       0xDC,
6370       0xBA,
6371       0x98,
6372       0x76,
6373       0x54,
6374       0x32,
6375       0x10,
6376       // packet number
6377       0x12,
6378       0x34,
6379       0x56,
6380       0x78,
6381 
6382       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
6383       0x22,
6384       // largest acked
6385       kVarInt62TwoBytes + 0x12,
6386       0x34,  // = 4660
6387       // Zero delta time.
6388       kVarInt62OneByte + 0x00,
6389       // number of additional ack blocks
6390       kVarInt62OneByte + 0x00,
6391       // first ack block length.
6392       kVarInt62TwoBytes + 0x12,
6393       0x33,
6394 
6395       // Receive Timestamps.
6396 
6397       // Timestamp Range Count
6398       kVarInt62OneByte + 0x02,
6399 
6400       // Timestamp range 1 (three packets).
6401       // Gap
6402       kVarInt62OneByte + 0x02,
6403       // Timestamp Range Count
6404       kVarInt62OneByte + 0x04,
6405       // Timestamp Delta
6406       kVarInt62FourBytes + 0x00,
6407       0x02,
6408       0x9f,
6409       0x01,  // round up
6410       // Timestamp Delta
6411       kVarInt62OneByte + 0x00,
6412       // Timestamp Delta
6413       kVarInt62OneByte + 0x00,
6414       // Timestamp Delta
6415       kVarInt62OneByte + 0x01,
6416 
6417       // Timestamp range 2 (one packet).
6418       // Gap
6419       kVarInt62OneByte + 0x04,
6420       // Timestamp Range Count
6421       kVarInt62OneByte + 0x02,
6422       // Timestamp Delta
6423       kVarInt62TwoBytes + 0x11,
6424       0x00,
6425       // Timestamp Delta
6426       kVarInt62FourBytes + 0x00,
6427       0x02,
6428       0x21,
6429       0xff,
6430   };
6431   // clang-format on
6432 
6433   framer_.set_process_timestamps(true);
6434   framer_.set_max_receive_timestamps_per_ack(8);
6435   framer_.set_receive_timestamps_exponent(3);
6436   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6437   ASSERT_TRUE(data != nullptr);
6438   quiche::test::CompareCharArraysWithHexError(
6439       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
6440       ABSL_ARRAYSIZE(packet_ietf));
6441 }
6442 
TEST_P(QuicFramerTest,BuildAndProcessAckReceiveTimestampsWithMultipleRanges)6443 TEST_P(QuicFramerTest, BuildAndProcessAckReceiveTimestampsWithMultipleRanges) {
6444   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6445     return;
6446   }
6447   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6448                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6449   framer_.SetKeyUpdateSupportForConnection(true);
6450   framer_.set_process_timestamps(true);
6451   framer_.set_max_receive_timestamps_per_ack(8);
6452 
6453   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6454   QuicPacketHeader header;
6455   header.destination_connection_id = FramerTestConnectionId();
6456   header.reset_flag = false;
6457   header.version_flag = false;
6458   header.packet_number = kPacketNumber;
6459 
6460   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6461   ack_frame.received_packet_times = PacketTimeVector{
6462       {kSmallLargestObserved - 1201, CreationTimePlus(0x8bcaef234)},
6463       {kSmallLargestObserved - 1200, CreationTimePlus(0x8bcdef123)},
6464       {kSmallLargestObserved - 1000, CreationTimePlus(0xaacdef123)},
6465       {kSmallLargestObserved - 4, CreationTimePlus(0xabcdea125)},
6466       {kSmallLargestObserved - 2, CreationTimePlus(0xabcdee124)},
6467       {kSmallLargestObserved - 1, CreationTimePlus(0xabcdef123)},
6468       {kSmallLargestObserved, CreationTimePlus(0xabcdef123)},
6469   };
6470   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6471   QuicFrames frames = {QuicFrame(&ack_frame)};
6472 
6473   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6474   ASSERT_TRUE(data != nullptr);
6475   std::unique_ptr<QuicEncryptedPacket> encrypted(
6476       EncryptPacketWithTagAndPhase(*data, 0, false));
6477   ASSERT_TRUE(encrypted);
6478   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6479   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6480   EXPECT_THAT(framer_.error(), IsQuicNoError());
6481 
6482   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6483   EXPECT_THAT(frame.received_packet_times,
6484               ContainerEq(PacketTimeVector{
6485                   {kSmallLargestObserved, CreationTimePlus(0xabcdef123)},
6486                   {kSmallLargestObserved - 1, CreationTimePlus(0xabcdef123)},
6487                   {kSmallLargestObserved - 2, CreationTimePlus(0xabcdee124)},
6488                   {kSmallLargestObserved - 4, CreationTimePlus(0xabcdea125)},
6489                   {kSmallLargestObserved - 1000, CreationTimePlus(0xaacdef123)},
6490                   {kSmallLargestObserved - 1200, CreationTimePlus(0x8bcdef123)},
6491                   {kSmallLargestObserved - 1201, CreationTimePlus(0x8bcaef234)},
6492               }));
6493 }
6494 
TEST_P(QuicFramerTest,BuildAndProcessAckReceiveTimestampsExceedsMaxTimestamps)6495 TEST_P(QuicFramerTest,
6496        BuildAndProcessAckReceiveTimestampsExceedsMaxTimestamps) {
6497   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6498     return;
6499   }
6500   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6501                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6502   framer_.SetKeyUpdateSupportForConnection(true);
6503   framer_.set_process_timestamps(true);
6504   framer_.set_max_receive_timestamps_per_ack(2);
6505 
6506   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6507   QuicPacketHeader header;
6508   header.destination_connection_id = FramerTestConnectionId();
6509   header.reset_flag = false;
6510   header.version_flag = false;
6511   header.packet_number = kPacketNumber;
6512 
6513   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6514   ack_frame.received_packet_times = PacketTimeVector{
6515       {kSmallLargestObserved - 1201, CreationTimePlus(0x8bcaef234)},
6516       {kSmallLargestObserved - 1200, CreationTimePlus(0x8bcdef123)},
6517       {kSmallLargestObserved - 1000, CreationTimePlus(0xaacdef123)},
6518       {kSmallLargestObserved - 5, CreationTimePlus(0xabcdea125)},
6519       {kSmallLargestObserved - 3, CreationTimePlus(0xabcded124)},
6520       {kSmallLargestObserved - 2, CreationTimePlus(0xabcdee124)},
6521       {kSmallLargestObserved - 1, CreationTimePlus(0xabcdef123)},
6522   };
6523   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6524   QuicFrames frames = {QuicFrame(&ack_frame)};
6525 
6526   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6527   ASSERT_TRUE(data != nullptr);
6528   std::unique_ptr<QuicEncryptedPacket> encrypted(
6529       EncryptPacketWithTagAndPhase(*data, 0, false));
6530   ASSERT_TRUE(encrypted);
6531   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6532   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6533   EXPECT_THAT(framer_.error(), IsQuicNoError());
6534 
6535   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6536   EXPECT_THAT(frame.received_packet_times,
6537               ContainerEq(PacketTimeVector{
6538                   {kSmallLargestObserved - 1, CreationTimePlus(0xabcdef123)},
6539                   {kSmallLargestObserved - 2, CreationTimePlus(0xabcdee124)},
6540               }));
6541 }
6542 
TEST_P(QuicFramerTest,BuildAndProcessAckReceiveTimestampsWithExponentNoTruncation)6543 TEST_P(QuicFramerTest,
6544        BuildAndProcessAckReceiveTimestampsWithExponentNoTruncation) {
6545   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6546     return;
6547   }
6548   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6549                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6550   framer_.SetKeyUpdateSupportForConnection(true);
6551   framer_.set_process_timestamps(true);
6552   framer_.set_max_receive_timestamps_per_ack(8);
6553   framer_.set_receive_timestamps_exponent(3);
6554 
6555   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6556   QuicPacketHeader header;
6557   header.destination_connection_id = FramerTestConnectionId();
6558   header.reset_flag = false;
6559   header.version_flag = false;
6560   header.packet_number = kPacketNumber;
6561 
6562   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6563   ack_frame.received_packet_times = PacketTimeVector{
6564       {kSmallLargestObserved - 8, CreationTimePlus(0x1add << 3)},
6565       {kSmallLargestObserved - 7, CreationTimePlus(0x29ed << 3)},
6566       {kSmallLargestObserved - 3, CreationTimePlus(0x29fe << 3)},
6567       {kSmallLargestObserved - 2, CreationTimePlus(0x29ff << 3)},
6568   };
6569   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6570   QuicFrames frames = {QuicFrame(&ack_frame)};
6571 
6572   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6573   ASSERT_TRUE(data != nullptr);
6574   std::unique_ptr<QuicEncryptedPacket> encrypted(
6575       EncryptPacketWithTagAndPhase(*data, 0, false));
6576   ASSERT_TRUE(encrypted);
6577   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6578   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6579   EXPECT_THAT(framer_.error(), IsQuicNoError());
6580 
6581   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6582   EXPECT_THAT(frame.received_packet_times,
6583               ContainerEq(PacketTimeVector{
6584                   {kSmallLargestObserved - 2, CreationTimePlus(0x29ff << 3)},
6585                   {kSmallLargestObserved - 3, CreationTimePlus(0x29fe << 3)},
6586                   {kSmallLargestObserved - 7, CreationTimePlus(0x29ed << 3)},
6587                   {kSmallLargestObserved - 8, CreationTimePlus(0x1add << 3)},
6588               }));
6589 }
6590 
TEST_P(QuicFramerTest,BuildAndProcessAckReceiveTimestampsWithExponentTruncation)6591 TEST_P(QuicFramerTest,
6592        BuildAndProcessAckReceiveTimestampsWithExponentTruncation) {
6593   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6594     return;
6595   }
6596   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6597                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6598   framer_.SetKeyUpdateSupportForConnection(true);
6599   framer_.set_process_timestamps(true);
6600   framer_.set_max_receive_timestamps_per_ack(8);
6601   framer_.set_receive_timestamps_exponent(3);
6602 
6603   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6604   QuicPacketHeader header;
6605   header.destination_connection_id = FramerTestConnectionId();
6606   header.reset_flag = false;
6607   header.version_flag = false;
6608   header.packet_number = kPacketNumber;
6609 
6610   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6611   ack_frame.received_packet_times = PacketTimeVector{
6612       {kSmallLargestObserved - 10, CreationTimePlus((0x1001 << 3) + 1)},
6613       {kSmallLargestObserved - 9, CreationTimePlus((0x2995 << 3) - 1)},
6614       {kSmallLargestObserved - 8, CreationTimePlus((0x2995 << 3) + 0)},
6615       {kSmallLargestObserved - 7, CreationTimePlus((0x2995 << 3) + 1)},
6616       {kSmallLargestObserved - 6, CreationTimePlus((0x2995 << 3) + 2)},
6617       {kSmallLargestObserved - 3, CreationTimePlus((0x2995 << 3) + 3)},
6618       {kSmallLargestObserved - 2, CreationTimePlus((0x2995 << 3) + 4)},
6619   };
6620   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6621   QuicFrames frames = {QuicFrame(&ack_frame)};
6622 
6623   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6624   ASSERT_TRUE(data != nullptr);
6625   std::unique_ptr<QuicEncryptedPacket> encrypted(
6626       EncryptPacketWithTagAndPhase(*data, 0, false));
6627   ASSERT_TRUE(encrypted);
6628   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6629   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6630   EXPECT_THAT(framer_.error(), IsQuicNoError());
6631 
6632   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6633   EXPECT_THAT(frame.received_packet_times,
6634               ContainerEq(PacketTimeVector{
6635                   {kSmallLargestObserved - 2, CreationTimePlus(0x2996 << 3)},
6636                   {kSmallLargestObserved - 3, CreationTimePlus(0x2996 << 3)},
6637                   {kSmallLargestObserved - 6, CreationTimePlus(0x2996 << 3)},
6638                   {kSmallLargestObserved - 7, CreationTimePlus(0x2996 << 3)},
6639                   {kSmallLargestObserved - 8, CreationTimePlus(0x2995 << 3)},
6640                   {kSmallLargestObserved - 9, CreationTimePlus(0x2995 << 3)},
6641                   {kSmallLargestObserved - 10, CreationTimePlus(0x1002 << 3)},
6642               }));
6643 }
6644 
TEST_P(QuicFramerTest,AckReceiveTimestamps)6645 TEST_P(QuicFramerTest, AckReceiveTimestamps) {
6646   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6647     return;
6648   }
6649   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6650                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6651   framer_.SetKeyUpdateSupportForConnection(true);
6652   framer_.set_process_timestamps(true);
6653   framer_.set_max_receive_timestamps_per_ack(8);
6654   framer_.set_receive_timestamps_exponent(3);
6655 
6656   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6657   QuicPacketHeader header;
6658   header.destination_connection_id = FramerTestConnectionId();
6659   header.reset_flag = false;
6660   header.version_flag = false;
6661   header.packet_number = kPacketNumber;
6662 
6663   // Use kSmallLargestObserved to make this test finished in a short time.
6664   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6665   ack_frame.received_packet_times = PacketTimeVector{
6666       {kSmallLargestObserved - 5, CreationTimePlus((0x29ff << 3))},
6667       {kSmallLargestObserved - 4, CreationTimePlus((0x29ff << 3))},
6668       {kSmallLargestObserved - 3, CreationTimePlus((0x29ff << 3))},
6669       {kSmallLargestObserved - 2, CreationTimePlus((0x29ff << 3))},
6670   };
6671   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6672   QuicFrames frames = {QuicFrame(&ack_frame)};
6673 
6674   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6675   ASSERT_TRUE(data != nullptr);
6676   std::unique_ptr<QuicEncryptedPacket> encrypted(
6677       EncryptPacketWithTagAndPhase(*data, 0, false));
6678   ASSERT_TRUE(encrypted);
6679   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6680   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6681   EXPECT_THAT(framer_.error(), IsQuicNoError());
6682 
6683   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6684   EXPECT_THAT(frame.received_packet_times,
6685               ContainerEq(PacketTimeVector{
6686                   {kSmallLargestObserved - 2, CreationTimePlus(0x29ff << 3)},
6687                   {kSmallLargestObserved - 3, CreationTimePlus(0x29ff << 3)},
6688                   {kSmallLargestObserved - 4, CreationTimePlus(0x29ff << 3)},
6689                   {kSmallLargestObserved - 5, CreationTimePlus(0x29ff << 3)},
6690               }));
6691 }
6692 
TEST_P(QuicFramerTest,AckReceiveTimestampsPacketOutOfOrder)6693 TEST_P(QuicFramerTest, AckReceiveTimestampsPacketOutOfOrder) {
6694   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6695     return;
6696   }
6697   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6698                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6699   framer_.SetKeyUpdateSupportForConnection(true);
6700   framer_.set_process_timestamps(true);
6701   framer_.set_max_receive_timestamps_per_ack(8);
6702   framer_.set_receive_timestamps_exponent(3);
6703 
6704   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6705   QuicPacketHeader header;
6706   header.destination_connection_id = FramerTestConnectionId();
6707   header.reset_flag = false;
6708   header.version_flag = false;
6709   header.packet_number = kPacketNumber;
6710 
6711   // Use kSmallLargestObserved to make this test finished in a short time.
6712   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6713 
6714   // The packet numbers below are out of order, this is impossible because we
6715   // don't record out of order packets in received_packet_times. The test is
6716   // intended to ensure this error is raised when it happens.
6717   ack_frame.received_packet_times = PacketTimeVector{
6718       {kSmallLargestObserved - 5, CreationTimePlus((0x29ff << 3))},
6719       {kSmallLargestObserved - 2, CreationTimePlus((0x29ff << 3))},
6720       {kSmallLargestObserved - 4, CreationTimePlus((0x29ff << 3))},
6721       {kSmallLargestObserved - 3, CreationTimePlus((0x29ff << 3))},
6722   };
6723   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6724   QuicFrames frames = {QuicFrame(&ack_frame)};
6725 
6726   EXPECT_QUIC_BUG(BuildDataPacket(header, frames),
6727                   "Packet number and/or receive time not in order.");
6728 }
6729 
6730 // If there's insufficient room for IETF ack receive timestamps, don't write any
6731 // timestamp ranges.
TEST_P(QuicFramerTest,IetfAckReceiveTimestampsTruncate)6732 TEST_P(QuicFramerTest, IetfAckReceiveTimestampsTruncate) {
6733   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6734     return;
6735   }
6736   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6737                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6738   framer_.SetKeyUpdateSupportForConnection(true);
6739   framer_.set_process_timestamps(true);
6740   framer_.set_max_receive_timestamps_per_ack(8192);
6741   framer_.set_receive_timestamps_exponent(3);
6742 
6743   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6744   QuicPacketHeader header;
6745   header.destination_connection_id = FramerTestConnectionId();
6746   header.reset_flag = false;
6747   header.version_flag = false;
6748   header.packet_number = kPacketNumber;
6749 
6750   // Use kSmallLargestObserved to make this test finished in a short time.
6751   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6752   for (QuicPacketNumber i(1); i <= kSmallLargestObserved; i += 2) {
6753     ack_frame.received_packet_times.push_back(
6754         {i, CreationTimePlus((0x29ff << 3))});
6755   }
6756 
6757   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6758   QuicFrames frames = {QuicFrame(&ack_frame)};
6759 
6760   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6761   ASSERT_TRUE(data != nullptr);
6762   std::unique_ptr<QuicEncryptedPacket> encrypted(
6763       EncryptPacketWithTagAndPhase(*data, 0, false));
6764   ASSERT_TRUE(encrypted);
6765   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6766   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6767   EXPECT_THAT(framer_.error(), IsQuicNoError());
6768 
6769   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6770   EXPECT_TRUE(frame.received_packet_times.empty());
6771 }
6772 
6773 // If there are too many ack ranges, they will be truncated to make room for a
6774 // timestamp range count of 0.
TEST_P(QuicFramerTest,IetfAckReceiveTimestampsAckRangeTruncation)6775 TEST_P(QuicFramerTest, IetfAckReceiveTimestampsAckRangeTruncation) {
6776   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6777     return;
6778   }
6779   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
6780   framer_.set_process_timestamps(true);
6781   framer_.set_max_receive_timestamps_per_ack(8);
6782   framer_.set_receive_timestamps_exponent(3);
6783 
6784   QuicPacketHeader header;
6785   header.destination_connection_id = FramerTestConnectionId();
6786   header.reset_flag = false;
6787   header.version_flag = false;
6788   header.packet_number = kPacketNumber;
6789 
6790   QuicAckFrame ack_frame;
6791   // Create a packet with just the ack.
6792   ack_frame = MakeAckFrameWithGaps(/*gap_size=*/0xffffffff,
6793                                    /*max_num_gaps=*/200,
6794                                    /*largest_acked=*/kMaxIetfVarInt);
6795   ack_frame.received_packet_times = PacketTimeVector{
6796       {QuicPacketNumber(kMaxIetfVarInt) - 2, CreationTimePlus((0x29ff << 3))},
6797   };
6798   QuicFrames frames = {QuicFrame(&ack_frame)};
6799   // Build an ACK packet.
6800   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6801   std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
6802   ASSERT_TRUE(raw_ack_packet != nullptr);
6803   char buffer[kMaxOutgoingPacketSize];
6804   size_t encrypted_length =
6805       framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
6806                              *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
6807   ASSERT_NE(0u, encrypted_length);
6808   // Now make sure we can turn our ack packet back into an ack frame.
6809   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6810   ASSERT_TRUE(framer_.ProcessPacket(
6811       QuicEncryptedPacket(buffer, encrypted_length, false)));
6812   ASSERT_EQ(1u, visitor_.ack_frames_.size());
6813   QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
6814   EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
6815             LargestAcked(processed_ack_frame));
6816   // Verify ACK ranges in the frame gets truncated.
6817   ASSERT_LT(processed_ack_frame.packets.NumPacketsSlow(),
6818             ack_frame.packets.NumIntervals());
6819   EXPECT_EQ(158u, processed_ack_frame.packets.NumPacketsSlow());
6820   EXPECT_LT(processed_ack_frame.packets.NumIntervals(),
6821             ack_frame.packets.NumIntervals());
6822   EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
6823             processed_ack_frame.packets.Max());
6824   // But the receive timestamps are not truncated because they are small.
6825   EXPECT_FALSE(processed_ack_frame.received_packet_times.empty());
6826 }
6827 
TEST_P(QuicFramerTest,BuildAckFramePacketOneAckBlockMaxLength)6828 TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlockMaxLength) {
6829   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6830   QuicPacketHeader header;
6831   header.destination_connection_id = FramerTestConnectionId();
6832   header.reset_flag = false;
6833   header.version_flag = false;
6834   header.packet_number = kPacketNumber;
6835 
6836   QuicAckFrame ack_frame = InitAckFrame(kPacketNumber);
6837   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6838 
6839   QuicFrames frames = {QuicFrame(&ack_frame)};
6840 
6841   // clang-format off
6842   unsigned char packet[] = {
6843       // type (short header, 4 byte packet number)
6844       0x43,
6845       // connection_id
6846       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6847       // packet number
6848       0x12, 0x34, 0x56, 0x78,
6849 
6850       // frame type (ack frame)
6851       // (no ack blocks, 4 byte largest observed, 4 byte block length)
6852       0x4A,
6853       // largest acked
6854       0x12, 0x34, 0x56, 0x78,
6855       // Zero delta time.
6856       0x00, 0x00,
6857       // first ack block length.
6858       0x12, 0x34, 0x56, 0x78,
6859       // num timestamps.
6860       0x00,
6861   };
6862 
6863 
6864   unsigned char packet_ietf[] = {
6865       // type (short header, 4 byte packet number)
6866       0x43,
6867       // connection_id
6868       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6869       // packet number
6870       0x12, 0x34, 0x56, 0x78,
6871 
6872       // frame type (IETF_ACK frame)
6873       0x02,
6874       // largest acked
6875       kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
6876       // Zero delta time.
6877       kVarInt62OneByte + 0x00,
6878       // Nr. of additional ack blocks
6879       kVarInt62OneByte + 0x00,
6880       // first ack block length.
6881       kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
6882   };
6883   // clang-format on
6884   unsigned char* p = packet;
6885   size_t p_size = ABSL_ARRAYSIZE(packet);
6886   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
6887     p = packet_ietf;
6888     p_size = ABSL_ARRAYSIZE(packet_ietf);
6889   }
6890 
6891   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6892   ASSERT_TRUE(data != nullptr);
6893   quiche::test::CompareCharArraysWithHexError(
6894       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
6895 }
6896 
TEST_P(QuicFramerTest,BuildAckFramePacketMultipleAckBlocks)6897 TEST_P(QuicFramerTest, BuildAckFramePacketMultipleAckBlocks) {
6898   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6899   QuicPacketHeader header;
6900   header.destination_connection_id = FramerTestConnectionId();
6901   header.reset_flag = false;
6902   header.version_flag = false;
6903   header.packet_number = kPacketNumber;
6904 
6905   // Use kSmallLargestObserved to make this test finished in a short time.
6906   QuicAckFrame ack_frame =
6907       InitAckFrame({{QuicPacketNumber(1), QuicPacketNumber(5)},
6908                     {QuicPacketNumber(10), QuicPacketNumber(500)},
6909                     {QuicPacketNumber(900), kSmallMissingPacket},
6910                     {kSmallMissingPacket + 1, kSmallLargestObserved + 1}});
6911   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6912 
6913   QuicFrames frames = {QuicFrame(&ack_frame)};
6914 
6915   // clang-format off
6916   unsigned char packet[] = {
6917       // type (short header, 4 byte packet number)
6918       0x43,
6919       // connection_id
6920       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6921       // packet number
6922       0x12, 0x34, 0x56, 0x78,
6923 
6924       // frame type (ack frame)
6925       // (has ack blocks, 2 byte largest observed, 2 byte block length)
6926       0x65,
6927       // largest acked
6928       0x12, 0x34,
6929       // Zero delta time.
6930       0x00, 0x00,
6931       // num ack blocks ranges.
6932       0x04,
6933       // first ack block length.
6934       0x00, 0x01,
6935       // gap to next block.
6936       0x01,
6937       // ack block length.
6938       0x0e, 0xaf,
6939       // gap to next block.
6940       0xff,
6941       // ack block length.
6942       0x00, 0x00,
6943       // gap to next block.
6944       0x91,
6945       // ack block length.
6946       0x01, 0xea,
6947       // gap to next block.
6948       0x05,
6949       // ack block length.
6950       0x00, 0x04,
6951       // num timestamps.
6952       0x00,
6953   };
6954 
6955   unsigned char packet_ietf[] = {
6956       // type (short header, 4 byte packet number)
6957       0x43,
6958       // connection_id
6959       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6960       // packet number
6961       0x12, 0x34, 0x56, 0x78,
6962 
6963       // frame type (IETF_ACK frame)
6964       0x02,
6965       // largest acked
6966       kVarInt62TwoBytes + 0x12, 0x34,
6967       // Zero delta time.
6968       kVarInt62OneByte + 0x00,
6969       // num additional ack blocks.
6970       kVarInt62OneByte + 0x03,
6971       // first ack block length.
6972       kVarInt62OneByte + 0x00,
6973 
6974       // gap to next block.
6975       kVarInt62OneByte + 0x00,
6976       // ack block length.
6977       kVarInt62TwoBytes + 0x0e, 0xae,
6978 
6979       // gap to next block.
6980       kVarInt62TwoBytes + 0x01, 0x8f,
6981       // ack block length.
6982       kVarInt62TwoBytes + 0x01, 0xe9,
6983 
6984       // gap to next block.
6985       kVarInt62OneByte + 0x04,
6986       // ack block length.
6987       kVarInt62OneByte + 0x03,
6988   };
6989   // clang-format on
6990   unsigned char* p = packet;
6991   size_t p_size = ABSL_ARRAYSIZE(packet);
6992   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
6993     p = packet_ietf;
6994     p_size = ABSL_ARRAYSIZE(packet_ietf);
6995   }
6996 
6997   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6998   ASSERT_TRUE(data != nullptr);
6999 
7000   quiche::test::CompareCharArraysWithHexError(
7001       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7002 }
7003 
TEST_P(QuicFramerTest,BuildAckFramePacketMaxAckBlocks)7004 TEST_P(QuicFramerTest, BuildAckFramePacketMaxAckBlocks) {
7005   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7006   QuicPacketHeader header;
7007   header.destination_connection_id = FramerTestConnectionId();
7008   header.reset_flag = false;
7009   header.version_flag = false;
7010   header.packet_number = kPacketNumber;
7011 
7012   // Use kSmallLargestObservedto make this test finished in a short time.
7013   QuicAckFrame ack_frame;
7014   ack_frame.largest_acked = kSmallLargestObserved;
7015   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
7016   // 300 ack blocks.
7017   for (size_t i = 2; i < 2 * 300; i += 2) {
7018     ack_frame.packets.Add(QuicPacketNumber(i));
7019   }
7020   ack_frame.packets.AddRange(QuicPacketNumber(600), kSmallLargestObserved + 1);
7021 
7022   QuicFrames frames = {QuicFrame(&ack_frame)};
7023 
7024   // clang-format off
7025   unsigned char packet[] = {
7026       // type (short header, 4 byte packet number)
7027       0x43,
7028       // connection_id
7029       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7030       // packet number
7031       0x12, 0x34, 0x56, 0x78,
7032       // frame type (ack frame)
7033       // (has ack blocks, 2 byte largest observed, 2 byte block length)
7034       0x65,
7035       // largest acked
7036       0x12, 0x34,
7037       // Zero delta time.
7038       0x00, 0x00,
7039       // num ack blocks ranges.
7040       0xff,
7041       // first ack block length.
7042       0x0f, 0xdd,
7043       // 255 = 4 * 63 + 3
7044       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7045       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7046       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7047       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7048       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7049       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7050       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7051       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7052       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7053       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7054 
7055       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7056       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7057       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7058       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7059       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7060       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7061       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7062       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7063       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7064       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7065 
7066       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7067       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7068       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7069       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7070       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7071       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7072       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7073       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7074       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7075       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7076 
7077       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7078       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7079       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7080       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7081       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7082       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7083       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7084       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7085       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7086       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7087 
7088       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7089       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7090       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7091       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7092       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7093       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7094       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7095       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7096       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7097       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7098 
7099       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7100       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7101       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7102       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7103       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7104       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7105       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7106       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7107       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7108       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7109 
7110       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7111       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7112       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7113       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7114       // num timestamps.
7115       0x00,
7116   };
7117 
7118   unsigned char packet_ietf[] = {
7119       // type (short header, 4 byte packet number)
7120       0x43,
7121       // connection_id
7122       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7123       // packet number
7124       0x12, 0x34, 0x56, 0x78,
7125       // frame type (IETF_ACK frame)
7126       0x02,
7127       // largest acked
7128       kVarInt62TwoBytes + 0x12, 0x34,
7129       // Zero delta time.
7130       kVarInt62OneByte + 0x00,
7131       // num ack blocks ranges.
7132       kVarInt62TwoBytes + 0x01, 0x2b,
7133       // first ack block length.
7134       kVarInt62TwoBytes + 0x0f, 0xdc,
7135       // 255 added blocks of gap_size == 1, ack_size == 1
7136 #define V99AddedBLOCK kVarInt62OneByte + 0x00, kVarInt62OneByte + 0x00
7137       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7138       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7139       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7140       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7141       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7142       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7143       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7144       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7145       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7146       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7147       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7148       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7149       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7150       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7151       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7152       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7153       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7154       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7155       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7156       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7157 
7158       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7159       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7160       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7161       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7162       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7163       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7164       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7165       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7166       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7167       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7168       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7169       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7170       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7171       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7172       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7173       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7174       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7175       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7176       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7177       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7178 
7179       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7180       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7181       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7182       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7183       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7184       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7185       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7186       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7187       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7188       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7189       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7190       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7191       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7192       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7193       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7194       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7195       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7196       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7197       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7198       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7199 
7200 #undef V99AddedBLOCK
7201   };
7202   // clang-format on
7203   unsigned char* p = packet;
7204   size_t p_size = ABSL_ARRAYSIZE(packet);
7205   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7206     p = packet_ietf;
7207     p_size = ABSL_ARRAYSIZE(packet_ietf);
7208   }
7209 
7210   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7211   ASSERT_TRUE(data != nullptr);
7212 
7213   quiche::test::CompareCharArraysWithHexError(
7214       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7215 }
7216 
TEST_P(QuicFramerTest,BuildRstFramePacketQuic)7217 TEST_P(QuicFramerTest, BuildRstFramePacketQuic) {
7218   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7219   QuicPacketHeader header;
7220   header.destination_connection_id = FramerTestConnectionId();
7221   header.reset_flag = false;
7222   header.version_flag = false;
7223   header.packet_number = kPacketNumber;
7224 
7225   QuicRstStreamFrame rst_frame;
7226   rst_frame.stream_id = kStreamId;
7227   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7228     rst_frame.ietf_error_code = 0x01;
7229   } else {
7230     rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708);
7231   }
7232   rst_frame.byte_offset = 0x0807060504030201;
7233 
7234   // clang-format off
7235   unsigned char packet[] = {
7236     // type (short packet, 4 byte packet number)
7237     0x43,
7238     // connection_id
7239     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7240     // packet number
7241     0x12, 0x34, 0x56, 0x78,
7242 
7243     // frame type (rst stream frame)
7244     0x01,
7245     // stream id
7246     0x01, 0x02, 0x03, 0x04,
7247     // sent byte offset
7248     0x08, 0x07, 0x06, 0x05,
7249     0x04, 0x03, 0x02, 0x01,
7250     // error code
7251     0x05, 0x06, 0x07, 0x08,
7252   };
7253 
7254   unsigned char packet_ietf[] = {
7255     // type (short packet, 4 byte packet number)
7256     0x43,
7257     // connection_id
7258     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7259     // packet number
7260     0x12, 0x34, 0x56, 0x78,
7261 
7262     // frame type (IETF_RST_STREAM frame)
7263     0x04,
7264     // stream id
7265     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
7266     // error code
7267     kVarInt62OneByte + 0x01,
7268     // sent byte offset
7269     kVarInt62EightBytes + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01
7270   };
7271   // clang-format on
7272 
7273   QuicFrames frames = {QuicFrame(&rst_frame)};
7274 
7275   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7276   ASSERT_TRUE(data != nullptr);
7277 
7278   unsigned char* p = packet;
7279   size_t p_size = ABSL_ARRAYSIZE(packet);
7280   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7281     p = packet_ietf;
7282     p_size = ABSL_ARRAYSIZE(packet_ietf);
7283   }
7284   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
7285 
7286   quiche::test::CompareCharArraysWithHexError(
7287       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7288 }
7289 
TEST_P(QuicFramerTest,BuildCloseFramePacket)7290 TEST_P(QuicFramerTest, BuildCloseFramePacket) {
7291   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7292   QuicPacketHeader header;
7293   header.destination_connection_id = FramerTestConnectionId();
7294   header.reset_flag = false;
7295   header.version_flag = false;
7296   header.packet_number = kPacketNumber;
7297 
7298   QuicConnectionCloseFrame close_frame(framer_.transport_version(),
7299                                        QUIC_INTERNAL_ERROR, NO_IETF_QUIC_ERROR,
7300                                        "because I can", 0x05);
7301   QuicFrames frames = {QuicFrame(&close_frame)};
7302 
7303   // clang-format off
7304   unsigned char packet[] = {
7305     // type (short header, 4 byte packet number)
7306     0x43,
7307     // connection_id
7308     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7309     // packet number
7310     0x12, 0x34, 0x56, 0x78,
7311 
7312     // frame type (connection close frame)
7313     0x02,
7314     // error code
7315     0x00, 0x00, 0x00, 0x01,
7316     // error details length
7317     0x00, 0x0d,
7318     // error details
7319     'b',  'e',  'c',  'a',
7320     'u',  's',  'e',  ' ',
7321     'I',  ' ',  'c',  'a',
7322     'n',
7323   };
7324 
7325   unsigned char packet_ietf[] = {
7326     // type (short header, 4 byte packet number)
7327     0x43,
7328     // connection_id
7329     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7330     // packet number
7331     0x12, 0x34, 0x56, 0x78,
7332 
7333     // frame type (IETF_CONNECTION_CLOSE frame)
7334     0x1c,
7335     // error code
7336     kVarInt62OneByte + 0x01,
7337     // Frame type within the CONNECTION_CLOSE frame
7338     kVarInt62OneByte + 0x05,
7339     // error details length
7340     kVarInt62OneByte + 0x0f,
7341     // error details
7342     '1',  ':',  'b',  'e',
7343     'c',  'a',  'u',  's',
7344     'e',  ' ',  'I',  ' ',
7345     'c',  'a',  'n',
7346   };
7347   // clang-format on
7348 
7349   unsigned char* p = packet;
7350   size_t p_size = ABSL_ARRAYSIZE(packet);
7351   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7352     p = packet_ietf;
7353     p_size = ABSL_ARRAYSIZE(packet_ietf);
7354   }
7355 
7356   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7357   ASSERT_TRUE(data != nullptr);
7358 
7359   quiche::test::CompareCharArraysWithHexError(
7360       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7361 }
7362 
TEST_P(QuicFramerTest,BuildCloseFramePacketExtendedInfo)7363 TEST_P(QuicFramerTest, BuildCloseFramePacketExtendedInfo) {
7364   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7365   QuicPacketHeader header;
7366   header.destination_connection_id = FramerTestConnectionId();
7367   header.reset_flag = false;
7368   header.version_flag = false;
7369   header.packet_number = kPacketNumber;
7370 
7371   QuicConnectionCloseFrame close_frame(
7372       framer_.transport_version(),
7373       static_cast<QuicErrorCode>(
7374           VersionHasIetfQuicFrames(framer_.transport_version()) ? 0x01
7375                                                                 : 0x05060708),
7376       NO_IETF_QUIC_ERROR, "because I can", 0x05);
7377   // Set this so that it is "there" for both Google QUIC and IETF QUIC
7378   // framing. It better not show up for Google QUIC!
7379   close_frame.quic_error_code = static_cast<QuicErrorCode>(0x4567);
7380 
7381   QuicFrames frames = {QuicFrame(&close_frame)};
7382 
7383   // clang-format off
7384   unsigned char packet[] = {
7385     // type (short header, 4 byte packet number)
7386     0x43,
7387     // connection_id
7388     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7389     // packet number
7390     0x12, 0x34, 0x56, 0x78,
7391 
7392     // frame type (connection close frame)
7393     0x02,
7394     // error code
7395     0x05, 0x06, 0x07, 0x08,
7396     // error details length
7397     0x00, 0x0d,
7398     // error details
7399     'b',  'e',  'c',  'a',
7400     'u',  's',  'e',  ' ',
7401     'I',  ' ',  'c',  'a',
7402     'n',
7403   };
7404 
7405   unsigned char packet_ietf[] = {
7406     // type (short header, 4 byte packet number)
7407     0x43,
7408     // connection_id
7409     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7410     // packet number
7411     0x12, 0x34, 0x56, 0x78,
7412 
7413     // frame type (IETF_CONNECTION_CLOSE frame)
7414     0x1c,
7415     // IETF error code INTERNAL_ERROR = 0x01 corresponding to
7416     // QuicErrorCode::QUIC_INTERNAL_ERROR = 0x01.
7417     kVarInt62OneByte + 0x01,
7418     // Frame type within the CONNECTION_CLOSE frame
7419     kVarInt62OneByte + 0x05,
7420     // error details length
7421     kVarInt62OneByte + 0x13,
7422     // error details
7423     '1',  '7',  '7',  '6',
7424     '7',  ':',  'b',  'e',
7425     'c',  'a',  'u',  's',
7426     'e',  ' ',  'I',  ' ',
7427     'c',  'a',  'n'
7428   };
7429   // clang-format on
7430 
7431   unsigned char* p = packet;
7432   size_t p_size = ABSL_ARRAYSIZE(packet);
7433   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7434     p = packet_ietf;
7435     p_size = ABSL_ARRAYSIZE(packet_ietf);
7436   }
7437 
7438   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7439   ASSERT_TRUE(data != nullptr);
7440 
7441   quiche::test::CompareCharArraysWithHexError(
7442       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7443 }
7444 
TEST_P(QuicFramerTest,BuildTruncatedCloseFramePacket)7445 TEST_P(QuicFramerTest, BuildTruncatedCloseFramePacket) {
7446   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7447   QuicPacketHeader header;
7448   header.destination_connection_id = FramerTestConnectionId();
7449   header.reset_flag = false;
7450   header.version_flag = false;
7451   header.packet_number = kPacketNumber;
7452 
7453   QuicConnectionCloseFrame close_frame(framer_.transport_version(),
7454                                        QUIC_INTERNAL_ERROR, NO_IETF_QUIC_ERROR,
7455                                        std::string(2048, 'A'), 0x05);
7456   QuicFrames frames = {QuicFrame(&close_frame)};
7457 
7458   // clang-format off
7459   unsigned char packet[] = {
7460     // type (short header, 4 byte packet number)
7461     0x43,
7462     // connection_id
7463     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7464     // packet number
7465     0x12, 0x34, 0x56, 0x78,
7466 
7467     // frame type (connection close frame)
7468     0x02,
7469     // error code
7470     0x00, 0x00, 0x00, 0x01,
7471     // error details length
7472     0x01, 0x00,
7473     // error details (truncated to 256 bytes)
7474     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7475     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7476     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7477     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7478     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7479     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7480     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7481     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7482     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7483     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7484     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7485     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7486     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7487     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7488     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7489     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7490     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7491     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7492     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7493     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7494     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7495     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7496     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7497     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7498     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7499     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7500     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7501     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7502     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7503     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7504     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7505     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7506   };
7507 
7508   unsigned char packet_ietf[] = {
7509     // type (short header, 4 byte packet number)
7510     0x43,
7511     // connection_id
7512     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7513     // packet number
7514     0x12, 0x34, 0x56, 0x78,
7515 
7516     // frame type (IETF_CONNECTION_CLOSE frame)
7517     0x1c,
7518     // error code
7519     kVarInt62OneByte + 0x01,
7520     // Frame type within the CONNECTION_CLOSE frame
7521     kVarInt62OneByte + 0x05,
7522     // error details length
7523     kVarInt62TwoBytes + 0x01, 0x00,
7524     // error details (truncated to 256 bytes)
7525     '1',  ':',  'A',  'A',  'A',  'A',  'A',  'A',
7526     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7527     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7528     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7529     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7530     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7531     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7532     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7533     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7534     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7535     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7536     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7537     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7538     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7539     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7540     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7541     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7542     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7543     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7544     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7545     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7546     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7547     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7548     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7549     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7550     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7551     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7552     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7553     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7554     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7555     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7556     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7557   };
7558   // clang-format on
7559 
7560   unsigned char* p = packet;
7561   size_t p_size = ABSL_ARRAYSIZE(packet);
7562   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7563     p = packet_ietf;
7564     p_size = ABSL_ARRAYSIZE(packet_ietf);
7565   }
7566 
7567   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7568   ASSERT_TRUE(data != nullptr);
7569 
7570   quiche::test::CompareCharArraysWithHexError(
7571       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7572 }
7573 
TEST_P(QuicFramerTest,BuildApplicationCloseFramePacket)7574 TEST_P(QuicFramerTest, BuildApplicationCloseFramePacket) {
7575   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
7576     // This frame is only for IETF QUIC.
7577     return;
7578   }
7579   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7580   QuicPacketHeader header;
7581   header.destination_connection_id = FramerTestConnectionId();
7582   header.reset_flag = false;
7583   header.version_flag = false;
7584   header.packet_number = kPacketNumber;
7585 
7586   QuicConnectionCloseFrame app_close_frame;
7587   app_close_frame.wire_error_code = 0x11;
7588   app_close_frame.error_details = "because I can";
7589   app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
7590 
7591   QuicFrames frames = {QuicFrame(&app_close_frame)};
7592 
7593   // clang-format off
7594 
7595   unsigned char packet_ietf[] = {
7596     // type (short header, 4 byte packet number)
7597     0x43,
7598     // connection_id
7599     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7600     // packet number
7601     0x12, 0x34, 0x56, 0x78,
7602 
7603     // frame type (IETF_APPLICATION_CLOSE frame)
7604     0x1d,
7605     // error code
7606     kVarInt62OneByte + 0x11,
7607     // error details length
7608     kVarInt62OneByte + 0x0f,
7609     // error details, note that it includes an extended error code.
7610     '0',  ':',  'b',  'e',
7611     'c',  'a',  'u',  's',
7612     'e',  ' ',  'I',  ' ',
7613     'c',  'a',  'n',
7614   };
7615   // clang-format on
7616 
7617   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7618   ASSERT_TRUE(data != nullptr);
7619 
7620   quiche::test::CompareCharArraysWithHexError(
7621       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
7622       ABSL_ARRAYSIZE(packet_ietf));
7623 }
7624 
TEST_P(QuicFramerTest,BuildTruncatedApplicationCloseFramePacket)7625 TEST_P(QuicFramerTest, BuildTruncatedApplicationCloseFramePacket) {
7626   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
7627     // This frame is only for IETF QUIC.
7628     return;
7629   }
7630   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7631   QuicPacketHeader header;
7632   header.destination_connection_id = FramerTestConnectionId();
7633   header.reset_flag = false;
7634   header.version_flag = false;
7635   header.packet_number = kPacketNumber;
7636 
7637   QuicConnectionCloseFrame app_close_frame;
7638   app_close_frame.wire_error_code = 0x11;
7639   app_close_frame.error_details = std::string(2048, 'A');
7640   app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
7641   // Setting to missing ensures that if it is missing, the extended
7642   // code is not added to the text message.
7643   app_close_frame.quic_error_code = QUIC_IETF_GQUIC_ERROR_MISSING;
7644 
7645   QuicFrames frames = {QuicFrame(&app_close_frame)};
7646 
7647   // clang-format off
7648   unsigned char packet_ietf[] = {
7649     // type (short header, 4 byte packet number)
7650     0x43,
7651     // connection_id
7652     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7653     // packet number
7654     0x12, 0x34, 0x56, 0x78,
7655 
7656     // frame type (IETF_APPLICATION_CLOSE frame)
7657     0x1d,
7658     // error code
7659     kVarInt62OneByte + 0x11,
7660     // error details length
7661     kVarInt62TwoBytes + 0x01, 0x00,
7662     // error details (truncated to 256 bytes)
7663     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7664     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7665     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7666     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7667     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7668     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7669     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7670     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7671     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7672     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7673     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7674     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7675     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7676     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7677     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7678     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7679     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7680     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7681     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7682     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7683     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7684     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7685     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7686     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7687     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7688     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7689     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7690     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7691     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7692     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7693     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7694     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7695   };
7696   // clang-format on
7697 
7698   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7699   ASSERT_TRUE(data != nullptr);
7700 
7701   quiche::test::CompareCharArraysWithHexError(
7702       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
7703       ABSL_ARRAYSIZE(packet_ietf));
7704 }
7705 
TEST_P(QuicFramerTest,BuildGoAwayPacket)7706 TEST_P(QuicFramerTest, BuildGoAwayPacket) {
7707   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7708     // This frame is only for Google QUIC.
7709     return;
7710   }
7711   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7712   QuicPacketHeader header;
7713   header.destination_connection_id = FramerTestConnectionId();
7714   header.reset_flag = false;
7715   header.version_flag = false;
7716   header.packet_number = kPacketNumber;
7717 
7718   QuicGoAwayFrame goaway_frame;
7719   goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
7720   goaway_frame.last_good_stream_id = kStreamId;
7721   goaway_frame.reason_phrase = "because I can";
7722 
7723   QuicFrames frames = {QuicFrame(&goaway_frame)};
7724 
7725   // clang-format off
7726   unsigned char packet[] = {
7727     // type (short header, 4 byte packet number)
7728     0x43,
7729     // connection_id
7730     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7731     // packet number
7732     0x12, 0x34, 0x56, 0x78,
7733 
7734     // frame type (go away frame)
7735     0x03,
7736     // error code
7737     0x05, 0x06, 0x07, 0x08,
7738     // stream id
7739     0x01, 0x02, 0x03, 0x04,
7740     // error details length
7741     0x00, 0x0d,
7742     // error details
7743     'b',  'e',  'c',  'a',
7744     'u',  's',  'e',  ' ',
7745     'I',  ' ',  'c',  'a',
7746     'n',
7747   };
7748 
7749   // clang-format on
7750   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7751   ASSERT_TRUE(data != nullptr);
7752 
7753   quiche::test::CompareCharArraysWithHexError(
7754       "constructed packet", data->data(), data->length(), AsChars(packet),
7755       ABSL_ARRAYSIZE(packet));
7756 }
7757 
TEST_P(QuicFramerTest,BuildTruncatedGoAwayPacket)7758 TEST_P(QuicFramerTest, BuildTruncatedGoAwayPacket) {
7759   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7760     // This frame is only for Google QUIC.
7761     return;
7762   }
7763   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7764   QuicPacketHeader header;
7765   header.destination_connection_id = FramerTestConnectionId();
7766   header.reset_flag = false;
7767   header.version_flag = false;
7768   header.packet_number = kPacketNumber;
7769 
7770   QuicGoAwayFrame goaway_frame;
7771   goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
7772   goaway_frame.last_good_stream_id = kStreamId;
7773   goaway_frame.reason_phrase = std::string(2048, 'A');
7774 
7775   QuicFrames frames = {QuicFrame(&goaway_frame)};
7776 
7777   // clang-format off
7778   unsigned char packet[] = {
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 (go away frame)
7787     0x03,
7788     // error code
7789     0x05, 0x06, 0x07, 0x08,
7790     // stream id
7791     0x01, 0x02, 0x03, 0x04,
7792     // error details length
7793     0x01, 0x00,
7794     // error details (truncated to 256 bytes)
7795     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7796     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7797     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7798     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7799     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7800     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7801     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7802     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7803     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7804     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7805     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7806     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7807     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7808     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7809     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7810     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7811     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7812     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7813     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7814     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7815     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7816     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7817     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7818     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7819     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7820     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7821     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7822     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7823     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7824     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7825     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7826     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7827   };
7828   // clang-format on
7829 
7830   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7831   ASSERT_TRUE(data != nullptr);
7832 
7833   quiche::test::CompareCharArraysWithHexError(
7834       "constructed packet", data->data(), data->length(), AsChars(packet),
7835       ABSL_ARRAYSIZE(packet));
7836 }
7837 
TEST_P(QuicFramerTest,BuildWindowUpdatePacket)7838 TEST_P(QuicFramerTest, BuildWindowUpdatePacket) {
7839   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7840   QuicPacketHeader header;
7841   header.destination_connection_id = FramerTestConnectionId();
7842   header.reset_flag = false;
7843   header.version_flag = false;
7844   header.packet_number = kPacketNumber;
7845 
7846   QuicWindowUpdateFrame window_update_frame;
7847   window_update_frame.stream_id = kStreamId;
7848   window_update_frame.max_data = 0x1122334455667788;
7849 
7850   QuicFrames frames = {QuicFrame(window_update_frame)};
7851 
7852   // clang-format off
7853   unsigned char packet[] = {
7854     // type (short header, 4 byte packet number)
7855     0x43,
7856     // connection_id
7857     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7858     // packet number
7859     0x12, 0x34, 0x56, 0x78,
7860 
7861     // frame type (window update frame)
7862     0x04,
7863     // stream id
7864     0x01, 0x02, 0x03, 0x04,
7865     // byte offset
7866     0x11, 0x22, 0x33, 0x44,
7867     0x55, 0x66, 0x77, 0x88,
7868   };
7869 
7870   unsigned char packet_ietf[] = {
7871     // type (short header, 4 byte packet number)
7872     0x43,
7873     // connection_id
7874     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7875     // packet number
7876     0x12, 0x34, 0x56, 0x78,
7877 
7878     // frame type (IETF_MAX_STREAM_DATA frame)
7879     0x11,
7880     // stream id
7881     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
7882     // byte offset
7883     kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
7884     0x55, 0x66, 0x77, 0x88,
7885   };
7886   // clang-format on
7887 
7888   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7889   ASSERT_TRUE(data != nullptr);
7890 
7891   unsigned char* p = packet;
7892   size_t p_size = ABSL_ARRAYSIZE(packet);
7893   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7894     p = packet_ietf;
7895     p_size = ABSL_ARRAYSIZE(packet_ietf);
7896   }
7897 
7898   quiche::test::CompareCharArraysWithHexError(
7899       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7900 }
7901 
TEST_P(QuicFramerTest,BuildMaxStreamDataPacket)7902 TEST_P(QuicFramerTest, BuildMaxStreamDataPacket) {
7903   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
7904     // This frame is only for IETF QUIC.
7905     return;
7906   }
7907   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7908   QuicPacketHeader header;
7909   header.destination_connection_id = FramerTestConnectionId();
7910   header.reset_flag = false;
7911   header.version_flag = false;
7912   header.packet_number = kPacketNumber;
7913 
7914   QuicWindowUpdateFrame window_update_frame;
7915   window_update_frame.stream_id = kStreamId;
7916   window_update_frame.max_data = 0x1122334455667788;
7917 
7918   QuicFrames frames = {QuicFrame(window_update_frame)};
7919 
7920   // clang-format off
7921   unsigned char packet_ietf[] = {
7922     // type (short header, 4 byte packet number)
7923     0x43,
7924     // connection_id
7925     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7926     // packet number
7927     0x12, 0x34, 0x56, 0x78,
7928 
7929     // frame type (IETF_MAX_STREAM_DATA frame)
7930     0x11,
7931     // stream id
7932     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
7933     // byte offset
7934     kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
7935     0x55, 0x66, 0x77, 0x88,
7936   };
7937   // clang-format on
7938 
7939   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7940   ASSERT_TRUE(data != nullptr);
7941 
7942   quiche::test::CompareCharArraysWithHexError(
7943       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
7944       ABSL_ARRAYSIZE(packet_ietf));
7945 }
7946 
TEST_P(QuicFramerTest,BuildMaxDataPacket)7947 TEST_P(QuicFramerTest, BuildMaxDataPacket) {
7948   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
7949     // This frame is only for IETF QUIC.
7950     return;
7951   }
7952   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7953   QuicPacketHeader header;
7954   header.destination_connection_id = FramerTestConnectionId();
7955   header.reset_flag = false;
7956   header.version_flag = false;
7957   header.packet_number = kPacketNumber;
7958 
7959   QuicWindowUpdateFrame window_update_frame;
7960   window_update_frame.stream_id =
7961       QuicUtils::GetInvalidStreamId(framer_.transport_version());
7962   window_update_frame.max_data = 0x1122334455667788;
7963 
7964   QuicFrames frames = {QuicFrame(window_update_frame)};
7965 
7966   // clang-format off
7967   unsigned char packet_ietf[] = {
7968     // type (short header, 4 byte packet number)
7969     0x43,
7970     // connection_id
7971     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7972     // packet number
7973     0x12, 0x34, 0x56, 0x78,
7974 
7975     // frame type (IETF_MAX_DATA frame)
7976     0x10,
7977     // byte offset
7978     kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
7979     0x55, 0x66, 0x77, 0x88,
7980   };
7981   // clang-format on
7982 
7983   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7984   ASSERT_TRUE(data != nullptr);
7985 
7986   quiche::test::CompareCharArraysWithHexError(
7987       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
7988       ABSL_ARRAYSIZE(packet_ietf));
7989 }
7990 
TEST_P(QuicFramerTest,BuildBlockedPacket)7991 TEST_P(QuicFramerTest, BuildBlockedPacket) {
7992   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7993   QuicPacketHeader header;
7994   header.destination_connection_id = FramerTestConnectionId();
7995   header.reset_flag = false;
7996   header.version_flag = false;
7997   header.packet_number = kPacketNumber;
7998 
7999   QuicBlockedFrame blocked_frame;
8000   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8001     // For IETF QUIC, the stream ID must be <invalid> for the frame
8002     // to be a BLOCKED frame. if it's valid, it will be a
8003     // STREAM_BLOCKED frame.
8004     blocked_frame.stream_id =
8005         QuicUtils::GetInvalidStreamId(framer_.transport_version());
8006   } else {
8007     blocked_frame.stream_id = kStreamId;
8008   }
8009   blocked_frame.offset = kStreamOffset;
8010 
8011   QuicFrames frames = {QuicFrame(blocked_frame)};
8012 
8013   // clang-format off
8014   unsigned char packet[] = {
8015     // type (short packet, 4 byte packet number)
8016     0x43,
8017     // connection_id
8018     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8019     // packet number
8020     0x12, 0x34, 0x56, 0x78,
8021 
8022     // frame type (blocked frame)
8023     0x05,
8024     // stream id
8025     0x01, 0x02, 0x03, 0x04,
8026   };
8027 
8028   unsigned char packet_ietf[] = {
8029     // type (short packet, 4 byte packet number)
8030     0x43,
8031     // connection_id
8032     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8033     // packet number
8034     0x12, 0x34, 0x56, 0x78,
8035 
8036     // frame type (IETF_DATA_BLOCKED frame)
8037     0x14,
8038     // Offset
8039     kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
8040   };
8041   // clang-format on
8042 
8043   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8044   ASSERT_TRUE(data != nullptr);
8045 
8046   unsigned char* p = packet;
8047   size_t p_size = ABSL_ARRAYSIZE(packet);
8048   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8049     p = packet_ietf;
8050     p_size = ABSL_ARRAYSIZE(packet_ietf);
8051   }
8052 
8053   quiche::test::CompareCharArraysWithHexError(
8054       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
8055 }
8056 
TEST_P(QuicFramerTest,BuildPingPacket)8057 TEST_P(QuicFramerTest, BuildPingPacket) {
8058   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8059   QuicPacketHeader header;
8060   header.destination_connection_id = FramerTestConnectionId();
8061   header.reset_flag = false;
8062   header.version_flag = false;
8063   header.packet_number = kPacketNumber;
8064 
8065   QuicFrames frames = {QuicFrame(QuicPingFrame())};
8066 
8067   // clang-format off
8068   unsigned char packet[] = {
8069     // type (short header, 4 byte packet number)
8070     0x43,
8071     // connection_id
8072     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8073     // packet number
8074     0x12, 0x34, 0x56, 0x78,
8075 
8076     // frame type
8077     0x07,
8078   };
8079 
8080   unsigned char packet_ietf[] = {
8081     // type (short header, 4 byte packet number)
8082     0x43,
8083     // connection_id
8084     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8085     // packet number
8086     0x12, 0x34, 0x56, 0x78,
8087 
8088     // frame type (IETF_PING frame)
8089     0x01,
8090   };
8091   // clang-format on
8092 
8093   unsigned char* p = packet;
8094   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8095     p = packet_ietf;
8096   }
8097 
8098   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8099   ASSERT_TRUE(data != nullptr);
8100 
8101   quiche::test::CompareCharArraysWithHexError(
8102       "constructed packet", data->data(), data->length(), AsChars(p),
8103       ABSL_ARRAYSIZE(packet));
8104 }
8105 
TEST_P(QuicFramerTest,BuildHandshakeDonePacket)8106 TEST_P(QuicFramerTest, BuildHandshakeDonePacket) {
8107   QuicPacketHeader header;
8108   header.destination_connection_id = FramerTestConnectionId();
8109   header.reset_flag = false;
8110   header.version_flag = false;
8111   header.packet_number = kPacketNumber;
8112 
8113   QuicFrames frames = {QuicFrame(QuicHandshakeDoneFrame())};
8114 
8115   // clang-format off
8116   unsigned char packet[] = {
8117     // type (short header, 4 byte packet number)
8118     0x43,
8119     // connection_id
8120     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8121     // packet number
8122     0x12, 0x34, 0x56, 0x78,
8123 
8124     // frame type (Handshake done frame)
8125     0x1e,
8126   };
8127   // clang-format on
8128   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8129     return;
8130   }
8131 
8132   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8133   ASSERT_TRUE(data != nullptr);
8134 
8135   quiche::test::CompareCharArraysWithHexError(
8136       "constructed packet", data->data(), data->length(), AsChars(packet),
8137       ABSL_ARRAYSIZE(packet));
8138 }
8139 
TEST_P(QuicFramerTest,BuildAckFrequencyPacket)8140 TEST_P(QuicFramerTest, BuildAckFrequencyPacket) {
8141   QuicPacketHeader header;
8142   header.destination_connection_id = FramerTestConnectionId();
8143   header.reset_flag = false;
8144   header.version_flag = false;
8145   header.packet_number = kPacketNumber;
8146 
8147   QuicAckFrequencyFrame ack_frequency_frame;
8148   ack_frequency_frame.sequence_number = 3;
8149   ack_frequency_frame.packet_tolerance = 5;
8150   ack_frequency_frame.max_ack_delay = QuicTime::Delta::FromMicroseconds(0x3fff);
8151   ack_frequency_frame.ignore_order = false;
8152   QuicFrames frames = {QuicFrame(&ack_frequency_frame)};
8153 
8154   // clang-format off
8155   unsigned char packet[] = {
8156     // type (short header, 4 byte packet number)
8157     0x43,
8158     // connection_id
8159     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8160     // packet number
8161     0x12, 0x34, 0x56, 0x78,
8162 
8163     // frame type (Ack Frequency frame)
8164     0x40, 0xaf,
8165     // sequence number
8166     0x03,
8167     // packet tolerance
8168     0x05,
8169     // max_ack_delay_us
8170     0x7f, 0xff,
8171     // ignore_oder
8172     0x00
8173   };
8174   // clang-format on
8175   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8176     return;
8177   }
8178 
8179   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8180   ASSERT_TRUE(data != nullptr);
8181 
8182   quiche::test::CompareCharArraysWithHexError(
8183       "constructed packet", data->data(), data->length(), AsChars(packet),
8184       ABSL_ARRAYSIZE(packet));
8185 }
8186 
TEST_P(QuicFramerTest,BuildResetStreamAtPacket)8187 TEST_P(QuicFramerTest, BuildResetStreamAtPacket) {
8188   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8189     return;
8190   }
8191 
8192   QuicPacketHeader header;
8193   header.destination_connection_id = FramerTestConnectionId();
8194   header.reset_flag = false;
8195   header.version_flag = false;
8196   header.packet_number = kPacketNumber;
8197 
8198   QuicResetStreamAtFrame frame;
8199   frame.stream_id = 0x00;
8200   frame.error = 0x1e;
8201   frame.final_offset = 0x20;
8202   frame.reliable_offset = 0x10;
8203   QuicFrames frames = {QuicFrame(&frame)};
8204 
8205   framer_.set_process_reset_stream_at(true);
8206   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8207   ASSERT_TRUE(data != nullptr);
8208 
8209   // clang-format off
8210   unsigned char packet[] = {
8211       // type (short header, 4 byte packet number)
8212       0x43,
8213       // connection_id
8214       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8215       // packet number
8216       0x12, 0x34, 0x56, 0x78,
8217 
8218       // type = RESET_STREAM_AT
8219       0x24,
8220       // stream ID
8221       0x00,
8222       // application error code
8223       0x1e,
8224       // final size
8225       0x20,
8226       // reliable size
8227       0x10,
8228   };
8229   // clang-format on
8230 
8231   quiche::test::CompareCharArraysWithHexError(
8232       "constructed packet", data->data(), data->length(), AsChars(packet),
8233       ABSL_ARRAYSIZE(packet));
8234 }
8235 
TEST_P(QuicFramerTest,BuildMessagePacket)8236 TEST_P(QuicFramerTest, BuildMessagePacket) {
8237   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8238   QuicPacketHeader header;
8239   header.destination_connection_id = FramerTestConnectionId();
8240   header.reset_flag = false;
8241   header.version_flag = false;
8242   header.packet_number = kPacketNumber;
8243 
8244   QuicMessageFrame frame(1, MemSliceFromString("message"));
8245   QuicMessageFrame frame2(2, MemSliceFromString("message2"));
8246   QuicFrames frames = {QuicFrame(&frame), QuicFrame(&frame2)};
8247 
8248   // clang-format off
8249   unsigned char packet[] = {
8250     // type (short header, 4 byte packet number)
8251     0x43,
8252     // connection_id
8253     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8254     // packet number
8255     0x12, 0x34, 0x56, 0x78,
8256 
8257     // frame type (message frame)
8258     0x21,
8259     // Length
8260     0x07,
8261     // Message Data
8262     'm', 'e', 's', 's', 'a', 'g', 'e',
8263     // frame type (message frame no length)
8264     0x20,
8265     // Message Data
8266     'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8267   };
8268 
8269   unsigned char packet_ietf[] = {
8270     // type (short header, 4 byte packet number)
8271     0x43,
8272     // connection_id
8273     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8274     // packet number
8275     0x12, 0x34, 0x56, 0x78,
8276 
8277     // frame type (IETF_MESSAGE frame)
8278     0x31,
8279     // Length
8280     0x07,
8281     // Message Data
8282     'm', 'e', 's', 's', 'a', 'g', 'e',
8283     // frame type (message frame no length)
8284     0x30,
8285     // Message Data
8286     'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8287   };
8288   // clang-format on
8289 
8290   unsigned char* p = packet;
8291   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8292     p = packet_ietf;
8293   }
8294 
8295   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8296   ASSERT_TRUE(data != nullptr);
8297 
8298   quiche::test::CompareCharArraysWithHexError(
8299       "constructed packet", data->data(), data->length(), AsChars(p),
8300       ABSL_ARRAYSIZE(packet));
8301 }
8302 
8303 // Test that the MTU discovery packet is serialized correctly as a PING packet.
TEST_P(QuicFramerTest,BuildMtuDiscoveryPacket)8304 TEST_P(QuicFramerTest, BuildMtuDiscoveryPacket) {
8305   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8306   QuicPacketHeader header;
8307   header.destination_connection_id = FramerTestConnectionId();
8308   header.reset_flag = false;
8309   header.version_flag = false;
8310   header.packet_number = kPacketNumber;
8311 
8312   QuicFrames frames = {QuicFrame(QuicMtuDiscoveryFrame())};
8313 
8314   // clang-format off
8315   unsigned char packet[] = {
8316     // type (short header, 4 byte packet number)
8317     0x43,
8318     // connection_id
8319     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8320     // packet number
8321     0x12, 0x34, 0x56, 0x78,
8322 
8323     // frame type
8324     0x07,
8325   };
8326 
8327   unsigned char packet_ietf[] = {
8328     // type (short header, 4 byte packet number)
8329     0x43,
8330     // connection_id
8331     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8332     // packet number
8333     0x12, 0x34, 0x56, 0x78,
8334 
8335     // frame type (IETF_PING frame)
8336     0x01,
8337   };
8338   // clang-format on
8339 
8340   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8341   ASSERT_TRUE(data != nullptr);
8342 
8343   unsigned char* p = packet;
8344   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8345     p = packet_ietf;
8346   }
8347 
8348   quiche::test::CompareCharArraysWithHexError(
8349       "constructed packet", data->data(), data->length(), AsChars(p),
8350       ABSL_ARRAYSIZE(packet));
8351 }
8352 
TEST_P(QuicFramerTest,BuildPublicResetPacket)8353 TEST_P(QuicFramerTest, BuildPublicResetPacket) {
8354   QuicPublicResetPacket reset_packet;
8355   reset_packet.connection_id = FramerTestConnectionId();
8356   reset_packet.nonce_proof = kNonceProof;
8357 
8358   // clang-format off
8359   unsigned char packet[] = {
8360     // public flags (public reset, 8 byte ConnectionId)
8361     0x0E,
8362     // connection_id
8363     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8364     // message tag (kPRST)
8365     'P', 'R', 'S', 'T',
8366     // num_entries (1) + padding
8367     0x01, 0x00, 0x00, 0x00,
8368     // tag kRNON
8369     'R', 'N', 'O', 'N',
8370     // end offset 8
8371     0x08, 0x00, 0x00, 0x00,
8372     // nonce proof
8373     0x89, 0x67, 0x45, 0x23,
8374     0x01, 0xEF, 0xCD, 0xAB,
8375   };
8376   // clang-format on
8377 
8378   std::unique_ptr<QuicEncryptedPacket> data(
8379       framer_.BuildPublicResetPacket(reset_packet));
8380   ASSERT_TRUE(data != nullptr);
8381   quiche::test::CompareCharArraysWithHexError(
8382       "constructed packet", data->data(), data->length(), AsChars(packet),
8383       ABSL_ARRAYSIZE(packet));
8384 }
8385 
TEST_P(QuicFramerTest,BuildPublicResetPacketWithClientAddress)8386 TEST_P(QuicFramerTest, BuildPublicResetPacketWithClientAddress) {
8387   QuicPublicResetPacket reset_packet;
8388   reset_packet.connection_id = FramerTestConnectionId();
8389   reset_packet.nonce_proof = kNonceProof;
8390   reset_packet.client_address =
8391       QuicSocketAddress(QuicIpAddress::Loopback4(), 0x1234);
8392 
8393   // clang-format off
8394   unsigned char packet[] = {
8395       // public flags (public reset, 8 byte ConnectionId)
8396       0x0E,
8397       // connection_id
8398       0xFE, 0xDC, 0xBA, 0x98,
8399       0x76, 0x54, 0x32, 0x10,
8400       // message tag (kPRST)
8401       'P', 'R', 'S', 'T',
8402       // num_entries (2) + padding
8403       0x02, 0x00, 0x00, 0x00,
8404       // tag kRNON
8405       'R', 'N', 'O', 'N',
8406       // end offset 8
8407       0x08, 0x00, 0x00, 0x00,
8408       // tag kCADR
8409       'C', 'A', 'D', 'R',
8410       // end offset 16
8411       0x10, 0x00, 0x00, 0x00,
8412       // nonce proof
8413       0x89, 0x67, 0x45, 0x23,
8414       0x01, 0xEF, 0xCD, 0xAB,
8415       // client address
8416       0x02, 0x00,
8417       0x7F, 0x00, 0x00, 0x01,
8418       0x34, 0x12,
8419   };
8420   // clang-format on
8421 
8422   std::unique_ptr<QuicEncryptedPacket> data(
8423       framer_.BuildPublicResetPacket(reset_packet));
8424   ASSERT_TRUE(data != nullptr);
8425 
8426   quiche::test::CompareCharArraysWithHexError(
8427       "constructed packet", data->data(), data->length(), AsChars(packet),
8428       ABSL_ARRAYSIZE(packet));
8429 }
8430 
TEST_P(QuicFramerTest,BuildPublicResetPacketWithEndpointId)8431 TEST_P(QuicFramerTest, BuildPublicResetPacketWithEndpointId) {
8432   QuicPublicResetPacket reset_packet;
8433   reset_packet.connection_id = FramerTestConnectionId();
8434   reset_packet.nonce_proof = kNonceProof;
8435   reset_packet.endpoint_id = "FakeServerId";
8436 
8437   // The tag value map in CryptoHandshakeMessage is a std::map, so the two tags
8438   // in the packet, kRNON and kEPID, have unspecified ordering w.r.t each other.
8439   // clang-format off
8440   unsigned char packet_variant1[] = {
8441       // public flags (public reset, 8 byte ConnectionId)
8442       0x0E,
8443       // connection_id
8444       0xFE, 0xDC, 0xBA, 0x98,
8445       0x76, 0x54, 0x32, 0x10,
8446       // message tag (kPRST)
8447       'P', 'R', 'S', 'T',
8448       // num_entries (2) + padding
8449       0x02, 0x00, 0x00, 0x00,
8450       // tag kRNON
8451       'R', 'N', 'O', 'N',
8452       // end offset 8
8453       0x08, 0x00, 0x00, 0x00,
8454       // tag kEPID
8455       'E', 'P', 'I', 'D',
8456       // end offset 20
8457       0x14, 0x00, 0x00, 0x00,
8458       // nonce proof
8459       0x89, 0x67, 0x45, 0x23,
8460       0x01, 0xEF, 0xCD, 0xAB,
8461       // Endpoint ID
8462       'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
8463   };
8464   unsigned char packet_variant2[] = {
8465       // public flags (public reset, 8 byte ConnectionId)
8466       0x0E,
8467       // connection_id
8468       0xFE, 0xDC, 0xBA, 0x98,
8469       0x76, 0x54, 0x32, 0x10,
8470       // message tag (kPRST)
8471       'P', 'R', 'S', 'T',
8472       // num_entries (2) + padding
8473       0x02, 0x00, 0x00, 0x00,
8474       // tag kEPID
8475       'E', 'P', 'I', 'D',
8476       // end offset 12
8477       0x0C, 0x00, 0x00, 0x00,
8478       // tag kRNON
8479       'R', 'N', 'O', 'N',
8480       // end offset 20
8481       0x14, 0x00, 0x00, 0x00,
8482       // Endpoint ID
8483       'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
8484       // nonce proof
8485       0x89, 0x67, 0x45, 0x23,
8486       0x01, 0xEF, 0xCD, 0xAB,
8487   };
8488   // clang-format on
8489 
8490   std::unique_ptr<QuicEncryptedPacket> data(
8491       framer_.BuildPublicResetPacket(reset_packet));
8492   ASSERT_TRUE(data != nullptr);
8493 
8494   // Variant 1 ends with char 'd'. Variant 1 ends with char 0xAB.
8495   if ('d' == data->data()[data->length() - 1]) {
8496     quiche::test::CompareCharArraysWithHexError(
8497         "constructed packet", data->data(), data->length(),
8498         AsChars(packet_variant1), ABSL_ARRAYSIZE(packet_variant1));
8499   } else {
8500     quiche::test::CompareCharArraysWithHexError(
8501         "constructed packet", data->data(), data->length(),
8502         AsChars(packet_variant2), ABSL_ARRAYSIZE(packet_variant2));
8503   }
8504 }
8505 
TEST_P(QuicFramerTest,BuildIetfStatelessResetPacket)8506 TEST_P(QuicFramerTest, BuildIetfStatelessResetPacket) {
8507   // clang-format off
8508     unsigned char packet[] = {
8509       // 1st byte 01XX XXXX
8510       0x40,
8511       // At least 4 bytes of random bytes.
8512       0x00, 0x00, 0x00, 0x00,
8513       // stateless reset token
8514       0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
8515       0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
8516     };
8517   // clang-format on
8518 
8519   // Build the minimal stateless reset packet.
8520   std::unique_ptr<QuicEncryptedPacket> data(
8521       framer_.BuildIetfStatelessResetPacket(
8522           FramerTestConnectionId(),
8523           QuicFramer::GetMinStatelessResetPacketLength() + 1,
8524           kTestStatelessResetToken));
8525   ASSERT_TRUE(data);
8526   EXPECT_EQ(QuicFramer::GetMinStatelessResetPacketLength(), data->length());
8527   // Verify the first 2 bits are 01.
8528   EXPECT_FALSE(data->data()[0] & FLAGS_LONG_HEADER);
8529   EXPECT_TRUE(data->data()[0] & FLAGS_FIXED_BIT);
8530   // Verify stateless reset token.
8531   quiche::test::CompareCharArraysWithHexError(
8532       "constructed packet",
8533       data->data() + data->length() - kStatelessResetTokenLength,
8534       kStatelessResetTokenLength,
8535       AsChars(packet) + ABSL_ARRAYSIZE(packet) - kStatelessResetTokenLength,
8536       kStatelessResetTokenLength);
8537 
8538   // Packets with length <= minimal stateless reset does not trigger stateless
8539   // reset.
8540   std::unique_ptr<QuicEncryptedPacket> data2(
8541       framer_.BuildIetfStatelessResetPacket(
8542           FramerTestConnectionId(),
8543           QuicFramer::GetMinStatelessResetPacketLength(),
8544           kTestStatelessResetToken));
8545   ASSERT_FALSE(data2);
8546 
8547   // Do not send stateless reset >= minimal stateless reset + 1 + max
8548   // connection ID length.
8549   std::unique_ptr<QuicEncryptedPacket> data3(
8550       framer_.BuildIetfStatelessResetPacket(FramerTestConnectionId(), 1000,
8551                                             kTestStatelessResetToken));
8552   ASSERT_TRUE(data3);
8553   EXPECT_EQ(QuicFramer::GetMinStatelessResetPacketLength() + 1 +
8554                 kQuicMaxConnectionIdWithLengthPrefixLength,
8555             data3->length());
8556 }
8557 
TEST_P(QuicFramerTest,BuildIetfStatelessResetPacketCallerProvidedRandomBytes)8558 TEST_P(QuicFramerTest, BuildIetfStatelessResetPacketCallerProvidedRandomBytes) {
8559   // clang-format off
8560     unsigned char packet[] = {
8561       // 1st byte 01XX XXXX
8562       0x7c,
8563       // Random bytes
8564       0x7c, 0x7c, 0x7c, 0x7c,
8565       // stateless reset token
8566       0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
8567       0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
8568     };
8569   // clang-format on
8570 
8571   // Build the minimal stateless reset packet with caller-provided random bytes.
8572   MockRandom random;
8573   auto generate_random_bytes = [](void* data, size_t len) {
8574     std::string bytes(len, 0x7c);
8575     memcpy(data, bytes.data(), bytes.size());
8576   };
8577   EXPECT_CALL(random, InsecureRandBytes(_, _))
8578       .WillOnce(testing::Invoke(generate_random_bytes));
8579   std::unique_ptr<QuicEncryptedPacket> data(
8580       framer_.BuildIetfStatelessResetPacket(
8581           FramerTestConnectionId(),
8582           QuicFramer::GetMinStatelessResetPacketLength() + 1,
8583           kTestStatelessResetToken, &random));
8584   ASSERT_TRUE(data);
8585   EXPECT_EQ(QuicFramer::GetMinStatelessResetPacketLength(), data->length());
8586   // Verify the first 2 bits are 01.
8587   EXPECT_FALSE(data->data()[0] & FLAGS_LONG_HEADER);
8588   EXPECT_TRUE(data->data()[0] & FLAGS_FIXED_BIT);
8589   // Verify the entire packet.
8590   quiche::test::CompareCharArraysWithHexError(
8591       "constructed packet", data->data(), data->length(), AsChars(packet),
8592       ABSL_ARRAYSIZE(packet));
8593 }
8594 
TEST_P(QuicFramerTest,EncryptPacket)8595 TEST_P(QuicFramerTest, EncryptPacket) {
8596   QuicPacketNumber packet_number = kPacketNumber;
8597   // clang-format off
8598   unsigned char packet[] = {
8599     // type (short header, 4 byte packet number)
8600     0x43,
8601     // connection_id
8602     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8603     // packet number
8604     0x12, 0x34, 0x56, 0x78,
8605 
8606     // redundancy
8607     'a',  'b',  'c',  'd',
8608     'e',  'f',  'g',  'h',
8609     'i',  'j',  'k',  'l',
8610     'm',  'n',  'o',  'p',
8611   };
8612 
8613   unsigned char packet50[] = {
8614     // type (short header, 4 byte packet number)
8615     0x43,
8616     // connection_id
8617     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8618     // packet number
8619     0x12, 0x34, 0x56, 0x78,
8620 
8621     // redundancy
8622     'a',  'b',  'c',  'd',
8623     'e',  'f',  'g',  'h',
8624     'i',  'j',  'k',  'l',
8625     'm',  'n',  'o',  'p',
8626     'q',  'r',  's',  't',
8627   };
8628   // clang-format on
8629 
8630   unsigned char* p = packet;
8631   size_t p_size = ABSL_ARRAYSIZE(packet);
8632   if (framer_.version().HasHeaderProtection()) {
8633     p = packet50;
8634     p_size = ABSL_ARRAYSIZE(packet50);
8635   }
8636 
8637   std::unique_ptr<QuicPacket> raw(new QuicPacket(
8638       AsChars(p), p_size, false, kPacket8ByteConnectionId,
8639       kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
8640       PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
8641       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0));
8642   char buffer[kMaxOutgoingPacketSize];
8643   size_t encrypted_length = framer_.EncryptPayload(
8644       ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
8645 
8646   ASSERT_NE(0u, encrypted_length);
8647   EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
8648 }
8649 
8650 // Regression test for b/158014497.
TEST_P(QuicFramerTest,EncryptEmptyPacket)8651 TEST_P(QuicFramerTest, EncryptEmptyPacket) {
8652   auto packet = std::make_unique<QuicPacket>(
8653       new char[100], 0, true, kPacket8ByteConnectionId,
8654       kPacket0ByteConnectionId,
8655       /*includes_version=*/true,
8656       /*includes_diversification_nonce=*/true, PACKET_1BYTE_PACKET_NUMBER,
8657       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
8658       /*retry_token_length=*/0, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
8659   char buffer[kMaxOutgoingPacketSize];
8660   size_t encrypted_length = 1;
8661   EXPECT_QUIC_BUG(
8662       {
8663         encrypted_length =
8664             framer_.EncryptPayload(ENCRYPTION_INITIAL, kPacketNumber, *packet,
8665                                    buffer, kMaxOutgoingPacketSize);
8666         EXPECT_EQ(0u, encrypted_length);
8667       },
8668       "packet is shorter than associated data length");
8669 }
8670 
TEST_P(QuicFramerTest,EncryptPacketWithVersionFlag)8671 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) {
8672   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8673   QuicPacketNumber packet_number = kPacketNumber;
8674   // clang-format off
8675   unsigned char packet[] = {
8676     // type (long header with packet type ZERO_RTT_PROTECTED)
8677     0xD3,
8678     // version tag
8679     'Q', '.', '1', '0',
8680     // connection_id length
8681     0x50,
8682     // connection_id
8683     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8684     // packet number
8685     0x12, 0x34, 0x56, 0x78,
8686 
8687     // redundancy
8688     'a',  'b',  'c',  'd',
8689     'e',  'f',  'g',  'h',
8690     'i',  'j',  'k',  'l',
8691     'm',  'n',  'o',  'p',
8692   };
8693 
8694   unsigned char packet50[] = {
8695     // type (long header with packet type ZERO_RTT_PROTECTED)
8696     0xD3,
8697     // version tag
8698     'Q', '.', '1', '0',
8699     // destination connection ID length
8700     0x08,
8701     // destination connection ID
8702     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8703     // source connection ID length
8704     0x00,
8705     // packet number
8706     0x12, 0x34, 0x56, 0x78,
8707 
8708     // redundancy
8709     'a',  'b',  'c',  'd',
8710     'e',  'f',  'g',  'h',
8711     'i',  'j',  'k',  'l',
8712     'm',  'n',  'o',  'p',
8713     'q',  'r',  's',  't',
8714   };
8715   // clang-format on
8716 
8717   unsigned char* p = packet;
8718   size_t p_size = ABSL_ARRAYSIZE(packet);
8719   // TODO(ianswett): see todo in previous test.
8720   if (framer_.version().HasHeaderProtection()) {
8721     p = packet50;
8722     p_size = ABSL_ARRAYSIZE(packet50);
8723   }
8724 
8725   std::unique_ptr<QuicPacket> raw(new QuicPacket(
8726       AsChars(p), p_size, false, kPacket8ByteConnectionId,
8727       kPacket0ByteConnectionId, kIncludeVersion, !kIncludeDiversificationNonce,
8728       PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
8729       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0));
8730   char buffer[kMaxOutgoingPacketSize];
8731   size_t encrypted_length = framer_.EncryptPayload(
8732       ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
8733 
8734   ASSERT_NE(0u, encrypted_length);
8735   EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
8736 }
8737 
TEST_P(QuicFramerTest,AckTruncationLargePacket)8738 TEST_P(QuicFramerTest, AckTruncationLargePacket) {
8739   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8740     // This test is not applicable to this version; the range count is
8741     // effectively unlimited
8742     return;
8743   }
8744   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8745 
8746   QuicPacketHeader header;
8747   header.destination_connection_id = FramerTestConnectionId();
8748   header.reset_flag = false;
8749   header.version_flag = false;
8750   header.packet_number = kPacketNumber;
8751 
8752   QuicAckFrame ack_frame;
8753   // Create a packet with just the ack.
8754   ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
8755   QuicFrames frames = {QuicFrame(&ack_frame)};
8756 
8757   // Build an ack packet with truncation due to limit in number of nack ranges.
8758   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8759   std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
8760   ASSERT_TRUE(raw_ack_packet != nullptr);
8761   char buffer[kMaxOutgoingPacketSize];
8762   size_t encrypted_length =
8763       framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
8764                              *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
8765   ASSERT_NE(0u, encrypted_length);
8766   // Now make sure we can turn our ack packet back into an ack frame.
8767   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
8768   ASSERT_TRUE(framer_.ProcessPacket(
8769       QuicEncryptedPacket(buffer, encrypted_length, false)));
8770   ASSERT_EQ(1u, visitor_.ack_frames_.size());
8771   QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
8772   EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
8773   ASSERT_EQ(256u, processed_ack_frame.packets.NumPacketsSlow());
8774   EXPECT_EQ(QuicPacketNumber(90u), processed_ack_frame.packets.Min());
8775   EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
8776 }
8777 
8778 // Regression test for b/150386368.
TEST_P(QuicFramerTest,IetfAckFrameTruncation)8779 TEST_P(QuicFramerTest, IetfAckFrameTruncation) {
8780   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8781     return;
8782   }
8783   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8784 
8785   QuicPacketHeader header;
8786   header.destination_connection_id = FramerTestConnectionId();
8787   header.reset_flag = false;
8788   header.version_flag = false;
8789   header.packet_number = kPacketNumber;
8790 
8791   QuicAckFrame ack_frame;
8792   // Create a packet with just the ack.
8793   ack_frame = MakeAckFrameWithGaps(/*gap_size=*/0xffffffff,
8794                                    /*max_num_gaps=*/200,
8795                                    /*largest_acked=*/kMaxIetfVarInt);
8796   ack_frame.ecn_counters = QuicEcnCounts(100, 10000, 1000000);
8797   QuicFrames frames = {QuicFrame(&ack_frame)};
8798   // Build an ACK packet.
8799   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8800   std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
8801   ASSERT_TRUE(raw_ack_packet != nullptr);
8802   char buffer[kMaxOutgoingPacketSize];
8803   size_t encrypted_length =
8804       framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
8805                              *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
8806   ASSERT_NE(0u, encrypted_length);
8807   // Now make sure we can turn our ack packet back into an ack frame.
8808   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
8809   ASSERT_TRUE(framer_.ProcessPacket(
8810       QuicEncryptedPacket(buffer, encrypted_length, false)));
8811   ASSERT_EQ(1u, visitor_.ack_frames_.size());
8812   QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
8813   EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
8814             LargestAcked(processed_ack_frame));
8815   // Verify ACK frame gets truncated.
8816   ASSERT_LT(processed_ack_frame.packets.NumPacketsSlow(),
8817             ack_frame.packets.NumIntervals());
8818   EXPECT_EQ(157u, processed_ack_frame.packets.NumPacketsSlow());
8819   EXPECT_LT(processed_ack_frame.packets.NumIntervals(),
8820             ack_frame.packets.NumIntervals());
8821   EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
8822             processed_ack_frame.packets.Max());
8823 }
8824 
TEST_P(QuicFramerTest,AckTruncationSmallPacket)8825 TEST_P(QuicFramerTest, AckTruncationSmallPacket) {
8826   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8827     // This test is not applicable to this version; the range count is
8828     // effectively unlimited
8829     return;
8830   }
8831   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8832 
8833   QuicPacketHeader header;
8834   header.destination_connection_id = FramerTestConnectionId();
8835   header.reset_flag = false;
8836   header.version_flag = false;
8837   header.packet_number = kPacketNumber;
8838 
8839   // Create a packet with just the ack.
8840   QuicAckFrame ack_frame;
8841   ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
8842   QuicFrames frames = {QuicFrame(&ack_frame)};
8843 
8844   // Build an ack packet with truncation due to limit in number of nack ranges.
8845   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8846   std::unique_ptr<QuicPacket> raw_ack_packet(
8847       BuildDataPacket(header, frames, 500));
8848   ASSERT_TRUE(raw_ack_packet != nullptr);
8849   char buffer[kMaxOutgoingPacketSize];
8850   size_t encrypted_length =
8851       framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
8852                              *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
8853   ASSERT_NE(0u, encrypted_length);
8854   // Now make sure we can turn our ack packet back into an ack frame.
8855   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
8856   ASSERT_TRUE(framer_.ProcessPacket(
8857       QuicEncryptedPacket(buffer, encrypted_length, false)));
8858   ASSERT_EQ(1u, visitor_.ack_frames_.size());
8859   QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
8860   EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
8861   ASSERT_EQ(240u, processed_ack_frame.packets.NumPacketsSlow());
8862   EXPECT_EQ(QuicPacketNumber(122u), processed_ack_frame.packets.Min());
8863   EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
8864 }
8865 
TEST_P(QuicFramerTest,CleanTruncation)8866 TEST_P(QuicFramerTest, CleanTruncation) {
8867   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8868     // This test is not applicable to this version; the range count is
8869     // effectively unlimited
8870     return;
8871   }
8872   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8873 
8874   QuicPacketHeader header;
8875   header.destination_connection_id = FramerTestConnectionId();
8876   header.reset_flag = false;
8877   header.version_flag = false;
8878   header.packet_number = kPacketNumber;
8879 
8880   QuicAckFrame ack_frame = InitAckFrame(201);
8881 
8882   // Create a packet with just the ack.
8883   QuicFrames frames = {QuicFrame(&ack_frame)};
8884   if (framer_.version().HasHeaderProtection()) {
8885     frames.push_back(QuicFrame(QuicPaddingFrame(12)));
8886   }
8887   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8888   std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
8889   ASSERT_TRUE(raw_ack_packet != nullptr);
8890 
8891   char buffer[kMaxOutgoingPacketSize];
8892   size_t encrypted_length =
8893       framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
8894                              *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
8895   ASSERT_NE(0u, encrypted_length);
8896 
8897   // Now make sure we can turn our ack packet back into an ack frame.
8898   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
8899   ASSERT_TRUE(framer_.ProcessPacket(
8900       QuicEncryptedPacket(buffer, encrypted_length, false)));
8901 
8902   // Test for clean truncation of the ack by comparing the length of the
8903   // original packets to the re-serialized packets.
8904   frames.clear();
8905   frames.push_back(QuicFrame(visitor_.ack_frames_[0].get()));
8906   if (framer_.version().HasHeaderProtection()) {
8907     frames.push_back(QuicFrame(*visitor_.padding_frames_[0].get()));
8908   }
8909 
8910   size_t original_raw_length = raw_ack_packet->length();
8911   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8912   raw_ack_packet = BuildDataPacket(header, frames);
8913   ASSERT_TRUE(raw_ack_packet != nullptr);
8914   EXPECT_EQ(original_raw_length, raw_ack_packet->length());
8915   ASSERT_TRUE(raw_ack_packet != nullptr);
8916 }
8917 
TEST_P(QuicFramerTest,StopPacketProcessing)8918 TEST_P(QuicFramerTest, StopPacketProcessing) {
8919   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8920   // clang-format off
8921   unsigned char packet[] = {
8922     // type (short header, 4 byte packet number)
8923     0x43,
8924     // connection_id
8925     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8926     // packet number
8927     0x12, 0x34, 0x56, 0x78,
8928 
8929     // frame type (stream frame with fin)
8930     0xFF,
8931     // stream id
8932     0x01, 0x02, 0x03, 0x04,
8933     // offset
8934     0x3A, 0x98, 0xFE, 0xDC,
8935     0x32, 0x10, 0x76, 0x54,
8936     // data length
8937     0x00, 0x0c,
8938     // data
8939     'h',  'e',  'l',  'l',
8940     'o',  ' ',  'w',  'o',
8941     'r',  'l',  'd',  '!',
8942 
8943     // frame type (ack frame)
8944     0x40,
8945     // least packet number awaiting an ack
8946     0x12, 0x34, 0x56, 0x78,
8947     0x9A, 0xA0,
8948     // largest observed packet number
8949     0x12, 0x34, 0x56, 0x78,
8950     0x9A, 0xBF,
8951     // num missing packets
8952     0x01,
8953     // missing packet
8954     0x12, 0x34, 0x56, 0x78,
8955     0x9A, 0xBE,
8956   };
8957 
8958   unsigned char packet_ietf[] = {
8959     // type (short header, 4 byte packet number)
8960     0x43,
8961     // connection_id
8962     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8963     // packet number
8964     0x12, 0x34, 0x56, 0x78,
8965 
8966     // frame type (IETF_STREAM frame with fin, length, and offset bits set)
8967     0x08 | 0x01 | 0x02 | 0x04,
8968     // stream id
8969     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
8970     // offset
8971     kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
8972     0x32, 0x10, 0x76, 0x54,
8973     // data length
8974     kVarInt62TwoBytes + 0x00, 0x0c,
8975     // data
8976     'h',  'e',  'l',  'l',
8977     'o',  ' ',  'w',  'o',
8978     'r',  'l',  'd',  '!',
8979 
8980     // frame type (ack frame)
8981     0x0d,
8982     // largest observed packet number
8983     kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
8984     // Delta time
8985     kVarInt62OneByte + 0x00,
8986     // Ack Block count
8987     kVarInt62OneByte + 0x01,
8988     // First block size (one packet)
8989     kVarInt62OneByte + 0x00,
8990 
8991     // Next gap size & ack. Missing all preceding packets
8992     kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
8993     kVarInt62OneByte + 0x00,
8994   };
8995   // clang-format on
8996 
8997   MockFramerVisitor visitor;
8998   framer_.set_visitor(&visitor);
8999   EXPECT_CALL(visitor, OnPacket());
9000   EXPECT_CALL(visitor, OnPacketHeader(_));
9001   EXPECT_CALL(visitor, OnStreamFrame(_)).WillOnce(Return(false));
9002   EXPECT_CALL(visitor, OnPacketComplete());
9003   EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true));
9004   EXPECT_CALL(visitor, OnUnauthenticatedHeader(_)).WillOnce(Return(true));
9005   EXPECT_CALL(visitor, OnDecryptedPacket(_, _));
9006 
9007   unsigned char* p = packet;
9008   size_t p_size = ABSL_ARRAYSIZE(packet);
9009   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
9010     p = packet_ietf;
9011     p_size = ABSL_ARRAYSIZE(packet_ietf);
9012   }
9013   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
9014   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9015   EXPECT_THAT(framer_.error(), IsQuicNoError());
9016 }
9017 
9018 static char kTestString[] = "At least 20 characters.";
9019 static QuicStreamId kTestQuicStreamId = 1;
9020 
9021 MATCHER_P(ExpectedStreamFrame, version, "") {
9022   return (arg.stream_id == kTestQuicStreamId ||
9023           QuicUtils::IsCryptoStreamId(version.transport_version,
9024                                       arg.stream_id)) &&
9025          !arg.fin && arg.offset == 0 &&
9026          std::string(arg.data_buffer, arg.data_length) == kTestString;
9027   // FIN is hard-coded false in ConstructEncryptedPacket.
9028   // Offset 0 is hard-coded in ConstructEncryptedPacket.
9029 }
9030 
9031 // Verify that the packet returned by ConstructEncryptedPacket() can be properly
9032 // parsed by the framer.
TEST_P(QuicFramerTest,ConstructEncryptedPacket)9033 TEST_P(QuicFramerTest, ConstructEncryptedPacket) {
9034   // Since we are using ConstructEncryptedPacket, we have to set the framer's
9035   // crypto to be Null.
9036   if (framer_.version().KnowsWhichDecrypterToUse()) {
9037     framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
9038                              std::make_unique<StrictTaggingDecrypter>(
9039                                  (uint8_t)ENCRYPTION_FORWARD_SECURE));
9040   } else {
9041     framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
9042                          std::make_unique<StrictTaggingDecrypter>(
9043                              (uint8_t)ENCRYPTION_FORWARD_SECURE));
9044   }
9045   ParsedQuicVersionVector versions;
9046   versions.push_back(framer_.version());
9047   std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket(
9048       TestConnectionId(), EmptyQuicConnectionId(), false, false,
9049       kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
9050       CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, &versions));
9051 
9052   MockFramerVisitor visitor;
9053   framer_.set_visitor(&visitor);
9054   EXPECT_CALL(visitor, OnPacket()).Times(1);
9055   EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
9056       .Times(1)
9057       .WillOnce(Return(true));
9058   EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
9059       .Times(1)
9060       .WillOnce(Return(true));
9061   EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1).WillOnce(Return(true));
9062   EXPECT_CALL(visitor, OnDecryptedPacket(_, _)).Times(1);
9063   EXPECT_CALL(visitor, OnError(_)).Times(0);
9064   EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
9065   if (!QuicVersionUsesCryptoFrames(framer_.version().transport_version)) {
9066     EXPECT_CALL(visitor, OnStreamFrame(ExpectedStreamFrame(framer_.version())))
9067         .Times(1);
9068   } else {
9069     EXPECT_CALL(visitor, OnCryptoFrame(_)).Times(1);
9070   }
9071   EXPECT_CALL(visitor, OnPacketComplete()).Times(1);
9072 
9073   EXPECT_TRUE(framer_.ProcessPacket(*packet));
9074   EXPECT_THAT(framer_.error(), IsQuicNoError());
9075 }
9076 
9077 // Verify that the packet returned by ConstructMisFramedEncryptedPacket()
9078 // does cause the framer to return an error.
TEST_P(QuicFramerTest,ConstructMisFramedEncryptedPacket)9079 TEST_P(QuicFramerTest, ConstructMisFramedEncryptedPacket) {
9080   // Since we are using ConstructEncryptedPacket, we have to set the framer's
9081   // crypto to be Null.
9082   if (framer_.version().KnowsWhichDecrypterToUse()) {
9083     framer_.InstallDecrypter(
9084         ENCRYPTION_FORWARD_SECURE,
9085         std::make_unique<StrictTaggingDecrypter>(ENCRYPTION_FORWARD_SECURE));
9086   }
9087   std::unique_ptr<QuicEncryptedPacket> packet(ConstructMisFramedEncryptedPacket(
9088       TestConnectionId(), EmptyQuicConnectionId(), false, false,
9089       kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
9090       CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, framer_.version(),
9091       Perspective::IS_CLIENT));
9092 
9093   MockFramerVisitor visitor;
9094   framer_.set_visitor(&visitor);
9095   EXPECT_CALL(visitor, OnPacket()).Times(1);
9096   EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
9097       .Times(1)
9098       .WillOnce(Return(true));
9099   EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
9100       .Times(1)
9101       .WillOnce(Return(true));
9102   EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1);
9103   EXPECT_CALL(visitor, OnDecryptedPacket(_, _)).Times(1);
9104   EXPECT_CALL(visitor, OnError(_)).Times(1);
9105   EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
9106   EXPECT_CALL(visitor, OnPacketComplete()).Times(0);
9107 
9108   EXPECT_FALSE(framer_.ProcessPacket(*packet));
9109   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
9110 }
9111 
TEST_P(QuicFramerTest,IetfBlockedFrame)9112 TEST_P(QuicFramerTest, IetfBlockedFrame) {
9113   // This frame is only for IETF QUIC.
9114   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9115     return;
9116   }
9117   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9118 
9119   // clang-format off
9120   PacketFragments packet_ietf = {
9121       // type (short header, 4 byte packet number)
9122       {"",
9123        {0x43}},
9124       // connection_id
9125       {"",
9126        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9127       // packet number
9128       {"",
9129        {0x12, 0x34, 0x9A, 0xBC}},
9130       // frame type (IETF_DATA_BLOCKED)
9131       {"",
9132        {0x14}},
9133       // blocked offset
9134       {"Can not read blocked offset.",
9135        {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
9136   };
9137   // clang-format on
9138 
9139   std::unique_ptr<QuicEncryptedPacket> encrypted(
9140       AssemblePacketFromFragments(packet_ietf));
9141   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9142 
9143   EXPECT_THAT(framer_.error(), IsQuicNoError());
9144   ASSERT_TRUE(visitor_.header_.get());
9145   EXPECT_TRUE(CheckDecryption(
9146       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9147       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9148 
9149   EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
9150 
9151   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_BLOCKED_DATA);
9152 }
9153 
TEST_P(QuicFramerTest,BuildIetfBlockedPacket)9154 TEST_P(QuicFramerTest, BuildIetfBlockedPacket) {
9155   // This frame is only for IETF QUIC.
9156   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9157     return;
9158   }
9159 
9160   QuicPacketHeader header;
9161   header.destination_connection_id = FramerTestConnectionId();
9162   header.reset_flag = false;
9163   header.version_flag = false;
9164   header.packet_number = kPacketNumber;
9165 
9166   QuicBlockedFrame frame;
9167   frame.stream_id = QuicUtils::GetInvalidStreamId(framer_.transport_version());
9168   frame.offset = kStreamOffset;
9169   QuicFrames frames = {QuicFrame(frame)};
9170 
9171   // clang-format off
9172   unsigned char packet_ietf[] = {
9173     // type (short header, 4 byte packet number)
9174     0x43,
9175     // connection_id
9176     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9177     // packet number
9178     0x12, 0x34, 0x56, 0x78,
9179 
9180     // frame type (IETF_DATA_BLOCKED)
9181     0x14,
9182     // Offset
9183     kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
9184   };
9185   // clang-format on
9186 
9187   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9188   ASSERT_TRUE(data != nullptr);
9189 
9190   quiche::test::CompareCharArraysWithHexError(
9191       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9192       ABSL_ARRAYSIZE(packet_ietf));
9193 }
9194 
TEST_P(QuicFramerTest,IetfStreamBlockedFrame)9195 TEST_P(QuicFramerTest, IetfStreamBlockedFrame) {
9196   // This frame is only for IETF QUIC.
9197   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9198     return;
9199   }
9200   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9201 
9202   // clang-format off
9203   PacketFragments packet_ietf = {
9204       // type (short header, 4 byte packet number)
9205       {"",
9206        {0x43}},
9207       // connection_id
9208       {"",
9209        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9210       // packet number
9211       {"",
9212        {0x12, 0x34, 0x9A, 0xBC}},
9213       // frame type (IETF_STREAM_DATA_BLOCKED)
9214       {"",
9215        {0x15}},
9216       // blocked offset
9217       {"Unable to read IETF_STREAM_DATA_BLOCKED frame stream id/count.",
9218        {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
9219       {"Can not read stream blocked offset.",
9220        {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
9221   };
9222   // clang-format on
9223 
9224   std::unique_ptr<QuicEncryptedPacket> encrypted(
9225       AssemblePacketFromFragments(packet_ietf));
9226   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9227 
9228   EXPECT_THAT(framer_.error(), IsQuicNoError());
9229   ASSERT_TRUE(visitor_.header_.get());
9230   EXPECT_TRUE(CheckDecryption(
9231       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9232       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9233 
9234   EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
9235   EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
9236 
9237   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_STREAM_BLOCKED_DATA);
9238 }
9239 
TEST_P(QuicFramerTest,BuildIetfStreamBlockedPacket)9240 TEST_P(QuicFramerTest, BuildIetfStreamBlockedPacket) {
9241   // This frame is only for IETF QUIC.
9242   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9243     return;
9244   }
9245 
9246   QuicPacketHeader header;
9247   header.destination_connection_id = FramerTestConnectionId();
9248   header.reset_flag = false;
9249   header.version_flag = false;
9250   header.packet_number = kPacketNumber;
9251 
9252   QuicBlockedFrame frame;
9253   frame.stream_id = kStreamId;
9254   frame.offset = kStreamOffset;
9255   QuicFrames frames = {QuicFrame(frame)};
9256 
9257   // clang-format off
9258   unsigned char packet_ietf[] = {
9259     // type (short header, 4 byte packet number)
9260     0x43,
9261     // connection_id
9262     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9263     // packet number
9264     0x12, 0x34, 0x56, 0x78,
9265 
9266     // frame type (IETF_STREAM_DATA_BLOCKED)
9267     0x15,
9268     // Stream ID
9269     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
9270     // Offset
9271     kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
9272   };
9273   // clang-format on
9274 
9275   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9276   ASSERT_TRUE(data != nullptr);
9277 
9278   quiche::test::CompareCharArraysWithHexError(
9279       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9280       ABSL_ARRAYSIZE(packet_ietf));
9281 }
9282 
TEST_P(QuicFramerTest,BiDiMaxStreamsFrame)9283 TEST_P(QuicFramerTest, BiDiMaxStreamsFrame) {
9284   // This frame is only for IETF QUIC.
9285   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9286     return;
9287   }
9288   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9289 
9290   // clang-format off
9291   PacketFragments packet_ietf = {
9292       // type (short header, 4 byte packet number)
9293       {"",
9294        {0x43}},
9295       // connection_id
9296       {"",
9297        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9298       // packet number
9299       {"",
9300        {0x12, 0x34, 0x9A, 0xBC}},
9301       // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9302       {"",
9303        {0x12}},
9304       // max. streams
9305       {"Unable to read IETF_MAX_STREAMS_BIDIRECTIONAL frame stream id/count.",
9306        {kVarInt62OneByte + 0x03}},
9307   };
9308   // clang-format on
9309 
9310   std::unique_ptr<QuicEncryptedPacket> encrypted(
9311       AssemblePacketFromFragments(packet_ietf));
9312   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9313 
9314   EXPECT_THAT(framer_.error(), IsQuicNoError());
9315   ASSERT_TRUE(visitor_.header_.get());
9316   EXPECT_TRUE(CheckDecryption(
9317       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9318       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9319 
9320   EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9321   EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
9322   CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9323 }
9324 
TEST_P(QuicFramerTest,UniDiMaxStreamsFrame)9325 TEST_P(QuicFramerTest, UniDiMaxStreamsFrame) {
9326   // This frame is only for IETF QUIC.
9327   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9328     return;
9329   }
9330   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9331 
9332   // clang-format off
9333   PacketFragments packet_ietf = {
9334       // type (short header, 4 byte packet number)
9335       {"",
9336        {0x43}},
9337       // Test runs in client mode, no connection id
9338       // packet number
9339       {"",
9340        {0x12, 0x34, 0x9A, 0xBC}},
9341       // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9342       {"",
9343        {0x13}},
9344       // max. streams
9345       {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
9346        {kVarInt62OneByte + 0x03}},
9347   };
9348   // clang-format on
9349 
9350   std::unique_ptr<QuicEncryptedPacket> encrypted(
9351       AssemblePacketFromFragments(packet_ietf));
9352   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9353   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9354 
9355   EXPECT_THAT(framer_.error(), IsQuicNoError());
9356   ASSERT_TRUE(visitor_.header_.get());
9357   EXPECT_TRUE(CheckDecryption(
9358       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9359       kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9360 
9361   EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9362   EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9363   CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9364 }
9365 
TEST_P(QuicFramerTest,ServerUniDiMaxStreamsFrame)9366 TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrame) {
9367   // This frame is only for IETF QUIC.
9368   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9369     return;
9370   }
9371   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9372 
9373   // clang-format off
9374   PacketFragments packet_ietf = {
9375       // type (short header, 4 byte packet number)
9376       {"",
9377        {0x43}},
9378       // connection_id
9379       {"",
9380        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9381       // packet number
9382       {"",
9383        {0x12, 0x34, 0x9A, 0xBC}},
9384       // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9385       {"",
9386        {0x13}},
9387       // max. streams
9388       {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
9389        {kVarInt62OneByte + 0x03}},
9390   };
9391   // clang-format on
9392 
9393   std::unique_ptr<QuicEncryptedPacket> encrypted(
9394       AssemblePacketFromFragments(packet_ietf));
9395   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9396 
9397   EXPECT_THAT(framer_.error(), IsQuicNoError());
9398   ASSERT_TRUE(visitor_.header_.get());
9399   EXPECT_TRUE(CheckDecryption(
9400       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9401       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9402 
9403   EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9404   EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9405   CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9406 }
9407 
TEST_P(QuicFramerTest,ClientUniDiMaxStreamsFrame)9408 TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrame) {
9409   // This frame is only for IETF QUIC.
9410   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9411     return;
9412   }
9413   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9414 
9415   // clang-format off
9416   PacketFragments packet_ietf = {
9417       // type (short header, 4 byte packet number)
9418       {"",
9419        {0x43}},
9420       // Test runs in client mode, no connection id
9421       // packet number
9422       {"",
9423        {0x12, 0x34, 0x9A, 0xBC}},
9424       // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9425       {"",
9426        {0x13}},
9427       // max. streams
9428       {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
9429        {kVarInt62OneByte + 0x03}},
9430   };
9431   // clang-format on
9432 
9433   std::unique_ptr<QuicEncryptedPacket> encrypted(
9434       AssemblePacketFromFragments(packet_ietf));
9435   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9436   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9437 
9438   EXPECT_THAT(framer_.error(), IsQuicNoError());
9439   ASSERT_TRUE(visitor_.header_.get());
9440   EXPECT_TRUE(CheckDecryption(
9441       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9442       kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9443 
9444   EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9445   EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9446   CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9447 }
9448 
9449 // The following four tests ensure that the framer can deserialize a stream
9450 // count that is large enough to cause the resulting stream ID to exceed the
9451 // current implementation limit(32 bits). The intent is that when this happens,
9452 // the stream limit is pegged to the maximum supported value. There are four
9453 // tests, for the four combinations of uni- and bi-directional, server- and
9454 // client- initiated.
TEST_P(QuicFramerTest,BiDiMaxStreamsFrameTooBig)9455 TEST_P(QuicFramerTest, BiDiMaxStreamsFrameTooBig) {
9456   // This frame is only for IETF QUIC.
9457   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9458     return;
9459   }
9460   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9461 
9462   // clang-format off
9463   unsigned char packet_ietf[] = {
9464     // type (short header, 4 byte packet number)
9465     0x43,
9466     // connection_id
9467     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9468     // packet number
9469     0x12, 0x34, 0x9A, 0xBC,
9470     // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9471     0x12,
9472 
9473     // max. streams. Max stream ID allowed is 0xffffffff
9474     // This encodes a count of 0x40000000, leading to stream
9475     // IDs in the range 0x1 00000000 to 0x1 00000003.
9476     kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9477   };
9478   // clang-format on
9479 
9480   QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9481                                 ABSL_ARRAYSIZE(packet_ietf), false);
9482   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9483   EXPECT_THAT(framer_.error(), IsQuicNoError());
9484   ASSERT_TRUE(visitor_.header_.get());
9485   EXPECT_TRUE(CheckDecryption(
9486       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9487       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9488 
9489   EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
9490   EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
9491 }
9492 
TEST_P(QuicFramerTest,ClientBiDiMaxStreamsFrameTooBig)9493 TEST_P(QuicFramerTest, ClientBiDiMaxStreamsFrameTooBig) {
9494   // This frame is only for IETF QUIC.
9495   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9496     return;
9497   }
9498   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9499 
9500   // clang-format off
9501   unsigned char packet_ietf[] = {
9502     // type (short header, 4 byte packet number)
9503     0x43,
9504     // Test runs in client mode, no connection id
9505     // packet number
9506     0x12, 0x34, 0x9A, 0xBC,
9507     // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9508     0x12,
9509 
9510     // max. streams. Max stream ID allowed is 0xffffffff
9511     // This encodes a count of 0x40000000, leading to stream
9512     // IDs in the range 0x1 00000000 to 0x1 00000003.
9513     kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9514   };
9515   // clang-format on
9516 
9517   QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9518                                 ABSL_ARRAYSIZE(packet_ietf), false);
9519   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9520   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9521 
9522   EXPECT_THAT(framer_.error(), IsQuicNoError());
9523   ASSERT_TRUE(visitor_.header_.get());
9524   EXPECT_TRUE(CheckDecryption(
9525       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9526       kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9527 
9528   EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
9529   EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
9530 }
9531 
TEST_P(QuicFramerTest,ServerUniDiMaxStreamsFrameTooBig)9532 TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrameTooBig) {
9533   // This frame is only for IETF QUIC.
9534   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9535     return;
9536   }
9537   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9538 
9539   // clang-format off
9540   unsigned char packet_ietf[] = {
9541     // type (short header, 4 byte packet number)
9542     0x43,
9543     // connection_id
9544     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9545     // packet number
9546     0x12, 0x34, 0x9A, 0xBC,
9547     // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9548     0x13,
9549 
9550     // max. streams. Max stream ID allowed is 0xffffffff
9551     // This encodes a count of 0x40000000, leading to stream
9552     // IDs in the range 0x1 00000000 to 0x1 00000003.
9553     kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9554   };
9555   // clang-format on
9556 
9557   QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9558                                 ABSL_ARRAYSIZE(packet_ietf), false);
9559   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9560 
9561   EXPECT_THAT(framer_.error(), IsQuicNoError());
9562   ASSERT_TRUE(visitor_.header_.get());
9563   EXPECT_TRUE(CheckDecryption(
9564       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9565       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9566 
9567   EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
9568   EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9569 }
9570 
TEST_P(QuicFramerTest,ClientUniDiMaxStreamsFrameTooBig)9571 TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrameTooBig) {
9572   // This frame is only for IETF QUIC.
9573   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9574     return;
9575   }
9576   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9577 
9578   // clang-format off
9579   unsigned char packet_ietf[] = {
9580     // type (short header, 4 byte packet number)
9581     0x43,
9582     // Test runs in client mode, no connection id
9583     // packet number
9584     0x12, 0x34, 0x9A, 0xBC,
9585     // frame type (IETF_MAX_STREAMS_UNDIRECTIONAL)
9586     0x13,
9587 
9588     // max. streams. Max stream ID allowed is 0xffffffff
9589     // This encodes a count of 0x40000000, leading to stream
9590     // IDs in the range 0x1 00000000 to 0x1 00000003.
9591     kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9592   };
9593   // clang-format on
9594 
9595   QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9596                                 ABSL_ARRAYSIZE(packet_ietf), false);
9597   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9598   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9599 
9600   EXPECT_THAT(framer_.error(), IsQuicNoError());
9601   ASSERT_TRUE(visitor_.header_.get());
9602   EXPECT_TRUE(CheckDecryption(
9603       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9604       kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9605 
9606   EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
9607   EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9608 }
9609 
9610 // Specifically test that count==0 is accepted.
TEST_P(QuicFramerTest,MaxStreamsFrameZeroCount)9611 TEST_P(QuicFramerTest, MaxStreamsFrameZeroCount) {
9612   // This frame is only for IETF QUIC.
9613   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9614     return;
9615   }
9616   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9617 
9618   // clang-format off
9619   unsigned char packet_ietf[] = {
9620     // type (short header, 4 byte packet number)
9621     0x43,
9622     // connection_id
9623     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9624     // packet number
9625     0x12, 0x34, 0x9A, 0xBC,
9626     // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9627     0x12,
9628     // max. streams == 0.
9629     kVarInt62OneByte + 0x00
9630   };
9631   // clang-format on
9632 
9633   QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9634                                 ABSL_ARRAYSIZE(packet_ietf), false);
9635   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9636 }
9637 
TEST_P(QuicFramerTest,ServerBiDiStreamsBlockedFrame)9638 TEST_P(QuicFramerTest, ServerBiDiStreamsBlockedFrame) {
9639   // This frame is only for IETF QUIC.
9640   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9641     return;
9642   }
9643   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9644 
9645   // clang-format off
9646   PacketFragments packet_ietf = {
9647       // type (short header, 4 byte packet number)
9648       {"",
9649        {0x43}},
9650       // connection_id
9651       {"",
9652        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9653       // packet number
9654       {"",
9655        {0x12, 0x34, 0x9A, 0xBC}},
9656       // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
9657       {"",
9658        {0x13}},
9659       // stream count
9660       {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
9661        {kVarInt62OneByte + 0x00}},
9662   };
9663   // clang-format on
9664 
9665   std::unique_ptr<QuicEncryptedPacket> encrypted(
9666       AssemblePacketFromFragments(packet_ietf));
9667   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9668 
9669   EXPECT_THAT(framer_.error(), IsQuicNoError());
9670   ASSERT_TRUE(visitor_.header_.get());
9671   EXPECT_TRUE(CheckDecryption(
9672       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9673       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9674 
9675   EXPECT_EQ(0u, visitor_.max_streams_frame_.stream_count);
9676   EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9677 
9678   CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9679 }
9680 
TEST_P(QuicFramerTest,BiDiStreamsBlockedFrame)9681 TEST_P(QuicFramerTest, BiDiStreamsBlockedFrame) {
9682   // This frame is only for IETF QUIC.
9683   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9684     return;
9685   }
9686   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9687 
9688   // clang-format off
9689   PacketFragments packet_ietf = {
9690       // type (short header, 4 byte packet number)
9691       {"",
9692        {0x43}},
9693       // connection_id
9694       {"",
9695        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9696       // packet number
9697       {"",
9698        {0x12, 0x34, 0x9A, 0xBC}},
9699       // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
9700       {"",
9701        {0x16}},
9702       // stream id
9703       {"Unable to read IETF_STREAMS_BLOCKED_BIDIRECTIONAL "
9704        "frame stream id/count.",
9705        {kVarInt62OneByte + 0x03}},
9706   };
9707   // clang-format on
9708 
9709   std::unique_ptr<QuicEncryptedPacket> encrypted(
9710       AssemblePacketFromFragments(packet_ietf));
9711   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9712 
9713   EXPECT_THAT(framer_.error(), IsQuicNoError());
9714   ASSERT_TRUE(visitor_.header_.get());
9715   EXPECT_TRUE(CheckDecryption(
9716       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9717       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9718 
9719   EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
9720   EXPECT_FALSE(visitor_.streams_blocked_frame_.unidirectional);
9721 
9722   CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
9723 }
9724 
TEST_P(QuicFramerTest,UniDiStreamsBlockedFrame)9725 TEST_P(QuicFramerTest, UniDiStreamsBlockedFrame) {
9726   // This frame is only for IETF QUIC.
9727   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9728     return;
9729   }
9730   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9731 
9732   // clang-format off
9733   PacketFragments packet_ietf = {
9734       // type (short header, 4 byte packet number)
9735       {"",
9736        {0x43}},
9737       // connection_id
9738       {"",
9739        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9740       // packet number
9741       {"",
9742        {0x12, 0x34, 0x9A, 0xBC}},
9743       // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
9744       {"",
9745        {0x17}},
9746       // stream id
9747       {"Unable to read IETF_STREAMS_BLOCKED_UNIDIRECTIONAL "
9748        "frame stream id/count.",
9749        {kVarInt62OneByte + 0x03}},
9750   };
9751   // clang-format on
9752 
9753   std::unique_ptr<QuicEncryptedPacket> encrypted(
9754       AssemblePacketFromFragments(packet_ietf));
9755   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9756 
9757   EXPECT_THAT(framer_.error(), IsQuicNoError());
9758   ASSERT_TRUE(visitor_.header_.get());
9759   EXPECT_TRUE(CheckDecryption(
9760       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9761       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9762 
9763   EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
9764   EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
9765   CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
9766 }
9767 
TEST_P(QuicFramerTest,ClientUniDiStreamsBlockedFrame)9768 TEST_P(QuicFramerTest, ClientUniDiStreamsBlockedFrame) {
9769   // This frame is only for IETF QUIC.
9770   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9771     return;
9772   }
9773   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9774 
9775   // clang-format off
9776   PacketFragments packet_ietf = {
9777       // type (short header, 4 byte packet number)
9778       {"",
9779        {0x43}},
9780       // Test runs in client mode, no connection id
9781       // packet number
9782       {"",
9783        {0x12, 0x34, 0x9A, 0xBC}},
9784       // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
9785       {"",
9786        {0x17}},
9787       // stream id
9788       {"Unable to read IETF_STREAMS_BLOCKED_UNIDIRECTIONAL "
9789        "frame stream id/count.",
9790        {kVarInt62OneByte + 0x03}},
9791   };
9792   // clang-format on
9793 
9794   std::unique_ptr<QuicEncryptedPacket> encrypted(
9795       AssemblePacketFromFragments(packet_ietf));
9796   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9797   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9798 
9799   EXPECT_THAT(framer_.error(), IsQuicNoError());
9800   ASSERT_TRUE(visitor_.header_.get());
9801   EXPECT_TRUE(CheckDecryption(
9802       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9803       kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9804 
9805   EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
9806   EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
9807   CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
9808 }
9809 
9810 // Check that when we get a STREAMS_BLOCKED frame that specifies too large
9811 // a stream count, we reject with an appropriate error. There is no need to
9812 // check for different combinations of Uni/Bi directional and client/server
9813 // initiated; the logic does not take these into account.
TEST_P(QuicFramerTest,StreamsBlockedFrameTooBig)9814 TEST_P(QuicFramerTest, StreamsBlockedFrameTooBig) {
9815   // This frame is only for IETF QUIC.
9816   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9817     return;
9818   }
9819   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9820 
9821   // clang-format off
9822   unsigned char packet_ietf[] = {
9823     // type (short header, 4 byte packet number)
9824     0x43,
9825     // Test runs in client mode, no connection id
9826     // packet number
9827     0x12, 0x34, 0x9A, 0xBC,
9828     // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL)
9829     0x16,
9830 
9831     // max. streams. Max stream ID allowed is 0xffffffff
9832     // This encodes a count of 0x40000000, leading to stream
9833     // IDs in the range 0x1 00000000 to 0x1 00000003.
9834     kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01
9835   };
9836   // clang-format on
9837 
9838   QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9839                                 ABSL_ARRAYSIZE(packet_ietf), false);
9840   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9841   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
9842 
9843   EXPECT_THAT(framer_.error(), IsError(QUIC_STREAMS_BLOCKED_DATA));
9844   EXPECT_EQ(framer_.detailed_error(),
9845             "STREAMS_BLOCKED stream count exceeds implementation limit.");
9846 }
9847 
9848 // Specifically test that count==0 is accepted.
TEST_P(QuicFramerTest,StreamsBlockedFrameZeroCount)9849 TEST_P(QuicFramerTest, StreamsBlockedFrameZeroCount) {
9850   // This frame is only for IETF QUIC.
9851   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9852     return;
9853   }
9854 
9855   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9856 
9857   // clang-format off
9858   PacketFragments packet_ietf = {
9859       // type (short header, 4 byte packet number)
9860       {"",
9861        {0x43}},
9862       // connection_id
9863       {"",
9864        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9865       // packet number
9866       {"",
9867        {0x12, 0x34, 0x9A, 0xBC}},
9868       // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
9869       {"",
9870        {0x17}},
9871       // stream id
9872       {"Unable to read IETF_STREAMS_BLOCKED_UNIDIRECTIONAL "
9873        "frame stream id/count.",
9874        {kVarInt62OneByte + 0x00}},
9875   };
9876   // clang-format on
9877 
9878   std::unique_ptr<QuicEncryptedPacket> encrypted(
9879       AssemblePacketFromFragments(packet_ietf));
9880   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9881 
9882   EXPECT_THAT(framer_.error(), IsQuicNoError());
9883   ASSERT_TRUE(visitor_.header_.get());
9884   EXPECT_TRUE(CheckDecryption(
9885       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9886       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9887 
9888   EXPECT_EQ(0u, visitor_.streams_blocked_frame_.stream_count);
9889   EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
9890 
9891   CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
9892 }
9893 
TEST_P(QuicFramerTest,BuildBiDiStreamsBlockedPacket)9894 TEST_P(QuicFramerTest, BuildBiDiStreamsBlockedPacket) {
9895   // This frame is only for IETF QUIC.
9896   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9897     return;
9898   }
9899 
9900   QuicPacketHeader header;
9901   header.destination_connection_id = FramerTestConnectionId();
9902   header.reset_flag = false;
9903   header.version_flag = false;
9904   header.packet_number = kPacketNumber;
9905 
9906   QuicStreamsBlockedFrame frame;
9907   frame.stream_count = 3;
9908   frame.unidirectional = false;
9909 
9910   QuicFrames frames = {QuicFrame(frame)};
9911 
9912   // clang-format off
9913   unsigned char packet_ietf[] = {
9914     // type (short header, 4 byte packet number)
9915     0x43,
9916     // connection_id
9917     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9918     // packet number
9919     0x12, 0x34, 0x56, 0x78,
9920 
9921     // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
9922     0x16,
9923     // Stream count
9924     kVarInt62OneByte + 0x03
9925   };
9926   // clang-format on
9927 
9928   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9929   ASSERT_TRUE(data != nullptr);
9930 
9931   quiche::test::CompareCharArraysWithHexError(
9932       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9933       ABSL_ARRAYSIZE(packet_ietf));
9934 }
9935 
TEST_P(QuicFramerTest,BuildUniStreamsBlockedPacket)9936 TEST_P(QuicFramerTest, BuildUniStreamsBlockedPacket) {
9937   // This frame is only for IETF QUIC.
9938   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9939     return;
9940   }
9941 
9942   QuicPacketHeader header;
9943   header.destination_connection_id = FramerTestConnectionId();
9944   header.reset_flag = false;
9945   header.version_flag = false;
9946   header.packet_number = kPacketNumber;
9947 
9948   QuicStreamsBlockedFrame frame;
9949   frame.stream_count = 3;
9950   frame.unidirectional = true;
9951 
9952   QuicFrames frames = {QuicFrame(frame)};
9953 
9954   // clang-format off
9955   unsigned char packet_ietf[] = {
9956     // type (short header, 4 byte packet number)
9957     0x43,
9958     // connection_id
9959     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9960     // packet number
9961     0x12, 0x34, 0x56, 0x78,
9962 
9963     // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
9964     0x17,
9965     // Stream count
9966     kVarInt62OneByte + 0x03
9967   };
9968   // clang-format on
9969 
9970   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9971   ASSERT_TRUE(data != nullptr);
9972 
9973   quiche::test::CompareCharArraysWithHexError(
9974       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9975       ABSL_ARRAYSIZE(packet_ietf));
9976 }
9977 
TEST_P(QuicFramerTest,BuildBiDiMaxStreamsPacket)9978 TEST_P(QuicFramerTest, BuildBiDiMaxStreamsPacket) {
9979   // This frame is only for IETF QUIC.
9980   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9981     return;
9982   }
9983 
9984   QuicPacketHeader header;
9985   header.destination_connection_id = FramerTestConnectionId();
9986   header.reset_flag = false;
9987   header.version_flag = false;
9988   header.packet_number = kPacketNumber;
9989 
9990   QuicMaxStreamsFrame frame;
9991   frame.stream_count = 3;
9992   frame.unidirectional = false;
9993 
9994   QuicFrames frames = {QuicFrame(frame)};
9995 
9996   // clang-format off
9997   unsigned char packet_ietf[] = {
9998     // type (short header, 4 byte packet number)
9999     0x43,
10000     // connection_id
10001     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10002     // packet number
10003     0x12, 0x34, 0x56, 0x78,
10004 
10005     // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL frame)
10006     0x12,
10007     // Stream count
10008     kVarInt62OneByte + 0x03
10009   };
10010   // clang-format on
10011 
10012   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10013   ASSERT_TRUE(data != nullptr);
10014 
10015   quiche::test::CompareCharArraysWithHexError(
10016       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10017       ABSL_ARRAYSIZE(packet_ietf));
10018 }
10019 
TEST_P(QuicFramerTest,BuildUniDiMaxStreamsPacket)10020 TEST_P(QuicFramerTest, BuildUniDiMaxStreamsPacket) {
10021   // This frame is only for IETF QUIC.
10022   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10023     return;
10024   }
10025 
10026   // This test runs in client mode.
10027   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10028 
10029   QuicPacketHeader header;
10030   header.destination_connection_id = FramerTestConnectionId();
10031   header.reset_flag = false;
10032   header.version_flag = false;
10033   header.packet_number = kPacketNumber;
10034 
10035   QuicMaxStreamsFrame frame;
10036   frame.stream_count = 3;
10037   frame.unidirectional = true;
10038 
10039   QuicFrames frames = {QuicFrame(frame)};
10040 
10041   // clang-format off
10042   unsigned char packet_ietf[] = {
10043     // type (short header, 4 byte packet number)
10044     0x43,
10045     // connection_id
10046     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10047     // packet number
10048     0x12, 0x34, 0x56, 0x78,
10049 
10050     // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
10051     0x13,
10052     // Stream count
10053     kVarInt62OneByte + 0x03
10054   };
10055   // clang-format on
10056 
10057   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10058   ASSERT_TRUE(data != nullptr);
10059 
10060   quiche::test::CompareCharArraysWithHexError(
10061       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10062       ABSL_ARRAYSIZE(packet_ietf));
10063 }
10064 
TEST_P(QuicFramerTest,NewConnectionIdFrame)10065 TEST_P(QuicFramerTest, NewConnectionIdFrame) {
10066   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10067     // This frame is only for IETF QUIC.
10068     return;
10069   }
10070   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10071   // clang-format off
10072   PacketFragments packet_ietf = {
10073       // type (short header, 4 byte packet number)
10074       {"",
10075        {0x43}},
10076       // connection_id
10077       {"",
10078        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10079       // packet number
10080       {"",
10081        {0x12, 0x34, 0x56, 0x78}},
10082       // frame type (IETF_NEW_CONNECTION_ID frame)
10083       {"",
10084        {0x18}},
10085       // error code
10086       {"Unable to read new connection ID frame sequence number.",
10087        {kVarInt62OneByte + 0x11}},
10088       {"Unable to read new connection ID frame retire_prior_to.",
10089        {kVarInt62OneByte + 0x09}},
10090       {"Unable to read new connection ID frame connection id.",
10091        {0x08}},  // connection ID length
10092       {"Unable to read new connection ID frame connection id.",
10093        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11}},
10094       {"Can not read new connection ID frame reset token.",
10095        {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
10096         0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}}
10097   };
10098   // clang-format on
10099 
10100   std::unique_ptr<QuicEncryptedPacket> encrypted(
10101       AssemblePacketFromFragments(packet_ietf));
10102   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10103 
10104   EXPECT_THAT(framer_.error(), IsQuicNoError());
10105   ASSERT_TRUE(visitor_.header_.get());
10106   EXPECT_TRUE(CheckDecryption(
10107       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10108       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10109 
10110   EXPECT_EQ(0u, visitor_.stream_frames_.size());
10111 
10112   EXPECT_EQ(FramerTestConnectionIdPlusOne(),
10113             visitor_.new_connection_id_.connection_id);
10114   EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
10115   EXPECT_EQ(0x09u, visitor_.new_connection_id_.retire_prior_to);
10116   EXPECT_EQ(kTestStatelessResetToken,
10117             visitor_.new_connection_id_.stateless_reset_token);
10118 
10119   ASSERT_EQ(0u, visitor_.ack_frames_.size());
10120 
10121   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
10122 }
10123 
TEST_P(QuicFramerTest,NewConnectionIdFrameVariableLength)10124 TEST_P(QuicFramerTest, NewConnectionIdFrameVariableLength) {
10125   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10126     // This frame is only for IETF QUIC.
10127     return;
10128   }
10129   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10130   // clang-format off
10131   PacketFragments packet_ietf = {
10132       // type (short header, 4 byte packet number)
10133       {"",
10134        {0x43}},
10135       // connection_id
10136       {"",
10137        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10138       // packet number
10139       {"",
10140        {0x12, 0x34, 0x56, 0x78}},
10141       // frame type (IETF_NEW_CONNECTION_ID frame)
10142       {"",
10143        {0x18}},
10144       // error code
10145       {"Unable to read new connection ID frame sequence number.",
10146        {kVarInt62OneByte + 0x11}},
10147       {"Unable to read new connection ID frame retire_prior_to.",
10148        {kVarInt62OneByte + 0x0a}},
10149       {"Unable to read new connection ID frame connection id.",
10150        {0x09}},  // connection ID length
10151       {"Unable to read new connection ID frame connection id.",
10152        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
10153       {"Can not read new connection ID frame reset token.",
10154        {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
10155         0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}}
10156   };
10157   // clang-format on
10158 
10159   std::unique_ptr<QuicEncryptedPacket> encrypted(
10160       AssemblePacketFromFragments(packet_ietf));
10161   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10162 
10163   EXPECT_THAT(framer_.error(), IsQuicNoError());
10164   ASSERT_TRUE(visitor_.header_.get());
10165   EXPECT_TRUE(CheckDecryption(
10166       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10167       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10168 
10169   EXPECT_EQ(0u, visitor_.stream_frames_.size());
10170 
10171   EXPECT_EQ(FramerTestConnectionIdNineBytes(),
10172             visitor_.new_connection_id_.connection_id);
10173   EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
10174   EXPECT_EQ(0x0au, visitor_.new_connection_id_.retire_prior_to);
10175   EXPECT_EQ(kTestStatelessResetToken,
10176             visitor_.new_connection_id_.stateless_reset_token);
10177 
10178   ASSERT_EQ(0u, visitor_.ack_frames_.size());
10179 
10180   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
10181 }
10182 
10183 // Verifies that parsing a NEW_CONNECTION_ID frame with a length above the
10184 // specified maximum fails.
TEST_P(QuicFramerTest,InvalidLongNewConnectionIdFrame)10185 TEST_P(QuicFramerTest, InvalidLongNewConnectionIdFrame) {
10186   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10187     // The NEW_CONNECTION_ID frame is only for IETF QUIC.
10188     return;
10189   }
10190   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10191   // clang-format off
10192   PacketFragments packet_ietf = {
10193       // type (short header, 4 byte packet number)
10194       {"",
10195        {0x43}},
10196       // connection_id
10197       {"",
10198        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10199       // packet number
10200       {"",
10201        {0x12, 0x34, 0x56, 0x78}},
10202       // frame type (IETF_NEW_CONNECTION_ID frame)
10203       {"",
10204        {0x18}},
10205       // error code
10206       {"Unable to read new connection ID frame sequence number.",
10207        {kVarInt62OneByte + 0x11}},
10208       {"Unable to read new connection ID frame retire_prior_to.",
10209        {kVarInt62OneByte + 0x0b}},
10210       {"Unable to read new connection ID frame connection id.",
10211        {0x40}},  // connection ID length
10212       {"Unable to read new connection ID frame connection id.",
10213        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10214         0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10215         0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10216         0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10217         0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10218         0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10219         0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10220         0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E}},
10221       {"Can not read new connection ID frame reset token.",
10222        {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10223         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10224   };
10225   // clang-format on
10226 
10227   std::unique_ptr<QuicEncryptedPacket> encrypted(
10228       AssemblePacketFromFragments(packet_ietf));
10229   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10230   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_NEW_CONNECTION_ID_DATA));
10231   EXPECT_EQ("Invalid new connection ID length for version.",
10232             framer_.detailed_error());
10233 }
10234 
10235 // Verifies that parsing a NEW_CONNECTION_ID frame with an invalid
10236 // retire-prior-to fails.
TEST_P(QuicFramerTest,InvalidRetirePriorToNewConnectionIdFrame)10237 TEST_P(QuicFramerTest, InvalidRetirePriorToNewConnectionIdFrame) {
10238   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10239     // This frame is only for IETF QUIC only.
10240     return;
10241   }
10242   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10243   // clang-format off
10244   PacketFragments packet_ietf = {
10245       // type (short header, 4 byte packet number)
10246       {"",
10247        {0x43}},
10248       // connection_id
10249       {"",
10250        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10251       // packet number
10252       {"",
10253        {0x12, 0x34, 0x56, 0x78}},
10254       // frame type (IETF_NEW_CONNECTION_ID frame)
10255       {"",
10256        {0x18}},
10257       // sequence number
10258       {"Unable to read new connection ID frame sequence number.",
10259        {kVarInt62OneByte + 0x11}},
10260       {"Unable to read new connection ID frame retire_prior_to.",
10261        {kVarInt62OneByte + 0x1b}},
10262       {"Unable to read new connection ID frame connection id length.",
10263        {0x08}},  // connection ID length
10264       {"Unable to read new connection ID frame connection id.",
10265        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11}},
10266       {"Can not read new connection ID frame reset token.",
10267        {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10268         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10269   };
10270   // clang-format on
10271 
10272   std::unique_ptr<QuicEncryptedPacket> encrypted(
10273       AssemblePacketFromFragments(packet_ietf));
10274   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10275   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_NEW_CONNECTION_ID_DATA));
10276   EXPECT_EQ("Retire_prior_to > sequence_number.", framer_.detailed_error());
10277 }
10278 
TEST_P(QuicFramerTest,BuildNewConnectionIdFramePacket)10279 TEST_P(QuicFramerTest, BuildNewConnectionIdFramePacket) {
10280   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10281     // This frame is only for IETF QUIC only.
10282     return;
10283   }
10284   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10285   QuicPacketHeader header;
10286   header.destination_connection_id = FramerTestConnectionId();
10287   header.reset_flag = false;
10288   header.version_flag = false;
10289   header.packet_number = kPacketNumber;
10290 
10291   QuicNewConnectionIdFrame frame;
10292   frame.sequence_number = 0x11;
10293   frame.retire_prior_to = 0x0c;
10294   // Use this value to force a 4-byte encoded variable length connection ID
10295   // in the frame.
10296   frame.connection_id = FramerTestConnectionIdPlusOne();
10297   frame.stateless_reset_token = kTestStatelessResetToken;
10298 
10299   QuicFrames frames = {QuicFrame(&frame)};
10300 
10301   // clang-format off
10302   unsigned char packet_ietf[] = {
10303     // type (short header, 4 byte packet number)
10304     0x43,
10305     // connection_id
10306     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10307     // packet number
10308     0x12, 0x34, 0x56, 0x78,
10309 
10310     // frame type (IETF_NEW_CONNECTION_ID frame)
10311     0x18,
10312     // sequence number
10313     kVarInt62OneByte + 0x11,
10314     // retire_prior_to
10315     kVarInt62OneByte + 0x0c,
10316     // new connection id length
10317     0x08,
10318     // new connection id
10319     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
10320     // stateless reset token
10321     0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
10322     0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
10323   };
10324   // clang-format on
10325 
10326   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10327   ASSERT_TRUE(data != nullptr);
10328 
10329   quiche::test::CompareCharArraysWithHexError(
10330       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10331       ABSL_ARRAYSIZE(packet_ietf));
10332 }
10333 
TEST_P(QuicFramerTest,NewTokenFrame)10334 TEST_P(QuicFramerTest, NewTokenFrame) {
10335   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10336     // This frame is only for IETF QUIC only.
10337     return;
10338   }
10339   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10340   // clang-format off
10341   PacketFragments packet = {
10342       // type (short header, 4 byte packet number)
10343       {"",
10344        {0x43}},
10345       // connection_id
10346       {"",
10347        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10348       // packet number
10349       {"",
10350        {0x12, 0x34, 0x56, 0x78}},
10351       // frame type (IETF_NEW_TOKEN frame)
10352       {"",
10353        {0x07}},
10354       // Length
10355       {"Unable to read new token length.",
10356        {kVarInt62OneByte + 0x08}},
10357       {"Unable to read new token data.",
10358        {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}}
10359   };
10360   // clang-format on
10361   uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
10362                                     0x04, 0x05, 0x06, 0x07};
10363 
10364   std::unique_ptr<QuicEncryptedPacket> encrypted(
10365       AssemblePacketFromFragments(packet));
10366   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10367 
10368   EXPECT_THAT(framer_.error(), IsQuicNoError());
10369   ASSERT_TRUE(visitor_.header_.get());
10370   EXPECT_TRUE(CheckDecryption(
10371       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10372       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10373 
10374   EXPECT_EQ(0u, visitor_.stream_frames_.size());
10375 
10376   EXPECT_EQ(sizeof(expected_token_value), visitor_.new_token_.token.length());
10377   EXPECT_EQ(0, memcmp(expected_token_value, visitor_.new_token_.token.data(),
10378                       sizeof(expected_token_value)));
10379 
10380   CheckFramingBoundaries(packet, QUIC_INVALID_NEW_TOKEN);
10381 }
10382 
TEST_P(QuicFramerTest,BuildNewTokenFramePacket)10383 TEST_P(QuicFramerTest, BuildNewTokenFramePacket) {
10384   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10385     // This frame is only for IETF QUIC only.
10386     return;
10387   }
10388   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10389   QuicPacketHeader header;
10390   header.destination_connection_id = FramerTestConnectionId();
10391   header.reset_flag = false;
10392   header.version_flag = false;
10393   header.packet_number = kPacketNumber;
10394 
10395   uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
10396                                     0x04, 0x05, 0x06, 0x07};
10397 
10398   QuicNewTokenFrame frame(0,
10399                           absl::string_view((const char*)(expected_token_value),
10400                                             sizeof(expected_token_value)));
10401 
10402   QuicFrames frames = {QuicFrame(&frame)};
10403 
10404   // clang-format off
10405   unsigned char packet[] = {
10406     // type (short header, 4 byte packet number)
10407     0x43,
10408     // connection_id
10409     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10410     // packet number
10411     0x12, 0x34, 0x56, 0x78,
10412 
10413     // frame type (IETF_NEW_TOKEN frame)
10414     0x07,
10415     // Length and token
10416     kVarInt62OneByte + 0x08,
10417     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
10418   };
10419   // clang-format on
10420 
10421   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10422   ASSERT_TRUE(data != nullptr);
10423 
10424   quiche::test::CompareCharArraysWithHexError(
10425       "constructed packet", data->data(), data->length(), AsChars(packet),
10426       ABSL_ARRAYSIZE(packet));
10427 }
10428 
TEST_P(QuicFramerTest,IetfStopSendingFrame)10429 TEST_P(QuicFramerTest, IetfStopSendingFrame) {
10430   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10431     // Stop sending frame is IETF QUIC only.
10432     return;
10433   }
10434   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10435 
10436   // clang-format off
10437   PacketFragments packet_ietf = {
10438       // type (short header, 4 byte packet number)
10439       {"",
10440        {0x43}},
10441       // connection_id
10442       {"",
10443        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10444       // packet number
10445       {"",
10446        {0x12, 0x34, 0x9A, 0xBC}},
10447       // frame type (IETF_STOP_SENDING frame)
10448       {"",
10449        {0x05}},
10450       // stream id
10451       {"Unable to read IETF_STOP_SENDING frame stream id/count.",
10452        {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
10453       {"Unable to read stop sending application error code.",
10454        {kVarInt62FourBytes + 0x00, 0x00, 0x76, 0x54}},
10455   };
10456   // clang-format on
10457 
10458   std::unique_ptr<QuicEncryptedPacket> encrypted(
10459       AssemblePacketFromFragments(packet_ietf));
10460   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10461 
10462   EXPECT_THAT(framer_.error(), IsQuicNoError());
10463   ASSERT_TRUE(visitor_.header_.get());
10464   EXPECT_TRUE(CheckDecryption(
10465       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10466       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10467 
10468   EXPECT_EQ(kStreamId, visitor_.stop_sending_frame_.stream_id);
10469   EXPECT_EQ(QUIC_STREAM_UNKNOWN_APPLICATION_ERROR_CODE,
10470             visitor_.stop_sending_frame_.error_code);
10471   EXPECT_EQ(static_cast<uint64_t>(0x7654),
10472             visitor_.stop_sending_frame_.ietf_error_code);
10473 
10474   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_STOP_SENDING_FRAME_DATA);
10475 }
10476 
TEST_P(QuicFramerTest,BuildIetfStopSendingPacket)10477 TEST_P(QuicFramerTest, BuildIetfStopSendingPacket) {
10478   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10479     // Stop sending frame is IETF QUIC only.
10480     return;
10481   }
10482 
10483   QuicPacketHeader header;
10484   header.destination_connection_id = FramerTestConnectionId();
10485   header.reset_flag = false;
10486   header.version_flag = false;
10487   header.packet_number = kPacketNumber;
10488 
10489   QuicStopSendingFrame frame;
10490   frame.stream_id = kStreamId;
10491   frame.error_code = QUIC_STREAM_ENCODER_STREAM_ERROR;
10492   frame.ietf_error_code =
10493       static_cast<uint64_t>(QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR);
10494   QuicFrames frames = {QuicFrame(frame)};
10495 
10496   // clang-format off
10497   unsigned char packet_ietf[] = {
10498     // type (short header, 4 byte packet number)
10499     0x43,
10500     // connection_id
10501     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10502     // packet number
10503     0x12, 0x34, 0x56, 0x78,
10504 
10505     // frame type (IETF_STOP_SENDING frame)
10506     0x05,
10507     // Stream ID
10508     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
10509     // Application error code
10510     kVarInt62TwoBytes + 0x02, 0x01,
10511   };
10512   // clang-format on
10513 
10514   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10515   ASSERT_TRUE(data != nullptr);
10516 
10517   quiche::test::CompareCharArraysWithHexError(
10518       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10519       ABSL_ARRAYSIZE(packet_ietf));
10520 }
10521 
TEST_P(QuicFramerTest,IetfPathChallengeFrame)10522 TEST_P(QuicFramerTest, IetfPathChallengeFrame) {
10523   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10524     // Path Challenge frame is IETF QUIC only.
10525     return;
10526   }
10527   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10528 
10529   // clang-format off
10530   PacketFragments packet_ietf = {
10531       // type (short header, 4 byte packet number)
10532       {"",
10533        {0x43}},
10534       // connection_id
10535       {"",
10536        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10537       // packet number
10538       {"",
10539        {0x12, 0x34, 0x9A, 0xBC}},
10540       // frame type (IETF_PATH_CHALLENGE)
10541       {"",
10542        {0x1a}},
10543       // data
10544       {"Can not read path challenge data.",
10545        {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
10546   };
10547   // clang-format on
10548 
10549   std::unique_ptr<QuicEncryptedPacket> encrypted(
10550       AssemblePacketFromFragments(packet_ietf));
10551   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10552 
10553   EXPECT_THAT(framer_.error(), IsQuicNoError());
10554   ASSERT_TRUE(visitor_.header_.get());
10555   EXPECT_TRUE(CheckDecryption(
10556       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10557       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10558 
10559   EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
10560             visitor_.path_challenge_frame_.data_buffer);
10561 
10562   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_PATH_CHALLENGE_DATA);
10563 }
10564 
TEST_P(QuicFramerTest,BuildIetfPathChallengePacket)10565 TEST_P(QuicFramerTest, BuildIetfPathChallengePacket) {
10566   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10567     // Path Challenge frame is IETF QUIC only.
10568     return;
10569   }
10570 
10571   QuicPacketHeader header;
10572   header.destination_connection_id = FramerTestConnectionId();
10573   header.reset_flag = false;
10574   header.version_flag = false;
10575   header.packet_number = kPacketNumber;
10576 
10577   QuicPathChallengeFrame frame;
10578   frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
10579   QuicFrames frames = {QuicFrame(frame)};
10580 
10581   // clang-format off
10582   unsigned char packet_ietf[] = {
10583     // type (short header, 4 byte packet number)
10584     0x43,
10585     // connection_id
10586     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10587     // packet number
10588     0x12, 0x34, 0x56, 0x78,
10589 
10590     // frame type (IETF_PATH_CHALLENGE)
10591     0x1a,
10592     // Data
10593     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
10594   };
10595   // clang-format on
10596 
10597   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10598   ASSERT_TRUE(data != nullptr);
10599 
10600   quiche::test::CompareCharArraysWithHexError(
10601       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10602       ABSL_ARRAYSIZE(packet_ietf));
10603 }
10604 
TEST_P(QuicFramerTest,IetfPathResponseFrame)10605 TEST_P(QuicFramerTest, IetfPathResponseFrame) {
10606   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10607     // Path response frame is IETF QUIC only.
10608     return;
10609   }
10610   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10611 
10612   // clang-format off
10613   PacketFragments packet_ietf = {
10614       // type (short header, 4 byte packet number)
10615       {"",
10616        {0x43}},
10617       // connection_id
10618       {"",
10619        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10620       // packet number
10621       {"",
10622        {0x12, 0x34, 0x9A, 0xBC}},
10623       // frame type (IETF_PATH_RESPONSE)
10624       {"",
10625        {0x1b}},
10626       // data
10627       {"Can not read path response data.",
10628        {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
10629   };
10630   // clang-format on
10631 
10632   std::unique_ptr<QuicEncryptedPacket> encrypted(
10633       AssemblePacketFromFragments(packet_ietf));
10634   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10635 
10636   EXPECT_THAT(framer_.error(), IsQuicNoError());
10637   ASSERT_TRUE(visitor_.header_.get());
10638   EXPECT_TRUE(CheckDecryption(
10639       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10640       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10641 
10642   EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
10643             visitor_.path_response_frame_.data_buffer);
10644 
10645   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_PATH_RESPONSE_DATA);
10646 }
10647 
TEST_P(QuicFramerTest,BuildIetfPathResponsePacket)10648 TEST_P(QuicFramerTest, BuildIetfPathResponsePacket) {
10649   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10650     // Path response frame is IETF QUIC only
10651     return;
10652   }
10653 
10654   QuicPacketHeader header;
10655   header.destination_connection_id = FramerTestConnectionId();
10656   header.reset_flag = false;
10657   header.version_flag = false;
10658   header.packet_number = kPacketNumber;
10659 
10660   QuicPathResponseFrame frame;
10661   frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
10662   QuicFrames frames = {QuicFrame(frame)};
10663 
10664   // clang-format off
10665   unsigned char packet_ietf[] = {
10666     // type (short header, 4 byte packet number)
10667     0x43,
10668     // connection_id
10669     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10670     // packet number
10671     0x12, 0x34, 0x56, 0x78,
10672 
10673     // frame type (IETF_PATH_RESPONSE)
10674     0x1b,
10675     // Data
10676     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
10677   };
10678   // clang-format on
10679 
10680   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10681   ASSERT_TRUE(data != nullptr);
10682 
10683   quiche::test::CompareCharArraysWithHexError(
10684       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10685       ABSL_ARRAYSIZE(packet_ietf));
10686 }
10687 
TEST_P(QuicFramerTest,GetRetransmittableControlFrameSize)10688 TEST_P(QuicFramerTest, GetRetransmittableControlFrameSize) {
10689   QuicRstStreamFrame rst_stream(1, 3, QUIC_STREAM_CANCELLED, 1024);
10690   EXPECT_EQ(QuicFramer::GetRstStreamFrameSize(framer_.transport_version(),
10691                                               rst_stream),
10692             QuicFramer::GetRetransmittableControlFrameSize(
10693                 framer_.transport_version(), QuicFrame(&rst_stream)));
10694 
10695   std::string error_detail(2048, 'e');
10696   QuicConnectionCloseFrame connection_close(framer_.transport_version(),
10697                                             QUIC_NETWORK_IDLE_TIMEOUT,
10698                                             NO_IETF_QUIC_ERROR, error_detail,
10699                                             /*transport_close_frame_type=*/0);
10700 
10701   EXPECT_EQ(QuicFramer::GetConnectionCloseFrameSize(framer_.transport_version(),
10702                                                     connection_close),
10703             QuicFramer::GetRetransmittableControlFrameSize(
10704                 framer_.transport_version(), QuicFrame(&connection_close)));
10705 
10706   QuicGoAwayFrame goaway(2, QUIC_PEER_GOING_AWAY, 3, error_detail);
10707   EXPECT_EQ(QuicFramer::GetMinGoAwayFrameSize() + 256,
10708             QuicFramer::GetRetransmittableControlFrameSize(
10709                 framer_.transport_version(), QuicFrame(&goaway)));
10710 
10711   QuicWindowUpdateFrame window_update(3, 3, 1024);
10712   EXPECT_EQ(QuicFramer::GetWindowUpdateFrameSize(framer_.transport_version(),
10713                                                  window_update),
10714             QuicFramer::GetRetransmittableControlFrameSize(
10715                 framer_.transport_version(), QuicFrame(window_update)));
10716 
10717   QuicBlockedFrame blocked(4, 3, 1024);
10718   EXPECT_EQ(
10719       QuicFramer::GetBlockedFrameSize(framer_.transport_version(), blocked),
10720       QuicFramer::GetRetransmittableControlFrameSize(
10721           framer_.transport_version(), QuicFrame(blocked)));
10722 
10723   // Following frames are IETF QUIC frames only.
10724   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10725     return;
10726   }
10727 
10728   QuicNewConnectionIdFrame new_connection_id(5, TestConnectionId(), 1,
10729                                              kTestStatelessResetToken, 1);
10730   EXPECT_EQ(QuicFramer::GetNewConnectionIdFrameSize(new_connection_id),
10731             QuicFramer::GetRetransmittableControlFrameSize(
10732                 framer_.transport_version(), QuicFrame(&new_connection_id)));
10733 
10734   QuicMaxStreamsFrame max_streams(6, 3, /*unidirectional=*/false);
10735   EXPECT_EQ(QuicFramer::GetMaxStreamsFrameSize(framer_.transport_version(),
10736                                                max_streams),
10737             QuicFramer::GetRetransmittableControlFrameSize(
10738                 framer_.transport_version(), QuicFrame(max_streams)));
10739 
10740   QuicStreamsBlockedFrame streams_blocked(7, 3, /*unidirectional=*/false);
10741   EXPECT_EQ(QuicFramer::GetStreamsBlockedFrameSize(framer_.transport_version(),
10742                                                    streams_blocked),
10743             QuicFramer::GetRetransmittableControlFrameSize(
10744                 framer_.transport_version(), QuicFrame(streams_blocked)));
10745 
10746   QuicPathFrameBuffer buffer = {
10747       {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
10748   QuicPathResponseFrame path_response_frame(8, buffer);
10749   EXPECT_EQ(QuicFramer::GetPathResponseFrameSize(path_response_frame),
10750             QuicFramer::GetRetransmittableControlFrameSize(
10751                 framer_.transport_version(), QuicFrame(path_response_frame)));
10752 
10753   QuicPathChallengeFrame path_challenge_frame(9, buffer);
10754   EXPECT_EQ(QuicFramer::GetPathChallengeFrameSize(path_challenge_frame),
10755             QuicFramer::GetRetransmittableControlFrameSize(
10756                 framer_.transport_version(), QuicFrame(path_challenge_frame)));
10757 
10758   QuicStopSendingFrame stop_sending_frame(10, 3, QUIC_STREAM_CANCELLED);
10759   EXPECT_EQ(QuicFramer::GetStopSendingFrameSize(stop_sending_frame),
10760             QuicFramer::GetRetransmittableControlFrameSize(
10761                 framer_.transport_version(), QuicFrame(stop_sending_frame)));
10762 }
10763 
10764 // A set of tests to ensure that bad frame-type encodings
10765 // are properly detected and handled.
10766 // First, four tests to see that unknown frame types generate
10767 // a QUIC_INVALID_FRAME_DATA error with detailed information
10768 // "Illegal frame type." This regardless of the encoding of the type
10769 // (1/2/4/8 bytes).
10770 // This only for version 99.
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorUnknown1Byte)10771 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown1Byte) {
10772   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10773     // Only IETF QUIC encodes frame types such that this test is relevant.
10774     return;
10775   }
10776   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10777   // clang-format off
10778   PacketFragments packet = {
10779       // type (short header, 4 byte packet number)
10780       {"",
10781        {0x43}},
10782       // connection_id
10783       {"",
10784        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10785       // packet number
10786       {"",
10787        {0x12, 0x34, 0x9A, 0xBC}},
10788       // frame type (unknown value, single-byte encoding)
10789       {"",
10790        {0x38}}
10791   };
10792   // clang-format on
10793 
10794   std::unique_ptr<QuicEncryptedPacket> encrypted(
10795       AssemblePacketFromFragments(packet));
10796 
10797   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10798 
10799   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
10800   EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
10801 }
10802 
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorUnknown2Bytes)10803 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown2Bytes) {
10804   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10805     // Only IETF QUIC encodes frame types such that this test is relevant.
10806     return;
10807   }
10808   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10809 
10810   // clang-format off
10811   PacketFragments packet = {
10812       // type (short header, 4 byte packet number)
10813       {"",
10814        {0x43}},
10815       // connection_id
10816       {"",
10817        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10818       // packet number
10819       {"",
10820        {0x12, 0x34, 0x9A, 0xBC}},
10821       // frame type (unknown value, two-byte encoding)
10822       {"",
10823        {kVarInt62TwoBytes + 0x01, 0x38}}
10824   };
10825   // clang-format on
10826 
10827   std::unique_ptr<QuicEncryptedPacket> encrypted(
10828       AssemblePacketFromFragments(packet));
10829 
10830   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10831 
10832   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
10833   EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
10834 }
10835 
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorUnknown4Bytes)10836 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown4Bytes) {
10837   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10838     // Only IETF QUIC encodes frame types such that this test is relevant.
10839     return;
10840   }
10841   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10842 
10843   // clang-format off
10844   PacketFragments packet = {
10845       // type (short header, 4 byte packet number)
10846       {"",
10847        {0x43}},
10848       // connection_id
10849       {"",
10850        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10851       // packet number
10852       {"",
10853        {0x12, 0x34, 0x9A, 0xBC}},
10854       // frame type (unknown value, four-byte encoding)
10855       {"",
10856        {kVarInt62FourBytes + 0x01, 0x00, 0x00, 0x38}}
10857   };
10858   // clang-format on
10859 
10860   std::unique_ptr<QuicEncryptedPacket> encrypted(
10861       AssemblePacketFromFragments(packet));
10862 
10863   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10864 
10865   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
10866   EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
10867 }
10868 
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorUnknown8Bytes)10869 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown8Bytes) {
10870   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10871     // Only IETF QUIC encodes frame types such that this test is relevant.
10872     return;
10873   }
10874   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10875   // clang-format off
10876   PacketFragments packet = {
10877       // type (short header, 4 byte packet number)
10878       {"",
10879        {0x43}},
10880       // connection_id
10881       {"",
10882        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10883       // packet number
10884       {"",
10885        {0x12, 0x34, 0x9A, 0xBC}},
10886       // frame type (unknown value, eight-byte encoding)
10887       {"",
10888        {kVarInt62EightBytes + 0x01, 0x00, 0x00, 0x01, 0x02, 0x34, 0x56, 0x38}}
10889   };
10890   // clang-format on
10891 
10892   std::unique_ptr<QuicEncryptedPacket> encrypted(
10893       AssemblePacketFromFragments(packet));
10894 
10895   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10896 
10897   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
10898   EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
10899 }
10900 
10901 // Three tests to check that known frame types that are not minimally
10902 // encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
10903 // information "Frame type not minimally encoded."
10904 // Look at the frame-type encoded in 2, 4, and 8 bytes.
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorKnown2Bytes)10905 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2Bytes) {
10906   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10907     // Only IETF QUIC encodes frame types such that this test is relevant.
10908     return;
10909   }
10910   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10911 
10912   // clang-format off
10913   PacketFragments packet = {
10914       // type (short header, 4 byte packet number)
10915       {"",
10916        {0x43}},
10917       // connection_id
10918       {"",
10919        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10920       // packet number
10921       {"",
10922        {0x12, 0x34, 0x9A, 0xBC}},
10923       // frame type (Blocked, two-byte encoding)
10924       {"",
10925        {kVarInt62TwoBytes + 0x00, 0x08}}
10926   };
10927   // clang-format on
10928 
10929   std::unique_ptr<QuicEncryptedPacket> encrypted(
10930       AssemblePacketFromFragments(packet));
10931 
10932   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10933 
10934   EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
10935   EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
10936 }
10937 
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorKnown4Bytes)10938 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown4Bytes) {
10939   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10940     // Only IETF QUIC encodes frame types such that this test is relevant.
10941     return;
10942   }
10943   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10944 
10945   // clang-format off
10946   PacketFragments packet = {
10947       // type (short header, 4 byte packet number)
10948       {"",
10949        {0x43}},
10950       // connection_id
10951       {"",
10952        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10953       // packet number
10954       {"",
10955        {0x12, 0x34, 0x9A, 0xBC}},
10956       // frame type (Blocked, four-byte encoding)
10957       {"",
10958        {kVarInt62FourBytes + 0x00, 0x00, 0x00, 0x08}}
10959   };
10960   // clang-format on
10961 
10962   std::unique_ptr<QuicEncryptedPacket> encrypted(
10963       AssemblePacketFromFragments(packet));
10964 
10965   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10966 
10967   EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
10968   EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
10969 }
10970 
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorKnown8Bytes)10971 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown8Bytes) {
10972   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10973     // Only IETF QUIC encodes frame types such that this test is relevant.
10974     return;
10975   }
10976   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10977   // clang-format off
10978   PacketFragments packet = {
10979       // type (short header, 4 byte packet number)
10980       {"",
10981        {0x43}},
10982       // connection_id
10983       {"",
10984        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10985       // packet number
10986       {"",
10987        {0x12, 0x34, 0x9A, 0xBC}},
10988       // frame type (Blocked, eight-byte encoding)
10989       {"",
10990        {kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08}}
10991   };
10992   // clang-format on
10993 
10994   std::unique_ptr<QuicEncryptedPacket> encrypted(
10995       AssemblePacketFromFragments(packet));
10996 
10997   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10998 
10999   EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
11000   EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11001 }
11002 
11003 // Tests to check that all known IETF frame types that are not minimally
11004 // encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
11005 // information "Frame type not minimally encoded."
11006 // Just look at 2-byte encoding.
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorKnown2BytesAllTypes)11007 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2BytesAllTypes) {
11008   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
11009     // Only IETF QUIC encodes frame types such that this test is relevant.
11010     return;
11011   }
11012   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11013 
11014   // clang-format off
11015   PacketFragments packets[] = {
11016     {
11017       // type (short header, 4 byte packet number)
11018       {"",
11019        {0x43}},
11020       // connection_id
11021       {"",
11022        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11023       // packet number
11024       {"",
11025        {0x12, 0x34, 0x9A, 0xBC}},
11026       // frame type (two-byte encoding)
11027       {"",
11028        {kVarInt62TwoBytes + 0x00, 0x00}}
11029     },
11030     {
11031       // type (short header, 4 byte packet number)
11032       {"",
11033        {0x43}},
11034       // connection_id
11035       {"",
11036        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11037       // packet number
11038       {"",
11039        {0x12, 0x34, 0x9A, 0xBC}},
11040       // frame type (two-byte encoding)
11041       {"",
11042        {kVarInt62TwoBytes + 0x00, 0x01}}
11043     },
11044     {
11045       // type (short header, 4 byte packet number)
11046       {"",
11047        {0x43}},
11048       // connection_id
11049       {"",
11050        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11051       // packet number
11052       {"",
11053        {0x12, 0x34, 0x9A, 0xBC}},
11054       // frame type (two-byte encoding)
11055       {"",
11056        {kVarInt62TwoBytes + 0x00, 0x02}}
11057     },
11058     {
11059       // type (short header, 4 byte packet number)
11060       {"",
11061        {0x43}},
11062       // connection_id
11063       {"",
11064        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11065       // packet number
11066       {"",
11067        {0x12, 0x34, 0x9A, 0xBC}},
11068       // frame type (two-byte encoding)
11069       {"",
11070        {kVarInt62TwoBytes + 0x00, 0x03}}
11071     },
11072     {
11073       // type (short header, 4 byte packet number)
11074       {"",
11075        {0x43}},
11076       // connection_id
11077       {"",
11078        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11079       // packet number
11080       {"",
11081        {0x12, 0x34, 0x9A, 0xBC}},
11082       // frame type (two-byte encoding)
11083       {"",
11084        {kVarInt62TwoBytes + 0x00, 0x04}}
11085     },
11086     {
11087       // type (short header, 4 byte packet number)
11088       {"",
11089        {0x43}},
11090       // connection_id
11091       {"",
11092        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11093       // packet number
11094       {"",
11095        {0x12, 0x34, 0x9A, 0xBC}},
11096       // frame type (two-byte encoding)
11097       {"",
11098        {kVarInt62TwoBytes + 0x00, 0x05}}
11099     },
11100     {
11101       // type (short header, 4 byte packet number)
11102       {"",
11103        {0x43}},
11104       // connection_id
11105       {"",
11106        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11107       // packet number
11108       {"",
11109        {0x12, 0x34, 0x9A, 0xBC}},
11110       // frame type (two-byte encoding)
11111       {"",
11112        {kVarInt62TwoBytes + 0x00, 0x06}}
11113     },
11114     {
11115       // type (short header, 4 byte packet number)
11116       {"",
11117        {0x43}},
11118       // connection_id
11119       {"",
11120        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11121       // packet number
11122       {"",
11123        {0x12, 0x34, 0x9A, 0xBC}},
11124       // frame type (two-byte encoding)
11125       {"",
11126        {kVarInt62TwoBytes + 0x00, 0x07}}
11127     },
11128     {
11129       // type (short header, 4 byte packet number)
11130       {"",
11131        {0x43}},
11132       // connection_id
11133       {"",
11134        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11135       // packet number
11136       {"",
11137        {0x12, 0x34, 0x9A, 0xBC}},
11138       // frame type (two-byte encoding)
11139       {"",
11140        {kVarInt62TwoBytes + 0x00, 0x08}}
11141     },
11142     {
11143       // type (short header, 4 byte packet number)
11144       {"",
11145        {0x43}},
11146       // connection_id
11147       {"",
11148        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11149       // packet number
11150       {"",
11151        {0x12, 0x34, 0x9A, 0xBC}},
11152       // frame type (two-byte encoding)
11153       {"",
11154        {kVarInt62TwoBytes + 0x00, 0x09}}
11155     },
11156     {
11157       // type (short header, 4 byte packet number)
11158       {"",
11159        {0x43}},
11160       // connection_id
11161       {"",
11162        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11163       // packet number
11164       {"",
11165        {0x12, 0x34, 0x9A, 0xBC}},
11166       // frame type (two-byte encoding)
11167       {"",
11168        {kVarInt62TwoBytes + 0x00, 0x0a}}
11169     },
11170     {
11171       // type (short header, 4 byte packet number)
11172       {"",
11173        {0x43}},
11174       // connection_id
11175       {"",
11176        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11177       // packet number
11178       {"",
11179        {0x12, 0x34, 0x9A, 0xBC}},
11180       // frame type (two-byte encoding)
11181       {"",
11182        {kVarInt62TwoBytes + 0x00, 0x0b}}
11183     },
11184     {
11185       // type (short header, 4 byte packet number)
11186       {"",
11187        {0x43}},
11188       // connection_id
11189       {"",
11190        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11191       // packet number
11192       {"",
11193        {0x12, 0x34, 0x9A, 0xBC}},
11194       // frame type (two-byte encoding)
11195       {"",
11196        {kVarInt62TwoBytes + 0x00, 0x0c}}
11197     },
11198     {
11199       // type (short header, 4 byte packet number)
11200       {"",
11201        {0x43}},
11202       // connection_id
11203       {"",
11204        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11205       // packet number
11206       {"",
11207        {0x12, 0x34, 0x9A, 0xBC}},
11208       // frame type (two-byte encoding)
11209       {"",
11210        {kVarInt62TwoBytes + 0x00, 0x0d}}
11211     },
11212     {
11213       // type (short header, 4 byte packet number)
11214       {"",
11215        {0x43}},
11216       // connection_id
11217       {"",
11218        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11219       // packet number
11220       {"",
11221        {0x12, 0x34, 0x9A, 0xBC}},
11222       // frame type (two-byte encoding)
11223       {"",
11224        {kVarInt62TwoBytes + 0x00, 0x0e}}
11225     },
11226     {
11227       // type (short header, 4 byte packet number)
11228       {"",
11229        {0x43}},
11230       // connection_id
11231       {"",
11232        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11233       // packet number
11234       {"",
11235        {0x12, 0x34, 0x9A, 0xBC}},
11236       // frame type (two-byte encoding)
11237       {"",
11238        {kVarInt62TwoBytes + 0x00, 0x0f}}
11239     },
11240     {
11241       // type (short header, 4 byte packet number)
11242       {"",
11243        {0x43}},
11244       // connection_id
11245       {"",
11246        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11247       // packet number
11248       {"",
11249        {0x12, 0x34, 0x9A, 0xBC}},
11250       // frame type (two-byte encoding)
11251       {"",
11252        {kVarInt62TwoBytes + 0x00, 0x10}}
11253     },
11254     {
11255       // type (short header, 4 byte packet number)
11256       {"",
11257        {0x43}},
11258       // connection_id
11259       {"",
11260        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11261       // packet number
11262       {"",
11263        {0x12, 0x34, 0x9A, 0xBC}},
11264       // frame type (two-byte encoding)
11265       {"",
11266        {kVarInt62TwoBytes + 0x00, 0x11}}
11267     },
11268     {
11269       // type (short header, 4 byte packet number)
11270       {"",
11271        {0x43}},
11272       // connection_id
11273       {"",
11274        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11275       // packet number
11276       {"",
11277        {0x12, 0x34, 0x9A, 0xBC}},
11278       // frame type (two-byte encoding)
11279       {"",
11280        {kVarInt62TwoBytes + 0x00, 0x12}}
11281     },
11282     {
11283       // type (short header, 4 byte packet number)
11284       {"",
11285        {0x43}},
11286       // connection_id
11287       {"",
11288        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11289       // packet number
11290       {"",
11291        {0x12, 0x34, 0x9A, 0xBC}},
11292       // frame type (two-byte encoding)
11293       {"",
11294        {kVarInt62TwoBytes + 0x00, 0x13}}
11295     },
11296     {
11297       // type (short header, 4 byte packet number)
11298       {"",
11299        {0x43}},
11300       // connection_id
11301       {"",
11302        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11303       // packet number
11304       {"",
11305        {0x12, 0x34, 0x9A, 0xBC}},
11306       // frame type (two-byte encoding)
11307       {"",
11308        {kVarInt62TwoBytes + 0x00, 0x14}}
11309     },
11310     {
11311       // type (short header, 4 byte packet number)
11312       {"",
11313        {0x43}},
11314       // connection_id
11315       {"",
11316        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11317       // packet number
11318       {"",
11319        {0x12, 0x34, 0x9A, 0xBC}},
11320       // frame type (two-byte encoding)
11321       {"",
11322        {kVarInt62TwoBytes + 0x00, 0x15}}
11323     },
11324     {
11325       // type (short header, 4 byte packet number)
11326       {"",
11327        {0x43}},
11328       // connection_id
11329       {"",
11330        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11331       // packet number
11332       {"",
11333        {0x12, 0x34, 0x9A, 0xBC}},
11334       // frame type (two-byte encoding)
11335       {"",
11336        {kVarInt62TwoBytes + 0x00, 0x16}}
11337     },
11338     {
11339       // type (short header, 4 byte packet number)
11340       {"",
11341        {0x43}},
11342       // connection_id
11343       {"",
11344        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11345       // packet number
11346       {"",
11347        {0x12, 0x34, 0x9A, 0xBC}},
11348       // frame type (two-byte encoding)
11349       {"",
11350        {kVarInt62TwoBytes + 0x00, 0x17}}
11351     },
11352     {
11353       // type (short header, 4 byte packet number)
11354       {"",
11355        {0x43}},
11356       // connection_id
11357       {"",
11358        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11359       // packet number
11360       {"",
11361        {0x12, 0x34, 0x9A, 0xBC}},
11362       // frame type (two-byte encoding)
11363       {"",
11364        {kVarInt62TwoBytes + 0x00, 0x18}}
11365     },
11366     {
11367       // type (short header, 4 byte packet number)
11368       {"",
11369        {0x43}},
11370       // connection_id
11371       {"",
11372        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11373       // packet number
11374       {"",
11375        {0x12, 0x34, 0x9A, 0xBC}},
11376       // frame type (two-byte encoding)
11377       {"",
11378        {kVarInt62TwoBytes + 0x00, 0x20}}
11379     },
11380     {
11381       // type (short header, 4 byte packet number)
11382       {"",
11383        {0x43}},
11384       // connection_id
11385       {"",
11386        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11387       // packet number
11388       {"",
11389        {0x12, 0x34, 0x9A, 0xBC}},
11390       // frame type (two-byte encoding)
11391       {"",
11392        {kVarInt62TwoBytes + 0x00, 0x21}}
11393     },
11394   };
11395   // clang-format on
11396 
11397   for (PacketFragments& packet : packets) {
11398     std::unique_ptr<QuicEncryptedPacket> encrypted(
11399         AssemblePacketFromFragments(packet));
11400 
11401     EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11402 
11403     EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
11404     EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11405   }
11406 }
11407 
TEST_P(QuicFramerTest,RetireConnectionIdFrame)11408 TEST_P(QuicFramerTest, RetireConnectionIdFrame) {
11409   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
11410     // This frame is only for version 99.
11411     return;
11412   }
11413   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11414   // clang-format off
11415   PacketFragments packet_ietf = {
11416       // type (short header, 4 byte packet number)
11417       {"",
11418        {0x43}},
11419       // connection_id
11420       {"",
11421        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11422       // packet number
11423       {"",
11424        {0x12, 0x34, 0x56, 0x78}},
11425       // frame type (IETF_RETIRE_CONNECTION_ID frame)
11426       {"",
11427        {0x19}},
11428       // Sequence number
11429       {"Unable to read retire connection ID frame sequence number.",
11430        {kVarInt62TwoBytes + 0x11, 0x22}}
11431   };
11432   // clang-format on
11433 
11434   std::unique_ptr<QuicEncryptedPacket> encrypted(
11435       AssemblePacketFromFragments(packet_ietf));
11436   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11437 
11438   EXPECT_THAT(framer_.error(), IsQuicNoError());
11439   ASSERT_TRUE(visitor_.header_.get());
11440   EXPECT_TRUE(CheckDecryption(
11441       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11442       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
11443 
11444   EXPECT_EQ(0u, visitor_.stream_frames_.size());
11445 
11446   EXPECT_EQ(0x1122u, visitor_.retire_connection_id_.sequence_number);
11447 
11448   ASSERT_EQ(0u, visitor_.ack_frames_.size());
11449 
11450   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_RETIRE_CONNECTION_ID_DATA);
11451 }
11452 
TEST_P(QuicFramerTest,BuildRetireConnectionIdFramePacket)11453 TEST_P(QuicFramerTest, BuildRetireConnectionIdFramePacket) {
11454   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
11455     // This frame is only for version 99.
11456     return;
11457   }
11458   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
11459   QuicPacketHeader header;
11460   header.destination_connection_id = FramerTestConnectionId();
11461   header.reset_flag = false;
11462   header.version_flag = false;
11463   header.packet_number = kPacketNumber;
11464 
11465   QuicRetireConnectionIdFrame frame;
11466   frame.sequence_number = 0x1122;
11467 
11468   QuicFrames frames = {QuicFrame(&frame)};
11469 
11470   // clang-format off
11471   unsigned char packet_ietf[] = {
11472     // type (short header, 4 byte packet number)
11473     0x43,
11474     // connection_id
11475     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11476     // packet number
11477     0x12, 0x34, 0x56, 0x78,
11478 
11479     // frame type (IETF_RETIRE_CONNECTION_ID frame)
11480     0x19,
11481     // sequence number
11482     kVarInt62TwoBytes + 0x11, 0x22
11483   };
11484   // clang-format on
11485 
11486   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11487   ASSERT_TRUE(data != nullptr);
11488 
11489   quiche::test::CompareCharArraysWithHexError(
11490       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
11491       ABSL_ARRAYSIZE(packet_ietf));
11492 }
11493 
TEST_P(QuicFramerTest,AckFrameWithInvalidLargestObserved)11494 TEST_P(QuicFramerTest, AckFrameWithInvalidLargestObserved) {
11495   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11496   // clang-format off
11497   unsigned char packet[] = {
11498     // type (short header, 4 byte packet number)
11499     0x43,
11500     // connection_id
11501     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11502     // packet number
11503     0x12, 0x34, 0x56, 0x78,
11504 
11505     // frame type (ack frame)
11506     0x45,
11507     // largest observed
11508     0x00, 0x00,
11509     // Zero delta time.
11510     0x00, 0x00,
11511     // first ack block length.
11512     0x00, 0x00,
11513     // num timestamps.
11514     0x00
11515   };
11516 
11517   unsigned char packet_ietf[] = {
11518     // type (short header, 4 byte packet number)
11519     0x43,
11520     // connection_id
11521     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11522     // packet number
11523     0x12, 0x34, 0x56, 0x78,
11524 
11525     // frame type (IETF_ACK frame)
11526     0x02,
11527     // Largest acked
11528     kVarInt62OneByte + 0x00,
11529     // Zero delta time.
11530     kVarInt62OneByte + 0x00,
11531     // Ack block count 0
11532     kVarInt62OneByte + 0x00,
11533     // First ack block length
11534     kVarInt62OneByte + 0x00,
11535   };
11536   // clang-format on
11537 
11538   unsigned char* p = packet;
11539   size_t p_size = ABSL_ARRAYSIZE(packet);
11540   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
11541     p = packet_ietf;
11542     p_size = ABSL_ARRAYSIZE(packet_ietf);
11543   }
11544 
11545   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
11546   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
11547   EXPECT_EQ(framer_.detailed_error(), "Largest acked is 0.");
11548 }
11549 
TEST_P(QuicFramerTest,FirstAckBlockJustUnderFlow)11550 TEST_P(QuicFramerTest, FirstAckBlockJustUnderFlow) {
11551   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11552   // clang-format off
11553   unsigned char packet[] = {
11554     // type (short header, 4 byte packet number)
11555     0x43,
11556     // connection_id
11557     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11558     // packet number
11559     0x12, 0x34, 0x56, 0x78,
11560 
11561     // frame type (ack frame)
11562     0x45,
11563     // largest observed
11564     0x00, 0x02,
11565     // Zero delta time.
11566     0x00, 0x00,
11567     // first ack block length.
11568     0x00, 0x03,
11569     // num timestamps.
11570     0x00
11571   };
11572 
11573   unsigned char packet_ietf[] = {
11574     // type (short header, 4 byte packet number)
11575     0x43,
11576     // connection_id
11577     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11578     // packet number
11579     0x12, 0x34, 0x56, 0x78,
11580 
11581     // frame type (IETF_ACK frame)
11582     0x02,
11583     // Largest acked
11584     kVarInt62OneByte + 0x02,
11585     // Zero delta time.
11586     kVarInt62OneByte + 0x00,
11587     // Ack block count 0
11588     kVarInt62OneByte + 0x00,
11589     // First ack block length
11590     kVarInt62OneByte + 0x02,
11591   };
11592   // clang-format on
11593 
11594   unsigned char* p = packet;
11595   size_t p_size = ABSL_ARRAYSIZE(packet);
11596   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
11597     p = packet_ietf;
11598     p_size = ABSL_ARRAYSIZE(packet_ietf);
11599   }
11600 
11601   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
11602   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
11603   EXPECT_EQ(framer_.detailed_error(),
11604             "Underflow with first ack block length 3 largest acked is 2.");
11605 }
11606 
TEST_P(QuicFramerTest,ThirdAckBlockJustUnderflow)11607 TEST_P(QuicFramerTest, ThirdAckBlockJustUnderflow) {
11608   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11609   // clang-format off
11610   unsigned char packet[] = {
11611     // type (short header, 4 byte packet number)
11612     0x43,
11613     // connection_id
11614     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11615     // packet number
11616     0x12, 0x34, 0x56, 0x78,
11617 
11618     // frame type (ack frame)
11619     0x60,
11620     // largest observed
11621     0x0A,
11622     // Zero delta time.
11623     0x00, 0x00,
11624     // Num of ack blocks
11625     0x02,
11626     // first ack block length.
11627     0x02,
11628     // gap to next block
11629     0x01,
11630     // ack block length
11631     0x01,
11632     // gap to next block
11633     0x01,
11634     // ack block length
11635     0x06,
11636     // num timestamps.
11637     0x00
11638   };
11639 
11640   unsigned char packet_ietf[] = {
11641     // type (short header, 4 byte packet number)
11642     0x43,
11643     // connection_id
11644     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11645     // packet number
11646     0x12, 0x34, 0x56, 0x78,
11647 
11648     // frame type (IETF_ACK frame)
11649     0x02,
11650     // Largest acked
11651     kVarInt62OneByte + 0x0A,
11652     // Zero delta time.
11653     kVarInt62OneByte + 0x00,
11654     // Ack block count 2
11655     kVarInt62OneByte + 0x02,
11656     // First ack block length
11657     kVarInt62OneByte + 0x01,
11658     // gap to next block length
11659     kVarInt62OneByte + 0x00,
11660     // ack block length
11661     kVarInt62OneByte + 0x00,
11662     // gap to next block length
11663     kVarInt62OneByte + 0x00,
11664     // ack block length
11665     kVarInt62OneByte + 0x05,
11666   };
11667   // clang-format on
11668 
11669   unsigned char* p = packet;
11670   size_t p_size = ABSL_ARRAYSIZE(packet);
11671   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
11672     p = packet_ietf;
11673     p_size = ABSL_ARRAYSIZE(packet_ietf);
11674   }
11675 
11676   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
11677   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
11678   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
11679     EXPECT_EQ(framer_.detailed_error(),
11680               "Underflow with ack block length 6 latest ack block end is 5.");
11681   } else {
11682     EXPECT_EQ(framer_.detailed_error(),
11683               "Underflow with ack block length 6, end of block is 6.");
11684   }
11685 }
11686 
TEST_P(QuicFramerTest,CoalescedPacket)11687 TEST_P(QuicFramerTest, CoalescedPacket) {
11688   if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
11689     return;
11690   }
11691   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
11692   // clang-format off
11693   unsigned char packet[] = {
11694     // first coalesced packet
11695       // public flags (long header with packet type ZERO_RTT_PROTECTED and
11696       // 4-byte packet number)
11697       0xD3,
11698       // version
11699       QUIC_VERSION_BYTES,
11700       // destination connection ID length
11701       0x08,
11702       // destination connection ID
11703       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11704       // source connection ID length
11705       0x00,
11706       // long header packet length
11707       0x1E,
11708       // packet number
11709       0x12, 0x34, 0x56, 0x78,
11710       // frame type (stream frame with fin)
11711       0xFE,
11712       // stream id
11713       0x02, 0x03, 0x04,
11714       // offset
11715       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11716       // data length
11717       0x00, 0x0c,
11718       // data
11719       'h',  'e',  'l',  'l',
11720       'o',  ' ',  'w',  'o',
11721       'r',  'l',  'd',  '!',
11722     // second coalesced packet
11723       // public flags (long header with packet type ZERO_RTT_PROTECTED and
11724       // 4-byte packet number)
11725       0xD3,
11726       // version
11727       QUIC_VERSION_BYTES,
11728       // destination connection ID length
11729       0x08,
11730       // destination connection ID
11731       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11732       // source connection ID length
11733       0x00,
11734       // long header packet length
11735       0x1E,
11736       // packet number
11737       0x12, 0x34, 0x56, 0x79,
11738       // frame type (stream frame with fin)
11739       0xFE,
11740       // stream id
11741       0x02, 0x03, 0x04,
11742       // offset
11743       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11744       // data length
11745       0x00, 0x0c,
11746       // data
11747       'H',  'E',  'L',  'L',
11748       'O',  '_',  'W',  'O',
11749       'R',  'L',  'D',  '?',
11750   };
11751   unsigned char packet_ietf[] = {
11752     // first coalesced packet
11753       // public flags (long header with packet type ZERO_RTT_PROTECTED and
11754       // 4-byte packet number)
11755       0xD3,
11756       // version
11757       QUIC_VERSION_BYTES,
11758       // destination connection ID length
11759       0x08,
11760       // destination connection ID
11761       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11762       // source connection ID length
11763       0x00,
11764       // long header packet length
11765       0x1E,
11766       // packet number
11767       0x12, 0x34, 0x56, 0x78,
11768       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
11769       0x08 | 0x01 | 0x02 | 0x04,
11770       // stream id
11771       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
11772       // offset
11773       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
11774       0x32, 0x10, 0x76, 0x54,
11775       // data length
11776       kVarInt62OneByte + 0x0c,
11777       // data
11778       'h',  'e',  'l',  'l',
11779       'o',  ' ',  'w',  'o',
11780       'r',  'l',  'd',  '!',
11781     // second coalesced packet
11782       // public flags (long header with packet type ZERO_RTT_PROTECTED and
11783       // 4-byte packet number)
11784       0xD3,
11785       // version
11786       QUIC_VERSION_BYTES,
11787       // destination connection ID length
11788       0x08,
11789       // destination connection ID
11790       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11791       // source connection ID length
11792       0x00,
11793       // long header packet length
11794       0x1E,
11795       // packet number
11796       0x12, 0x34, 0x56, 0x79,
11797       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
11798       0x08 | 0x01 | 0x02 | 0x04,
11799       // stream id
11800       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
11801       // offset
11802       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
11803       0x32, 0x10, 0x76, 0x54,
11804       // data length
11805       kVarInt62OneByte + 0x0c,
11806       // data
11807       'H',  'E',  'L',  'L',
11808       'O',  '_',  'W',  'O',
11809       'R',  'L',  'D',  '?',
11810   };
11811   // clang-format on
11812   const size_t first_packet_ietf_size = 46;
11813   // If the first packet changes, the attempt to fix the first byte of the
11814   // second packet will fail.
11815   EXPECT_EQ(packet_ietf[first_packet_ietf_size], 0xD3);
11816 
11817   unsigned char* p = packet;
11818   size_t p_length = ABSL_ARRAYSIZE(packet);
11819   if (framer_.version().HasIetfQuicFrames()) {
11820     ReviseFirstByteByVersion(packet_ietf);
11821     ReviseFirstByteByVersion(&packet_ietf[first_packet_ietf_size]);
11822     p = packet_ietf;
11823     p_length = ABSL_ARRAYSIZE(packet_ietf);
11824   }
11825 
11826   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
11827   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
11828 
11829   EXPECT_THAT(framer_.error(), IsQuicNoError());
11830   ASSERT_TRUE(visitor_.header_.get());
11831 
11832   ASSERT_EQ(1u, visitor_.stream_frames_.size());
11833   EXPECT_EQ(0u, visitor_.ack_frames_.size());
11834 
11835   // Stream ID should be the last 3 bytes of kStreamId.
11836   EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
11837   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
11838   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
11839   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
11840 
11841   ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
11842   EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
11843 
11844   EXPECT_THAT(framer_.error(), IsQuicNoError());
11845   ASSERT_TRUE(visitor_.header_.get());
11846 
11847   ASSERT_EQ(2u, visitor_.stream_frames_.size());
11848   EXPECT_EQ(0u, visitor_.ack_frames_.size());
11849 
11850   // Stream ID should be the last 3 bytes of kStreamId.
11851   EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[1]->stream_id);
11852   EXPECT_TRUE(visitor_.stream_frames_[1]->fin);
11853   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[1]->offset);
11854   CheckStreamFrameData("HELLO_WORLD?", visitor_.stream_frames_[1].get());
11855 }
11856 
TEST_P(QuicFramerTest,CoalescedPacketWithUdpPadding)11857 TEST_P(QuicFramerTest, CoalescedPacketWithUdpPadding) {
11858   if (!framer_.version().HasLongHeaderLengths()) {
11859     return;
11860   }
11861   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
11862   // clang-format off
11863   unsigned char packet[] = {
11864     // first coalesced packet
11865       // public flags (long header with packet type ZERO_RTT_PROTECTED and
11866       // 4-byte packet number)
11867       0xD3,
11868       // version
11869       QUIC_VERSION_BYTES,
11870       // destination connection ID length
11871       0x08,
11872       // destination connection ID
11873       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11874       // source connection ID length
11875       0x00,
11876       // long header packet length
11877       0x1E,
11878       // packet number
11879       0x12, 0x34, 0x56, 0x78,
11880       // frame type (stream frame with fin)
11881       0xFE,
11882       // stream id
11883       0x02, 0x03, 0x04,
11884       // offset
11885       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11886       // data length
11887       0x00, 0x0c,
11888       // data
11889       'h',  'e',  'l',  'l',
11890       'o',  ' ',  'w',  'o',
11891       'r',  'l',  'd',  '!',
11892     // padding
11893     0x00, 0x00, 0x00, 0x00,
11894     0x00, 0x00, 0x00, 0x00,
11895     0x00, 0x00, 0x00, 0x00,
11896     0x00, 0x00, 0x00, 0x00,
11897     0x00, 0x00, 0x00, 0x00,
11898   };
11899   unsigned char packet_ietf[] = {
11900     // first coalesced packet
11901       // public flags (long header with packet type ZERO_RTT_PROTECTED and
11902       // 4-byte packet number)
11903       0xD3,
11904       // version
11905       QUIC_VERSION_BYTES,
11906       // destination connection ID length
11907       0x08,
11908       // destination connection ID
11909       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11910       // source connection ID length
11911       0x00,
11912       // long header packet length
11913       0x1E,
11914       // packet number
11915       0x12, 0x34, 0x56, 0x78,
11916       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
11917       0x08 | 0x01 | 0x02 | 0x04,
11918       // stream id
11919       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
11920       // offset
11921       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
11922       0x32, 0x10, 0x76, 0x54,
11923       // data length
11924       kVarInt62OneByte + 0x0c,
11925       // data
11926       'h',  'e',  'l',  'l',
11927       'o',  ' ',  'w',  'o',
11928       'r',  'l',  'd',  '!',
11929       // padding
11930       0x00, 0x00, 0x00, 0x00,
11931       0x00, 0x00, 0x00, 0x00,
11932       0x00, 0x00, 0x00, 0x00,
11933       0x00, 0x00, 0x00, 0x00,
11934       0x00, 0x00, 0x00, 0x00,
11935   };
11936   // clang-format on
11937 
11938   unsigned char* p = packet;
11939   size_t p_length = ABSL_ARRAYSIZE(packet);
11940   if (framer_.version().HasIetfQuicFrames()) {
11941     ReviseFirstByteByVersion(packet_ietf);
11942     p = packet_ietf;
11943     p_length = ABSL_ARRAYSIZE(packet_ietf);
11944   }
11945 
11946   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
11947   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
11948 
11949   EXPECT_THAT(framer_.error(), IsQuicNoError());
11950   ASSERT_TRUE(visitor_.header_.get());
11951 
11952   ASSERT_EQ(1u, visitor_.stream_frames_.size());
11953   EXPECT_EQ(0u, visitor_.ack_frames_.size());
11954 
11955   // Stream ID should be the last 3 bytes of kStreamId.
11956   EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
11957   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
11958   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
11959   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
11960 
11961   EXPECT_EQ(visitor_.coalesced_packets_.size(), 0u);
11962 }
11963 
TEST_P(QuicFramerTest,CoalescedPacketWithDifferentVersion)11964 TEST_P(QuicFramerTest, CoalescedPacketWithDifferentVersion) {
11965   if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
11966     return;
11967   }
11968   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
11969   // clang-format off
11970   unsigned char packet[] = {
11971     // first coalesced packet
11972       // public flags (long header with packet type ZERO_RTT_PROTECTED and
11973       // 4-byte packet number)
11974       0xD3,
11975       // version
11976       QUIC_VERSION_BYTES,
11977       // destination connection ID length
11978       0x08,
11979       // destination connection ID
11980       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11981       // source connection ID length
11982       0x00,
11983       // long header packet length
11984       0x1E,
11985       // packet number
11986       0x12, 0x34, 0x56, 0x78,
11987       // frame type (stream frame with fin)
11988       0xFE,
11989       // stream id
11990       0x02, 0x03, 0x04,
11991       // offset
11992       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11993       // data length
11994       0x00, 0x0c,
11995       // data
11996       'h',  'e',  'l',  'l',
11997       'o',  ' ',  'w',  'o',
11998       'r',  'l',  'd',  '!',
11999     // second coalesced packet
12000       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12001       // 4-byte packet number)
12002       0xD3,
12003       // garbage version
12004       'G', 'A', 'B', 'G',
12005       // destination connection ID length
12006       0x08,
12007       // destination connection ID
12008       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12009       // source connection ID length
12010       0x00,
12011       // long header packet length
12012       0x1E,
12013       // packet number
12014       0x12, 0x34, 0x56, 0x79,
12015       // frame type (stream frame with fin)
12016       0xFE,
12017       // stream id
12018       0x02, 0x03, 0x04,
12019       // offset
12020       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12021       // data length
12022       0x00, 0x0c,
12023       // data
12024       'H',  'E',  'L',  'L',
12025       'O',  '_',  'W',  'O',
12026       'R',  'L',  'D',  '?',
12027   };
12028   unsigned char packet_ietf[] = {
12029     // first coalesced packet
12030       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12031       // 4-byte packet number)
12032       0xD3,
12033       // version
12034       QUIC_VERSION_BYTES,
12035       // destination connection ID length
12036       0x08,
12037       // destination connection ID
12038       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12039       // source connection ID length
12040       0x00,
12041       // long header packet length
12042       0x1E,
12043       // packet number
12044       0x12, 0x34, 0x56, 0x78,
12045       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12046       0x08 | 0x01 | 0x02 | 0x04,
12047       // stream id
12048       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12049       // offset
12050       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12051       0x32, 0x10, 0x76, 0x54,
12052       // data length
12053       kVarInt62OneByte + 0x0c,
12054       // data
12055       'h',  'e',  'l',  'l',
12056       'o',  ' ',  'w',  'o',
12057       'r',  'l',  'd',  '!',
12058     // second coalesced packet
12059       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12060       // 4-byte packet number)
12061       0xD3,
12062       // garbage version
12063       'G', 'A', 'B', 'G',
12064       // destination connection ID length
12065       0x08,
12066       // destination connection ID
12067       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12068       // source connection ID length
12069       0x00,
12070       // long header packet length
12071       0x1E,
12072       // packet number
12073       0x12, 0x34, 0x56, 0x79,
12074       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12075       0x08 | 0x01 | 0x02 | 0x04,
12076       // stream id
12077       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12078       // offset
12079       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12080       0x32, 0x10, 0x76, 0x54,
12081       // data length
12082       kVarInt62OneByte + 0x0c,
12083       // data
12084       'H',  'E',  'L',  'L',
12085       'O',  '_',  'W',  'O',
12086       'R',  'L',  'D',  '?',
12087   };
12088   // clang-format on
12089   const size_t first_packet_ietf_size = 46;
12090   // If the first packet changes, the attempt to fix the first byte of the
12091   // second packet will fail.
12092   EXPECT_EQ(packet_ietf[first_packet_ietf_size], 0xD3);
12093 
12094   unsigned char* p = packet;
12095   size_t p_length = ABSL_ARRAYSIZE(packet);
12096   if (framer_.version().HasIetfQuicFrames()) {
12097     ReviseFirstByteByVersion(packet_ietf);
12098     ReviseFirstByteByVersion(&packet_ietf[first_packet_ietf_size]);
12099     p = packet_ietf;
12100     p_length = ABSL_ARRAYSIZE(packet_ietf);
12101   }
12102 
12103   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12104   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12105 
12106   EXPECT_THAT(framer_.error(), IsQuicNoError());
12107   ASSERT_TRUE(visitor_.header_.get());
12108 
12109   ASSERT_EQ(1u, visitor_.stream_frames_.size());
12110   EXPECT_EQ(0u, visitor_.ack_frames_.size());
12111 
12112   // Stream ID should be the last 3 bytes of kStreamId.
12113   EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12114   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12115   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12116   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12117 
12118   ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
12119   EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
12120 
12121   EXPECT_THAT(framer_.error(), IsQuicNoError());
12122   ASSERT_TRUE(visitor_.header_.get());
12123 
12124   ASSERT_EQ(1u, visitor_.stream_frames_.size());
12125   // Verify version mismatch gets reported.
12126   EXPECT_EQ(1, visitor_.version_mismatch_);
12127 }
12128 
TEST_P(QuicFramerTest,UndecryptablePacketWithoutDecrypter)12129 TEST_P(QuicFramerTest, UndecryptablePacketWithoutDecrypter) {
12130   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12131 
12132   if (!framer_.version().KnowsWhichDecrypterToUse()) {
12133     // We create a bad client decrypter by using initial encryption with a
12134     // bogus connection ID; it should fail to decrypt everything.
12135     QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
12136     CrypterPair bogus_crypters;
12137     CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12138                                           framer_.version(),
12139                                           bogus_connection_id, &bogus_crypters);
12140     // This removes all other decrypters.
12141     framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
12142                          std::move(bogus_crypters.decrypter));
12143   }
12144 
12145   // clang-format off
12146   unsigned char packet[] = {
12147     // public flags (long header with packet type HANDSHAKE and
12148     // 4-byte packet number)
12149     0xE3,
12150     // version
12151     QUIC_VERSION_BYTES,
12152     // connection ID lengths
12153     0x05,
12154     // source connection ID
12155     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12156     // long header packet length
12157     0x05,
12158     // packet number
12159     0x12, 0x34, 0x56, 0x00,
12160     // padding frames
12161     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12162     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12163     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12164     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12165   };
12166   unsigned char packet49[] = {
12167     // public flags (long header with packet type HANDSHAKE and
12168     // 4-byte packet number)
12169     0xE3,
12170     // version
12171     QUIC_VERSION_BYTES,
12172     // destination connection ID length
12173     0x00,
12174     // source connection ID length
12175     0x08,
12176     // source connection ID
12177     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12178     // long header packet length
12179     0x24,
12180     // packet number
12181     0x12, 0x34, 0x56, 0x00,
12182     // padding frames
12183     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12184     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12185     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12186     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12187   };
12188   // clang-format on
12189   unsigned char* p = packet;
12190   size_t p_length = ABSL_ARRAYSIZE(packet);
12191   if (framer_.version().HasLongHeaderLengths()) {
12192     ReviseFirstByteByVersion(packet49);
12193     p = packet49;
12194     p_length = ABSL_ARRAYSIZE(packet49);
12195   }
12196   // First attempt decryption without the handshake crypter.
12197   EXPECT_FALSE(
12198       framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false)));
12199   EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
12200   ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12201   ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12202   ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12203   quiche::test::CompareCharArraysWithHexError(
12204       "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
12205       visitor_.undecryptable_packets_[0]->length(), AsChars(p), p_length);
12206   if (framer_.version().KnowsWhichDecrypterToUse()) {
12207     EXPECT_EQ(ENCRYPTION_HANDSHAKE,
12208               visitor_.undecryptable_decryption_levels_[0]);
12209   }
12210   EXPECT_FALSE(visitor_.undecryptable_has_decryption_keys_[0]);
12211 }
12212 
TEST_P(QuicFramerTest,UndecryptablePacketWithDecrypter)12213 TEST_P(QuicFramerTest, UndecryptablePacketWithDecrypter) {
12214   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12215 
12216   // We create a bad client decrypter by using initial encryption with a
12217   // bogus connection ID; it should fail to decrypt everything.
12218   QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
12219   CrypterPair bad_handshake_crypters;
12220   CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12221                                         framer_.version(), bogus_connection_id,
12222                                         &bad_handshake_crypters);
12223   if (framer_.version().KnowsWhichDecrypterToUse()) {
12224     framer_.InstallDecrypter(ENCRYPTION_HANDSHAKE,
12225                              std::move(bad_handshake_crypters.decrypter));
12226   } else {
12227     framer_.SetDecrypter(ENCRYPTION_HANDSHAKE,
12228                          std::move(bad_handshake_crypters.decrypter));
12229   }
12230 
12231   // clang-format off
12232   unsigned char packet[] = {
12233     // public flags (long header with packet type HANDSHAKE and
12234     // 4-byte packet number)
12235     0xE3,
12236     // version
12237     QUIC_VERSION_BYTES,
12238     // connection ID lengths
12239     0x05,
12240     // source connection ID
12241     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12242     // long header packet length
12243     0x05,
12244     // packet number
12245     0x12, 0x34, 0x56, 0x00,
12246     // padding frames
12247     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12248     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12249     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12250     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12251   };
12252   unsigned char packet49[] = {
12253     // public flags (long header with packet type HANDSHAKE and
12254     // 4-byte packet number)
12255     0xE3,
12256     // version
12257     QUIC_VERSION_BYTES,
12258     // destination connection ID length
12259     0x00,
12260     // source connection ID length
12261     0x08,
12262     // source connection ID
12263     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12264     // long header packet length
12265     0x24,
12266     // packet number
12267     0x12, 0x34, 0x56, 0x00,
12268     // padding frames
12269     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12270     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12271     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12272     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12273   };
12274   // clang-format on
12275   unsigned char* p = packet;
12276   size_t p_length = ABSL_ARRAYSIZE(packet);
12277   if (framer_.version().HasLongHeaderLengths()) {
12278     ReviseFirstByteByVersion(packet49);
12279     p = packet49;
12280     p_length = ABSL_ARRAYSIZE(packet49);
12281   }
12282 
12283   EXPECT_FALSE(
12284       framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false)));
12285   EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
12286   ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12287   ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12288   ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12289   quiche::test::CompareCharArraysWithHexError(
12290       "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
12291       visitor_.undecryptable_packets_[0]->length(), AsChars(p), p_length);
12292   if (framer_.version().KnowsWhichDecrypterToUse()) {
12293     EXPECT_EQ(ENCRYPTION_HANDSHAKE,
12294               visitor_.undecryptable_decryption_levels_[0]);
12295   }
12296   EXPECT_EQ(framer_.version().KnowsWhichDecrypterToUse(),
12297             visitor_.undecryptable_has_decryption_keys_[0]);
12298 }
12299 
TEST_P(QuicFramerTest,UndecryptableCoalescedPacket)12300 TEST_P(QuicFramerTest, UndecryptableCoalescedPacket) {
12301   if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12302     return;
12303   }
12304   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
12305   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
12306   // We create a bad client decrypter by using initial encryption with a
12307   // bogus connection ID; it should fail to decrypt everything.
12308   QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
12309   CrypterPair bad_handshake_crypters;
12310   CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12311                                         framer_.version(), bogus_connection_id,
12312                                         &bad_handshake_crypters);
12313   framer_.InstallDecrypter(ENCRYPTION_HANDSHAKE,
12314                            std::move(bad_handshake_crypters.decrypter));
12315   // clang-format off
12316   unsigned char packet[] = {
12317     // first coalesced packet
12318       // public flags (long header with packet type HANDSHAKE and
12319       // 4-byte packet number)
12320       0xE3,
12321       // version
12322       QUIC_VERSION_BYTES,
12323       // destination connection ID length
12324       0x08,
12325       // destination connection ID
12326       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12327       // source connection ID length
12328       0x00,
12329       // long header packet length
12330       0x1E,
12331       // packet number
12332       0x12, 0x34, 0x56, 0x78,
12333       // frame type (stream frame with fin)
12334       0xFE,
12335       // stream id
12336       0x02, 0x03, 0x04,
12337       // offset
12338       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12339       // data length
12340       0x00, 0x0c,
12341       // data
12342       'h',  'e',  'l',  'l',
12343       'o',  ' ',  'w',  'o',
12344       'r',  'l',  'd',  '!',
12345     // second coalesced packet
12346       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12347       // 4-byte packet number)
12348       0xD3,
12349       // version
12350       QUIC_VERSION_BYTES,
12351       // destination connection ID length
12352       0x08,
12353       // destination connection ID
12354       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12355       // source connection ID length
12356       0x00,
12357       // long header packet length
12358       0x1E,
12359       // packet number
12360       0x12, 0x34, 0x56, 0x79,
12361       // frame type (stream frame with fin)
12362       0xFE,
12363       // stream id
12364       0x02, 0x03, 0x04,
12365       // offset
12366       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12367       // data length
12368       0x00, 0x0c,
12369       // data
12370       'H',  'E',  'L',  'L',
12371       'O',  '_',  'W',  'O',
12372       'R',  'L',  'D',  '?',
12373   };
12374   unsigned char packet_ietf[] = {
12375     // first coalesced packet
12376       // public flags (long header with packet type HANDSHAKE and
12377       // 4-byte packet number)
12378       0xE3,
12379       // version
12380       QUIC_VERSION_BYTES,
12381       // destination connection ID length
12382       0x08,
12383       // destination connection ID
12384       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12385       // source connection ID length
12386       0x00,
12387       // long header packet length
12388       0x1E,
12389       // packet number
12390       0x12, 0x34, 0x56, 0x78,
12391       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12392       0x08 | 0x01 | 0x02 | 0x04,
12393       // stream id
12394       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12395       // offset
12396       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12397       0x32, 0x10, 0x76, 0x54,
12398       // data length
12399       kVarInt62OneByte + 0x0c,
12400       // data
12401       'h',  'e',  'l',  'l',
12402       'o',  ' ',  'w',  'o',
12403       'r',  'l',  'd',  '!',
12404     // second coalesced packet
12405       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12406       // 4-byte packet number)
12407       0xD3,
12408       // version
12409       QUIC_VERSION_BYTES,
12410       // destination connection ID length
12411       0x08,
12412       // destination connection ID
12413       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12414       // source connection ID length
12415       0x00,
12416       // long header packet length
12417       0x1E,
12418       // packet number
12419       0x12, 0x34, 0x56, 0x79,
12420       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12421       0x08 | 0x01 | 0x02 | 0x04,
12422       // stream id
12423       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12424       // offset
12425       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12426       0x32, 0x10, 0x76, 0x54,
12427       // data length
12428       kVarInt62OneByte + 0x0c,
12429       // data
12430       'H',  'E',  'L',  'L',
12431       'O',  '_',  'W',  'O',
12432       'R',  'L',  'D',  '?',
12433   };
12434   // clang-format on
12435   const size_t length_of_first_coalesced_packet = 46;
12436   // If the first packet changes, the attempt to fix the first byte of the
12437   // second packet will fail.
12438   EXPECT_EQ(packet_ietf[length_of_first_coalesced_packet], 0xD3);
12439 
12440   unsigned char* p = packet;
12441   size_t p_length = ABSL_ARRAYSIZE(packet);
12442   if (framer_.version().HasIetfQuicFrames()) {
12443     ReviseFirstByteByVersion(packet_ietf);
12444     ReviseFirstByteByVersion(&packet_ietf[length_of_first_coalesced_packet]);
12445     p = packet_ietf;
12446     p_length = ABSL_ARRAYSIZE(packet_ietf);
12447   }
12448 
12449   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12450 
12451   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12452 
12453   EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
12454 
12455   ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12456   ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12457   ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12458   // Make sure we only receive the first undecryptable packet and not the
12459   // full packet including the second coalesced packet.
12460   quiche::test::CompareCharArraysWithHexError(
12461       "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
12462       visitor_.undecryptable_packets_[0]->length(), AsChars(p),
12463       length_of_first_coalesced_packet);
12464   EXPECT_EQ(ENCRYPTION_HANDSHAKE, visitor_.undecryptable_decryption_levels_[0]);
12465   EXPECT_TRUE(visitor_.undecryptable_has_decryption_keys_[0]);
12466 
12467   // Make sure the second coalesced packet is parsed correctly.
12468   ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
12469   EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
12470 
12471   ASSERT_TRUE(visitor_.header_.get());
12472 
12473   ASSERT_EQ(1u, visitor_.stream_frames_.size());
12474   EXPECT_EQ(0u, visitor_.ack_frames_.size());
12475 
12476   // Stream ID should be the last 3 bytes of kStreamId.
12477   EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12478   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12479   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12480   CheckStreamFrameData("HELLO_WORLD?", visitor_.stream_frames_[0].get());
12481 }
12482 
TEST_P(QuicFramerTest,MismatchedCoalescedPacket)12483 TEST_P(QuicFramerTest, MismatchedCoalescedPacket) {
12484   if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12485     return;
12486   }
12487   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
12488   // clang-format off
12489   unsigned char packet[] = {
12490     // first coalesced packet
12491       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12492       // 4-byte packet number)
12493       0xD3,
12494       // version
12495       QUIC_VERSION_BYTES,
12496       // destination connection ID length
12497       0x08,
12498       // destination connection ID
12499       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12500       // source connection ID length
12501       0x00,
12502       // long header packet length
12503       0x1E,
12504       // packet number
12505       0x12, 0x34, 0x56, 0x78,
12506       // frame type (stream frame with fin)
12507       0xFE,
12508       // stream id
12509       0x02, 0x03, 0x04,
12510       // offset
12511       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12512       // data length
12513       0x00, 0x0c,
12514       // data
12515       'h',  'e',  'l',  'l',
12516       'o',  ' ',  'w',  'o',
12517       'r',  'l',  'd',  '!',
12518     // second coalesced packet
12519       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12520       // 4-byte packet number)
12521       0xD3,
12522       // version
12523       QUIC_VERSION_BYTES,
12524       // destination connection ID length
12525       0x08,
12526       // destination connection ID
12527       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
12528       // source connection ID length
12529       0x00,
12530       // long header packet length
12531       0x1E,
12532       // packet number
12533       0x12, 0x34, 0x56, 0x79,
12534       // frame type (stream frame with fin)
12535       0xFE,
12536       // stream id
12537       0x02, 0x03, 0x04,
12538       // offset
12539       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12540       // data length
12541       0x00, 0x0c,
12542       // data
12543       'H',  'E',  'L',  'L',
12544       'O',  '_',  'W',  'O',
12545       'R',  'L',  'D',  '?',
12546   };
12547   unsigned char packet_ietf[] = {
12548     // first coalesced packet
12549       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12550       // 4-byte packet number)
12551       0xD3,
12552       // version
12553       QUIC_VERSION_BYTES,
12554       // destination connection ID length
12555       0x08,
12556       // destination connection ID
12557       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12558       // source connection ID length
12559       0x00,
12560       // long header packet length
12561       0x1E,
12562       // packet number
12563       0x12, 0x34, 0x56, 0x78,
12564       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12565       0x08 | 0x01 | 0x02 | 0x04,
12566       // stream id
12567       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12568       // offset
12569       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12570       0x32, 0x10, 0x76, 0x54,
12571       // data length
12572       kVarInt62OneByte + 0x0c,
12573       // data
12574       'h',  'e',  'l',  'l',
12575       'o',  ' ',  'w',  'o',
12576       'r',  'l',  'd',  '!',
12577     // second coalesced packet
12578       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12579       // 4-byte packet number)
12580       0xD3,
12581       // version
12582       QUIC_VERSION_BYTES,
12583       // destination connection ID length
12584       0x08,
12585       // destination connection ID
12586       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
12587       // source connection ID length
12588       0x00,
12589       // long header packet length
12590       0x1E,
12591       // packet number
12592       0x12, 0x34, 0x56, 0x79,
12593       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12594       0x08 | 0x01 | 0x02 | 0x04,
12595       // stream id
12596       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12597       // offset
12598       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12599       0x32, 0x10, 0x76, 0x54,
12600       // data length
12601       kVarInt62OneByte + 0x0c,
12602       // data
12603       'H',  'E',  'L',  'L',
12604       'O',  '_',  'W',  'O',
12605       'R',  'L',  'D',  '?',
12606   };
12607   // clang-format on
12608   const size_t length_of_first_coalesced_packet = 46;
12609   // If the first packet changes, the attempt to fix the first byte of the
12610   // second packet will fail.
12611   EXPECT_EQ(packet_ietf[length_of_first_coalesced_packet], 0xD3);
12612 
12613   unsigned char* p = packet;
12614   size_t p_length = ABSL_ARRAYSIZE(packet);
12615   if (framer_.version().HasIetfQuicFrames()) {
12616     ReviseFirstByteByVersion(packet_ietf);
12617     ReviseFirstByteByVersion(&packet_ietf[length_of_first_coalesced_packet]);
12618     p = packet_ietf;
12619     p_length = ABSL_ARRAYSIZE(packet_ietf);
12620   }
12621 
12622   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12623 
12624   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12625 
12626   EXPECT_THAT(framer_.error(), IsQuicNoError());
12627   ASSERT_TRUE(visitor_.header_.get());
12628 
12629   ASSERT_EQ(1u, visitor_.stream_frames_.size());
12630   EXPECT_EQ(0u, visitor_.ack_frames_.size());
12631 
12632   // Stream ID should be the last 3 bytes of kStreamId.
12633   EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12634   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12635   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12636   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12637 
12638   ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
12639 }
12640 
TEST_P(QuicFramerTest,InvalidCoalescedPacket)12641 TEST_P(QuicFramerTest, InvalidCoalescedPacket) {
12642   if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12643     return;
12644   }
12645   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
12646   // clang-format off
12647   unsigned char packet[] = {
12648     // first coalesced packet
12649       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12650       // 4-byte packet number)
12651       0xD3,
12652       // version
12653       QUIC_VERSION_BYTES,
12654       // destination connection ID length
12655       0x08,
12656       // destination connection ID
12657       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12658       // source connection ID length
12659       0x00,
12660       // long header packet length
12661       0x1E,
12662       // packet number
12663       0x12, 0x34, 0x56, 0x78,
12664       // frame type (stream frame with fin)
12665       0xFE,
12666       // stream id
12667       0x02, 0x03, 0x04,
12668       // offset
12669       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12670       // data length
12671       0x00, 0x0c,
12672       // data
12673       'h',  'e',  'l',  'l',
12674       'o',  ' ',  'w',  'o',
12675       'r',  'l',  'd',  '!',
12676     // second coalesced packet
12677       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12678       // 4-byte packet number)
12679       0xD3,
12680       // version would be here but we cut off the invalid coalesced header.
12681   };
12682   unsigned char packet_ietf[] = {
12683     // first coalesced packet
12684       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12685       // 4-byte packet number)
12686       0xD3,
12687       // version
12688       QUIC_VERSION_BYTES,
12689       // destination connection ID length
12690       0x08,
12691       // destination connection ID
12692       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12693       // source connection ID length
12694       0x00,
12695       // long header packet length
12696       0x1E,
12697       // packet number
12698       0x12, 0x34, 0x56, 0x78,
12699       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12700       0x08 | 0x01 | 0x02 | 0x04,
12701       // stream id
12702       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12703       // offset
12704       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12705       0x32, 0x10, 0x76, 0x54,
12706       // data length
12707       kVarInt62OneByte + 0x0c,
12708       // data
12709       'h',  'e',  'l',  'l',
12710       'o',  ' ',  'w',  'o',
12711       'r',  'l',  'd',  '!',
12712     // second coalesced packet
12713       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12714       // 4-byte packet number)
12715       0xD3,
12716       // version would be here but we cut off the invalid coalesced header.
12717   };
12718   // clang-format on
12719   const size_t length_of_first_coalesced_packet = 46;
12720   // If the first packet changes, the attempt to fix the first byte of the
12721   // second packet will fail.
12722   EXPECT_EQ(packet_ietf[length_of_first_coalesced_packet], 0xD3);
12723 
12724   unsigned char* p = packet;
12725   size_t p_length = ABSL_ARRAYSIZE(packet);
12726   if (framer_.version().HasIetfQuicFrames()) {
12727     ReviseFirstByteByVersion(packet_ietf);
12728     ReviseFirstByteByVersion(&packet_ietf[length_of_first_coalesced_packet]);
12729     p = packet_ietf;
12730     p_length = ABSL_ARRAYSIZE(packet_ietf);
12731   }
12732 
12733   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12734 
12735   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12736 
12737   EXPECT_THAT(framer_.error(), IsQuicNoError());
12738   ASSERT_TRUE(visitor_.header_.get());
12739 
12740   ASSERT_EQ(1u, visitor_.stream_frames_.size());
12741   EXPECT_EQ(0u, visitor_.ack_frames_.size());
12742 
12743   // Stream ID should be the last 3 bytes of kStreamId.
12744   EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12745   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12746   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12747   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12748 
12749   ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
12750 }
12751 
12752 // Some IETF implementations send an initial followed by zeroes instead of
12753 // padding inside the initial. We need to make sure that we still process
12754 // the initial correctly and ignore the zeroes.
TEST_P(QuicFramerTest,CoalescedPacketWithZeroesRoundTrip)12755 TEST_P(QuicFramerTest, CoalescedPacketWithZeroesRoundTrip) {
12756   if (!QuicVersionHasLongHeaderLengths(framer_.transport_version()) ||
12757       !framer_.version().UsesInitialObfuscators()) {
12758     return;
12759   }
12760   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
12761   QuicConnectionId connection_id = FramerTestConnectionId();
12762   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12763 
12764   CrypterPair client_crypters;
12765   CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12766                                         framer_.version(), connection_id,
12767                                         &client_crypters);
12768   framer_.SetEncrypter(ENCRYPTION_INITIAL,
12769                        std::move(client_crypters.encrypter));
12770 
12771   QuicPacketHeader header;
12772   header.destination_connection_id = connection_id;
12773   header.version_flag = true;
12774   header.packet_number = kPacketNumber;
12775   header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
12776   header.long_packet_type = INITIAL;
12777   header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
12778   header.retry_token_length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1;
12779   QuicFrames frames = {QuicFrame(QuicPingFrame()),
12780                        QuicFrame(QuicPaddingFrame(3))};
12781 
12782   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
12783   ASSERT_NE(nullptr, data);
12784 
12785   // Add zeroes after the valid initial packet.
12786   unsigned char packet[kMaxOutgoingPacketSize] = {};
12787   size_t encrypted_length =
12788       framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number, *data,
12789                              AsChars(packet), ABSL_ARRAYSIZE(packet));
12790   ASSERT_NE(0u, encrypted_length);
12791 
12792   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
12793   CrypterPair server_crypters;
12794   CryptoUtils::CreateInitialObfuscators(Perspective::IS_SERVER,
12795                                         framer_.version(), connection_id,
12796                                         &server_crypters);
12797   framer_.InstallDecrypter(ENCRYPTION_INITIAL,
12798                            std::move(server_crypters.decrypter));
12799 
12800   // Make sure the first long header initial packet parses correctly.
12801   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
12802 
12803   // Make sure we discard the subsequent zeroes.
12804   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12805   EXPECT_TRUE(visitor_.coalesced_packets_.empty());
12806 }
12807 
TEST_P(QuicFramerTest,ClientReceivesWrongVersion)12808 TEST_P(QuicFramerTest, ClientReceivesWrongVersion) {
12809   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12810 
12811   // clang-format off
12812   unsigned char packet[] = {
12813        // public flags (long header with packet type INITIAL)
12814        0xC3,
12815        // version that is different from the framer's version
12816        'Q', '0', '4', '3',
12817        // connection ID lengths
12818        0x05,
12819        // source connection ID
12820        0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12821        // packet number
12822        0x01,
12823        // padding frame
12824        0x00,
12825   };
12826   // clang-format on
12827 
12828   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
12829   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12830 
12831   EXPECT_THAT(framer_.error(), IsError(QUIC_PACKET_WRONG_VERSION));
12832   EXPECT_EQ("Client received unexpected version.", framer_.detailed_error());
12833 }
12834 
TEST_P(QuicFramerTest,PacketHeaderWithVariableLengthConnectionId)12835 TEST_P(QuicFramerTest, PacketHeaderWithVariableLengthConnectionId) {
12836   if (!framer_.version().AllowsVariableLengthConnectionIds()) {
12837     return;
12838   }
12839   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
12840   uint8_t connection_id_bytes[9] = {0xFE, 0xDC, 0xBA, 0x98, 0x76,
12841                                     0x54, 0x32, 0x10, 0x42};
12842   QuicConnectionId connection_id(reinterpret_cast<char*>(connection_id_bytes),
12843                                  sizeof(connection_id_bytes));
12844   QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
12845   QuicFramerPeer::SetExpectedServerConnectionIDLength(&framer_,
12846                                                       connection_id.length());
12847 
12848   // clang-format off
12849   PacketFragments packet = {
12850       // type (8 byte connection_id and 1 byte packet number)
12851       {"Unable to read first byte.",
12852        {0x40}},
12853       // connection_id
12854       {"Unable to read destination connection ID.",
12855        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
12856       // packet number
12857       {"Unable to read packet number.",
12858        {0x78}},
12859   };
12860 
12861   PacketFragments packet_with_padding = {
12862       // type (8 byte connection_id and 1 byte packet number)
12863       {"Unable to read first byte.",
12864        {0x40}},
12865       // connection_id
12866       {"Unable to read destination connection ID.",
12867        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
12868       // packet number
12869       {"",
12870        {0x78}},
12871       // padding
12872       {"", {0x00, 0x00, 0x00}},
12873   };
12874   // clang-format on
12875 
12876   PacketFragments& fragments =
12877       framer_.version().HasHeaderProtection() ? packet_with_padding : packet;
12878   std::unique_ptr<QuicEncryptedPacket> encrypted(
12879       AssemblePacketFromFragments(fragments));
12880   if (framer_.version().HasHeaderProtection()) {
12881     EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
12882     EXPECT_THAT(framer_.error(), IsQuicNoError());
12883   } else {
12884     EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
12885     EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
12886   }
12887   ASSERT_TRUE(visitor_.header_.get());
12888   EXPECT_EQ(connection_id, visitor_.header_->destination_connection_id);
12889   EXPECT_FALSE(visitor_.header_->reset_flag);
12890   EXPECT_FALSE(visitor_.header_->version_flag);
12891   EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
12892   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
12893 
12894   CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
12895 }
12896 
TEST_P(QuicFramerTest,MultiplePacketNumberSpaces)12897 TEST_P(QuicFramerTest, MultiplePacketNumberSpaces) {
12898   framer_.EnableMultiplePacketNumberSpacesSupport();
12899 
12900   // clang-format off
12901   unsigned char long_header_packet[] = {
12902        // public flags (long header with packet type ZERO_RTT_PROTECTED and
12903        // 4-byte packet number)
12904        0xD3,
12905        // version
12906        QUIC_VERSION_BYTES,
12907        // destination connection ID length
12908        0x50,
12909        // destination connection ID
12910        0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12911        // packet number
12912        0x12, 0x34, 0x56, 0x78,
12913        // padding frame
12914        0x00,
12915    };
12916   unsigned char long_header_packet_ietf[] = {
12917        // public flags (long header with packet type ZERO_RTT_PROTECTED and
12918        // 4-byte packet number)
12919        0xD3,
12920        // version
12921        QUIC_VERSION_BYTES,
12922        // destination connection ID length
12923        0x08,
12924        // destination connection ID
12925        0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12926        // source connection ID length
12927        0x00,
12928        // long header packet length
12929        0x05,
12930        // packet number
12931        0x12, 0x34, 0x56, 0x78,
12932        // padding frame
12933        0x00,
12934   };
12935   // clang-format on
12936 
12937   if (framer_.version().KnowsWhichDecrypterToUse()) {
12938     framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
12939                              std::make_unique<TestDecrypter>());
12940     framer_.RemoveDecrypter(ENCRYPTION_INITIAL);
12941   } else {
12942     framer_.SetDecrypter(ENCRYPTION_ZERO_RTT,
12943                          std::make_unique<TestDecrypter>());
12944   }
12945   if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12946     EXPECT_TRUE(framer_.ProcessPacket(
12947         QuicEncryptedPacket(AsChars(long_header_packet),
12948                             ABSL_ARRAYSIZE(long_header_packet), false)));
12949   } else {
12950     ReviseFirstByteByVersion(long_header_packet_ietf);
12951     EXPECT_TRUE(framer_.ProcessPacket(
12952         QuicEncryptedPacket(AsChars(long_header_packet_ietf),
12953                             ABSL_ARRAYSIZE(long_header_packet_ietf), false)));
12954   }
12955 
12956   EXPECT_THAT(framer_.error(), IsQuicNoError());
12957   EXPECT_FALSE(
12958       QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
12959           .IsInitialized());
12960   EXPECT_FALSE(
12961       QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
12962           .IsInitialized());
12963   EXPECT_EQ(kPacketNumber, QuicFramerPeer::GetLargestDecryptedPacketNumber(
12964                                &framer_, APPLICATION_DATA));
12965 
12966   // clang-format off
12967   unsigned char short_header_packet[] = {
12968      // type (short header, 1 byte packet number)
12969      0x40,
12970      // connection_id
12971      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12972      // packet number
12973      0x79,
12974      // padding frame
12975      0x00, 0x00, 0x00,
12976   };
12977   // clang-format on
12978 
12979   QuicEncryptedPacket short_header_encrypted(
12980       AsChars(short_header_packet), ABSL_ARRAYSIZE(short_header_packet), false);
12981   if (framer_.version().KnowsWhichDecrypterToUse()) {
12982     framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
12983                              std::make_unique<TestDecrypter>());
12984     framer_.RemoveDecrypter(ENCRYPTION_ZERO_RTT);
12985   } else {
12986     framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
12987                          std::make_unique<TestDecrypter>());
12988   }
12989   EXPECT_TRUE(framer_.ProcessPacket(short_header_encrypted));
12990 
12991   EXPECT_THAT(framer_.error(), IsQuicNoError());
12992   EXPECT_FALSE(
12993       QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
12994           .IsInitialized());
12995   EXPECT_FALSE(
12996       QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
12997           .IsInitialized());
12998   EXPECT_EQ(kPacketNumber + 1, QuicFramerPeer::GetLargestDecryptedPacketNumber(
12999                                    &framer_, APPLICATION_DATA));
13000 }
13001 
TEST_P(QuicFramerTest,IetfRetryPacketRejected)13002 TEST_P(QuicFramerTest, IetfRetryPacketRejected) {
13003   if (!framer_.version().KnowsWhichDecrypterToUse() ||
13004       framer_.version().SupportsRetry()) {
13005     return;
13006   }
13007 
13008   // clang-format off
13009   PacketFragments packet = {
13010     // public flags (IETF Retry packet, 0-length original destination CID)
13011     {"Unable to read first byte.",
13012      {0xf0}},
13013     // version tag
13014     {"Unable to read protocol version.",
13015      {QUIC_VERSION_BYTES}},
13016     // connection_id length
13017     {"RETRY not supported in this version.",
13018      {0x00}},
13019   };
13020   // clang-format on
13021 
13022   std::unique_ptr<QuicEncryptedPacket> encrypted(
13023       AssemblePacketFromFragments(packet));
13024 
13025   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13026   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
13027   CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
13028 }
13029 
TEST_P(QuicFramerTest,RetryPacketRejectedWithMultiplePacketNumberSpaces)13030 TEST_P(QuicFramerTest, RetryPacketRejectedWithMultiplePacketNumberSpaces) {
13031   if (framer_.version().SupportsRetry()) {
13032     return;
13033   }
13034   framer_.EnableMultiplePacketNumberSpacesSupport();
13035 
13036   // clang-format off
13037   PacketFragments packet = {
13038     // public flags (IETF Retry packet, 0-length original destination CID)
13039     {"Unable to read first byte.",
13040      {0xf0}},
13041     // version tag
13042     {"Unable to read protocol version.",
13043      {QUIC_VERSION_BYTES}},
13044     // connection_id length
13045     {"RETRY not supported in this version.",
13046      {0x00}},
13047   };
13048   // clang-format on
13049 
13050   std::unique_ptr<QuicEncryptedPacket> encrypted(
13051       AssemblePacketFromFragments(packet));
13052 
13053   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13054   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
13055   CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
13056 }
13057 
TEST_P(QuicFramerTest,WriteClientVersionNegotiationProbePacket)13058 TEST_P(QuicFramerTest, WriteClientVersionNegotiationProbePacket) {
13059   // clang-format off
13060   static const uint8_t expected_packet[1200] = {
13061     // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13062     0xc0,
13063     // Version, part of the IETF space reserved for negotiation.
13064     0xca, 0xba, 0xda, 0xda,
13065     // Destination connection ID length 8.
13066     0x08,
13067     // 8-byte destination connection ID.
13068     0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13069     // Source connection ID length 0.
13070     0x00,
13071     // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13072     // not parse with any known version.
13073     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13074     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13075     // zeroes to pad to 16 byte boundary.
13076     0x00,
13077     // A polite greeting in case a human sees this in tcpdump.
13078     0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13079     0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13080     0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13081     0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13082     0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13083     0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13084     0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13085     0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13086     0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13087     0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13088     0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13089     0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13090     0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13091     0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13092     0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13093     0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13094     0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13095     0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13096     0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13097     0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13098     0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13099     0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13100     0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13101   };
13102   // clang-format on
13103   char packet[1200];
13104   char destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13105                                             0x6c, 0x7a, 0x20, 0x21};
13106   EXPECT_TRUE(QuicFramer::WriteClientVersionNegotiationProbePacket(
13107       packet, sizeof(packet), destination_connection_id_bytes,
13108       sizeof(destination_connection_id_bytes)));
13109   quiche::test::CompareCharArraysWithHexError(
13110       "constructed packet", packet, sizeof(packet),
13111       reinterpret_cast<const char*>(expected_packet), sizeof(expected_packet));
13112   QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13113                                 sizeof(packet), false);
13114   if (!framer_.version().HasLengthPrefixedConnectionIds()) {
13115     // We can only parse the connection ID with a parser expecting
13116     // length-prefixed connection IDs.
13117     EXPECT_FALSE(framer_.ProcessPacket(encrypted));
13118     return;
13119   }
13120   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
13121   ASSERT_TRUE(visitor_.header_.get());
13122   QuicConnectionId probe_payload_connection_id(
13123       reinterpret_cast<const char*>(destination_connection_id_bytes),
13124       sizeof(destination_connection_id_bytes));
13125   EXPECT_EQ(probe_payload_connection_id,
13126             visitor_.header_.get()->destination_connection_id);
13127 }
13128 
TEST_P(QuicFramerTest,DispatcherParseOldClientVersionNegotiationProbePacket)13129 TEST_P(QuicFramerTest, DispatcherParseOldClientVersionNegotiationProbePacket) {
13130   // clang-format off
13131   static const uint8_t packet[1200] = {
13132     // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13133     0xc0,
13134     // Version, part of the IETF space reserved for negotiation.
13135     0xca, 0xba, 0xda, 0xba,
13136     // Destination connection ID length 8, source connection ID length 0.
13137     0x50,
13138     // 8-byte destination connection ID.
13139     0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13140     // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13141     // not parse with any known version.
13142     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13143     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13144     // 2 bytes of zeroes to pad to 16 byte boundary.
13145     0x00, 0x00,
13146     // A polite greeting in case a human sees this in tcpdump.
13147     0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13148     0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13149     0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13150     0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13151     0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13152     0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13153     0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13154     0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13155     0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13156     0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13157     0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13158     0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13159     0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13160     0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13161     0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13162     0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13163     0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13164     0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13165     0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13166     0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13167     0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13168     0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13169     0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13170   };
13171   // clang-format on
13172   char expected_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13173                                                      0x6c, 0x7a, 0x20, 0x21};
13174   QuicConnectionId expected_destination_connection_id(
13175       reinterpret_cast<const char*>(expected_destination_connection_id_bytes),
13176       sizeof(expected_destination_connection_id_bytes));
13177 
13178   QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13179                                 sizeof(packet));
13180   PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
13181   QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
13182   bool version_present = false, has_length_prefix = true;
13183   QuicVersionLabel version_label = 33;
13184   ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
13185   QuicConnectionId destination_connection_id = TestConnectionId(1);
13186   QuicConnectionId source_connection_id = TestConnectionId(2);
13187   std::optional<absl::string_view> retry_token;
13188   std::string detailed_error = "foobar";
13189   QuicErrorCode header_parse_result = QuicFramer::ParsePublicHeaderDispatcher(
13190       encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
13191       &version_present, &has_length_prefix, &version_label, &parsed_version,
13192       &destination_connection_id, &source_connection_id, &retry_token,
13193       &detailed_error);
13194   EXPECT_THAT(header_parse_result, IsQuicNoError());
13195   EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
13196   EXPECT_TRUE(version_present);
13197   EXPECT_FALSE(has_length_prefix);
13198   EXPECT_EQ(0xcabadaba, version_label);
13199   EXPECT_EQ(expected_destination_connection_id, destination_connection_id);
13200   EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
13201   EXPECT_FALSE(retry_token.has_value());
13202   EXPECT_EQ("", detailed_error);
13203 }
13204 
TEST_P(QuicFramerTest,DispatcherParseClientVersionNegotiationProbePacket)13205 TEST_P(QuicFramerTest, DispatcherParseClientVersionNegotiationProbePacket) {
13206   // clang-format off
13207   static const uint8_t packet[1200] = {
13208     // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13209     0xc0,
13210     // Version, part of the IETF space reserved for negotiation.
13211     0xca, 0xba, 0xda, 0xba,
13212     // Destination connection ID length 8.
13213     0x08,
13214     // 8-byte destination connection ID.
13215     0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13216     // Source connection ID length 0.
13217     0x00,
13218     // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13219     // not parse with any known version.
13220     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13221     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13222     // 1 byte of zeroes to pad to 16 byte boundary.
13223     0x00,
13224     // A polite greeting in case a human sees this in tcpdump.
13225     0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13226     0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13227     0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13228     0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13229     0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13230     0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13231     0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13232     0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13233     0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13234     0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13235     0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13236     0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13237     0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13238     0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13239     0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13240     0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13241     0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13242     0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13243     0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13244     0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13245     0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13246     0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13247     0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13248   };
13249   // clang-format on
13250   char expected_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13251                                                      0x6c, 0x7a, 0x20, 0x21};
13252   QuicConnectionId expected_destination_connection_id(
13253       reinterpret_cast<const char*>(expected_destination_connection_id_bytes),
13254       sizeof(expected_destination_connection_id_bytes));
13255 
13256   QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13257                                 sizeof(packet));
13258   PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
13259   QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
13260   bool version_present = false, has_length_prefix = false;
13261   QuicVersionLabel version_label = 33;
13262   ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
13263   QuicConnectionId destination_connection_id = TestConnectionId(1);
13264   QuicConnectionId source_connection_id = TestConnectionId(2);
13265   std::optional<absl::string_view> retry_token;
13266   std::string detailed_error = "foobar";
13267   QuicErrorCode header_parse_result = QuicFramer::ParsePublicHeaderDispatcher(
13268       encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
13269       &version_present, &has_length_prefix, &version_label, &parsed_version,
13270       &destination_connection_id, &source_connection_id, &retry_token,
13271       &detailed_error);
13272   EXPECT_THAT(header_parse_result, IsQuicNoError());
13273   EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
13274   EXPECT_TRUE(version_present);
13275   EXPECT_TRUE(has_length_prefix);
13276   EXPECT_EQ(0xcabadaba, version_label);
13277   EXPECT_EQ(expected_destination_connection_id, destination_connection_id);
13278   EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
13279   EXPECT_EQ("", detailed_error);
13280 }
13281 
TEST_P(QuicFramerTest,ParseServerVersionNegotiationProbeResponse)13282 TEST_P(QuicFramerTest, ParseServerVersionNegotiationProbeResponse) {
13283   // clang-format off
13284   const uint8_t packet[] = {
13285     // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13286     0xc0,
13287     // Version of 0, indicating version negotiation.
13288     0x00, 0x00, 0x00, 0x00,
13289     // Destination connection ID length 0, source connection ID length 8.
13290     0x00, 0x08,
13291     // 8-byte source connection ID.
13292     0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13293     // A few supported versions.
13294     0xaa, 0xaa, 0xaa, 0xaa,
13295     QUIC_VERSION_BYTES,
13296   };
13297   // clang-format on
13298   char probe_payload_bytes[] = {0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21};
13299   char parsed_probe_payload_bytes[255] = {};
13300   uint8_t parsed_probe_payload_length = sizeof(parsed_probe_payload_bytes);
13301   std::string parse_detailed_error = "";
13302   EXPECT_TRUE(QuicFramer::ParseServerVersionNegotiationProbeResponse(
13303       reinterpret_cast<const char*>(packet), sizeof(packet),
13304       reinterpret_cast<char*>(parsed_probe_payload_bytes),
13305       &parsed_probe_payload_length, &parse_detailed_error));
13306   EXPECT_EQ("", parse_detailed_error);
13307   quiche::test::CompareCharArraysWithHexError(
13308       "parsed probe", parsed_probe_payload_bytes, parsed_probe_payload_length,
13309       probe_payload_bytes, sizeof(probe_payload_bytes));
13310 }
13311 
TEST_P(QuicFramerTest,ParseClientVersionNegotiationProbePacket)13312 TEST_P(QuicFramerTest, ParseClientVersionNegotiationProbePacket) {
13313   char packet[1200];
13314   char input_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13315                                                   0x6c, 0x7a, 0x20, 0x21};
13316   ASSERT_TRUE(QuicFramer::WriteClientVersionNegotiationProbePacket(
13317       packet, sizeof(packet), input_destination_connection_id_bytes,
13318       sizeof(input_destination_connection_id_bytes)));
13319   char parsed_destination_connection_id_bytes[255] = {0};
13320   uint8_t parsed_destination_connection_id_length =
13321       sizeof(parsed_destination_connection_id_bytes);
13322   ASSERT_TRUE(ParseClientVersionNegotiationProbePacket(
13323       packet, sizeof(packet), parsed_destination_connection_id_bytes,
13324       &parsed_destination_connection_id_length));
13325   quiche::test::CompareCharArraysWithHexError(
13326       "parsed destination connection ID",
13327       parsed_destination_connection_id_bytes,
13328       parsed_destination_connection_id_length,
13329       input_destination_connection_id_bytes,
13330       sizeof(input_destination_connection_id_bytes));
13331 }
13332 
TEST_P(QuicFramerTest,WriteServerVersionNegotiationProbeResponse)13333 TEST_P(QuicFramerTest, WriteServerVersionNegotiationProbeResponse) {
13334   char packet[1200];
13335   size_t packet_length = sizeof(packet);
13336   char input_source_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13337                                              0x6c, 0x7a, 0x20, 0x21};
13338   ASSERT_TRUE(WriteServerVersionNegotiationProbeResponse(
13339       packet, &packet_length, input_source_connection_id_bytes,
13340       sizeof(input_source_connection_id_bytes)));
13341   char parsed_source_connection_id_bytes[255] = {0};
13342   uint8_t parsed_source_connection_id_length =
13343       sizeof(parsed_source_connection_id_bytes);
13344   std::string detailed_error;
13345   ASSERT_TRUE(QuicFramer::ParseServerVersionNegotiationProbeResponse(
13346       packet, packet_length, parsed_source_connection_id_bytes,
13347       &parsed_source_connection_id_length, &detailed_error))
13348       << detailed_error;
13349   quiche::test::CompareCharArraysWithHexError(
13350       "parsed destination connection ID", parsed_source_connection_id_bytes,
13351       parsed_source_connection_id_length, input_source_connection_id_bytes,
13352       sizeof(input_source_connection_id_bytes));
13353 }
13354 
TEST_P(QuicFramerTest,ClientConnectionIdFromLongHeaderToClient)13355 TEST_P(QuicFramerTest, ClientConnectionIdFromLongHeaderToClient) {
13356   SetDecrypterLevel(ENCRYPTION_HANDSHAKE);
13357   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13358   // clang-format off
13359   unsigned char packet[] = {
13360     // public flags (long header with packet type HANDSHAKE and
13361     // 4-byte packet number)
13362     0xE3,
13363     // version
13364     QUIC_VERSION_BYTES,
13365     // connection ID lengths
13366     0x50,
13367     // destination connection ID
13368     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13369     // long header packet length
13370     0x05,
13371     // packet number
13372     0x12, 0x34, 0x56, 0x00,
13373     // padding frame
13374     0x00,
13375   };
13376   unsigned char packet49[] = {
13377     // public flags (long header with packet type HANDSHAKE and
13378     // 4-byte packet number)
13379     0xE3,
13380     // version
13381     QUIC_VERSION_BYTES,
13382     // destination connection ID length
13383     0x08,
13384     // destination connection ID
13385     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13386     // source connection ID length
13387     0x00,
13388     // long header packet length
13389     0x05,
13390     // packet number
13391     0x12, 0x34, 0x56, 0x00,
13392     // padding frame
13393     0x00,
13394   };
13395   // clang-format on
13396 
13397   unsigned char* p = packet;
13398   size_t p_length = ABSL_ARRAYSIZE(packet);
13399   if (framer_.version().HasLongHeaderLengths()) {
13400     ReviseFirstByteByVersion(packet49);
13401     p = packet49;
13402     p_length = ABSL_ARRAYSIZE(packet49);
13403   }
13404   const bool parse_success =
13405       framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false));
13406   if (!framer_.version().AllowsVariableLengthConnectionIds()) {
13407     EXPECT_FALSE(parse_success);
13408     EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
13409     EXPECT_EQ("Invalid ConnectionId length.", framer_.detailed_error());
13410     return;
13411   }
13412   EXPECT_TRUE(parse_success);
13413   EXPECT_THAT(framer_.error(), IsQuicNoError());
13414   EXPECT_EQ("", framer_.detailed_error());
13415   ASSERT_TRUE(visitor_.header_.get());
13416   EXPECT_EQ(FramerTestConnectionId(),
13417             visitor_.header_.get()->destination_connection_id);
13418 }
13419 
TEST_P(QuicFramerTest,ClientConnectionIdFromLongHeaderToServer)13420 TEST_P(QuicFramerTest, ClientConnectionIdFromLongHeaderToServer) {
13421   SetDecrypterLevel(ENCRYPTION_HANDSHAKE);
13422   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13423   // clang-format off
13424   unsigned char packet[] = {
13425     // public flags (long header with packet type HANDSHAKE and
13426     // 4-byte packet number)
13427     0xE3,
13428     // version
13429     QUIC_VERSION_BYTES,
13430     // connection ID lengths
13431     0x05,
13432     // source connection ID
13433     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13434     // long header packet length
13435     0x05,
13436     // packet number
13437     0x12, 0x34, 0x56, 0x00,
13438     // padding frame
13439     0x00,
13440   };
13441   unsigned char packet49[] = {
13442     // public flags (long header with packet type HANDSHAKE and
13443     // 4-byte packet number)
13444     0xE3,
13445     // version
13446     QUIC_VERSION_BYTES,
13447     // connection ID lengths
13448     0x00, 0x08,
13449     // source connection ID
13450     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13451     // long header packet length
13452     0x05,
13453     // packet number
13454     0x12, 0x34, 0x56, 0x00,
13455     // padding frame
13456     0x00,
13457   };
13458   // clang-format on
13459   unsigned char* p = packet;
13460   size_t p_length = ABSL_ARRAYSIZE(packet);
13461   if (framer_.version().HasLongHeaderLengths()) {
13462     ReviseFirstByteByVersion(packet49);
13463     p = packet49;
13464     p_length = ABSL_ARRAYSIZE(packet49);
13465   }
13466   const bool parse_success =
13467       framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false));
13468   if (!framer_.version().AllowsVariableLengthConnectionIds()) {
13469     EXPECT_FALSE(parse_success);
13470     EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
13471     EXPECT_EQ("Invalid ConnectionId length.", framer_.detailed_error());
13472     return;
13473   }
13474   if (!framer_.version().SupportsClientConnectionIds()) {
13475     EXPECT_FALSE(parse_success);
13476     EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
13477     EXPECT_EQ("Client connection ID not supported in this version.",
13478               framer_.detailed_error());
13479     return;
13480   }
13481   EXPECT_TRUE(parse_success);
13482   EXPECT_THAT(framer_.error(), IsQuicNoError());
13483   EXPECT_EQ("", framer_.detailed_error());
13484   ASSERT_TRUE(visitor_.header_.get());
13485   EXPECT_EQ(FramerTestConnectionId(),
13486             visitor_.header_.get()->source_connection_id);
13487 }
13488 
TEST_P(QuicFramerTest,ProcessAndValidateIetfConnectionIdLengthClient)13489 TEST_P(QuicFramerTest, ProcessAndValidateIetfConnectionIdLengthClient) {
13490   char connection_id_lengths = 0x05;
13491   QuicDataReader reader(&connection_id_lengths, 1);
13492 
13493   bool should_update_expected_server_connection_id_length = false;
13494   uint8_t expected_server_connection_id_length = 8;
13495   uint8_t destination_connection_id_length = 0;
13496   uint8_t source_connection_id_length = 8;
13497   std::string detailed_error = "";
13498 
13499   EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13500       &reader, framer_.version(), Perspective::IS_CLIENT,
13501       should_update_expected_server_connection_id_length,
13502       &expected_server_connection_id_length, &destination_connection_id_length,
13503       &source_connection_id_length, &detailed_error));
13504   EXPECT_EQ(8, expected_server_connection_id_length);
13505   EXPECT_EQ(0, destination_connection_id_length);
13506   EXPECT_EQ(8, source_connection_id_length);
13507   EXPECT_EQ("", detailed_error);
13508 
13509   QuicDataReader reader2(&connection_id_lengths, 1);
13510   should_update_expected_server_connection_id_length = true;
13511   expected_server_connection_id_length = 33;
13512   EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13513       &reader2, framer_.version(), Perspective::IS_CLIENT,
13514       should_update_expected_server_connection_id_length,
13515       &expected_server_connection_id_length, &destination_connection_id_length,
13516       &source_connection_id_length, &detailed_error));
13517   EXPECT_EQ(8, expected_server_connection_id_length);
13518   EXPECT_EQ(0, destination_connection_id_length);
13519   EXPECT_EQ(8, source_connection_id_length);
13520   EXPECT_EQ("", detailed_error);
13521 }
13522 
TEST_P(QuicFramerTest,ProcessAndValidateIetfConnectionIdLengthServer)13523 TEST_P(QuicFramerTest, ProcessAndValidateIetfConnectionIdLengthServer) {
13524   char connection_id_lengths = 0x50;
13525   QuicDataReader reader(&connection_id_lengths, 1);
13526 
13527   bool should_update_expected_server_connection_id_length = false;
13528   uint8_t expected_server_connection_id_length = 8;
13529   uint8_t destination_connection_id_length = 8;
13530   uint8_t source_connection_id_length = 0;
13531   std::string detailed_error = "";
13532 
13533   EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13534       &reader, framer_.version(), Perspective::IS_SERVER,
13535       should_update_expected_server_connection_id_length,
13536       &expected_server_connection_id_length, &destination_connection_id_length,
13537       &source_connection_id_length, &detailed_error));
13538   EXPECT_EQ(8, expected_server_connection_id_length);
13539   EXPECT_EQ(8, destination_connection_id_length);
13540   EXPECT_EQ(0, source_connection_id_length);
13541   EXPECT_EQ("", detailed_error);
13542 
13543   QuicDataReader reader2(&connection_id_lengths, 1);
13544   should_update_expected_server_connection_id_length = true;
13545   expected_server_connection_id_length = 33;
13546   EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13547       &reader2, framer_.version(), Perspective::IS_SERVER,
13548       should_update_expected_server_connection_id_length,
13549       &expected_server_connection_id_length, &destination_connection_id_length,
13550       &source_connection_id_length, &detailed_error));
13551   EXPECT_EQ(8, expected_server_connection_id_length);
13552   EXPECT_EQ(8, destination_connection_id_length);
13553   EXPECT_EQ(0, source_connection_id_length);
13554   EXPECT_EQ("", detailed_error);
13555 }
13556 
TEST_P(QuicFramerTest,TestExtendedErrorCodeParser)13557 TEST_P(QuicFramerTest, TestExtendedErrorCodeParser) {
13558   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
13559     // Extended error codes only in IETF QUIC
13560     return;
13561   }
13562   QuicConnectionCloseFrame frame;
13563 
13564   frame.error_details = "this has no error code info in it";
13565   MaybeExtractQuicErrorCode(&frame);
13566   EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13567   EXPECT_EQ("this has no error code info in it", frame.error_details);
13568 
13569   frame.error_details = "1234this does not have the colon in it";
13570   MaybeExtractQuicErrorCode(&frame);
13571   EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13572   EXPECT_EQ("1234this does not have the colon in it", frame.error_details);
13573 
13574   frame.error_details = "1a234:this has a colon, but a malformed error number";
13575   MaybeExtractQuicErrorCode(&frame);
13576   EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13577   EXPECT_EQ("1a234:this has a colon, but a malformed error number",
13578             frame.error_details);
13579 
13580   frame.error_details = "1234:this is good";
13581   MaybeExtractQuicErrorCode(&frame);
13582   EXPECT_EQ(1234u, frame.quic_error_code);
13583   EXPECT_EQ("this is good", frame.error_details);
13584 
13585   frame.error_details =
13586       "1234 :this is not good, space between last digit and colon";
13587   MaybeExtractQuicErrorCode(&frame);
13588   EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13589   EXPECT_EQ("1234 :this is not good, space between last digit and colon",
13590             frame.error_details);
13591 
13592   frame.error_details = "123456789";
13593   MaybeExtractQuicErrorCode(&frame);
13594   EXPECT_THAT(
13595       frame.quic_error_code,
13596       IsError(QUIC_IETF_GQUIC_ERROR_MISSING));  // Not good, all numbers, no :
13597   EXPECT_EQ("123456789", frame.error_details);
13598 
13599   frame.error_details = "1234:";
13600   MaybeExtractQuicErrorCode(&frame);
13601   EXPECT_EQ(1234u,
13602             frame.quic_error_code);  // corner case.
13603   EXPECT_EQ("", frame.error_details);
13604 
13605   frame.error_details = "1234:5678";
13606   MaybeExtractQuicErrorCode(&frame);
13607   EXPECT_EQ(1234u,
13608             frame.quic_error_code);  // another corner case.
13609   EXPECT_EQ("5678", frame.error_details);
13610 
13611   frame.error_details = "12345 6789:";
13612   MaybeExtractQuicErrorCode(&frame);
13613   EXPECT_THAT(frame.quic_error_code,
13614               IsError(QUIC_IETF_GQUIC_ERROR_MISSING));  // Not good
13615   EXPECT_EQ("12345 6789:", frame.error_details);
13616 
13617   frame.error_details = ":no numbers, is not good";
13618   MaybeExtractQuicErrorCode(&frame);
13619   EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13620   EXPECT_EQ(":no numbers, is not good", frame.error_details);
13621 
13622   frame.error_details = "qwer:also no numbers, is not good";
13623   MaybeExtractQuicErrorCode(&frame);
13624   EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13625   EXPECT_EQ("qwer:also no numbers, is not good", frame.error_details);
13626 
13627   frame.error_details = " 1234:this is not good, space before first digit";
13628   MaybeExtractQuicErrorCode(&frame);
13629   EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13630   EXPECT_EQ(" 1234:this is not good, space before first digit",
13631             frame.error_details);
13632 
13633   frame.error_details = "1234:";
13634   MaybeExtractQuicErrorCode(&frame);
13635   EXPECT_EQ(1234u,
13636             frame.quic_error_code);  // this is good
13637   EXPECT_EQ("", frame.error_details);
13638 
13639   // Value does not fit in uint32_t.
13640   frame.error_details = "12345678901:";
13641   MaybeExtractQuicErrorCode(&frame);
13642   EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13643   EXPECT_EQ("12345678901:", frame.error_details);
13644 }
13645 
13646 // Regression test for crbug/1029636.
TEST_P(QuicFramerTest,OverlyLargeAckDelay)13647 TEST_P(QuicFramerTest, OverlyLargeAckDelay) {
13648   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
13649     return;
13650   }
13651   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
13652   // clang-format off
13653   unsigned char packet_ietf[] = {
13654     // type (short header, 4 byte packet number)
13655     0x43,
13656     // connection_id
13657     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13658     // packet number
13659     0x12, 0x34, 0x56, 0x78,
13660 
13661     // frame type (IETF_ACK frame)
13662     0x02,
13663     // largest acked
13664     kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
13665     // ack delay time.
13666     kVarInt62EightBytes + 0x31, 0x00, 0x00, 0x00, 0xF3, 0xA0, 0x81, 0xE0,
13667     // Nr. of additional ack blocks
13668     kVarInt62OneByte + 0x00,
13669     // first ack block length.
13670     kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
13671   };
13672   // clang-format on
13673 
13674   framer_.ProcessPacket(QuicEncryptedPacket(
13675       AsChars(packet_ietf), ABSL_ARRAYSIZE(packet_ietf), false));
13676   ASSERT_EQ(1u, visitor_.ack_frames_.size());
13677   // Verify ack_delay_time is set correctly.
13678   EXPECT_EQ(QuicTime::Delta::Infinite(),
13679             visitor_.ack_frames_[0]->ack_delay_time);
13680 }
13681 
TEST_P(QuicFramerTest,KeyUpdate)13682 TEST_P(QuicFramerTest, KeyUpdate) {
13683   if (!framer_.version().UsesTls()) {
13684     // Key update is only used in QUIC+TLS.
13685     return;
13686   }
13687   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13688   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13689   // instead of TestDecrypter.
13690   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13691                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13692   framer_.SetKeyUpdateSupportForConnection(true);
13693 
13694   QuicPacketHeader header;
13695   header.destination_connection_id = FramerTestConnectionId();
13696   header.reset_flag = false;
13697   header.version_flag = false;
13698   header.packet_number = kPacketNumber;
13699 
13700   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13701 
13702   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13703   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13704   ASSERT_TRUE(data != nullptr);
13705   std::unique_ptr<QuicEncryptedPacket> encrypted(
13706       EncryptPacketWithTagAndPhase(*data, 0, false));
13707   ASSERT_TRUE(encrypted);
13708 
13709   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13710   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13711   // Processed valid packet with phase=0, key=1: no key update.
13712   EXPECT_EQ(0u, visitor_.key_update_count());
13713   EXPECT_EQ(0, visitor_.derive_next_key_count_);
13714   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13715 
13716   header.packet_number += 1;
13717   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13718   data = BuildDataPacket(header, frames);
13719   ASSERT_TRUE(data != nullptr);
13720   encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13721   ASSERT_TRUE(encrypted);
13722   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13723   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13724   // Processed valid packet with phase=1, key=2: key update should have
13725   // occurred.
13726   ASSERT_EQ(1u, visitor_.key_update_count());
13727   EXPECT_EQ(KeyUpdateReason::kRemote, visitor_.key_update_reasons_[0]);
13728   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13729   EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13730 
13731   header.packet_number += 1;
13732   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13733   data = BuildDataPacket(header, frames);
13734   ASSERT_TRUE(data != nullptr);
13735   encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13736   ASSERT_TRUE(encrypted);
13737   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13738   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13739   // Processed another valid packet with phase=1, key=2: no key update.
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   // Process another key update.
13745   header.packet_number += 1;
13746   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13747   data = BuildDataPacket(header, frames);
13748   ASSERT_TRUE(data != nullptr);
13749   encrypted = EncryptPacketWithTagAndPhase(*data, 2, false);
13750   ASSERT_TRUE(encrypted);
13751   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13752   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13753   ASSERT_EQ(2u, visitor_.key_update_count());
13754   EXPECT_EQ(KeyUpdateReason::kRemote, visitor_.key_update_reasons_[1]);
13755   EXPECT_EQ(2, visitor_.derive_next_key_count_);
13756   EXPECT_EQ(3, visitor_.decrypted_first_packet_in_key_phase_count_);
13757 }
13758 
TEST_P(QuicFramerTest,KeyUpdateOldPacketAfterUpdate)13759 TEST_P(QuicFramerTest, KeyUpdateOldPacketAfterUpdate) {
13760   if (!framer_.version().UsesTls()) {
13761     // Key update is only used in QUIC+TLS.
13762     return;
13763   }
13764   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13765   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13766   // instead of TestDecrypter.
13767   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13768                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13769   framer_.SetKeyUpdateSupportForConnection(true);
13770 
13771   QuicPacketHeader header;
13772   header.destination_connection_id = FramerTestConnectionId();
13773   header.reset_flag = false;
13774   header.version_flag = false;
13775   header.packet_number = kPacketNumber;
13776 
13777   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13778 
13779   // Process packet N with phase 0.
13780   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13781   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13782   ASSERT_TRUE(data != nullptr);
13783   std::unique_ptr<QuicEncryptedPacket> encrypted(
13784       EncryptPacketWithTagAndPhase(*data, 0, false));
13785   ASSERT_TRUE(encrypted);
13786   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13787   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13788   EXPECT_EQ(0u, visitor_.key_update_count());
13789   EXPECT_EQ(0, visitor_.derive_next_key_count_);
13790   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13791 
13792   // Process packet N+2 with phase 1.
13793   header.packet_number = kPacketNumber + 2;
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   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13801   EXPECT_EQ(1u, visitor_.key_update_count());
13802   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13803   EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13804 
13805   // Process packet N+1 with phase 0. (Receiving packet from previous phase
13806   // after packet from new phase was received.)
13807   header.packet_number = kPacketNumber + 1;
13808   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13809   data = BuildDataPacket(header, frames);
13810   ASSERT_TRUE(data != nullptr);
13811   encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
13812   ASSERT_TRUE(encrypted);
13813   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13814   // Packet should decrypt and key update count should not change.
13815   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13816   EXPECT_EQ(1u, visitor_.key_update_count());
13817   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13818   EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13819 }
13820 
TEST_P(QuicFramerTest,KeyUpdateOldPacketAfterDiscardPreviousOneRttKeys)13821 TEST_P(QuicFramerTest, KeyUpdateOldPacketAfterDiscardPreviousOneRttKeys) {
13822   if (!framer_.version().UsesTls()) {
13823     // Key update is only used in QUIC+TLS.
13824     return;
13825   }
13826   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13827   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13828   // instead of TestDecrypter.
13829   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13830                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13831   framer_.SetKeyUpdateSupportForConnection(true);
13832 
13833   QuicPacketHeader header;
13834   header.destination_connection_id = FramerTestConnectionId();
13835   header.reset_flag = false;
13836   header.version_flag = false;
13837   header.packet_number = kPacketNumber;
13838 
13839   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13840 
13841   // Process packet N with phase 0.
13842   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13843   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13844   ASSERT_TRUE(data != nullptr);
13845   std::unique_ptr<QuicEncryptedPacket> encrypted(
13846       EncryptPacketWithTagAndPhase(*data, 0, false));
13847   ASSERT_TRUE(encrypted);
13848   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13849   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13850   EXPECT_EQ(0u, visitor_.key_update_count());
13851   EXPECT_EQ(0, visitor_.derive_next_key_count_);
13852   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13853 
13854   // Process packet N+2 with phase 1.
13855   header.packet_number = kPacketNumber + 2;
13856   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13857   data = BuildDataPacket(header, frames);
13858   ASSERT_TRUE(data != nullptr);
13859   encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13860   ASSERT_TRUE(encrypted);
13861   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13862   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13863   EXPECT_EQ(1u, visitor_.key_update_count());
13864   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13865   EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13866 
13867   // Discard keys for previous key phase.
13868   framer_.DiscardPreviousOneRttKeys();
13869 
13870   // Process packet N+1 with phase 0. (Receiving packet from previous phase
13871   // after packet from new phase was received.)
13872   header.packet_number = kPacketNumber + 1;
13873   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13874   data = BuildDataPacket(header, frames);
13875   ASSERT_TRUE(data != nullptr);
13876   encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
13877   ASSERT_TRUE(encrypted);
13878   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13879   // Packet should not decrypt and key update count should not change.
13880   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13881   EXPECT_EQ(1u, visitor_.key_update_count());
13882   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13883   EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13884 }
13885 
TEST_P(QuicFramerTest,KeyUpdatePacketsOutOfOrder)13886 TEST_P(QuicFramerTest, KeyUpdatePacketsOutOfOrder) {
13887   if (!framer_.version().UsesTls()) {
13888     // Key update is only used in QUIC+TLS.
13889     return;
13890   }
13891   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13892   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13893   // instead of TestDecrypter.
13894   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13895                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13896   framer_.SetKeyUpdateSupportForConnection(true);
13897 
13898   QuicPacketHeader header;
13899   header.destination_connection_id = FramerTestConnectionId();
13900   header.reset_flag = false;
13901   header.version_flag = false;
13902   header.packet_number = kPacketNumber;
13903 
13904   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13905 
13906   // Process packet N with phase 0.
13907   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13908   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13909   ASSERT_TRUE(data != nullptr);
13910   std::unique_ptr<QuicEncryptedPacket> encrypted(
13911       EncryptPacketWithTagAndPhase(*data, 0, false));
13912   ASSERT_TRUE(encrypted);
13913   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13914   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13915   EXPECT_EQ(0u, visitor_.key_update_count());
13916   EXPECT_EQ(0, visitor_.derive_next_key_count_);
13917   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13918 
13919   // Process packet N+2 with phase 1.
13920   header.packet_number = kPacketNumber + 2;
13921   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13922   data = BuildDataPacket(header, frames);
13923   ASSERT_TRUE(data != nullptr);
13924   encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13925   ASSERT_TRUE(encrypted);
13926   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13927   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13928   EXPECT_EQ(1u, visitor_.key_update_count());
13929   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13930   EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13931 
13932   // Process packet N+1 with phase 1. (Receiving packet from new phase out of
13933   // order.)
13934   header.packet_number = kPacketNumber + 1;
13935   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13936   data = BuildDataPacket(header, frames);
13937   ASSERT_TRUE(data != nullptr);
13938   encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13939   ASSERT_TRUE(encrypted);
13940   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13941   // Packet should decrypt and key update count should not change.
13942   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13943   EXPECT_EQ(1u, visitor_.key_update_count());
13944   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13945   EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13946 }
13947 
TEST_P(QuicFramerTest,KeyUpdateWrongKey)13948 TEST_P(QuicFramerTest, KeyUpdateWrongKey) {
13949   if (!framer_.version().UsesTls()) {
13950     // Key update is only used in QUIC+TLS.
13951     return;
13952   }
13953   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13954   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13955   // instead of TestDecrypter.
13956   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13957                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13958   framer_.SetKeyUpdateSupportForConnection(true);
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   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13969   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13970   ASSERT_TRUE(data != nullptr);
13971   std::unique_ptr<QuicEncryptedPacket> encrypted(
13972       EncryptPacketWithTagAndPhase(*data, 0, false));
13973   ASSERT_TRUE(encrypted);
13974 
13975   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13976   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13977   // Processed valid packet with phase=0, key=1: no key update.
13978   EXPECT_EQ(0u, visitor_.key_update_count());
13979   EXPECT_EQ(0, visitor_.derive_next_key_count_);
13980   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13981   EXPECT_EQ(0u, framer_.PotentialPeerKeyUpdateAttemptCount());
13982 
13983   header.packet_number += 1;
13984   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13985   data = BuildDataPacket(header, frames);
13986   ASSERT_TRUE(data != nullptr);
13987   encrypted = EncryptPacketWithTagAndPhase(*data, 2, true);
13988   ASSERT_TRUE(encrypted);
13989   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13990   // Packet with phase=1 but key=3, should not process and should not cause key
13991   // update, but next decrypter key should have been created to attempt to
13992   // decode it.
13993   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13994   EXPECT_EQ(0u, visitor_.key_update_count());
13995   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13996   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13997   EXPECT_EQ(1u, framer_.PotentialPeerKeyUpdateAttemptCount());
13998 
13999   header.packet_number += 1;
14000   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14001   data = BuildDataPacket(header, frames);
14002   ASSERT_TRUE(data != nullptr);
14003   encrypted = EncryptPacketWithTagAndPhase(*data, 0, true);
14004   ASSERT_TRUE(encrypted);
14005   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14006   // Packet with phase=1 but key=1, should not process and should not cause key
14007   // update.
14008   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
14009   EXPECT_EQ(0u, visitor_.key_update_count());
14010   EXPECT_EQ(1, visitor_.derive_next_key_count_);
14011   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14012   EXPECT_EQ(2u, framer_.PotentialPeerKeyUpdateAttemptCount());
14013 
14014   header.packet_number += 1;
14015   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14016   data = BuildDataPacket(header, frames);
14017   ASSERT_TRUE(data != nullptr);
14018   encrypted = EncryptPacketWithTagAndPhase(*data, 1, false);
14019   ASSERT_TRUE(encrypted);
14020   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14021   // Packet with phase=0 but key=2, should not process and should not cause key
14022   // update.
14023   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
14024   EXPECT_EQ(0u, visitor_.key_update_count());
14025   EXPECT_EQ(1, visitor_.derive_next_key_count_);
14026   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14027   EXPECT_EQ(2u, framer_.PotentialPeerKeyUpdateAttemptCount());
14028 
14029   header.packet_number += 1;
14030   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14031   data = BuildDataPacket(header, frames);
14032   ASSERT_TRUE(data != nullptr);
14033   encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
14034   ASSERT_TRUE(encrypted);
14035   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14036   // Packet with phase=0 and key=0, should process and reset
14037   // potential_peer_key_update_attempt_count_.
14038   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14039   EXPECT_EQ(0u, visitor_.key_update_count());
14040   EXPECT_EQ(1, visitor_.derive_next_key_count_);
14041   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14042   EXPECT_EQ(0u, framer_.PotentialPeerKeyUpdateAttemptCount());
14043 }
14044 
TEST_P(QuicFramerTest,KeyUpdateReceivedWhenNotEnabled)14045 TEST_P(QuicFramerTest, KeyUpdateReceivedWhenNotEnabled) {
14046   if (!framer_.version().UsesTls()) {
14047     // Key update is only used in QUIC+TLS.
14048     return;
14049   }
14050   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14051   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14052   // instead of TestDecrypter.
14053   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14054                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14055 
14056   QuicPacketHeader header;
14057   header.destination_connection_id = FramerTestConnectionId();
14058   header.reset_flag = false;
14059   header.version_flag = false;
14060   header.packet_number = kPacketNumber;
14061 
14062   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
14063 
14064   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14065   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
14066   ASSERT_TRUE(data != nullptr);
14067   std::unique_ptr<QuicEncryptedPacket> encrypted(
14068       EncryptPacketWithTagAndPhase(*data, 1, true));
14069   ASSERT_TRUE(encrypted);
14070 
14071   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14072   // Received a packet with key phase updated even though framer hasn't had key
14073   // update enabled (SetNextOneRttCrypters never called). Should fail to
14074   // process.
14075   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
14076   EXPECT_EQ(0u, visitor_.key_update_count());
14077   EXPECT_EQ(0, visitor_.derive_next_key_count_);
14078   EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
14079 }
14080 
TEST_P(QuicFramerTest,KeyUpdateLocallyInitiated)14081 TEST_P(QuicFramerTest, KeyUpdateLocallyInitiated) {
14082   if (!framer_.version().UsesTls()) {
14083     // Key update is only used in QUIC+TLS.
14084     return;
14085   }
14086   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14087   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14088   // instead of TestDecrypter.
14089   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14090                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14091   framer_.SetKeyUpdateSupportForConnection(true);
14092 
14093   EXPECT_TRUE(framer_.DoKeyUpdate(KeyUpdateReason::kLocalForTests));
14094   // Key update count should be updated, but haven't received packet from peer
14095   // with new key phase.
14096   ASSERT_EQ(1u, visitor_.key_update_count());
14097   EXPECT_EQ(KeyUpdateReason::kLocalForTests, visitor_.key_update_reasons_[0]);
14098   EXPECT_EQ(1, visitor_.derive_next_key_count_);
14099   EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
14100 
14101   QuicPacketHeader header;
14102   header.destination_connection_id = FramerTestConnectionId();
14103   header.reset_flag = false;
14104   header.version_flag = false;
14105   header.packet_number = kPacketNumber;
14106 
14107   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
14108 
14109   // Process packet N with phase 1.
14110   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14111   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
14112   ASSERT_TRUE(data != nullptr);
14113   std::unique_ptr<QuicEncryptedPacket> encrypted(
14114       EncryptPacketWithTagAndPhase(*data, 1, true));
14115   ASSERT_TRUE(encrypted);
14116 
14117   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14118   // Packet should decrypt and key update count should not change and
14119   // OnDecryptedFirstPacketInKeyPhase should have been called.
14120   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14121   EXPECT_EQ(1u, visitor_.key_update_count());
14122   EXPECT_EQ(1, visitor_.derive_next_key_count_);
14123   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14124 
14125   // Process packet N-1 with phase 0. (Receiving packet from previous phase
14126   // after packet from new phase was received.)
14127   header.packet_number = kPacketNumber - 1;
14128   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14129   data = BuildDataPacket(header, frames);
14130   ASSERT_TRUE(data != nullptr);
14131   encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
14132   ASSERT_TRUE(encrypted);
14133   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14134   // Packet should decrypt and key update count should not change.
14135   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14136   EXPECT_EQ(1u, visitor_.key_update_count());
14137   EXPECT_EQ(1, visitor_.derive_next_key_count_);
14138   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14139 
14140   // Process packet N+1 with phase 0 and key 1. This should not decrypt even
14141   // though it's using the previous key, since the packet number is higher than
14142   // a packet number received using the current key.
14143   header.packet_number = kPacketNumber + 1;
14144   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14145   data = BuildDataPacket(header, frames);
14146   ASSERT_TRUE(data != nullptr);
14147   encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
14148   ASSERT_TRUE(encrypted);
14149   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14150   // Packet should not decrypt and key update count should not change.
14151   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
14152   EXPECT_EQ(1u, visitor_.key_update_count());
14153   EXPECT_EQ(2, visitor_.derive_next_key_count_);
14154   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14155 }
14156 
TEST_P(QuicFramerTest,KeyUpdateLocallyInitiatedReceivedOldPacket)14157 TEST_P(QuicFramerTest, KeyUpdateLocallyInitiatedReceivedOldPacket) {
14158   if (!framer_.version().UsesTls()) {
14159     // Key update is only used in QUIC+TLS.
14160     return;
14161   }
14162   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14163   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14164   // instead of TestDecrypter.
14165   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14166                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14167   framer_.SetKeyUpdateSupportForConnection(true);
14168 
14169   EXPECT_TRUE(framer_.DoKeyUpdate(KeyUpdateReason::kLocalForTests));
14170   // Key update count should be updated, but haven't received packet
14171   // from peer with new key phase.
14172   EXPECT_EQ(1u, visitor_.key_update_count());
14173   EXPECT_EQ(1, visitor_.derive_next_key_count_);
14174   EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
14175 
14176   QuicPacketHeader header;
14177   header.destination_connection_id = FramerTestConnectionId();
14178   header.reset_flag = false;
14179   header.version_flag = false;
14180   header.packet_number = kPacketNumber;
14181 
14182   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
14183 
14184   // Process packet N with phase 0. (Receiving packet from previous phase
14185   // after locally initiated key update, but before any packet from new phase
14186   // was received.)
14187   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14188   std::unique_ptr<QuicPacket> data = BuildDataPacket(header, frames);
14189   ASSERT_TRUE(data != nullptr);
14190   std::unique_ptr<QuicEncryptedPacket> encrypted =
14191       EncryptPacketWithTagAndPhase(*data, 0, false);
14192   ASSERT_TRUE(encrypted);
14193   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14194   // Packet should decrypt and key update count should not change and
14195   // OnDecryptedFirstPacketInKeyPhase should not have been called since the
14196   // packet was from the previous key phase.
14197   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14198   EXPECT_EQ(1u, visitor_.key_update_count());
14199   EXPECT_EQ(1, visitor_.derive_next_key_count_);
14200   EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
14201 
14202   // Process packet N+1 with phase 1.
14203   header.packet_number = kPacketNumber + 1;
14204   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14205   data = BuildDataPacket(header, frames);
14206   ASSERT_TRUE(data != nullptr);
14207   encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
14208   ASSERT_TRUE(encrypted);
14209   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14210   // Packet should decrypt and key update count should not change, but
14211   // OnDecryptedFirstPacketInKeyPhase should have been called.
14212   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14213   EXPECT_EQ(1u, visitor_.key_update_count());
14214   EXPECT_EQ(1, visitor_.derive_next_key_count_);
14215   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14216 
14217   // Process packet N+2 with phase 0 and key 1. This should not decrypt even
14218   // though it's using the previous key, since the packet number is higher than
14219   // a packet number received using the current key.
14220   header.packet_number = kPacketNumber + 2;
14221   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14222   data = BuildDataPacket(header, frames);
14223   ASSERT_TRUE(data != nullptr);
14224   encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
14225   ASSERT_TRUE(encrypted);
14226   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14227   // Packet should not decrypt and key update count should not change.
14228   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
14229   EXPECT_EQ(1u, visitor_.key_update_count());
14230   EXPECT_EQ(2, visitor_.derive_next_key_count_);
14231   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14232 }
14233 
TEST_P(QuicFramerTest,KeyUpdateOnFirstReceivedPacket)14234 TEST_P(QuicFramerTest, KeyUpdateOnFirstReceivedPacket) {
14235   if (!framer_.version().UsesTls()) {
14236     // Key update is only used in QUIC+TLS.
14237     return;
14238   }
14239   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14240   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14241   // instead of TestDecrypter.
14242   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14243                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14244   framer_.SetKeyUpdateSupportForConnection(true);
14245 
14246   QuicPacketHeader header;
14247   header.destination_connection_id = FramerTestConnectionId();
14248   header.reset_flag = false;
14249   header.version_flag = false;
14250   header.packet_number = QuicPacketNumber(123);
14251 
14252   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
14253 
14254   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14255   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
14256   ASSERT_TRUE(data != nullptr);
14257   std::unique_ptr<QuicEncryptedPacket> encrypted(
14258       EncryptPacketWithTagAndPhase(*data, /*tag=*/1, /*phase=*/true));
14259   ASSERT_TRUE(encrypted);
14260 
14261   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14262   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14263   // Processed valid packet with phase=1, key=1: do key update.
14264   EXPECT_EQ(1u, visitor_.key_update_count());
14265   EXPECT_EQ(1, visitor_.derive_next_key_count_);
14266   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14267 }
14268 
TEST_P(QuicFramerTest,ErrorWhenUnexpectedFrameTypeEncountered)14269 TEST_P(QuicFramerTest, ErrorWhenUnexpectedFrameTypeEncountered) {
14270   if (!VersionHasIetfQuicFrames(framer_.transport_version()) ||
14271       !QuicVersionHasLongHeaderLengths(framer_.transport_version()) ||
14272       !framer_.version().HasLongHeaderLengths()) {
14273     return;
14274   }
14275   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
14276   // clang-format off
14277   unsigned char packet[] = {
14278     // public flags (long header with packet type ZERO_RTT_PROTECTED and
14279     // 4-byte packet number)
14280     0xD3,
14281     // version
14282     QUIC_VERSION_BYTES,
14283     // destination connection ID length
14284     0x08,
14285     // destination connection ID
14286     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
14287     // source connection ID length
14288     0x08,
14289     // source connection ID
14290     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
14291     // long header packet length
14292     0x05,
14293     // packet number
14294     0x12, 0x34, 0x56, 0x00,
14295     // unexpected ietf ack frame type in 0-RTT packet
14296     0x02,
14297   };
14298   // clang-format on
14299 
14300   ReviseFirstByteByVersion(packet);
14301   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
14302 
14303   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
14304 
14305   EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
14306   EXPECT_EQ(
14307       "IETF frame type IETF_ACK is unexpected at encryption level "
14308       "ENCRYPTION_ZERO_RTT",
14309       framer_.detailed_error());
14310 }
14311 
TEST_P(QuicFramerTest,ShortHeaderWithNonDefaultConnectionIdLength)14312 TEST_P(QuicFramerTest, ShortHeaderWithNonDefaultConnectionIdLength) {
14313   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
14314   // clang-format off
14315   unsigned char packet[kMaxIncomingPacketSize + 1] = {
14316      // type (short header, 4 byte packet number)
14317     0x43,
14318     // connection_id
14319     0x28, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x48,
14320     // packet number
14321     0x12, 0x34, 0x56, 0x78,
14322 
14323     // frame type (padding frame)
14324     0x00,
14325     0x00, 0x00, 0x00, 0x00
14326   };
14327   MockConnectionIdGenerator generator;
14328     EXPECT_CALL(generator, ConnectionIdLength(0x28)).WillOnce(Return(9));
14329   unsigned char* p = packet;
14330   size_t p_size = ABSL_ARRAYSIZE(packet);
14331 
14332   const size_t header_size = GetPacketHeaderSize(
14333       framer_.transport_version(), kPacket8ByteConnectionId + 1,
14334       kPacket0ByteConnectionId, !kIncludeVersion,
14335       !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
14336       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
14337       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0) + 1;
14338   // Add one because it's a 9 byte connection ID.
14339 
14340   memset(p + header_size, 0, kMaxIncomingPacketSize - header_size);
14341 
14342   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
14343   PacketHeaderFormat format;
14344   QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
14345   bool version_flag;
14346   QuicConnectionId destination_connection_id, source_connection_id;
14347   QuicVersionLabel version_label;
14348   std::string detailed_error;
14349   bool use_length_prefix;
14350   std::optional<absl::string_view> retry_token;
14351   ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
14352   EXPECT_EQ(QUIC_NO_ERROR,
14353       QuicFramer::ParsePublicHeaderDispatcherShortHeaderLengthUnknown(
14354           encrypted, &format, &long_packet_type, &version_flag,
14355           &use_length_prefix, &version_label, &parsed_version,
14356           &destination_connection_id, &source_connection_id, &retry_token,
14357           &detailed_error, generator));
14358   EXPECT_EQ(format, IETF_QUIC_SHORT_HEADER_PACKET);
14359   EXPECT_EQ(destination_connection_id.length(), 9);
14360   EXPECT_EQ(long_packet_type, INVALID_PACKET_TYPE);
14361   EXPECT_FALSE(version_flag);
14362   EXPECT_FALSE(use_length_prefix);
14363   EXPECT_EQ(version_label, 0);
14364   EXPECT_EQ(parsed_version, UnsupportedQuicVersion());
14365   EXPECT_EQ(source_connection_id.length(), 0);
14366   EXPECT_FALSE(retry_token.has_value());
14367   EXPECT_EQ(detailed_error, "");
14368 }
14369 
TEST_P(QuicFramerTest,ReportEcnCountsIfPresent)14370 TEST_P(QuicFramerTest, ReportEcnCountsIfPresent) {
14371   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
14372     return;
14373   }
14374   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
14375 
14376   QuicPacketHeader header;
14377   header.destination_connection_id = FramerTestConnectionId();
14378   header.reset_flag = false;
14379   header.version_flag = false;
14380   header.packet_number = kPacketNumber;
14381 
14382   for (bool ecn_marks : { false, true }) {
14383     // Add some padding, because TestEncrypter doesn't add an authentication
14384     // tag. For a small packet, this will cause QuicFramer to fail to get a
14385     // header protection sample.
14386     QuicPaddingFrame padding_frame(kTagSize);
14387     // Create a packet with just an ack.
14388     QuicAckFrame ack_frame = InitAckFrame(5);
14389     if (ecn_marks) {
14390       ack_frame.ecn_counters = QuicEcnCounts(100, 10000, 1000000);
14391     } else {
14392       ack_frame.ecn_counters = std::nullopt;
14393     }
14394     QuicFrames frames = {QuicFrame(padding_frame), QuicFrame(&ack_frame)};
14395     // Build an ACK packet.
14396     QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14397     std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
14398     ASSERT_TRUE(raw_ack_packet != nullptr);
14399     char buffer[kMaxOutgoingPacketSize];
14400     size_t encrypted_length =
14401         framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
14402                                *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
14403     ASSERT_NE(0u, encrypted_length);
14404     // Now make sure we can turn our ack packet back into an ack frame.
14405     QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14406     MockFramerVisitor visitor;
14407     framer_.set_visitor(&visitor);
14408     EXPECT_CALL(visitor, OnPacket()).Times(1);
14409     EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
14410         .Times(1)
14411         .WillOnce(Return(true));
14412     EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
14413         .Times(1)
14414         .WillOnce(Return(true));
14415     EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1);
14416     EXPECT_CALL(visitor, OnDecryptedPacket(_, _)).Times(1);
14417     EXPECT_CALL(visitor, OnAckFrameStart(_, _)).Times(1).WillOnce(Return(true));
14418     EXPECT_CALL(visitor, OnAckRange(_, _)).Times(1).WillOnce(Return(true));
14419     EXPECT_CALL(visitor, OnAckFrameEnd(_, ack_frame.ecn_counters))
14420         .Times(1).WillOnce(Return(true));
14421     EXPECT_CALL(visitor, OnPacketComplete()).Times(1);
14422     ASSERT_TRUE(framer_.ProcessPacket(
14423                     QuicEncryptedPacket(buffer, encrypted_length, false)));
14424   }
14425 }
14426 
14427 }  // namespace
14428 }  // namespace test
14429 }  // namespace quic
14430