• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "quiche/quic/core/quic_framer.h"
6 
7 #include <algorithm>
8 #include <cstdint>
9 #include <cstring>
10 #include <map>
11 #include <memory>
12 #include <string>
13 #include <utility>
14 #include <vector>
15 
16 #include "absl/base/macros.h"
17 #include "absl/memory/memory.h"
18 #include "absl/strings/escaping.h"
19 #include "absl/strings/match.h"
20 #include "absl/strings/string_view.h"
21 #include "quiche/quic/core/crypto/null_decrypter.h"
22 #include "quiche/quic/core/crypto/null_encrypter.h"
23 #include "quiche/quic/core/crypto/quic_decrypter.h"
24 #include "quiche/quic/core/crypto/quic_encrypter.h"
25 #include "quiche/quic/core/quic_connection_id.h"
26 #include "quiche/quic/core/quic_error_codes.h"
27 #include "quiche/quic/core/quic_packets.h"
28 #include "quiche/quic/core/quic_types.h"
29 #include "quiche/quic/core/quic_utils.h"
30 #include "quiche/quic/core/quic_versions.h"
31 #include "quiche/quic/platform/api/quic_expect_bug.h"
32 #include "quiche/quic/platform/api/quic_flags.h"
33 #include "quiche/quic/platform/api/quic_ip_address.h"
34 #include "quiche/quic/platform/api/quic_ip_address_family.h"
35 #include "quiche/quic/platform/api/quic_logging.h"
36 #include "quiche/quic/platform/api/quic_test.h"
37 #include "quiche/quic/test_tools/quic_framer_peer.h"
38 #include "quiche/quic/test_tools/quic_test_utils.h"
39 #include "quiche/quic/test_tools/simple_data_producer.h"
40 #include "quiche/common/test_tools/quiche_test_utils.h"
41 
42 using testing::_;
43 using testing::ContainerEq;
44 using testing::Return;
45 
46 namespace quic {
47 namespace test {
48 namespace {
49 
50 const uint64_t kEpoch = UINT64_C(1) << 32;
51 const uint64_t kMask = kEpoch - 1;
52 const uint8_t kPacket0ByteConnectionId = 0;
53 const uint8_t kPacket8ByteConnectionId = 8;
54 constexpr size_t kTagSize = 16;
55 
56 const StatelessResetToken kTestStatelessResetToken{
57     0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
58     0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f};
59 
60 // Use fields in which each byte is distinct to ensure that every byte is
61 // framed correctly. The values are otherwise arbitrary.
FramerTestConnectionId()62 QuicConnectionId FramerTestConnectionId() {
63   return TestConnectionId(UINT64_C(0xFEDCBA9876543210));
64 }
65 
FramerTestConnectionIdPlusOne()66 QuicConnectionId FramerTestConnectionIdPlusOne() {
67   return TestConnectionId(UINT64_C(0xFEDCBA9876543211));
68 }
69 
FramerTestConnectionIdNineBytes()70 QuicConnectionId FramerTestConnectionIdNineBytes() {
71   uint8_t connection_id_bytes[9] = {0xFE, 0xDC, 0xBA, 0x98, 0x76,
72                                     0x54, 0x32, 0x10, 0x42};
73   return QuicConnectionId(reinterpret_cast<char*>(connection_id_bytes),
74                           sizeof(connection_id_bytes));
75 }
76 
77 const QuicPacketNumber kPacketNumber = QuicPacketNumber(UINT64_C(0x12345678));
78 const QuicPacketNumber kSmallLargestObserved =
79     QuicPacketNumber(UINT16_C(0x1234));
80 const QuicPacketNumber kSmallMissingPacket = QuicPacketNumber(UINT16_C(0x1233));
81 const QuicPacketNumber kLeastUnacked = QuicPacketNumber(UINT64_C(0x012345670));
82 const QuicStreamId kStreamId = UINT64_C(0x01020304);
83 // Note that the high 4 bits of the stream offset must be less than 0x40
84 // in order to ensure that the value can be encoded using VarInt62 encoding.
85 const QuicStreamOffset kStreamOffset = UINT64_C(0x3A98FEDC32107654);
86 const QuicPublicResetNonceProof kNonceProof = UINT64_C(0xABCDEF0123456789);
87 
88 // In testing that we can ack the full range of packets...
89 // This is the largest packet number that can be represented in IETF QUIC
90 // varint62 format.
91 const QuicPacketNumber kLargestIetfLargestObserved =
92     QuicPacketNumber(UINT64_C(0x3fffffffffffffff));
93 // Encodings for the two bits in a VarInt62 that
94 // describe the length of the VarInt61. For binary packet
95 // formats in this file, the convention is to code the
96 // first byte as
97 //   kVarInt62FourBytes + 0x<value_in_that_byte>
98 const uint8_t kVarInt62OneByte = 0x00;
99 const uint8_t kVarInt62TwoBytes = 0x40;
100 const uint8_t kVarInt62FourBytes = 0x80;
101 const uint8_t kVarInt62EightBytes = 0xc0;
102 
103 class TestEncrypter : public QuicEncrypter {
104  public:
~TestEncrypter()105   ~TestEncrypter() override {}
SetKey(absl::string_view)106   bool SetKey(absl::string_view /*key*/) override { return true; }
SetNoncePrefix(absl::string_view)107   bool SetNoncePrefix(absl::string_view /*nonce_prefix*/) override {
108     return true;
109   }
SetIV(absl::string_view)110   bool SetIV(absl::string_view /*iv*/) override { return true; }
SetHeaderProtectionKey(absl::string_view)111   bool SetHeaderProtectionKey(absl::string_view /*key*/) override {
112     return true;
113   }
EncryptPacket(uint64_t packet_number,absl::string_view associated_data,absl::string_view plaintext,char * output,size_t * output_length,size_t)114   bool EncryptPacket(uint64_t packet_number, absl::string_view associated_data,
115                      absl::string_view plaintext, char* output,
116                      size_t* output_length,
117                      size_t /*max_output_length*/) override {
118     packet_number_ = QuicPacketNumber(packet_number);
119     associated_data_ = std::string(associated_data);
120     plaintext_ = std::string(plaintext);
121     memcpy(output, plaintext.data(), plaintext.length());
122     *output_length = plaintext.length();
123     return true;
124   }
GenerateHeaderProtectionMask(absl::string_view)125   std::string GenerateHeaderProtectionMask(
126       absl::string_view /*sample*/) override {
127     return std::string(5, 0);
128   }
GetKeySize() const129   size_t GetKeySize() const override { return 0; }
GetNoncePrefixSize() const130   size_t GetNoncePrefixSize() const override { return 0; }
GetIVSize() const131   size_t GetIVSize() const override { return 0; }
GetMaxPlaintextSize(size_t ciphertext_size) const132   size_t GetMaxPlaintextSize(size_t ciphertext_size) const override {
133     return ciphertext_size;
134   }
GetCiphertextSize(size_t plaintext_size) const135   size_t GetCiphertextSize(size_t plaintext_size) const override {
136     return plaintext_size;
137   }
GetConfidentialityLimit() const138   QuicPacketCount GetConfidentialityLimit() const override {
139     return std::numeric_limits<QuicPacketCount>::max();
140   }
GetKey() const141   absl::string_view GetKey() const override { return absl::string_view(); }
GetNoncePrefix() const142   absl::string_view GetNoncePrefix() const override {
143     return absl::string_view();
144   }
145 
146   QuicPacketNumber packet_number_;
147   std::string associated_data_;
148   std::string plaintext_;
149 };
150 
151 class TestDecrypter : public QuicDecrypter {
152  public:
~TestDecrypter()153   ~TestDecrypter() override {}
SetKey(absl::string_view)154   bool SetKey(absl::string_view /*key*/) override { return true; }
SetNoncePrefix(absl::string_view)155   bool SetNoncePrefix(absl::string_view /*nonce_prefix*/) override {
156     return true;
157   }
SetIV(absl::string_view)158   bool SetIV(absl::string_view /*iv*/) override { return true; }
SetHeaderProtectionKey(absl::string_view)159   bool SetHeaderProtectionKey(absl::string_view /*key*/) override {
160     return true;
161   }
SetPreliminaryKey(absl::string_view)162   bool SetPreliminaryKey(absl::string_view /*key*/) override {
163     QUIC_BUG(quic_bug_10486_1) << "should not be called";
164     return false;
165   }
SetDiversificationNonce(const DiversificationNonce &)166   bool SetDiversificationNonce(const DiversificationNonce& /*key*/) override {
167     return true;
168   }
DecryptPacket(uint64_t packet_number,absl::string_view associated_data,absl::string_view ciphertext,char * output,size_t * output_length,size_t)169   bool DecryptPacket(uint64_t packet_number, absl::string_view associated_data,
170                      absl::string_view ciphertext, char* output,
171                      size_t* output_length,
172                      size_t /*max_output_length*/) override {
173     packet_number_ = QuicPacketNumber(packet_number);
174     associated_data_ = std::string(associated_data);
175     ciphertext_ = std::string(ciphertext);
176     memcpy(output, ciphertext.data(), ciphertext.length());
177     *output_length = ciphertext.length();
178     return true;
179   }
GenerateHeaderProtectionMask(QuicDataReader *)180   std::string GenerateHeaderProtectionMask(
181       QuicDataReader* /*sample_reader*/) override {
182     return std::string(5, 0);
183   }
GetKeySize() const184   size_t GetKeySize() const override { return 0; }
GetNoncePrefixSize() const185   size_t GetNoncePrefixSize() const override { return 0; }
GetIVSize() const186   size_t GetIVSize() const override { return 0; }
GetKey() const187   absl::string_view GetKey() const override { return absl::string_view(); }
GetNoncePrefix() const188   absl::string_view GetNoncePrefix() const override {
189     return absl::string_view();
190   }
191   // Use a distinct value starting with 0xFFFFFF, which is never used by TLS.
cipher_id() const192   uint32_t cipher_id() const override { return 0xFFFFFFF2; }
GetIntegrityLimit() const193   QuicPacketCount GetIntegrityLimit() const override {
194     return std::numeric_limits<QuicPacketCount>::max();
195   }
196   QuicPacketNumber packet_number_;
197   std::string associated_data_;
198   std::string ciphertext_;
199 };
200 
EncryptPacketWithTagAndPhase(const QuicPacket & packet,uint8_t tag,bool phase)201 std::unique_ptr<QuicEncryptedPacket> EncryptPacketWithTagAndPhase(
202     const QuicPacket& packet, uint8_t tag, bool phase) {
203   std::string packet_data = std::string(packet.AsStringPiece());
204   if (phase) {
205     packet_data[0] |= FLAGS_KEY_PHASE_BIT;
206   } else {
207     packet_data[0] &= ~FLAGS_KEY_PHASE_BIT;
208   }
209 
210   TaggingEncrypter crypter(tag);
211   const size_t packet_size = crypter.GetCiphertextSize(packet_data.size());
212   char* buffer = new char[packet_size];
213   size_t buf_len = 0;
214   if (!crypter.EncryptPacket(0, absl::string_view(), packet_data, buffer,
215                              &buf_len, packet_size)) {
216     delete[] buffer;
217     return nullptr;
218   }
219 
220   return std::make_unique<QuicEncryptedPacket>(buffer, buf_len,
221                                                /*owns_buffer=*/true);
222 }
223 
224 class TestQuicVisitor : public QuicFramerVisitorInterface {
225  public:
TestQuicVisitor()226   TestQuicVisitor()
227       : error_count_(0),
228         version_mismatch_(0),
229         packet_count_(0),
230         frame_count_(0),
231         complete_packets_(0),
232         derive_next_key_count_(0),
233         decrypted_first_packet_in_key_phase_count_(0),
234         accept_packet_(true),
235         accept_public_header_(true) {}
236 
~TestQuicVisitor()237   ~TestQuicVisitor() override {}
238 
OnError(QuicFramer * f)239   void OnError(QuicFramer* f) override {
240     QUIC_DLOG(INFO) << "QuicFramer Error: " << QuicErrorCodeToString(f->error())
241                     << " (" << f->error() << ")";
242     ++error_count_;
243   }
244 
OnPacket()245   void OnPacket() override {}
246 
OnVersionNegotiationPacket(const QuicVersionNegotiationPacket & packet)247   void OnVersionNegotiationPacket(
248       const QuicVersionNegotiationPacket& packet) override {
249     version_negotiation_packet_ =
250         std::make_unique<QuicVersionNegotiationPacket>((packet));
251     EXPECT_EQ(0u, framer_->current_received_frame_type());
252   }
253 
OnRetryPacket(QuicConnectionId original_connection_id,QuicConnectionId new_connection_id,absl::string_view retry_token,absl::string_view retry_integrity_tag,absl::string_view retry_without_tag)254   void OnRetryPacket(QuicConnectionId original_connection_id,
255                      QuicConnectionId new_connection_id,
256                      absl::string_view retry_token,
257                      absl::string_view retry_integrity_tag,
258                      absl::string_view retry_without_tag) override {
259     on_retry_packet_called_ = true;
260     retry_original_connection_id_ =
261         std::make_unique<QuicConnectionId>(original_connection_id);
262     retry_new_connection_id_ =
263         std::make_unique<QuicConnectionId>(new_connection_id);
264     retry_token_ = std::make_unique<std::string>(std::string(retry_token));
265     retry_token_integrity_tag_ =
266         std::make_unique<std::string>(std::string(retry_integrity_tag));
267     retry_without_tag_ =
268         std::make_unique<std::string>(std::string(retry_without_tag));
269     EXPECT_EQ(0u, framer_->current_received_frame_type());
270   }
271 
OnProtocolVersionMismatch(ParsedQuicVersion received_version)272   bool OnProtocolVersionMismatch(ParsedQuicVersion received_version) override {
273     QUIC_DLOG(INFO) << "QuicFramer Version Mismatch, version: "
274                     << received_version;
275     ++version_mismatch_;
276     EXPECT_EQ(0u, framer_->current_received_frame_type());
277     return false;
278   }
279 
OnUnauthenticatedPublicHeader(const QuicPacketHeader & header)280   bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override {
281     header_ = std::make_unique<QuicPacketHeader>((header));
282     EXPECT_EQ(0u, framer_->current_received_frame_type());
283     return accept_public_header_;
284   }
285 
OnUnauthenticatedHeader(const QuicPacketHeader &)286   bool OnUnauthenticatedHeader(const QuicPacketHeader& /*header*/) override {
287     EXPECT_EQ(0u, framer_->current_received_frame_type());
288     return true;
289   }
290 
OnDecryptedPacket(size_t,EncryptionLevel)291   void OnDecryptedPacket(size_t /*length*/,
292                          EncryptionLevel /*level*/) override {
293     EXPECT_EQ(0u, framer_->current_received_frame_type());
294   }
295 
OnPacketHeader(const QuicPacketHeader & header)296   bool OnPacketHeader(const QuicPacketHeader& header) override {
297     ++packet_count_;
298     header_ = std::make_unique<QuicPacketHeader>((header));
299     EXPECT_EQ(0u, framer_->current_received_frame_type());
300     return accept_packet_;
301   }
302 
OnCoalescedPacket(const QuicEncryptedPacket & packet)303   void OnCoalescedPacket(const QuicEncryptedPacket& packet) override {
304     coalesced_packets_.push_back(packet.Clone());
305   }
306 
OnUndecryptablePacket(const QuicEncryptedPacket & packet,EncryptionLevel decryption_level,bool has_decryption_key)307   void OnUndecryptablePacket(const QuicEncryptedPacket& packet,
308                              EncryptionLevel decryption_level,
309                              bool has_decryption_key) override {
310     undecryptable_packets_.push_back(packet.Clone());
311     undecryptable_decryption_levels_.push_back(decryption_level);
312     undecryptable_has_decryption_keys_.push_back(has_decryption_key);
313   }
314 
OnStreamFrame(const QuicStreamFrame & frame)315   bool OnStreamFrame(const QuicStreamFrame& frame) override {
316     ++frame_count_;
317     // Save a copy of the data so it is valid after the packet is processed.
318     std::string* string_data =
319         new std::string(frame.data_buffer, frame.data_length);
320     stream_data_.push_back(absl::WrapUnique(string_data));
321     stream_frames_.push_back(std::make_unique<QuicStreamFrame>(
322         frame.stream_id, frame.fin, frame.offset, *string_data));
323     if (VersionHasIetfQuicFrames(transport_version_)) {
324       // Low order bits of type encode flags, ignore them for this test.
325       EXPECT_TRUE(IS_IETF_STREAM_FRAME(framer_->current_received_frame_type()));
326     } else {
327       EXPECT_EQ(0u, framer_->current_received_frame_type());
328     }
329     return true;
330   }
331 
OnCryptoFrame(const QuicCryptoFrame & frame)332   bool OnCryptoFrame(const QuicCryptoFrame& frame) override {
333     ++frame_count_;
334     // Save a copy of the data so it is valid after the packet is processed.
335     std::string* string_data =
336         new std::string(frame.data_buffer, frame.data_length);
337     crypto_data_.push_back(absl::WrapUnique(string_data));
338     crypto_frames_.push_back(std::make_unique<QuicCryptoFrame>(
339         frame.level, frame.offset, *string_data));
340     if (VersionHasIetfQuicFrames(transport_version_)) {
341       EXPECT_EQ(IETF_CRYPTO, framer_->current_received_frame_type());
342     } else {
343       EXPECT_EQ(0u, framer_->current_received_frame_type());
344     }
345     return true;
346   }
347 
OnAckFrameStart(QuicPacketNumber largest_acked,QuicTime::Delta ack_delay_time)348   bool OnAckFrameStart(QuicPacketNumber largest_acked,
349                        QuicTime::Delta ack_delay_time) override {
350     ++frame_count_;
351     QuicAckFrame ack_frame;
352     ack_frame.largest_acked = largest_acked;
353     ack_frame.ack_delay_time = ack_delay_time;
354     ack_frames_.push_back(std::make_unique<QuicAckFrame>(ack_frame));
355     if (VersionHasIetfQuicFrames(transport_version_)) {
356       EXPECT_TRUE(IETF_ACK == framer_->current_received_frame_type() ||
357                   IETF_ACK_ECN == framer_->current_received_frame_type() ||
358                   IETF_ACK_RECEIVE_TIMESTAMPS ==
359                       framer_->current_received_frame_type());
360     } else {
361       EXPECT_EQ(0u, framer_->current_received_frame_type());
362     }
363     return true;
364   }
365 
OnAckRange(QuicPacketNumber start,QuicPacketNumber end)366   bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) override {
367     QUICHE_DCHECK(!ack_frames_.empty());
368     ack_frames_[ack_frames_.size() - 1]->packets.AddRange(start, end);
369     if (VersionHasIetfQuicFrames(transport_version_)) {
370       EXPECT_TRUE(IETF_ACK == framer_->current_received_frame_type() ||
371                   IETF_ACK_ECN == framer_->current_received_frame_type() ||
372                   IETF_ACK_RECEIVE_TIMESTAMPS ==
373                       framer_->current_received_frame_type());
374     } else {
375       EXPECT_EQ(0u, framer_->current_received_frame_type());
376     }
377     return true;
378   }
379 
OnAckTimestamp(QuicPacketNumber packet_number,QuicTime timestamp)380   bool OnAckTimestamp(QuicPacketNumber packet_number,
381                       QuicTime timestamp) override {
382     ack_frames_[ack_frames_.size() - 1]->received_packet_times.push_back(
383         std::make_pair(packet_number, timestamp));
384     if (VersionHasIetfQuicFrames(transport_version_)) {
385       EXPECT_TRUE(IETF_ACK == framer_->current_received_frame_type() ||
386                   IETF_ACK_ECN == framer_->current_received_frame_type() ||
387                   IETF_ACK_RECEIVE_TIMESTAMPS ==
388                       framer_->current_received_frame_type());
389     } else {
390       EXPECT_EQ(0u, framer_->current_received_frame_type());
391     }
392     return true;
393   }
394 
OnAckFrameEnd(QuicPacketNumber,const std::optional<QuicEcnCounts> &)395   bool OnAckFrameEnd(
396       QuicPacketNumber /*start*/,
397       const std::optional<QuicEcnCounts>& /*ecn_counts*/) override {
398     return true;
399   }
400 
OnStopWaitingFrame(const QuicStopWaitingFrame & frame)401   bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override {
402     ++frame_count_;
403     stop_waiting_frames_.push_back(
404         std::make_unique<QuicStopWaitingFrame>(frame));
405     EXPECT_EQ(0u, framer_->current_received_frame_type());
406     return true;
407   }
408 
OnPaddingFrame(const QuicPaddingFrame & frame)409   bool OnPaddingFrame(const QuicPaddingFrame& frame) override {
410     padding_frames_.push_back(std::make_unique<QuicPaddingFrame>(frame));
411     if (VersionHasIetfQuicFrames(transport_version_)) {
412       EXPECT_EQ(IETF_PADDING, framer_->current_received_frame_type());
413     } else {
414       EXPECT_EQ(0u, framer_->current_received_frame_type());
415     }
416     return true;
417   }
418 
OnPingFrame(const QuicPingFrame & frame)419   bool OnPingFrame(const QuicPingFrame& frame) override {
420     ++frame_count_;
421     ping_frames_.push_back(std::make_unique<QuicPingFrame>(frame));
422     if (VersionHasIetfQuicFrames(transport_version_)) {
423       EXPECT_EQ(IETF_PING, framer_->current_received_frame_type());
424     } else {
425       EXPECT_EQ(0u, framer_->current_received_frame_type());
426     }
427     return true;
428   }
429 
OnMessageFrame(const QuicMessageFrame & frame)430   bool OnMessageFrame(const QuicMessageFrame& frame) override {
431     ++frame_count_;
432     message_frames_.push_back(
433         std::make_unique<QuicMessageFrame>(frame.data, frame.message_length));
434     if (VersionHasIetfQuicFrames(transport_version_)) {
435       EXPECT_TRUE(IETF_EXTENSION_MESSAGE_NO_LENGTH_V99 ==
436                       framer_->current_received_frame_type() ||
437                   IETF_EXTENSION_MESSAGE_V99 ==
438                       framer_->current_received_frame_type());
439     } else {
440       EXPECT_EQ(0u, framer_->current_received_frame_type());
441     }
442     return true;
443   }
444 
OnHandshakeDoneFrame(const QuicHandshakeDoneFrame & frame)445   bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) override {
446     ++frame_count_;
447     handshake_done_frames_.push_back(
448         std::make_unique<QuicHandshakeDoneFrame>(frame));
449     QUICHE_DCHECK(VersionHasIetfQuicFrames(transport_version_));
450     EXPECT_EQ(IETF_HANDSHAKE_DONE, framer_->current_received_frame_type());
451     return true;
452   }
453 
OnAckFrequencyFrame(const QuicAckFrequencyFrame & frame)454   bool OnAckFrequencyFrame(const QuicAckFrequencyFrame& frame) override {
455     ++frame_count_;
456     ack_frequency_frames_.emplace_back(
457         std::make_unique<QuicAckFrequencyFrame>(frame));
458     QUICHE_DCHECK(VersionHasIetfQuicFrames(transport_version_));
459     EXPECT_EQ(IETF_ACK_FREQUENCY, framer_->current_received_frame_type());
460     return true;
461   }
462 
OnPacketComplete()463   void OnPacketComplete() override { ++complete_packets_; }
464 
OnRstStreamFrame(const QuicRstStreamFrame & frame)465   bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override {
466     rst_stream_frame_ = frame;
467     if (VersionHasIetfQuicFrames(transport_version_)) {
468       EXPECT_EQ(IETF_RST_STREAM, framer_->current_received_frame_type());
469     } else {
470       EXPECT_EQ(0u, framer_->current_received_frame_type());
471     }
472     return true;
473   }
474 
OnConnectionCloseFrame(const QuicConnectionCloseFrame & frame)475   bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override {
476     connection_close_frame_ = frame;
477     if (VersionHasIetfQuicFrames(transport_version_)) {
478       EXPECT_NE(GOOGLE_QUIC_CONNECTION_CLOSE, frame.close_type);
479       if (frame.close_type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
480         EXPECT_EQ(IETF_CONNECTION_CLOSE,
481                   framer_->current_received_frame_type());
482       } else {
483         EXPECT_EQ(IETF_APPLICATION_CLOSE,
484                   framer_->current_received_frame_type());
485       }
486     } else {
487       EXPECT_EQ(0u, framer_->current_received_frame_type());
488     }
489     return true;
490   }
491 
OnStopSendingFrame(const QuicStopSendingFrame & frame)492   bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override {
493     stop_sending_frame_ = frame;
494     EXPECT_EQ(IETF_STOP_SENDING, framer_->current_received_frame_type());
495     EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
496     return true;
497   }
498 
OnPathChallengeFrame(const QuicPathChallengeFrame & frame)499   bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override {
500     path_challenge_frame_ = frame;
501     EXPECT_EQ(IETF_PATH_CHALLENGE, framer_->current_received_frame_type());
502     EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
503     return true;
504   }
505 
OnPathResponseFrame(const QuicPathResponseFrame & frame)506   bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override {
507     path_response_frame_ = frame;
508     EXPECT_EQ(IETF_PATH_RESPONSE, framer_->current_received_frame_type());
509     EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
510     return true;
511   }
512 
OnGoAwayFrame(const QuicGoAwayFrame & frame)513   bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override {
514     goaway_frame_ = frame;
515     EXPECT_FALSE(VersionHasIetfQuicFrames(transport_version_));
516     EXPECT_EQ(0u, framer_->current_received_frame_type());
517     return true;
518   }
519 
OnMaxStreamsFrame(const QuicMaxStreamsFrame & frame)520   bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& frame) override {
521     max_streams_frame_ = frame;
522     EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
523     EXPECT_TRUE(IETF_MAX_STREAMS_UNIDIRECTIONAL ==
524                     framer_->current_received_frame_type() ||
525                 IETF_MAX_STREAMS_BIDIRECTIONAL ==
526                     framer_->current_received_frame_type());
527     return true;
528   }
529 
OnStreamsBlockedFrame(const QuicStreamsBlockedFrame & frame)530   bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame) override {
531     streams_blocked_frame_ = frame;
532     EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
533     EXPECT_TRUE(IETF_STREAMS_BLOCKED_UNIDIRECTIONAL ==
534                     framer_->current_received_frame_type() ||
535                 IETF_STREAMS_BLOCKED_BIDIRECTIONAL ==
536                     framer_->current_received_frame_type());
537     return true;
538   }
539 
OnWindowUpdateFrame(const QuicWindowUpdateFrame & frame)540   bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override {
541     window_update_frame_ = frame;
542     if (VersionHasIetfQuicFrames(transport_version_)) {
543       EXPECT_TRUE(IETF_MAX_DATA == framer_->current_received_frame_type() ||
544                   IETF_MAX_STREAM_DATA ==
545                       framer_->current_received_frame_type());
546     } else {
547       EXPECT_EQ(0u, framer_->current_received_frame_type());
548     }
549     return true;
550   }
551 
OnBlockedFrame(const QuicBlockedFrame & frame)552   bool OnBlockedFrame(const QuicBlockedFrame& frame) override {
553     blocked_frame_ = frame;
554     if (VersionHasIetfQuicFrames(transport_version_)) {
555       EXPECT_TRUE(IETF_DATA_BLOCKED == framer_->current_received_frame_type() ||
556                   IETF_STREAM_DATA_BLOCKED ==
557                       framer_->current_received_frame_type());
558     } else {
559       EXPECT_EQ(0u, framer_->current_received_frame_type());
560     }
561     return true;
562   }
563 
OnNewConnectionIdFrame(const QuicNewConnectionIdFrame & frame)564   bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override {
565     new_connection_id_ = frame;
566     EXPECT_EQ(IETF_NEW_CONNECTION_ID, framer_->current_received_frame_type());
567     EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
568     return true;
569   }
570 
OnRetireConnectionIdFrame(const QuicRetireConnectionIdFrame & frame)571   bool OnRetireConnectionIdFrame(
572       const QuicRetireConnectionIdFrame& frame) override {
573     EXPECT_EQ(IETF_RETIRE_CONNECTION_ID,
574               framer_->current_received_frame_type());
575     EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
576     retire_connection_id_ = frame;
577     return true;
578   }
579 
OnNewTokenFrame(const QuicNewTokenFrame & frame)580   bool OnNewTokenFrame(const QuicNewTokenFrame& frame) override {
581     new_token_ = frame;
582     EXPECT_EQ(IETF_NEW_TOKEN, framer_->current_received_frame_type());
583     EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
584     return true;
585   }
586 
IsValidStatelessResetToken(const StatelessResetToken & token) const587   bool IsValidStatelessResetToken(
588       const StatelessResetToken& token) const override {
589     EXPECT_EQ(0u, framer_->current_received_frame_type());
590     return token == kTestStatelessResetToken;
591   }
592 
OnAuthenticatedIetfStatelessResetPacket(const QuicIetfStatelessResetPacket & packet)593   void OnAuthenticatedIetfStatelessResetPacket(
594       const QuicIetfStatelessResetPacket& packet) override {
595     stateless_reset_packet_ =
596         std::make_unique<QuicIetfStatelessResetPacket>(packet);
597     EXPECT_EQ(0u, framer_->current_received_frame_type());
598   }
599 
OnKeyUpdate(KeyUpdateReason reason)600   void OnKeyUpdate(KeyUpdateReason reason) override {
601     key_update_reasons_.push_back(reason);
602   }
603 
OnDecryptedFirstPacketInKeyPhase()604   void OnDecryptedFirstPacketInKeyPhase() override {
605     decrypted_first_packet_in_key_phase_count_++;
606   }
607 
AdvanceKeysAndCreateCurrentOneRttDecrypter()608   std::unique_ptr<QuicDecrypter> AdvanceKeysAndCreateCurrentOneRttDecrypter()
609       override {
610     derive_next_key_count_++;
611     return std::make_unique<StrictTaggingDecrypter>(derive_next_key_count_);
612   }
CreateCurrentOneRttEncrypter()613   std::unique_ptr<QuicEncrypter> CreateCurrentOneRttEncrypter() override {
614     return std::make_unique<TaggingEncrypter>(derive_next_key_count_);
615   }
616 
set_framer(QuicFramer * framer)617   void set_framer(QuicFramer* framer) {
618     framer_ = framer;
619     transport_version_ = framer->transport_version();
620   }
621 
key_update_count() const622   size_t key_update_count() const { return key_update_reasons_.size(); }
623 
624   // Counters from the visitor_ callbacks.
625   int error_count_;
626   int version_mismatch_;
627   int packet_count_;
628   int frame_count_;
629   int complete_packets_;
630   std::vector<KeyUpdateReason> key_update_reasons_;
631   int derive_next_key_count_;
632   int decrypted_first_packet_in_key_phase_count_;
633   bool accept_packet_;
634   bool accept_public_header_;
635 
636   std::unique_ptr<QuicPacketHeader> header_;
637   std::unique_ptr<QuicIetfStatelessResetPacket> stateless_reset_packet_;
638   std::unique_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_;
639   std::unique_ptr<QuicConnectionId> retry_original_connection_id_;
640   std::unique_ptr<QuicConnectionId> retry_new_connection_id_;
641   std::unique_ptr<std::string> retry_token_;
642   std::unique_ptr<std::string> retry_token_integrity_tag_;
643   std::unique_ptr<std::string> retry_without_tag_;
644   bool on_retry_packet_called_ = false;
645   std::vector<std::unique_ptr<QuicStreamFrame>> stream_frames_;
646   std::vector<std::unique_ptr<QuicCryptoFrame>> crypto_frames_;
647   std::vector<std::unique_ptr<QuicAckFrame>> ack_frames_;
648   std::vector<std::unique_ptr<QuicStopWaitingFrame>> stop_waiting_frames_;
649   std::vector<std::unique_ptr<QuicPaddingFrame>> padding_frames_;
650   std::vector<std::unique_ptr<QuicPingFrame>> ping_frames_;
651   std::vector<std::unique_ptr<QuicMessageFrame>> message_frames_;
652   std::vector<std::unique_ptr<QuicHandshakeDoneFrame>> handshake_done_frames_;
653   std::vector<std::unique_ptr<QuicAckFrequencyFrame>> ack_frequency_frames_;
654   std::vector<std::unique_ptr<QuicEncryptedPacket>> coalesced_packets_;
655   std::vector<std::unique_ptr<QuicEncryptedPacket>> undecryptable_packets_;
656   std::vector<EncryptionLevel> undecryptable_decryption_levels_;
657   std::vector<bool> undecryptable_has_decryption_keys_;
658   QuicRstStreamFrame rst_stream_frame_;
659   QuicConnectionCloseFrame connection_close_frame_;
660   QuicStopSendingFrame stop_sending_frame_;
661   QuicGoAwayFrame goaway_frame_;
662   QuicPathChallengeFrame path_challenge_frame_;
663   QuicPathResponseFrame path_response_frame_;
664   QuicWindowUpdateFrame window_update_frame_;
665   QuicBlockedFrame blocked_frame_;
666   QuicStreamsBlockedFrame streams_blocked_frame_;
667   QuicMaxStreamsFrame max_streams_frame_;
668   QuicNewConnectionIdFrame new_connection_id_;
669   QuicRetireConnectionIdFrame retire_connection_id_;
670   QuicNewTokenFrame new_token_;
671   std::vector<std::unique_ptr<std::string>> stream_data_;
672   std::vector<std::unique_ptr<std::string>> crypto_data_;
673   QuicTransportVersion transport_version_;
674   QuicFramer* framer_;
675 };
676 
677 // Simple struct for defining a packet's content, and associated
678 // parse error.
679 struct PacketFragment {
680   std::string error_if_missing;
681   std::vector<unsigned char> fragment;
682 };
683 
684 using PacketFragments = std::vector<struct PacketFragment>;
685 
686 class QuicFramerTest : public QuicTestWithParam<ParsedQuicVersion> {
687  public:
QuicFramerTest()688   QuicFramerTest()
689       : encrypter_(new test::TestEncrypter()),
690         decrypter_(new test::TestDecrypter()),
691         version_(GetParam()),
692         start_(QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(0x10)),
693         framer_(AllSupportedVersions(), start_, Perspective::IS_SERVER,
694                 kQuicDefaultConnectionIdLength) {
695     framer_.set_version(version_);
696     if (framer_.version().KnowsWhichDecrypterToUse()) {
697       framer_.InstallDecrypter(ENCRYPTION_INITIAL,
698                                std::unique_ptr<QuicDecrypter>(decrypter_));
699     } else {
700       framer_.SetDecrypter(ENCRYPTION_INITIAL,
701                            std::unique_ptr<QuicDecrypter>(decrypter_));
702     }
703     framer_.SetEncrypter(ENCRYPTION_INITIAL,
704                          std::unique_ptr<QuicEncrypter>(encrypter_));
705 
706     framer_.set_visitor(&visitor_);
707     visitor_.set_framer(&framer_);
708   }
709 
SetDecrypterLevel(EncryptionLevel level)710   void SetDecrypterLevel(EncryptionLevel level) {
711     if (!framer_.version().KnowsWhichDecrypterToUse()) {
712       return;
713     }
714     decrypter_ = new TestDecrypter();
715     framer_.InstallDecrypter(level, std::unique_ptr<QuicDecrypter>(decrypter_));
716   }
717 
718   // Helper function to get unsigned char representation of the handshake
719   // protocol byte at position |pos| of the current QUIC version number.
GetQuicVersionByte(int pos)720   unsigned char GetQuicVersionByte(int pos) {
721     return (CreateQuicVersionLabel(version_) >> 8 * (3 - pos)) & 0xff;
722   }
723 
724   // Helper functions to take a v1 long header packet and make it v2. These are
725   // not needed for short header packets, but if sent, this function will exit
726   // cleanly. It needs to be called twice for coalesced packets (see references
727   // to length_of_first_coalesced_packet below for examples of how to do this).
ReviseFirstByteByVersion(unsigned char packet_ietf[])728   inline void ReviseFirstByteByVersion(unsigned char packet_ietf[]) {
729     if (version_.UsesV2PacketTypes() && (packet_ietf[0] >= 0x80)) {
730       packet_ietf[0] = (packet_ietf[0] + 0x10) | 0xc0;
731     }
732   }
ReviseFirstByteByVersion(PacketFragments & packet_ietf)733   inline void ReviseFirstByteByVersion(PacketFragments& packet_ietf) {
734     ReviseFirstByteByVersion(&packet_ietf[0].fragment[0]);
735   }
736 
CheckEncryption(QuicPacketNumber packet_number,QuicPacket * packet)737   bool CheckEncryption(QuicPacketNumber packet_number, QuicPacket* packet) {
738     if (packet_number != encrypter_->packet_number_) {
739       QUIC_LOG(ERROR) << "Encrypted incorrect packet number.  expected "
740                       << packet_number
741                       << " actual: " << encrypter_->packet_number_;
742       return false;
743     }
744     if (packet->AssociatedData(framer_.transport_version()) !=
745         encrypter_->associated_data_) {
746       QUIC_LOG(ERROR) << "Encrypted incorrect associated data.  expected "
747                       << packet->AssociatedData(framer_.transport_version())
748                       << " actual: " << encrypter_->associated_data_;
749       return false;
750     }
751     if (packet->Plaintext(framer_.transport_version()) !=
752         encrypter_->plaintext_) {
753       QUIC_LOG(ERROR) << "Encrypted incorrect plaintext data.  expected "
754                       << packet->Plaintext(framer_.transport_version())
755                       << " actual: " << encrypter_->plaintext_;
756       return false;
757     }
758     return true;
759   }
760 
CheckDecryption(const QuicEncryptedPacket & encrypted,bool includes_version,bool includes_diversification_nonce,uint8_t destination_connection_id_length,uint8_t source_connection_id_length)761   bool CheckDecryption(const QuicEncryptedPacket& encrypted,
762                        bool includes_version,
763                        bool includes_diversification_nonce,
764                        uint8_t destination_connection_id_length,
765                        uint8_t source_connection_id_length) {
766     return CheckDecryption(
767         encrypted, includes_version, includes_diversification_nonce,
768         destination_connection_id_length, source_connection_id_length,
769         quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
770         quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
771   }
772 
CheckDecryption(const QuicEncryptedPacket & encrypted,bool includes_version,bool includes_diversification_nonce,uint8_t destination_connection_id_length,uint8_t source_connection_id_length,quiche::QuicheVariableLengthIntegerLength retry_token_length_length,size_t retry_token_length,quiche::QuicheVariableLengthIntegerLength length_length)773   bool CheckDecryption(
774       const QuicEncryptedPacket& encrypted, bool includes_version,
775       bool includes_diversification_nonce,
776       uint8_t destination_connection_id_length,
777       uint8_t source_connection_id_length,
778       quiche::QuicheVariableLengthIntegerLength retry_token_length_length,
779       size_t retry_token_length,
780       quiche::QuicheVariableLengthIntegerLength length_length) {
781     if (visitor_.header_->packet_number != decrypter_->packet_number_) {
782       QUIC_LOG(ERROR) << "Decrypted incorrect packet number.  expected "
783                       << visitor_.header_->packet_number
784                       << " actual: " << decrypter_->packet_number_;
785       return false;
786     }
787     absl::string_view associated_data =
788         QuicFramer::GetAssociatedDataFromEncryptedPacket(
789             framer_.transport_version(), encrypted,
790             destination_connection_id_length, source_connection_id_length,
791             includes_version, includes_diversification_nonce,
792             PACKET_4BYTE_PACKET_NUMBER, retry_token_length_length,
793             retry_token_length, length_length);
794     if (associated_data != decrypter_->associated_data_) {
795       QUIC_LOG(ERROR) << "Decrypted incorrect associated data.  expected "
796                       << absl::BytesToHexString(associated_data) << " actual: "
797                       << absl::BytesToHexString(decrypter_->associated_data_);
798       return false;
799     }
800     absl::string_view ciphertext(
801         encrypted.AsStringPiece().substr(GetStartOfEncryptedData(
802             framer_.transport_version(), destination_connection_id_length,
803             source_connection_id_length, includes_version,
804             includes_diversification_nonce, PACKET_4BYTE_PACKET_NUMBER,
805             retry_token_length_length, retry_token_length, length_length)));
806     if (ciphertext != decrypter_->ciphertext_) {
807       QUIC_LOG(ERROR) << "Decrypted incorrect ciphertext data.  expected "
808                       << absl::BytesToHexString(ciphertext) << " actual: "
809                       << absl::BytesToHexString(decrypter_->ciphertext_)
810                       << " associated data: "
811                       << absl::BytesToHexString(associated_data);
812       return false;
813     }
814     return true;
815   }
816 
AsChars(unsigned char * data)817   char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); }
818 
819   // Creates a new QuicEncryptedPacket by concatenating the various
820   // packet fragments in |fragments|.
AssemblePacketFromFragments(const PacketFragments & fragments)821   std::unique_ptr<QuicEncryptedPacket> AssemblePacketFromFragments(
822       const PacketFragments& fragments) {
823     char* buffer = new char[kMaxOutgoingPacketSize + 1];
824     size_t len = 0;
825     for (const auto& fragment : fragments) {
826       memcpy(buffer + len, fragment.fragment.data(), fragment.fragment.size());
827       len += fragment.fragment.size();
828     }
829     return std::make_unique<QuicEncryptedPacket>(buffer, len, true);
830   }
831 
CheckFramingBoundaries(const PacketFragments & fragments,QuicErrorCode error_code)832   void CheckFramingBoundaries(const PacketFragments& fragments,
833                               QuicErrorCode error_code) {
834     std::unique_ptr<QuicEncryptedPacket> packet(
835         AssemblePacketFromFragments(fragments));
836     // Check all the various prefixes of |packet| for the expected
837     // parse error and error code.
838     for (size_t i = 0; i < packet->length(); ++i) {
839       std::string expected_error;
840       size_t len = 0;
841       for (const auto& fragment : fragments) {
842         len += fragment.fragment.size();
843         if (i < len) {
844           expected_error = fragment.error_if_missing;
845           break;
846         }
847       }
848 
849       if (expected_error.empty()) continue;
850 
851       CheckProcessingFails(*packet, i, expected_error, error_code);
852     }
853   }
854 
CheckProcessingFails(const QuicEncryptedPacket & packet,size_t len,std::string expected_error,QuicErrorCode error_code)855   void CheckProcessingFails(const QuicEncryptedPacket& packet, size_t len,
856                             std::string expected_error,
857                             QuicErrorCode error_code) {
858     QuicEncryptedPacket encrypted(packet.data(), len, false);
859     EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
860     EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len;
861     EXPECT_EQ(error_code, framer_.error()) << "len: " << len;
862   }
863 
CheckProcessingFails(unsigned char * packet,size_t len,std::string expected_error,QuicErrorCode error_code)864   void CheckProcessingFails(unsigned char* packet, size_t len,
865                             std::string expected_error,
866                             QuicErrorCode error_code) {
867     QuicEncryptedPacket encrypted(AsChars(packet), len, false);
868     EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
869     EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len;
870     EXPECT_EQ(error_code, framer_.error()) << "len: " << len;
871   }
872 
873   // Checks if the supplied string matches data in the supplied StreamFrame.
CheckStreamFrameData(std::string str,QuicStreamFrame * frame)874   void CheckStreamFrameData(std::string str, QuicStreamFrame* frame) {
875     EXPECT_EQ(str, std::string(frame->data_buffer, frame->data_length));
876   }
877 
CheckCalculatePacketNumber(uint64_t expected_packet_number,QuicPacketNumber last_packet_number)878   void CheckCalculatePacketNumber(uint64_t expected_packet_number,
879                                   QuicPacketNumber last_packet_number) {
880     uint64_t wire_packet_number = expected_packet_number & kMask;
881     EXPECT_EQ(expected_packet_number,
882               QuicFramerPeer::CalculatePacketNumberFromWire(
883                   &framer_, PACKET_4BYTE_PACKET_NUMBER, last_packet_number,
884                   wire_packet_number))
885         << "last_packet_number: " << last_packet_number
886         << " wire_packet_number: " << wire_packet_number;
887   }
888 
BuildDataPacket(const QuicPacketHeader & header,const QuicFrames & frames)889   std::unique_ptr<QuicPacket> BuildDataPacket(const QuicPacketHeader& header,
890                                               const QuicFrames& frames) {
891     return BuildUnsizedDataPacket(&framer_, header, frames);
892   }
893 
BuildDataPacket(const QuicPacketHeader & header,const QuicFrames & frames,size_t packet_size)894   std::unique_ptr<QuicPacket> BuildDataPacket(const QuicPacketHeader& header,
895                                               const QuicFrames& frames,
896                                               size_t packet_size) {
897     return BuildUnsizedDataPacket(&framer_, header, frames, packet_size);
898   }
899 
900   // N starts at 1.
GetNthStreamid(QuicTransportVersion transport_version,Perspective perspective,bool bidirectional,int n)901   QuicStreamId GetNthStreamid(QuicTransportVersion transport_version,
902                               Perspective perspective, bool bidirectional,
903                               int n) {
904     if (bidirectional) {
905       return QuicUtils::GetFirstBidirectionalStreamId(transport_version,
906                                                       perspective) +
907              ((n - 1) * QuicUtils::StreamIdDelta(transport_version));
908     }
909     // Unidirectional
910     return QuicUtils::GetFirstUnidirectionalStreamId(transport_version,
911                                                      perspective) +
912            ((n - 1) * QuicUtils::StreamIdDelta(transport_version));
913   }
914 
CreationTimePlus(uint64_t offset_us)915   QuicTime CreationTimePlus(uint64_t offset_us) {
916     return framer_.creation_time() +
917            QuicTime::Delta::FromMicroseconds(offset_us);
918   }
919 
920   test::TestEncrypter* encrypter_;
921   test::TestDecrypter* decrypter_;
922   ParsedQuicVersion version_;
923   QuicTime start_;
924   QuicFramer framer_;
925   test::TestQuicVisitor visitor_;
926   quiche::SimpleBufferAllocator allocator_;
927 };
928 
929 // Multiple test cases of QuicFramerTest use byte arrays to define packets for
930 // testing, and these byte arrays contain the QUIC version. This macro explodes
931 // the 32-bit version into four bytes in network order. Since it uses methods of
932 // QuicFramerTest, it is only valid to use this in a QuicFramerTest.
933 #define QUIC_VERSION_BYTES                                             \
934   GetQuicVersionByte(0), GetQuicVersionByte(1), GetQuicVersionByte(2), \
935       GetQuicVersionByte(3)
936 
937 // Run all framer tests with all supported versions of QUIC.
938 INSTANTIATE_TEST_SUITE_P(QuicFramerTests, QuicFramerTest,
939                          ::testing::ValuesIn(AllSupportedVersions()),
940                          ::testing::PrintToStringParamName());
941 
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearEpochStart)942 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochStart) {
943   // A few quick manual sanity checks.
944   CheckCalculatePacketNumber(UINT64_C(1), QuicPacketNumber());
945   CheckCalculatePacketNumber(kEpoch + 1, QuicPacketNumber(kMask));
946   CheckCalculatePacketNumber(kEpoch, QuicPacketNumber(kMask));
947   for (uint64_t j = 0; j < 10; j++) {
948     CheckCalculatePacketNumber(j, QuicPacketNumber());
949     CheckCalculatePacketNumber(kEpoch - 1 - j, QuicPacketNumber());
950   }
951 
952   // Cases where the last number was close to the start of the range.
953   for (QuicPacketNumber last = QuicPacketNumber(1); last < QuicPacketNumber(10);
954        last++) {
955     // Small numbers should not wrap (even if they're out of order).
956     for (uint64_t j = 0; j < 10; j++) {
957       CheckCalculatePacketNumber(j, last);
958     }
959 
960     // Large numbers should not wrap either (because we're near 0 already).
961     for (uint64_t j = 0; j < 10; j++) {
962       CheckCalculatePacketNumber(kEpoch - 1 - j, last);
963     }
964   }
965 }
966 
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearEpochEnd)967 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochEnd) {
968   // Cases where the last number was close to the end of the range
969   for (uint64_t i = 0; i < 10; i++) {
970     QuicPacketNumber last = QuicPacketNumber(kEpoch - i);
971 
972     // Small numbers should wrap.
973     for (uint64_t j = 0; j < 10; j++) {
974       CheckCalculatePacketNumber(kEpoch + j, last);
975     }
976 
977     // Large numbers should not (even if they're out of order).
978     for (uint64_t j = 0; j < 10; j++) {
979       CheckCalculatePacketNumber(kEpoch - 1 - j, last);
980     }
981   }
982 }
983 
984 // Next check where we're in a non-zero epoch to verify we handle
985 // reverse wrapping, too.
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearPrevEpoch)986 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearPrevEpoch) {
987   const uint64_t prev_epoch = 1 * kEpoch;
988   const uint64_t cur_epoch = 2 * kEpoch;
989   // Cases where the last number was close to the start of the range
990   for (uint64_t i = 0; i < 10; i++) {
991     QuicPacketNumber last = QuicPacketNumber(cur_epoch + i);
992     // Small number should not wrap (even if they're out of order).
993     for (uint64_t j = 0; j < 10; j++) {
994       CheckCalculatePacketNumber(cur_epoch + j, last);
995     }
996 
997     // But large numbers should reverse wrap.
998     for (uint64_t j = 0; j < 10; j++) {
999       uint64_t num = kEpoch - 1 - j;
1000       CheckCalculatePacketNumber(prev_epoch + num, last);
1001     }
1002   }
1003 }
1004 
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearNextEpoch)1005 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextEpoch) {
1006   const uint64_t cur_epoch = 2 * kEpoch;
1007   const uint64_t next_epoch = 3 * kEpoch;
1008   // Cases where the last number was close to the end of the range
1009   for (uint64_t i = 0; i < 10; i++) {
1010     QuicPacketNumber last = QuicPacketNumber(next_epoch - 1 - i);
1011 
1012     // Small numbers should wrap.
1013     for (uint64_t j = 0; j < 10; j++) {
1014       CheckCalculatePacketNumber(next_epoch + j, last);
1015     }
1016 
1017     // but large numbers should not (even if they're out of order).
1018     for (uint64_t j = 0; j < 10; j++) {
1019       uint64_t num = kEpoch - 1 - j;
1020       CheckCalculatePacketNumber(cur_epoch + num, last);
1021     }
1022   }
1023 }
1024 
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearNextMax)1025 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextMax) {
1026   const uint64_t max_number = std::numeric_limits<uint64_t>::max();
1027   const uint64_t max_epoch = max_number & ~kMask;
1028 
1029   // Cases where the last number was close to the end of the range
1030   for (uint64_t i = 0; i < 10; i++) {
1031     // Subtract 1, because the expected next packet number is 1 more than the
1032     // last packet number.
1033     QuicPacketNumber last = QuicPacketNumber(max_number - i - 1);
1034 
1035     // Small numbers should not wrap, because they have nowhere to go.
1036     for (uint64_t j = 0; j < 10; j++) {
1037       CheckCalculatePacketNumber(max_epoch + j, last);
1038     }
1039 
1040     // Large numbers should not wrap either.
1041     for (uint64_t j = 0; j < 10; j++) {
1042       uint64_t num = kEpoch - 1 - j;
1043       CheckCalculatePacketNumber(max_epoch + num, last);
1044     }
1045   }
1046 }
1047 
TEST_P(QuicFramerTest,EmptyPacket)1048 TEST_P(QuicFramerTest, EmptyPacket) {
1049   char packet[] = {0x00};
1050   QuicEncryptedPacket encrypted(packet, 0, false);
1051   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
1052   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
1053 }
1054 
TEST_P(QuicFramerTest,LargePacket)1055 TEST_P(QuicFramerTest, LargePacket) {
1056   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1057   // clang-format off
1058   unsigned char packet[kMaxIncomingPacketSize + 1] = {
1059     // type (short header 4 byte packet number)
1060     0x43,
1061     // connection_id
1062     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1063     // packet number
1064     0x78, 0x56, 0x34, 0x12,
1065   };
1066   // clang-format on
1067 
1068   const size_t header_size = GetPacketHeaderSize(
1069       framer_.transport_version(), kPacket8ByteConnectionId,
1070       kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
1071       PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
1072       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
1073 
1074   memset(packet + header_size, 0, kMaxIncomingPacketSize - header_size);
1075 
1076   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
1077   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
1078 
1079   ASSERT_TRUE(visitor_.header_.get());
1080   // Make sure we've parsed the packet header, so we can send an error.
1081   EXPECT_EQ(FramerTestConnectionId(),
1082             visitor_.header_->destination_connection_id);
1083   // Make sure the correct error is propagated.
1084   EXPECT_THAT(framer_.error(), IsError(QUIC_PACKET_TOO_LARGE));
1085   EXPECT_EQ("Packet too large.", framer_.detailed_error());
1086 }
1087 
TEST_P(QuicFramerTest,LongPacketHeader)1088 TEST_P(QuicFramerTest, LongPacketHeader) {
1089   // clang-format off
1090   PacketFragments packet = {
1091     // type (long header with packet type ZERO_RTT)
1092     {"Unable to read first byte.",
1093      {0xD3}},
1094     // version tag
1095     {"Unable to read protocol version.",
1096      {QUIC_VERSION_BYTES}},
1097     // connection_id length
1098     {"Unable to read ConnectionId length.",
1099      {0x50}},
1100     // connection_id
1101     {"Unable to read destination connection ID.",
1102      {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1103     // packet number
1104     {"Unable to read packet number.",
1105      {0x12, 0x34, 0x56, 0x78}},
1106   };
1107   // clang-format on
1108 
1109   if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
1110     return;
1111   }
1112 
1113   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
1114   std::unique_ptr<QuicEncryptedPacket> encrypted(
1115       AssemblePacketFromFragments(packet));
1116 
1117   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1118   EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1119   ASSERT_TRUE(visitor_.header_.get());
1120   EXPECT_EQ(FramerTestConnectionId(),
1121             visitor_.header_->destination_connection_id);
1122   EXPECT_FALSE(visitor_.header_->reset_flag);
1123   EXPECT_TRUE(visitor_.header_->version_flag);
1124   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1125 
1126   CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
1127 
1128   PacketHeaderFormat format;
1129   QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1130   bool version_flag;
1131   QuicConnectionId destination_connection_id, source_connection_id;
1132   QuicVersionLabel version_label;
1133   std::string detailed_error;
1134   bool use_length_prefix;
1135   std::optional<absl::string_view> retry_token;
1136   ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1137   const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1138       *encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1139       &version_flag, &use_length_prefix, &version_label, &parsed_version,
1140       &destination_connection_id, &source_connection_id, &retry_token,
1141       &detailed_error);
1142   EXPECT_THAT(error_code, IsQuicNoError());
1143   EXPECT_EQ("", detailed_error);
1144   EXPECT_FALSE(retry_token.has_value());
1145   EXPECT_FALSE(use_length_prefix);
1146   EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1147   EXPECT_TRUE(version_flag);
1148   EXPECT_EQ(kQuicDefaultConnectionIdLength, destination_connection_id.length());
1149   EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1150   EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1151 }
1152 
TEST_P(QuicFramerTest,LongPacketHeaderWithBothConnectionIds)1153 TEST_P(QuicFramerTest, LongPacketHeaderWithBothConnectionIds) {
1154   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
1155   // clang-format off
1156   unsigned char packet[] = {
1157     // public flags (long header with packet type ZERO_RTT_PROTECTED and
1158     // 4-byte packet number)
1159     0xD3,
1160     // version
1161     QUIC_VERSION_BYTES,
1162     // connection ID lengths
1163     0x55,
1164     // destination connection ID
1165     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1166     // source connection ID
1167     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
1168     // packet number
1169     0x12, 0x34, 0x56, 0x00,
1170     // padding frame
1171     0x00,
1172   };
1173   unsigned char packet49[] = {
1174     // public flags (long header with packet type ZERO_RTT_PROTECTED and
1175     // 4-byte packet number)
1176     0xD3,
1177     // version
1178     QUIC_VERSION_BYTES,
1179     // destination connection ID length
1180     0x08,
1181     // destination connection ID
1182     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1183     // source connection ID length
1184     0x08,
1185     // source connection ID
1186     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
1187     // long header packet length
1188     0x05,
1189     // packet number
1190     0x12, 0x34, 0x56, 0x00,
1191     // padding frame
1192     0x00,
1193   };
1194   // clang-format on
1195 
1196   unsigned char* p = packet;
1197   size_t p_length = ABSL_ARRAYSIZE(packet);
1198   if (framer_.version().HasLongHeaderLengths()) {
1199     ReviseFirstByteByVersion(packet49);
1200     p = packet49;
1201     p_length = ABSL_ARRAYSIZE(packet49);
1202   }
1203 
1204   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
1205   PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1206   QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1207   bool version_flag = false;
1208   QuicConnectionId destination_connection_id, source_connection_id;
1209   QuicVersionLabel version_label = 0;
1210   std::string detailed_error = "";
1211   bool use_length_prefix;
1212   std::optional<absl::string_view> retry_token;
1213   ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1214   const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1215       encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1216       &version_flag, &use_length_prefix, &version_label, &parsed_version,
1217       &destination_connection_id, &source_connection_id, &retry_token,
1218       &detailed_error);
1219   EXPECT_THAT(error_code, IsQuicNoError());
1220   EXPECT_FALSE(retry_token.has_value());
1221   EXPECT_EQ(framer_.version().HasLengthPrefixedConnectionIds(),
1222             use_length_prefix);
1223   EXPECT_EQ("", detailed_error);
1224   EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1225   EXPECT_TRUE(version_flag);
1226   EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1227   EXPECT_EQ(FramerTestConnectionIdPlusOne(), source_connection_id);
1228 }
1229 
TEST_P(QuicFramerTest,AllZeroPacketParsingFails)1230 TEST_P(QuicFramerTest, AllZeroPacketParsingFails) {
1231   unsigned char packet[1200] = {};
1232   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
1233   PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1234   QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1235   bool version_flag = false;
1236   QuicConnectionId destination_connection_id, source_connection_id;
1237   QuicVersionLabel version_label = 0;
1238   std::string detailed_error = "";
1239   bool use_length_prefix;
1240   std::optional<absl::string_view> retry_token;
1241   ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1242   const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1243       encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1244       &version_flag, &use_length_prefix, &version_label, &parsed_version,
1245       &destination_connection_id, &source_connection_id, &retry_token,
1246       &detailed_error);
1247   EXPECT_EQ(error_code, QUIC_INVALID_PACKET_HEADER);
1248   EXPECT_EQ(detailed_error, "Invalid flags.");
1249 }
1250 
TEST_P(QuicFramerTest,ParsePublicHeader)1251 TEST_P(QuicFramerTest, ParsePublicHeader) {
1252   // clang-format off
1253   unsigned char packet[] = {
1254       // public flags (long header with packet type HANDSHAKE and
1255       // 4-byte packet number)
1256       0xE3,
1257       // version
1258       QUIC_VERSION_BYTES,
1259       // connection ID lengths
1260       0x50,
1261       // destination connection ID
1262       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1263       // long header packet length
1264       0x05,
1265       // packet number
1266       0x12, 0x34, 0x56, 0x78,
1267       // padding frame
1268       0x00,
1269   };
1270   unsigned char packet49[] = {
1271     // public flags (long header with packet type HANDSHAKE and
1272     // 4-byte packet number)
1273     0xE3,
1274     // version
1275     QUIC_VERSION_BYTES,
1276     // destination connection ID length
1277     0x08,
1278     // destination connection ID
1279     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1280     // source connection ID length
1281     0x00,
1282     // long header packet length
1283     0x05,
1284     // packet number
1285     0x12, 0x34, 0x56, 0x78,
1286     // padding frame
1287     0x00,
1288   };
1289   // clang-format on
1290   unsigned char* p = packet;
1291   size_t p_length = ABSL_ARRAYSIZE(packet);
1292   if (framer_.version().HasLongHeaderLengths()) {
1293     ReviseFirstByteByVersion(packet49);
1294     p = packet49;
1295     p_length = ABSL_ARRAYSIZE(packet49);
1296   }
1297 
1298   uint8_t first_byte = 0x33;
1299   PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1300   bool version_present = false, has_length_prefix = false;
1301   QuicVersionLabel version_label = 0;
1302   ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1303   QuicConnectionId destination_connection_id = EmptyQuicConnectionId(),
1304                    source_connection_id = EmptyQuicConnectionId();
1305   QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1306   quiche::QuicheVariableLengthIntegerLength retry_token_length_length =
1307       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_4;
1308   absl::string_view retry_token;
1309   std::string detailed_error = "foobar";
1310 
1311   QuicDataReader reader(AsChars(p), p_length);
1312   const QuicErrorCode parse_error = QuicFramer::ParsePublicHeader(
1313       &reader, kQuicDefaultConnectionIdLength, /*ietf_format=*/true,
1314       &first_byte, &format, &version_present, &has_length_prefix,
1315       &version_label, &parsed_version, &destination_connection_id,
1316       &source_connection_id, &long_packet_type, &retry_token_length_length,
1317       &retry_token, &detailed_error);
1318   EXPECT_THAT(parse_error, IsQuicNoError());
1319   EXPECT_EQ("", detailed_error);
1320   EXPECT_EQ(p[0], first_byte);
1321   EXPECT_TRUE(version_present);
1322   EXPECT_EQ(framer_.version().HasLengthPrefixedConnectionIds(),
1323             has_length_prefix);
1324   EXPECT_EQ(CreateQuicVersionLabel(framer_.version()), version_label);
1325   EXPECT_EQ(framer_.version(), parsed_version);
1326   EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1327   EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1328   EXPECT_EQ(quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
1329             retry_token_length_length);
1330   EXPECT_EQ(absl::string_view(), retry_token);
1331   EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1332   EXPECT_EQ(HANDSHAKE, long_packet_type);
1333 }
1334 
TEST_P(QuicFramerTest,ParsePublicHeaderProxBadSourceConnectionIdLength)1335 TEST_P(QuicFramerTest, ParsePublicHeaderProxBadSourceConnectionIdLength) {
1336   if (!framer_.version().HasLengthPrefixedConnectionIds()) {
1337     return;
1338   }
1339   // clang-format off
1340   unsigned char packet[] = {
1341     // public flags (long header with packet type HANDSHAKE and
1342     // 4-byte packet number)
1343     0xE3,
1344     // version
1345     'P', 'R', 'O', 'X',
1346     // destination connection ID length
1347     0x08,
1348     // destination connection ID
1349     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1350     // source connection ID length (bogus)
1351     0xEE,
1352     // long header packet length
1353     0x05,
1354     // packet number
1355     0x12, 0x34, 0x56, 0x78,
1356     // padding frame
1357     0x00,
1358   };
1359   // clang-format on
1360   unsigned char* p = packet;
1361   size_t p_length = ABSL_ARRAYSIZE(packet);
1362 
1363   uint8_t first_byte = 0x33;
1364   PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1365   bool version_present = false, has_length_prefix = false;
1366   QuicVersionLabel version_label = 0;
1367   ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1368   QuicConnectionId destination_connection_id = EmptyQuicConnectionId(),
1369                    source_connection_id = EmptyQuicConnectionId();
1370   QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1371   quiche::QuicheVariableLengthIntegerLength retry_token_length_length =
1372       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_4;
1373   absl::string_view retry_token;
1374   std::string detailed_error = "foobar";
1375 
1376   QuicDataReader reader(AsChars(p), p_length);
1377   const QuicErrorCode parse_error = QuicFramer::ParsePublicHeader(
1378       &reader, kQuicDefaultConnectionIdLength,
1379       /*ietf_format=*/true, &first_byte, &format, &version_present,
1380       &has_length_prefix, &version_label, &parsed_version,
1381       &destination_connection_id, &source_connection_id, &long_packet_type,
1382       &retry_token_length_length, &retry_token, &detailed_error);
1383   EXPECT_THAT(parse_error, IsQuicNoError());
1384   EXPECT_EQ("", detailed_error);
1385   EXPECT_EQ(p[0], first_byte);
1386   EXPECT_TRUE(version_present);
1387   EXPECT_TRUE(has_length_prefix);
1388   EXPECT_EQ(0x50524F58u, version_label);  // "PROX"
1389   EXPECT_EQ(UnsupportedQuicVersion(), parsed_version);
1390   EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1391   EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1392   EXPECT_EQ(quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
1393             retry_token_length_length);
1394   EXPECT_EQ(absl::string_view(), retry_token);
1395   EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1396 }
1397 
TEST_P(QuicFramerTest,ClientConnectionIdFromShortHeaderToClient)1398 TEST_P(QuicFramerTest, ClientConnectionIdFromShortHeaderToClient) {
1399   if (!framer_.version().SupportsClientConnectionIds()) {
1400     return;
1401   }
1402   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1403   QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
1404                                                       TestConnectionId(0x33));
1405   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1406   framer_.SetExpectedClientConnectionIdLength(kQuicDefaultConnectionIdLength);
1407   // clang-format off
1408   unsigned char packet[] = {
1409     // type (short header, 4 byte packet number)
1410     0x43,
1411     // connection_id
1412     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1413     // packet number
1414     0x13, 0x37, 0x42, 0x33,
1415     // padding frame
1416     0x00,
1417   };
1418   // clang-format on
1419   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
1420   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1421   EXPECT_THAT(framer_.error(), IsQuicNoError());
1422   EXPECT_EQ("", framer_.detailed_error());
1423   ASSERT_TRUE(visitor_.header_.get());
1424   EXPECT_EQ(FramerTestConnectionId(),
1425             visitor_.header_->destination_connection_id);
1426 }
1427 
1428 // In short header packets from client to server, the client connection ID
1429 // is omitted, but the framer adds it to the header struct using its
1430 // last serialized client connection ID. This test ensures that this
1431 // mechanism behaves as expected.
TEST_P(QuicFramerTest,ClientConnectionIdFromShortHeaderToServer)1432 TEST_P(QuicFramerTest, ClientConnectionIdFromShortHeaderToServer) {
1433   if (!framer_.version().SupportsClientConnectionIds()) {
1434     return;
1435   }
1436   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1437   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1438   // clang-format off
1439   unsigned char packet[] = {
1440     // type (short header, 4 byte packet number)
1441     0x43,
1442     // connection_id
1443     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1444     // packet number
1445     0x13, 0x37, 0x42, 0x33,
1446     // padding frame
1447     0x00,
1448   };
1449   // clang-format on
1450   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
1451   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1452   EXPECT_THAT(framer_.error(), IsQuicNoError());
1453   EXPECT_EQ("", framer_.detailed_error());
1454   ASSERT_TRUE(visitor_.header_.get());
1455   EXPECT_EQ(FramerTestConnectionId(),
1456             visitor_.header_->destination_connection_id);
1457 }
1458 
TEST_P(QuicFramerTest,PacketHeaderWith0ByteConnectionId)1459 TEST_P(QuicFramerTest, PacketHeaderWith0ByteConnectionId) {
1460   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1461   QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
1462                                                       FramerTestConnectionId());
1463   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1464 
1465   // clang-format off
1466   PacketFragments packet = {
1467         // type (short header, 4 byte packet number)
1468         {"Unable to read first byte.",
1469          {0x43}},
1470         // connection_id
1471         // packet number
1472         {"Unable to read packet number.",
1473          {0x12, 0x34, 0x56, 0x78}},
1474    };
1475 
1476   PacketFragments packet_hp = {
1477         // type (short header, 4 byte packet number)
1478         {"Unable to read first byte.",
1479          {0x43}},
1480         // connection_id
1481         // packet number
1482         {"",
1483          {0x12, 0x34, 0x56, 0x78}},
1484    };
1485   // clang-format on
1486 
1487   PacketFragments& fragments =
1488       framer_.version().HasHeaderProtection() ? packet_hp : packet;
1489   std::unique_ptr<QuicEncryptedPacket> encrypted(
1490       AssemblePacketFromFragments(fragments));
1491   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1492   EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1493   ASSERT_TRUE(visitor_.header_.get());
1494   EXPECT_FALSE(visitor_.header_->reset_flag);
1495   EXPECT_FALSE(visitor_.header_->version_flag);
1496   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1497 
1498   CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1499 }
1500 
TEST_P(QuicFramerTest,PacketHeaderWithVersionFlag)1501 TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) {
1502   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
1503   // clang-format off
1504   PacketFragments packet = {
1505       // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1506       // packet number)
1507       {"Unable to read first byte.",
1508        {0xD3}},
1509       // version tag
1510       {"Unable to read protocol version.",
1511        {QUIC_VERSION_BYTES}},
1512       // connection_id length
1513       {"Unable to read ConnectionId length.",
1514        {0x50}},
1515       // connection_id
1516       {"Unable to read destination connection ID.",
1517        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1518       // packet number
1519       {"Unable to read packet number.",
1520        {0x12, 0x34, 0x56, 0x78}},
1521   };
1522 
1523   PacketFragments packet49 = {
1524       // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1525       // packet number)
1526       {"Unable to read first byte.",
1527        {0xD3}},
1528       // version tag
1529       {"Unable to read protocol version.",
1530        {QUIC_VERSION_BYTES}},
1531       // destination connection ID length
1532       {"Unable to read destination connection ID.",
1533        {0x08}},
1534       // destination connection ID
1535       {"Unable to read destination connection ID.",
1536        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1537       // source connection ID length
1538       {"Unable to read source connection ID.",
1539        {0x00}},
1540       // long header packet length
1541       {"Unable to read long header payload length.",
1542        {0x04}},
1543       // packet number
1544       {"Long header payload length longer than packet.",
1545        {0x12, 0x34, 0x56, 0x78}},
1546   };
1547   // clang-format on
1548 
1549   ReviseFirstByteByVersion(packet49);
1550   PacketFragments& fragments =
1551       framer_.version().HasLongHeaderLengths() ? packet49 : packet;
1552   std::unique_ptr<QuicEncryptedPacket> encrypted(
1553       AssemblePacketFromFragments(fragments));
1554   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1555   EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1556   ASSERT_TRUE(visitor_.header_.get());
1557   EXPECT_EQ(FramerTestConnectionId(),
1558             visitor_.header_->destination_connection_id);
1559   EXPECT_FALSE(visitor_.header_->reset_flag);
1560   EXPECT_TRUE(visitor_.header_->version_flag);
1561   EXPECT_EQ(GetParam(), visitor_.header_->version);
1562   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1563 
1564   CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1565 }
1566 
TEST_P(QuicFramerTest,PacketHeaderWith4BytePacketNumber)1567 TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) {
1568   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1569   QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1570 
1571   // clang-format off
1572   PacketFragments packet = {
1573       // type (short header, 4 byte packet number)
1574       {"Unable to read first byte.",
1575        {0x43}},
1576       // connection_id
1577       {"Unable to read destination connection ID.",
1578        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1579       // packet number
1580       {"Unable to read packet number.",
1581        {0x12, 0x34, 0x56, 0x78}},
1582   };
1583 
1584   PacketFragments packet_hp = {
1585       // type (short header, 4 byte packet number)
1586       {"Unable to read first byte.",
1587        {0x43}},
1588       // connection_id
1589       {"Unable to read destination connection ID.",
1590        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1591       // packet number
1592       {"",
1593        {0x12, 0x34, 0x56, 0x78}},
1594   };
1595   // clang-format on
1596 
1597   PacketFragments& fragments =
1598       framer_.version().HasHeaderProtection() ? packet_hp : packet;
1599   std::unique_ptr<QuicEncryptedPacket> encrypted(
1600       AssemblePacketFromFragments(fragments));
1601   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1602   EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1603   ASSERT_TRUE(visitor_.header_.get());
1604   EXPECT_EQ(FramerTestConnectionId(),
1605             visitor_.header_->destination_connection_id);
1606   EXPECT_FALSE(visitor_.header_->reset_flag);
1607   EXPECT_FALSE(visitor_.header_->version_flag);
1608   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1609 
1610   CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1611 }
1612 
TEST_P(QuicFramerTest,PacketHeaderWith2BytePacketNumber)1613 TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) {
1614   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1615   QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1616 
1617   // clang-format off
1618   PacketFragments packet = {
1619       // type (short header, 2 byte packet number)
1620       {"Unable to read first byte.",
1621        {0x41}},
1622       // connection_id
1623       {"Unable to read destination connection ID.",
1624        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1625       // packet number
1626       {"Unable to read packet number.",
1627        {0x56, 0x78}},
1628   };
1629 
1630   PacketFragments packet_hp = {
1631       // type (short header, 2 byte packet number)
1632       {"Unable to read first byte.",
1633        {0x41}},
1634       // connection_id
1635       {"Unable to read destination connection ID.",
1636        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1637       // packet number
1638       {"",
1639        {0x56, 0x78}},
1640       // padding
1641       {"", {0x00, 0x00}},
1642   };
1643   // clang-format on
1644 
1645   PacketFragments& fragments =
1646       framer_.version().HasHeaderProtection() ? packet_hp : packet;
1647   std::unique_ptr<QuicEncryptedPacket> encrypted(
1648       AssemblePacketFromFragments(fragments));
1649   if (framer_.version().HasHeaderProtection()) {
1650     EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
1651     EXPECT_THAT(framer_.error(), IsQuicNoError());
1652   } else {
1653     EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1654     EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1655   }
1656   ASSERT_TRUE(visitor_.header_.get());
1657   EXPECT_EQ(FramerTestConnectionId(),
1658             visitor_.header_->destination_connection_id);
1659   EXPECT_FALSE(visitor_.header_->reset_flag);
1660   EXPECT_FALSE(visitor_.header_->version_flag);
1661   EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1662   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1663 
1664   CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1665 }
1666 
TEST_P(QuicFramerTest,PacketHeaderWith1BytePacketNumber)1667 TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) {
1668   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1669   QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1670 
1671   // clang-format off
1672   PacketFragments packet = {
1673       // type (8 byte connection_id and 1 byte packet number)
1674       {"Unable to read first byte.",
1675        {0x40}},
1676       // connection_id
1677       {"Unable to read destination connection ID.",
1678        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1679       // packet number
1680       {"Unable to read packet number.",
1681        {0x78}},
1682   };
1683 
1684   PacketFragments packet_hp = {
1685       // type (8 byte connection_id and 1 byte packet number)
1686       {"Unable to read first byte.",
1687        {0x40}},
1688       // connection_id
1689       {"Unable to read destination connection ID.",
1690        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1691       // packet number
1692       {"",
1693        {0x78}},
1694       // padding
1695       {"", {0x00, 0x00, 0x00}},
1696   };
1697 
1698   // clang-format on
1699 
1700   PacketFragments& fragments =
1701       framer_.version().HasHeaderProtection() ? packet_hp : packet;
1702   std::unique_ptr<QuicEncryptedPacket> encrypted(
1703       AssemblePacketFromFragments(fragments));
1704   if (framer_.version().HasHeaderProtection()) {
1705     EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
1706     EXPECT_THAT(framer_.error(), IsQuicNoError());
1707   } else {
1708     EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1709     EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1710   }
1711   ASSERT_TRUE(visitor_.header_.get());
1712   EXPECT_EQ(FramerTestConnectionId(),
1713             visitor_.header_->destination_connection_id);
1714   EXPECT_FALSE(visitor_.header_->reset_flag);
1715   EXPECT_FALSE(visitor_.header_->version_flag);
1716   EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1717   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1718 
1719   CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1720 }
1721 
TEST_P(QuicFramerTest,PacketNumberDecreasesThenIncreases)1722 TEST_P(QuicFramerTest, PacketNumberDecreasesThenIncreases) {
1723   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1724   // Test the case when a packet is received from the past and future packet
1725   // numbers are still calculated relative to the largest received packet.
1726   QuicPacketHeader header;
1727   header.destination_connection_id = FramerTestConnectionId();
1728   header.reset_flag = false;
1729   header.version_flag = false;
1730   header.packet_number = kPacketNumber - 2;
1731 
1732   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
1733   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1734   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
1735   ASSERT_TRUE(data != nullptr);
1736 
1737   QuicEncryptedPacket encrypted(data->data(), data->length(), false);
1738   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1739   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1740   ASSERT_TRUE(visitor_.header_.get());
1741   EXPECT_EQ(FramerTestConnectionId(),
1742             visitor_.header_->destination_connection_id);
1743   EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1744   EXPECT_EQ(kPacketNumber - 2, visitor_.header_->packet_number);
1745 
1746   // Receive a 1 byte packet number.
1747   header.packet_number = kPacketNumber;
1748   header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1749   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1750   data = BuildDataPacket(header, frames);
1751   QuicEncryptedPacket encrypted1(data->data(), data->length(), false);
1752   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1753   EXPECT_TRUE(framer_.ProcessPacket(encrypted1));
1754   ASSERT_TRUE(visitor_.header_.get());
1755   EXPECT_EQ(FramerTestConnectionId(),
1756             visitor_.header_->destination_connection_id);
1757   EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1758   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1759 
1760   // Process a 2 byte packet number 256 packets ago.
1761   header.packet_number = kPacketNumber - 256;
1762   header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
1763   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1764   data = BuildDataPacket(header, frames);
1765   QuicEncryptedPacket encrypted2(data->data(), data->length(), false);
1766   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1767   EXPECT_TRUE(framer_.ProcessPacket(encrypted2));
1768   ASSERT_TRUE(visitor_.header_.get());
1769   EXPECT_EQ(FramerTestConnectionId(),
1770             visitor_.header_->destination_connection_id);
1771   EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1772   EXPECT_EQ(kPacketNumber - 256, visitor_.header_->packet_number);
1773 
1774   // Process another 1 byte packet number and ensure it works.
1775   header.packet_number = kPacketNumber - 1;
1776   header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1777   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1778   data = BuildDataPacket(header, frames);
1779   QuicEncryptedPacket encrypted3(data->data(), data->length(), false);
1780   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1781   EXPECT_TRUE(framer_.ProcessPacket(encrypted3));
1782   ASSERT_TRUE(visitor_.header_.get());
1783   EXPECT_EQ(FramerTestConnectionId(),
1784             visitor_.header_->destination_connection_id);
1785   EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1786   EXPECT_EQ(kPacketNumber - 1, visitor_.header_->packet_number);
1787 }
1788 
TEST_P(QuicFramerTest,PacketWithDiversificationNonce)1789 TEST_P(QuicFramerTest, PacketWithDiversificationNonce) {
1790   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
1791   // clang-format off
1792   unsigned char packet[] = {
1793     // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1794     // number.
1795     0xD0,
1796     // version tag
1797     QUIC_VERSION_BYTES,
1798     // connection_id length
1799     0x05,
1800     // connection_id
1801     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1802     // packet number
1803     0x78,
1804     // nonce
1805     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1806     0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1807     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1808     0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1809 
1810     // frame type (padding)
1811     0x00,
1812     0x00, 0x00, 0x00, 0x00
1813   };
1814 
1815   unsigned char packet49[] = {
1816     // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1817     // number.
1818     0xD0,
1819     // version tag
1820     QUIC_VERSION_BYTES,
1821     // destination connection ID length
1822     0x00,
1823     // source connection ID length
1824     0x08,
1825     // source connection ID
1826     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1827     // long header packet length
1828     0x26,
1829     // packet number
1830     0x78,
1831     // nonce
1832     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1833     0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1834     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1835     0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1836 
1837     // frame type (padding)
1838     0x00,
1839     0x00, 0x00, 0x00, 0x00
1840   };
1841   // clang-format on
1842 
1843   if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
1844     return;
1845   }
1846 
1847   unsigned char* p = packet;
1848   size_t p_size = ABSL_ARRAYSIZE(packet);
1849   if (framer_.version().HasLongHeaderLengths()) {
1850     p = packet49;
1851     p_size = ABSL_ARRAYSIZE(packet49);
1852   }
1853 
1854   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1855   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1856   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1857   ASSERT_TRUE(visitor_.header_->nonce != nullptr);
1858   for (char i = 0; i < 32; ++i) {
1859     EXPECT_EQ(i, (*visitor_.header_->nonce)[static_cast<size_t>(i)]);
1860   }
1861   EXPECT_EQ(1u, visitor_.padding_frames_.size());
1862   EXPECT_EQ(5, visitor_.padding_frames_[0]->num_padding_bytes);
1863 }
1864 
TEST_P(QuicFramerTest,LargePublicFlagWithMismatchedVersions)1865 TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) {
1866   // clang-format off
1867   unsigned char packet[] = {
1868     // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
1869     0xD3,
1870     // version tag
1871     'Q', '0', '0', '0',
1872     // connection_id length
1873     0x50,
1874     // connection_id
1875     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1876     // packet number
1877     0x12, 0x34, 0x56, 0x78,
1878 
1879     // frame type (padding frame)
1880     0x00,
1881     0x00, 0x00, 0x00, 0x00
1882   };
1883 
1884   unsigned char packet49[] = {
1885     // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
1886     0xD3,
1887     // version tag
1888     'Q', '0', '0', '0',
1889     // destination connection ID length
1890     0x08,
1891     // destination connection ID
1892     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1893     // source connection ID length
1894     0x00,
1895     // packet number
1896     0x12, 0x34, 0x56, 0x78,
1897 
1898     // frame type (padding frame)
1899     0x00,
1900     0x00, 0x00, 0x00, 0x00
1901   };
1902   // clang-format on
1903 
1904   unsigned char* p = packet;
1905   size_t p_size = ABSL_ARRAYSIZE(packet);
1906   if (framer_.version().HasLongHeaderLengths()) {
1907     p = packet49;
1908     p_size = ABSL_ARRAYSIZE(packet49);
1909   }
1910   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1911   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1912   EXPECT_THAT(framer_.error(), IsQuicNoError());
1913   ASSERT_TRUE(visitor_.header_.get());
1914   EXPECT_EQ(0, visitor_.frame_count_);
1915   EXPECT_EQ(1, visitor_.version_mismatch_);
1916 }
1917 
TEST_P(QuicFramerTest,PaddingFrame)1918 TEST_P(QuicFramerTest, PaddingFrame) {
1919   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1920   // clang-format off
1921   unsigned char packet[] = {
1922     // type (short header, 4 byte packet number)
1923     0x43,
1924     // connection_id
1925     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1926     // packet number
1927     0x12, 0x34, 0x56, 0x78,
1928 
1929     // paddings
1930     0x00, 0x00,
1931     // frame type (stream frame with fin)
1932     0xFF,
1933     // stream id
1934     0x01, 0x02, 0x03, 0x04,
1935     // offset
1936     0x3A, 0x98, 0xFE, 0xDC,
1937     0x32, 0x10, 0x76, 0x54,
1938     // data length
1939     0x00, 0x0c,
1940     // data
1941     'h',  'e',  'l',  'l',
1942     'o',  ' ',  'w',  'o',
1943     'r',  'l',  'd',  '!',
1944     // paddings
1945     0x00, 0x00,
1946   };
1947 
1948   unsigned char packet_ietf[] = {
1949     // type (short header, 4 byte packet number)
1950     0x43,
1951     // connection_id
1952     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1953     // packet number
1954     0x12, 0x34, 0x56, 0x78,
1955 
1956     // paddings
1957     0x00, 0x00,
1958     // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
1959     0x08 | 0x01 | 0x02 | 0x04,
1960 
1961     // stream id
1962     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
1963     // offset
1964     kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
1965     0x32, 0x10, 0x76, 0x54,
1966     // data length
1967     kVarInt62OneByte + 0x0c,
1968     // data
1969     'h',  'e',  'l',  'l',
1970     'o',  ' ',  'w',  'o',
1971     'r',  'l',  'd',  '!',
1972     // paddings
1973     0x00, 0x00,
1974   };
1975   // clang-format on
1976 
1977   unsigned char* p = packet;
1978   size_t p_size = ABSL_ARRAYSIZE(packet);
1979   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
1980     p = packet_ietf;
1981     p_size = ABSL_ARRAYSIZE(packet_ietf);
1982   }
1983 
1984   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1985   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1986   EXPECT_THAT(framer_.error(), IsQuicNoError());
1987   ASSERT_TRUE(visitor_.header_.get());
1988   EXPECT_TRUE(CheckDecryption(
1989       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
1990       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
1991 
1992   ASSERT_EQ(1u, visitor_.stream_frames_.size());
1993   EXPECT_EQ(0u, visitor_.ack_frames_.size());
1994   EXPECT_EQ(2u, visitor_.padding_frames_.size());
1995   EXPECT_EQ(2, visitor_.padding_frames_[0]->num_padding_bytes);
1996   EXPECT_EQ(2, visitor_.padding_frames_[1]->num_padding_bytes);
1997   EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
1998   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
1999   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2000   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2001 }
2002 
TEST_P(QuicFramerTest,StreamFrame)2003 TEST_P(QuicFramerTest, StreamFrame) {
2004   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2005   // clang-format off
2006   PacketFragments packet = {
2007       // type (short header, 4 byte packet number)
2008       {"",
2009        {0x43}},
2010       // connection_id
2011       {"",
2012        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2013       // packet number
2014       {"",
2015        {0x12, 0x34, 0x56, 0x78}},
2016       // frame type (stream frame with fin)
2017       {"",
2018        {0xFF}},
2019       // stream id
2020       {"Unable to read stream_id.",
2021        {0x01, 0x02, 0x03, 0x04}},
2022       // offset
2023       {"Unable to read offset.",
2024        {0x3A, 0x98, 0xFE, 0xDC,
2025         0x32, 0x10, 0x76, 0x54}},
2026       {"Unable to read frame data.",
2027        {
2028          // data length
2029          0x00, 0x0c,
2030          // data
2031          'h',  'e',  'l',  'l',
2032          'o',  ' ',  'w',  'o',
2033          'r',  'l',  'd',  '!'}},
2034   };
2035 
2036   PacketFragments packet_ietf = {
2037       // type (short header, 4 byte packet number)
2038       {"",
2039        {0x43}},
2040       // connection_id
2041       {"",
2042        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2043       // packet number
2044       {"",
2045        {0x12, 0x34, 0x56, 0x78}},
2046       // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
2047       {"",
2048        { 0x08 | 0x01 | 0x02 | 0x04 }},
2049       // stream id
2050       {"Unable to read IETF_STREAM frame stream id/count.",
2051        {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
2052       // offset
2053       {"Unable to read stream data offset.",
2054        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2055         0x32, 0x10, 0x76, 0x54}},
2056       // data length
2057       {"Unable to read stream data length.",
2058        {kVarInt62OneByte + 0x0c}},
2059       // data
2060       {"Unable to read frame data.",
2061        { 'h',  'e',  'l',  'l',
2062          'o',  ' ',  'w',  'o',
2063          'r',  'l',  'd',  '!'}},
2064   };
2065   // clang-format on
2066 
2067   PacketFragments& fragments =
2068       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2069                                                             : packet;
2070   std::unique_ptr<QuicEncryptedPacket> encrypted(
2071       AssemblePacketFromFragments(fragments));
2072   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2073 
2074   EXPECT_THAT(framer_.error(), IsQuicNoError());
2075   ASSERT_TRUE(visitor_.header_.get());
2076   EXPECT_TRUE(CheckDecryption(
2077       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2078       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2079 
2080   ASSERT_EQ(1u, visitor_.stream_frames_.size());
2081   EXPECT_EQ(0u, visitor_.ack_frames_.size());
2082   EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2083   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2084   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2085   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2086 
2087   CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2088 }
2089 
2090 // Test an empty (no data) stream frame.
TEST_P(QuicFramerTest,EmptyStreamFrame)2091 TEST_P(QuicFramerTest, EmptyStreamFrame) {
2092   // Only the IETF QUIC spec explicitly says that empty
2093   // stream frames are supported.
2094   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2095     return;
2096   }
2097   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2098   // clang-format off
2099   PacketFragments packet = {
2100       // type (short header, 4 byte packet number)
2101       {"",
2102        {0x43}},
2103       // connection_id
2104       {"",
2105        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2106       // packet number
2107       {"",
2108        {0x12, 0x34, 0x56, 0x78}},
2109       // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
2110       {"",
2111        { 0x08 | 0x01 | 0x02 | 0x04 }},
2112       // stream id
2113       {"Unable to read IETF_STREAM frame stream id/count.",
2114        {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
2115       // offset
2116       {"Unable to read stream data offset.",
2117        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2118         0x32, 0x10, 0x76, 0x54}},
2119       // data length
2120       {"Unable to read stream data length.",
2121        {kVarInt62OneByte + 0x00}},
2122   };
2123   // clang-format on
2124 
2125   std::unique_ptr<QuicEncryptedPacket> encrypted(
2126       AssemblePacketFromFragments(packet));
2127   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2128 
2129   EXPECT_THAT(framer_.error(), IsQuicNoError());
2130   ASSERT_TRUE(visitor_.header_.get());
2131   EXPECT_TRUE(CheckDecryption(
2132       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2133       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2134 
2135   ASSERT_EQ(1u, visitor_.stream_frames_.size());
2136   EXPECT_EQ(0u, visitor_.ack_frames_.size());
2137   EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2138   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2139   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2140   EXPECT_EQ(visitor_.stream_frames_[0].get()->data_length, 0u);
2141 
2142   CheckFramingBoundaries(packet, QUIC_INVALID_STREAM_DATA);
2143 }
2144 
TEST_P(QuicFramerTest,MissingDiversificationNonce)2145 TEST_P(QuicFramerTest, MissingDiversificationNonce) {
2146   if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
2147     // TLS does not use diversification nonces.
2148     return;
2149   }
2150   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
2151   decrypter_ = new test::TestDecrypter();
2152   if (framer_.version().KnowsWhichDecrypterToUse()) {
2153     framer_.InstallDecrypter(
2154         ENCRYPTION_INITIAL,
2155         std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
2156     framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
2157                              std::unique_ptr<QuicDecrypter>(decrypter_));
2158   } else {
2159     framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
2160                                                  Perspective::IS_CLIENT));
2161     framer_.SetAlternativeDecrypter(
2162         ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
2163   }
2164 
2165   // clang-format off
2166   unsigned char packet[] = {
2167         // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2168         0xD3,
2169         // version tag
2170         QUIC_VERSION_BYTES,
2171         // connection_id length
2172         0x05,
2173         // connection_id
2174         0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2175         // packet number
2176         0x12, 0x34, 0x56, 0x78,
2177         // padding frame
2178         0x00,
2179     };
2180 
2181   unsigned char packet49[] = {
2182         // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2183         0xD3,
2184         // version tag
2185         QUIC_VERSION_BYTES,
2186         // destination connection ID length
2187         0x00,
2188         // source connection ID length
2189         0x08,
2190         // source connection ID
2191         0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2192         // IETF long header payload length
2193         0x05,
2194         // packet number
2195         0x12, 0x34, 0x56, 0x78,
2196         // padding frame
2197         0x00,
2198     };
2199   // clang-format on
2200 
2201   unsigned char* p = packet;
2202   size_t p_length = ABSL_ARRAYSIZE(packet);
2203   if (framer_.version().HasLongHeaderLengths()) {
2204     p = packet49;
2205     p_length = ABSL_ARRAYSIZE(packet49);
2206   }
2207   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
2208   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
2209   if (framer_.version().HasHeaderProtection()) {
2210     EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
2211     EXPECT_EQ("Unable to decrypt ENCRYPTION_ZERO_RTT header protection.",
2212               framer_.detailed_error());
2213   } else {
2214     // Cannot read diversification nonce.
2215     EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
2216     EXPECT_EQ("Unable to read nonce.", framer_.detailed_error());
2217   }
2218 }
2219 
TEST_P(QuicFramerTest,StreamFrame2ByteStreamId)2220 TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) {
2221   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2222   // clang-format off
2223   PacketFragments packet = {
2224       // type (short header, 4 byte packet number)
2225       {"",
2226        {0x43}},
2227       // connection_id
2228       {"",
2229        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2230       // packet number
2231       {"",
2232        {0x12, 0x34, 0x56, 0x78}},
2233        // frame type (stream frame with fin)
2234        {"",
2235         {0xFD}},
2236        // stream id
2237        {"Unable to read stream_id.",
2238         {0x03, 0x04}},
2239        // offset
2240        {"Unable to read offset.",
2241         {0x3A, 0x98, 0xFE, 0xDC,
2242          0x32, 0x10, 0x76, 0x54}},
2243        {"Unable to read frame data.",
2244         {
2245           // data length
2246           0x00, 0x0c,
2247           // data
2248           'h',  'e',  'l',  'l',
2249           'o',  ' ',  'w',  'o',
2250           'r',  'l',  'd',  '!'}},
2251   };
2252 
2253   PacketFragments packet_ietf = {
2254       // type (short header, 4 byte packet number)
2255       {"",
2256        {0x43}},
2257       // connection_id
2258       {"",
2259        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2260       // packet number
2261       {"",
2262        {0x12, 0x34, 0x56, 0x78}},
2263       // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2264       {"",
2265        {0x08 | 0x01 | 0x02 | 0x04}},
2266       // stream id
2267       {"Unable to read IETF_STREAM frame stream id/count.",
2268        {kVarInt62TwoBytes + 0x03, 0x04}},
2269       // offset
2270       {"Unable to read stream data offset.",
2271        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2272         0x32, 0x10, 0x76, 0x54}},
2273       // data length
2274       {"Unable to read stream data length.",
2275        {kVarInt62OneByte + 0x0c}},
2276       // data
2277       {"Unable to read frame data.",
2278        { 'h',  'e',  'l',  'l',
2279          'o',  ' ',  'w',  'o',
2280          'r',  'l',  'd',  '!'}},
2281   };
2282   // clang-format on
2283 
2284   PacketFragments& fragments =
2285       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2286                                                             : packet;
2287   std::unique_ptr<QuicEncryptedPacket> encrypted(
2288       AssemblePacketFromFragments(fragments));
2289   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2290 
2291   EXPECT_THAT(framer_.error(), IsQuicNoError());
2292   ASSERT_TRUE(visitor_.header_.get());
2293   EXPECT_TRUE(CheckDecryption(
2294       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2295       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2296 
2297   ASSERT_EQ(1u, visitor_.stream_frames_.size());
2298   EXPECT_EQ(0u, visitor_.ack_frames_.size());
2299   // Stream ID should be the last 2 bytes of kStreamId.
2300   EXPECT_EQ(0x0000FFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2301   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2302   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2303   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2304 
2305   CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2306 }
2307 
TEST_P(QuicFramerTest,StreamFrame1ByteStreamId)2308 TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) {
2309   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2310   // clang-format off
2311   PacketFragments packet = {
2312       // type (short header, 4 byte packet number)
2313       {"",
2314        {0x43}},
2315       // connection_id
2316       {"",
2317        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2318       // packet number
2319       {"",
2320        {0x12, 0x34, 0x56, 0x78}},
2321       // frame type (stream frame with fin)
2322       {"",
2323        {0xFC}},
2324       // stream id
2325       {"Unable to read stream_id.",
2326        {0x04}},
2327       // offset
2328       {"Unable to read offset.",
2329        {0x3A, 0x98, 0xFE, 0xDC,
2330         0x32, 0x10, 0x76, 0x54}},
2331       {"Unable to read frame data.",
2332        {
2333          // data length
2334          0x00, 0x0c,
2335          // data
2336          'h',  'e',  'l',  'l',
2337          'o',  ' ',  'w',  'o',
2338          'r',  'l',  'd',  '!'}},
2339   };
2340 
2341   PacketFragments packet_ietf = {
2342       // type (short header, 4 byte packet number)
2343       {"",
2344        {0x43}},
2345       // connection_id
2346       {"",
2347        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2348       // packet number
2349       {"",
2350        {0x12, 0x34, 0x56, 0x78}},
2351       // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2352       {"",
2353        {0x08 | 0x01 | 0x02 | 0x04}},
2354       // stream id
2355       {"Unable to read IETF_STREAM frame stream id/count.",
2356        {kVarInt62OneByte + 0x04}},
2357       // offset
2358       {"Unable to read stream data offset.",
2359        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2360         0x32, 0x10, 0x76, 0x54}},
2361       // data length
2362       {"Unable to read stream data length.",
2363        {kVarInt62OneByte + 0x0c}},
2364       // data
2365       {"Unable to read frame data.",
2366        { 'h',  'e',  'l',  'l',
2367          'o',  ' ',  'w',  'o',
2368          'r',  'l',  'd',  '!'}},
2369   };
2370   // clang-format on
2371 
2372   PacketFragments& fragments =
2373       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2374                                                             : packet;
2375   std::unique_ptr<QuicEncryptedPacket> encrypted(
2376       AssemblePacketFromFragments(fragments));
2377   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2378 
2379   EXPECT_THAT(framer_.error(), IsQuicNoError());
2380   ASSERT_TRUE(visitor_.header_.get());
2381   EXPECT_TRUE(CheckDecryption(
2382       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2383       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2384 
2385   ASSERT_EQ(1u, visitor_.stream_frames_.size());
2386   EXPECT_EQ(0u, visitor_.ack_frames_.size());
2387   // Stream ID should be the last 1 byte of kStreamId.
2388   EXPECT_EQ(0x000000FF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2389   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2390   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2391   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2392 
2393   CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2394 }
2395 
TEST_P(QuicFramerTest,StreamFrameWithVersion)2396 TEST_P(QuicFramerTest, StreamFrameWithVersion) {
2397   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
2398   // clang-format off
2399   PacketFragments packet = {
2400       // public flags (long header with packet type ZERO_RTT_PROTECTED and
2401       // 4-byte packet number)
2402       {"",
2403        {0xD3}},
2404       // version tag
2405       {"",
2406        {QUIC_VERSION_BYTES}},
2407       // connection_id length
2408       {"",
2409        {0x50}},
2410       // connection_id
2411       {"",
2412        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2413       // packet number
2414       {"",
2415        {0x12, 0x34, 0x56, 0x78}},
2416       // frame type (stream frame with fin)
2417       {"",
2418        {0xFE}},
2419       // stream id
2420       {"Unable to read stream_id.",
2421        {0x02, 0x03, 0x04}},
2422       // offset
2423       {"Unable to read offset.",
2424        {0x3A, 0x98, 0xFE, 0xDC,
2425         0x32, 0x10, 0x76, 0x54}},
2426       {"Unable to read frame data.",
2427        {
2428          // data length
2429          0x00, 0x0c,
2430          // data
2431          'h',  'e',  'l',  'l',
2432          'o',  ' ',  'w',  'o',
2433          'r',  'l',  'd',  '!'}},
2434   };
2435 
2436   PacketFragments packet49 = {
2437       // public flags (long header with packet type ZERO_RTT_PROTECTED and
2438       // 4-byte packet number)
2439       {"",
2440        {0xD3}},
2441       // version tag
2442       {"",
2443        {QUIC_VERSION_BYTES}},
2444       // destination connection ID length
2445       {"",
2446        {0x08}},
2447       // destination connection ID
2448       {"",
2449        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2450       // source connection ID length
2451       {"",
2452        {0x00}},
2453       // long header packet length
2454       {"",
2455        {0x1E}},
2456       // packet number
2457       {"",
2458        {0x12, 0x34, 0x56, 0x78}},
2459       // frame type (stream frame with fin)
2460       {"",
2461        {0xFE}},
2462       // stream id
2463       {"Long header payload length longer than packet.",
2464        {0x02, 0x03, 0x04}},
2465       // offset
2466       {"Long header payload length longer than packet.",
2467        {0x3A, 0x98, 0xFE, 0xDC,
2468         0x32, 0x10, 0x76, 0x54}},
2469       {"Long header payload length longer than packet.",
2470        {
2471          // data length
2472          0x00, 0x0c,
2473          // data
2474          'h',  'e',  'l',  'l',
2475          'o',  ' ',  'w',  'o',
2476          'r',  'l',  'd',  '!'}},
2477   };
2478 
2479   PacketFragments packet_ietf = {
2480       // public flags (long header with packet type ZERO_RTT_PROTECTED and
2481       // 4-byte packet number)
2482       {"",
2483        {0xD3}},
2484       // version tag
2485       {"",
2486        {QUIC_VERSION_BYTES}},
2487       // destination connection ID length
2488       {"",
2489        {0x08}},
2490       // destination connection ID
2491       {"",
2492        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2493       // source connection ID length
2494       {"",
2495        {0x00}},
2496       // long header packet length
2497       {"",
2498        {0x1E}},
2499       // packet number
2500       {"",
2501        {0x12, 0x34, 0x56, 0x78}},
2502       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
2503       {"",
2504        {0x08 | 0x01 | 0x02 | 0x04}},
2505       // stream id
2506       {"Long header payload length longer than packet.",
2507        {kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04}},
2508       // offset
2509       {"Long header payload length longer than packet.",
2510        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2511         0x32, 0x10, 0x76, 0x54}},
2512       // data length
2513       {"Long header payload length longer than packet.",
2514        {kVarInt62OneByte + 0x0c}},
2515       // data
2516       {"Long header payload length longer than packet.",
2517        { 'h',  'e',  'l',  'l',
2518          'o',  ' ',  'w',  'o',
2519          'r',  'l',  'd',  '!'}},
2520   };
2521   // clang-format on
2522 
2523   quiche::QuicheVariableLengthIntegerLength retry_token_length_length =
2524       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
2525   size_t retry_token_length = 0;
2526   quiche::QuicheVariableLengthIntegerLength length_length =
2527       QuicVersionHasLongHeaderLengths(framer_.transport_version())
2528           ? quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1
2529           : quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
2530 
2531   ReviseFirstByteByVersion(packet_ietf);
2532   PacketFragments& fragments =
2533       VersionHasIetfQuicFrames(framer_.transport_version())
2534           ? packet_ietf
2535           : (framer_.version().HasLongHeaderLengths() ? packet49 : packet);
2536   std::unique_ptr<QuicEncryptedPacket> encrypted(
2537       AssemblePacketFromFragments(fragments));
2538   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2539 
2540   EXPECT_THAT(framer_.error(), IsQuicNoError());
2541   ASSERT_TRUE(visitor_.header_.get());
2542   EXPECT_TRUE(CheckDecryption(
2543       *encrypted, kIncludeVersion, !kIncludeDiversificationNonce,
2544       kPacket8ByteConnectionId, kPacket0ByteConnectionId,
2545       retry_token_length_length, retry_token_length, length_length));
2546 
2547   ASSERT_EQ(1u, visitor_.stream_frames_.size());
2548   EXPECT_EQ(0u, visitor_.ack_frames_.size());
2549   // Stream ID should be the last 3 bytes of kStreamId.
2550   EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2551   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2552   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2553   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2554 
2555   CheckFramingBoundaries(fragments, framer_.version().HasLongHeaderLengths()
2556                                         ? QUIC_INVALID_PACKET_HEADER
2557                                         : QUIC_INVALID_STREAM_DATA);
2558 }
2559 
TEST_P(QuicFramerTest,RejectPacket)2560 TEST_P(QuicFramerTest, RejectPacket) {
2561   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2562   visitor_.accept_packet_ = false;
2563 
2564   // clang-format off
2565   unsigned char packet[] = {
2566       // type (short header, 4 byte packet number)
2567       0x43,
2568       // connection_id
2569       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2570       // packet number
2571       0x12, 0x34, 0x56, 0x78,
2572 
2573       // frame type (STREAM Frame with FIN, LEN, and OFFSET bits set)
2574       0x10 | 0x01 | 0x02 | 0x04,
2575       // stream id
2576       kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
2577       // offset
2578       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2579       0x32, 0x10, 0x76, 0x54,
2580       // data length
2581       kVarInt62OneByte + 0x0c,
2582       // data
2583       'h',  'e',  'l',  'l',
2584       'o',  ' ',  'w',  'o',
2585       'r',  'l',  'd',  '!',
2586   };
2587   // clang-format on
2588 
2589   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
2590   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2591 
2592   EXPECT_THAT(framer_.error(), IsQuicNoError());
2593   ASSERT_TRUE(visitor_.header_.get());
2594   EXPECT_TRUE(CheckDecryption(
2595       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2596       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2597 
2598   ASSERT_EQ(0u, visitor_.stream_frames_.size());
2599   EXPECT_EQ(0u, visitor_.ack_frames_.size());
2600 }
2601 
TEST_P(QuicFramerTest,RejectPublicHeader)2602 TEST_P(QuicFramerTest, RejectPublicHeader) {
2603   visitor_.accept_public_header_ = false;
2604 
2605   // clang-format off
2606   unsigned char packet[] = {
2607     // type (short header, 1 byte packet number)
2608     0x40,
2609     // connection_id
2610     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2611     // packet number
2612     0x01,
2613   };
2614   // clang-format on
2615 
2616   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
2617   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2618 
2619   EXPECT_THAT(framer_.error(), IsQuicNoError());
2620   ASSERT_TRUE(visitor_.header_.get());
2621   EXPECT_FALSE(visitor_.header_->packet_number.IsInitialized());
2622 }
2623 
TEST_P(QuicFramerTest,AckFrameOneAckBlock)2624 TEST_P(QuicFramerTest, AckFrameOneAckBlock) {
2625   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2626   // clang-format off
2627   PacketFragments packet = {
2628       // type (short packet, 4 byte packet number)
2629       {"",
2630        {0x43}},
2631       // connection_id
2632       {"",
2633        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2634       // packet number
2635       {"",
2636        {0x12, 0x34, 0x56, 0x78}},
2637       // frame type (ack frame)
2638       // (one ack block, 2 byte largest observed, 2 byte block length)
2639       {"",
2640        {0x45}},
2641       // largest acked
2642       {"Unable to read largest acked.",
2643        {0x12, 0x34}},
2644       // Zero delta time.
2645       {"Unable to read ack delay time.",
2646        {0x00, 0x00}},
2647       // first ack block length.
2648       {"Unable to read first ack block length.",
2649        {0x12, 0x34}},
2650       // num timestamps.
2651       {"Unable to read num received packets.",
2652        {0x00}}
2653   };
2654 
2655   PacketFragments packet_ietf = {
2656       // type (short packet, 4 byte packet number)
2657       {"",
2658        {0x43}},
2659       // connection_id
2660       {"",
2661        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2662       // packet number
2663       {"",
2664        {0x12, 0x34, 0x56, 0x78}},
2665        // frame type (IETF_ACK)
2666        // (one ack block, 2 byte largest observed, 2 byte block length)
2667        // IETF-Quic ignores the bit-fields in the ack type, all of
2668        // that information is encoded elsewhere in the frame.
2669        {"",
2670         {0x02}},
2671        // largest acked
2672        {"Unable to read largest acked.",
2673         {kVarInt62TwoBytes  + 0x12, 0x34}},
2674        // Zero delta time.
2675        {"Unable to read ack delay time.",
2676         {kVarInt62OneByte + 0x00}},
2677       // Ack block count (0 -- no blocks after the first)
2678       {"Unable to read ack block count.",
2679        {kVarInt62OneByte + 0x00}},
2680        // first ack block length - 1.
2681        // IETF Quic defines the ack block's value as the "number of
2682        // packets that preceed the largest packet number in the block"
2683        // which for the 1st ack block is the largest acked field,
2684        // above. This means that if we are acking just packet 0x1234
2685        // then the 1st ack block will be 0.
2686        {"Unable to read first ack block length.",
2687         {kVarInt62TwoBytes + 0x12, 0x33}}
2688   };
2689   // clang-format on
2690 
2691   PacketFragments& fragments =
2692       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2693                                                             : packet;
2694   std::unique_ptr<QuicEncryptedPacket> encrypted(
2695       AssemblePacketFromFragments(fragments));
2696   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2697 
2698   EXPECT_THAT(framer_.error(), IsQuicNoError());
2699   ASSERT_TRUE(visitor_.header_.get());
2700   EXPECT_TRUE(CheckDecryption(
2701       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2702       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2703 
2704   EXPECT_EQ(0u, visitor_.stream_frames_.size());
2705   ASSERT_EQ(1u, visitor_.ack_frames_.size());
2706   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
2707   EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
2708   ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
2709 
2710   CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
2711 }
2712 
2713 // This test checks that the ack frame processor correctly identifies
2714 // and handles the case where the first ack block is larger than the
2715 // largest_acked packet.
TEST_P(QuicFramerTest,FirstAckFrameUnderflow)2716 TEST_P(QuicFramerTest, FirstAckFrameUnderflow) {
2717   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2718   // clang-format off
2719   PacketFragments packet = {
2720       // type (short header, 4 byte packet number)
2721       {"",
2722        {0x43}},
2723       // connection_id
2724       {"",
2725        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2726       // packet number
2727       {"",
2728        {0x12, 0x34, 0x56, 0x78}},
2729       // frame type (ack frame)
2730       // (one ack block, 2 byte largest observed, 2 byte block length)
2731       {"",
2732        {0x45}},
2733       // largest acked
2734       {"Unable to read largest acked.",
2735        {0x12, 0x34}},
2736       // Zero delta time.
2737       {"Unable to read ack delay time.",
2738        {0x00, 0x00}},
2739       // first ack block length.
2740       {"Unable to read first ack block length.",
2741        {0x88, 0x88}},
2742       // num timestamps.
2743       {"Underflow with first ack block length 34952 largest acked is 4660.",
2744        {0x00}}
2745   };
2746 
2747   PacketFragments packet_ietf = {
2748       // type (short header, 4 byte packet number)
2749       {"",
2750        {0x43}},
2751       // connection_id
2752       {"",
2753        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2754       // packet number
2755       {"",
2756        {0x12, 0x34, 0x56, 0x78}},
2757        // frame type (IETF_ACK)
2758        {"",
2759         {0x02}},
2760        // largest acked
2761        {"Unable to read largest acked.",
2762         {kVarInt62TwoBytes  + 0x12, 0x34}},
2763        // Zero delta time.
2764        {"Unable to read ack delay time.",
2765         {kVarInt62OneByte + 0x00}},
2766        // Ack block count (0 -- no blocks after the first)
2767        {"Unable to read ack block count.",
2768         {kVarInt62OneByte + 0x00}},
2769        // first ack block length.
2770        {"Unable to read first ack block length.",
2771         {kVarInt62TwoBytes + 0x28, 0x88}}
2772   };
2773   // clang-format on
2774 
2775   PacketFragments& fragments =
2776       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2777                                                             : packet;
2778   std::unique_ptr<QuicEncryptedPacket> encrypted(
2779       AssemblePacketFromFragments(fragments));
2780   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
2781   CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
2782 }
2783 
2784 // This test checks that the ack frame processor correctly identifies
2785 // and handles the case where the third ack block's gap is larger than the
2786 // available space in the ack range.
TEST_P(QuicFramerTest,ThirdAckBlockUnderflowGap)2787 TEST_P(QuicFramerTest, ThirdAckBlockUnderflowGap) {
2788   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2789     // Test originally written for development of IETF QUIC. The test may
2790     // also apply to Google QUIC. If so, the test should be extended to
2791     // include Google QUIC (frame formats, etc). See b/141858819.
2792     return;
2793   }
2794   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2795   // clang-format off
2796   PacketFragments packet_ietf = {
2797       // type (short header, 4 byte packet number)
2798       {"",
2799        {0x43}},
2800       // connection_id
2801       {"",
2802        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2803       // packet number
2804       {"",
2805        {0x12, 0x34, 0x56, 0x78}},
2806        // frame type (IETF_ACK frame)
2807        {"",
2808         {0x02}},
2809        // largest acked
2810        {"Unable to read largest acked.",
2811         {kVarInt62OneByte  + 63}},
2812        // Zero delta time.
2813        {"Unable to read ack delay time.",
2814         {kVarInt62OneByte + 0x00}},
2815        // Ack block count (2 -- 2 blocks after the first)
2816        {"Unable to read ack block count.",
2817         {kVarInt62OneByte + 0x02}},
2818        // first ack block length.
2819        {"Unable to read first ack block length.",
2820         {kVarInt62OneByte + 13}},  // Ack 14 packets, range 50..63 (inclusive)
2821 
2822        {"Unable to read gap block value.",
2823         {kVarInt62OneByte + 9}},  // Gap 10 packets, 40..49 (inclusive)
2824        {"Unable to read ack block value.",
2825         {kVarInt62OneByte + 9}},  // Ack 10 packets, 30..39 (inclusive)
2826        {"Unable to read gap block value.",
2827         {kVarInt62OneByte + 29}},  // A gap of 30 packets (0..29 inclusive)
2828                                    // should be too big, leaving no room
2829                                    // for the ack.
2830        {"Underflow with gap block length 30 previous ack block start is 30.",
2831         {kVarInt62OneByte + 10}},  // Don't care
2832   };
2833   // clang-format on
2834 
2835   std::unique_ptr<QuicEncryptedPacket> encrypted(
2836       AssemblePacketFromFragments(packet_ietf));
2837   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
2838   EXPECT_EQ(
2839       framer_.detailed_error(),
2840       "Underflow with gap block length 30 previous ack block start is 30.");
2841   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
2842 }
2843 
2844 // This test checks that the ack frame processor correctly identifies
2845 // and handles the case where the third ack block's length is larger than the
2846 // available space in the ack range.
TEST_P(QuicFramerTest,ThirdAckBlockUnderflowAck)2847 TEST_P(QuicFramerTest, ThirdAckBlockUnderflowAck) {
2848   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2849     // Test originally written for development of IETF QUIC. The test may
2850     // also apply to Google QUIC. If so, the test should be extended to
2851     // include Google QUIC (frame formats, etc). See b/141858819.
2852     return;
2853   }
2854   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2855   // clang-format off
2856   PacketFragments packet_ietf = {
2857       // type (short header, 4 byte packet number)
2858       {"",
2859        {0x43}},
2860       // connection_id
2861       {"",
2862        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2863       // packet number
2864       {"",
2865        {0x12, 0x34, 0x56, 0x78}},
2866        // frame type (IETF_ACK frame)
2867        {"",
2868         {0x02}},
2869        // largest acked
2870        {"Unable to read largest acked.",
2871         {kVarInt62OneByte  + 63}},
2872        // Zero delta time.
2873        {"Unable to read ack delay time.",
2874         {kVarInt62OneByte + 0x00}},
2875        // Ack block count (2 -- 2 blocks after the first)
2876        {"Unable to read ack block count.",
2877         {kVarInt62OneByte + 0x02}},
2878        // first ack block length.
2879        {"Unable to read first ack block length.",
2880         {kVarInt62OneByte + 13}},  // only 50 packet numbers "left"
2881 
2882        {"Unable to read gap block value.",
2883         {kVarInt62OneByte + 10}},  // Only 40 packet numbers left
2884        {"Unable to read ack block value.",
2885         {kVarInt62OneByte + 10}},  // only 30 packet numbers left.
2886        {"Unable to read gap block value.",
2887         {kVarInt62OneByte + 1}},  // Gap is OK, 29 packet numbers left
2888       {"Unable to read ack block value.",
2889         {kVarInt62OneByte + 30}},  // Use up all 30, should be an error
2890   };
2891   // clang-format on
2892 
2893   std::unique_ptr<QuicEncryptedPacket> encrypted(
2894       AssemblePacketFromFragments(packet_ietf));
2895   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
2896   EXPECT_EQ(framer_.detailed_error(),
2897             "Underflow with ack block length 31 latest ack block end is 25.");
2898   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
2899 }
2900 
2901 // Tests a variety of ack block wrap scenarios. For example, if the
2902 // N-1th block causes packet 0 to be acked, then a gap would wrap
2903 // around to 0x3fffffff ffffffff... Make sure we detect this
2904 // condition.
TEST_P(QuicFramerTest,AckBlockUnderflowGapWrap)2905 TEST_P(QuicFramerTest, AckBlockUnderflowGapWrap) {
2906   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2907     // Test originally written for development of IETF QUIC. The test may
2908     // also apply to Google QUIC. If so, the test should be extended to
2909     // include Google QUIC (frame formats, etc). See b/141858819.
2910     return;
2911   }
2912   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2913   // clang-format off
2914   PacketFragments packet_ietf = {
2915       // type (short header, 4 byte packet number)
2916       {"",
2917        {0x43}},
2918       // connection_id
2919       {"",
2920        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2921       // packet number
2922       {"",
2923        {0x12, 0x34, 0x56, 0x78}},
2924        // frame type (IETF_ACK frame)
2925        {"",
2926         {0x02}},
2927        // largest acked
2928        {"Unable to read largest acked.",
2929         {kVarInt62OneByte  + 10}},
2930        // Zero delta time.
2931        {"Unable to read ack delay time.",
2932         {kVarInt62OneByte + 0x00}},
2933        // Ack block count (1 -- 1 blocks after the first)
2934        {"Unable to read ack block count.",
2935         {kVarInt62OneByte + 1}},
2936        // first ack block length.
2937        {"Unable to read first ack block length.",
2938         {kVarInt62OneByte + 9}},  // Ack packets 1..10 (inclusive)
2939 
2940        {"Unable to read gap block value.",
2941         {kVarInt62OneByte + 1}},  // Gap of 2 packets (-1...0), should wrap
2942        {"Underflow with gap block length 2 previous ack block start is 1.",
2943         {kVarInt62OneByte + 9}},  // irrelevant
2944   };
2945   // clang-format on
2946 
2947   std::unique_ptr<QuicEncryptedPacket> encrypted(
2948       AssemblePacketFromFragments(packet_ietf));
2949   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
2950   EXPECT_EQ(framer_.detailed_error(),
2951             "Underflow with gap block length 2 previous ack block start is 1.");
2952   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
2953 }
2954 
2955 // As AckBlockUnderflowGapWrap, but in this test, it's the ack
2956 // component of the ack-block that causes the wrap, not the gap.
TEST_P(QuicFramerTest,AckBlockUnderflowAckWrap)2957 TEST_P(QuicFramerTest, AckBlockUnderflowAckWrap) {
2958   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2959     // Test originally written for development of IETF QUIC. The test may
2960     // also apply to Google QUIC. If so, the test should be extended to
2961     // include Google QUIC (frame formats, etc). See b/141858819.
2962     return;
2963   }
2964   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2965   // clang-format off
2966   PacketFragments packet_ietf = {
2967       // type (short header, 4 byte packet number)
2968       {"",
2969        {0x43}},
2970       // connection_id
2971       {"",
2972        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2973       // packet number
2974       {"",
2975        {0x12, 0x34, 0x56, 0x78}},
2976        // frame type (IETF_ACK frame)
2977        {"",
2978         {0x02}},
2979        // largest acked
2980        {"Unable to read largest acked.",
2981         {kVarInt62OneByte  + 10}},
2982        // Zero delta time.
2983        {"Unable to read ack delay time.",
2984         {kVarInt62OneByte + 0x00}},
2985        // Ack block count (1 -- 1 blocks after the first)
2986        {"Unable to read ack block count.",
2987         {kVarInt62OneByte + 1}},
2988        // first ack block length.
2989        {"Unable to read first ack block length.",
2990         {kVarInt62OneByte + 6}},  // Ack packets 4..10 (inclusive)
2991 
2992        {"Unable to read gap block value.",
2993         {kVarInt62OneByte + 1}},  // Gap of 2 packets (2..3)
2994        {"Unable to read ack block value.",
2995         {kVarInt62OneByte + 9}},  // Should wrap.
2996   };
2997   // clang-format on
2998 
2999   std::unique_ptr<QuicEncryptedPacket> encrypted(
3000       AssemblePacketFromFragments(packet_ietf));
3001   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3002   EXPECT_EQ(framer_.detailed_error(),
3003             "Underflow with ack block length 10 latest ack block end is 1.");
3004   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
3005 }
3006 
3007 // An ack block that acks the entire range, 1...0x3fffffffffffffff
TEST_P(QuicFramerTest,AckBlockAcksEverything)3008 TEST_P(QuicFramerTest, AckBlockAcksEverything) {
3009   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3010     // Test originally written for development of IETF QUIC. The test may
3011     // also apply to Google QUIC. If so, the test should be extended to
3012     // include Google QUIC (frame formats, etc). See b/141858819.
3013     return;
3014   }
3015   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3016   // clang-format off
3017   PacketFragments packet_ietf = {
3018       // type (short header, 4 byte packet number)
3019       {"",
3020        {0x43}},
3021       // connection_id
3022       {"",
3023        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3024       // packet number
3025       {"",
3026        {0x12, 0x34, 0x56, 0x78}},
3027        // frame type (IETF_ACK frame)
3028        {"",
3029         {0x02}},
3030        // largest acked
3031        {"Unable to read largest acked.",
3032         {kVarInt62EightBytes  + 0x3f, 0xff, 0xff, 0xff,
3033          0xff, 0xff, 0xff, 0xff}},
3034        // Zero delta time.
3035        {"Unable to read ack delay time.",
3036         {kVarInt62OneByte + 0x00}},
3037        // Ack block count No additional blocks
3038        {"Unable to read ack block count.",
3039         {kVarInt62OneByte + 0}},
3040        // first ack block length.
3041        {"Unable to read first ack block length.",
3042         {kVarInt62EightBytes  + 0x3f, 0xff, 0xff, 0xff,
3043          0xff, 0xff, 0xff, 0xfe}},
3044   };
3045   // clang-format on
3046 
3047   std::unique_ptr<QuicEncryptedPacket> encrypted(
3048       AssemblePacketFromFragments(packet_ietf));
3049   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3050   EXPECT_EQ(1u, visitor_.ack_frames_.size());
3051   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3052   EXPECT_EQ(1u, frame.packets.NumIntervals());
3053   EXPECT_EQ(kLargestIetfLargestObserved, LargestAcked(frame));
3054   EXPECT_EQ(kLargestIetfLargestObserved.ToUint64(),
3055             frame.packets.NumPacketsSlow());
3056 }
3057 
3058 // This test looks for a malformed ack where
3059 //  - There is a largest-acked value (that is, the frame is acking
3060 //    something,
3061 //  - But the length of the first ack block is 0 saying that no frames
3062 //    are being acked with the largest-acked value or there are no
3063 //    additional ack blocks.
3064 //
TEST_P(QuicFramerTest,AckFrameFirstAckBlockLengthZero)3065 TEST_P(QuicFramerTest, AckFrameFirstAckBlockLengthZero) {
3066   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3067     // Not applicable to version 99 -- first ack block contains the
3068     // number of packets that preceed the largest_acked packet.
3069     // A value of 0 means no packets preceed --- that the block's
3070     // length is 1. Therefore the condition that this test checks can
3071     // not arise.
3072     return;
3073   }
3074   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3075 
3076   // clang-format off
3077   PacketFragments packet = {
3078       // type (short header, 4 byte packet number)
3079       {"",
3080        { 0x43 }},
3081       // connection_id
3082       {"",
3083        { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3084       // packet number
3085       {"",
3086        { 0x12, 0x34, 0x56, 0x78 }},
3087 
3088       // frame type (ack frame)
3089       // (more than one ack block, 2 byte largest observed, 2 byte block length)
3090       {"",
3091        { 0x65 }},
3092       // largest acked
3093       {"Unable to read largest acked.",
3094        { 0x12, 0x34 }},
3095       // Zero delta time.
3096       {"Unable to read ack delay time.",
3097        { 0x00, 0x00 }},
3098       // num ack blocks ranges.
3099       {"Unable to read num of ack blocks.",
3100        { 0x01 }},
3101       // first ack block length.
3102       {"Unable to read first ack block length.",
3103        { 0x00, 0x00 }},
3104       // gap to next block.
3105       { "First block length is zero.",
3106         { 0x01 }},
3107       // ack block length.
3108       { "First block length is zero.",
3109         { 0x0e, 0xaf }},
3110       // Number of timestamps.
3111       { "First block length is zero.",
3112         { 0x00 }},
3113   };
3114 
3115   // clang-format on
3116   std::unique_ptr<QuicEncryptedPacket> encrypted(
3117       AssemblePacketFromFragments(packet));
3118 
3119   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3120   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_ACK_DATA));
3121 
3122   ASSERT_TRUE(visitor_.header_.get());
3123   EXPECT_TRUE(CheckDecryption(
3124       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3125       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3126 
3127   EXPECT_EQ(0u, visitor_.stream_frames_.size());
3128   ASSERT_EQ(1u, visitor_.ack_frames_.size());
3129 
3130   CheckFramingBoundaries(packet, QUIC_INVALID_ACK_DATA);
3131 }
3132 
TEST_P(QuicFramerTest,AckFrameOneAckBlockMaxLength)3133 TEST_P(QuicFramerTest, AckFrameOneAckBlockMaxLength) {
3134   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3135   // clang-format off
3136   PacketFragments packet = {
3137       // type (short header, 4 byte packet number)
3138       {"",
3139        {0x43}},
3140       // connection_id
3141       {"",
3142        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3143       // packet number
3144       {"",
3145        {0x56, 0x78, 0x9A, 0xBC}},
3146       // frame type (ack frame)
3147       // (one ack block, 4 byte largest observed, 2 byte block length)
3148       {"",
3149        {0x49}},
3150       // largest acked
3151       {"Unable to read largest acked.",
3152        {0x12, 0x34, 0x56, 0x78}},
3153       // Zero delta time.
3154       {"Unable to read ack delay time.",
3155        {0x00, 0x00}},
3156       // first ack block length.
3157       {"Unable to read first ack block length.",
3158        {0x12, 0x34}},
3159       // num timestamps.
3160       {"Unable to read num received packets.",
3161        {0x00}}
3162   };
3163 
3164   PacketFragments packet_ietf = {
3165       // type (short header, 4 byte packet number)
3166       {"",
3167        {0x43}},
3168       // connection_id
3169       {"",
3170        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3171       // packet number
3172       {"",
3173        {0x56, 0x78, 0x9A, 0xBC}},
3174        // frame type (IETF_ACK frame)
3175        {"",
3176         {0x02}},
3177        // largest acked
3178        {"Unable to read largest acked.",
3179         {kVarInt62FourBytes  + 0x12, 0x34, 0x56, 0x78}},
3180        // Zero delta time.
3181        {"Unable to read ack delay time.",
3182         {kVarInt62OneByte + 0x00}},
3183        // Number of ack blocks after first
3184        {"Unable to read ack block count.",
3185         {kVarInt62OneByte + 0x00}},
3186        // first ack block length.
3187        {"Unable to read first ack block length.",
3188         {kVarInt62TwoBytes  + 0x12, 0x33}}
3189   };
3190   // clang-format on
3191 
3192   PacketFragments& fragments =
3193       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
3194                                                             : packet;
3195   std::unique_ptr<QuicEncryptedPacket> encrypted(
3196       AssemblePacketFromFragments(fragments));
3197   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3198 
3199   EXPECT_THAT(framer_.error(), IsQuicNoError());
3200   ASSERT_TRUE(visitor_.header_.get());
3201   EXPECT_TRUE(CheckDecryption(
3202       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3203       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3204 
3205   EXPECT_EQ(0u, visitor_.stream_frames_.size());
3206   ASSERT_EQ(1u, visitor_.ack_frames_.size());
3207   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3208   EXPECT_EQ(kPacketNumber, LargestAcked(frame));
3209   ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
3210 
3211   CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3212 }
3213 
3214 // Tests ability to handle multiple ackblocks after the first ack
3215 // block. Non-version-99 tests include multiple timestamps as well.
TEST_P(QuicFramerTest,AckFrameTwoTimeStampsMultipleAckBlocks)3216 TEST_P(QuicFramerTest, AckFrameTwoTimeStampsMultipleAckBlocks) {
3217   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3218   // clang-format off
3219   PacketFragments packet = {
3220       // type (short header, 4 byte packet number)
3221       {"",
3222        { 0x43 }},
3223       // connection_id
3224       {"",
3225        { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3226       // packet number
3227       {"",
3228        { 0x12, 0x34, 0x56, 0x78 }},
3229 
3230       // frame type (ack frame)
3231       // (more than one ack block, 2 byte largest observed, 2 byte block length)
3232       {"",
3233        { 0x65 }},
3234       // largest acked
3235       {"Unable to read largest acked.",
3236        { 0x12, 0x34 }},
3237       // Zero delta time.
3238       {"Unable to read ack delay time.",
3239        { 0x00, 0x00 }},
3240       // num ack blocks ranges.
3241       {"Unable to read num of ack blocks.",
3242        { 0x04 }},
3243       // first ack block length.
3244       {"Unable to read first ack block length.",
3245        { 0x00, 0x01 }},
3246       // gap to next block.
3247       { "Unable to read gap to next ack block.",
3248         { 0x01 }},
3249       // ack block length.
3250       { "Unable to ack block length.",
3251         { 0x0e, 0xaf }},
3252       // gap to next block.
3253       { "Unable to read gap to next ack block.",
3254         { 0xff }},
3255       // ack block length.
3256       { "Unable to ack block length.",
3257         { 0x00, 0x00 }},
3258       // gap to next block.
3259       { "Unable to read gap to next ack block.",
3260         { 0x91 }},
3261       // ack block length.
3262       { "Unable to ack block length.",
3263         { 0x01, 0xea }},
3264       // gap to next block.
3265       { "Unable to read gap to next ack block.",
3266         { 0x05 }},
3267       // ack block length.
3268       { "Unable to ack block length.",
3269         { 0x00, 0x04 }},
3270       // Number of timestamps.
3271       { "Unable to read num received packets.",
3272         { 0x02 }},
3273       // Delta from largest observed.
3274       { "Unable to read sequence delta in received packets.",
3275         { 0x01 }},
3276       // Delta time.
3277       { "Unable to read time delta in received packets.",
3278         { 0x76, 0x54, 0x32, 0x10 }},
3279       // Delta from largest observed.
3280       { "Unable to read sequence delta in received packets.",
3281         { 0x02 }},
3282       // Delta time.
3283       { "Unable to read incremental time delta in received packets.",
3284         { 0x32, 0x10 }},
3285   };
3286 
3287   PacketFragments packet_ietf = {
3288       // type (short header, 4 byte packet number)
3289       {"",
3290        { 0x43 }},
3291       // connection_id
3292       {"",
3293        { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3294       // packet number
3295       {"",
3296        { 0x12, 0x34, 0x56, 0x78 }},
3297 
3298       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3299       {"",
3300        { 0x22 }},
3301        // largest acked
3302        {"Unable to read largest acked.",
3303         { kVarInt62TwoBytes + 0x12, 0x34 }},   // = 4660
3304        // Zero delta time.
3305        {"Unable to read ack delay time.",
3306         { kVarInt62OneByte + 0x00 }},
3307        // number of additional ack blocks
3308        {"Unable to read ack block count.",
3309         { kVarInt62OneByte + 0x03 }},
3310        // first ack block length.
3311        {"Unable to read first ack block length.",
3312         { kVarInt62OneByte + 0x00 }},  // 1st block length = 1
3313 
3314        // Additional ACK Block #1
3315        // gap to next block.
3316        { "Unable to read gap block value.",
3317          { kVarInt62OneByte + 0x00 }},   // gap of 1 packet
3318        // ack block length.
3319        { "Unable to read ack block value.",
3320          { kVarInt62TwoBytes + 0x0e, 0xae }},   // 3759
3321 
3322        // pre-version-99 test includes an ack block of 0 length. this
3323        // can not happen in version 99. ergo the second block is not
3324        // present in the v99 test and the gap length of the next block
3325        // is the sum of the two gaps in the pre-version-99 tests.
3326        // Additional ACK Block #2
3327        // gap to next block.
3328        { "Unable to read gap block value.",
3329          { kVarInt62TwoBytes + 0x01, 0x8f }},  // Gap is 400 (0x190) pkts
3330        // ack block length.
3331        { "Unable to read ack block value.",
3332          { kVarInt62TwoBytes + 0x01, 0xe9 }},  // block is 389 (x1ea) pkts
3333 
3334        // Additional ACK Block #3
3335        // gap to next block.
3336        { "Unable to read gap block value.",
3337          { kVarInt62OneByte + 0x04 }},   // Gap is 5 packets.
3338        // ack block length.
3339        { "Unable to read ack block value.",
3340          { kVarInt62OneByte + 0x03 }},   // block is 3 packets.
3341 
3342        // Receive Timestamps.
3343        { "Unable to read receive timestamp range count.",
3344          { kVarInt62OneByte + 0x01 }},
3345        { "Unable to read receive timestamp gap.",
3346          { kVarInt62OneByte + 0x01 }},
3347        { "Unable to read receive timestamp count.",
3348          { kVarInt62OneByte + 0x02 }},
3349        { "Unable to read receive timestamp delta.",
3350          { kVarInt62FourBytes + 0x36, 0x54, 0x32, 0x10 }},
3351        { "Unable to read receive timestamp delta.",
3352          { kVarInt62TwoBytes + 0x32, 0x10 }},
3353   };
3354 
3355   // clang-format on
3356   PacketFragments& fragments =
3357       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
3358                                                             : packet;
3359 
3360   std::unique_ptr<QuicEncryptedPacket> encrypted(
3361       AssemblePacketFromFragments(fragments));
3362 
3363   framer_.set_process_timestamps(true);
3364   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3365 
3366   EXPECT_THAT(framer_.error(), IsQuicNoError());
3367   ASSERT_TRUE(visitor_.header_.get());
3368   EXPECT_TRUE(CheckDecryption(
3369       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3370       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3371 
3372   EXPECT_EQ(0u, visitor_.stream_frames_.size());
3373   ASSERT_EQ(1u, visitor_.ack_frames_.size());
3374   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3375   EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
3376   ASSERT_EQ(4254u, frame.packets.NumPacketsSlow());
3377   EXPECT_EQ(4u, frame.packets.NumIntervals());
3378   EXPECT_EQ(2u, frame.received_packet_times.size());
3379 }
3380 
TEST_P(QuicFramerTest,AckFrameMultipleReceiveTimestampRanges)3381 TEST_P(QuicFramerTest, AckFrameMultipleReceiveTimestampRanges) {
3382   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3383     return;
3384   }
3385   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3386   // clang-format off
3387   PacketFragments packet_ietf = {
3388       // type (short header, 4 byte packet number)
3389       {"",
3390        { 0x43 }},
3391       // connection_id
3392       {"",
3393        { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3394       // packet number
3395       {"",
3396        { 0x12, 0x34, 0x56, 0x78 }},
3397 
3398       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3399       {"",
3400        { 0x22 }},
3401        // largest acked
3402        {"Unable to read largest acked.",
3403         { kVarInt62TwoBytes + 0x12, 0x34 }},   // = 4660
3404        // Zero delta time.
3405        {"Unable to read ack delay time.",
3406         { kVarInt62OneByte + 0x00 }},
3407        // number of additional ack blocks
3408        {"Unable to read ack block count.",
3409         { kVarInt62OneByte + 0x00 }},
3410        // first ack block length.
3411        {"Unable to read first ack block length.",
3412         { kVarInt62OneByte + 0x00 }},  // 1st block length = 1
3413 
3414        // Receive Timestamps.
3415        { "Unable to read receive timestamp range count.",
3416          { kVarInt62OneByte + 0x03 }},
3417 
3418        // Timestamp range 1 (three packets).
3419        { "Unable to read receive timestamp gap.",
3420          { kVarInt62OneByte + 0x02 }},
3421        { "Unable to read receive timestamp count.",
3422          { kVarInt62OneByte + 0x03 }},
3423        { "Unable to read receive timestamp delta.",
3424          { kVarInt62FourBytes + 0x29, 0xff, 0xff, 0xff}},
3425        { "Unable to read receive timestamp delta.",
3426          { kVarInt62TwoBytes + 0x11, 0x11 }},
3427        { "Unable to read receive timestamp delta.",
3428          { kVarInt62OneByte + 0x01}},
3429 
3430        // Timestamp range 2 (one packet).
3431        { "Unable to read receive timestamp gap.",
3432          { kVarInt62OneByte + 0x05 }},
3433        { "Unable to read receive timestamp count.",
3434          { kVarInt62OneByte + 0x01 }},
3435        { "Unable to read receive timestamp delta.",
3436          { kVarInt62TwoBytes + 0x10, 0x00 }},
3437 
3438        // Timestamp range 3 (two packets).
3439        { "Unable to read receive timestamp gap.",
3440          { kVarInt62OneByte + 0x08 }},
3441        { "Unable to read receive timestamp count.",
3442          { kVarInt62OneByte + 0x02 }},
3443        { "Unable to read receive timestamp delta.",
3444          { kVarInt62OneByte + 0x10 }},
3445        { "Unable to read receive timestamp delta.",
3446          { kVarInt62TwoBytes + 0x01, 0x00 }},
3447   };
3448   // clang-format on
3449 
3450   std::unique_ptr<QuicEncryptedPacket> encrypted(
3451       AssemblePacketFromFragments(packet_ietf));
3452 
3453   framer_.set_process_timestamps(true);
3454   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3455   EXPECT_THAT(framer_.error(), IsQuicNoError());
3456   ASSERT_TRUE(visitor_.header_.get());
3457   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3458 
3459   EXPECT_THAT(frame.received_packet_times,
3460               ContainerEq(PacketTimeVector{
3461                   // Timestamp Range 1.
3462                   {LargestAcked(frame) - 2, CreationTimePlus(0x29ffffff)},
3463                   {LargestAcked(frame) - 3, CreationTimePlus(0x29ffeeee)},
3464                   {LargestAcked(frame) - 4, CreationTimePlus(0x29ffeeed)},
3465                   // Timestamp Range 2.
3466                   {LargestAcked(frame) - 11, CreationTimePlus(0x29ffdeed)},
3467                   // Timestamp Range 3.
3468                   {LargestAcked(frame) - 21, CreationTimePlus(0x29ffdedd)},
3469                   {LargestAcked(frame) - 22, CreationTimePlus(0x29ffdddd)},
3470               }));
3471 }
3472 
TEST_P(QuicFramerTest,AckFrameReceiveTimestampWithExponent)3473 TEST_P(QuicFramerTest, AckFrameReceiveTimestampWithExponent) {
3474   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3475     return;
3476   }
3477   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3478   // clang-format off
3479   PacketFragments packet_ietf = {
3480       // type (short header, 4 byte packet number)
3481       {"",
3482        { 0x43 }},
3483       // connection_id
3484       {"",
3485        { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3486       // packet number
3487       {"",
3488        { 0x12, 0x34, 0x56, 0x78 }},
3489 
3490       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3491       {"",
3492        { 0x22 }},
3493        // largest acked
3494        {"Unable to read largest acked.",
3495         { kVarInt62TwoBytes + 0x12, 0x34 }},   // = 4660
3496        // Zero delta time.
3497        {"Unable to read ack delay time.",
3498         { kVarInt62OneByte + 0x00 }},
3499        // number of additional ack blocks
3500        {"Unable to read ack block count.",
3501         { kVarInt62OneByte + 0x00 }},
3502        // first ack block length.
3503        {"Unable to read first ack block length.",
3504         { kVarInt62OneByte + 0x00 }},  // 1st block length = 1
3505 
3506        // Receive Timestamps.
3507        { "Unable to read receive timestamp range count.",
3508          { kVarInt62OneByte + 0x01 }},
3509        { "Unable to read receive timestamp gap.",
3510          { kVarInt62OneByte + 0x00 }},
3511        { "Unable to read receive timestamp count.",
3512          { kVarInt62OneByte + 0x03 }},
3513        { "Unable to read receive timestamp delta.",
3514          { kVarInt62TwoBytes + 0x29, 0xff}},
3515        { "Unable to read receive timestamp delta.",
3516          { kVarInt62TwoBytes + 0x11, 0x11 }},
3517        { "Unable to read receive timestamp delta.",
3518          { kVarInt62OneByte + 0x01}},
3519   };
3520   // clang-format on
3521 
3522   std::unique_ptr<QuicEncryptedPacket> encrypted(
3523       AssemblePacketFromFragments(packet_ietf));
3524 
3525   framer_.set_receive_timestamps_exponent(3);
3526   framer_.set_process_timestamps(true);
3527   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3528   EXPECT_THAT(framer_.error(), IsQuicNoError());
3529   ASSERT_TRUE(visitor_.header_.get());
3530   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3531 
3532   EXPECT_THAT(frame.received_packet_times,
3533               ContainerEq(PacketTimeVector{
3534                   // Timestamp Range 1.
3535                   {LargestAcked(frame), CreationTimePlus(0x29ff << 3)},
3536                   {LargestAcked(frame) - 1, CreationTimePlus(0x18ee << 3)},
3537                   {LargestAcked(frame) - 2, CreationTimePlus(0x18ed << 3)},
3538               }));
3539 }
3540 
TEST_P(QuicFramerTest,AckFrameReceiveTimestampGapTooHigh)3541 TEST_P(QuicFramerTest, AckFrameReceiveTimestampGapTooHigh) {
3542   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3543     return;
3544   }
3545   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3546   // clang-format off
3547   PacketFragments packet_ietf = {
3548       // type (short header, 4 byte packet number)
3549       {"",
3550        { 0x43 }},
3551       // connection_id
3552       {"",
3553        { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3554       // packet number
3555       {"",
3556        { 0x12, 0x34, 0x56, 0x78 }},
3557 
3558       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3559       {"",
3560        { 0x22 }},
3561        // largest acked
3562        {"Unable to read largest acked.",
3563         { kVarInt62TwoBytes + 0x12, 0x34 }},   // = 4660
3564        // Zero delta time.
3565        {"Unable to read ack delay time.",
3566         { kVarInt62OneByte + 0x00 }},
3567        // number of additional ack blocks
3568        {"Unable to read ack block count.",
3569         { kVarInt62OneByte + 0x00 }},
3570        // first ack block length.
3571        {"Unable to read first ack block length.",
3572         { kVarInt62OneByte + 0x00 }},  // 1st block length = 1
3573 
3574        // Receive Timestamps.
3575        { "Unable to read receive timestamp range count.",
3576          { kVarInt62OneByte + 0x01 }},
3577        { "Unable to read receive timestamp gap.",
3578          { kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x79 }},
3579        { "Unable to read receive timestamp count.",
3580          { kVarInt62OneByte + 0x01 }},
3581        { "Unable to read receive timestamp delta.",
3582          { kVarInt62TwoBytes + 0x29, 0xff}},
3583   };
3584   // clang-format on
3585 
3586   std::unique_ptr<QuicEncryptedPacket> encrypted(
3587       AssemblePacketFromFragments(packet_ietf));
3588 
3589   framer_.set_process_timestamps(true);
3590   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3591   EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3592                                "Receive timestamp gap too high."));
3593 }
3594 
TEST_P(QuicFramerTest,AckFrameReceiveTimestampCountTooHigh)3595 TEST_P(QuicFramerTest, AckFrameReceiveTimestampCountTooHigh) {
3596   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3597     return;
3598   }
3599   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3600   // clang-format off
3601   PacketFragments packet_ietf = {
3602       // type (short header, 4 byte packet number)
3603       {"",
3604        { 0x43 }},
3605       // connection_id
3606       {"",
3607        { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3608       // packet number
3609       {"",
3610        { 0x12, 0x34, 0x56, 0x78 }},
3611 
3612       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3613       {"",
3614        { 0x22 }},
3615        // largest acked
3616        {"Unable to read largest acked.",
3617         { kVarInt62TwoBytes + 0x12, 0x34 }},   // = 4660
3618        // Zero delta time.
3619        {"Unable to read ack delay time.",
3620         { kVarInt62OneByte + 0x00 }},
3621        // number of additional ack blocks
3622        {"Unable to read ack block count.",
3623         { kVarInt62OneByte + 0x00 }},
3624        // first ack block length.
3625        {"Unable to read first ack block length.",
3626         { kVarInt62OneByte + 0x00 }},  // 1st block length = 1
3627 
3628        // Receive Timestamps.
3629        { "Unable to read receive timestamp range count.",
3630          { kVarInt62OneByte + 0x01 }},
3631        { "Unable to read receive timestamp gap.",
3632          { kVarInt62OneByte + 0x02 }},
3633        { "Unable to read receive timestamp count.",
3634          { kVarInt62OneByte + 0x02 }},
3635        { "Unable to read receive timestamp delta.",
3636          { kVarInt62OneByte + 0x0a}},
3637        { "Unable to read receive timestamp delta.",
3638          { kVarInt62OneByte + 0x0b}},
3639   };
3640   // clang-format on
3641 
3642   std::unique_ptr<QuicEncryptedPacket> encrypted(
3643       AssemblePacketFromFragments(packet_ietf));
3644 
3645   framer_.set_process_timestamps(true);
3646   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3647   EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3648                                "Receive timestamp delta too high."));
3649 }
3650 
TEST_P(QuicFramerTest,AckFrameReceiveTimestampDeltaTooHigh)3651 TEST_P(QuicFramerTest, AckFrameReceiveTimestampDeltaTooHigh) {
3652   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3653     return;
3654   }
3655   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3656   // clang-format off
3657   PacketFragments packet_ietf = {
3658       // type (short header, 4 byte packet number)
3659       {"",
3660        { 0x43 }},
3661       // connection_id
3662       {"",
3663        { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3664       // packet number
3665       {"",
3666        { 0x12, 0x34, 0x56, 0x78 }},
3667 
3668       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3669       {"",
3670        { 0x22 }},
3671        // largest acked
3672        {"Unable to read largest acked.",
3673         { kVarInt62TwoBytes + 0x12, 0x34 }},   // = 4660
3674        // Zero delta time.
3675        {"Unable to read ack delay time.",
3676         { kVarInt62OneByte + 0x00 }},
3677        // number of additional ack blocks
3678        {"Unable to read ack block count.",
3679         { kVarInt62OneByte + 0x00 }},
3680        // first ack block length.
3681        {"Unable to read first ack block length.",
3682         { kVarInt62OneByte + 0x00 }},  // 1st block length = 1
3683 
3684        // Receive Timestamps.
3685        { "Unable to read receive timestamp range count.",
3686          { kVarInt62OneByte + 0x01 }},
3687        { "Unable to read receive timestamp gap.",
3688          { kVarInt62OneByte + 0x02 }},
3689        { "Unable to read receive timestamp count.",
3690          { kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77 }},
3691        { "Unable to read receive timestamp delta.",
3692          { kVarInt62TwoBytes + 0x29, 0xff}},
3693   };
3694   // clang-format on
3695 
3696   std::unique_ptr<QuicEncryptedPacket> encrypted(
3697       AssemblePacketFromFragments(packet_ietf));
3698 
3699   framer_.set_process_timestamps(true);
3700   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3701   EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3702                                "Receive timestamp count too high."));
3703 }
3704 
TEST_P(QuicFramerTest,AckFrameTimeStampDeltaTooHigh)3705 TEST_P(QuicFramerTest, AckFrameTimeStampDeltaTooHigh) {
3706   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3707   // clang-format off
3708   unsigned char packet[] = {
3709       // type (short header, 4 byte packet number)
3710       0x43,
3711       // connection_id
3712       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3713       // packet number
3714       0x12, 0x34, 0x56, 0x78,
3715 
3716       // frame type (ack frame)
3717       // (no ack blocks, 1 byte largest observed, 1 byte block length)
3718       0x40,
3719       // largest acked
3720       0x01,
3721       // Zero delta time.
3722       0x00, 0x00,
3723       // first ack block length.
3724       0x01,
3725       // num timestamps.
3726       0x01,
3727       // Delta from largest observed.
3728       0x01,
3729       // Delta time.
3730       0x10, 0x32, 0x54, 0x76,
3731   };
3732   // clang-format on
3733   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3734     // ACK Timestamp is not a feature of IETF QUIC.
3735     return;
3736   }
3737   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
3738   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
3739   EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3740                                "delta_from_largest_observed too high"));
3741 }
3742 
TEST_P(QuicFramerTest,AckFrameTimeStampSecondDeltaTooHigh)3743 TEST_P(QuicFramerTest, AckFrameTimeStampSecondDeltaTooHigh) {
3744   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3745   // clang-format off
3746   unsigned char packet[] = {
3747       // type (short header, 4 byte packet number)
3748       0x43,
3749       // connection_id
3750       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3751       // packet number
3752       0x12, 0x34, 0x56, 0x78,
3753 
3754       // frame type (ack frame)
3755       // (no ack blocks, 1 byte largest observed, 1 byte block length)
3756       0x40,
3757       // largest acked
3758       0x03,
3759       // Zero delta time.
3760       0x00, 0x00,
3761       // first ack block length.
3762       0x03,
3763       // num timestamps.
3764       0x02,
3765       // Delta from largest observed.
3766       0x01,
3767       // Delta time.
3768       0x10, 0x32, 0x54, 0x76,
3769       // Delta from largest observed.
3770       0x03,
3771       // Delta time.
3772       0x10, 0x32,
3773   };
3774   // clang-format on
3775   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3776     // ACK Timestamp is not a feature of IETF QUIC.
3777     return;
3778   }
3779   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
3780   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
3781   EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3782                                "delta_from_largest_observed too high"));
3783 }
3784 
TEST_P(QuicFramerTest,NewStopWaitingFrame)3785 TEST_P(QuicFramerTest, NewStopWaitingFrame) {
3786   if (VersionHasIetfQuicFrames(version_.transport_version)) {
3787     // The Stop Waiting frame is not in IETF QUIC
3788     return;
3789   }
3790   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3791   // clang-format off
3792   PacketFragments packet = {
3793       // type (short header, 4 byte packet number)
3794       {"",
3795        {0x43}},
3796       // connection_id
3797       {"",
3798        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3799       // packet number
3800       {"",
3801        {0x12, 0x34, 0x56, 0x78}},
3802       // frame type (stop waiting frame)
3803       {"",
3804        {0x06}},
3805       // least packet number awaiting an ack, delta from packet number.
3806       {"Unable to read least unacked delta.",
3807         {0x00, 0x00, 0x00, 0x08}}
3808   };
3809   // clang-format on
3810 
3811   std::unique_ptr<QuicEncryptedPacket> encrypted(
3812       AssemblePacketFromFragments(packet));
3813 
3814   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3815   EXPECT_THAT(framer_.error(), IsQuicNoError());
3816   ASSERT_TRUE(visitor_.header_.get());
3817   EXPECT_TRUE(CheckDecryption(
3818       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3819       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3820 
3821   EXPECT_EQ(0u, visitor_.stream_frames_.size());
3822   ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size());
3823   const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0];
3824   EXPECT_EQ(kLeastUnacked, frame.least_unacked);
3825 
3826   CheckFramingBoundaries(packet, QUIC_INVALID_STOP_WAITING_DATA);
3827 }
3828 
TEST_P(QuicFramerTest,InvalidNewStopWaitingFrame)3829 TEST_P(QuicFramerTest, InvalidNewStopWaitingFrame) {
3830   // The Stop Waiting frame is not in IETF QUIC
3831   if (VersionHasIetfQuicFrames(version_.transport_version)) {
3832     return;
3833   }
3834   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3835   // clang-format off
3836   unsigned char packet[] = {
3837     // type (short header, 4 byte packet number)
3838     0x43,
3839     // connection_id
3840     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3841     // packet number
3842     0x12, 0x34, 0x56, 0x78,
3843     // frame type (stop waiting frame)
3844     0x06,
3845     // least packet number awaiting an ack, delta from packet number.
3846     0x57, 0x78, 0x9A, 0xA8,
3847   };
3848   // clang-format on
3849 
3850   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
3851   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
3852   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_STOP_WAITING_DATA));
3853   EXPECT_EQ("Invalid unacked delta.", framer_.detailed_error());
3854 }
3855 
TEST_P(QuicFramerTest,RstStreamFrame)3856 TEST_P(QuicFramerTest, RstStreamFrame) {
3857   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3858   // clang-format off
3859   PacketFragments packet = {
3860       // type (short header, 4 byte packet number)
3861       {"",
3862        {0x43}},
3863       // connection_id
3864       {"",
3865        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3866       // packet number
3867       {"",
3868        {0x12, 0x34, 0x56, 0x78}},
3869       // frame type (rst stream frame)
3870       {"",
3871        {0x01}},
3872       // stream id
3873       {"Unable to read stream_id.",
3874        {0x01, 0x02, 0x03, 0x04}},
3875       // sent byte offset
3876       {"Unable to read rst stream sent byte offset.",
3877        {0x3A, 0x98, 0xFE, 0xDC,
3878         0x32, 0x10, 0x76, 0x54}},
3879       // error code QUIC_STREAM_CANCELLED
3880       {"Unable to read rst stream error code.",
3881        {0x00, 0x00, 0x00, 0x06}}
3882   };
3883 
3884   PacketFragments packet_ietf = {
3885       // type (short header, 4 byte packet number)
3886       {"",
3887        {0x43}},
3888       // connection_id
3889       {"",
3890        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3891       // packet number
3892       {"",
3893        {0x12, 0x34, 0x56, 0x78}},
3894       // frame type (IETF_RST_STREAM frame)
3895       {"",
3896        {0x04}},
3897       // stream id
3898       {"Unable to read IETF_RST_STREAM frame stream id/count.",
3899        {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
3900       // application error code H3_REQUEST_CANCELLED gets translated to
3901       // QuicRstStreamErrorCode::QUIC_STREAM_CANCELLED.
3902       {"Unable to read rst stream error code.",
3903        {kVarInt62TwoBytes + 0x01, 0x0c}},
3904       // Final Offset
3905       {"Unable to read rst stream sent byte offset.",
3906        {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}}
3907   };
3908   // clang-format on
3909 
3910   PacketFragments& fragments =
3911       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
3912                                                             : packet;
3913   std::unique_ptr<QuicEncryptedPacket> encrypted(
3914       AssemblePacketFromFragments(fragments));
3915   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3916 
3917   EXPECT_THAT(framer_.error(), IsQuicNoError());
3918   ASSERT_TRUE(visitor_.header_.get());
3919   EXPECT_TRUE(CheckDecryption(
3920       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3921       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3922 
3923   EXPECT_EQ(kStreamId, visitor_.rst_stream_frame_.stream_id);
3924   EXPECT_EQ(QUIC_STREAM_CANCELLED, visitor_.rst_stream_frame_.error_code);
3925   EXPECT_EQ(kStreamOffset, visitor_.rst_stream_frame_.byte_offset);
3926   CheckFramingBoundaries(fragments, QUIC_INVALID_RST_STREAM_DATA);
3927 }
3928 
TEST_P(QuicFramerTest,ConnectionCloseFrame)3929 TEST_P(QuicFramerTest, ConnectionCloseFrame) {
3930   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3931   // clang-format off
3932   PacketFragments packet = {
3933       // type (short header, 4 byte packet number)
3934       {"",
3935        {0x43}},
3936       // connection_id
3937       {"",
3938        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3939       // packet number
3940       {"",
3941        {0x12, 0x34, 0x56, 0x78}},
3942       // frame type (connection close frame)
3943       {"",
3944        {0x02}},
3945       // error code
3946       {"Unable to read connection close error code.",
3947        {0x00, 0x00, 0x00, 0x11}},
3948       {"Unable to read connection close error details.",
3949        {
3950          // error details length
3951          0x0, 0x0d,
3952          // error details
3953          'b',  'e',  'c',  'a',
3954          'u',  's',  'e',  ' ',
3955          'I',  ' ',  'c',  'a',
3956          'n'}
3957       }
3958   };
3959 
3960   PacketFragments packet_ietf = {
3961       // type (short header, 4 byte packet number)
3962       {"",
3963        {0x43}},
3964       // connection_id
3965       {"",
3966        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3967       // packet number
3968       {"",
3969        {0x12, 0x34, 0x56, 0x78}},
3970       // frame type (IETF Transport CONNECTION_CLOSE frame)
3971       {"",
3972        {0x1c}},
3973       // error code
3974       {"Unable to read connection close error code.",
3975        {kVarInt62TwoBytes + 0x00, 0x11}},
3976       {"Unable to read connection close frame type.",
3977        {kVarInt62TwoBytes + 0x12, 0x34 }},
3978       {"Unable to read connection close error details.",
3979        {
3980          // error details length
3981          kVarInt62OneByte + 0x11,
3982          // error details with QuicErrorCode serialized
3983          '1',  '1',  '5',  ':',
3984          'b',  'e',  'c',  'a',
3985          'u',  's',  'e',  ' ',
3986          'I',  ' ',  'c',  'a',
3987          'n'}
3988       }
3989   };
3990   // clang-format on
3991 
3992   PacketFragments& fragments =
3993       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
3994                                                             : packet;
3995   std::unique_ptr<QuicEncryptedPacket> encrypted(
3996       AssemblePacketFromFragments(fragments));
3997   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3998 
3999   EXPECT_THAT(framer_.error(), IsQuicNoError());
4000   ASSERT_TRUE(visitor_.header_.get());
4001   EXPECT_TRUE(CheckDecryption(
4002       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4003       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4004 
4005   EXPECT_EQ(0u, visitor_.stream_frames_.size());
4006   EXPECT_EQ(0x11u, static_cast<unsigned>(
4007                        visitor_.connection_close_frame_.wire_error_code));
4008   EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4009   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4010     EXPECT_EQ(0x1234u,
4011               visitor_.connection_close_frame_.transport_close_frame_type);
4012     EXPECT_EQ(115u, visitor_.connection_close_frame_.quic_error_code);
4013   } else {
4014     // For Google QUIC frame, |quic_error_code| and |wire_error_code| has the
4015     // same value.
4016     EXPECT_EQ(0x11u, static_cast<unsigned>(
4017                          visitor_.connection_close_frame_.quic_error_code));
4018   }
4019 
4020   ASSERT_EQ(0u, visitor_.ack_frames_.size());
4021 
4022   CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4023 }
4024 
TEST_P(QuicFramerTest,ConnectionCloseFrameWithUnknownErrorCode)4025 TEST_P(QuicFramerTest, ConnectionCloseFrameWithUnknownErrorCode) {
4026   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4027   // clang-format off
4028   PacketFragments packet = {
4029       // type (short header, 4 byte packet number)
4030       {"",
4031        {0x43}},
4032       // connection_id
4033       {"",
4034        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4035       // packet number
4036       {"",
4037        {0x12, 0x34, 0x56, 0x78}},
4038       // frame type (connection close frame)
4039       {"",
4040        {0x02}},
4041       // error code larger than QUIC_LAST_ERROR
4042       {"Unable to read connection close error code.",
4043        {0x00, 0x00, 0xC0, 0xDE}},
4044       {"Unable to read connection close error details.",
4045        {
4046          // error details length
4047          0x0, 0x0d,
4048          // error details
4049          'b',  'e',  'c',  'a',
4050          'u',  's',  'e',  ' ',
4051          'I',  ' ',  'c',  'a',
4052          'n'}
4053       }
4054   };
4055 
4056   PacketFragments packet_ietf = {
4057       // type (short header, 4 byte packet number)
4058       {"",
4059        {0x43}},
4060       // connection_id
4061       {"",
4062        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4063       // packet number
4064       {"",
4065        {0x12, 0x34, 0x56, 0x78}},
4066       // frame type (IETF Transport CONNECTION_CLOSE frame)
4067       {"",
4068        {0x1c}},
4069       // error code
4070       {"Unable to read connection close error code.",
4071        {kVarInt62FourBytes + 0x00, 0x00, 0xC0, 0xDE}},
4072       {"Unable to read connection close frame type.",
4073        {kVarInt62TwoBytes + 0x12, 0x34 }},
4074       {"Unable to read connection close error details.",
4075        {
4076          // error details length
4077          kVarInt62OneByte + 0x11,
4078          // error details with QuicErrorCode larger than QUIC_LAST_ERROR
4079          '8',  '4',  '9',  ':',
4080          'b',  'e',  'c',  'a',
4081          'u',  's',  'e',  ' ',
4082          'I',  ' ',  'c',  'a',
4083          'n'}
4084       }
4085   };
4086   // clang-format on
4087 
4088   PacketFragments& fragments =
4089       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
4090                                                             : packet;
4091   std::unique_ptr<QuicEncryptedPacket> encrypted(
4092       AssemblePacketFromFragments(fragments));
4093   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4094 
4095   EXPECT_THAT(framer_.error(), IsQuicNoError());
4096   ASSERT_TRUE(visitor_.header_.get());
4097   EXPECT_TRUE(CheckDecryption(
4098       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4099       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4100 
4101   EXPECT_EQ(0u, visitor_.stream_frames_.size());
4102   EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4103   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4104     EXPECT_EQ(0x1234u,
4105               visitor_.connection_close_frame_.transport_close_frame_type);
4106     EXPECT_EQ(0xC0DEu, visitor_.connection_close_frame_.wire_error_code);
4107     EXPECT_EQ(849u, visitor_.connection_close_frame_.quic_error_code);
4108   } else {
4109     // For Google QUIC frame, |quic_error_code| and |wire_error_code| has the
4110     // same value.
4111     EXPECT_EQ(0xC0DEu, visitor_.connection_close_frame_.wire_error_code);
4112     EXPECT_EQ(0xC0DEu, visitor_.connection_close_frame_.quic_error_code);
4113   }
4114 
4115   ASSERT_EQ(0u, visitor_.ack_frames_.size());
4116 
4117   CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4118 }
4119 
4120 // As above, but checks that for Google-QUIC, if there happens
4121 // to be an ErrorCode string at the start of the details, it is
4122 // NOT extracted/parsed/folded/spindled/and/mutilated.
TEST_P(QuicFramerTest,ConnectionCloseFrameWithExtractedInfoIgnoreGCuic)4123 TEST_P(QuicFramerTest, ConnectionCloseFrameWithExtractedInfoIgnoreGCuic) {
4124   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4125 
4126   // clang-format off
4127   PacketFragments packet = {
4128     // type (short header, 4 byte packet number)
4129     {"",
4130      {0x43}},
4131     // connection_id
4132     {"",
4133      {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4134     // packet number
4135     {"",
4136      {0x12, 0x34, 0x56, 0x78}},
4137     // frame type (connection close frame)
4138     {"",
4139      {0x02}},
4140     // error code
4141     {"Unable to read connection close error code.",
4142      {0x00, 0x00, 0x00, 0x11}},
4143     {"Unable to read connection close error details.",
4144      {
4145        // error details length
4146        0x0, 0x13,
4147        // error details
4148       '1',  '7',  '7',  '6',
4149       '7',  ':',  'b',  'e',
4150       'c',  'a',  'u',  's',
4151       'e',  ' ',  'I',  ' ',
4152       'c',  'a',  'n'}
4153     }
4154   };
4155 
4156   PacketFragments packet_ietf = {
4157     // type (short header, 4 byte packet number)
4158     {"",
4159      {0x43}},
4160     // connection_id
4161     {"",
4162      {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4163     // packet number
4164     {"",
4165      {0x12, 0x34, 0x56, 0x78}},
4166     // frame type (IETF Transport CONNECTION_CLOSE frame)
4167     {"",
4168      {0x1c}},
4169     // error code
4170     {"Unable to read connection close error code.",
4171      {kVarInt62OneByte + 0x11}},
4172     {"Unable to read connection close frame type.",
4173      {kVarInt62TwoBytes + 0x12, 0x34 }},
4174     {"Unable to read connection close error details.",
4175      {
4176        // error details length
4177        kVarInt62OneByte + 0x13,
4178        // error details
4179       '1',  '7',  '7',  '6',
4180       '7',  ':',  'b',  'e',
4181       'c',  'a',  'u',  's',
4182       'e',  ' ',  'I',  ' ',
4183       'c',  'a',  'n'}
4184     }
4185   };
4186   // clang-format on
4187 
4188   PacketFragments& fragments =
4189       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
4190                                                             : packet;
4191   std::unique_ptr<QuicEncryptedPacket> encrypted(
4192       AssemblePacketFromFragments(fragments));
4193   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4194 
4195   EXPECT_THAT(framer_.error(), IsQuicNoError());
4196   ASSERT_TRUE(visitor_.header_.get());
4197   EXPECT_TRUE(CheckDecryption(
4198       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4199       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4200 
4201   EXPECT_EQ(0u, visitor_.stream_frames_.size());
4202   EXPECT_EQ(0x11u, static_cast<unsigned>(
4203                        visitor_.connection_close_frame_.wire_error_code));
4204 
4205   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4206     EXPECT_EQ(0x1234u,
4207               visitor_.connection_close_frame_.transport_close_frame_type);
4208     EXPECT_EQ(17767u, visitor_.connection_close_frame_.quic_error_code);
4209     EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4210   } else {
4211     EXPECT_EQ(0x11u, visitor_.connection_close_frame_.quic_error_code);
4212     // Error code is not prepended in GQUIC, so it is not removed and should
4213     // remain in the reason phrase.
4214     EXPECT_EQ("17767:because I can",
4215               visitor_.connection_close_frame_.error_details);
4216   }
4217 
4218   ASSERT_EQ(0u, visitor_.ack_frames_.size());
4219 
4220   CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4221 }
4222 
4223 // Test the CONNECTION_CLOSE/Application variant.
TEST_P(QuicFramerTest,ApplicationCloseFrame)4224 TEST_P(QuicFramerTest, ApplicationCloseFrame) {
4225   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4226     // This frame is only in IETF QUIC.
4227     return;
4228   }
4229   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4230 
4231   // clang-format off
4232   PacketFragments packet_ietf = {
4233       // type (short header, 4 byte packet number)
4234       {"",
4235        {0x43}},
4236       // connection_id
4237       {"",
4238        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4239       // packet number
4240       {"",
4241        {0x12, 0x34, 0x56, 0x78}},
4242       // frame type (IETF_CONNECTION_CLOSE/Application frame)
4243       {"",
4244        {0x1d}},
4245       // error code
4246       {"Unable to read connection close error code.",
4247        {kVarInt62TwoBytes + 0x00, 0x11}},
4248       {"Unable to read connection close error details.",
4249        {
4250          // error details length
4251          kVarInt62OneByte + 0x0d,
4252          // error details
4253          'b',  'e',  'c',  'a',
4254          'u',  's',  'e',  ' ',
4255          'I',  ' ',  'c',  'a',
4256          'n'}
4257       }
4258   };
4259   // clang-format on
4260 
4261   std::unique_ptr<QuicEncryptedPacket> encrypted(
4262       AssemblePacketFromFragments(packet_ietf));
4263   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4264 
4265   EXPECT_THAT(framer_.error(), IsQuicNoError());
4266   ASSERT_TRUE(visitor_.header_.get());
4267   EXPECT_TRUE(CheckDecryption(
4268       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4269       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4270 
4271   EXPECT_EQ(0u, visitor_.stream_frames_.size());
4272 
4273   EXPECT_EQ(IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
4274             visitor_.connection_close_frame_.close_type);
4275   EXPECT_EQ(122u, visitor_.connection_close_frame_.quic_error_code);
4276   EXPECT_EQ(0x11u, visitor_.connection_close_frame_.wire_error_code);
4277   EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4278 
4279   ASSERT_EQ(0u, visitor_.ack_frames_.size());
4280 
4281   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4282 }
4283 
4284 // Check that we can extract an error code from an application close.
TEST_P(QuicFramerTest,ApplicationCloseFrameExtract)4285 TEST_P(QuicFramerTest, ApplicationCloseFrameExtract) {
4286   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4287     // This frame is only in IETF QUIC.
4288     return;
4289   }
4290   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4291 
4292   // clang-format off
4293   PacketFragments packet_ietf = {
4294       // type (short header, 4 byte packet number)
4295       {"",
4296        {0x43}},
4297       // connection_id
4298       {"",
4299        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4300       // packet number
4301       {"",
4302        {0x12, 0x34, 0x56, 0x78}},
4303       // frame type (IETF_CONNECTION_CLOSE/Application frame)
4304       {"",
4305        {0x1d}},
4306       // error code
4307       {"Unable to read connection close error code.",
4308        {kVarInt62OneByte + 0x11}},
4309       {"Unable to read connection close error details.",
4310        {
4311        // error details length
4312        kVarInt62OneByte + 0x13,
4313        // error details
4314        '1',  '7',  '7',  '6',
4315        '7',  ':',  'b',  'e',
4316        'c',  'a',  'u',  's',
4317        'e',  ' ',  'I',  ' ',
4318        'c',  'a',  'n'}
4319       }
4320   };
4321   // clang-format on
4322 
4323   std::unique_ptr<QuicEncryptedPacket> encrypted(
4324       AssemblePacketFromFragments(packet_ietf));
4325   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4326 
4327   EXPECT_THAT(framer_.error(), IsQuicNoError());
4328   ASSERT_TRUE(visitor_.header_.get());
4329   EXPECT_TRUE(CheckDecryption(
4330       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4331       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4332 
4333   EXPECT_EQ(0u, visitor_.stream_frames_.size());
4334 
4335   EXPECT_EQ(IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
4336             visitor_.connection_close_frame_.close_type);
4337   EXPECT_EQ(17767u, visitor_.connection_close_frame_.quic_error_code);
4338   EXPECT_EQ(0x11u, visitor_.connection_close_frame_.wire_error_code);
4339   EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4340 
4341   ASSERT_EQ(0u, visitor_.ack_frames_.size());
4342 
4343   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4344 }
4345 
TEST_P(QuicFramerTest,GoAwayFrame)4346 TEST_P(QuicFramerTest, GoAwayFrame) {
4347   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4348     // This frame is not in IETF QUIC.
4349     return;
4350   }
4351   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4352   // clang-format off
4353   PacketFragments packet = {
4354       // type (short header, 4 byte packet number)
4355       {"",
4356        {0x43}},
4357       // connection_id
4358       {"",
4359        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4360       // packet number
4361       {"",
4362        {0x12, 0x34, 0x56, 0x78}},
4363       // frame type (go away frame)
4364       {"",
4365        {0x03}},
4366       // error code
4367       {"Unable to read go away error code.",
4368        {0x00, 0x00, 0x00, 0x09}},
4369       // stream id
4370       {"Unable to read last good stream id.",
4371        {0x01, 0x02, 0x03, 0x04}},
4372       // stream id
4373       {"Unable to read goaway reason.",
4374        {
4375          // error details length
4376          0x0, 0x0d,
4377          // error details
4378          'b',  'e',  'c',  'a',
4379          'u',  's',  'e',  ' ',
4380          'I',  ' ',  'c',  'a',
4381          'n'}
4382       }
4383   };
4384   // clang-format on
4385 
4386   std::unique_ptr<QuicEncryptedPacket> encrypted(
4387       AssemblePacketFromFragments(packet));
4388   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4389 
4390   EXPECT_THAT(framer_.error(), IsQuicNoError());
4391   ASSERT_TRUE(visitor_.header_.get());
4392   EXPECT_TRUE(CheckDecryption(
4393       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4394       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4395 
4396   EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id);
4397   EXPECT_EQ(0x9u, visitor_.goaway_frame_.error_code);
4398   EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase);
4399 
4400   CheckFramingBoundaries(packet, QUIC_INVALID_GOAWAY_DATA);
4401 }
4402 
TEST_P(QuicFramerTest,GoAwayFrameWithUnknownErrorCode)4403 TEST_P(QuicFramerTest, GoAwayFrameWithUnknownErrorCode) {
4404   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4405     // This frame is not in IETF QUIC.
4406     return;
4407   }
4408   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4409   // clang-format off
4410   PacketFragments packet = {
4411       // type (short header, 4 byte packet number)
4412       {"",
4413        {0x43}},
4414       // connection_id
4415       {"",
4416        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4417       // packet number
4418       {"",
4419        {0x12, 0x34, 0x56, 0x78}},
4420       // frame type (go away frame)
4421       {"",
4422        {0x03}},
4423       // error code larger than QUIC_LAST_ERROR
4424       {"Unable to read go away error code.",
4425        {0x00, 0x00, 0xC0, 0xDE}},
4426       // stream id
4427       {"Unable to read last good stream id.",
4428        {0x01, 0x02, 0x03, 0x04}},
4429       // stream id
4430       {"Unable to read goaway reason.",
4431        {
4432          // error details length
4433          0x0, 0x0d,
4434          // error details
4435          'b',  'e',  'c',  'a',
4436          'u',  's',  'e',  ' ',
4437          'I',  ' ',  'c',  'a',
4438          'n'}
4439       }
4440   };
4441   // clang-format on
4442 
4443   std::unique_ptr<QuicEncryptedPacket> encrypted(
4444       AssemblePacketFromFragments(packet));
4445   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4446 
4447   EXPECT_THAT(framer_.error(), IsQuicNoError());
4448   ASSERT_TRUE(visitor_.header_.get());
4449   EXPECT_TRUE(CheckDecryption(
4450       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4451       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4452 
4453   EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id);
4454   EXPECT_EQ(0xC0DE, visitor_.goaway_frame_.error_code);
4455   EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase);
4456 
4457   CheckFramingBoundaries(packet, QUIC_INVALID_GOAWAY_DATA);
4458 }
4459 
TEST_P(QuicFramerTest,WindowUpdateFrame)4460 TEST_P(QuicFramerTest, WindowUpdateFrame) {
4461   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4462     // This frame is not in IETF QUIC, see MaxDataFrame and MaxStreamDataFrame
4463     // for IETF QUIC equivalents.
4464     return;
4465   }
4466   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4467   // clang-format off
4468   PacketFragments packet = {
4469       // type (short header, 4 byte packet number)
4470       {"",
4471        {0x43}},
4472       // connection_id
4473       {"",
4474        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4475       // packet number
4476       {"",
4477        {0x12, 0x34, 0x56, 0x78}},
4478       // frame type (window update frame)
4479       {"",
4480        {0x04}},
4481       // stream id
4482       {"Unable to read stream_id.",
4483        {0x01, 0x02, 0x03, 0x04}},
4484       // byte offset
4485       {"Unable to read window byte_offset.",
4486        {0x3A, 0x98, 0xFE, 0xDC,
4487         0x32, 0x10, 0x76, 0x54}},
4488   };
4489 
4490   // clang-format on
4491 
4492   std::unique_ptr<QuicEncryptedPacket> encrypted(
4493       AssemblePacketFromFragments(packet));
4494   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4495 
4496   EXPECT_THAT(framer_.error(), IsQuicNoError());
4497   ASSERT_TRUE(visitor_.header_.get());
4498   EXPECT_TRUE(CheckDecryption(
4499       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4500       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4501 
4502   EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
4503   EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
4504 
4505   CheckFramingBoundaries(packet, QUIC_INVALID_WINDOW_UPDATE_DATA);
4506 }
4507 
TEST_P(QuicFramerTest,MaxDataFrame)4508 TEST_P(QuicFramerTest, MaxDataFrame) {
4509   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4510     // This frame is available only in IETF QUIC.
4511     return;
4512   }
4513   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4514   // clang-format off
4515   PacketFragments packet_ietf = {
4516       // type (short header, 4 byte packet number)
4517       {"",
4518        {0x43}},
4519       // connection_id
4520       {"",
4521        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4522       // packet number
4523       {"",
4524        {0x12, 0x34, 0x56, 0x78}},
4525       // frame type (IETF_MAX_DATA frame)
4526       {"",
4527        {0x10}},
4528       // byte offset
4529       {"Can not read MAX_DATA byte-offset",
4530        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
4531         0x32, 0x10, 0x76, 0x54}},
4532   };
4533   // clang-format on
4534 
4535   std::unique_ptr<QuicEncryptedPacket> encrypted(
4536       AssemblePacketFromFragments(packet_ietf));
4537   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4538 
4539   EXPECT_THAT(framer_.error(), IsQuicNoError());
4540   ASSERT_TRUE(visitor_.header_.get());
4541   EXPECT_TRUE(CheckDecryption(
4542       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4543       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4544 
4545   EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
4546             visitor_.window_update_frame_.stream_id);
4547   EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
4548 
4549   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_MAX_DATA_FRAME_DATA);
4550 }
4551 
TEST_P(QuicFramerTest,MaxStreamDataFrame)4552 TEST_P(QuicFramerTest, MaxStreamDataFrame) {
4553   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4554     // This frame available only in IETF QUIC.
4555     return;
4556   }
4557   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4558   // clang-format off
4559   PacketFragments packet_ietf = {
4560       // type (short header, 4 byte packet number)
4561       {"",
4562        {0x43}},
4563       // connection_id
4564       {"",
4565        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4566       // packet number
4567       {"",
4568        {0x12, 0x34, 0x56, 0x78}},
4569       // frame type (IETF_MAX_STREAM_DATA frame)
4570       {"",
4571        {0x11}},
4572       // stream id
4573       {"Unable to read IETF_MAX_STREAM_DATA frame stream id/count.",
4574        {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4575       // byte offset
4576       {"Can not read MAX_STREAM_DATA byte-count",
4577        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
4578         0x32, 0x10, 0x76, 0x54}},
4579   };
4580   // clang-format on
4581 
4582   std::unique_ptr<QuicEncryptedPacket> encrypted(
4583       AssemblePacketFromFragments(packet_ietf));
4584   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4585 
4586   EXPECT_THAT(framer_.error(), IsQuicNoError());
4587   ASSERT_TRUE(visitor_.header_.get());
4588   EXPECT_TRUE(CheckDecryption(
4589       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4590       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4591 
4592   EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
4593   EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
4594 
4595   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA);
4596 }
4597 
TEST_P(QuicFramerTest,BlockedFrame)4598 TEST_P(QuicFramerTest, BlockedFrame) {
4599   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4600   // clang-format off
4601   PacketFragments packet = {
4602       // type (short header, 4 byte packet number)
4603       {"",
4604        {0x43}},
4605       // connection_id
4606       {"",
4607        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4608       // packet number
4609       {"",
4610        {0x12, 0x34, 0x56, 0x78}},
4611       // frame type (blocked frame)
4612       {"",
4613        {0x05}},
4614       // stream id
4615       {"Unable to read stream_id.",
4616        {0x01, 0x02, 0x03, 0x04}},
4617   };
4618 
4619   PacketFragments packet_ietf = {
4620       // type (short header, 4 byte packet number)
4621       {"",
4622        {0x43}},
4623       // connection_id
4624       {"",
4625        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4626       // packet number
4627       {"",
4628        {0x12, 0x34, 0x56, 0x78}},
4629       // frame type (IETF_STREAM_BLOCKED frame)
4630       {"",
4631        {0x15}},
4632       // stream id
4633       {"Unable to read IETF_STREAM_DATA_BLOCKED frame stream id/count.",
4634        {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4635       // Offset
4636       {"Can not read stream blocked offset.",
4637        {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
4638   };
4639   // clang-format on
4640 
4641   PacketFragments& fragments =
4642       VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
4643                                                             : packet;
4644   std::unique_ptr<QuicEncryptedPacket> encrypted(
4645       AssemblePacketFromFragments(fragments));
4646   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4647 
4648   EXPECT_THAT(framer_.error(), IsQuicNoError());
4649   ASSERT_TRUE(visitor_.header_.get());
4650   EXPECT_TRUE(CheckDecryption(
4651       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4652       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4653 
4654   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4655     EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
4656   } else {
4657     EXPECT_EQ(0u, visitor_.blocked_frame_.offset);
4658   }
4659   EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
4660 
4661   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4662     CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_BLOCKED_DATA);
4663   } else {
4664     CheckFramingBoundaries(fragments, QUIC_INVALID_BLOCKED_DATA);
4665   }
4666 }
4667 
TEST_P(QuicFramerTest,PingFrame)4668 TEST_P(QuicFramerTest, PingFrame) {
4669   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4670   // clang-format off
4671   unsigned char packet[] = {
4672      // type (short header, 4 byte packet number)
4673      0x43,
4674      // connection_id
4675      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4676      // packet number
4677      0x12, 0x34, 0x56, 0x78,
4678 
4679      // frame type
4680      0x07,
4681     };
4682 
4683   unsigned char packet_ietf[] = {
4684      // type (short header, 4 byte packet number)
4685      0x43,
4686      // connection_id
4687      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4688      // packet number
4689      0x12, 0x34, 0x56, 0x78,
4690 
4691      // frame type (IETF_PING frame)
4692      0x01,
4693     };
4694   // clang-format on
4695 
4696   QuicEncryptedPacket encrypted(
4697       AsChars(VersionHasIetfQuicFrames(framer_.transport_version())
4698                   ? packet_ietf
4699                   : packet),
4700       VersionHasIetfQuicFrames(framer_.transport_version())
4701           ? ABSL_ARRAYSIZE(packet_ietf)
4702           : ABSL_ARRAYSIZE(packet),
4703       false);
4704   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4705 
4706   EXPECT_THAT(framer_.error(), IsQuicNoError());
4707   ASSERT_TRUE(visitor_.header_.get());
4708   EXPECT_TRUE(CheckDecryption(
4709       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4710       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4711 
4712   EXPECT_EQ(1u, visitor_.ping_frames_.size());
4713 
4714   // No need to check the PING frame boundaries because it has no payload.
4715 }
4716 
TEST_P(QuicFramerTest,HandshakeDoneFrame)4717 TEST_P(QuicFramerTest, HandshakeDoneFrame) {
4718   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4719   // clang-format off
4720   unsigned char packet[] = {
4721      // type (short header, 4 byte packet number)
4722      0x43,
4723      // connection_id
4724      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4725      // packet number
4726      0x12, 0x34, 0x56, 0x78,
4727 
4728      // frame type (Handshake done frame)
4729      0x1e,
4730     };
4731   // clang-format on
4732 
4733   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4734     return;
4735   }
4736 
4737   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
4738   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4739 
4740   EXPECT_THAT(framer_.error(), IsQuicNoError());
4741   ASSERT_TRUE(visitor_.header_.get());
4742   EXPECT_TRUE(CheckDecryption(
4743       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4744       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4745 
4746   EXPECT_EQ(1u, visitor_.handshake_done_frames_.size());
4747 }
4748 
TEST_P(QuicFramerTest,ParseAckFrequencyFrame)4749 TEST_P(QuicFramerTest, ParseAckFrequencyFrame) {
4750   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4751   // clang-format off
4752   unsigned char packet[] = {
4753      // type (short header, 4 byte packet number)
4754      0x43,
4755      // connection_id
4756      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4757      // packet number
4758      0x12, 0x34, 0x56, 0x78,
4759 
4760      // ack frequency frame type (which needs two bytes as it is > 0x3F)
4761      0x40, 0xAF,
4762      // sequence_number
4763      0x11,
4764      // packet_tolerance
4765      0x02,
4766      // max_ack_delay_us = 2'5000 us
4767      0x80, 0x00, 0x61, 0xA8,
4768      // ignore_order
4769      0x01
4770   };
4771   // clang-format on
4772 
4773   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4774     return;
4775   }
4776 
4777   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
4778   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4779 
4780   EXPECT_THAT(framer_.error(), IsQuicNoError());
4781   ASSERT_TRUE(visitor_.header_.get());
4782   EXPECT_TRUE(CheckDecryption(
4783       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4784       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4785 
4786   ASSERT_EQ(1u, visitor_.ack_frequency_frames_.size());
4787   const auto& frame = visitor_.ack_frequency_frames_.front();
4788   EXPECT_EQ(17u, frame->sequence_number);
4789   EXPECT_EQ(2u, frame->packet_tolerance);
4790   EXPECT_EQ(2'5000u, frame->max_ack_delay.ToMicroseconds());
4791   EXPECT_EQ(true, frame->ignore_order);
4792 }
4793 
TEST_P(QuicFramerTest,MessageFrame)4794 TEST_P(QuicFramerTest, MessageFrame) {
4795   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4796   // clang-format off
4797   PacketFragments packet = {
4798        // type (short header, 4 byte packet number)
4799        {"",
4800         {0x43}},
4801        // connection_id
4802        {"",
4803         {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4804        // packet number
4805        {"",
4806         {0x12, 0x34, 0x56, 0x78}},
4807        // message frame type.
4808        {"",
4809         { 0x21 }},
4810        // message length
4811        {"Unable to read message length",
4812         {0x07}},
4813        // message data
4814        {"Unable to read message data",
4815         {'m', 'e', 's', 's', 'a', 'g', 'e'}},
4816         // message frame no length.
4817         {"",
4818          { 0x20 }},
4819         // message data
4820         {{},
4821          {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
4822    };
4823   PacketFragments packet_ietf = {
4824        // type (short header, 4 byte packet number)
4825        {"",
4826         {0x43}},
4827        // connection_id
4828        {"",
4829         {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4830        // packet number
4831        {"",
4832         {0x12, 0x34, 0x56, 0x78}},
4833        // message frame type.
4834        {"",
4835         { 0x31 }},
4836        // message length
4837        {"Unable to read message length",
4838         {0x07}},
4839        // message data
4840        {"Unable to read message data",
4841         {'m', 'e', 's', 's', 'a', 'g', 'e'}},
4842         // message frame no length.
4843         {"",
4844          { 0x30 }},
4845         // message data
4846         {{},
4847          {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
4848    };
4849   // clang-format on
4850 
4851   std::unique_ptr<QuicEncryptedPacket> encrypted;
4852   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4853     encrypted = AssemblePacketFromFragments(packet_ietf);
4854   } else {
4855     encrypted = AssemblePacketFromFragments(packet);
4856   }
4857   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4858 
4859   EXPECT_THAT(framer_.error(), IsQuicNoError());
4860   ASSERT_TRUE(visitor_.header_.get());
4861   EXPECT_TRUE(CheckDecryption(
4862       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4863       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4864 
4865   ASSERT_EQ(2u, visitor_.message_frames_.size());
4866   EXPECT_EQ(7u, visitor_.message_frames_[0]->message_length);
4867   EXPECT_EQ(8u, visitor_.message_frames_[1]->message_length);
4868 
4869   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4870     CheckFramingBoundaries(packet_ietf, QUIC_INVALID_MESSAGE_DATA);
4871   } else {
4872     CheckFramingBoundaries(packet, QUIC_INVALID_MESSAGE_DATA);
4873   }
4874 }
4875 
TEST_P(QuicFramerTest,IetfStatelessResetPacket)4876 TEST_P(QuicFramerTest, IetfStatelessResetPacket) {
4877   // clang-format off
4878   unsigned char packet[] = {
4879       // type (short packet, 1 byte packet number)
4880       0x50,
4881       // Random bytes
4882       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4883       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4884       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4885       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4886       // stateless reset token
4887       0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
4888       0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
4889   };
4890   // clang-format on
4891   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
4892   QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
4893                                                       TestConnectionId(0x33));
4894   decrypter_ = new test::TestDecrypter();
4895   if (framer_.version().KnowsWhichDecrypterToUse()) {
4896     framer_.InstallDecrypter(
4897         ENCRYPTION_INITIAL,
4898         std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
4899     framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
4900                              std::unique_ptr<QuicDecrypter>(decrypter_));
4901   } else {
4902     framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
4903                                                  Perspective::IS_CLIENT));
4904     framer_.SetAlternativeDecrypter(
4905         ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
4906   }
4907   // This packet cannot be decrypted because diversification nonce is missing.
4908   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
4909   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4910   ASSERT_THAT(framer_.error(), IsQuicNoError());
4911   ASSERT_TRUE(visitor_.stateless_reset_packet_.get());
4912   EXPECT_EQ(kTestStatelessResetToken,
4913             visitor_.stateless_reset_packet_->stateless_reset_token);
4914 }
4915 
TEST_P(QuicFramerTest,IetfStatelessResetPacketInvalidStatelessResetToken)4916 TEST_P(QuicFramerTest, IetfStatelessResetPacketInvalidStatelessResetToken) {
4917   // clang-format off
4918   unsigned char packet[] = {
4919       // type (short packet, 1 byte packet number)
4920       0x50,
4921       // Random bytes
4922       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4923       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4924       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4925       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4926       // stateless reset token
4927       0xB6, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
4928       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4929   };
4930   // clang-format on
4931   QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
4932                                                       TestConnectionId(0x33));
4933   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
4934   decrypter_ = new test::TestDecrypter();
4935   if (framer_.version().KnowsWhichDecrypterToUse()) {
4936     framer_.InstallDecrypter(
4937         ENCRYPTION_INITIAL,
4938         std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
4939     framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
4940                              std::unique_ptr<QuicDecrypter>(decrypter_));
4941   } else {
4942     framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
4943                                                  Perspective::IS_CLIENT));
4944     framer_.SetAlternativeDecrypter(
4945         ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
4946   }
4947   // This packet cannot be decrypted because diversification nonce is missing.
4948   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
4949   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
4950   EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
4951   ASSERT_FALSE(visitor_.stateless_reset_packet_);
4952 }
4953 
TEST_P(QuicFramerTest,VersionNegotiationPacketClient)4954 TEST_P(QuicFramerTest, VersionNegotiationPacketClient) {
4955   // clang-format off
4956   PacketFragments packet = {
4957       // type (long header)
4958       {"",
4959        {0x8F}},
4960       // version tag
4961       {"",
4962        {0x00, 0x00, 0x00, 0x00}},
4963       {"",
4964        {0x05}},
4965       // connection_id
4966       {"",
4967        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4968       // Supported versions
4969       {"Unable to read supported version in negotiation.",
4970        {QUIC_VERSION_BYTES,
4971         'Q', '2', '.', '0'}},
4972   };
4973 
4974   PacketFragments packet49 = {
4975       // type (long header)
4976       {"",
4977        {0x8F}},
4978       // version tag
4979       {"",
4980        {0x00, 0x00, 0x00, 0x00}},
4981       {"",
4982        {0x08}},
4983       // connection_id
4984       {"",
4985        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4986       {"",
4987        {0x00}},
4988       // Supported versions
4989       {"Unable to read supported version in negotiation.",
4990        {QUIC_VERSION_BYTES,
4991         'Q', '2', '.', '0'}},
4992   };
4993   // clang-format on
4994 
4995   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
4996 
4997   PacketFragments& fragments =
4998       framer_.version().HasLongHeaderLengths() ? packet49 : packet;
4999   std::unique_ptr<QuicEncryptedPacket> encrypted(
5000       AssemblePacketFromFragments(fragments));
5001   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5002   ASSERT_THAT(framer_.error(), IsQuicNoError());
5003   ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
5004   EXPECT_EQ(1u, visitor_.version_negotiation_packet_->versions.size());
5005   EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]);
5006 
5007   // Remove the last version from the packet so that every truncated
5008   // version of the packet is invalid, otherwise checking boundaries
5009   // is annoyingly complicated.
5010   for (size_t i = 0; i < 4; ++i) {
5011     fragments.back().fragment.pop_back();
5012   }
5013   CheckFramingBoundaries(fragments, QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
5014 }
5015 
TEST_P(QuicFramerTest,VersionNegotiationPacketServer)5016 TEST_P(QuicFramerTest, VersionNegotiationPacketServer) {
5017   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
5018   // clang-format off
5019   unsigned char packet[] = {
5020       // public flags (long header with all ignored bits set)
5021       0xFF,
5022       // version
5023       0x00, 0x00, 0x00, 0x00,
5024       // connection ID lengths
5025       0x50,
5026       // destination connection ID
5027       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5028       // supported versions
5029       QUIC_VERSION_BYTES,
5030       'Q', '2', '.', '0',
5031   };
5032   unsigned char packet2[] = {
5033       // public flags (long header with all ignored bits set)
5034       0xFF,
5035       // version
5036       0x00, 0x00, 0x00, 0x00,
5037       // destination connection ID length
5038       0x08,
5039       // destination connection ID
5040       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5041       // source connection ID length
5042       0x00,
5043       // supported versions
5044       QUIC_VERSION_BYTES,
5045       'Q', '2', '.', '0',
5046   };
5047   // clang-format on
5048   unsigned char* p = packet;
5049   size_t p_length = ABSL_ARRAYSIZE(packet);
5050   if (framer_.version().HasLengthPrefixedConnectionIds()) {
5051     p = packet2;
5052     p_length = ABSL_ARRAYSIZE(packet2);
5053   }
5054 
5055   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
5056   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5057   EXPECT_THAT(framer_.error(),
5058               IsError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET));
5059   EXPECT_EQ("Server received version negotiation packet.",
5060             framer_.detailed_error());
5061   EXPECT_FALSE(visitor_.version_negotiation_packet_.get());
5062 }
5063 
TEST_P(QuicFramerTest,ParseIetfRetryPacket)5064 TEST_P(QuicFramerTest, ParseIetfRetryPacket) {
5065   if (!framer_.version().SupportsRetry()) {
5066     return;
5067   }
5068   // IETF RETRY is only sent from client to server.
5069   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5070   // clang-format off
5071   unsigned char packet[] = {
5072       // public flags (long header with packet type RETRY and ODCIL=8)
5073       0xF5,
5074       // version
5075       QUIC_VERSION_BYTES,
5076       // connection ID lengths
5077       0x05,
5078       // source connection ID
5079       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5080       // original destination connection ID
5081       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5082       // retry token
5083       'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5084       ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5085   };
5086   unsigned char packet49[] = {
5087       // public flags (long header with packet type RETRY)
5088       0xF0,
5089       // version
5090       QUIC_VERSION_BYTES,
5091       // destination connection ID length
5092       0x00,
5093       // source connection ID length
5094       0x08,
5095       // source connection ID
5096       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5097       // original destination connection ID length
5098       0x08,
5099       // original destination connection ID
5100       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5101       // retry token
5102       'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5103       ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5104   };
5105   unsigned char packet_with_tag[] = {
5106       // public flags (long header with packet type RETRY)
5107       0xF0,
5108       // version
5109       QUIC_VERSION_BYTES,
5110       // destination connection ID length
5111       0x00,
5112       // source connection ID length
5113       0x08,
5114       // source connection ID
5115       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5116       // retry token
5117       'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5118       ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5119       // retry token integrity tag
5120       0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
5121       0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
5122   };
5123   // clang-format on
5124 
5125   unsigned char* p = packet;
5126   size_t p_length = ABSL_ARRAYSIZE(packet);
5127   if (framer_.version().UsesTls()) {
5128     ReviseFirstByteByVersion(packet_with_tag);
5129     p = packet_with_tag;
5130     p_length = ABSL_ARRAYSIZE(packet_with_tag);
5131   } else if (framer_.version().HasLongHeaderLengths()) {
5132     p = packet49;
5133     p_length = ABSL_ARRAYSIZE(packet49);
5134   }
5135   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
5136   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5137 
5138   EXPECT_THAT(framer_.error(), IsQuicNoError());
5139   ASSERT_TRUE(visitor_.header_.get());
5140 
5141   ASSERT_TRUE(visitor_.on_retry_packet_called_);
5142   ASSERT_TRUE(visitor_.retry_new_connection_id_.get());
5143   ASSERT_TRUE(visitor_.retry_token_.get());
5144 
5145   if (framer_.version().UsesTls()) {
5146     ASSERT_TRUE(visitor_.retry_token_integrity_tag_.get());
5147     static const unsigned char expected_integrity_tag[16] = {
5148         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
5149         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
5150     };
5151     quiche::test::CompareCharArraysWithHexError(
5152         "retry integrity tag", visitor_.retry_token_integrity_tag_->data(),
5153         visitor_.retry_token_integrity_tag_->length(),
5154         reinterpret_cast<const char*>(expected_integrity_tag),
5155         ABSL_ARRAYSIZE(expected_integrity_tag));
5156     ASSERT_TRUE(visitor_.retry_without_tag_.get());
5157     quiche::test::CompareCharArraysWithHexError(
5158         "retry without tag", visitor_.retry_without_tag_->data(),
5159         visitor_.retry_without_tag_->length(),
5160         reinterpret_cast<const char*>(packet_with_tag), 35);
5161   } else {
5162     ASSERT_TRUE(visitor_.retry_original_connection_id_.get());
5163     EXPECT_EQ(FramerTestConnectionId(),
5164               *visitor_.retry_original_connection_id_.get());
5165   }
5166 
5167   EXPECT_EQ(FramerTestConnectionIdPlusOne(),
5168             *visitor_.retry_new_connection_id_.get());
5169   EXPECT_EQ("Hello this is RETRY!", *visitor_.retry_token_.get());
5170 
5171   // IETF RETRY is only sent from client to server, the rest of this test
5172   // ensures that the server correctly drops them without acting on them.
5173   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
5174   // Reset our visitor state to default settings.
5175   visitor_.retry_original_connection_id_.reset();
5176   visitor_.retry_new_connection_id_.reset();
5177   visitor_.retry_token_.reset();
5178   visitor_.retry_token_integrity_tag_.reset();
5179   visitor_.retry_without_tag_.reset();
5180   visitor_.on_retry_packet_called_ = false;
5181 
5182   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5183 
5184   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
5185   EXPECT_EQ("Client-initiated RETRY is invalid.", framer_.detailed_error());
5186 
5187   EXPECT_FALSE(visitor_.on_retry_packet_called_);
5188   EXPECT_FALSE(visitor_.retry_new_connection_id_.get());
5189   EXPECT_FALSE(visitor_.retry_token_.get());
5190   EXPECT_FALSE(visitor_.retry_token_integrity_tag_.get());
5191   EXPECT_FALSE(visitor_.retry_without_tag_.get());
5192 }
5193 
TEST_P(QuicFramerTest,BuildPaddingFramePacket)5194 TEST_P(QuicFramerTest, BuildPaddingFramePacket) {
5195   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5196   QuicPacketHeader header;
5197   header.destination_connection_id = FramerTestConnectionId();
5198   header.reset_flag = false;
5199   header.version_flag = false;
5200   header.packet_number = kPacketNumber;
5201 
5202   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5203 
5204   // clang-format off
5205   unsigned char packet[kMaxOutgoingPacketSize] = {
5206     // type (short header, 4 byte packet number)
5207     0x43,
5208     // connection_id
5209     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5210     // packet number
5211     0x12, 0x34, 0x56, 0x78,
5212 
5213     // frame type (padding frame)
5214     0x00,
5215     0x00, 0x00, 0x00, 0x00
5216   };
5217 
5218   unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
5219     // type (short header, 4 byte packet number)
5220     0x43,
5221     // connection_id
5222     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5223     // packet number
5224     0x12, 0x34, 0x56, 0x78,
5225 
5226     // frame type (padding frame)
5227     0x00,
5228     0x00, 0x00, 0x00, 0x00
5229   };
5230   // clang-format on
5231 
5232   unsigned char* p = packet;
5233   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5234     p = packet_ietf;
5235   }
5236 
5237   uint64_t header_size = GetPacketHeaderSize(
5238       framer_.transport_version(), kPacket8ByteConnectionId,
5239       kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
5240       PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
5241       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
5242   memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
5243 
5244   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5245   ASSERT_TRUE(data != nullptr);
5246 
5247   quiche::test::CompareCharArraysWithHexError(
5248       "constructed packet", data->data(), data->length(), AsChars(p),
5249       ABSL_ARRAYSIZE(packet));
5250 }
5251 
TEST_P(QuicFramerTest,BuildStreamFramePacketWithNewPaddingFrame)5252 TEST_P(QuicFramerTest, BuildStreamFramePacketWithNewPaddingFrame) {
5253   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5254   QuicPacketHeader header;
5255   header.destination_connection_id = FramerTestConnectionId();
5256   header.reset_flag = false;
5257   header.version_flag = false;
5258   header.packet_number = kPacketNumber;
5259   QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
5260                                absl::string_view("hello world!"));
5261   QuicPaddingFrame padding_frame(2);
5262   QuicFrames frames = {QuicFrame(padding_frame), QuicFrame(stream_frame),
5263                        QuicFrame(padding_frame)};
5264 
5265   // clang-format off
5266   unsigned char packet[] = {
5267     // type (short header, 4 byte packet number)
5268     0x43,
5269     // connection_id
5270     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5271     // packet number
5272     0x12, 0x34, 0x56, 0x78,
5273 
5274     // paddings
5275     0x00, 0x00,
5276     // frame type (stream frame with fin)
5277     0xFF,
5278     // stream id
5279     0x01, 0x02, 0x03, 0x04,
5280     // offset
5281     0x3A, 0x98, 0xFE, 0xDC,
5282     0x32, 0x10, 0x76, 0x54,
5283     // data length
5284     0x00, 0x0c,
5285     // data
5286     'h',  'e',  'l',  'l',
5287     'o',  ' ',  'w',  'o',
5288     'r',  'l',  'd',  '!',
5289     // paddings
5290     0x00, 0x00,
5291   };
5292 
5293   unsigned char packet_ietf[] = {
5294     // type (short header, 4 byte packet number)
5295     0x43,
5296     // connection_id
5297     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5298     // packet number
5299     0x12, 0x34, 0x56, 0x78,
5300 
5301     // paddings
5302     0x00, 0x00,
5303     // frame type (IETF_STREAM with FIN, LEN, and OFFSET bits set)
5304     0x08 | 0x01 | 0x02 | 0x04,
5305     // stream id
5306     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
5307     // offset
5308     kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5309     0x32, 0x10, 0x76, 0x54,
5310     // data length
5311     kVarInt62OneByte + 0x0c,
5312     // data
5313     'h',  'e',  'l',  'l',
5314     'o',  ' ',  'w',  'o',
5315     'r',  'l',  'd',  '!',
5316     // paddings
5317     0x00, 0x00,
5318   };
5319   // clang-format on
5320 
5321   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5322   ASSERT_TRUE(data != nullptr);
5323 
5324   unsigned char* p = packet;
5325   size_t p_size = ABSL_ARRAYSIZE(packet);
5326   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5327     p = packet_ietf;
5328     p_size = ABSL_ARRAYSIZE(packet_ietf);
5329   }
5330   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
5331 
5332   quiche::test::CompareCharArraysWithHexError(
5333       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
5334 }
5335 
TEST_P(QuicFramerTest,Build4ByteSequenceNumberPaddingFramePacket)5336 TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) {
5337   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5338   QuicPacketHeader header;
5339   header.destination_connection_id = FramerTestConnectionId();
5340   header.reset_flag = false;
5341   header.version_flag = false;
5342   header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
5343   header.packet_number = kPacketNumber;
5344 
5345   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5346 
5347   // clang-format off
5348   unsigned char packet[kMaxOutgoingPacketSize] = {
5349     // type (short header, 4 byte packet number)
5350     0x43,
5351     // connection_id
5352     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5353     // packet number
5354     0x12, 0x34, 0x56, 0x78,
5355 
5356     // frame type (padding frame)
5357     0x00,
5358     0x00, 0x00, 0x00, 0x00
5359   };
5360 
5361   unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
5362     // type (short header, 4 byte packet number)
5363     0x43,
5364     // connection_id
5365     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5366     // packet number
5367     0x12, 0x34, 0x56, 0x78,
5368 
5369     // frame type (padding frame)
5370     0x00,
5371     0x00, 0x00, 0x00, 0x00
5372   };
5373   // clang-format on
5374 
5375   unsigned char* p = packet;
5376   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5377     p = packet_ietf;
5378   }
5379 
5380   uint64_t header_size = GetPacketHeaderSize(
5381       framer_.transport_version(), kPacket8ByteConnectionId,
5382       kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
5383       PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
5384       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
5385   memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
5386 
5387   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5388   ASSERT_TRUE(data != nullptr);
5389 
5390   quiche::test::CompareCharArraysWithHexError(
5391       "constructed packet", data->data(), data->length(), AsChars(p),
5392       ABSL_ARRAYSIZE(packet));
5393 }
5394 
TEST_P(QuicFramerTest,Build2ByteSequenceNumberPaddingFramePacket)5395 TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) {
5396   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5397   QuicPacketHeader header;
5398   header.destination_connection_id = FramerTestConnectionId();
5399   header.reset_flag = false;
5400   header.version_flag = false;
5401   header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
5402   header.packet_number = kPacketNumber;
5403 
5404   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5405 
5406   // clang-format off
5407   unsigned char packet[kMaxOutgoingPacketSize] = {
5408     // type (short header, 2 byte packet number)
5409     0x41,
5410     // connection_id
5411     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5412     // packet number
5413     0x56, 0x78,
5414 
5415     // frame type (padding frame)
5416     0x00,
5417     0x00, 0x00, 0x00, 0x00
5418   };
5419 
5420   unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
5421     // type (short header, 2 byte packet number)
5422     0x41,
5423     // connection_id
5424     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5425     // packet number
5426     0x56, 0x78,
5427 
5428     // frame type (padding frame)
5429     0x00,
5430     0x00, 0x00, 0x00, 0x00
5431   };
5432   // clang-format on
5433 
5434   unsigned char* p = packet;
5435   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5436     p = packet_ietf;
5437   }
5438 
5439   uint64_t header_size = GetPacketHeaderSize(
5440       framer_.transport_version(), kPacket8ByteConnectionId,
5441       kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
5442       PACKET_2BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
5443       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
5444   memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
5445 
5446   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5447   ASSERT_TRUE(data != nullptr);
5448 
5449   quiche::test::CompareCharArraysWithHexError(
5450       "constructed packet", data->data(), data->length(), AsChars(p),
5451       ABSL_ARRAYSIZE(packet));
5452 }
5453 
TEST_P(QuicFramerTest,Build1ByteSequenceNumberPaddingFramePacket)5454 TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) {
5455   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5456   QuicPacketHeader header;
5457   header.destination_connection_id = FramerTestConnectionId();
5458   header.reset_flag = false;
5459   header.version_flag = false;
5460   header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
5461   header.packet_number = kPacketNumber;
5462 
5463   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5464 
5465   // clang-format off
5466   unsigned char packet[kMaxOutgoingPacketSize] = {
5467     // type (short header, 1 byte packet number)
5468     0x40,
5469     // connection_id
5470     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5471     // packet number
5472     0x78,
5473 
5474     // frame type (padding frame)
5475     0x00,
5476     0x00, 0x00, 0x00, 0x00
5477   };
5478 
5479   unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
5480     // type (short header, 1 byte packet number)
5481     0x40,
5482     // connection_id
5483     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5484     // packet number
5485     0x78,
5486 
5487     // frame type (padding frame)
5488     0x00,
5489     0x00, 0x00, 0x00, 0x00
5490   };
5491   // clang-format on
5492 
5493   unsigned char* p = packet;
5494   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5495     p = packet_ietf;
5496   }
5497 
5498   uint64_t header_size = GetPacketHeaderSize(
5499       framer_.transport_version(), kPacket8ByteConnectionId,
5500       kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
5501       PACKET_1BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
5502       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
5503   memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
5504 
5505   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5506   ASSERT_TRUE(data != nullptr);
5507 
5508   quiche::test::CompareCharArraysWithHexError(
5509       "constructed packet", data->data(), data->length(), AsChars(p),
5510       ABSL_ARRAYSIZE(packet));
5511 }
5512 
TEST_P(QuicFramerTest,BuildStreamFramePacket)5513 TEST_P(QuicFramerTest, BuildStreamFramePacket) {
5514   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5515   QuicPacketHeader header;
5516   header.destination_connection_id = FramerTestConnectionId();
5517   header.reset_flag = false;
5518   header.version_flag = false;
5519   header.packet_number = kPacketNumber;
5520   if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
5521     header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
5522   }
5523 
5524   QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
5525                                absl::string_view("hello world!"));
5526 
5527   QuicFrames frames = {QuicFrame(stream_frame)};
5528 
5529   // clang-format off
5530   unsigned char packet[] = {
5531     // type (short header, 4 byte packet number)
5532     0x43,
5533     // connection_id
5534     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5535     // packet number
5536     0x12, 0x34, 0x56, 0x78,
5537 
5538     // frame type (stream frame with fin and no length)
5539     0xDF,
5540     // stream id
5541     0x01, 0x02, 0x03, 0x04,
5542     // offset
5543     0x3A, 0x98, 0xFE, 0xDC,
5544     0x32, 0x10, 0x76, 0x54,
5545     // data
5546     'h',  'e',  'l',  'l',
5547     'o',  ' ',  'w',  'o',
5548     'r',  'l',  'd',  '!',
5549   };
5550 
5551   unsigned char packet_ietf[] = {
5552     // type (short header, 4 byte packet number)
5553     0x43,
5554     // connection_id
5555     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5556     // packet number
5557     0x12, 0x34, 0x56, 0x78,
5558 
5559     // frame type (IETF_STREAM frame with FIN and OFFSET, no length)
5560     0x08 | 0x01 | 0x04,
5561     // stream id
5562     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
5563     // offset
5564     kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5565     0x32, 0x10, 0x76, 0x54,
5566     // data
5567     'h',  'e',  'l',  'l',
5568     'o',  ' ',  'w',  'o',
5569     'r',  'l',  'd',  '!',
5570   };
5571   // clang-format on
5572 
5573   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5574   ASSERT_TRUE(data != nullptr);
5575 
5576   unsigned char* p = packet;
5577   size_t p_size = ABSL_ARRAYSIZE(packet);
5578   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5579     p = packet_ietf;
5580     p_size = ABSL_ARRAYSIZE(packet_ietf);
5581   }
5582   quiche::test::CompareCharArraysWithHexError(
5583       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
5584 }
5585 
TEST_P(QuicFramerTest,BuildStreamFramePacketWithVersionFlag)5586 TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) {
5587   QuicPacketHeader header;
5588   header.destination_connection_id = FramerTestConnectionId();
5589   header.reset_flag = false;
5590   header.version_flag = true;
5591   header.long_packet_type = ZERO_RTT_PROTECTED;
5592   header.packet_number = kPacketNumber;
5593   if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
5594     header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
5595   }
5596 
5597   QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
5598                                absl::string_view("hello world!"));
5599   QuicFrames frames = {QuicFrame(stream_frame)};
5600 
5601   // clang-format off
5602   unsigned char packet[] = {
5603       // type (long header with packet type ZERO_RTT_PROTECTED)
5604       0xD3,
5605       // version tag
5606       QUIC_VERSION_BYTES,
5607       // connection_id length
5608       0x50,
5609       // connection_id
5610       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5611       // packet number
5612       0x12, 0x34, 0x56, 0x78,
5613 
5614       // frame type (stream frame with fin and no length)
5615       0xDF,
5616       // stream id
5617       0x01, 0x02, 0x03, 0x04,
5618       // offset
5619       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
5620       // data
5621       'h',  'e',  'l',  'l',  'o',  ' ',  'w',  'o',  'r', 'l', 'd', '!',
5622   };
5623 
5624   unsigned char packet49[] = {
5625       // type (long header with packet type ZERO_RTT_PROTECTED)
5626       0xD3,
5627       // version tag
5628       QUIC_VERSION_BYTES,
5629       // destination connection ID length
5630       0x08,
5631       // destination connection ID
5632       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5633       // source connection ID length
5634       0x00,
5635       // length
5636       0x40, 0x1D,
5637       // packet number
5638       0x12, 0x34, 0x56, 0x78,
5639 
5640       // frame type (stream frame with fin and no length)
5641       0xDF,
5642       // stream id
5643       0x01, 0x02, 0x03, 0x04,
5644       // offset
5645       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
5646       // data
5647       'h',  'e',  'l',  'l',  'o',  ' ',  'w',  'o',  'r', 'l', 'd', '!',
5648   };
5649 
5650   unsigned char packet_ietf[] = {
5651       // type (long header with packet type ZERO_RTT_PROTECTED)
5652       0xD3,
5653       // version tag
5654       QUIC_VERSION_BYTES,
5655       // destination connection ID length
5656       0x08,
5657       // destination connection ID
5658       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5659       // source connection ID length
5660       0x00,
5661       // length
5662       0x40, 0x1D,
5663       // packet number
5664       0x12, 0x34, 0x56, 0x78,
5665 
5666       // frame type (IETF_STREAM frame with fin and offset, no length)
5667       0x08 | 0x01 | 0x04,
5668       // stream id
5669       kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
5670       // offset
5671       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
5672       // data
5673       'h',  'e',  'l',  'l',  'o',  ' ',  'w',  'o',  'r', 'l', 'd', '!',
5674   };
5675   // clang-format on
5676 
5677   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5678   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5679   ASSERT_TRUE(data != nullptr);
5680 
5681   unsigned char* p = packet;
5682   size_t p_size = ABSL_ARRAYSIZE(packet);
5683   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5684     ReviseFirstByteByVersion(packet_ietf);
5685     p = packet_ietf;
5686     p_size = ABSL_ARRAYSIZE(packet_ietf);
5687   } else if (framer_.version().HasLongHeaderLengths()) {
5688     p = packet49;
5689     p_size = ABSL_ARRAYSIZE(packet49);
5690   }
5691   quiche::test::CompareCharArraysWithHexError(
5692       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
5693 }
5694 
TEST_P(QuicFramerTest,BuildCryptoFramePacket)5695 TEST_P(QuicFramerTest, BuildCryptoFramePacket) {
5696   if (!QuicVersionUsesCryptoFrames(framer_.transport_version())) {
5697     return;
5698   }
5699   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5700   QuicPacketHeader header;
5701   header.destination_connection_id = FramerTestConnectionId();
5702   header.reset_flag = false;
5703   header.version_flag = false;
5704   header.packet_number = kPacketNumber;
5705 
5706   SimpleDataProducer data_producer;
5707   framer_.set_data_producer(&data_producer);
5708 
5709   absl::string_view crypto_frame_contents("hello world!");
5710   QuicCryptoFrame crypto_frame(ENCRYPTION_INITIAL, kStreamOffset,
5711                                crypto_frame_contents.length());
5712   data_producer.SaveCryptoData(ENCRYPTION_INITIAL, kStreamOffset,
5713                                crypto_frame_contents);
5714 
5715   QuicFrames frames = {QuicFrame(&crypto_frame)};
5716 
5717   // clang-format off
5718   unsigned char packet48[] = {
5719     // type (short header, 4 byte packet number)
5720     0x43,
5721     // connection_id
5722     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5723     // packet number
5724     0x12, 0x34, 0x56, 0x78,
5725 
5726     // frame type (QuicFrameType CRYPTO_FRAME)
5727     0x08,
5728     // offset
5729     kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5730     0x32, 0x10, 0x76, 0x54,
5731     // length
5732     kVarInt62OneByte + 12,
5733     // data
5734     'h',  'e',  'l',  'l',
5735     'o',  ' ',  'w',  'o',
5736     'r',  'l',  'd',  '!',
5737   };
5738 
5739   unsigned char packet_ietf[] = {
5740     // type (short header, 4 byte packet number)
5741     0x43,
5742     // connection_id
5743     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5744     // packet number
5745     0x12, 0x34, 0x56, 0x78,
5746 
5747     // frame type (IETF_CRYPTO frame)
5748     0x06,
5749     // offset
5750     kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5751     0x32, 0x10, 0x76, 0x54,
5752     // length
5753     kVarInt62OneByte + 12,
5754     // data
5755     'h',  'e',  'l',  'l',
5756     'o',  ' ',  'w',  'o',
5757     'r',  'l',  'd',  '!',
5758   };
5759   // clang-format on
5760 
5761   unsigned char* packet = packet48;
5762   size_t packet_size = ABSL_ARRAYSIZE(packet48);
5763   if (framer_.version().HasIetfQuicFrames()) {
5764     packet = packet_ietf;
5765     packet_size = ABSL_ARRAYSIZE(packet_ietf);
5766   }
5767 
5768   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5769   ASSERT_TRUE(data != nullptr);
5770   quiche::test::CompareCharArraysWithHexError("constructed packet",
5771                                               data->data(), data->length(),
5772                                               AsChars(packet), packet_size);
5773 }
5774 
TEST_P(QuicFramerTest,CryptoFrame)5775 TEST_P(QuicFramerTest, CryptoFrame) {
5776   if (!QuicVersionUsesCryptoFrames(framer_.transport_version())) {
5777     // CRYPTO frames aren't supported prior to v48.
5778     return;
5779   }
5780   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
5781 
5782   // clang-format off
5783   PacketFragments packet48 = {
5784       // type (short header, 4 byte packet number)
5785       {"",
5786        {0x43}},
5787       // connection_id
5788       {"",
5789        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5790       // packet number
5791       {"",
5792        {0x12, 0x34, 0x56, 0x78}},
5793       // frame type (QuicFrameType CRYPTO_FRAME)
5794       {"",
5795        {0x08}},
5796       // offset
5797       {"",
5798        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5799         0x32, 0x10, 0x76, 0x54}},
5800       // data length
5801       {"Invalid data length.",
5802        {kVarInt62OneByte + 12}},
5803       // data
5804       {"Unable to read frame data.",
5805        {'h',  'e',  'l',  'l',
5806         'o',  ' ',  'w',  'o',
5807         'r',  'l',  'd',  '!'}},
5808   };
5809 
5810   PacketFragments packet_ietf = {
5811       // type (short header, 4 byte packet number)
5812       {"",
5813        {0x43}},
5814       // connection_id
5815       {"",
5816        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5817       // packet number
5818       {"",
5819        {0x12, 0x34, 0x56, 0x78}},
5820       // frame type (IETF_CRYPTO frame)
5821       {"",
5822        {0x06}},
5823       // offset
5824       {"",
5825        {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5826         0x32, 0x10, 0x76, 0x54}},
5827       // data length
5828       {"Invalid data length.",
5829        {kVarInt62OneByte + 12}},
5830       // data
5831       {"Unable to read frame data.",
5832        {'h',  'e',  'l',  'l',
5833         'o',  ' ',  'w',  'o',
5834         'r',  'l',  'd',  '!'}},
5835   };
5836   // clang-format on
5837 
5838   PacketFragments& fragments =
5839       framer_.version().HasIetfQuicFrames() ? packet_ietf : packet48;
5840   std::unique_ptr<QuicEncryptedPacket> encrypted(
5841       AssemblePacketFromFragments(fragments));
5842   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5843 
5844   EXPECT_THAT(framer_.error(), IsQuicNoError());
5845   ASSERT_TRUE(visitor_.header_.get());
5846   EXPECT_TRUE(CheckDecryption(
5847       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5848       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
5849   ASSERT_EQ(1u, visitor_.crypto_frames_.size());
5850   QuicCryptoFrame* frame = visitor_.crypto_frames_[0].get();
5851   EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, frame->level);
5852   EXPECT_EQ(kStreamOffset, frame->offset);
5853   EXPECT_EQ("hello world!",
5854             std::string(frame->data_buffer, frame->data_length));
5855 
5856   CheckFramingBoundaries(fragments, QUIC_INVALID_FRAME_DATA);
5857 }
5858 
TEST_P(QuicFramerTest,BuildOldVersionNegotiationPacket)5859 TEST_P(QuicFramerTest, BuildOldVersionNegotiationPacket) {
5860   SetQuicFlag(quic_disable_version_negotiation_grease_randomness, true);
5861   // clang-format off
5862   unsigned char packet[] = {
5863       // public flags (version, 8 byte connection_id)
5864       0x0D,
5865       // connection_id
5866       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5867       // supported versions
5868       0xDA, 0x5A, 0x3A, 0x3A,
5869       QUIC_VERSION_BYTES,
5870   };
5871   QuicConnectionId connection_id = FramerTestConnectionId();
5872   std::unique_ptr<QuicEncryptedPacket> data(
5873       QuicFramer::BuildVersionNegotiationPacket(
5874           connection_id, EmptyQuicConnectionId(), /*ietf_quic=*/false,
5875           /*use_length_prefix=*/false,
5876           SupportedVersions(GetParam())));
5877   quiche::test::CompareCharArraysWithHexError(
5878       "constructed packet", data->data(), data->length(), AsChars(packet),
5879       ABSL_ARRAYSIZE(packet));
5880 }
5881 
TEST_P(QuicFramerTest,BuildVersionNegotiationPacket)5882 TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) {
5883   SetQuicFlag(quic_disable_version_negotiation_grease_randomness, true);
5884   // clang-format off
5885   unsigned char packet[] = {
5886       // type (long header)
5887       0xC0,
5888       // version tag
5889       0x00, 0x00, 0x00, 0x00,
5890       // connection_id length
5891       0x05,
5892       // connection_id
5893       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5894       // supported versions
5895       0xDA, 0x5A, 0x3A, 0x3A,
5896       QUIC_VERSION_BYTES,
5897   };
5898   unsigned char packet49[] = {
5899       // type (long header)
5900       0xC0,
5901       // version tag
5902       0x00, 0x00, 0x00, 0x00,
5903       // destination connection ID length
5904       0x00,
5905       // source connection ID length
5906       0x08,
5907       // source connection ID
5908       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5909       // supported versions
5910       0xDA, 0x5A, 0x3A, 0x3A,
5911       QUIC_VERSION_BYTES,
5912   };
5913   // clang-format on
5914   unsigned char* p = packet;
5915   size_t p_size = ABSL_ARRAYSIZE(packet);
5916   if (framer_.version().HasLongHeaderLengths()) {
5917     p = packet49;
5918     p_size = ABSL_ARRAYSIZE(packet49);
5919   }
5920 
5921   QuicConnectionId connection_id = FramerTestConnectionId();
5922   std::unique_ptr<QuicEncryptedPacket> data(
5923       QuicFramer::BuildVersionNegotiationPacket(
5924           connection_id, EmptyQuicConnectionId(), /*ietf_quic=*/true,
5925           framer_.version().HasLengthPrefixedConnectionIds(),
5926           SupportedVersions(GetParam())));
5927   quiche::test::CompareCharArraysWithHexError(
5928       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
5929 }
5930 
TEST_P(QuicFramerTest,BuildVersionNegotiationPacketWithClientConnectionId)5931 TEST_P(QuicFramerTest, BuildVersionNegotiationPacketWithClientConnectionId) {
5932   if (!framer_.version().SupportsClientConnectionIds()) {
5933     return;
5934   }
5935 
5936   SetQuicFlag(quic_disable_version_negotiation_grease_randomness, true);
5937 
5938   // clang-format off
5939   unsigned char packet[] = {
5940       // type (long header)
5941       0xC0,
5942       // version tag
5943       0x00, 0x00, 0x00, 0x00,
5944       // client/destination connection ID
5945       0x08,
5946       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5947       // server/source connection ID
5948       0x08,
5949       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5950       // supported versions
5951       0xDA, 0x5A, 0x3A, 0x3A,
5952       QUIC_VERSION_BYTES,
5953   };
5954   // clang-format on
5955 
5956   QuicConnectionId server_connection_id = FramerTestConnectionId();
5957   QuicConnectionId client_connection_id = FramerTestConnectionIdPlusOne();
5958   std::unique_ptr<QuicEncryptedPacket> data(
5959       QuicFramer::BuildVersionNegotiationPacket(
5960           server_connection_id, client_connection_id, true, true,
5961           SupportedVersions(GetParam())));
5962   quiche::test::CompareCharArraysWithHexError(
5963       "constructed packet", data->data(), data->length(), AsChars(packet),
5964       ABSL_ARRAYSIZE(packet));
5965 }
5966 
TEST_P(QuicFramerTest,BuildAckFramePacketOneAckBlock)5967 TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlock) {
5968   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5969   QuicPacketHeader header;
5970   header.destination_connection_id = FramerTestConnectionId();
5971   header.reset_flag = false;
5972   header.version_flag = false;
5973   header.packet_number = kPacketNumber;
5974 
5975   // Use kSmallLargestObserved to make this test finished in a short time.
5976   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
5977   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
5978 
5979   QuicFrames frames = {QuicFrame(&ack_frame)};
5980 
5981   // clang-format off
5982   unsigned char packet[] = {
5983       // type (short header, 4 byte packet number)
5984       0x43,
5985       // connection_id
5986       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5987       // packet number
5988       0x12, 0x34, 0x56, 0x78,
5989 
5990       // frame type (ack frame)
5991       // (no ack blocks, 2 byte largest observed, 2 byte block length)
5992       0x45,
5993       // largest acked
5994       0x12, 0x34,
5995       // Zero delta time.
5996       0x00, 0x00,
5997       // first ack block length.
5998       0x12, 0x34,
5999       // num timestamps.
6000       0x00,
6001   };
6002 
6003   unsigned char packet_ietf[] = {
6004       // type (short header, 4 byte packet number)
6005       0x43,
6006       // connection_id
6007       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6008       // packet number
6009       0x12, 0x34, 0x56, 0x78,
6010 
6011       // frame type (IETF_ACK frame)
6012       0x02,
6013       // largest acked
6014       kVarInt62TwoBytes + 0x12, 0x34,
6015       // Zero delta time.
6016       kVarInt62OneByte + 0x00,
6017       // Number of additional ack blocks.
6018       kVarInt62OneByte + 0x00,
6019       // first ack block length.
6020       kVarInt62TwoBytes + 0x12, 0x33,
6021   };
6022   // clang-format on
6023   unsigned char* p = packet;
6024   size_t p_size = ABSL_ARRAYSIZE(packet);
6025   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
6026     p = packet_ietf;
6027     p_size = ABSL_ARRAYSIZE(packet_ietf);
6028   }
6029 
6030   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6031   ASSERT_TRUE(data != nullptr);
6032   quiche::test::CompareCharArraysWithHexError(
6033       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
6034 }
6035 
TEST_P(QuicFramerTest,BuildAckReceiveTimestampsFrameMultipleRanges)6036 TEST_P(QuicFramerTest, BuildAckReceiveTimestampsFrameMultipleRanges) {
6037   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6038     return;
6039   }
6040 
6041   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6042   QuicPacketHeader header;
6043   header.destination_connection_id = FramerTestConnectionId();
6044   header.reset_flag = false;
6045   header.version_flag = false;
6046   header.packet_number = kPacketNumber;
6047 
6048   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6049   ack_frame.received_packet_times = PacketTimeVector{
6050       // Timestamp Range 3.
6051       {kSmallLargestObserved - 22, CreationTimePlus(0x29ffdddd)},
6052       {kSmallLargestObserved - 21, CreationTimePlus(0x29ffdedd)},
6053       // Timestamp Range 2.
6054       {kSmallLargestObserved - 11, CreationTimePlus(0x29ffdeed)},
6055       // Timestamp Range 1.
6056       {kSmallLargestObserved - 4, CreationTimePlus(0x29ffeeed)},
6057       {kSmallLargestObserved - 3, CreationTimePlus(0x29ffeeee)},
6058       {kSmallLargestObserved - 2, CreationTimePlus(0x29ffffff)},
6059   };
6060   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6061   QuicFrames frames = {QuicFrame(&ack_frame)};
6062 
6063   unsigned char packet_ietf[] = {
6064       // type (short header, 4 byte packet number)
6065       0x43,
6066       // connection_id
6067       0xFE,
6068       0xDC,
6069       0xBA,
6070       0x98,
6071       0x76,
6072       0x54,
6073       0x32,
6074       0x10,
6075       // packet number
6076       0x12,
6077       0x34,
6078       0x56,
6079       0x78,
6080 
6081       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
6082       0x22,
6083       // largest acked
6084       kVarInt62TwoBytes + 0x12,
6085       0x34,  // = 4660
6086       // Zero delta time.
6087       kVarInt62OneByte + 0x00,
6088       // number of additional ack blocks
6089       kVarInt62OneByte + 0x00,
6090       // first ack block length.
6091       kVarInt62TwoBytes + 0x12,
6092       0x33,
6093 
6094       // Receive Timestamps.
6095 
6096       // Timestamp Range Count
6097       kVarInt62OneByte + 0x03,
6098 
6099       // Timestamp range 1 (three packets).
6100       // Gap
6101       kVarInt62OneByte + 0x02,
6102       // Timestamp Range Count
6103       kVarInt62OneByte + 0x03,
6104       // Timestamp Delta
6105       kVarInt62FourBytes + 0x29,
6106       0xff,
6107       0xff,
6108       0xff,
6109       // Timestamp Delta
6110       kVarInt62TwoBytes + 0x11,
6111       0x11,
6112       // Timestamp Delta
6113       kVarInt62OneByte + 0x01,
6114 
6115       // Timestamp range 2 (one packet).
6116       // Gap
6117       kVarInt62OneByte + 0x05,
6118       // Timestamp Range Count
6119       kVarInt62OneByte + 0x01,
6120       // Timestamp Delta
6121       kVarInt62TwoBytes + 0x10,
6122       0x00,
6123 
6124       // Timestamp range 3 (two packets).
6125       // Gap
6126       kVarInt62OneByte + 0x08,
6127       // Timestamp Range Count
6128       kVarInt62OneByte + 0x02,
6129       // Timestamp Delta
6130       kVarInt62OneByte + 0x10,
6131       // Timestamp Delta
6132       kVarInt62TwoBytes + 0x01,
6133       0x00,
6134   };
6135   // clang-format on
6136 
6137   framer_.set_process_timestamps(true);
6138   framer_.set_max_receive_timestamps_per_ack(8);
6139   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6140   ASSERT_TRUE(data != nullptr);
6141   quiche::test::CompareCharArraysWithHexError(
6142       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
6143       ABSL_ARRAYSIZE(packet_ietf));
6144 }
6145 
TEST_P(QuicFramerTest,BuildAckReceiveTimestampsFrameExceedsMaxTimestamps)6146 TEST_P(QuicFramerTest, BuildAckReceiveTimestampsFrameExceedsMaxTimestamps) {
6147   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6148     return;
6149   }
6150 
6151   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6152   QuicPacketHeader header;
6153   header.destination_connection_id = FramerTestConnectionId();
6154   header.reset_flag = false;
6155   header.version_flag = false;
6156   header.packet_number = kPacketNumber;
6157 
6158   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6159   ack_frame.received_packet_times = PacketTimeVector{
6160       // Timestamp Range 3 (not included because max receive timestamps = 4).
6161       {kSmallLargestObserved - 20, CreationTimePlus(0x29ffdddd)},
6162       // Timestamp Range 2.
6163       {kSmallLargestObserved - 10, CreationTimePlus(0x29ffdedd)},
6164       {kSmallLargestObserved - 9, CreationTimePlus(0x29ffdeed)},
6165       // Timestamp Range 1.
6166       {kSmallLargestObserved - 2, CreationTimePlus(0x29ffeeed)},
6167       {kSmallLargestObserved - 1, CreationTimePlus(0x29ffeeee)},
6168       {kSmallLargestObserved, CreationTimePlus(0x29ffffff)},
6169   };
6170   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6171   QuicFrames frames = {QuicFrame(&ack_frame)};
6172 
6173   unsigned char packet_ietf[] = {
6174       // type (short header, 4 byte packet number)
6175       0x43,
6176       // connection_id
6177       0xFE,
6178       0xDC,
6179       0xBA,
6180       0x98,
6181       0x76,
6182       0x54,
6183       0x32,
6184       0x10,
6185       // packet number
6186       0x12,
6187       0x34,
6188       0x56,
6189       0x78,
6190 
6191       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
6192       0x22,
6193       // largest acked
6194       kVarInt62TwoBytes + 0x12,
6195       0x34,  // = 4660
6196       // Zero delta time.
6197       kVarInt62OneByte + 0x00,
6198       // number of additional ack blocks
6199       kVarInt62OneByte + 0x00,
6200       // first ack block length.
6201       kVarInt62TwoBytes + 0x12,
6202       0x33,
6203 
6204       // Receive Timestamps.
6205 
6206       // Timestamp Range Count
6207       kVarInt62OneByte + 0x02,
6208 
6209       // Timestamp range 1 (three packets).
6210       // Gap
6211       kVarInt62OneByte + 0x00,
6212       // Timestamp Range Count
6213       kVarInt62OneByte + 0x03,
6214       // Timestamp Delta
6215       kVarInt62FourBytes + 0x29,
6216       0xff,
6217       0xff,
6218       0xff,
6219       // Timestamp Delta
6220       kVarInt62TwoBytes + 0x11,
6221       0x11,
6222       // Timestamp Delta
6223       kVarInt62OneByte + 0x01,
6224 
6225       // Timestamp range 2 (one packet).
6226       // Gap
6227       kVarInt62OneByte + 0x05,
6228       // Timestamp Range Count
6229       kVarInt62OneByte + 0x01,
6230       // Timestamp Delta
6231       kVarInt62TwoBytes + 0x10,
6232       0x00,
6233   };
6234   // clang-format on
6235 
6236   framer_.set_process_timestamps(true);
6237   framer_.set_max_receive_timestamps_per_ack(4);
6238   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6239   ASSERT_TRUE(data != nullptr);
6240   quiche::test::CompareCharArraysWithHexError(
6241       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
6242       ABSL_ARRAYSIZE(packet_ietf));
6243 }
6244 
TEST_P(QuicFramerTest,BuildAckReceiveTimestampsFrameWithExponentEncoding)6245 TEST_P(QuicFramerTest, BuildAckReceiveTimestampsFrameWithExponentEncoding) {
6246   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6247     return;
6248   }
6249 
6250   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6251   QuicPacketHeader header;
6252   header.destination_connection_id = FramerTestConnectionId();
6253   header.reset_flag = false;
6254   header.version_flag = false;
6255   header.packet_number = kPacketNumber;
6256 
6257   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6258   ack_frame.received_packet_times = PacketTimeVector{
6259       // Timestamp Range 2.
6260       {kSmallLargestObserved - 12, CreationTimePlus((0x06c00 << 3) + 0x03)},
6261       {kSmallLargestObserved - 11, CreationTimePlus((0x28e00 << 3) + 0x00)},
6262       // Timestamp Range 1.
6263       {kSmallLargestObserved - 5, CreationTimePlus((0x29f00 << 3) + 0x00)},
6264       {kSmallLargestObserved - 4, CreationTimePlus((0x29f00 << 3) + 0x01)},
6265       {kSmallLargestObserved - 3, CreationTimePlus((0x29f00 << 3) + 0x02)},
6266       {kSmallLargestObserved - 2, CreationTimePlus((0x29f00 << 3) + 0x03)},
6267   };
6268   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6269 
6270   QuicFrames frames = {QuicFrame(&ack_frame)};
6271 
6272   unsigned char packet_ietf[] = {
6273       // type (short header, 4 byte packet number)
6274       0x43,
6275       // connection_id
6276       0xFE,
6277       0xDC,
6278       0xBA,
6279       0x98,
6280       0x76,
6281       0x54,
6282       0x32,
6283       0x10,
6284       // packet number
6285       0x12,
6286       0x34,
6287       0x56,
6288       0x78,
6289 
6290       // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
6291       0x22,
6292       // largest acked
6293       kVarInt62TwoBytes + 0x12,
6294       0x34,  // = 4660
6295       // Zero delta time.
6296       kVarInt62OneByte + 0x00,
6297       // number of additional ack blocks
6298       kVarInt62OneByte + 0x00,
6299       // first ack block length.
6300       kVarInt62TwoBytes + 0x12,
6301       0x33,
6302 
6303       // Receive Timestamps.
6304 
6305       // Timestamp Range Count
6306       kVarInt62OneByte + 0x02,
6307 
6308       // Timestamp range 1 (three packets).
6309       // Gap
6310       kVarInt62OneByte + 0x02,
6311       // Timestamp Range Count
6312       kVarInt62OneByte + 0x04,
6313       // Timestamp Delta
6314       kVarInt62FourBytes + 0x00,
6315       0x02,
6316       0x9f,
6317       0x01,  // round up
6318       // Timestamp Delta
6319       kVarInt62OneByte + 0x00,
6320       // Timestamp Delta
6321       kVarInt62OneByte + 0x00,
6322       // Timestamp Delta
6323       kVarInt62OneByte + 0x01,
6324 
6325       // Timestamp range 2 (one packet).
6326       // Gap
6327       kVarInt62OneByte + 0x04,
6328       // Timestamp Range Count
6329       kVarInt62OneByte + 0x02,
6330       // Timestamp Delta
6331       kVarInt62TwoBytes + 0x11,
6332       0x00,
6333       // Timestamp Delta
6334       kVarInt62FourBytes + 0x00,
6335       0x02,
6336       0x21,
6337       0xff,
6338   };
6339   // clang-format on
6340 
6341   framer_.set_process_timestamps(true);
6342   framer_.set_max_receive_timestamps_per_ack(8);
6343   framer_.set_receive_timestamps_exponent(3);
6344   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6345   ASSERT_TRUE(data != nullptr);
6346   quiche::test::CompareCharArraysWithHexError(
6347       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
6348       ABSL_ARRAYSIZE(packet_ietf));
6349 }
6350 
TEST_P(QuicFramerTest,BuildAndProcessAckReceiveTimestampsWithMultipleRanges)6351 TEST_P(QuicFramerTest, BuildAndProcessAckReceiveTimestampsWithMultipleRanges) {
6352   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6353     return;
6354   }
6355   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6356                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6357   framer_.SetKeyUpdateSupportForConnection(true);
6358   framer_.set_process_timestamps(true);
6359   framer_.set_max_receive_timestamps_per_ack(8);
6360 
6361   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6362   QuicPacketHeader header;
6363   header.destination_connection_id = FramerTestConnectionId();
6364   header.reset_flag = false;
6365   header.version_flag = false;
6366   header.packet_number = kPacketNumber;
6367 
6368   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6369   ack_frame.received_packet_times = PacketTimeVector{
6370       {kSmallLargestObserved - 1201, CreationTimePlus(0x8bcaef234)},
6371       {kSmallLargestObserved - 1200, CreationTimePlus(0x8bcdef123)},
6372       {kSmallLargestObserved - 1000, CreationTimePlus(0xaacdef123)},
6373       {kSmallLargestObserved - 4, CreationTimePlus(0xabcdea125)},
6374       {kSmallLargestObserved - 2, CreationTimePlus(0xabcdee124)},
6375       {kSmallLargestObserved - 1, CreationTimePlus(0xabcdef123)},
6376       {kSmallLargestObserved, CreationTimePlus(0xabcdef123)},
6377   };
6378   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6379   QuicFrames frames = {QuicFrame(&ack_frame)};
6380 
6381   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6382   ASSERT_TRUE(data != nullptr);
6383   std::unique_ptr<QuicEncryptedPacket> encrypted(
6384       EncryptPacketWithTagAndPhase(*data, 0, false));
6385   ASSERT_TRUE(encrypted);
6386   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6387   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6388   EXPECT_THAT(framer_.error(), IsQuicNoError());
6389 
6390   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6391   EXPECT_THAT(frame.received_packet_times,
6392               ContainerEq(PacketTimeVector{
6393                   {kSmallLargestObserved, CreationTimePlus(0xabcdef123)},
6394                   {kSmallLargestObserved - 1, CreationTimePlus(0xabcdef123)},
6395                   {kSmallLargestObserved - 2, CreationTimePlus(0xabcdee124)},
6396                   {kSmallLargestObserved - 4, CreationTimePlus(0xabcdea125)},
6397                   {kSmallLargestObserved - 1000, CreationTimePlus(0xaacdef123)},
6398                   {kSmallLargestObserved - 1200, CreationTimePlus(0x8bcdef123)},
6399                   {kSmallLargestObserved - 1201, CreationTimePlus(0x8bcaef234)},
6400               }));
6401 }
6402 
TEST_P(QuicFramerTest,BuildAndProcessAckReceiveTimestampsExceedsMaxTimestamps)6403 TEST_P(QuicFramerTest,
6404        BuildAndProcessAckReceiveTimestampsExceedsMaxTimestamps) {
6405   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6406     return;
6407   }
6408   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6409                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6410   framer_.SetKeyUpdateSupportForConnection(true);
6411   framer_.set_process_timestamps(true);
6412   framer_.set_max_receive_timestamps_per_ack(2);
6413 
6414   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6415   QuicPacketHeader header;
6416   header.destination_connection_id = FramerTestConnectionId();
6417   header.reset_flag = false;
6418   header.version_flag = false;
6419   header.packet_number = kPacketNumber;
6420 
6421   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6422   ack_frame.received_packet_times = PacketTimeVector{
6423       {kSmallLargestObserved - 1201, CreationTimePlus(0x8bcaef234)},
6424       {kSmallLargestObserved - 1200, CreationTimePlus(0x8bcdef123)},
6425       {kSmallLargestObserved - 1000, CreationTimePlus(0xaacdef123)},
6426       {kSmallLargestObserved - 5, CreationTimePlus(0xabcdea125)},
6427       {kSmallLargestObserved - 3, CreationTimePlus(0xabcded124)},
6428       {kSmallLargestObserved - 2, CreationTimePlus(0xabcdee124)},
6429       {kSmallLargestObserved - 1, CreationTimePlus(0xabcdef123)},
6430   };
6431   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6432   QuicFrames frames = {QuicFrame(&ack_frame)};
6433 
6434   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6435   ASSERT_TRUE(data != nullptr);
6436   std::unique_ptr<QuicEncryptedPacket> encrypted(
6437       EncryptPacketWithTagAndPhase(*data, 0, false));
6438   ASSERT_TRUE(encrypted);
6439   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6440   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6441   EXPECT_THAT(framer_.error(), IsQuicNoError());
6442 
6443   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6444   EXPECT_THAT(frame.received_packet_times,
6445               ContainerEq(PacketTimeVector{
6446                   {kSmallLargestObserved - 1, CreationTimePlus(0xabcdef123)},
6447                   {kSmallLargestObserved - 2, CreationTimePlus(0xabcdee124)},
6448               }));
6449 }
6450 
TEST_P(QuicFramerTest,BuildAndProcessAckReceiveTimestampsWithExponentNoTruncation)6451 TEST_P(QuicFramerTest,
6452        BuildAndProcessAckReceiveTimestampsWithExponentNoTruncation) {
6453   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6454     return;
6455   }
6456   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6457                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6458   framer_.SetKeyUpdateSupportForConnection(true);
6459   framer_.set_process_timestamps(true);
6460   framer_.set_max_receive_timestamps_per_ack(8);
6461   framer_.set_receive_timestamps_exponent(3);
6462 
6463   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6464   QuicPacketHeader header;
6465   header.destination_connection_id = FramerTestConnectionId();
6466   header.reset_flag = false;
6467   header.version_flag = false;
6468   header.packet_number = kPacketNumber;
6469 
6470   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6471   ack_frame.received_packet_times = PacketTimeVector{
6472       {kSmallLargestObserved - 8, CreationTimePlus(0x1add << 3)},
6473       {kSmallLargestObserved - 7, CreationTimePlus(0x29ed << 3)},
6474       {kSmallLargestObserved - 3, CreationTimePlus(0x29fe << 3)},
6475       {kSmallLargestObserved - 2, CreationTimePlus(0x29ff << 3)},
6476   };
6477   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6478   QuicFrames frames = {QuicFrame(&ack_frame)};
6479 
6480   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6481   ASSERT_TRUE(data != nullptr);
6482   std::unique_ptr<QuicEncryptedPacket> encrypted(
6483       EncryptPacketWithTagAndPhase(*data, 0, false));
6484   ASSERT_TRUE(encrypted);
6485   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6486   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6487   EXPECT_THAT(framer_.error(), IsQuicNoError());
6488 
6489   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6490   EXPECT_THAT(frame.received_packet_times,
6491               ContainerEq(PacketTimeVector{
6492                   {kSmallLargestObserved - 2, CreationTimePlus(0x29ff << 3)},
6493                   {kSmallLargestObserved - 3, CreationTimePlus(0x29fe << 3)},
6494                   {kSmallLargestObserved - 7, CreationTimePlus(0x29ed << 3)},
6495                   {kSmallLargestObserved - 8, CreationTimePlus(0x1add << 3)},
6496               }));
6497 }
6498 
TEST_P(QuicFramerTest,BuildAndProcessAckReceiveTimestampsWithExponentTruncation)6499 TEST_P(QuicFramerTest,
6500        BuildAndProcessAckReceiveTimestampsWithExponentTruncation) {
6501   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6502     return;
6503   }
6504   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6505                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6506   framer_.SetKeyUpdateSupportForConnection(true);
6507   framer_.set_process_timestamps(true);
6508   framer_.set_max_receive_timestamps_per_ack(8);
6509   framer_.set_receive_timestamps_exponent(3);
6510 
6511   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6512   QuicPacketHeader header;
6513   header.destination_connection_id = FramerTestConnectionId();
6514   header.reset_flag = false;
6515   header.version_flag = false;
6516   header.packet_number = kPacketNumber;
6517 
6518   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6519   ack_frame.received_packet_times = PacketTimeVector{
6520       {kSmallLargestObserved - 10, CreationTimePlus((0x1001 << 3) + 1)},
6521       {kSmallLargestObserved - 9, CreationTimePlus((0x2995 << 3) - 1)},
6522       {kSmallLargestObserved - 8, CreationTimePlus((0x2995 << 3) + 0)},
6523       {kSmallLargestObserved - 7, CreationTimePlus((0x2995 << 3) + 1)},
6524       {kSmallLargestObserved - 6, CreationTimePlus((0x2995 << 3) + 2)},
6525       {kSmallLargestObserved - 3, CreationTimePlus((0x2995 << 3) + 3)},
6526       {kSmallLargestObserved - 2, CreationTimePlus((0x2995 << 3) + 4)},
6527   };
6528   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6529   QuicFrames frames = {QuicFrame(&ack_frame)};
6530 
6531   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6532   ASSERT_TRUE(data != nullptr);
6533   std::unique_ptr<QuicEncryptedPacket> encrypted(
6534       EncryptPacketWithTagAndPhase(*data, 0, false));
6535   ASSERT_TRUE(encrypted);
6536   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6537   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6538   EXPECT_THAT(framer_.error(), IsQuicNoError());
6539 
6540   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6541   EXPECT_THAT(frame.received_packet_times,
6542               ContainerEq(PacketTimeVector{
6543                   {kSmallLargestObserved - 2, CreationTimePlus(0x2996 << 3)},
6544                   {kSmallLargestObserved - 3, CreationTimePlus(0x2996 << 3)},
6545                   {kSmallLargestObserved - 6, CreationTimePlus(0x2996 << 3)},
6546                   {kSmallLargestObserved - 7, CreationTimePlus(0x2996 << 3)},
6547                   {kSmallLargestObserved - 8, CreationTimePlus(0x2995 << 3)},
6548                   {kSmallLargestObserved - 9, CreationTimePlus(0x2995 << 3)},
6549                   {kSmallLargestObserved - 10, CreationTimePlus(0x1002 << 3)},
6550               }));
6551 }
6552 
TEST_P(QuicFramerTest,AckReceiveTimestamps)6553 TEST_P(QuicFramerTest, AckReceiveTimestamps) {
6554   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6555     return;
6556   }
6557   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6558                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6559   framer_.SetKeyUpdateSupportForConnection(true);
6560   framer_.set_process_timestamps(true);
6561   framer_.set_max_receive_timestamps_per_ack(8);
6562   framer_.set_receive_timestamps_exponent(3);
6563 
6564   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6565   QuicPacketHeader header;
6566   header.destination_connection_id = FramerTestConnectionId();
6567   header.reset_flag = false;
6568   header.version_flag = false;
6569   header.packet_number = kPacketNumber;
6570 
6571   // Use kSmallLargestObserved to make this test finished in a short time.
6572   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6573   ack_frame.received_packet_times = PacketTimeVector{
6574       {kSmallLargestObserved - 5, CreationTimePlus((0x29ff << 3))},
6575       {kSmallLargestObserved - 4, CreationTimePlus((0x29ff << 3))},
6576       {kSmallLargestObserved - 3, CreationTimePlus((0x29ff << 3))},
6577       {kSmallLargestObserved - 2, CreationTimePlus((0x29ff << 3))},
6578   };
6579   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6580   QuicFrames frames = {QuicFrame(&ack_frame)};
6581 
6582   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6583   ASSERT_TRUE(data != nullptr);
6584   std::unique_ptr<QuicEncryptedPacket> encrypted(
6585       EncryptPacketWithTagAndPhase(*data, 0, false));
6586   ASSERT_TRUE(encrypted);
6587   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6588   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6589   EXPECT_THAT(framer_.error(), IsQuicNoError());
6590 
6591   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6592   EXPECT_THAT(frame.received_packet_times,
6593               ContainerEq(PacketTimeVector{
6594                   {kSmallLargestObserved - 2, CreationTimePlus(0x29ff << 3)},
6595                   {kSmallLargestObserved - 3, CreationTimePlus(0x29ff << 3)},
6596                   {kSmallLargestObserved - 4, CreationTimePlus(0x29ff << 3)},
6597                   {kSmallLargestObserved - 5, CreationTimePlus(0x29ff << 3)},
6598               }));
6599 }
6600 
TEST_P(QuicFramerTest,AckReceiveTimestampsPacketOutOfOrder)6601 TEST_P(QuicFramerTest, AckReceiveTimestampsPacketOutOfOrder) {
6602   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6603     return;
6604   }
6605   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6606                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6607   framer_.SetKeyUpdateSupportForConnection(true);
6608   framer_.set_process_timestamps(true);
6609   framer_.set_max_receive_timestamps_per_ack(8);
6610   framer_.set_receive_timestamps_exponent(3);
6611 
6612   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6613   QuicPacketHeader header;
6614   header.destination_connection_id = FramerTestConnectionId();
6615   header.reset_flag = false;
6616   header.version_flag = false;
6617   header.packet_number = kPacketNumber;
6618 
6619   // Use kSmallLargestObserved to make this test finished in a short time.
6620   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6621 
6622   // The packet numbers below are out of order, this is impossible because we
6623   // don't record out of order packets in received_packet_times. The test is
6624   // intended to ensure this error is raised when it happens.
6625   ack_frame.received_packet_times = PacketTimeVector{
6626       {kSmallLargestObserved - 5, CreationTimePlus((0x29ff << 3))},
6627       {kSmallLargestObserved - 2, CreationTimePlus((0x29ff << 3))},
6628       {kSmallLargestObserved - 4, CreationTimePlus((0x29ff << 3))},
6629       {kSmallLargestObserved - 3, CreationTimePlus((0x29ff << 3))},
6630   };
6631   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6632   QuicFrames frames = {QuicFrame(&ack_frame)};
6633 
6634   EXPECT_QUIC_BUG(BuildDataPacket(header, frames),
6635                   "Packet number and/or receive time not in order.");
6636 }
6637 
6638 // If there's insufficient room for IETF ack receive timestamps, don't write any
6639 // timestamp ranges.
TEST_P(QuicFramerTest,IetfAckReceiveTimestampsTruncate)6640 TEST_P(QuicFramerTest, IetfAckReceiveTimestampsTruncate) {
6641   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6642     return;
6643   }
6644   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6645                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6646   framer_.SetKeyUpdateSupportForConnection(true);
6647   framer_.set_process_timestamps(true);
6648   framer_.set_max_receive_timestamps_per_ack(8192);
6649   framer_.set_receive_timestamps_exponent(3);
6650 
6651   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6652   QuicPacketHeader header;
6653   header.destination_connection_id = FramerTestConnectionId();
6654   header.reset_flag = false;
6655   header.version_flag = false;
6656   header.packet_number = kPacketNumber;
6657 
6658   // Use kSmallLargestObserved to make this test finished in a short time.
6659   QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6660   for (QuicPacketNumber i(1); i <= kSmallLargestObserved; i += 2) {
6661     ack_frame.received_packet_times.push_back(
6662         {i, CreationTimePlus((0x29ff << 3))});
6663   }
6664 
6665   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6666   QuicFrames frames = {QuicFrame(&ack_frame)};
6667 
6668   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6669   ASSERT_TRUE(data != nullptr);
6670   std::unique_ptr<QuicEncryptedPacket> encrypted(
6671       EncryptPacketWithTagAndPhase(*data, 0, false));
6672   ASSERT_TRUE(encrypted);
6673   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6674   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6675   EXPECT_THAT(framer_.error(), IsQuicNoError());
6676 
6677   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6678   EXPECT_TRUE(frame.received_packet_times.empty());
6679 }
6680 
6681 // If there are too many ack ranges, they will be truncated to make room for a
6682 // timestamp range count of 0.
TEST_P(QuicFramerTest,IetfAckReceiveTimestampsAckRangeTruncation)6683 TEST_P(QuicFramerTest, IetfAckReceiveTimestampsAckRangeTruncation) {
6684   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6685     return;
6686   }
6687   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
6688   framer_.set_process_timestamps(true);
6689   framer_.set_max_receive_timestamps_per_ack(8);
6690   framer_.set_receive_timestamps_exponent(3);
6691 
6692   QuicPacketHeader header;
6693   header.destination_connection_id = FramerTestConnectionId();
6694   header.reset_flag = false;
6695   header.version_flag = false;
6696   header.packet_number = kPacketNumber;
6697 
6698   QuicAckFrame ack_frame;
6699   // Create a packet with just the ack.
6700   ack_frame = MakeAckFrameWithGaps(/*gap_size=*/0xffffffff,
6701                                    /*max_num_gaps=*/200,
6702                                    /*largest_acked=*/kMaxIetfVarInt);
6703   ack_frame.received_packet_times = PacketTimeVector{
6704       {QuicPacketNumber(kMaxIetfVarInt) - 2, CreationTimePlus((0x29ff << 3))},
6705   };
6706   QuicFrames frames = {QuicFrame(&ack_frame)};
6707   // Build an ACK packet.
6708   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6709   std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
6710   ASSERT_TRUE(raw_ack_packet != nullptr);
6711   char buffer[kMaxOutgoingPacketSize];
6712   size_t encrypted_length =
6713       framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
6714                              *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
6715   ASSERT_NE(0u, encrypted_length);
6716   // Now make sure we can turn our ack packet back into an ack frame.
6717   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6718   ASSERT_TRUE(framer_.ProcessPacket(
6719       QuicEncryptedPacket(buffer, encrypted_length, false)));
6720   ASSERT_EQ(1u, visitor_.ack_frames_.size());
6721   QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
6722   EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
6723             LargestAcked(processed_ack_frame));
6724   // Verify ACK ranges in the frame gets truncated.
6725   ASSERT_LT(processed_ack_frame.packets.NumPacketsSlow(),
6726             ack_frame.packets.NumIntervals());
6727   EXPECT_EQ(158u, processed_ack_frame.packets.NumPacketsSlow());
6728   EXPECT_LT(processed_ack_frame.packets.NumIntervals(),
6729             ack_frame.packets.NumIntervals());
6730   EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
6731             processed_ack_frame.packets.Max());
6732   // But the receive timestamps are not truncated because they are small.
6733   EXPECT_FALSE(processed_ack_frame.received_packet_times.empty());
6734 }
6735 
TEST_P(QuicFramerTest,BuildAckFramePacketOneAckBlockMaxLength)6736 TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlockMaxLength) {
6737   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6738   QuicPacketHeader header;
6739   header.destination_connection_id = FramerTestConnectionId();
6740   header.reset_flag = false;
6741   header.version_flag = false;
6742   header.packet_number = kPacketNumber;
6743 
6744   QuicAckFrame ack_frame = InitAckFrame(kPacketNumber);
6745   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6746 
6747   QuicFrames frames = {QuicFrame(&ack_frame)};
6748 
6749   // clang-format off
6750   unsigned char packet[] = {
6751       // type (short header, 4 byte packet number)
6752       0x43,
6753       // connection_id
6754       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6755       // packet number
6756       0x12, 0x34, 0x56, 0x78,
6757 
6758       // frame type (ack frame)
6759       // (no ack blocks, 4 byte largest observed, 4 byte block length)
6760       0x4A,
6761       // largest acked
6762       0x12, 0x34, 0x56, 0x78,
6763       // Zero delta time.
6764       0x00, 0x00,
6765       // first ack block length.
6766       0x12, 0x34, 0x56, 0x78,
6767       // num timestamps.
6768       0x00,
6769   };
6770 
6771 
6772   unsigned char packet_ietf[] = {
6773       // type (short header, 4 byte packet number)
6774       0x43,
6775       // connection_id
6776       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6777       // packet number
6778       0x12, 0x34, 0x56, 0x78,
6779 
6780       // frame type (IETF_ACK frame)
6781       0x02,
6782       // largest acked
6783       kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
6784       // Zero delta time.
6785       kVarInt62OneByte + 0x00,
6786       // Nr. of additional ack blocks
6787       kVarInt62OneByte + 0x00,
6788       // first ack block length.
6789       kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
6790   };
6791   // clang-format on
6792   unsigned char* p = packet;
6793   size_t p_size = ABSL_ARRAYSIZE(packet);
6794   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
6795     p = packet_ietf;
6796     p_size = ABSL_ARRAYSIZE(packet_ietf);
6797   }
6798 
6799   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6800   ASSERT_TRUE(data != nullptr);
6801   quiche::test::CompareCharArraysWithHexError(
6802       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
6803 }
6804 
TEST_P(QuicFramerTest,BuildAckFramePacketMultipleAckBlocks)6805 TEST_P(QuicFramerTest, BuildAckFramePacketMultipleAckBlocks) {
6806   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6807   QuicPacketHeader header;
6808   header.destination_connection_id = FramerTestConnectionId();
6809   header.reset_flag = false;
6810   header.version_flag = false;
6811   header.packet_number = kPacketNumber;
6812 
6813   // Use kSmallLargestObserved to make this test finished in a short time.
6814   QuicAckFrame ack_frame =
6815       InitAckFrame({{QuicPacketNumber(1), QuicPacketNumber(5)},
6816                     {QuicPacketNumber(10), QuicPacketNumber(500)},
6817                     {QuicPacketNumber(900), kSmallMissingPacket},
6818                     {kSmallMissingPacket + 1, kSmallLargestObserved + 1}});
6819   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6820 
6821   QuicFrames frames = {QuicFrame(&ack_frame)};
6822 
6823   // clang-format off
6824   unsigned char packet[] = {
6825       // type (short header, 4 byte packet number)
6826       0x43,
6827       // connection_id
6828       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6829       // packet number
6830       0x12, 0x34, 0x56, 0x78,
6831 
6832       // frame type (ack frame)
6833       // (has ack blocks, 2 byte largest observed, 2 byte block length)
6834       0x65,
6835       // largest acked
6836       0x12, 0x34,
6837       // Zero delta time.
6838       0x00, 0x00,
6839       // num ack blocks ranges.
6840       0x04,
6841       // first ack block length.
6842       0x00, 0x01,
6843       // gap to next block.
6844       0x01,
6845       // ack block length.
6846       0x0e, 0xaf,
6847       // gap to next block.
6848       0xff,
6849       // ack block length.
6850       0x00, 0x00,
6851       // gap to next block.
6852       0x91,
6853       // ack block length.
6854       0x01, 0xea,
6855       // gap to next block.
6856       0x05,
6857       // ack block length.
6858       0x00, 0x04,
6859       // num timestamps.
6860       0x00,
6861   };
6862 
6863   unsigned char packet_ietf[] = {
6864       // type (short header, 4 byte packet number)
6865       0x43,
6866       // connection_id
6867       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6868       // packet number
6869       0x12, 0x34, 0x56, 0x78,
6870 
6871       // frame type (IETF_ACK frame)
6872       0x02,
6873       // largest acked
6874       kVarInt62TwoBytes + 0x12, 0x34,
6875       // Zero delta time.
6876       kVarInt62OneByte + 0x00,
6877       // num additional ack blocks.
6878       kVarInt62OneByte + 0x03,
6879       // first ack block length.
6880       kVarInt62OneByte + 0x00,
6881 
6882       // gap to next block.
6883       kVarInt62OneByte + 0x00,
6884       // ack block length.
6885       kVarInt62TwoBytes + 0x0e, 0xae,
6886 
6887       // gap to next block.
6888       kVarInt62TwoBytes + 0x01, 0x8f,
6889       // ack block length.
6890       kVarInt62TwoBytes + 0x01, 0xe9,
6891 
6892       // gap to next block.
6893       kVarInt62OneByte + 0x04,
6894       // ack block length.
6895       kVarInt62OneByte + 0x03,
6896   };
6897   // clang-format on
6898   unsigned char* p = packet;
6899   size_t p_size = ABSL_ARRAYSIZE(packet);
6900   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
6901     p = packet_ietf;
6902     p_size = ABSL_ARRAYSIZE(packet_ietf);
6903   }
6904 
6905   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6906   ASSERT_TRUE(data != nullptr);
6907 
6908   quiche::test::CompareCharArraysWithHexError(
6909       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
6910 }
6911 
TEST_P(QuicFramerTest,BuildAckFramePacketMaxAckBlocks)6912 TEST_P(QuicFramerTest, BuildAckFramePacketMaxAckBlocks) {
6913   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6914   QuicPacketHeader header;
6915   header.destination_connection_id = FramerTestConnectionId();
6916   header.reset_flag = false;
6917   header.version_flag = false;
6918   header.packet_number = kPacketNumber;
6919 
6920   // Use kSmallLargestObservedto make this test finished in a short time.
6921   QuicAckFrame ack_frame;
6922   ack_frame.largest_acked = kSmallLargestObserved;
6923   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6924   // 300 ack blocks.
6925   for (size_t i = 2; i < 2 * 300; i += 2) {
6926     ack_frame.packets.Add(QuicPacketNumber(i));
6927   }
6928   ack_frame.packets.AddRange(QuicPacketNumber(600), kSmallLargestObserved + 1);
6929 
6930   QuicFrames frames = {QuicFrame(&ack_frame)};
6931 
6932   // clang-format off
6933   unsigned char packet[] = {
6934       // type (short header, 4 byte packet number)
6935       0x43,
6936       // connection_id
6937       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6938       // packet number
6939       0x12, 0x34, 0x56, 0x78,
6940       // frame type (ack frame)
6941       // (has ack blocks, 2 byte largest observed, 2 byte block length)
6942       0x65,
6943       // largest acked
6944       0x12, 0x34,
6945       // Zero delta time.
6946       0x00, 0x00,
6947       // num ack blocks ranges.
6948       0xff,
6949       // first ack block length.
6950       0x0f, 0xdd,
6951       // 255 = 4 * 63 + 3
6952       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6953       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6954       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6955       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6956       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6957       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6958       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6959       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6960       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6961       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6962 
6963       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6964       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6965       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6966       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6967       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6968       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6969       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6970       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6971       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6972       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6973 
6974       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6975       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6976       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6977       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6978       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6979       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6980       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6981       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6982       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6983       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6984 
6985       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6986       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6987       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6988       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6989       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6990       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6991       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6992       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6993       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6994       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6995 
6996       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6997       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6998       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
6999       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7000       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7001       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7002       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7003       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7004       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7005       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7006 
7007       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7008       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7009       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7010       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7011       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7012       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7013       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7014       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7015       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7016       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7017 
7018       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7019       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7020       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7021       0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7022       // num timestamps.
7023       0x00,
7024   };
7025 
7026   unsigned char packet_ietf[] = {
7027       // type (short header, 4 byte packet number)
7028       0x43,
7029       // connection_id
7030       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7031       // packet number
7032       0x12, 0x34, 0x56, 0x78,
7033       // frame type (IETF_ACK frame)
7034       0x02,
7035       // largest acked
7036       kVarInt62TwoBytes + 0x12, 0x34,
7037       // Zero delta time.
7038       kVarInt62OneByte + 0x00,
7039       // num ack blocks ranges.
7040       kVarInt62TwoBytes + 0x01, 0x2b,
7041       // first ack block length.
7042       kVarInt62TwoBytes + 0x0f, 0xdc,
7043       // 255 added blocks of gap_size == 1, ack_size == 1
7044 #define V99AddedBLOCK kVarInt62OneByte + 0x00, kVarInt62OneByte + 0x00
7045       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7046       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7047       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7048       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7049       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7050       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7051       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7052       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7053       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7054       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7055       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7056       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7057       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7058       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7059       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7060       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7061       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7062       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7063       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7064       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7065 
7066       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7067       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7068       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7069       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7070       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7071       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7072       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7073       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7074       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7075       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7076       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7077       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7078       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7079       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7080       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7081       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7082       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7083       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7084       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7085       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7086 
7087       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7088       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7089       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7090       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7091       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7092       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7093       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7094       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7095       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7096       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7097       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7098       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7099       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7100       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7101       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7102       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7103       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7104       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7105       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7106       V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7107 
7108 #undef V99AddedBLOCK
7109   };
7110   // clang-format on
7111   unsigned char* p = packet;
7112   size_t p_size = ABSL_ARRAYSIZE(packet);
7113   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7114     p = packet_ietf;
7115     p_size = ABSL_ARRAYSIZE(packet_ietf);
7116   }
7117 
7118   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7119   ASSERT_TRUE(data != nullptr);
7120 
7121   quiche::test::CompareCharArraysWithHexError(
7122       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7123 }
7124 
TEST_P(QuicFramerTest,BuildRstFramePacketQuic)7125 TEST_P(QuicFramerTest, BuildRstFramePacketQuic) {
7126   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7127   QuicPacketHeader header;
7128   header.destination_connection_id = FramerTestConnectionId();
7129   header.reset_flag = false;
7130   header.version_flag = false;
7131   header.packet_number = kPacketNumber;
7132 
7133   QuicRstStreamFrame rst_frame;
7134   rst_frame.stream_id = kStreamId;
7135   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7136     rst_frame.ietf_error_code = 0x01;
7137   } else {
7138     rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708);
7139   }
7140   rst_frame.byte_offset = 0x0807060504030201;
7141 
7142   // clang-format off
7143   unsigned char packet[] = {
7144     // type (short packet, 4 byte packet number)
7145     0x43,
7146     // connection_id
7147     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7148     // packet number
7149     0x12, 0x34, 0x56, 0x78,
7150 
7151     // frame type (rst stream frame)
7152     0x01,
7153     // stream id
7154     0x01, 0x02, 0x03, 0x04,
7155     // sent byte offset
7156     0x08, 0x07, 0x06, 0x05,
7157     0x04, 0x03, 0x02, 0x01,
7158     // error code
7159     0x05, 0x06, 0x07, 0x08,
7160   };
7161 
7162   unsigned char packet_ietf[] = {
7163     // type (short packet, 4 byte packet number)
7164     0x43,
7165     // connection_id
7166     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7167     // packet number
7168     0x12, 0x34, 0x56, 0x78,
7169 
7170     // frame type (IETF_RST_STREAM frame)
7171     0x04,
7172     // stream id
7173     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
7174     // error code
7175     kVarInt62OneByte + 0x01,
7176     // sent byte offset
7177     kVarInt62EightBytes + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01
7178   };
7179   // clang-format on
7180 
7181   QuicFrames frames = {QuicFrame(&rst_frame)};
7182 
7183   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7184   ASSERT_TRUE(data != nullptr);
7185 
7186   unsigned char* p = packet;
7187   size_t p_size = ABSL_ARRAYSIZE(packet);
7188   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7189     p = packet_ietf;
7190     p_size = ABSL_ARRAYSIZE(packet_ietf);
7191   }
7192   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
7193 
7194   quiche::test::CompareCharArraysWithHexError(
7195       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7196 }
7197 
TEST_P(QuicFramerTest,BuildCloseFramePacket)7198 TEST_P(QuicFramerTest, BuildCloseFramePacket) {
7199   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7200   QuicPacketHeader header;
7201   header.destination_connection_id = FramerTestConnectionId();
7202   header.reset_flag = false;
7203   header.version_flag = false;
7204   header.packet_number = kPacketNumber;
7205 
7206   QuicConnectionCloseFrame close_frame(framer_.transport_version(),
7207                                        QUIC_INTERNAL_ERROR, NO_IETF_QUIC_ERROR,
7208                                        "because I can", 0x05);
7209   QuicFrames frames = {QuicFrame(&close_frame)};
7210 
7211   // clang-format off
7212   unsigned char packet[] = {
7213     // type (short header, 4 byte packet number)
7214     0x43,
7215     // connection_id
7216     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7217     // packet number
7218     0x12, 0x34, 0x56, 0x78,
7219 
7220     // frame type (connection close frame)
7221     0x02,
7222     // error code
7223     0x00, 0x00, 0x00, 0x01,
7224     // error details length
7225     0x00, 0x0d,
7226     // error details
7227     'b',  'e',  'c',  'a',
7228     'u',  's',  'e',  ' ',
7229     'I',  ' ',  'c',  'a',
7230     'n',
7231   };
7232 
7233   unsigned char packet_ietf[] = {
7234     // type (short header, 4 byte packet number)
7235     0x43,
7236     // connection_id
7237     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7238     // packet number
7239     0x12, 0x34, 0x56, 0x78,
7240 
7241     // frame type (IETF_CONNECTION_CLOSE frame)
7242     0x1c,
7243     // error code
7244     kVarInt62OneByte + 0x01,
7245     // Frame type within the CONNECTION_CLOSE frame
7246     kVarInt62OneByte + 0x05,
7247     // error details length
7248     kVarInt62OneByte + 0x0f,
7249     // error details
7250     '1',  ':',  'b',  'e',
7251     'c',  'a',  'u',  's',
7252     'e',  ' ',  'I',  ' ',
7253     'c',  'a',  'n',
7254   };
7255   // clang-format on
7256 
7257   unsigned char* p = packet;
7258   size_t p_size = ABSL_ARRAYSIZE(packet);
7259   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7260     p = packet_ietf;
7261     p_size = ABSL_ARRAYSIZE(packet_ietf);
7262   }
7263 
7264   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7265   ASSERT_TRUE(data != nullptr);
7266 
7267   quiche::test::CompareCharArraysWithHexError(
7268       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7269 }
7270 
TEST_P(QuicFramerTest,BuildCloseFramePacketExtendedInfo)7271 TEST_P(QuicFramerTest, BuildCloseFramePacketExtendedInfo) {
7272   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7273   QuicPacketHeader header;
7274   header.destination_connection_id = FramerTestConnectionId();
7275   header.reset_flag = false;
7276   header.version_flag = false;
7277   header.packet_number = kPacketNumber;
7278 
7279   QuicConnectionCloseFrame close_frame(
7280       framer_.transport_version(),
7281       static_cast<QuicErrorCode>(
7282           VersionHasIetfQuicFrames(framer_.transport_version()) ? 0x01
7283                                                                 : 0x05060708),
7284       NO_IETF_QUIC_ERROR, "because I can", 0x05);
7285   // Set this so that it is "there" for both Google QUIC and IETF QUIC
7286   // framing. It better not show up for Google QUIC!
7287   close_frame.quic_error_code = static_cast<QuicErrorCode>(0x4567);
7288 
7289   QuicFrames frames = {QuicFrame(&close_frame)};
7290 
7291   // clang-format off
7292   unsigned char packet[] = {
7293     // type (short header, 4 byte packet number)
7294     0x43,
7295     // connection_id
7296     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7297     // packet number
7298     0x12, 0x34, 0x56, 0x78,
7299 
7300     // frame type (connection close frame)
7301     0x02,
7302     // error code
7303     0x05, 0x06, 0x07, 0x08,
7304     // error details length
7305     0x00, 0x0d,
7306     // error details
7307     'b',  'e',  'c',  'a',
7308     'u',  's',  'e',  ' ',
7309     'I',  ' ',  'c',  'a',
7310     'n',
7311   };
7312 
7313   unsigned char packet_ietf[] = {
7314     // type (short header, 4 byte packet number)
7315     0x43,
7316     // connection_id
7317     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7318     // packet number
7319     0x12, 0x34, 0x56, 0x78,
7320 
7321     // frame type (IETF_CONNECTION_CLOSE frame)
7322     0x1c,
7323     // IETF error code INTERNAL_ERROR = 0x01 corresponding to
7324     // QuicErrorCode::QUIC_INTERNAL_ERROR = 0x01.
7325     kVarInt62OneByte + 0x01,
7326     // Frame type within the CONNECTION_CLOSE frame
7327     kVarInt62OneByte + 0x05,
7328     // error details length
7329     kVarInt62OneByte + 0x13,
7330     // error details
7331     '1',  '7',  '7',  '6',
7332     '7',  ':',  'b',  'e',
7333     'c',  'a',  'u',  's',
7334     'e',  ' ',  'I',  ' ',
7335     'c',  'a',  'n'
7336   };
7337   // clang-format on
7338 
7339   unsigned char* p = packet;
7340   size_t p_size = ABSL_ARRAYSIZE(packet);
7341   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7342     p = packet_ietf;
7343     p_size = ABSL_ARRAYSIZE(packet_ietf);
7344   }
7345 
7346   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7347   ASSERT_TRUE(data != nullptr);
7348 
7349   quiche::test::CompareCharArraysWithHexError(
7350       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7351 }
7352 
TEST_P(QuicFramerTest,BuildTruncatedCloseFramePacket)7353 TEST_P(QuicFramerTest, BuildTruncatedCloseFramePacket) {
7354   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7355   QuicPacketHeader header;
7356   header.destination_connection_id = FramerTestConnectionId();
7357   header.reset_flag = false;
7358   header.version_flag = false;
7359   header.packet_number = kPacketNumber;
7360 
7361   QuicConnectionCloseFrame close_frame(framer_.transport_version(),
7362                                        QUIC_INTERNAL_ERROR, NO_IETF_QUIC_ERROR,
7363                                        std::string(2048, 'A'), 0x05);
7364   QuicFrames frames = {QuicFrame(&close_frame)};
7365 
7366   // clang-format off
7367   unsigned char packet[] = {
7368     // type (short header, 4 byte packet number)
7369     0x43,
7370     // connection_id
7371     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7372     // packet number
7373     0x12, 0x34, 0x56, 0x78,
7374 
7375     // frame type (connection close frame)
7376     0x02,
7377     // error code
7378     0x00, 0x00, 0x00, 0x01,
7379     // error details length
7380     0x01, 0x00,
7381     // error details (truncated to 256 bytes)
7382     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7383     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7384     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7385     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7386     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7387     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7388     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7389     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7390     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7391     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7392     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7393     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7394     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7395     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7396     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7397     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7398     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7399     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7400     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7401     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7402     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7403     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7404     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7405     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7406     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7407     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7408     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7409     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7410     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7411     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7412     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7413     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7414   };
7415 
7416   unsigned char packet_ietf[] = {
7417     // type (short header, 4 byte packet number)
7418     0x43,
7419     // connection_id
7420     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7421     // packet number
7422     0x12, 0x34, 0x56, 0x78,
7423 
7424     // frame type (IETF_CONNECTION_CLOSE frame)
7425     0x1c,
7426     // error code
7427     kVarInt62OneByte + 0x01,
7428     // Frame type within the CONNECTION_CLOSE frame
7429     kVarInt62OneByte + 0x05,
7430     // error details length
7431     kVarInt62TwoBytes + 0x01, 0x00,
7432     // error details (truncated to 256 bytes)
7433     '1',  ':',  'A',  'A',  'A',  'A',  'A',  'A',
7434     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7435     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7436     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7437     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7438     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7439     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7440     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7441     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7442     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7443     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7444     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7445     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7446     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7447     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7448     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7449     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7450     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7451     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7452     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7453     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7454     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7455     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7456     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7457     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7458     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7459     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7460     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7461     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7462     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7463     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7464     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7465   };
7466   // clang-format on
7467 
7468   unsigned char* p = packet;
7469   size_t p_size = ABSL_ARRAYSIZE(packet);
7470   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7471     p = packet_ietf;
7472     p_size = ABSL_ARRAYSIZE(packet_ietf);
7473   }
7474 
7475   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7476   ASSERT_TRUE(data != nullptr);
7477 
7478   quiche::test::CompareCharArraysWithHexError(
7479       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7480 }
7481 
TEST_P(QuicFramerTest,BuildApplicationCloseFramePacket)7482 TEST_P(QuicFramerTest, BuildApplicationCloseFramePacket) {
7483   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
7484     // This frame is only for IETF QUIC.
7485     return;
7486   }
7487   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7488   QuicPacketHeader header;
7489   header.destination_connection_id = FramerTestConnectionId();
7490   header.reset_flag = false;
7491   header.version_flag = false;
7492   header.packet_number = kPacketNumber;
7493 
7494   QuicConnectionCloseFrame app_close_frame;
7495   app_close_frame.wire_error_code = 0x11;
7496   app_close_frame.error_details = "because I can";
7497   app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
7498 
7499   QuicFrames frames = {QuicFrame(&app_close_frame)};
7500 
7501   // clang-format off
7502 
7503   unsigned char packet_ietf[] = {
7504     // type (short header, 4 byte packet number)
7505     0x43,
7506     // connection_id
7507     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7508     // packet number
7509     0x12, 0x34, 0x56, 0x78,
7510 
7511     // frame type (IETF_APPLICATION_CLOSE frame)
7512     0x1d,
7513     // error code
7514     kVarInt62OneByte + 0x11,
7515     // error details length
7516     kVarInt62OneByte + 0x0f,
7517     // error details, note that it includes an extended error code.
7518     '0',  ':',  'b',  'e',
7519     'c',  'a',  'u',  's',
7520     'e',  ' ',  'I',  ' ',
7521     'c',  'a',  'n',
7522   };
7523   // clang-format on
7524 
7525   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7526   ASSERT_TRUE(data != nullptr);
7527 
7528   quiche::test::CompareCharArraysWithHexError(
7529       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
7530       ABSL_ARRAYSIZE(packet_ietf));
7531 }
7532 
TEST_P(QuicFramerTest,BuildTruncatedApplicationCloseFramePacket)7533 TEST_P(QuicFramerTest, BuildTruncatedApplicationCloseFramePacket) {
7534   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
7535     // This frame is only for IETF QUIC.
7536     return;
7537   }
7538   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7539   QuicPacketHeader header;
7540   header.destination_connection_id = FramerTestConnectionId();
7541   header.reset_flag = false;
7542   header.version_flag = false;
7543   header.packet_number = kPacketNumber;
7544 
7545   QuicConnectionCloseFrame app_close_frame;
7546   app_close_frame.wire_error_code = 0x11;
7547   app_close_frame.error_details = std::string(2048, 'A');
7548   app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
7549   // Setting to missing ensures that if it is missing, the extended
7550   // code is not added to the text message.
7551   app_close_frame.quic_error_code = QUIC_IETF_GQUIC_ERROR_MISSING;
7552 
7553   QuicFrames frames = {QuicFrame(&app_close_frame)};
7554 
7555   // clang-format off
7556   unsigned char packet_ietf[] = {
7557     // type (short header, 4 byte packet number)
7558     0x43,
7559     // connection_id
7560     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7561     // packet number
7562     0x12, 0x34, 0x56, 0x78,
7563 
7564     // frame type (IETF_APPLICATION_CLOSE frame)
7565     0x1d,
7566     // error code
7567     kVarInt62OneByte + 0x11,
7568     // error details length
7569     kVarInt62TwoBytes + 0x01, 0x00,
7570     // error details (truncated to 256 bytes)
7571     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7572     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7573     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7574     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7575     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7576     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7577     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7578     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7579     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7580     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7581     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7582     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7583     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7584     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7585     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7586     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7587     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7588     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7589     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7590     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7591     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7592     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7593     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7594     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7595     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7596     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7597     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7598     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7599     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7600     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7601     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7602     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7603   };
7604   // clang-format on
7605 
7606   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7607   ASSERT_TRUE(data != nullptr);
7608 
7609   quiche::test::CompareCharArraysWithHexError(
7610       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
7611       ABSL_ARRAYSIZE(packet_ietf));
7612 }
7613 
TEST_P(QuicFramerTest,BuildGoAwayPacket)7614 TEST_P(QuicFramerTest, BuildGoAwayPacket) {
7615   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7616     // This frame is only for Google QUIC.
7617     return;
7618   }
7619   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7620   QuicPacketHeader header;
7621   header.destination_connection_id = FramerTestConnectionId();
7622   header.reset_flag = false;
7623   header.version_flag = false;
7624   header.packet_number = kPacketNumber;
7625 
7626   QuicGoAwayFrame goaway_frame;
7627   goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
7628   goaway_frame.last_good_stream_id = kStreamId;
7629   goaway_frame.reason_phrase = "because I can";
7630 
7631   QuicFrames frames = {QuicFrame(&goaway_frame)};
7632 
7633   // clang-format off
7634   unsigned char packet[] = {
7635     // type (short header, 4 byte packet number)
7636     0x43,
7637     // connection_id
7638     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7639     // packet number
7640     0x12, 0x34, 0x56, 0x78,
7641 
7642     // frame type (go away frame)
7643     0x03,
7644     // error code
7645     0x05, 0x06, 0x07, 0x08,
7646     // stream id
7647     0x01, 0x02, 0x03, 0x04,
7648     // error details length
7649     0x00, 0x0d,
7650     // error details
7651     'b',  'e',  'c',  'a',
7652     'u',  's',  'e',  ' ',
7653     'I',  ' ',  'c',  'a',
7654     'n',
7655   };
7656 
7657   // clang-format on
7658   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7659   ASSERT_TRUE(data != nullptr);
7660 
7661   quiche::test::CompareCharArraysWithHexError(
7662       "constructed packet", data->data(), data->length(), AsChars(packet),
7663       ABSL_ARRAYSIZE(packet));
7664 }
7665 
TEST_P(QuicFramerTest,BuildTruncatedGoAwayPacket)7666 TEST_P(QuicFramerTest, BuildTruncatedGoAwayPacket) {
7667   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7668     // This frame is only for Google QUIC.
7669     return;
7670   }
7671   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7672   QuicPacketHeader header;
7673   header.destination_connection_id = FramerTestConnectionId();
7674   header.reset_flag = false;
7675   header.version_flag = false;
7676   header.packet_number = kPacketNumber;
7677 
7678   QuicGoAwayFrame goaway_frame;
7679   goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
7680   goaway_frame.last_good_stream_id = kStreamId;
7681   goaway_frame.reason_phrase = std::string(2048, 'A');
7682 
7683   QuicFrames frames = {QuicFrame(&goaway_frame)};
7684 
7685   // clang-format off
7686   unsigned char packet[] = {
7687     // type (short header, 4 byte packet number)
7688     0x43,
7689     // connection_id
7690     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7691     // packet number
7692     0x12, 0x34, 0x56, 0x78,
7693 
7694     // frame type (go away frame)
7695     0x03,
7696     // error code
7697     0x05, 0x06, 0x07, 0x08,
7698     // stream id
7699     0x01, 0x02, 0x03, 0x04,
7700     // error details length
7701     0x01, 0x00,
7702     // error details (truncated to 256 bytes)
7703     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7704     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7705     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7706     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7707     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7708     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7709     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7710     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7711     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7712     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7713     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7714     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7715     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7716     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7717     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7718     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7719     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7720     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7721     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7722     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7723     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7724     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7725     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7726     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7727     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7728     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7729     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7730     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7731     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7732     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7733     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7734     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
7735   };
7736   // clang-format on
7737 
7738   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7739   ASSERT_TRUE(data != nullptr);
7740 
7741   quiche::test::CompareCharArraysWithHexError(
7742       "constructed packet", data->data(), data->length(), AsChars(packet),
7743       ABSL_ARRAYSIZE(packet));
7744 }
7745 
TEST_P(QuicFramerTest,BuildWindowUpdatePacket)7746 TEST_P(QuicFramerTest, BuildWindowUpdatePacket) {
7747   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7748   QuicPacketHeader header;
7749   header.destination_connection_id = FramerTestConnectionId();
7750   header.reset_flag = false;
7751   header.version_flag = false;
7752   header.packet_number = kPacketNumber;
7753 
7754   QuicWindowUpdateFrame window_update_frame;
7755   window_update_frame.stream_id = kStreamId;
7756   window_update_frame.max_data = 0x1122334455667788;
7757 
7758   QuicFrames frames = {QuicFrame(window_update_frame)};
7759 
7760   // clang-format off
7761   unsigned char packet[] = {
7762     // type (short header, 4 byte packet number)
7763     0x43,
7764     // connection_id
7765     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7766     // packet number
7767     0x12, 0x34, 0x56, 0x78,
7768 
7769     // frame type (window update frame)
7770     0x04,
7771     // stream id
7772     0x01, 0x02, 0x03, 0x04,
7773     // byte offset
7774     0x11, 0x22, 0x33, 0x44,
7775     0x55, 0x66, 0x77, 0x88,
7776   };
7777 
7778   unsigned char packet_ietf[] = {
7779     // type (short header, 4 byte packet number)
7780     0x43,
7781     // connection_id
7782     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7783     // packet number
7784     0x12, 0x34, 0x56, 0x78,
7785 
7786     // frame type (IETF_MAX_STREAM_DATA frame)
7787     0x11,
7788     // stream id
7789     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
7790     // byte offset
7791     kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
7792     0x55, 0x66, 0x77, 0x88,
7793   };
7794   // clang-format on
7795 
7796   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7797   ASSERT_TRUE(data != nullptr);
7798 
7799   unsigned char* p = packet;
7800   size_t p_size = ABSL_ARRAYSIZE(packet);
7801   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7802     p = packet_ietf;
7803     p_size = ABSL_ARRAYSIZE(packet_ietf);
7804   }
7805 
7806   quiche::test::CompareCharArraysWithHexError(
7807       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7808 }
7809 
TEST_P(QuicFramerTest,BuildMaxStreamDataPacket)7810 TEST_P(QuicFramerTest, BuildMaxStreamDataPacket) {
7811   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
7812     // This frame is only for IETF QUIC.
7813     return;
7814   }
7815   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7816   QuicPacketHeader header;
7817   header.destination_connection_id = FramerTestConnectionId();
7818   header.reset_flag = false;
7819   header.version_flag = false;
7820   header.packet_number = kPacketNumber;
7821 
7822   QuicWindowUpdateFrame window_update_frame;
7823   window_update_frame.stream_id = kStreamId;
7824   window_update_frame.max_data = 0x1122334455667788;
7825 
7826   QuicFrames frames = {QuicFrame(window_update_frame)};
7827 
7828   // clang-format off
7829   unsigned char packet_ietf[] = {
7830     // type (short header, 4 byte packet number)
7831     0x43,
7832     // connection_id
7833     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7834     // packet number
7835     0x12, 0x34, 0x56, 0x78,
7836 
7837     // frame type (IETF_MAX_STREAM_DATA frame)
7838     0x11,
7839     // stream id
7840     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
7841     // byte offset
7842     kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
7843     0x55, 0x66, 0x77, 0x88,
7844   };
7845   // clang-format on
7846 
7847   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7848   ASSERT_TRUE(data != nullptr);
7849 
7850   quiche::test::CompareCharArraysWithHexError(
7851       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
7852       ABSL_ARRAYSIZE(packet_ietf));
7853 }
7854 
TEST_P(QuicFramerTest,BuildMaxDataPacket)7855 TEST_P(QuicFramerTest, BuildMaxDataPacket) {
7856   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
7857     // This frame is only for IETF QUIC.
7858     return;
7859   }
7860   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7861   QuicPacketHeader header;
7862   header.destination_connection_id = FramerTestConnectionId();
7863   header.reset_flag = false;
7864   header.version_flag = false;
7865   header.packet_number = kPacketNumber;
7866 
7867   QuicWindowUpdateFrame window_update_frame;
7868   window_update_frame.stream_id =
7869       QuicUtils::GetInvalidStreamId(framer_.transport_version());
7870   window_update_frame.max_data = 0x1122334455667788;
7871 
7872   QuicFrames frames = {QuicFrame(window_update_frame)};
7873 
7874   // clang-format off
7875   unsigned char packet_ietf[] = {
7876     // type (short header, 4 byte packet number)
7877     0x43,
7878     // connection_id
7879     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7880     // packet number
7881     0x12, 0x34, 0x56, 0x78,
7882 
7883     // frame type (IETF_MAX_DATA frame)
7884     0x10,
7885     // byte offset
7886     kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
7887     0x55, 0x66, 0x77, 0x88,
7888   };
7889   // clang-format on
7890 
7891   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7892   ASSERT_TRUE(data != nullptr);
7893 
7894   quiche::test::CompareCharArraysWithHexError(
7895       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
7896       ABSL_ARRAYSIZE(packet_ietf));
7897 }
7898 
TEST_P(QuicFramerTest,BuildBlockedPacket)7899 TEST_P(QuicFramerTest, BuildBlockedPacket) {
7900   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7901   QuicPacketHeader header;
7902   header.destination_connection_id = FramerTestConnectionId();
7903   header.reset_flag = false;
7904   header.version_flag = false;
7905   header.packet_number = kPacketNumber;
7906 
7907   QuicBlockedFrame blocked_frame;
7908   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7909     // For IETF QUIC, the stream ID must be <invalid> for the frame
7910     // to be a BLOCKED frame. if it's valid, it will be a
7911     // STREAM_BLOCKED frame.
7912     blocked_frame.stream_id =
7913         QuicUtils::GetInvalidStreamId(framer_.transport_version());
7914   } else {
7915     blocked_frame.stream_id = kStreamId;
7916   }
7917   blocked_frame.offset = kStreamOffset;
7918 
7919   QuicFrames frames = {QuicFrame(blocked_frame)};
7920 
7921   // clang-format off
7922   unsigned char packet[] = {
7923     // type (short packet, 4 byte packet number)
7924     0x43,
7925     // connection_id
7926     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7927     // packet number
7928     0x12, 0x34, 0x56, 0x78,
7929 
7930     // frame type (blocked frame)
7931     0x05,
7932     // stream id
7933     0x01, 0x02, 0x03, 0x04,
7934   };
7935 
7936   unsigned char packet_ietf[] = {
7937     // type (short packet, 4 byte packet number)
7938     0x43,
7939     // connection_id
7940     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7941     // packet number
7942     0x12, 0x34, 0x56, 0x78,
7943 
7944     // frame type (IETF_DATA_BLOCKED frame)
7945     0x14,
7946     // Offset
7947     kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
7948   };
7949   // clang-format on
7950 
7951   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7952   ASSERT_TRUE(data != nullptr);
7953 
7954   unsigned char* p = packet;
7955   size_t p_size = ABSL_ARRAYSIZE(packet);
7956   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7957     p = packet_ietf;
7958     p_size = ABSL_ARRAYSIZE(packet_ietf);
7959   }
7960 
7961   quiche::test::CompareCharArraysWithHexError(
7962       "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7963 }
7964 
TEST_P(QuicFramerTest,BuildPingPacket)7965 TEST_P(QuicFramerTest, BuildPingPacket) {
7966   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7967   QuicPacketHeader header;
7968   header.destination_connection_id = FramerTestConnectionId();
7969   header.reset_flag = false;
7970   header.version_flag = false;
7971   header.packet_number = kPacketNumber;
7972 
7973   QuicFrames frames = {QuicFrame(QuicPingFrame())};
7974 
7975   // clang-format off
7976   unsigned char packet[] = {
7977     // type (short header, 4 byte packet number)
7978     0x43,
7979     // connection_id
7980     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7981     // packet number
7982     0x12, 0x34, 0x56, 0x78,
7983 
7984     // frame type
7985     0x07,
7986   };
7987 
7988   unsigned char packet_ietf[] = {
7989     // type (short header, 4 byte packet number)
7990     0x43,
7991     // connection_id
7992     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7993     // packet number
7994     0x12, 0x34, 0x56, 0x78,
7995 
7996     // frame type (IETF_PING frame)
7997     0x01,
7998   };
7999   // clang-format on
8000 
8001   unsigned char* p = packet;
8002   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8003     p = packet_ietf;
8004   }
8005 
8006   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8007   ASSERT_TRUE(data != nullptr);
8008 
8009   quiche::test::CompareCharArraysWithHexError(
8010       "constructed packet", data->data(), data->length(), AsChars(p),
8011       ABSL_ARRAYSIZE(packet));
8012 }
8013 
TEST_P(QuicFramerTest,BuildHandshakeDonePacket)8014 TEST_P(QuicFramerTest, BuildHandshakeDonePacket) {
8015   QuicPacketHeader header;
8016   header.destination_connection_id = FramerTestConnectionId();
8017   header.reset_flag = false;
8018   header.version_flag = false;
8019   header.packet_number = kPacketNumber;
8020 
8021   QuicFrames frames = {QuicFrame(QuicHandshakeDoneFrame())};
8022 
8023   // clang-format off
8024   unsigned char packet[] = {
8025     // type (short header, 4 byte packet number)
8026     0x43,
8027     // connection_id
8028     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8029     // packet number
8030     0x12, 0x34, 0x56, 0x78,
8031 
8032     // frame type (Handshake done frame)
8033     0x1e,
8034   };
8035   // clang-format on
8036   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8037     return;
8038   }
8039 
8040   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8041   ASSERT_TRUE(data != nullptr);
8042 
8043   quiche::test::CompareCharArraysWithHexError(
8044       "constructed packet", data->data(), data->length(), AsChars(packet),
8045       ABSL_ARRAYSIZE(packet));
8046 }
8047 
TEST_P(QuicFramerTest,BuildAckFrequencyPacket)8048 TEST_P(QuicFramerTest, BuildAckFrequencyPacket) {
8049   QuicPacketHeader header;
8050   header.destination_connection_id = FramerTestConnectionId();
8051   header.reset_flag = false;
8052   header.version_flag = false;
8053   header.packet_number = kPacketNumber;
8054 
8055   QuicAckFrequencyFrame ack_frequency_frame;
8056   ack_frequency_frame.sequence_number = 3;
8057   ack_frequency_frame.packet_tolerance = 5;
8058   ack_frequency_frame.max_ack_delay = QuicTime::Delta::FromMicroseconds(0x3fff);
8059   ack_frequency_frame.ignore_order = false;
8060   QuicFrames frames = {QuicFrame(&ack_frequency_frame)};
8061 
8062   // clang-format off
8063   unsigned char packet[] = {
8064     // type (short header, 4 byte packet number)
8065     0x43,
8066     // connection_id
8067     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8068     // packet number
8069     0x12, 0x34, 0x56, 0x78,
8070 
8071     // frame type (Ack Frequency frame)
8072     0x40, 0xaf,
8073     // sequence number
8074     0x03,
8075     // packet tolerance
8076     0x05,
8077     // max_ack_delay_us
8078     0x7f, 0xff,
8079     // ignore_oder
8080     0x00
8081   };
8082   // clang-format on
8083   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8084     return;
8085   }
8086 
8087   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8088   ASSERT_TRUE(data != nullptr);
8089 
8090   quiche::test::CompareCharArraysWithHexError(
8091       "constructed packet", data->data(), data->length(), AsChars(packet),
8092       ABSL_ARRAYSIZE(packet));
8093 }
8094 
TEST_P(QuicFramerTest,BuildMessagePacket)8095 TEST_P(QuicFramerTest, BuildMessagePacket) {
8096   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8097   QuicPacketHeader header;
8098   header.destination_connection_id = FramerTestConnectionId();
8099   header.reset_flag = false;
8100   header.version_flag = false;
8101   header.packet_number = kPacketNumber;
8102 
8103   QuicMessageFrame frame(1, MemSliceFromString("message"));
8104   QuicMessageFrame frame2(2, MemSliceFromString("message2"));
8105   QuicFrames frames = {QuicFrame(&frame), QuicFrame(&frame2)};
8106 
8107   // clang-format off
8108   unsigned char packet[] = {
8109     // type (short header, 4 byte packet number)
8110     0x43,
8111     // connection_id
8112     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8113     // packet number
8114     0x12, 0x34, 0x56, 0x78,
8115 
8116     // frame type (message frame)
8117     0x21,
8118     // Length
8119     0x07,
8120     // Message Data
8121     'm', 'e', 's', 's', 'a', 'g', 'e',
8122     // frame type (message frame no length)
8123     0x20,
8124     // Message Data
8125     'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8126   };
8127 
8128   unsigned char packet_ietf[] = {
8129     // type (short header, 4 byte packet number)
8130     0x43,
8131     // connection_id
8132     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8133     // packet number
8134     0x12, 0x34, 0x56, 0x78,
8135 
8136     // frame type (IETF_MESSAGE frame)
8137     0x31,
8138     // Length
8139     0x07,
8140     // Message Data
8141     'm', 'e', 's', 's', 'a', 'g', 'e',
8142     // frame type (message frame no length)
8143     0x30,
8144     // Message Data
8145     'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8146   };
8147   // clang-format on
8148 
8149   unsigned char* p = packet;
8150   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8151     p = packet_ietf;
8152   }
8153 
8154   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8155   ASSERT_TRUE(data != nullptr);
8156 
8157   quiche::test::CompareCharArraysWithHexError(
8158       "constructed packet", data->data(), data->length(), AsChars(p),
8159       ABSL_ARRAYSIZE(packet));
8160 }
8161 
8162 // Test that the MTU discovery packet is serialized correctly as a PING packet.
TEST_P(QuicFramerTest,BuildMtuDiscoveryPacket)8163 TEST_P(QuicFramerTest, BuildMtuDiscoveryPacket) {
8164   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8165   QuicPacketHeader header;
8166   header.destination_connection_id = FramerTestConnectionId();
8167   header.reset_flag = false;
8168   header.version_flag = false;
8169   header.packet_number = kPacketNumber;
8170 
8171   QuicFrames frames = {QuicFrame(QuicMtuDiscoveryFrame())};
8172 
8173   // clang-format off
8174   unsigned char packet[] = {
8175     // type (short header, 4 byte packet number)
8176     0x43,
8177     // connection_id
8178     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8179     // packet number
8180     0x12, 0x34, 0x56, 0x78,
8181 
8182     // frame type
8183     0x07,
8184   };
8185 
8186   unsigned char packet_ietf[] = {
8187     // type (short header, 4 byte packet number)
8188     0x43,
8189     // connection_id
8190     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8191     // packet number
8192     0x12, 0x34, 0x56, 0x78,
8193 
8194     // frame type (IETF_PING frame)
8195     0x01,
8196   };
8197   // clang-format on
8198 
8199   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8200   ASSERT_TRUE(data != nullptr);
8201 
8202   unsigned char* p = packet;
8203   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8204     p = packet_ietf;
8205   }
8206 
8207   quiche::test::CompareCharArraysWithHexError(
8208       "constructed packet", data->data(), data->length(), AsChars(p),
8209       ABSL_ARRAYSIZE(packet));
8210 }
8211 
TEST_P(QuicFramerTest,BuildPublicResetPacket)8212 TEST_P(QuicFramerTest, BuildPublicResetPacket) {
8213   QuicPublicResetPacket reset_packet;
8214   reset_packet.connection_id = FramerTestConnectionId();
8215   reset_packet.nonce_proof = kNonceProof;
8216 
8217   // clang-format off
8218   unsigned char packet[] = {
8219     // public flags (public reset, 8 byte ConnectionId)
8220     0x0E,
8221     // connection_id
8222     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8223     // message tag (kPRST)
8224     'P', 'R', 'S', 'T',
8225     // num_entries (1) + padding
8226     0x01, 0x00, 0x00, 0x00,
8227     // tag kRNON
8228     'R', 'N', 'O', 'N',
8229     // end offset 8
8230     0x08, 0x00, 0x00, 0x00,
8231     // nonce proof
8232     0x89, 0x67, 0x45, 0x23,
8233     0x01, 0xEF, 0xCD, 0xAB,
8234   };
8235   // clang-format on
8236 
8237   std::unique_ptr<QuicEncryptedPacket> data(
8238       framer_.BuildPublicResetPacket(reset_packet));
8239   ASSERT_TRUE(data != nullptr);
8240   quiche::test::CompareCharArraysWithHexError(
8241       "constructed packet", data->data(), data->length(), AsChars(packet),
8242       ABSL_ARRAYSIZE(packet));
8243 }
8244 
TEST_P(QuicFramerTest,BuildPublicResetPacketWithClientAddress)8245 TEST_P(QuicFramerTest, BuildPublicResetPacketWithClientAddress) {
8246   QuicPublicResetPacket reset_packet;
8247   reset_packet.connection_id = FramerTestConnectionId();
8248   reset_packet.nonce_proof = kNonceProof;
8249   reset_packet.client_address =
8250       QuicSocketAddress(QuicIpAddress::Loopback4(), 0x1234);
8251 
8252   // clang-format off
8253   unsigned char packet[] = {
8254       // public flags (public reset, 8 byte ConnectionId)
8255       0x0E,
8256       // connection_id
8257       0xFE, 0xDC, 0xBA, 0x98,
8258       0x76, 0x54, 0x32, 0x10,
8259       // message tag (kPRST)
8260       'P', 'R', 'S', 'T',
8261       // num_entries (2) + padding
8262       0x02, 0x00, 0x00, 0x00,
8263       // tag kRNON
8264       'R', 'N', 'O', 'N',
8265       // end offset 8
8266       0x08, 0x00, 0x00, 0x00,
8267       // tag kCADR
8268       'C', 'A', 'D', 'R',
8269       // end offset 16
8270       0x10, 0x00, 0x00, 0x00,
8271       // nonce proof
8272       0x89, 0x67, 0x45, 0x23,
8273       0x01, 0xEF, 0xCD, 0xAB,
8274       // client address
8275       0x02, 0x00,
8276       0x7F, 0x00, 0x00, 0x01,
8277       0x34, 0x12,
8278   };
8279   // clang-format on
8280 
8281   std::unique_ptr<QuicEncryptedPacket> data(
8282       framer_.BuildPublicResetPacket(reset_packet));
8283   ASSERT_TRUE(data != nullptr);
8284 
8285   quiche::test::CompareCharArraysWithHexError(
8286       "constructed packet", data->data(), data->length(), AsChars(packet),
8287       ABSL_ARRAYSIZE(packet));
8288 }
8289 
TEST_P(QuicFramerTest,BuildPublicResetPacketWithEndpointId)8290 TEST_P(QuicFramerTest, BuildPublicResetPacketWithEndpointId) {
8291   QuicPublicResetPacket reset_packet;
8292   reset_packet.connection_id = FramerTestConnectionId();
8293   reset_packet.nonce_proof = kNonceProof;
8294   reset_packet.endpoint_id = "FakeServerId";
8295 
8296   // The tag value map in CryptoHandshakeMessage is a std::map, so the two tags
8297   // in the packet, kRNON and kEPID, have unspecified ordering w.r.t each other.
8298   // clang-format off
8299   unsigned char packet_variant1[] = {
8300       // public flags (public reset, 8 byte ConnectionId)
8301       0x0E,
8302       // connection_id
8303       0xFE, 0xDC, 0xBA, 0x98,
8304       0x76, 0x54, 0x32, 0x10,
8305       // message tag (kPRST)
8306       'P', 'R', 'S', 'T',
8307       // num_entries (2) + padding
8308       0x02, 0x00, 0x00, 0x00,
8309       // tag kRNON
8310       'R', 'N', 'O', 'N',
8311       // end offset 8
8312       0x08, 0x00, 0x00, 0x00,
8313       // tag kEPID
8314       'E', 'P', 'I', 'D',
8315       // end offset 20
8316       0x14, 0x00, 0x00, 0x00,
8317       // nonce proof
8318       0x89, 0x67, 0x45, 0x23,
8319       0x01, 0xEF, 0xCD, 0xAB,
8320       // Endpoint ID
8321       'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
8322   };
8323   unsigned char packet_variant2[] = {
8324       // public flags (public reset, 8 byte ConnectionId)
8325       0x0E,
8326       // connection_id
8327       0xFE, 0xDC, 0xBA, 0x98,
8328       0x76, 0x54, 0x32, 0x10,
8329       // message tag (kPRST)
8330       'P', 'R', 'S', 'T',
8331       // num_entries (2) + padding
8332       0x02, 0x00, 0x00, 0x00,
8333       // tag kEPID
8334       'E', 'P', 'I', 'D',
8335       // end offset 12
8336       0x0C, 0x00, 0x00, 0x00,
8337       // tag kRNON
8338       'R', 'N', 'O', 'N',
8339       // end offset 20
8340       0x14, 0x00, 0x00, 0x00,
8341       // Endpoint ID
8342       'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
8343       // nonce proof
8344       0x89, 0x67, 0x45, 0x23,
8345       0x01, 0xEF, 0xCD, 0xAB,
8346   };
8347   // clang-format on
8348 
8349   std::unique_ptr<QuicEncryptedPacket> data(
8350       framer_.BuildPublicResetPacket(reset_packet));
8351   ASSERT_TRUE(data != nullptr);
8352 
8353   // Variant 1 ends with char 'd'. Variant 1 ends with char 0xAB.
8354   if ('d' == data->data()[data->length() - 1]) {
8355     quiche::test::CompareCharArraysWithHexError(
8356         "constructed packet", data->data(), data->length(),
8357         AsChars(packet_variant1), ABSL_ARRAYSIZE(packet_variant1));
8358   } else {
8359     quiche::test::CompareCharArraysWithHexError(
8360         "constructed packet", data->data(), data->length(),
8361         AsChars(packet_variant2), ABSL_ARRAYSIZE(packet_variant2));
8362   }
8363 }
8364 
TEST_P(QuicFramerTest,BuildIetfStatelessResetPacket)8365 TEST_P(QuicFramerTest, BuildIetfStatelessResetPacket) {
8366   // clang-format off
8367     unsigned char packet[] = {
8368       // 1st byte 01XX XXXX
8369       0x40,
8370       // At least 4 bytes of random bytes.
8371       0x00, 0x00, 0x00, 0x00,
8372       // stateless reset token
8373       0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
8374       0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
8375     };
8376   // clang-format on
8377 
8378   // Build the minimal stateless reset packet.
8379   std::unique_ptr<QuicEncryptedPacket> data(
8380       framer_.BuildIetfStatelessResetPacket(
8381           FramerTestConnectionId(),
8382           QuicFramer::GetMinStatelessResetPacketLength() + 1,
8383           kTestStatelessResetToken));
8384   ASSERT_TRUE(data);
8385   EXPECT_EQ(QuicFramer::GetMinStatelessResetPacketLength(), data->length());
8386   // Verify the first 2 bits are 01.
8387   EXPECT_FALSE(data->data()[0] & FLAGS_LONG_HEADER);
8388   EXPECT_TRUE(data->data()[0] & FLAGS_FIXED_BIT);
8389   // Verify stateless reset token.
8390   quiche::test::CompareCharArraysWithHexError(
8391       "constructed packet",
8392       data->data() + data->length() - kStatelessResetTokenLength,
8393       kStatelessResetTokenLength,
8394       AsChars(packet) + ABSL_ARRAYSIZE(packet) - kStatelessResetTokenLength,
8395       kStatelessResetTokenLength);
8396 
8397   // Packets with length <= minimal stateless reset does not trigger stateless
8398   // reset.
8399   std::unique_ptr<QuicEncryptedPacket> data2(
8400       framer_.BuildIetfStatelessResetPacket(
8401           FramerTestConnectionId(),
8402           QuicFramer::GetMinStatelessResetPacketLength(),
8403           kTestStatelessResetToken));
8404   ASSERT_FALSE(data2);
8405 
8406   // Do not send stateless reset >= minimal stateless reset + 1 + max
8407   // connection ID length.
8408   std::unique_ptr<QuicEncryptedPacket> data3(
8409       framer_.BuildIetfStatelessResetPacket(FramerTestConnectionId(), 1000,
8410                                             kTestStatelessResetToken));
8411   ASSERT_TRUE(data3);
8412   EXPECT_EQ(QuicFramer::GetMinStatelessResetPacketLength() + 1 +
8413                 kQuicMaxConnectionIdWithLengthPrefixLength,
8414             data3->length());
8415 }
8416 
TEST_P(QuicFramerTest,BuildIetfStatelessResetPacketCallerProvidedRandomBytes)8417 TEST_P(QuicFramerTest, BuildIetfStatelessResetPacketCallerProvidedRandomBytes) {
8418   // clang-format off
8419     unsigned char packet[] = {
8420       // 1st byte 01XX XXXX
8421       0x7c,
8422       // Random bytes
8423       0x7c, 0x7c, 0x7c, 0x7c,
8424       // stateless reset token
8425       0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
8426       0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
8427     };
8428   // clang-format on
8429 
8430   // Build the minimal stateless reset packet with caller-provided random bytes.
8431   MockRandom random;
8432   auto generate_random_bytes = [](void* data, size_t len) {
8433     std::string bytes(len, 0x7c);
8434     memcpy(data, bytes.data(), bytes.size());
8435   };
8436   EXPECT_CALL(random, InsecureRandBytes(_, _))
8437       .WillOnce(testing::Invoke(generate_random_bytes));
8438   std::unique_ptr<QuicEncryptedPacket> data(
8439       framer_.BuildIetfStatelessResetPacket(
8440           FramerTestConnectionId(),
8441           QuicFramer::GetMinStatelessResetPacketLength() + 1,
8442           kTestStatelessResetToken, &random));
8443   ASSERT_TRUE(data);
8444   EXPECT_EQ(QuicFramer::GetMinStatelessResetPacketLength(), data->length());
8445   // Verify the first 2 bits are 01.
8446   EXPECT_FALSE(data->data()[0] & FLAGS_LONG_HEADER);
8447   EXPECT_TRUE(data->data()[0] & FLAGS_FIXED_BIT);
8448   // Verify the entire packet.
8449   quiche::test::CompareCharArraysWithHexError(
8450       "constructed packet", data->data(), data->length(), AsChars(packet),
8451       ABSL_ARRAYSIZE(packet));
8452 }
8453 
TEST_P(QuicFramerTest,EncryptPacket)8454 TEST_P(QuicFramerTest, EncryptPacket) {
8455   QuicPacketNumber packet_number = kPacketNumber;
8456   // clang-format off
8457   unsigned char packet[] = {
8458     // type (short header, 4 byte packet number)
8459     0x43,
8460     // connection_id
8461     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8462     // packet number
8463     0x12, 0x34, 0x56, 0x78,
8464 
8465     // redundancy
8466     'a',  'b',  'c',  'd',
8467     'e',  'f',  'g',  'h',
8468     'i',  'j',  'k',  'l',
8469     'm',  'n',  'o',  'p',
8470   };
8471 
8472   unsigned char packet50[] = {
8473     // type (short header, 4 byte packet number)
8474     0x43,
8475     // connection_id
8476     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8477     // packet number
8478     0x12, 0x34, 0x56, 0x78,
8479 
8480     // redundancy
8481     'a',  'b',  'c',  'd',
8482     'e',  'f',  'g',  'h',
8483     'i',  'j',  'k',  'l',
8484     'm',  'n',  'o',  'p',
8485     'q',  'r',  's',  't',
8486   };
8487   // clang-format on
8488 
8489   unsigned char* p = packet;
8490   size_t p_size = ABSL_ARRAYSIZE(packet);
8491   if (framer_.version().HasHeaderProtection()) {
8492     p = packet50;
8493     p_size = ABSL_ARRAYSIZE(packet50);
8494   }
8495 
8496   std::unique_ptr<QuicPacket> raw(new QuicPacket(
8497       AsChars(p), p_size, false, kPacket8ByteConnectionId,
8498       kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
8499       PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
8500       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0));
8501   char buffer[kMaxOutgoingPacketSize];
8502   size_t encrypted_length = framer_.EncryptPayload(
8503       ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
8504 
8505   ASSERT_NE(0u, encrypted_length);
8506   EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
8507 }
8508 
8509 // Regression test for b/158014497.
TEST_P(QuicFramerTest,EncryptEmptyPacket)8510 TEST_P(QuicFramerTest, EncryptEmptyPacket) {
8511   auto packet = std::make_unique<QuicPacket>(
8512       new char[100], 0, true, kPacket8ByteConnectionId,
8513       kPacket0ByteConnectionId,
8514       /*includes_version=*/true,
8515       /*includes_diversification_nonce=*/true, PACKET_1BYTE_PACKET_NUMBER,
8516       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
8517       /*retry_token_length=*/0, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
8518   char buffer[kMaxOutgoingPacketSize];
8519   size_t encrypted_length = 1;
8520   EXPECT_QUIC_BUG(
8521       {
8522         encrypted_length =
8523             framer_.EncryptPayload(ENCRYPTION_INITIAL, kPacketNumber, *packet,
8524                                    buffer, kMaxOutgoingPacketSize);
8525         EXPECT_EQ(0u, encrypted_length);
8526       },
8527       "packet is shorter than associated data length");
8528 }
8529 
TEST_P(QuicFramerTest,EncryptPacketWithVersionFlag)8530 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) {
8531   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8532   QuicPacketNumber packet_number = kPacketNumber;
8533   // clang-format off
8534   unsigned char packet[] = {
8535     // type (long header with packet type ZERO_RTT_PROTECTED)
8536     0xD3,
8537     // version tag
8538     'Q', '.', '1', '0',
8539     // connection_id length
8540     0x50,
8541     // connection_id
8542     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8543     // packet number
8544     0x12, 0x34, 0x56, 0x78,
8545 
8546     // redundancy
8547     'a',  'b',  'c',  'd',
8548     'e',  'f',  'g',  'h',
8549     'i',  'j',  'k',  'l',
8550     'm',  'n',  'o',  'p',
8551   };
8552 
8553   unsigned char packet50[] = {
8554     // type (long header with packet type ZERO_RTT_PROTECTED)
8555     0xD3,
8556     // version tag
8557     'Q', '.', '1', '0',
8558     // destination connection ID length
8559     0x08,
8560     // destination connection ID
8561     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8562     // source connection ID length
8563     0x00,
8564     // packet number
8565     0x12, 0x34, 0x56, 0x78,
8566 
8567     // redundancy
8568     'a',  'b',  'c',  'd',
8569     'e',  'f',  'g',  'h',
8570     'i',  'j',  'k',  'l',
8571     'm',  'n',  'o',  'p',
8572     'q',  'r',  's',  't',
8573   };
8574   // clang-format on
8575 
8576   unsigned char* p = packet;
8577   size_t p_size = ABSL_ARRAYSIZE(packet);
8578   // TODO(ianswett): see todo in previous test.
8579   if (framer_.version().HasHeaderProtection()) {
8580     p = packet50;
8581     p_size = ABSL_ARRAYSIZE(packet50);
8582   }
8583 
8584   std::unique_ptr<QuicPacket> raw(new QuicPacket(
8585       AsChars(p), p_size, false, kPacket8ByteConnectionId,
8586       kPacket0ByteConnectionId, kIncludeVersion, !kIncludeDiversificationNonce,
8587       PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
8588       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0));
8589   char buffer[kMaxOutgoingPacketSize];
8590   size_t encrypted_length = framer_.EncryptPayload(
8591       ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
8592 
8593   ASSERT_NE(0u, encrypted_length);
8594   EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
8595 }
8596 
TEST_P(QuicFramerTest,AckTruncationLargePacket)8597 TEST_P(QuicFramerTest, AckTruncationLargePacket) {
8598   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8599     // This test is not applicable to this version; the range count is
8600     // effectively unlimited
8601     return;
8602   }
8603   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8604 
8605   QuicPacketHeader header;
8606   header.destination_connection_id = FramerTestConnectionId();
8607   header.reset_flag = false;
8608   header.version_flag = false;
8609   header.packet_number = kPacketNumber;
8610 
8611   QuicAckFrame ack_frame;
8612   // Create a packet with just the ack.
8613   ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
8614   QuicFrames frames = {QuicFrame(&ack_frame)};
8615 
8616   // Build an ack packet with truncation due to limit in number of nack ranges.
8617   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8618   std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
8619   ASSERT_TRUE(raw_ack_packet != nullptr);
8620   char buffer[kMaxOutgoingPacketSize];
8621   size_t encrypted_length =
8622       framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
8623                              *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
8624   ASSERT_NE(0u, encrypted_length);
8625   // Now make sure we can turn our ack packet back into an ack frame.
8626   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
8627   ASSERT_TRUE(framer_.ProcessPacket(
8628       QuicEncryptedPacket(buffer, encrypted_length, false)));
8629   ASSERT_EQ(1u, visitor_.ack_frames_.size());
8630   QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
8631   EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
8632   ASSERT_EQ(256u, processed_ack_frame.packets.NumPacketsSlow());
8633   EXPECT_EQ(QuicPacketNumber(90u), processed_ack_frame.packets.Min());
8634   EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
8635 }
8636 
8637 // Regression test for b/150386368.
TEST_P(QuicFramerTest,IetfAckFrameTruncation)8638 TEST_P(QuicFramerTest, IetfAckFrameTruncation) {
8639   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8640     return;
8641   }
8642   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8643 
8644   QuicPacketHeader header;
8645   header.destination_connection_id = FramerTestConnectionId();
8646   header.reset_flag = false;
8647   header.version_flag = false;
8648   header.packet_number = kPacketNumber;
8649 
8650   QuicAckFrame ack_frame;
8651   // Create a packet with just the ack.
8652   ack_frame = MakeAckFrameWithGaps(/*gap_size=*/0xffffffff,
8653                                    /*max_num_gaps=*/200,
8654                                    /*largest_acked=*/kMaxIetfVarInt);
8655   ack_frame.ecn_counters = QuicEcnCounts(100, 10000, 1000000);
8656   QuicFrames frames = {QuicFrame(&ack_frame)};
8657   // Build an ACK packet.
8658   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8659   std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
8660   ASSERT_TRUE(raw_ack_packet != nullptr);
8661   char buffer[kMaxOutgoingPacketSize];
8662   size_t encrypted_length =
8663       framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
8664                              *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
8665   ASSERT_NE(0u, encrypted_length);
8666   // Now make sure we can turn our ack packet back into an ack frame.
8667   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
8668   ASSERT_TRUE(framer_.ProcessPacket(
8669       QuicEncryptedPacket(buffer, encrypted_length, false)));
8670   ASSERT_EQ(1u, visitor_.ack_frames_.size());
8671   QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
8672   EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
8673             LargestAcked(processed_ack_frame));
8674   // Verify ACK frame gets truncated.
8675   ASSERT_LT(processed_ack_frame.packets.NumPacketsSlow(),
8676             ack_frame.packets.NumIntervals());
8677   EXPECT_EQ(157u, processed_ack_frame.packets.NumPacketsSlow());
8678   EXPECT_LT(processed_ack_frame.packets.NumIntervals(),
8679             ack_frame.packets.NumIntervals());
8680   EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
8681             processed_ack_frame.packets.Max());
8682 }
8683 
TEST_P(QuicFramerTest,AckTruncationSmallPacket)8684 TEST_P(QuicFramerTest, AckTruncationSmallPacket) {
8685   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8686     // This test is not applicable to this version; the range count is
8687     // effectively unlimited
8688     return;
8689   }
8690   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8691 
8692   QuicPacketHeader header;
8693   header.destination_connection_id = FramerTestConnectionId();
8694   header.reset_flag = false;
8695   header.version_flag = false;
8696   header.packet_number = kPacketNumber;
8697 
8698   // Create a packet with just the ack.
8699   QuicAckFrame ack_frame;
8700   ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
8701   QuicFrames frames = {QuicFrame(&ack_frame)};
8702 
8703   // Build an ack packet with truncation due to limit in number of nack ranges.
8704   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8705   std::unique_ptr<QuicPacket> raw_ack_packet(
8706       BuildDataPacket(header, frames, 500));
8707   ASSERT_TRUE(raw_ack_packet != nullptr);
8708   char buffer[kMaxOutgoingPacketSize];
8709   size_t encrypted_length =
8710       framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
8711                              *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
8712   ASSERT_NE(0u, encrypted_length);
8713   // Now make sure we can turn our ack packet back into an ack frame.
8714   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
8715   ASSERT_TRUE(framer_.ProcessPacket(
8716       QuicEncryptedPacket(buffer, encrypted_length, false)));
8717   ASSERT_EQ(1u, visitor_.ack_frames_.size());
8718   QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
8719   EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
8720   ASSERT_EQ(240u, processed_ack_frame.packets.NumPacketsSlow());
8721   EXPECT_EQ(QuicPacketNumber(122u), processed_ack_frame.packets.Min());
8722   EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
8723 }
8724 
TEST_P(QuicFramerTest,CleanTruncation)8725 TEST_P(QuicFramerTest, CleanTruncation) {
8726   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8727     // This test is not applicable to this version; the range count is
8728     // effectively unlimited
8729     return;
8730   }
8731   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8732 
8733   QuicPacketHeader header;
8734   header.destination_connection_id = FramerTestConnectionId();
8735   header.reset_flag = false;
8736   header.version_flag = false;
8737   header.packet_number = kPacketNumber;
8738 
8739   QuicAckFrame ack_frame = InitAckFrame(201);
8740 
8741   // Create a packet with just the ack.
8742   QuicFrames frames = {QuicFrame(&ack_frame)};
8743   if (framer_.version().HasHeaderProtection()) {
8744     frames.push_back(QuicFrame(QuicPaddingFrame(12)));
8745   }
8746   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8747   std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
8748   ASSERT_TRUE(raw_ack_packet != nullptr);
8749 
8750   char buffer[kMaxOutgoingPacketSize];
8751   size_t encrypted_length =
8752       framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
8753                              *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
8754   ASSERT_NE(0u, encrypted_length);
8755 
8756   // Now make sure we can turn our ack packet back into an ack frame.
8757   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
8758   ASSERT_TRUE(framer_.ProcessPacket(
8759       QuicEncryptedPacket(buffer, encrypted_length, false)));
8760 
8761   // Test for clean truncation of the ack by comparing the length of the
8762   // original packets to the re-serialized packets.
8763   frames.clear();
8764   frames.push_back(QuicFrame(visitor_.ack_frames_[0].get()));
8765   if (framer_.version().HasHeaderProtection()) {
8766     frames.push_back(QuicFrame(*visitor_.padding_frames_[0].get()));
8767   }
8768 
8769   size_t original_raw_length = raw_ack_packet->length();
8770   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8771   raw_ack_packet = BuildDataPacket(header, frames);
8772   ASSERT_TRUE(raw_ack_packet != nullptr);
8773   EXPECT_EQ(original_raw_length, raw_ack_packet->length());
8774   ASSERT_TRUE(raw_ack_packet != nullptr);
8775 }
8776 
TEST_P(QuicFramerTest,StopPacketProcessing)8777 TEST_P(QuicFramerTest, StopPacketProcessing) {
8778   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8779   // clang-format off
8780   unsigned char packet[] = {
8781     // type (short header, 4 byte packet number)
8782     0x43,
8783     // connection_id
8784     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8785     // packet number
8786     0x12, 0x34, 0x56, 0x78,
8787 
8788     // frame type (stream frame with fin)
8789     0xFF,
8790     // stream id
8791     0x01, 0x02, 0x03, 0x04,
8792     // offset
8793     0x3A, 0x98, 0xFE, 0xDC,
8794     0x32, 0x10, 0x76, 0x54,
8795     // data length
8796     0x00, 0x0c,
8797     // data
8798     'h',  'e',  'l',  'l',
8799     'o',  ' ',  'w',  'o',
8800     'r',  'l',  'd',  '!',
8801 
8802     // frame type (ack frame)
8803     0x40,
8804     // least packet number awaiting an ack
8805     0x12, 0x34, 0x56, 0x78,
8806     0x9A, 0xA0,
8807     // largest observed packet number
8808     0x12, 0x34, 0x56, 0x78,
8809     0x9A, 0xBF,
8810     // num missing packets
8811     0x01,
8812     // missing packet
8813     0x12, 0x34, 0x56, 0x78,
8814     0x9A, 0xBE,
8815   };
8816 
8817   unsigned char packet_ietf[] = {
8818     // type (short header, 4 byte packet number)
8819     0x43,
8820     // connection_id
8821     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8822     // packet number
8823     0x12, 0x34, 0x56, 0x78,
8824 
8825     // frame type (IETF_STREAM frame with fin, length, and offset bits set)
8826     0x08 | 0x01 | 0x02 | 0x04,
8827     // stream id
8828     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
8829     // offset
8830     kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
8831     0x32, 0x10, 0x76, 0x54,
8832     // data length
8833     kVarInt62TwoBytes + 0x00, 0x0c,
8834     // data
8835     'h',  'e',  'l',  'l',
8836     'o',  ' ',  'w',  'o',
8837     'r',  'l',  'd',  '!',
8838 
8839     // frame type (ack frame)
8840     0x0d,
8841     // largest observed packet number
8842     kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
8843     // Delta time
8844     kVarInt62OneByte + 0x00,
8845     // Ack Block count
8846     kVarInt62OneByte + 0x01,
8847     // First block size (one packet)
8848     kVarInt62OneByte + 0x00,
8849 
8850     // Next gap size & ack. Missing all preceding packets
8851     kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
8852     kVarInt62OneByte + 0x00,
8853   };
8854   // clang-format on
8855 
8856   MockFramerVisitor visitor;
8857   framer_.set_visitor(&visitor);
8858   EXPECT_CALL(visitor, OnPacket());
8859   EXPECT_CALL(visitor, OnPacketHeader(_));
8860   EXPECT_CALL(visitor, OnStreamFrame(_)).WillOnce(Return(false));
8861   EXPECT_CALL(visitor, OnPacketComplete());
8862   EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true));
8863   EXPECT_CALL(visitor, OnUnauthenticatedHeader(_)).WillOnce(Return(true));
8864   EXPECT_CALL(visitor, OnDecryptedPacket(_, _));
8865 
8866   unsigned char* p = packet;
8867   size_t p_size = ABSL_ARRAYSIZE(packet);
8868   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8869     p = packet_ietf;
8870     p_size = ABSL_ARRAYSIZE(packet_ietf);
8871   }
8872   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
8873   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
8874   EXPECT_THAT(framer_.error(), IsQuicNoError());
8875 }
8876 
8877 static char kTestString[] = "At least 20 characters.";
8878 static QuicStreamId kTestQuicStreamId = 1;
8879 
8880 MATCHER_P(ExpectedStreamFrame, version, "") {
8881   return (arg.stream_id == kTestQuicStreamId ||
8882           QuicUtils::IsCryptoStreamId(version.transport_version,
8883                                       arg.stream_id)) &&
8884          !arg.fin && arg.offset == 0 &&
8885          std::string(arg.data_buffer, arg.data_length) == kTestString;
8886   // FIN is hard-coded false in ConstructEncryptedPacket.
8887   // Offset 0 is hard-coded in ConstructEncryptedPacket.
8888 }
8889 
8890 // Verify that the packet returned by ConstructEncryptedPacket() can be properly
8891 // parsed by the framer.
TEST_P(QuicFramerTest,ConstructEncryptedPacket)8892 TEST_P(QuicFramerTest, ConstructEncryptedPacket) {
8893   // Since we are using ConstructEncryptedPacket, we have to set the framer's
8894   // crypto to be Null.
8895   if (framer_.version().KnowsWhichDecrypterToUse()) {
8896     framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
8897                              std::make_unique<StrictTaggingDecrypter>(
8898                                  (uint8_t)ENCRYPTION_FORWARD_SECURE));
8899   } else {
8900     framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
8901                          std::make_unique<StrictTaggingDecrypter>(
8902                              (uint8_t)ENCRYPTION_FORWARD_SECURE));
8903   }
8904   ParsedQuicVersionVector versions;
8905   versions.push_back(framer_.version());
8906   std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket(
8907       TestConnectionId(), EmptyQuicConnectionId(), false, false,
8908       kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
8909       CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, &versions));
8910 
8911   MockFramerVisitor visitor;
8912   framer_.set_visitor(&visitor);
8913   EXPECT_CALL(visitor, OnPacket()).Times(1);
8914   EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
8915       .Times(1)
8916       .WillOnce(Return(true));
8917   EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
8918       .Times(1)
8919       .WillOnce(Return(true));
8920   EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1).WillOnce(Return(true));
8921   EXPECT_CALL(visitor, OnDecryptedPacket(_, _)).Times(1);
8922   EXPECT_CALL(visitor, OnError(_)).Times(0);
8923   EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
8924   if (!QuicVersionUsesCryptoFrames(framer_.version().transport_version)) {
8925     EXPECT_CALL(visitor, OnStreamFrame(ExpectedStreamFrame(framer_.version())))
8926         .Times(1);
8927   } else {
8928     EXPECT_CALL(visitor, OnCryptoFrame(_)).Times(1);
8929   }
8930   EXPECT_CALL(visitor, OnPacketComplete()).Times(1);
8931 
8932   EXPECT_TRUE(framer_.ProcessPacket(*packet));
8933   EXPECT_THAT(framer_.error(), IsQuicNoError());
8934 }
8935 
8936 // Verify that the packet returned by ConstructMisFramedEncryptedPacket()
8937 // does cause the framer to return an error.
TEST_P(QuicFramerTest,ConstructMisFramedEncryptedPacket)8938 TEST_P(QuicFramerTest, ConstructMisFramedEncryptedPacket) {
8939   // Since we are using ConstructEncryptedPacket, we have to set the framer's
8940   // crypto to be Null.
8941   if (framer_.version().KnowsWhichDecrypterToUse()) {
8942     framer_.InstallDecrypter(
8943         ENCRYPTION_FORWARD_SECURE,
8944         std::make_unique<StrictTaggingDecrypter>(ENCRYPTION_FORWARD_SECURE));
8945   }
8946   std::unique_ptr<QuicEncryptedPacket> packet(ConstructMisFramedEncryptedPacket(
8947       TestConnectionId(), EmptyQuicConnectionId(), false, false,
8948       kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
8949       CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, framer_.version(),
8950       Perspective::IS_CLIENT));
8951 
8952   MockFramerVisitor visitor;
8953   framer_.set_visitor(&visitor);
8954   EXPECT_CALL(visitor, OnPacket()).Times(1);
8955   EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
8956       .Times(1)
8957       .WillOnce(Return(true));
8958   EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
8959       .Times(1)
8960       .WillOnce(Return(true));
8961   EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1);
8962   EXPECT_CALL(visitor, OnDecryptedPacket(_, _)).Times(1);
8963   EXPECT_CALL(visitor, OnError(_)).Times(1);
8964   EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
8965   EXPECT_CALL(visitor, OnPacketComplete()).Times(0);
8966 
8967   EXPECT_FALSE(framer_.ProcessPacket(*packet));
8968   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
8969 }
8970 
TEST_P(QuicFramerTest,IetfBlockedFrame)8971 TEST_P(QuicFramerTest, IetfBlockedFrame) {
8972   // This frame is only for IETF QUIC.
8973   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8974     return;
8975   }
8976   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8977 
8978   // clang-format off
8979   PacketFragments packet_ietf = {
8980       // type (short header, 4 byte packet number)
8981       {"",
8982        {0x43}},
8983       // connection_id
8984       {"",
8985        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
8986       // packet number
8987       {"",
8988        {0x12, 0x34, 0x9A, 0xBC}},
8989       // frame type (IETF_DATA_BLOCKED)
8990       {"",
8991        {0x14}},
8992       // blocked offset
8993       {"Can not read blocked offset.",
8994        {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
8995   };
8996   // clang-format on
8997 
8998   std::unique_ptr<QuicEncryptedPacket> encrypted(
8999       AssemblePacketFromFragments(packet_ietf));
9000   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9001 
9002   EXPECT_THAT(framer_.error(), IsQuicNoError());
9003   ASSERT_TRUE(visitor_.header_.get());
9004   EXPECT_TRUE(CheckDecryption(
9005       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9006       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9007 
9008   EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
9009 
9010   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_BLOCKED_DATA);
9011 }
9012 
TEST_P(QuicFramerTest,BuildIetfBlockedPacket)9013 TEST_P(QuicFramerTest, BuildIetfBlockedPacket) {
9014   // This frame is only for IETF QUIC.
9015   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9016     return;
9017   }
9018 
9019   QuicPacketHeader header;
9020   header.destination_connection_id = FramerTestConnectionId();
9021   header.reset_flag = false;
9022   header.version_flag = false;
9023   header.packet_number = kPacketNumber;
9024 
9025   QuicBlockedFrame frame;
9026   frame.stream_id = QuicUtils::GetInvalidStreamId(framer_.transport_version());
9027   frame.offset = kStreamOffset;
9028   QuicFrames frames = {QuicFrame(frame)};
9029 
9030   // clang-format off
9031   unsigned char packet_ietf[] = {
9032     // type (short header, 4 byte packet number)
9033     0x43,
9034     // connection_id
9035     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9036     // packet number
9037     0x12, 0x34, 0x56, 0x78,
9038 
9039     // frame type (IETF_DATA_BLOCKED)
9040     0x14,
9041     // Offset
9042     kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
9043   };
9044   // clang-format on
9045 
9046   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9047   ASSERT_TRUE(data != nullptr);
9048 
9049   quiche::test::CompareCharArraysWithHexError(
9050       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9051       ABSL_ARRAYSIZE(packet_ietf));
9052 }
9053 
TEST_P(QuicFramerTest,IetfStreamBlockedFrame)9054 TEST_P(QuicFramerTest, IetfStreamBlockedFrame) {
9055   // This frame is only for IETF QUIC.
9056   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9057     return;
9058   }
9059   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9060 
9061   // clang-format off
9062   PacketFragments packet_ietf = {
9063       // type (short header, 4 byte packet number)
9064       {"",
9065        {0x43}},
9066       // connection_id
9067       {"",
9068        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9069       // packet number
9070       {"",
9071        {0x12, 0x34, 0x9A, 0xBC}},
9072       // frame type (IETF_STREAM_DATA_BLOCKED)
9073       {"",
9074        {0x15}},
9075       // blocked offset
9076       {"Unable to read IETF_STREAM_DATA_BLOCKED frame stream id/count.",
9077        {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
9078       {"Can not read stream blocked offset.",
9079        {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
9080   };
9081   // clang-format on
9082 
9083   std::unique_ptr<QuicEncryptedPacket> encrypted(
9084       AssemblePacketFromFragments(packet_ietf));
9085   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9086 
9087   EXPECT_THAT(framer_.error(), IsQuicNoError());
9088   ASSERT_TRUE(visitor_.header_.get());
9089   EXPECT_TRUE(CheckDecryption(
9090       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9091       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9092 
9093   EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
9094   EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
9095 
9096   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_STREAM_BLOCKED_DATA);
9097 }
9098 
TEST_P(QuicFramerTest,BuildIetfStreamBlockedPacket)9099 TEST_P(QuicFramerTest, BuildIetfStreamBlockedPacket) {
9100   // This frame is only for IETF QUIC.
9101   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9102     return;
9103   }
9104 
9105   QuicPacketHeader header;
9106   header.destination_connection_id = FramerTestConnectionId();
9107   header.reset_flag = false;
9108   header.version_flag = false;
9109   header.packet_number = kPacketNumber;
9110 
9111   QuicBlockedFrame frame;
9112   frame.stream_id = kStreamId;
9113   frame.offset = kStreamOffset;
9114   QuicFrames frames = {QuicFrame(frame)};
9115 
9116   // clang-format off
9117   unsigned char packet_ietf[] = {
9118     // type (short header, 4 byte packet number)
9119     0x43,
9120     // connection_id
9121     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9122     // packet number
9123     0x12, 0x34, 0x56, 0x78,
9124 
9125     // frame type (IETF_STREAM_DATA_BLOCKED)
9126     0x15,
9127     // Stream ID
9128     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
9129     // Offset
9130     kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
9131   };
9132   // clang-format on
9133 
9134   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9135   ASSERT_TRUE(data != nullptr);
9136 
9137   quiche::test::CompareCharArraysWithHexError(
9138       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9139       ABSL_ARRAYSIZE(packet_ietf));
9140 }
9141 
TEST_P(QuicFramerTest,BiDiMaxStreamsFrame)9142 TEST_P(QuicFramerTest, BiDiMaxStreamsFrame) {
9143   // This frame is only for IETF QUIC.
9144   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9145     return;
9146   }
9147   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9148 
9149   // clang-format off
9150   PacketFragments packet_ietf = {
9151       // type (short header, 4 byte packet number)
9152       {"",
9153        {0x43}},
9154       // connection_id
9155       {"",
9156        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9157       // packet number
9158       {"",
9159        {0x12, 0x34, 0x9A, 0xBC}},
9160       // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9161       {"",
9162        {0x12}},
9163       // max. streams
9164       {"Unable to read IETF_MAX_STREAMS_BIDIRECTIONAL frame stream id/count.",
9165        {kVarInt62OneByte + 0x03}},
9166   };
9167   // clang-format on
9168 
9169   std::unique_ptr<QuicEncryptedPacket> encrypted(
9170       AssemblePacketFromFragments(packet_ietf));
9171   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9172 
9173   EXPECT_THAT(framer_.error(), IsQuicNoError());
9174   ASSERT_TRUE(visitor_.header_.get());
9175   EXPECT_TRUE(CheckDecryption(
9176       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9177       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9178 
9179   EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9180   EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
9181   CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9182 }
9183 
TEST_P(QuicFramerTest,UniDiMaxStreamsFrame)9184 TEST_P(QuicFramerTest, UniDiMaxStreamsFrame) {
9185   // This frame is only for IETF QUIC.
9186   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9187     return;
9188   }
9189   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9190 
9191   // clang-format off
9192   PacketFragments packet_ietf = {
9193       // type (short header, 4 byte packet number)
9194       {"",
9195        {0x43}},
9196       // Test runs in client mode, no connection id
9197       // packet number
9198       {"",
9199        {0x12, 0x34, 0x9A, 0xBC}},
9200       // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9201       {"",
9202        {0x13}},
9203       // max. streams
9204       {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
9205        {kVarInt62OneByte + 0x03}},
9206   };
9207   // clang-format on
9208 
9209   std::unique_ptr<QuicEncryptedPacket> encrypted(
9210       AssemblePacketFromFragments(packet_ietf));
9211   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9212   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9213 
9214   EXPECT_THAT(framer_.error(), IsQuicNoError());
9215   ASSERT_TRUE(visitor_.header_.get());
9216   EXPECT_TRUE(CheckDecryption(
9217       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9218       kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9219 
9220   EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9221   EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9222   CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9223 }
9224 
TEST_P(QuicFramerTest,ServerUniDiMaxStreamsFrame)9225 TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrame) {
9226   // This frame is only for IETF QUIC.
9227   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9228     return;
9229   }
9230   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9231 
9232   // clang-format off
9233   PacketFragments packet_ietf = {
9234       // type (short header, 4 byte packet number)
9235       {"",
9236        {0x43}},
9237       // connection_id
9238       {"",
9239        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9240       // packet number
9241       {"",
9242        {0x12, 0x34, 0x9A, 0xBC}},
9243       // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9244       {"",
9245        {0x13}},
9246       // max. streams
9247       {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
9248        {kVarInt62OneByte + 0x03}},
9249   };
9250   // clang-format on
9251 
9252   std::unique_ptr<QuicEncryptedPacket> encrypted(
9253       AssemblePacketFromFragments(packet_ietf));
9254   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9255 
9256   EXPECT_THAT(framer_.error(), IsQuicNoError());
9257   ASSERT_TRUE(visitor_.header_.get());
9258   EXPECT_TRUE(CheckDecryption(
9259       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9260       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9261 
9262   EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9263   EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9264   CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9265 }
9266 
TEST_P(QuicFramerTest,ClientUniDiMaxStreamsFrame)9267 TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrame) {
9268   // This frame is only for IETF QUIC.
9269   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9270     return;
9271   }
9272   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9273 
9274   // clang-format off
9275   PacketFragments packet_ietf = {
9276       // type (short header, 4 byte packet number)
9277       {"",
9278        {0x43}},
9279       // Test runs in client mode, no connection id
9280       // packet number
9281       {"",
9282        {0x12, 0x34, 0x9A, 0xBC}},
9283       // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9284       {"",
9285        {0x13}},
9286       // max. streams
9287       {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
9288        {kVarInt62OneByte + 0x03}},
9289   };
9290   // clang-format on
9291 
9292   std::unique_ptr<QuicEncryptedPacket> encrypted(
9293       AssemblePacketFromFragments(packet_ietf));
9294   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9295   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9296 
9297   EXPECT_THAT(framer_.error(), IsQuicNoError());
9298   ASSERT_TRUE(visitor_.header_.get());
9299   EXPECT_TRUE(CheckDecryption(
9300       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9301       kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9302 
9303   EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9304   EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9305   CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9306 }
9307 
9308 // The following four tests ensure that the framer can deserialize a stream
9309 // count that is large enough to cause the resulting stream ID to exceed the
9310 // current implementation limit(32 bits). The intent is that when this happens,
9311 // the stream limit is pegged to the maximum supported value. There are four
9312 // tests, for the four combinations of uni- and bi-directional, server- and
9313 // client- initiated.
TEST_P(QuicFramerTest,BiDiMaxStreamsFrameTooBig)9314 TEST_P(QuicFramerTest, BiDiMaxStreamsFrameTooBig) {
9315   // This frame is only for IETF QUIC.
9316   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9317     return;
9318   }
9319   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9320 
9321   // clang-format off
9322   unsigned char packet_ietf[] = {
9323     // type (short header, 4 byte packet number)
9324     0x43,
9325     // connection_id
9326     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9327     // packet number
9328     0x12, 0x34, 0x9A, 0xBC,
9329     // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9330     0x12,
9331 
9332     // max. streams. Max stream ID allowed is 0xffffffff
9333     // This encodes a count of 0x40000000, leading to stream
9334     // IDs in the range 0x1 00000000 to 0x1 00000003.
9335     kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9336   };
9337   // clang-format on
9338 
9339   QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9340                                 ABSL_ARRAYSIZE(packet_ietf), false);
9341   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9342   EXPECT_THAT(framer_.error(), IsQuicNoError());
9343   ASSERT_TRUE(visitor_.header_.get());
9344   EXPECT_TRUE(CheckDecryption(
9345       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9346       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9347 
9348   EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
9349   EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
9350 }
9351 
TEST_P(QuicFramerTest,ClientBiDiMaxStreamsFrameTooBig)9352 TEST_P(QuicFramerTest, ClientBiDiMaxStreamsFrameTooBig) {
9353   // This frame is only for IETF QUIC.
9354   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9355     return;
9356   }
9357   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9358 
9359   // clang-format off
9360   unsigned char packet_ietf[] = {
9361     // type (short header, 4 byte packet number)
9362     0x43,
9363     // Test runs in client mode, no connection id
9364     // packet number
9365     0x12, 0x34, 0x9A, 0xBC,
9366     // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9367     0x12,
9368 
9369     // max. streams. Max stream ID allowed is 0xffffffff
9370     // This encodes a count of 0x40000000, leading to stream
9371     // IDs in the range 0x1 00000000 to 0x1 00000003.
9372     kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9373   };
9374   // clang-format on
9375 
9376   QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9377                                 ABSL_ARRAYSIZE(packet_ietf), false);
9378   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9379   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9380 
9381   EXPECT_THAT(framer_.error(), IsQuicNoError());
9382   ASSERT_TRUE(visitor_.header_.get());
9383   EXPECT_TRUE(CheckDecryption(
9384       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9385       kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9386 
9387   EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
9388   EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
9389 }
9390 
TEST_P(QuicFramerTest,ServerUniDiMaxStreamsFrameTooBig)9391 TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrameTooBig) {
9392   // This frame is only for IETF QUIC.
9393   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9394     return;
9395   }
9396   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9397 
9398   // clang-format off
9399   unsigned char packet_ietf[] = {
9400     // type (short header, 4 byte packet number)
9401     0x43,
9402     // connection_id
9403     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9404     // packet number
9405     0x12, 0x34, 0x9A, 0xBC,
9406     // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9407     0x13,
9408 
9409     // max. streams. Max stream ID allowed is 0xffffffff
9410     // This encodes a count of 0x40000000, leading to stream
9411     // IDs in the range 0x1 00000000 to 0x1 00000003.
9412     kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9413   };
9414   // clang-format on
9415 
9416   QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9417                                 ABSL_ARRAYSIZE(packet_ietf), false);
9418   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9419 
9420   EXPECT_THAT(framer_.error(), IsQuicNoError());
9421   ASSERT_TRUE(visitor_.header_.get());
9422   EXPECT_TRUE(CheckDecryption(
9423       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9424       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9425 
9426   EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
9427   EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9428 }
9429 
TEST_P(QuicFramerTest,ClientUniDiMaxStreamsFrameTooBig)9430 TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrameTooBig) {
9431   // This frame is only for IETF QUIC.
9432   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9433     return;
9434   }
9435   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9436 
9437   // clang-format off
9438   unsigned char packet_ietf[] = {
9439     // type (short header, 4 byte packet number)
9440     0x43,
9441     // Test runs in client mode, no connection id
9442     // packet number
9443     0x12, 0x34, 0x9A, 0xBC,
9444     // frame type (IETF_MAX_STREAMS_UNDIRECTIONAL)
9445     0x13,
9446 
9447     // max. streams. Max stream ID allowed is 0xffffffff
9448     // This encodes a count of 0x40000000, leading to stream
9449     // IDs in the range 0x1 00000000 to 0x1 00000003.
9450     kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9451   };
9452   // clang-format on
9453 
9454   QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9455                                 ABSL_ARRAYSIZE(packet_ietf), false);
9456   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9457   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9458 
9459   EXPECT_THAT(framer_.error(), IsQuicNoError());
9460   ASSERT_TRUE(visitor_.header_.get());
9461   EXPECT_TRUE(CheckDecryption(
9462       encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9463       kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9464 
9465   EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
9466   EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9467 }
9468 
9469 // Specifically test that count==0 is accepted.
TEST_P(QuicFramerTest,MaxStreamsFrameZeroCount)9470 TEST_P(QuicFramerTest, MaxStreamsFrameZeroCount) {
9471   // This frame is only for IETF QUIC.
9472   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9473     return;
9474   }
9475   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9476 
9477   // clang-format off
9478   unsigned char packet_ietf[] = {
9479     // type (short header, 4 byte packet number)
9480     0x43,
9481     // connection_id
9482     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9483     // packet number
9484     0x12, 0x34, 0x9A, 0xBC,
9485     // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9486     0x12,
9487     // max. streams == 0.
9488     kVarInt62OneByte + 0x00
9489   };
9490   // clang-format on
9491 
9492   QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9493                                 ABSL_ARRAYSIZE(packet_ietf), false);
9494   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9495 }
9496 
TEST_P(QuicFramerTest,ServerBiDiStreamsBlockedFrame)9497 TEST_P(QuicFramerTest, ServerBiDiStreamsBlockedFrame) {
9498   // This frame is only for IETF QUIC.
9499   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9500     return;
9501   }
9502   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9503 
9504   // clang-format off
9505   PacketFragments packet_ietf = {
9506       // type (short header, 4 byte packet number)
9507       {"",
9508        {0x43}},
9509       // connection_id
9510       {"",
9511        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9512       // packet number
9513       {"",
9514        {0x12, 0x34, 0x9A, 0xBC}},
9515       // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
9516       {"",
9517        {0x13}},
9518       // stream count
9519       {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
9520        {kVarInt62OneByte + 0x00}},
9521   };
9522   // clang-format on
9523 
9524   std::unique_ptr<QuicEncryptedPacket> encrypted(
9525       AssemblePacketFromFragments(packet_ietf));
9526   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9527 
9528   EXPECT_THAT(framer_.error(), IsQuicNoError());
9529   ASSERT_TRUE(visitor_.header_.get());
9530   EXPECT_TRUE(CheckDecryption(
9531       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9532       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9533 
9534   EXPECT_EQ(0u, visitor_.max_streams_frame_.stream_count);
9535   EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9536 
9537   CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9538 }
9539 
TEST_P(QuicFramerTest,BiDiStreamsBlockedFrame)9540 TEST_P(QuicFramerTest, BiDiStreamsBlockedFrame) {
9541   // This frame is only for IETF QUIC.
9542   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9543     return;
9544   }
9545   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9546 
9547   // clang-format off
9548   PacketFragments packet_ietf = {
9549       // type (short header, 4 byte packet number)
9550       {"",
9551        {0x43}},
9552       // connection_id
9553       {"",
9554        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9555       // packet number
9556       {"",
9557        {0x12, 0x34, 0x9A, 0xBC}},
9558       // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
9559       {"",
9560        {0x16}},
9561       // stream id
9562       {"Unable to read IETF_STREAMS_BLOCKED_BIDIRECTIONAL "
9563        "frame stream id/count.",
9564        {kVarInt62OneByte + 0x03}},
9565   };
9566   // clang-format on
9567 
9568   std::unique_ptr<QuicEncryptedPacket> encrypted(
9569       AssemblePacketFromFragments(packet_ietf));
9570   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9571 
9572   EXPECT_THAT(framer_.error(), IsQuicNoError());
9573   ASSERT_TRUE(visitor_.header_.get());
9574   EXPECT_TRUE(CheckDecryption(
9575       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9576       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9577 
9578   EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
9579   EXPECT_FALSE(visitor_.streams_blocked_frame_.unidirectional);
9580 
9581   CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
9582 }
9583 
TEST_P(QuicFramerTest,UniDiStreamsBlockedFrame)9584 TEST_P(QuicFramerTest, UniDiStreamsBlockedFrame) {
9585   // This frame is only for IETF QUIC.
9586   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9587     return;
9588   }
9589   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9590 
9591   // clang-format off
9592   PacketFragments packet_ietf = {
9593       // type (short header, 4 byte packet number)
9594       {"",
9595        {0x43}},
9596       // connection_id
9597       {"",
9598        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9599       // packet number
9600       {"",
9601        {0x12, 0x34, 0x9A, 0xBC}},
9602       // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
9603       {"",
9604        {0x17}},
9605       // stream id
9606       {"Unable to read IETF_STREAMS_BLOCKED_UNIDIRECTIONAL "
9607        "frame stream id/count.",
9608        {kVarInt62OneByte + 0x03}},
9609   };
9610   // clang-format on
9611 
9612   std::unique_ptr<QuicEncryptedPacket> encrypted(
9613       AssemblePacketFromFragments(packet_ietf));
9614   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9615 
9616   EXPECT_THAT(framer_.error(), IsQuicNoError());
9617   ASSERT_TRUE(visitor_.header_.get());
9618   EXPECT_TRUE(CheckDecryption(
9619       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9620       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9621 
9622   EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
9623   EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
9624   CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
9625 }
9626 
TEST_P(QuicFramerTest,ClientUniDiStreamsBlockedFrame)9627 TEST_P(QuicFramerTest, ClientUniDiStreamsBlockedFrame) {
9628   // This frame is only for IETF QUIC.
9629   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9630     return;
9631   }
9632   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9633 
9634   // clang-format off
9635   PacketFragments packet_ietf = {
9636       // type (short header, 4 byte packet number)
9637       {"",
9638        {0x43}},
9639       // Test runs in client mode, no connection id
9640       // packet number
9641       {"",
9642        {0x12, 0x34, 0x9A, 0xBC}},
9643       // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
9644       {"",
9645        {0x17}},
9646       // stream id
9647       {"Unable to read IETF_STREAMS_BLOCKED_UNIDIRECTIONAL "
9648        "frame stream id/count.",
9649        {kVarInt62OneByte + 0x03}},
9650   };
9651   // clang-format on
9652 
9653   std::unique_ptr<QuicEncryptedPacket> encrypted(
9654       AssemblePacketFromFragments(packet_ietf));
9655   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9656   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9657 
9658   EXPECT_THAT(framer_.error(), IsQuicNoError());
9659   ASSERT_TRUE(visitor_.header_.get());
9660   EXPECT_TRUE(CheckDecryption(
9661       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9662       kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9663 
9664   EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
9665   EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
9666   CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
9667 }
9668 
9669 // Check that when we get a STREAMS_BLOCKED frame that specifies too large
9670 // a stream count, we reject with an appropriate error. There is no need to
9671 // check for different combinations of Uni/Bi directional and client/server
9672 // initiated; the logic does not take these into account.
TEST_P(QuicFramerTest,StreamsBlockedFrameTooBig)9673 TEST_P(QuicFramerTest, StreamsBlockedFrameTooBig) {
9674   // This frame is only for IETF QUIC.
9675   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9676     return;
9677   }
9678   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9679 
9680   // clang-format off
9681   unsigned char packet_ietf[] = {
9682     // type (short header, 4 byte packet number)
9683     0x43,
9684     // Test runs in client mode, no connection id
9685     // packet number
9686     0x12, 0x34, 0x9A, 0xBC,
9687     // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL)
9688     0x16,
9689 
9690     // max. streams. Max stream ID allowed is 0xffffffff
9691     // This encodes a count of 0x40000000, leading to stream
9692     // IDs in the range 0x1 00000000 to 0x1 00000003.
9693     kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01
9694   };
9695   // clang-format on
9696 
9697   QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9698                                 ABSL_ARRAYSIZE(packet_ietf), false);
9699   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9700   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
9701 
9702   EXPECT_THAT(framer_.error(), IsError(QUIC_STREAMS_BLOCKED_DATA));
9703   EXPECT_EQ(framer_.detailed_error(),
9704             "STREAMS_BLOCKED stream count exceeds implementation limit.");
9705 }
9706 
9707 // Specifically test that count==0 is accepted.
TEST_P(QuicFramerTest,StreamsBlockedFrameZeroCount)9708 TEST_P(QuicFramerTest, StreamsBlockedFrameZeroCount) {
9709   // This frame is only for IETF QUIC.
9710   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9711     return;
9712   }
9713 
9714   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9715 
9716   // clang-format off
9717   PacketFragments packet_ietf = {
9718       // type (short header, 4 byte packet number)
9719       {"",
9720        {0x43}},
9721       // connection_id
9722       {"",
9723        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9724       // packet number
9725       {"",
9726        {0x12, 0x34, 0x9A, 0xBC}},
9727       // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
9728       {"",
9729        {0x17}},
9730       // stream id
9731       {"Unable to read IETF_STREAMS_BLOCKED_UNIDIRECTIONAL "
9732        "frame stream id/count.",
9733        {kVarInt62OneByte + 0x00}},
9734   };
9735   // clang-format on
9736 
9737   std::unique_ptr<QuicEncryptedPacket> encrypted(
9738       AssemblePacketFromFragments(packet_ietf));
9739   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9740 
9741   EXPECT_THAT(framer_.error(), IsQuicNoError());
9742   ASSERT_TRUE(visitor_.header_.get());
9743   EXPECT_TRUE(CheckDecryption(
9744       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9745       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9746 
9747   EXPECT_EQ(0u, visitor_.streams_blocked_frame_.stream_count);
9748   EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
9749 
9750   CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
9751 }
9752 
TEST_P(QuicFramerTest,BuildBiDiStreamsBlockedPacket)9753 TEST_P(QuicFramerTest, BuildBiDiStreamsBlockedPacket) {
9754   // This frame is only for IETF QUIC.
9755   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9756     return;
9757   }
9758 
9759   QuicPacketHeader header;
9760   header.destination_connection_id = FramerTestConnectionId();
9761   header.reset_flag = false;
9762   header.version_flag = false;
9763   header.packet_number = kPacketNumber;
9764 
9765   QuicStreamsBlockedFrame frame;
9766   frame.stream_count = 3;
9767   frame.unidirectional = false;
9768 
9769   QuicFrames frames = {QuicFrame(frame)};
9770 
9771   // clang-format off
9772   unsigned char packet_ietf[] = {
9773     // type (short header, 4 byte packet number)
9774     0x43,
9775     // connection_id
9776     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9777     // packet number
9778     0x12, 0x34, 0x56, 0x78,
9779 
9780     // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
9781     0x16,
9782     // Stream count
9783     kVarInt62OneByte + 0x03
9784   };
9785   // clang-format on
9786 
9787   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9788   ASSERT_TRUE(data != nullptr);
9789 
9790   quiche::test::CompareCharArraysWithHexError(
9791       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9792       ABSL_ARRAYSIZE(packet_ietf));
9793 }
9794 
TEST_P(QuicFramerTest,BuildUniStreamsBlockedPacket)9795 TEST_P(QuicFramerTest, BuildUniStreamsBlockedPacket) {
9796   // This frame is only for IETF QUIC.
9797   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9798     return;
9799   }
9800 
9801   QuicPacketHeader header;
9802   header.destination_connection_id = FramerTestConnectionId();
9803   header.reset_flag = false;
9804   header.version_flag = false;
9805   header.packet_number = kPacketNumber;
9806 
9807   QuicStreamsBlockedFrame frame;
9808   frame.stream_count = 3;
9809   frame.unidirectional = true;
9810 
9811   QuicFrames frames = {QuicFrame(frame)};
9812 
9813   // clang-format off
9814   unsigned char packet_ietf[] = {
9815     // type (short header, 4 byte packet number)
9816     0x43,
9817     // connection_id
9818     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9819     // packet number
9820     0x12, 0x34, 0x56, 0x78,
9821 
9822     // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
9823     0x17,
9824     // Stream count
9825     kVarInt62OneByte + 0x03
9826   };
9827   // clang-format on
9828 
9829   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9830   ASSERT_TRUE(data != nullptr);
9831 
9832   quiche::test::CompareCharArraysWithHexError(
9833       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9834       ABSL_ARRAYSIZE(packet_ietf));
9835 }
9836 
TEST_P(QuicFramerTest,BuildBiDiMaxStreamsPacket)9837 TEST_P(QuicFramerTest, BuildBiDiMaxStreamsPacket) {
9838   // This frame is only for IETF QUIC.
9839   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9840     return;
9841   }
9842 
9843   QuicPacketHeader header;
9844   header.destination_connection_id = FramerTestConnectionId();
9845   header.reset_flag = false;
9846   header.version_flag = false;
9847   header.packet_number = kPacketNumber;
9848 
9849   QuicMaxStreamsFrame frame;
9850   frame.stream_count = 3;
9851   frame.unidirectional = false;
9852 
9853   QuicFrames frames = {QuicFrame(frame)};
9854 
9855   // clang-format off
9856   unsigned char packet_ietf[] = {
9857     // type (short header, 4 byte packet number)
9858     0x43,
9859     // connection_id
9860     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9861     // packet number
9862     0x12, 0x34, 0x56, 0x78,
9863 
9864     // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL frame)
9865     0x12,
9866     // Stream count
9867     kVarInt62OneByte + 0x03
9868   };
9869   // clang-format on
9870 
9871   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9872   ASSERT_TRUE(data != nullptr);
9873 
9874   quiche::test::CompareCharArraysWithHexError(
9875       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9876       ABSL_ARRAYSIZE(packet_ietf));
9877 }
9878 
TEST_P(QuicFramerTest,BuildUniDiMaxStreamsPacket)9879 TEST_P(QuicFramerTest, BuildUniDiMaxStreamsPacket) {
9880   // This frame is only for IETF QUIC.
9881   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9882     return;
9883   }
9884 
9885   // This test runs in client mode.
9886   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9887 
9888   QuicPacketHeader header;
9889   header.destination_connection_id = FramerTestConnectionId();
9890   header.reset_flag = false;
9891   header.version_flag = false;
9892   header.packet_number = kPacketNumber;
9893 
9894   QuicMaxStreamsFrame frame;
9895   frame.stream_count = 3;
9896   frame.unidirectional = true;
9897 
9898   QuicFrames frames = {QuicFrame(frame)};
9899 
9900   // clang-format off
9901   unsigned char packet_ietf[] = {
9902     // type (short header, 4 byte packet number)
9903     0x43,
9904     // connection_id
9905     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9906     // packet number
9907     0x12, 0x34, 0x56, 0x78,
9908 
9909     // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
9910     0x13,
9911     // Stream count
9912     kVarInt62OneByte + 0x03
9913   };
9914   // clang-format on
9915 
9916   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9917   ASSERT_TRUE(data != nullptr);
9918 
9919   quiche::test::CompareCharArraysWithHexError(
9920       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9921       ABSL_ARRAYSIZE(packet_ietf));
9922 }
9923 
TEST_P(QuicFramerTest,NewConnectionIdFrame)9924 TEST_P(QuicFramerTest, NewConnectionIdFrame) {
9925   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9926     // This frame is only for IETF QUIC.
9927     return;
9928   }
9929   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9930   // clang-format off
9931   PacketFragments packet_ietf = {
9932       // type (short header, 4 byte packet number)
9933       {"",
9934        {0x43}},
9935       // connection_id
9936       {"",
9937        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9938       // packet number
9939       {"",
9940        {0x12, 0x34, 0x56, 0x78}},
9941       // frame type (IETF_NEW_CONNECTION_ID frame)
9942       {"",
9943        {0x18}},
9944       // error code
9945       {"Unable to read new connection ID frame sequence number.",
9946        {kVarInt62OneByte + 0x11}},
9947       {"Unable to read new connection ID frame retire_prior_to.",
9948        {kVarInt62OneByte + 0x09}},
9949       {"Unable to read new connection ID frame connection id.",
9950        {0x08}},  // connection ID length
9951       {"Unable to read new connection ID frame connection id.",
9952        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11}},
9953       {"Can not read new connection ID frame reset token.",
9954        {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
9955         0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}}
9956   };
9957   // clang-format on
9958 
9959   std::unique_ptr<QuicEncryptedPacket> encrypted(
9960       AssemblePacketFromFragments(packet_ietf));
9961   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9962 
9963   EXPECT_THAT(framer_.error(), IsQuicNoError());
9964   ASSERT_TRUE(visitor_.header_.get());
9965   EXPECT_TRUE(CheckDecryption(
9966       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9967       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9968 
9969   EXPECT_EQ(0u, visitor_.stream_frames_.size());
9970 
9971   EXPECT_EQ(FramerTestConnectionIdPlusOne(),
9972             visitor_.new_connection_id_.connection_id);
9973   EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
9974   EXPECT_EQ(0x09u, visitor_.new_connection_id_.retire_prior_to);
9975   EXPECT_EQ(kTestStatelessResetToken,
9976             visitor_.new_connection_id_.stateless_reset_token);
9977 
9978   ASSERT_EQ(0u, visitor_.ack_frames_.size());
9979 
9980   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
9981 }
9982 
TEST_P(QuicFramerTest,NewConnectionIdFrameVariableLength)9983 TEST_P(QuicFramerTest, NewConnectionIdFrameVariableLength) {
9984   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9985     // This frame is only for IETF QUIC.
9986     return;
9987   }
9988   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9989   // clang-format off
9990   PacketFragments packet_ietf = {
9991       // type (short header, 4 byte packet number)
9992       {"",
9993        {0x43}},
9994       // connection_id
9995       {"",
9996        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9997       // packet number
9998       {"",
9999        {0x12, 0x34, 0x56, 0x78}},
10000       // frame type (IETF_NEW_CONNECTION_ID frame)
10001       {"",
10002        {0x18}},
10003       // error code
10004       {"Unable to read new connection ID frame sequence number.",
10005        {kVarInt62OneByte + 0x11}},
10006       {"Unable to read new connection ID frame retire_prior_to.",
10007        {kVarInt62OneByte + 0x0a}},
10008       {"Unable to read new connection ID frame connection id.",
10009        {0x09}},  // connection ID length
10010       {"Unable to read new connection ID frame connection id.",
10011        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
10012       {"Can not read new connection ID frame reset token.",
10013        {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
10014         0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}}
10015   };
10016   // clang-format on
10017 
10018   std::unique_ptr<QuicEncryptedPacket> encrypted(
10019       AssemblePacketFromFragments(packet_ietf));
10020   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10021 
10022   EXPECT_THAT(framer_.error(), IsQuicNoError());
10023   ASSERT_TRUE(visitor_.header_.get());
10024   EXPECT_TRUE(CheckDecryption(
10025       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10026       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10027 
10028   EXPECT_EQ(0u, visitor_.stream_frames_.size());
10029 
10030   EXPECT_EQ(FramerTestConnectionIdNineBytes(),
10031             visitor_.new_connection_id_.connection_id);
10032   EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
10033   EXPECT_EQ(0x0au, visitor_.new_connection_id_.retire_prior_to);
10034   EXPECT_EQ(kTestStatelessResetToken,
10035             visitor_.new_connection_id_.stateless_reset_token);
10036 
10037   ASSERT_EQ(0u, visitor_.ack_frames_.size());
10038 
10039   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
10040 }
10041 
10042 // Verifies that parsing a NEW_CONNECTION_ID frame with a length above the
10043 // specified maximum fails.
TEST_P(QuicFramerTest,InvalidLongNewConnectionIdFrame)10044 TEST_P(QuicFramerTest, InvalidLongNewConnectionIdFrame) {
10045   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10046     // The NEW_CONNECTION_ID frame is only for IETF QUIC.
10047     return;
10048   }
10049   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10050   // clang-format off
10051   PacketFragments packet_ietf = {
10052       // type (short header, 4 byte packet number)
10053       {"",
10054        {0x43}},
10055       // connection_id
10056       {"",
10057        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10058       // packet number
10059       {"",
10060        {0x12, 0x34, 0x56, 0x78}},
10061       // frame type (IETF_NEW_CONNECTION_ID frame)
10062       {"",
10063        {0x18}},
10064       // error code
10065       {"Unable to read new connection ID frame sequence number.",
10066        {kVarInt62OneByte + 0x11}},
10067       {"Unable to read new connection ID frame retire_prior_to.",
10068        {kVarInt62OneByte + 0x0b}},
10069       {"Unable to read new connection ID frame connection id.",
10070        {0x40}},  // connection ID length
10071       {"Unable to read new connection ID frame connection id.",
10072        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10073         0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10074         0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10075         0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10076         0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10077         0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10078         0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10079         0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E}},
10080       {"Can not read new connection ID frame reset token.",
10081        {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10082         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10083   };
10084   // clang-format on
10085 
10086   std::unique_ptr<QuicEncryptedPacket> encrypted(
10087       AssemblePacketFromFragments(packet_ietf));
10088   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10089   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_NEW_CONNECTION_ID_DATA));
10090   EXPECT_EQ("Invalid new connection ID length for version.",
10091             framer_.detailed_error());
10092 }
10093 
10094 // Verifies that parsing a NEW_CONNECTION_ID frame with an invalid
10095 // retire-prior-to fails.
TEST_P(QuicFramerTest,InvalidRetirePriorToNewConnectionIdFrame)10096 TEST_P(QuicFramerTest, InvalidRetirePriorToNewConnectionIdFrame) {
10097   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10098     // This frame is only for IETF QUIC only.
10099     return;
10100   }
10101   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10102   // clang-format off
10103   PacketFragments packet_ietf = {
10104       // type (short header, 4 byte packet number)
10105       {"",
10106        {0x43}},
10107       // connection_id
10108       {"",
10109        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10110       // packet number
10111       {"",
10112        {0x12, 0x34, 0x56, 0x78}},
10113       // frame type (IETF_NEW_CONNECTION_ID frame)
10114       {"",
10115        {0x18}},
10116       // sequence number
10117       {"Unable to read new connection ID frame sequence number.",
10118        {kVarInt62OneByte + 0x11}},
10119       {"Unable to read new connection ID frame retire_prior_to.",
10120        {kVarInt62OneByte + 0x1b}},
10121       {"Unable to read new connection ID frame connection id length.",
10122        {0x08}},  // connection ID length
10123       {"Unable to read new connection ID frame connection id.",
10124        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11}},
10125       {"Can not read new connection ID frame reset token.",
10126        {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10127         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10128   };
10129   // clang-format on
10130 
10131   std::unique_ptr<QuicEncryptedPacket> encrypted(
10132       AssemblePacketFromFragments(packet_ietf));
10133   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10134   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_NEW_CONNECTION_ID_DATA));
10135   EXPECT_EQ("Retire_prior_to > sequence_number.", framer_.detailed_error());
10136 }
10137 
TEST_P(QuicFramerTest,BuildNewConnectionIdFramePacket)10138 TEST_P(QuicFramerTest, BuildNewConnectionIdFramePacket) {
10139   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10140     // This frame is only for IETF QUIC only.
10141     return;
10142   }
10143   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10144   QuicPacketHeader header;
10145   header.destination_connection_id = FramerTestConnectionId();
10146   header.reset_flag = false;
10147   header.version_flag = false;
10148   header.packet_number = kPacketNumber;
10149 
10150   QuicNewConnectionIdFrame frame;
10151   frame.sequence_number = 0x11;
10152   frame.retire_prior_to = 0x0c;
10153   // Use this value to force a 4-byte encoded variable length connection ID
10154   // in the frame.
10155   frame.connection_id = FramerTestConnectionIdPlusOne();
10156   frame.stateless_reset_token = kTestStatelessResetToken;
10157 
10158   QuicFrames frames = {QuicFrame(&frame)};
10159 
10160   // clang-format off
10161   unsigned char packet_ietf[] = {
10162     // type (short header, 4 byte packet number)
10163     0x43,
10164     // connection_id
10165     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10166     // packet number
10167     0x12, 0x34, 0x56, 0x78,
10168 
10169     // frame type (IETF_NEW_CONNECTION_ID frame)
10170     0x18,
10171     // sequence number
10172     kVarInt62OneByte + 0x11,
10173     // retire_prior_to
10174     kVarInt62OneByte + 0x0c,
10175     // new connection id length
10176     0x08,
10177     // new connection id
10178     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
10179     // stateless reset token
10180     0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
10181     0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
10182   };
10183   // clang-format on
10184 
10185   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10186   ASSERT_TRUE(data != nullptr);
10187 
10188   quiche::test::CompareCharArraysWithHexError(
10189       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10190       ABSL_ARRAYSIZE(packet_ietf));
10191 }
10192 
TEST_P(QuicFramerTest,NewTokenFrame)10193 TEST_P(QuicFramerTest, NewTokenFrame) {
10194   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10195     // This frame is only for IETF QUIC only.
10196     return;
10197   }
10198   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10199   // clang-format off
10200   PacketFragments packet = {
10201       // type (short header, 4 byte packet number)
10202       {"",
10203        {0x43}},
10204       // connection_id
10205       {"",
10206        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10207       // packet number
10208       {"",
10209        {0x12, 0x34, 0x56, 0x78}},
10210       // frame type (IETF_NEW_TOKEN frame)
10211       {"",
10212        {0x07}},
10213       // Length
10214       {"Unable to read new token length.",
10215        {kVarInt62OneByte + 0x08}},
10216       {"Unable to read new token data.",
10217        {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}}
10218   };
10219   // clang-format on
10220   uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
10221                                     0x04, 0x05, 0x06, 0x07};
10222 
10223   std::unique_ptr<QuicEncryptedPacket> encrypted(
10224       AssemblePacketFromFragments(packet));
10225   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10226 
10227   EXPECT_THAT(framer_.error(), IsQuicNoError());
10228   ASSERT_TRUE(visitor_.header_.get());
10229   EXPECT_TRUE(CheckDecryption(
10230       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10231       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10232 
10233   EXPECT_EQ(0u, visitor_.stream_frames_.size());
10234 
10235   EXPECT_EQ(sizeof(expected_token_value), visitor_.new_token_.token.length());
10236   EXPECT_EQ(0, memcmp(expected_token_value, visitor_.new_token_.token.data(),
10237                       sizeof(expected_token_value)));
10238 
10239   CheckFramingBoundaries(packet, QUIC_INVALID_NEW_TOKEN);
10240 }
10241 
TEST_P(QuicFramerTest,BuildNewTokenFramePacket)10242 TEST_P(QuicFramerTest, BuildNewTokenFramePacket) {
10243   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10244     // This frame is only for IETF QUIC only.
10245     return;
10246   }
10247   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10248   QuicPacketHeader header;
10249   header.destination_connection_id = FramerTestConnectionId();
10250   header.reset_flag = false;
10251   header.version_flag = false;
10252   header.packet_number = kPacketNumber;
10253 
10254   uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
10255                                     0x04, 0x05, 0x06, 0x07};
10256 
10257   QuicNewTokenFrame frame(0,
10258                           absl::string_view((const char*)(expected_token_value),
10259                                             sizeof(expected_token_value)));
10260 
10261   QuicFrames frames = {QuicFrame(&frame)};
10262 
10263   // clang-format off
10264   unsigned char packet[] = {
10265     // type (short header, 4 byte packet number)
10266     0x43,
10267     // connection_id
10268     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10269     // packet number
10270     0x12, 0x34, 0x56, 0x78,
10271 
10272     // frame type (IETF_NEW_TOKEN frame)
10273     0x07,
10274     // Length and token
10275     kVarInt62OneByte + 0x08,
10276     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
10277   };
10278   // clang-format on
10279 
10280   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10281   ASSERT_TRUE(data != nullptr);
10282 
10283   quiche::test::CompareCharArraysWithHexError(
10284       "constructed packet", data->data(), data->length(), AsChars(packet),
10285       ABSL_ARRAYSIZE(packet));
10286 }
10287 
TEST_P(QuicFramerTest,IetfStopSendingFrame)10288 TEST_P(QuicFramerTest, IetfStopSendingFrame) {
10289   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10290     // Stop sending frame is IETF QUIC only.
10291     return;
10292   }
10293   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10294 
10295   // clang-format off
10296   PacketFragments packet_ietf = {
10297       // type (short header, 4 byte packet number)
10298       {"",
10299        {0x43}},
10300       // connection_id
10301       {"",
10302        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10303       // packet number
10304       {"",
10305        {0x12, 0x34, 0x9A, 0xBC}},
10306       // frame type (IETF_STOP_SENDING frame)
10307       {"",
10308        {0x05}},
10309       // stream id
10310       {"Unable to read IETF_STOP_SENDING frame stream id/count.",
10311        {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
10312       {"Unable to read stop sending application error code.",
10313        {kVarInt62FourBytes + 0x00, 0x00, 0x76, 0x54}},
10314   };
10315   // clang-format on
10316 
10317   std::unique_ptr<QuicEncryptedPacket> encrypted(
10318       AssemblePacketFromFragments(packet_ietf));
10319   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10320 
10321   EXPECT_THAT(framer_.error(), IsQuicNoError());
10322   ASSERT_TRUE(visitor_.header_.get());
10323   EXPECT_TRUE(CheckDecryption(
10324       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10325       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10326 
10327   EXPECT_EQ(kStreamId, visitor_.stop_sending_frame_.stream_id);
10328   EXPECT_EQ(QUIC_STREAM_UNKNOWN_APPLICATION_ERROR_CODE,
10329             visitor_.stop_sending_frame_.error_code);
10330   EXPECT_EQ(static_cast<uint64_t>(0x7654),
10331             visitor_.stop_sending_frame_.ietf_error_code);
10332 
10333   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_STOP_SENDING_FRAME_DATA);
10334 }
10335 
TEST_P(QuicFramerTest,BuildIetfStopSendingPacket)10336 TEST_P(QuicFramerTest, BuildIetfStopSendingPacket) {
10337   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10338     // Stop sending frame is IETF QUIC only.
10339     return;
10340   }
10341 
10342   QuicPacketHeader header;
10343   header.destination_connection_id = FramerTestConnectionId();
10344   header.reset_flag = false;
10345   header.version_flag = false;
10346   header.packet_number = kPacketNumber;
10347 
10348   QuicStopSendingFrame frame;
10349   frame.stream_id = kStreamId;
10350   frame.error_code = QUIC_STREAM_ENCODER_STREAM_ERROR;
10351   frame.ietf_error_code =
10352       static_cast<uint64_t>(QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR);
10353   QuicFrames frames = {QuicFrame(frame)};
10354 
10355   // clang-format off
10356   unsigned char packet_ietf[] = {
10357     // type (short header, 4 byte packet number)
10358     0x43,
10359     // connection_id
10360     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10361     // packet number
10362     0x12, 0x34, 0x56, 0x78,
10363 
10364     // frame type (IETF_STOP_SENDING frame)
10365     0x05,
10366     // Stream ID
10367     kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
10368     // Application error code
10369     kVarInt62TwoBytes + 0x02, 0x01,
10370   };
10371   // clang-format on
10372 
10373   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10374   ASSERT_TRUE(data != nullptr);
10375 
10376   quiche::test::CompareCharArraysWithHexError(
10377       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10378       ABSL_ARRAYSIZE(packet_ietf));
10379 }
10380 
TEST_P(QuicFramerTest,IetfPathChallengeFrame)10381 TEST_P(QuicFramerTest, IetfPathChallengeFrame) {
10382   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10383     // Path Challenge frame is IETF QUIC only.
10384     return;
10385   }
10386   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10387 
10388   // clang-format off
10389   PacketFragments packet_ietf = {
10390       // type (short header, 4 byte packet number)
10391       {"",
10392        {0x43}},
10393       // connection_id
10394       {"",
10395        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10396       // packet number
10397       {"",
10398        {0x12, 0x34, 0x9A, 0xBC}},
10399       // frame type (IETF_PATH_CHALLENGE)
10400       {"",
10401        {0x1a}},
10402       // data
10403       {"Can not read path challenge data.",
10404        {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
10405   };
10406   // clang-format on
10407 
10408   std::unique_ptr<QuicEncryptedPacket> encrypted(
10409       AssemblePacketFromFragments(packet_ietf));
10410   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10411 
10412   EXPECT_THAT(framer_.error(), IsQuicNoError());
10413   ASSERT_TRUE(visitor_.header_.get());
10414   EXPECT_TRUE(CheckDecryption(
10415       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10416       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10417 
10418   EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
10419             visitor_.path_challenge_frame_.data_buffer);
10420 
10421   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_PATH_CHALLENGE_DATA);
10422 }
10423 
TEST_P(QuicFramerTest,BuildIetfPathChallengePacket)10424 TEST_P(QuicFramerTest, BuildIetfPathChallengePacket) {
10425   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10426     // Path Challenge frame is IETF QUIC only.
10427     return;
10428   }
10429 
10430   QuicPacketHeader header;
10431   header.destination_connection_id = FramerTestConnectionId();
10432   header.reset_flag = false;
10433   header.version_flag = false;
10434   header.packet_number = kPacketNumber;
10435 
10436   QuicPathChallengeFrame frame;
10437   frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
10438   QuicFrames frames = {QuicFrame(frame)};
10439 
10440   // clang-format off
10441   unsigned char packet_ietf[] = {
10442     // type (short header, 4 byte packet number)
10443     0x43,
10444     // connection_id
10445     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10446     // packet number
10447     0x12, 0x34, 0x56, 0x78,
10448 
10449     // frame type (IETF_PATH_CHALLENGE)
10450     0x1a,
10451     // Data
10452     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
10453   };
10454   // clang-format on
10455 
10456   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10457   ASSERT_TRUE(data != nullptr);
10458 
10459   quiche::test::CompareCharArraysWithHexError(
10460       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10461       ABSL_ARRAYSIZE(packet_ietf));
10462 }
10463 
TEST_P(QuicFramerTest,IetfPathResponseFrame)10464 TEST_P(QuicFramerTest, IetfPathResponseFrame) {
10465   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10466     // Path response frame is IETF QUIC only.
10467     return;
10468   }
10469   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10470 
10471   // clang-format off
10472   PacketFragments packet_ietf = {
10473       // type (short header, 4 byte packet number)
10474       {"",
10475        {0x43}},
10476       // connection_id
10477       {"",
10478        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10479       // packet number
10480       {"",
10481        {0x12, 0x34, 0x9A, 0xBC}},
10482       // frame type (IETF_PATH_RESPONSE)
10483       {"",
10484        {0x1b}},
10485       // data
10486       {"Can not read path response data.",
10487        {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
10488   };
10489   // clang-format on
10490 
10491   std::unique_ptr<QuicEncryptedPacket> encrypted(
10492       AssemblePacketFromFragments(packet_ietf));
10493   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10494 
10495   EXPECT_THAT(framer_.error(), IsQuicNoError());
10496   ASSERT_TRUE(visitor_.header_.get());
10497   EXPECT_TRUE(CheckDecryption(
10498       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10499       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10500 
10501   EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
10502             visitor_.path_response_frame_.data_buffer);
10503 
10504   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_PATH_RESPONSE_DATA);
10505 }
10506 
TEST_P(QuicFramerTest,BuildIetfPathResponsePacket)10507 TEST_P(QuicFramerTest, BuildIetfPathResponsePacket) {
10508   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10509     // Path response frame is IETF QUIC only
10510     return;
10511   }
10512 
10513   QuicPacketHeader header;
10514   header.destination_connection_id = FramerTestConnectionId();
10515   header.reset_flag = false;
10516   header.version_flag = false;
10517   header.packet_number = kPacketNumber;
10518 
10519   QuicPathResponseFrame frame;
10520   frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
10521   QuicFrames frames = {QuicFrame(frame)};
10522 
10523   // clang-format off
10524   unsigned char packet_ietf[] = {
10525     // type (short header, 4 byte packet number)
10526     0x43,
10527     // connection_id
10528     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10529     // packet number
10530     0x12, 0x34, 0x56, 0x78,
10531 
10532     // frame type (IETF_PATH_RESPONSE)
10533     0x1b,
10534     // Data
10535     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
10536   };
10537   // clang-format on
10538 
10539   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10540   ASSERT_TRUE(data != nullptr);
10541 
10542   quiche::test::CompareCharArraysWithHexError(
10543       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10544       ABSL_ARRAYSIZE(packet_ietf));
10545 }
10546 
TEST_P(QuicFramerTest,GetRetransmittableControlFrameSize)10547 TEST_P(QuicFramerTest, GetRetransmittableControlFrameSize) {
10548   QuicRstStreamFrame rst_stream(1, 3, QUIC_STREAM_CANCELLED, 1024);
10549   EXPECT_EQ(QuicFramer::GetRstStreamFrameSize(framer_.transport_version(),
10550                                               rst_stream),
10551             QuicFramer::GetRetransmittableControlFrameSize(
10552                 framer_.transport_version(), QuicFrame(&rst_stream)));
10553 
10554   std::string error_detail(2048, 'e');
10555   QuicConnectionCloseFrame connection_close(framer_.transport_version(),
10556                                             QUIC_NETWORK_IDLE_TIMEOUT,
10557                                             NO_IETF_QUIC_ERROR, error_detail,
10558                                             /*transport_close_frame_type=*/0);
10559 
10560   EXPECT_EQ(QuicFramer::GetConnectionCloseFrameSize(framer_.transport_version(),
10561                                                     connection_close),
10562             QuicFramer::GetRetransmittableControlFrameSize(
10563                 framer_.transport_version(), QuicFrame(&connection_close)));
10564 
10565   QuicGoAwayFrame goaway(2, QUIC_PEER_GOING_AWAY, 3, error_detail);
10566   EXPECT_EQ(QuicFramer::GetMinGoAwayFrameSize() + 256,
10567             QuicFramer::GetRetransmittableControlFrameSize(
10568                 framer_.transport_version(), QuicFrame(&goaway)));
10569 
10570   QuicWindowUpdateFrame window_update(3, 3, 1024);
10571   EXPECT_EQ(QuicFramer::GetWindowUpdateFrameSize(framer_.transport_version(),
10572                                                  window_update),
10573             QuicFramer::GetRetransmittableControlFrameSize(
10574                 framer_.transport_version(), QuicFrame(window_update)));
10575 
10576   QuicBlockedFrame blocked(4, 3, 1024);
10577   EXPECT_EQ(
10578       QuicFramer::GetBlockedFrameSize(framer_.transport_version(), blocked),
10579       QuicFramer::GetRetransmittableControlFrameSize(
10580           framer_.transport_version(), QuicFrame(blocked)));
10581 
10582   // Following frames are IETF QUIC frames only.
10583   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10584     return;
10585   }
10586 
10587   QuicNewConnectionIdFrame new_connection_id(5, TestConnectionId(), 1,
10588                                              kTestStatelessResetToken, 1);
10589   EXPECT_EQ(QuicFramer::GetNewConnectionIdFrameSize(new_connection_id),
10590             QuicFramer::GetRetransmittableControlFrameSize(
10591                 framer_.transport_version(), QuicFrame(&new_connection_id)));
10592 
10593   QuicMaxStreamsFrame max_streams(6, 3, /*unidirectional=*/false);
10594   EXPECT_EQ(QuicFramer::GetMaxStreamsFrameSize(framer_.transport_version(),
10595                                                max_streams),
10596             QuicFramer::GetRetransmittableControlFrameSize(
10597                 framer_.transport_version(), QuicFrame(max_streams)));
10598 
10599   QuicStreamsBlockedFrame streams_blocked(7, 3, /*unidirectional=*/false);
10600   EXPECT_EQ(QuicFramer::GetStreamsBlockedFrameSize(framer_.transport_version(),
10601                                                    streams_blocked),
10602             QuicFramer::GetRetransmittableControlFrameSize(
10603                 framer_.transport_version(), QuicFrame(streams_blocked)));
10604 
10605   QuicPathFrameBuffer buffer = {
10606       {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
10607   QuicPathResponseFrame path_response_frame(8, buffer);
10608   EXPECT_EQ(QuicFramer::GetPathResponseFrameSize(path_response_frame),
10609             QuicFramer::GetRetransmittableControlFrameSize(
10610                 framer_.transport_version(), QuicFrame(path_response_frame)));
10611 
10612   QuicPathChallengeFrame path_challenge_frame(9, buffer);
10613   EXPECT_EQ(QuicFramer::GetPathChallengeFrameSize(path_challenge_frame),
10614             QuicFramer::GetRetransmittableControlFrameSize(
10615                 framer_.transport_version(), QuicFrame(path_challenge_frame)));
10616 
10617   QuicStopSendingFrame stop_sending_frame(10, 3, QUIC_STREAM_CANCELLED);
10618   EXPECT_EQ(QuicFramer::GetStopSendingFrameSize(stop_sending_frame),
10619             QuicFramer::GetRetransmittableControlFrameSize(
10620                 framer_.transport_version(), QuicFrame(stop_sending_frame)));
10621 }
10622 
10623 // A set of tests to ensure that bad frame-type encodings
10624 // are properly detected and handled.
10625 // First, four tests to see that unknown frame types generate
10626 // a QUIC_INVALID_FRAME_DATA error with detailed information
10627 // "Illegal frame type." This regardless of the encoding of the type
10628 // (1/2/4/8 bytes).
10629 // This only for version 99.
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorUnknown1Byte)10630 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown1Byte) {
10631   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10632     // Only IETF QUIC encodes frame types such that this test is relevant.
10633     return;
10634   }
10635   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10636   // clang-format off
10637   PacketFragments packet = {
10638       // type (short header, 4 byte packet number)
10639       {"",
10640        {0x43}},
10641       // connection_id
10642       {"",
10643        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10644       // packet number
10645       {"",
10646        {0x12, 0x34, 0x9A, 0xBC}},
10647       // frame type (unknown value, single-byte encoding)
10648       {"",
10649        {0x38}}
10650   };
10651   // clang-format on
10652 
10653   std::unique_ptr<QuicEncryptedPacket> encrypted(
10654       AssemblePacketFromFragments(packet));
10655 
10656   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10657 
10658   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
10659   EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
10660 }
10661 
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorUnknown2Bytes)10662 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown2Bytes) {
10663   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10664     // Only IETF QUIC encodes frame types such that this test is relevant.
10665     return;
10666   }
10667   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10668 
10669   // clang-format off
10670   PacketFragments packet = {
10671       // type (short header, 4 byte packet number)
10672       {"",
10673        {0x43}},
10674       // connection_id
10675       {"",
10676        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10677       // packet number
10678       {"",
10679        {0x12, 0x34, 0x9A, 0xBC}},
10680       // frame type (unknown value, two-byte encoding)
10681       {"",
10682        {kVarInt62TwoBytes + 0x01, 0x38}}
10683   };
10684   // clang-format on
10685 
10686   std::unique_ptr<QuicEncryptedPacket> encrypted(
10687       AssemblePacketFromFragments(packet));
10688 
10689   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10690 
10691   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
10692   EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
10693 }
10694 
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorUnknown4Bytes)10695 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown4Bytes) {
10696   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10697     // Only IETF QUIC encodes frame types such that this test is relevant.
10698     return;
10699   }
10700   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10701 
10702   // clang-format off
10703   PacketFragments packet = {
10704       // type (short header, 4 byte packet number)
10705       {"",
10706        {0x43}},
10707       // connection_id
10708       {"",
10709        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10710       // packet number
10711       {"",
10712        {0x12, 0x34, 0x9A, 0xBC}},
10713       // frame type (unknown value, four-byte encoding)
10714       {"",
10715        {kVarInt62FourBytes + 0x01, 0x00, 0x00, 0x38}}
10716   };
10717   // clang-format on
10718 
10719   std::unique_ptr<QuicEncryptedPacket> encrypted(
10720       AssemblePacketFromFragments(packet));
10721 
10722   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10723 
10724   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
10725   EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
10726 }
10727 
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorUnknown8Bytes)10728 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown8Bytes) {
10729   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10730     // Only IETF QUIC encodes frame types such that this test is relevant.
10731     return;
10732   }
10733   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10734   // clang-format off
10735   PacketFragments packet = {
10736       // type (short header, 4 byte packet number)
10737       {"",
10738        {0x43}},
10739       // connection_id
10740       {"",
10741        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10742       // packet number
10743       {"",
10744        {0x12, 0x34, 0x9A, 0xBC}},
10745       // frame type (unknown value, eight-byte encoding)
10746       {"",
10747        {kVarInt62EightBytes + 0x01, 0x00, 0x00, 0x01, 0x02, 0x34, 0x56, 0x38}}
10748   };
10749   // clang-format on
10750 
10751   std::unique_ptr<QuicEncryptedPacket> encrypted(
10752       AssemblePacketFromFragments(packet));
10753 
10754   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10755 
10756   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
10757   EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
10758 }
10759 
10760 // Three tests to check that known frame types that are not minimally
10761 // encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
10762 // information "Frame type not minimally encoded."
10763 // Look at the frame-type encoded in 2, 4, and 8 bytes.
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorKnown2Bytes)10764 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2Bytes) {
10765   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10766     // Only IETF QUIC encodes frame types such that this test is relevant.
10767     return;
10768   }
10769   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10770 
10771   // clang-format off
10772   PacketFragments packet = {
10773       // type (short header, 4 byte packet number)
10774       {"",
10775        {0x43}},
10776       // connection_id
10777       {"",
10778        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10779       // packet number
10780       {"",
10781        {0x12, 0x34, 0x9A, 0xBC}},
10782       // frame type (Blocked, two-byte encoding)
10783       {"",
10784        {kVarInt62TwoBytes + 0x00, 0x08}}
10785   };
10786   // clang-format on
10787 
10788   std::unique_ptr<QuicEncryptedPacket> encrypted(
10789       AssemblePacketFromFragments(packet));
10790 
10791   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10792 
10793   EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
10794   EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
10795 }
10796 
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorKnown4Bytes)10797 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown4Bytes) {
10798   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10799     // Only IETF QUIC encodes frame types such that this test is relevant.
10800     return;
10801   }
10802   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10803 
10804   // clang-format off
10805   PacketFragments packet = {
10806       // type (short header, 4 byte packet number)
10807       {"",
10808        {0x43}},
10809       // connection_id
10810       {"",
10811        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10812       // packet number
10813       {"",
10814        {0x12, 0x34, 0x9A, 0xBC}},
10815       // frame type (Blocked, four-byte encoding)
10816       {"",
10817        {kVarInt62FourBytes + 0x00, 0x00, 0x00, 0x08}}
10818   };
10819   // clang-format on
10820 
10821   std::unique_ptr<QuicEncryptedPacket> encrypted(
10822       AssemblePacketFromFragments(packet));
10823 
10824   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10825 
10826   EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
10827   EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
10828 }
10829 
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorKnown8Bytes)10830 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown8Bytes) {
10831   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10832     // Only IETF QUIC encodes frame types such that this test is relevant.
10833     return;
10834   }
10835   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10836   // clang-format off
10837   PacketFragments packet = {
10838       // type (short header, 4 byte packet number)
10839       {"",
10840        {0x43}},
10841       // connection_id
10842       {"",
10843        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10844       // packet number
10845       {"",
10846        {0x12, 0x34, 0x9A, 0xBC}},
10847       // frame type (Blocked, eight-byte encoding)
10848       {"",
10849        {kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08}}
10850   };
10851   // clang-format on
10852 
10853   std::unique_ptr<QuicEncryptedPacket> encrypted(
10854       AssemblePacketFromFragments(packet));
10855 
10856   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10857 
10858   EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
10859   EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
10860 }
10861 
10862 // Tests to check that all known IETF frame types that are not minimally
10863 // encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
10864 // information "Frame type not minimally encoded."
10865 // Just look at 2-byte encoding.
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorKnown2BytesAllTypes)10866 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2BytesAllTypes) {
10867   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10868     // Only IETF QUIC encodes frame types such that this test is relevant.
10869     return;
10870   }
10871   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10872 
10873   // clang-format off
10874   PacketFragments packets[] = {
10875     {
10876       // type (short header, 4 byte packet number)
10877       {"",
10878        {0x43}},
10879       // connection_id
10880       {"",
10881        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10882       // packet number
10883       {"",
10884        {0x12, 0x34, 0x9A, 0xBC}},
10885       // frame type (two-byte encoding)
10886       {"",
10887        {kVarInt62TwoBytes + 0x00, 0x00}}
10888     },
10889     {
10890       // type (short header, 4 byte packet number)
10891       {"",
10892        {0x43}},
10893       // connection_id
10894       {"",
10895        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10896       // packet number
10897       {"",
10898        {0x12, 0x34, 0x9A, 0xBC}},
10899       // frame type (two-byte encoding)
10900       {"",
10901        {kVarInt62TwoBytes + 0x00, 0x01}}
10902     },
10903     {
10904       // type (short header, 4 byte packet number)
10905       {"",
10906        {0x43}},
10907       // connection_id
10908       {"",
10909        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10910       // packet number
10911       {"",
10912        {0x12, 0x34, 0x9A, 0xBC}},
10913       // frame type (two-byte encoding)
10914       {"",
10915        {kVarInt62TwoBytes + 0x00, 0x02}}
10916     },
10917     {
10918       // type (short header, 4 byte packet number)
10919       {"",
10920        {0x43}},
10921       // connection_id
10922       {"",
10923        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10924       // packet number
10925       {"",
10926        {0x12, 0x34, 0x9A, 0xBC}},
10927       // frame type (two-byte encoding)
10928       {"",
10929        {kVarInt62TwoBytes + 0x00, 0x03}}
10930     },
10931     {
10932       // type (short header, 4 byte packet number)
10933       {"",
10934        {0x43}},
10935       // connection_id
10936       {"",
10937        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10938       // packet number
10939       {"",
10940        {0x12, 0x34, 0x9A, 0xBC}},
10941       // frame type (two-byte encoding)
10942       {"",
10943        {kVarInt62TwoBytes + 0x00, 0x04}}
10944     },
10945     {
10946       // type (short header, 4 byte packet number)
10947       {"",
10948        {0x43}},
10949       // connection_id
10950       {"",
10951        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10952       // packet number
10953       {"",
10954        {0x12, 0x34, 0x9A, 0xBC}},
10955       // frame type (two-byte encoding)
10956       {"",
10957        {kVarInt62TwoBytes + 0x00, 0x05}}
10958     },
10959     {
10960       // type (short header, 4 byte packet number)
10961       {"",
10962        {0x43}},
10963       // connection_id
10964       {"",
10965        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10966       // packet number
10967       {"",
10968        {0x12, 0x34, 0x9A, 0xBC}},
10969       // frame type (two-byte encoding)
10970       {"",
10971        {kVarInt62TwoBytes + 0x00, 0x06}}
10972     },
10973     {
10974       // type (short header, 4 byte packet number)
10975       {"",
10976        {0x43}},
10977       // connection_id
10978       {"",
10979        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10980       // packet number
10981       {"",
10982        {0x12, 0x34, 0x9A, 0xBC}},
10983       // frame type (two-byte encoding)
10984       {"",
10985        {kVarInt62TwoBytes + 0x00, 0x07}}
10986     },
10987     {
10988       // type (short header, 4 byte packet number)
10989       {"",
10990        {0x43}},
10991       // connection_id
10992       {"",
10993        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10994       // packet number
10995       {"",
10996        {0x12, 0x34, 0x9A, 0xBC}},
10997       // frame type (two-byte encoding)
10998       {"",
10999        {kVarInt62TwoBytes + 0x00, 0x08}}
11000     },
11001     {
11002       // type (short header, 4 byte packet number)
11003       {"",
11004        {0x43}},
11005       // connection_id
11006       {"",
11007        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11008       // packet number
11009       {"",
11010        {0x12, 0x34, 0x9A, 0xBC}},
11011       // frame type (two-byte encoding)
11012       {"",
11013        {kVarInt62TwoBytes + 0x00, 0x09}}
11014     },
11015     {
11016       // type (short header, 4 byte packet number)
11017       {"",
11018        {0x43}},
11019       // connection_id
11020       {"",
11021        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11022       // packet number
11023       {"",
11024        {0x12, 0x34, 0x9A, 0xBC}},
11025       // frame type (two-byte encoding)
11026       {"",
11027        {kVarInt62TwoBytes + 0x00, 0x0a}}
11028     },
11029     {
11030       // type (short header, 4 byte packet number)
11031       {"",
11032        {0x43}},
11033       // connection_id
11034       {"",
11035        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11036       // packet number
11037       {"",
11038        {0x12, 0x34, 0x9A, 0xBC}},
11039       // frame type (two-byte encoding)
11040       {"",
11041        {kVarInt62TwoBytes + 0x00, 0x0b}}
11042     },
11043     {
11044       // type (short header, 4 byte packet number)
11045       {"",
11046        {0x43}},
11047       // connection_id
11048       {"",
11049        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11050       // packet number
11051       {"",
11052        {0x12, 0x34, 0x9A, 0xBC}},
11053       // frame type (two-byte encoding)
11054       {"",
11055        {kVarInt62TwoBytes + 0x00, 0x0c}}
11056     },
11057     {
11058       // type (short header, 4 byte packet number)
11059       {"",
11060        {0x43}},
11061       // connection_id
11062       {"",
11063        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11064       // packet number
11065       {"",
11066        {0x12, 0x34, 0x9A, 0xBC}},
11067       // frame type (two-byte encoding)
11068       {"",
11069        {kVarInt62TwoBytes + 0x00, 0x0d}}
11070     },
11071     {
11072       // type (short header, 4 byte packet number)
11073       {"",
11074        {0x43}},
11075       // connection_id
11076       {"",
11077        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11078       // packet number
11079       {"",
11080        {0x12, 0x34, 0x9A, 0xBC}},
11081       // frame type (two-byte encoding)
11082       {"",
11083        {kVarInt62TwoBytes + 0x00, 0x0e}}
11084     },
11085     {
11086       // type (short header, 4 byte packet number)
11087       {"",
11088        {0x43}},
11089       // connection_id
11090       {"",
11091        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11092       // packet number
11093       {"",
11094        {0x12, 0x34, 0x9A, 0xBC}},
11095       // frame type (two-byte encoding)
11096       {"",
11097        {kVarInt62TwoBytes + 0x00, 0x0f}}
11098     },
11099     {
11100       // type (short header, 4 byte packet number)
11101       {"",
11102        {0x43}},
11103       // connection_id
11104       {"",
11105        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11106       // packet number
11107       {"",
11108        {0x12, 0x34, 0x9A, 0xBC}},
11109       // frame type (two-byte encoding)
11110       {"",
11111        {kVarInt62TwoBytes + 0x00, 0x10}}
11112     },
11113     {
11114       // type (short header, 4 byte packet number)
11115       {"",
11116        {0x43}},
11117       // connection_id
11118       {"",
11119        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11120       // packet number
11121       {"",
11122        {0x12, 0x34, 0x9A, 0xBC}},
11123       // frame type (two-byte encoding)
11124       {"",
11125        {kVarInt62TwoBytes + 0x00, 0x11}}
11126     },
11127     {
11128       // type (short header, 4 byte packet number)
11129       {"",
11130        {0x43}},
11131       // connection_id
11132       {"",
11133        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11134       // packet number
11135       {"",
11136        {0x12, 0x34, 0x9A, 0xBC}},
11137       // frame type (two-byte encoding)
11138       {"",
11139        {kVarInt62TwoBytes + 0x00, 0x12}}
11140     },
11141     {
11142       // type (short header, 4 byte packet number)
11143       {"",
11144        {0x43}},
11145       // connection_id
11146       {"",
11147        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11148       // packet number
11149       {"",
11150        {0x12, 0x34, 0x9A, 0xBC}},
11151       // frame type (two-byte encoding)
11152       {"",
11153        {kVarInt62TwoBytes + 0x00, 0x13}}
11154     },
11155     {
11156       // type (short header, 4 byte packet number)
11157       {"",
11158        {0x43}},
11159       // connection_id
11160       {"",
11161        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11162       // packet number
11163       {"",
11164        {0x12, 0x34, 0x9A, 0xBC}},
11165       // frame type (two-byte encoding)
11166       {"",
11167        {kVarInt62TwoBytes + 0x00, 0x14}}
11168     },
11169     {
11170       // type (short header, 4 byte packet number)
11171       {"",
11172        {0x43}},
11173       // connection_id
11174       {"",
11175        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11176       // packet number
11177       {"",
11178        {0x12, 0x34, 0x9A, 0xBC}},
11179       // frame type (two-byte encoding)
11180       {"",
11181        {kVarInt62TwoBytes + 0x00, 0x15}}
11182     },
11183     {
11184       // type (short header, 4 byte packet number)
11185       {"",
11186        {0x43}},
11187       // connection_id
11188       {"",
11189        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11190       // packet number
11191       {"",
11192        {0x12, 0x34, 0x9A, 0xBC}},
11193       // frame type (two-byte encoding)
11194       {"",
11195        {kVarInt62TwoBytes + 0x00, 0x16}}
11196     },
11197     {
11198       // type (short header, 4 byte packet number)
11199       {"",
11200        {0x43}},
11201       // connection_id
11202       {"",
11203        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11204       // packet number
11205       {"",
11206        {0x12, 0x34, 0x9A, 0xBC}},
11207       // frame type (two-byte encoding)
11208       {"",
11209        {kVarInt62TwoBytes + 0x00, 0x17}}
11210     },
11211     {
11212       // type (short header, 4 byte packet number)
11213       {"",
11214        {0x43}},
11215       // connection_id
11216       {"",
11217        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11218       // packet number
11219       {"",
11220        {0x12, 0x34, 0x9A, 0xBC}},
11221       // frame type (two-byte encoding)
11222       {"",
11223        {kVarInt62TwoBytes + 0x00, 0x18}}
11224     },
11225     {
11226       // type (short header, 4 byte packet number)
11227       {"",
11228        {0x43}},
11229       // connection_id
11230       {"",
11231        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11232       // packet number
11233       {"",
11234        {0x12, 0x34, 0x9A, 0xBC}},
11235       // frame type (two-byte encoding)
11236       {"",
11237        {kVarInt62TwoBytes + 0x00, 0x20}}
11238     },
11239     {
11240       // type (short header, 4 byte packet number)
11241       {"",
11242        {0x43}},
11243       // connection_id
11244       {"",
11245        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11246       // packet number
11247       {"",
11248        {0x12, 0x34, 0x9A, 0xBC}},
11249       // frame type (two-byte encoding)
11250       {"",
11251        {kVarInt62TwoBytes + 0x00, 0x21}}
11252     },
11253   };
11254   // clang-format on
11255 
11256   for (PacketFragments& packet : packets) {
11257     std::unique_ptr<QuicEncryptedPacket> encrypted(
11258         AssemblePacketFromFragments(packet));
11259 
11260     EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11261 
11262     EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
11263     EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11264   }
11265 }
11266 
TEST_P(QuicFramerTest,RetireConnectionIdFrame)11267 TEST_P(QuicFramerTest, RetireConnectionIdFrame) {
11268   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
11269     // This frame is only for version 99.
11270     return;
11271   }
11272   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11273   // clang-format off
11274   PacketFragments packet_ietf = {
11275       // type (short header, 4 byte packet number)
11276       {"",
11277        {0x43}},
11278       // connection_id
11279       {"",
11280        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11281       // packet number
11282       {"",
11283        {0x12, 0x34, 0x56, 0x78}},
11284       // frame type (IETF_RETIRE_CONNECTION_ID frame)
11285       {"",
11286        {0x19}},
11287       // Sequence number
11288       {"Unable to read retire connection ID frame sequence number.",
11289        {kVarInt62TwoBytes + 0x11, 0x22}}
11290   };
11291   // clang-format on
11292 
11293   std::unique_ptr<QuicEncryptedPacket> encrypted(
11294       AssemblePacketFromFragments(packet_ietf));
11295   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11296 
11297   EXPECT_THAT(framer_.error(), IsQuicNoError());
11298   ASSERT_TRUE(visitor_.header_.get());
11299   EXPECT_TRUE(CheckDecryption(
11300       *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11301       kPacket8ByteConnectionId, kPacket0ByteConnectionId));
11302 
11303   EXPECT_EQ(0u, visitor_.stream_frames_.size());
11304 
11305   EXPECT_EQ(0x1122u, visitor_.retire_connection_id_.sequence_number);
11306 
11307   ASSERT_EQ(0u, visitor_.ack_frames_.size());
11308 
11309   CheckFramingBoundaries(packet_ietf, QUIC_INVALID_RETIRE_CONNECTION_ID_DATA);
11310 }
11311 
TEST_P(QuicFramerTest,BuildRetireConnectionIdFramePacket)11312 TEST_P(QuicFramerTest, BuildRetireConnectionIdFramePacket) {
11313   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
11314     // This frame is only for version 99.
11315     return;
11316   }
11317   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
11318   QuicPacketHeader header;
11319   header.destination_connection_id = FramerTestConnectionId();
11320   header.reset_flag = false;
11321   header.version_flag = false;
11322   header.packet_number = kPacketNumber;
11323 
11324   QuicRetireConnectionIdFrame frame;
11325   frame.sequence_number = 0x1122;
11326 
11327   QuicFrames frames = {QuicFrame(&frame)};
11328 
11329   // clang-format off
11330   unsigned char packet_ietf[] = {
11331     // type (short header, 4 byte packet number)
11332     0x43,
11333     // connection_id
11334     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11335     // packet number
11336     0x12, 0x34, 0x56, 0x78,
11337 
11338     // frame type (IETF_RETIRE_CONNECTION_ID frame)
11339     0x19,
11340     // sequence number
11341     kVarInt62TwoBytes + 0x11, 0x22
11342   };
11343   // clang-format on
11344 
11345   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11346   ASSERT_TRUE(data != nullptr);
11347 
11348   quiche::test::CompareCharArraysWithHexError(
11349       "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
11350       ABSL_ARRAYSIZE(packet_ietf));
11351 }
11352 
TEST_P(QuicFramerTest,AckFrameWithInvalidLargestObserved)11353 TEST_P(QuicFramerTest, AckFrameWithInvalidLargestObserved) {
11354   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11355   // clang-format off
11356   unsigned char packet[] = {
11357     // type (short header, 4 byte packet number)
11358     0x43,
11359     // connection_id
11360     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11361     // packet number
11362     0x12, 0x34, 0x56, 0x78,
11363 
11364     // frame type (ack frame)
11365     0x45,
11366     // largest observed
11367     0x00, 0x00,
11368     // Zero delta time.
11369     0x00, 0x00,
11370     // first ack block length.
11371     0x00, 0x00,
11372     // num timestamps.
11373     0x00
11374   };
11375 
11376   unsigned char packet_ietf[] = {
11377     // type (short header, 4 byte packet number)
11378     0x43,
11379     // connection_id
11380     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11381     // packet number
11382     0x12, 0x34, 0x56, 0x78,
11383 
11384     // frame type (IETF_ACK frame)
11385     0x02,
11386     // Largest acked
11387     kVarInt62OneByte + 0x00,
11388     // Zero delta time.
11389     kVarInt62OneByte + 0x00,
11390     // Ack block count 0
11391     kVarInt62OneByte + 0x00,
11392     // First ack block length
11393     kVarInt62OneByte + 0x00,
11394   };
11395   // clang-format on
11396 
11397   unsigned char* p = packet;
11398   size_t p_size = ABSL_ARRAYSIZE(packet);
11399   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
11400     p = packet_ietf;
11401     p_size = ABSL_ARRAYSIZE(packet_ietf);
11402   }
11403 
11404   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
11405   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
11406   EXPECT_EQ(framer_.detailed_error(), "Largest acked is 0.");
11407 }
11408 
TEST_P(QuicFramerTest,FirstAckBlockJustUnderFlow)11409 TEST_P(QuicFramerTest, FirstAckBlockJustUnderFlow) {
11410   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11411   // clang-format off
11412   unsigned char packet[] = {
11413     // type (short header, 4 byte packet number)
11414     0x43,
11415     // connection_id
11416     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11417     // packet number
11418     0x12, 0x34, 0x56, 0x78,
11419 
11420     // frame type (ack frame)
11421     0x45,
11422     // largest observed
11423     0x00, 0x02,
11424     // Zero delta time.
11425     0x00, 0x00,
11426     // first ack block length.
11427     0x00, 0x03,
11428     // num timestamps.
11429     0x00
11430   };
11431 
11432   unsigned char packet_ietf[] = {
11433     // type (short header, 4 byte packet number)
11434     0x43,
11435     // connection_id
11436     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11437     // packet number
11438     0x12, 0x34, 0x56, 0x78,
11439 
11440     // frame type (IETF_ACK frame)
11441     0x02,
11442     // Largest acked
11443     kVarInt62OneByte + 0x02,
11444     // Zero delta time.
11445     kVarInt62OneByte + 0x00,
11446     // Ack block count 0
11447     kVarInt62OneByte + 0x00,
11448     // First ack block length
11449     kVarInt62OneByte + 0x02,
11450   };
11451   // clang-format on
11452 
11453   unsigned char* p = packet;
11454   size_t p_size = ABSL_ARRAYSIZE(packet);
11455   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
11456     p = packet_ietf;
11457     p_size = ABSL_ARRAYSIZE(packet_ietf);
11458   }
11459 
11460   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
11461   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
11462   EXPECT_EQ(framer_.detailed_error(),
11463             "Underflow with first ack block length 3 largest acked is 2.");
11464 }
11465 
TEST_P(QuicFramerTest,ThirdAckBlockJustUnderflow)11466 TEST_P(QuicFramerTest, ThirdAckBlockJustUnderflow) {
11467   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11468   // clang-format off
11469   unsigned char packet[] = {
11470     // type (short header, 4 byte packet number)
11471     0x43,
11472     // connection_id
11473     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11474     // packet number
11475     0x12, 0x34, 0x56, 0x78,
11476 
11477     // frame type (ack frame)
11478     0x60,
11479     // largest observed
11480     0x0A,
11481     // Zero delta time.
11482     0x00, 0x00,
11483     // Num of ack blocks
11484     0x02,
11485     // first ack block length.
11486     0x02,
11487     // gap to next block
11488     0x01,
11489     // ack block length
11490     0x01,
11491     // gap to next block
11492     0x01,
11493     // ack block length
11494     0x06,
11495     // num timestamps.
11496     0x00
11497   };
11498 
11499   unsigned char packet_ietf[] = {
11500     // type (short header, 4 byte packet number)
11501     0x43,
11502     // connection_id
11503     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11504     // packet number
11505     0x12, 0x34, 0x56, 0x78,
11506 
11507     // frame type (IETF_ACK frame)
11508     0x02,
11509     // Largest acked
11510     kVarInt62OneByte + 0x0A,
11511     // Zero delta time.
11512     kVarInt62OneByte + 0x00,
11513     // Ack block count 2
11514     kVarInt62OneByte + 0x02,
11515     // First ack block length
11516     kVarInt62OneByte + 0x01,
11517     // gap to next block length
11518     kVarInt62OneByte + 0x00,
11519     // ack block length
11520     kVarInt62OneByte + 0x00,
11521     // gap to next block length
11522     kVarInt62OneByte + 0x00,
11523     // ack block length
11524     kVarInt62OneByte + 0x05,
11525   };
11526   // clang-format on
11527 
11528   unsigned char* p = packet;
11529   size_t p_size = ABSL_ARRAYSIZE(packet);
11530   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
11531     p = packet_ietf;
11532     p_size = ABSL_ARRAYSIZE(packet_ietf);
11533   }
11534 
11535   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
11536   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
11537   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
11538     EXPECT_EQ(framer_.detailed_error(),
11539               "Underflow with ack block length 6 latest ack block end is 5.");
11540   } else {
11541     EXPECT_EQ(framer_.detailed_error(),
11542               "Underflow with ack block length 6, end of block is 6.");
11543   }
11544 }
11545 
TEST_P(QuicFramerTest,CoalescedPacket)11546 TEST_P(QuicFramerTest, CoalescedPacket) {
11547   if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
11548     return;
11549   }
11550   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
11551   // clang-format off
11552   unsigned char packet[] = {
11553     // first coalesced packet
11554       // public flags (long header with packet type ZERO_RTT_PROTECTED and
11555       // 4-byte packet number)
11556       0xD3,
11557       // version
11558       QUIC_VERSION_BYTES,
11559       // destination connection ID length
11560       0x08,
11561       // destination connection ID
11562       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11563       // source connection ID length
11564       0x00,
11565       // long header packet length
11566       0x1E,
11567       // packet number
11568       0x12, 0x34, 0x56, 0x78,
11569       // frame type (stream frame with fin)
11570       0xFE,
11571       // stream id
11572       0x02, 0x03, 0x04,
11573       // offset
11574       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11575       // data length
11576       0x00, 0x0c,
11577       // data
11578       'h',  'e',  'l',  'l',
11579       'o',  ' ',  'w',  'o',
11580       'r',  'l',  'd',  '!',
11581     // second coalesced packet
11582       // public flags (long header with packet type ZERO_RTT_PROTECTED and
11583       // 4-byte packet number)
11584       0xD3,
11585       // version
11586       QUIC_VERSION_BYTES,
11587       // destination connection ID length
11588       0x08,
11589       // destination connection ID
11590       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11591       // source connection ID length
11592       0x00,
11593       // long header packet length
11594       0x1E,
11595       // packet number
11596       0x12, 0x34, 0x56, 0x79,
11597       // frame type (stream frame with fin)
11598       0xFE,
11599       // stream id
11600       0x02, 0x03, 0x04,
11601       // offset
11602       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11603       // data length
11604       0x00, 0x0c,
11605       // data
11606       'H',  'E',  'L',  'L',
11607       'O',  '_',  'W',  'O',
11608       'R',  'L',  'D',  '?',
11609   };
11610   unsigned char packet_ietf[] = {
11611     // first coalesced packet
11612       // public flags (long header with packet type ZERO_RTT_PROTECTED and
11613       // 4-byte packet number)
11614       0xD3,
11615       // version
11616       QUIC_VERSION_BYTES,
11617       // destination connection ID length
11618       0x08,
11619       // destination connection ID
11620       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11621       // source connection ID length
11622       0x00,
11623       // long header packet length
11624       0x1E,
11625       // packet number
11626       0x12, 0x34, 0x56, 0x78,
11627       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
11628       0x08 | 0x01 | 0x02 | 0x04,
11629       // stream id
11630       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
11631       // offset
11632       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
11633       0x32, 0x10, 0x76, 0x54,
11634       // data length
11635       kVarInt62OneByte + 0x0c,
11636       // data
11637       'h',  'e',  'l',  'l',
11638       'o',  ' ',  'w',  'o',
11639       'r',  'l',  'd',  '!',
11640     // second coalesced packet
11641       // public flags (long header with packet type ZERO_RTT_PROTECTED and
11642       // 4-byte packet number)
11643       0xD3,
11644       // version
11645       QUIC_VERSION_BYTES,
11646       // destination connection ID length
11647       0x08,
11648       // destination connection ID
11649       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11650       // source connection ID length
11651       0x00,
11652       // long header packet length
11653       0x1E,
11654       // packet number
11655       0x12, 0x34, 0x56, 0x79,
11656       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
11657       0x08 | 0x01 | 0x02 | 0x04,
11658       // stream id
11659       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
11660       // offset
11661       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
11662       0x32, 0x10, 0x76, 0x54,
11663       // data length
11664       kVarInt62OneByte + 0x0c,
11665       // data
11666       'H',  'E',  'L',  'L',
11667       'O',  '_',  'W',  'O',
11668       'R',  'L',  'D',  '?',
11669   };
11670   // clang-format on
11671   const size_t first_packet_ietf_size = 46;
11672   // If the first packet changes, the attempt to fix the first byte of the
11673   // second packet will fail.
11674   EXPECT_EQ(packet_ietf[first_packet_ietf_size], 0xD3);
11675 
11676   unsigned char* p = packet;
11677   size_t p_length = ABSL_ARRAYSIZE(packet);
11678   if (framer_.version().HasIetfQuicFrames()) {
11679     ReviseFirstByteByVersion(packet_ietf);
11680     ReviseFirstByteByVersion(&packet_ietf[first_packet_ietf_size]);
11681     p = packet_ietf;
11682     p_length = ABSL_ARRAYSIZE(packet_ietf);
11683   }
11684 
11685   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
11686   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
11687 
11688   EXPECT_THAT(framer_.error(), IsQuicNoError());
11689   ASSERT_TRUE(visitor_.header_.get());
11690 
11691   ASSERT_EQ(1u, visitor_.stream_frames_.size());
11692   EXPECT_EQ(0u, visitor_.ack_frames_.size());
11693 
11694   // Stream ID should be the last 3 bytes of kStreamId.
11695   EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
11696   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
11697   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
11698   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
11699 
11700   ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
11701   EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
11702 
11703   EXPECT_THAT(framer_.error(), IsQuicNoError());
11704   ASSERT_TRUE(visitor_.header_.get());
11705 
11706   ASSERT_EQ(2u, visitor_.stream_frames_.size());
11707   EXPECT_EQ(0u, visitor_.ack_frames_.size());
11708 
11709   // Stream ID should be the last 3 bytes of kStreamId.
11710   EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[1]->stream_id);
11711   EXPECT_TRUE(visitor_.stream_frames_[1]->fin);
11712   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[1]->offset);
11713   CheckStreamFrameData("HELLO_WORLD?", visitor_.stream_frames_[1].get());
11714 }
11715 
TEST_P(QuicFramerTest,CoalescedPacketWithUdpPadding)11716 TEST_P(QuicFramerTest, CoalescedPacketWithUdpPadding) {
11717   if (!framer_.version().HasLongHeaderLengths()) {
11718     return;
11719   }
11720   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
11721   // clang-format off
11722   unsigned char packet[] = {
11723     // first coalesced packet
11724       // public flags (long header with packet type ZERO_RTT_PROTECTED and
11725       // 4-byte packet number)
11726       0xD3,
11727       // version
11728       QUIC_VERSION_BYTES,
11729       // destination connection ID length
11730       0x08,
11731       // destination connection ID
11732       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11733       // source connection ID length
11734       0x00,
11735       // long header packet length
11736       0x1E,
11737       // packet number
11738       0x12, 0x34, 0x56, 0x78,
11739       // frame type (stream frame with fin)
11740       0xFE,
11741       // stream id
11742       0x02, 0x03, 0x04,
11743       // offset
11744       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11745       // data length
11746       0x00, 0x0c,
11747       // data
11748       'h',  'e',  'l',  'l',
11749       'o',  ' ',  'w',  'o',
11750       'r',  'l',  'd',  '!',
11751     // padding
11752     0x00, 0x00, 0x00, 0x00,
11753     0x00, 0x00, 0x00, 0x00,
11754     0x00, 0x00, 0x00, 0x00,
11755     0x00, 0x00, 0x00, 0x00,
11756     0x00, 0x00, 0x00, 0x00,
11757   };
11758   unsigned char packet_ietf[] = {
11759     // first coalesced packet
11760       // public flags (long header with packet type ZERO_RTT_PROTECTED and
11761       // 4-byte packet number)
11762       0xD3,
11763       // version
11764       QUIC_VERSION_BYTES,
11765       // destination connection ID length
11766       0x08,
11767       // destination connection ID
11768       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11769       // source connection ID length
11770       0x00,
11771       // long header packet length
11772       0x1E,
11773       // packet number
11774       0x12, 0x34, 0x56, 0x78,
11775       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
11776       0x08 | 0x01 | 0x02 | 0x04,
11777       // stream id
11778       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
11779       // offset
11780       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
11781       0x32, 0x10, 0x76, 0x54,
11782       // data length
11783       kVarInt62OneByte + 0x0c,
11784       // data
11785       'h',  'e',  'l',  'l',
11786       'o',  ' ',  'w',  'o',
11787       'r',  'l',  'd',  '!',
11788       // padding
11789       0x00, 0x00, 0x00, 0x00,
11790       0x00, 0x00, 0x00, 0x00,
11791       0x00, 0x00, 0x00, 0x00,
11792       0x00, 0x00, 0x00, 0x00,
11793       0x00, 0x00, 0x00, 0x00,
11794   };
11795   // clang-format on
11796 
11797   unsigned char* p = packet;
11798   size_t p_length = ABSL_ARRAYSIZE(packet);
11799   if (framer_.version().HasIetfQuicFrames()) {
11800     ReviseFirstByteByVersion(packet_ietf);
11801     p = packet_ietf;
11802     p_length = ABSL_ARRAYSIZE(packet_ietf);
11803   }
11804 
11805   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
11806   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
11807 
11808   EXPECT_THAT(framer_.error(), IsQuicNoError());
11809   ASSERT_TRUE(visitor_.header_.get());
11810 
11811   ASSERT_EQ(1u, visitor_.stream_frames_.size());
11812   EXPECT_EQ(0u, visitor_.ack_frames_.size());
11813 
11814   // Stream ID should be the last 3 bytes of kStreamId.
11815   EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
11816   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
11817   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
11818   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
11819 
11820   EXPECT_EQ(visitor_.coalesced_packets_.size(), 0u);
11821 }
11822 
TEST_P(QuicFramerTest,CoalescedPacketWithDifferentVersion)11823 TEST_P(QuicFramerTest, CoalescedPacketWithDifferentVersion) {
11824   if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
11825     return;
11826   }
11827   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
11828   // clang-format off
11829   unsigned char packet[] = {
11830     // first coalesced packet
11831       // public flags (long header with packet type ZERO_RTT_PROTECTED and
11832       // 4-byte packet number)
11833       0xD3,
11834       // version
11835       QUIC_VERSION_BYTES,
11836       // destination connection ID length
11837       0x08,
11838       // destination connection ID
11839       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11840       // source connection ID length
11841       0x00,
11842       // long header packet length
11843       0x1E,
11844       // packet number
11845       0x12, 0x34, 0x56, 0x78,
11846       // frame type (stream frame with fin)
11847       0xFE,
11848       // stream id
11849       0x02, 0x03, 0x04,
11850       // offset
11851       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11852       // data length
11853       0x00, 0x0c,
11854       // data
11855       'h',  'e',  'l',  'l',
11856       'o',  ' ',  'w',  'o',
11857       'r',  'l',  'd',  '!',
11858     // second coalesced packet
11859       // public flags (long header with packet type ZERO_RTT_PROTECTED and
11860       // 4-byte packet number)
11861       0xD3,
11862       // garbage version
11863       'G', 'A', 'B', 'G',
11864       // destination connection ID length
11865       0x08,
11866       // destination connection ID
11867       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11868       // source connection ID length
11869       0x00,
11870       // long header packet length
11871       0x1E,
11872       // packet number
11873       0x12, 0x34, 0x56, 0x79,
11874       // frame type (stream frame with fin)
11875       0xFE,
11876       // stream id
11877       0x02, 0x03, 0x04,
11878       // offset
11879       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11880       // data length
11881       0x00, 0x0c,
11882       // data
11883       'H',  'E',  'L',  'L',
11884       'O',  '_',  'W',  'O',
11885       'R',  'L',  'D',  '?',
11886   };
11887   unsigned char packet_ietf[] = {
11888     // first coalesced packet
11889       // public flags (long header with packet type ZERO_RTT_PROTECTED and
11890       // 4-byte packet number)
11891       0xD3,
11892       // version
11893       QUIC_VERSION_BYTES,
11894       // destination connection ID length
11895       0x08,
11896       // destination connection ID
11897       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11898       // source connection ID length
11899       0x00,
11900       // long header packet length
11901       0x1E,
11902       // packet number
11903       0x12, 0x34, 0x56, 0x78,
11904       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
11905       0x08 | 0x01 | 0x02 | 0x04,
11906       // stream id
11907       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
11908       // offset
11909       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
11910       0x32, 0x10, 0x76, 0x54,
11911       // data length
11912       kVarInt62OneByte + 0x0c,
11913       // data
11914       'h',  'e',  'l',  'l',
11915       'o',  ' ',  'w',  'o',
11916       'r',  'l',  'd',  '!',
11917     // second coalesced packet
11918       // public flags (long header with packet type ZERO_RTT_PROTECTED and
11919       // 4-byte packet number)
11920       0xD3,
11921       // garbage version
11922       'G', 'A', 'B', 'G',
11923       // destination connection ID length
11924       0x08,
11925       // destination connection ID
11926       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11927       // source connection ID length
11928       0x00,
11929       // long header packet length
11930       0x1E,
11931       // packet number
11932       0x12, 0x34, 0x56, 0x79,
11933       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
11934       0x08 | 0x01 | 0x02 | 0x04,
11935       // stream id
11936       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
11937       // offset
11938       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
11939       0x32, 0x10, 0x76, 0x54,
11940       // data length
11941       kVarInt62OneByte + 0x0c,
11942       // data
11943       'H',  'E',  'L',  'L',
11944       'O',  '_',  'W',  'O',
11945       'R',  'L',  'D',  '?',
11946   };
11947   // clang-format on
11948   const size_t first_packet_ietf_size = 46;
11949   // If the first packet changes, the attempt to fix the first byte of the
11950   // second packet will fail.
11951   EXPECT_EQ(packet_ietf[first_packet_ietf_size], 0xD3);
11952 
11953   unsigned char* p = packet;
11954   size_t p_length = ABSL_ARRAYSIZE(packet);
11955   if (framer_.version().HasIetfQuicFrames()) {
11956     ReviseFirstByteByVersion(packet_ietf);
11957     ReviseFirstByteByVersion(&packet_ietf[first_packet_ietf_size]);
11958     p = packet_ietf;
11959     p_length = ABSL_ARRAYSIZE(packet_ietf);
11960   }
11961 
11962   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
11963   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
11964 
11965   EXPECT_THAT(framer_.error(), IsQuicNoError());
11966   ASSERT_TRUE(visitor_.header_.get());
11967 
11968   ASSERT_EQ(1u, visitor_.stream_frames_.size());
11969   EXPECT_EQ(0u, visitor_.ack_frames_.size());
11970 
11971   // Stream ID should be the last 3 bytes of kStreamId.
11972   EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
11973   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
11974   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
11975   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
11976 
11977   ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
11978   EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
11979 
11980   EXPECT_THAT(framer_.error(), IsQuicNoError());
11981   ASSERT_TRUE(visitor_.header_.get());
11982 
11983   ASSERT_EQ(1u, visitor_.stream_frames_.size());
11984   // Verify version mismatch gets reported.
11985   EXPECT_EQ(1, visitor_.version_mismatch_);
11986 }
11987 
TEST_P(QuicFramerTest,UndecryptablePacketWithoutDecrypter)11988 TEST_P(QuicFramerTest, UndecryptablePacketWithoutDecrypter) {
11989   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
11990 
11991   if (!framer_.version().KnowsWhichDecrypterToUse()) {
11992     // We create a bad client decrypter by using initial encryption with a
11993     // bogus connection ID; it should fail to decrypt everything.
11994     QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
11995     CrypterPair bogus_crypters;
11996     CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
11997                                           framer_.version(),
11998                                           bogus_connection_id, &bogus_crypters);
11999     // This removes all other decrypters.
12000     framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
12001                          std::move(bogus_crypters.decrypter));
12002   }
12003 
12004   // clang-format off
12005   unsigned char packet[] = {
12006     // public flags (long header with packet type HANDSHAKE and
12007     // 4-byte packet number)
12008     0xE3,
12009     // version
12010     QUIC_VERSION_BYTES,
12011     // connection ID lengths
12012     0x05,
12013     // source connection ID
12014     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12015     // long header packet length
12016     0x05,
12017     // packet number
12018     0x12, 0x34, 0x56, 0x00,
12019     // padding frames
12020     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12021     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12022     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12023     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12024   };
12025   unsigned char packet49[] = {
12026     // public flags (long header with packet type HANDSHAKE and
12027     // 4-byte packet number)
12028     0xE3,
12029     // version
12030     QUIC_VERSION_BYTES,
12031     // destination connection ID length
12032     0x00,
12033     // source connection ID length
12034     0x08,
12035     // source connection ID
12036     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12037     // long header packet length
12038     0x24,
12039     // packet number
12040     0x12, 0x34, 0x56, 0x00,
12041     // padding frames
12042     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12043     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12044     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12045     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12046   };
12047   // clang-format on
12048   unsigned char* p = packet;
12049   size_t p_length = ABSL_ARRAYSIZE(packet);
12050   if (framer_.version().HasLongHeaderLengths()) {
12051     ReviseFirstByteByVersion(packet49);
12052     p = packet49;
12053     p_length = ABSL_ARRAYSIZE(packet49);
12054   }
12055   // First attempt decryption without the handshake crypter.
12056   EXPECT_FALSE(
12057       framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false)));
12058   EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
12059   ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12060   ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12061   ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12062   quiche::test::CompareCharArraysWithHexError(
12063       "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
12064       visitor_.undecryptable_packets_[0]->length(), AsChars(p), p_length);
12065   if (framer_.version().KnowsWhichDecrypterToUse()) {
12066     EXPECT_EQ(ENCRYPTION_HANDSHAKE,
12067               visitor_.undecryptable_decryption_levels_[0]);
12068   }
12069   EXPECT_FALSE(visitor_.undecryptable_has_decryption_keys_[0]);
12070 }
12071 
TEST_P(QuicFramerTest,UndecryptablePacketWithDecrypter)12072 TEST_P(QuicFramerTest, UndecryptablePacketWithDecrypter) {
12073   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12074 
12075   // We create a bad client decrypter by using initial encryption with a
12076   // bogus connection ID; it should fail to decrypt everything.
12077   QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
12078   CrypterPair bad_handshake_crypters;
12079   CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12080                                         framer_.version(), bogus_connection_id,
12081                                         &bad_handshake_crypters);
12082   if (framer_.version().KnowsWhichDecrypterToUse()) {
12083     framer_.InstallDecrypter(ENCRYPTION_HANDSHAKE,
12084                              std::move(bad_handshake_crypters.decrypter));
12085   } else {
12086     framer_.SetDecrypter(ENCRYPTION_HANDSHAKE,
12087                          std::move(bad_handshake_crypters.decrypter));
12088   }
12089 
12090   // clang-format off
12091   unsigned char packet[] = {
12092     // public flags (long header with packet type HANDSHAKE and
12093     // 4-byte packet number)
12094     0xE3,
12095     // version
12096     QUIC_VERSION_BYTES,
12097     // connection ID lengths
12098     0x05,
12099     // source connection ID
12100     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12101     // long header packet length
12102     0x05,
12103     // packet number
12104     0x12, 0x34, 0x56, 0x00,
12105     // padding frames
12106     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12107     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12108     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12109     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12110   };
12111   unsigned char packet49[] = {
12112     // public flags (long header with packet type HANDSHAKE and
12113     // 4-byte packet number)
12114     0xE3,
12115     // version
12116     QUIC_VERSION_BYTES,
12117     // destination connection ID length
12118     0x00,
12119     // source connection ID length
12120     0x08,
12121     // source connection ID
12122     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12123     // long header packet length
12124     0x24,
12125     // packet number
12126     0x12, 0x34, 0x56, 0x00,
12127     // padding frames
12128     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12129     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12130     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12131     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12132   };
12133   // clang-format on
12134   unsigned char* p = packet;
12135   size_t p_length = ABSL_ARRAYSIZE(packet);
12136   if (framer_.version().HasLongHeaderLengths()) {
12137     ReviseFirstByteByVersion(packet49);
12138     p = packet49;
12139     p_length = ABSL_ARRAYSIZE(packet49);
12140   }
12141 
12142   EXPECT_FALSE(
12143       framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false)));
12144   EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
12145   ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12146   ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12147   ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12148   quiche::test::CompareCharArraysWithHexError(
12149       "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
12150       visitor_.undecryptable_packets_[0]->length(), AsChars(p), p_length);
12151   if (framer_.version().KnowsWhichDecrypterToUse()) {
12152     EXPECT_EQ(ENCRYPTION_HANDSHAKE,
12153               visitor_.undecryptable_decryption_levels_[0]);
12154   }
12155   EXPECT_EQ(framer_.version().KnowsWhichDecrypterToUse(),
12156             visitor_.undecryptable_has_decryption_keys_[0]);
12157 }
12158 
TEST_P(QuicFramerTest,UndecryptableCoalescedPacket)12159 TEST_P(QuicFramerTest, UndecryptableCoalescedPacket) {
12160   if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12161     return;
12162   }
12163   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
12164   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
12165   // We create a bad client decrypter by using initial encryption with a
12166   // bogus connection ID; it should fail to decrypt everything.
12167   QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
12168   CrypterPair bad_handshake_crypters;
12169   CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12170                                         framer_.version(), bogus_connection_id,
12171                                         &bad_handshake_crypters);
12172   framer_.InstallDecrypter(ENCRYPTION_HANDSHAKE,
12173                            std::move(bad_handshake_crypters.decrypter));
12174   // clang-format off
12175   unsigned char packet[] = {
12176     // first coalesced packet
12177       // public flags (long header with packet type HANDSHAKE and
12178       // 4-byte packet number)
12179       0xE3,
12180       // version
12181       QUIC_VERSION_BYTES,
12182       // destination connection ID length
12183       0x08,
12184       // destination connection ID
12185       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12186       // source connection ID length
12187       0x00,
12188       // long header packet length
12189       0x1E,
12190       // packet number
12191       0x12, 0x34, 0x56, 0x78,
12192       // frame type (stream frame with fin)
12193       0xFE,
12194       // stream id
12195       0x02, 0x03, 0x04,
12196       // offset
12197       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12198       // data length
12199       0x00, 0x0c,
12200       // data
12201       'h',  'e',  'l',  'l',
12202       'o',  ' ',  'w',  'o',
12203       'r',  'l',  'd',  '!',
12204     // second coalesced packet
12205       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12206       // 4-byte packet number)
12207       0xD3,
12208       // version
12209       QUIC_VERSION_BYTES,
12210       // destination connection ID length
12211       0x08,
12212       // destination connection ID
12213       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12214       // source connection ID length
12215       0x00,
12216       // long header packet length
12217       0x1E,
12218       // packet number
12219       0x12, 0x34, 0x56, 0x79,
12220       // frame type (stream frame with fin)
12221       0xFE,
12222       // stream id
12223       0x02, 0x03, 0x04,
12224       // offset
12225       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12226       // data length
12227       0x00, 0x0c,
12228       // data
12229       'H',  'E',  'L',  'L',
12230       'O',  '_',  'W',  'O',
12231       'R',  'L',  'D',  '?',
12232   };
12233   unsigned char packet_ietf[] = {
12234     // first coalesced packet
12235       // public flags (long header with packet type HANDSHAKE and
12236       // 4-byte packet number)
12237       0xE3,
12238       // version
12239       QUIC_VERSION_BYTES,
12240       // destination connection ID length
12241       0x08,
12242       // destination connection ID
12243       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12244       // source connection ID length
12245       0x00,
12246       // long header packet length
12247       0x1E,
12248       // packet number
12249       0x12, 0x34, 0x56, 0x78,
12250       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12251       0x08 | 0x01 | 0x02 | 0x04,
12252       // stream id
12253       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12254       // offset
12255       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12256       0x32, 0x10, 0x76, 0x54,
12257       // data length
12258       kVarInt62OneByte + 0x0c,
12259       // data
12260       'h',  'e',  'l',  'l',
12261       'o',  ' ',  'w',  'o',
12262       'r',  'l',  'd',  '!',
12263     // second coalesced packet
12264       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12265       // 4-byte packet number)
12266       0xD3,
12267       // version
12268       QUIC_VERSION_BYTES,
12269       // destination connection ID length
12270       0x08,
12271       // destination connection ID
12272       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12273       // source connection ID length
12274       0x00,
12275       // long header packet length
12276       0x1E,
12277       // packet number
12278       0x12, 0x34, 0x56, 0x79,
12279       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12280       0x08 | 0x01 | 0x02 | 0x04,
12281       // stream id
12282       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12283       // offset
12284       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12285       0x32, 0x10, 0x76, 0x54,
12286       // data length
12287       kVarInt62OneByte + 0x0c,
12288       // data
12289       'H',  'E',  'L',  'L',
12290       'O',  '_',  'W',  'O',
12291       'R',  'L',  'D',  '?',
12292   };
12293   // clang-format on
12294   const size_t length_of_first_coalesced_packet = 46;
12295   // If the first packet changes, the attempt to fix the first byte of the
12296   // second packet will fail.
12297   EXPECT_EQ(packet_ietf[length_of_first_coalesced_packet], 0xD3);
12298 
12299   unsigned char* p = packet;
12300   size_t p_length = ABSL_ARRAYSIZE(packet);
12301   if (framer_.version().HasIetfQuicFrames()) {
12302     ReviseFirstByteByVersion(packet_ietf);
12303     ReviseFirstByteByVersion(&packet_ietf[length_of_first_coalesced_packet]);
12304     p = packet_ietf;
12305     p_length = ABSL_ARRAYSIZE(packet_ietf);
12306   }
12307 
12308   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12309 
12310   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12311 
12312   EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
12313 
12314   ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12315   ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12316   ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12317   // Make sure we only receive the first undecryptable packet and not the
12318   // full packet including the second coalesced packet.
12319   quiche::test::CompareCharArraysWithHexError(
12320       "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
12321       visitor_.undecryptable_packets_[0]->length(), AsChars(p),
12322       length_of_first_coalesced_packet);
12323   EXPECT_EQ(ENCRYPTION_HANDSHAKE, visitor_.undecryptable_decryption_levels_[0]);
12324   EXPECT_TRUE(visitor_.undecryptable_has_decryption_keys_[0]);
12325 
12326   // Make sure the second coalesced packet is parsed correctly.
12327   ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
12328   EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
12329 
12330   ASSERT_TRUE(visitor_.header_.get());
12331 
12332   ASSERT_EQ(1u, visitor_.stream_frames_.size());
12333   EXPECT_EQ(0u, visitor_.ack_frames_.size());
12334 
12335   // Stream ID should be the last 3 bytes of kStreamId.
12336   EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12337   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12338   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12339   CheckStreamFrameData("HELLO_WORLD?", visitor_.stream_frames_[0].get());
12340 }
12341 
TEST_P(QuicFramerTest,MismatchedCoalescedPacket)12342 TEST_P(QuicFramerTest, MismatchedCoalescedPacket) {
12343   if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12344     return;
12345   }
12346   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
12347   // clang-format off
12348   unsigned char packet[] = {
12349     // first coalesced packet
12350       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12351       // 4-byte packet number)
12352       0xD3,
12353       // version
12354       QUIC_VERSION_BYTES,
12355       // destination connection ID length
12356       0x08,
12357       // destination connection ID
12358       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12359       // source connection ID length
12360       0x00,
12361       // long header packet length
12362       0x1E,
12363       // packet number
12364       0x12, 0x34, 0x56, 0x78,
12365       // frame type (stream frame with fin)
12366       0xFE,
12367       // stream id
12368       0x02, 0x03, 0x04,
12369       // offset
12370       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12371       // data length
12372       0x00, 0x0c,
12373       // data
12374       'h',  'e',  'l',  'l',
12375       'o',  ' ',  'w',  'o',
12376       'r',  'l',  'd',  '!',
12377     // second coalesced packet
12378       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12379       // 4-byte packet number)
12380       0xD3,
12381       // version
12382       QUIC_VERSION_BYTES,
12383       // destination connection ID length
12384       0x08,
12385       // destination connection ID
12386       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
12387       // source connection ID length
12388       0x00,
12389       // long header packet length
12390       0x1E,
12391       // packet number
12392       0x12, 0x34, 0x56, 0x79,
12393       // frame type (stream frame with fin)
12394       0xFE,
12395       // stream id
12396       0x02, 0x03, 0x04,
12397       // offset
12398       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12399       // data length
12400       0x00, 0x0c,
12401       // data
12402       'H',  'E',  'L',  'L',
12403       'O',  '_',  'W',  'O',
12404       'R',  'L',  'D',  '?',
12405   };
12406   unsigned char packet_ietf[] = {
12407     // first coalesced packet
12408       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12409       // 4-byte packet number)
12410       0xD3,
12411       // version
12412       QUIC_VERSION_BYTES,
12413       // destination connection ID length
12414       0x08,
12415       // destination connection ID
12416       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12417       // source connection ID length
12418       0x00,
12419       // long header packet length
12420       0x1E,
12421       // packet number
12422       0x12, 0x34, 0x56, 0x78,
12423       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12424       0x08 | 0x01 | 0x02 | 0x04,
12425       // stream id
12426       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12427       // offset
12428       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12429       0x32, 0x10, 0x76, 0x54,
12430       // data length
12431       kVarInt62OneByte + 0x0c,
12432       // data
12433       'h',  'e',  'l',  'l',
12434       'o',  ' ',  'w',  'o',
12435       'r',  'l',  'd',  '!',
12436     // second coalesced packet
12437       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12438       // 4-byte packet number)
12439       0xD3,
12440       // version
12441       QUIC_VERSION_BYTES,
12442       // destination connection ID length
12443       0x08,
12444       // destination connection ID
12445       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
12446       // source connection ID length
12447       0x00,
12448       // long header packet length
12449       0x1E,
12450       // packet number
12451       0x12, 0x34, 0x56, 0x79,
12452       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12453       0x08 | 0x01 | 0x02 | 0x04,
12454       // stream id
12455       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12456       // offset
12457       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12458       0x32, 0x10, 0x76, 0x54,
12459       // data length
12460       kVarInt62OneByte + 0x0c,
12461       // data
12462       'H',  'E',  'L',  'L',
12463       'O',  '_',  'W',  'O',
12464       'R',  'L',  'D',  '?',
12465   };
12466   // clang-format on
12467   const size_t length_of_first_coalesced_packet = 46;
12468   // If the first packet changes, the attempt to fix the first byte of the
12469   // second packet will fail.
12470   EXPECT_EQ(packet_ietf[length_of_first_coalesced_packet], 0xD3);
12471 
12472   unsigned char* p = packet;
12473   size_t p_length = ABSL_ARRAYSIZE(packet);
12474   if (framer_.version().HasIetfQuicFrames()) {
12475     ReviseFirstByteByVersion(packet_ietf);
12476     ReviseFirstByteByVersion(&packet_ietf[length_of_first_coalesced_packet]);
12477     p = packet_ietf;
12478     p_length = ABSL_ARRAYSIZE(packet_ietf);
12479   }
12480 
12481   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12482 
12483   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12484 
12485   EXPECT_THAT(framer_.error(), IsQuicNoError());
12486   ASSERT_TRUE(visitor_.header_.get());
12487 
12488   ASSERT_EQ(1u, visitor_.stream_frames_.size());
12489   EXPECT_EQ(0u, visitor_.ack_frames_.size());
12490 
12491   // Stream ID should be the last 3 bytes of kStreamId.
12492   EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12493   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12494   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12495   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12496 
12497   ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
12498 }
12499 
TEST_P(QuicFramerTest,InvalidCoalescedPacket)12500 TEST_P(QuicFramerTest, InvalidCoalescedPacket) {
12501   if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12502     return;
12503   }
12504   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
12505   // clang-format off
12506   unsigned char packet[] = {
12507     // first coalesced packet
12508       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12509       // 4-byte packet number)
12510       0xD3,
12511       // version
12512       QUIC_VERSION_BYTES,
12513       // destination connection ID length
12514       0x08,
12515       // destination connection ID
12516       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12517       // source connection ID length
12518       0x00,
12519       // long header packet length
12520       0x1E,
12521       // packet number
12522       0x12, 0x34, 0x56, 0x78,
12523       // frame type (stream frame with fin)
12524       0xFE,
12525       // stream id
12526       0x02, 0x03, 0x04,
12527       // offset
12528       0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12529       // data length
12530       0x00, 0x0c,
12531       // data
12532       'h',  'e',  'l',  'l',
12533       'o',  ' ',  'w',  'o',
12534       'r',  'l',  'd',  '!',
12535     // second coalesced packet
12536       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12537       // 4-byte packet number)
12538       0xD3,
12539       // version would be here but we cut off the invalid coalesced header.
12540   };
12541   unsigned char packet_ietf[] = {
12542     // first coalesced packet
12543       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12544       // 4-byte packet number)
12545       0xD3,
12546       // version
12547       QUIC_VERSION_BYTES,
12548       // destination connection ID length
12549       0x08,
12550       // destination connection ID
12551       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12552       // source connection ID length
12553       0x00,
12554       // long header packet length
12555       0x1E,
12556       // packet number
12557       0x12, 0x34, 0x56, 0x78,
12558       // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12559       0x08 | 0x01 | 0x02 | 0x04,
12560       // stream id
12561       kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12562       // offset
12563       kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12564       0x32, 0x10, 0x76, 0x54,
12565       // data length
12566       kVarInt62OneByte + 0x0c,
12567       // data
12568       'h',  'e',  'l',  'l',
12569       'o',  ' ',  'w',  'o',
12570       'r',  'l',  'd',  '!',
12571     // second coalesced packet
12572       // public flags (long header with packet type ZERO_RTT_PROTECTED and
12573       // 4-byte packet number)
12574       0xD3,
12575       // version would be here but we cut off the invalid coalesced header.
12576   };
12577   // clang-format on
12578   const size_t length_of_first_coalesced_packet = 46;
12579   // If the first packet changes, the attempt to fix the first byte of the
12580   // second packet will fail.
12581   EXPECT_EQ(packet_ietf[length_of_first_coalesced_packet], 0xD3);
12582 
12583   unsigned char* p = packet;
12584   size_t p_length = ABSL_ARRAYSIZE(packet);
12585   if (framer_.version().HasIetfQuicFrames()) {
12586     ReviseFirstByteByVersion(packet_ietf);
12587     ReviseFirstByteByVersion(&packet_ietf[length_of_first_coalesced_packet]);
12588     p = packet_ietf;
12589     p_length = ABSL_ARRAYSIZE(packet_ietf);
12590   }
12591 
12592   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12593 
12594   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12595 
12596   EXPECT_THAT(framer_.error(), IsQuicNoError());
12597   ASSERT_TRUE(visitor_.header_.get());
12598 
12599   ASSERT_EQ(1u, visitor_.stream_frames_.size());
12600   EXPECT_EQ(0u, visitor_.ack_frames_.size());
12601 
12602   // Stream ID should be the last 3 bytes of kStreamId.
12603   EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12604   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12605   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12606   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12607 
12608   ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
12609 }
12610 
12611 // Some IETF implementations send an initial followed by zeroes instead of
12612 // padding inside the initial. We need to make sure that we still process
12613 // the initial correctly and ignore the zeroes.
TEST_P(QuicFramerTest,CoalescedPacketWithZeroesRoundTrip)12614 TEST_P(QuicFramerTest, CoalescedPacketWithZeroesRoundTrip) {
12615   if (!QuicVersionHasLongHeaderLengths(framer_.transport_version()) ||
12616       !framer_.version().UsesInitialObfuscators()) {
12617     return;
12618   }
12619   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
12620   QuicConnectionId connection_id = FramerTestConnectionId();
12621   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12622 
12623   CrypterPair client_crypters;
12624   CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12625                                         framer_.version(), connection_id,
12626                                         &client_crypters);
12627   framer_.SetEncrypter(ENCRYPTION_INITIAL,
12628                        std::move(client_crypters.encrypter));
12629 
12630   QuicPacketHeader header;
12631   header.destination_connection_id = connection_id;
12632   header.version_flag = true;
12633   header.packet_number = kPacketNumber;
12634   header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
12635   header.long_packet_type = INITIAL;
12636   header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
12637   header.retry_token_length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1;
12638   QuicFrames frames = {QuicFrame(QuicPingFrame()),
12639                        QuicFrame(QuicPaddingFrame(3))};
12640 
12641   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
12642   ASSERT_NE(nullptr, data);
12643 
12644   // Add zeroes after the valid initial packet.
12645   unsigned char packet[kMaxOutgoingPacketSize] = {};
12646   size_t encrypted_length =
12647       framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number, *data,
12648                              AsChars(packet), ABSL_ARRAYSIZE(packet));
12649   ASSERT_NE(0u, encrypted_length);
12650 
12651   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
12652   CrypterPair server_crypters;
12653   CryptoUtils::CreateInitialObfuscators(Perspective::IS_SERVER,
12654                                         framer_.version(), connection_id,
12655                                         &server_crypters);
12656   framer_.InstallDecrypter(ENCRYPTION_INITIAL,
12657                            std::move(server_crypters.decrypter));
12658 
12659   // Make sure the first long header initial packet parses correctly.
12660   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
12661 
12662   // Make sure we discard the subsequent zeroes.
12663   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12664   EXPECT_TRUE(visitor_.coalesced_packets_.empty());
12665 }
12666 
TEST_P(QuicFramerTest,ClientReceivesWrongVersion)12667 TEST_P(QuicFramerTest, ClientReceivesWrongVersion) {
12668   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12669 
12670   // clang-format off
12671   unsigned char packet[] = {
12672        // public flags (long header with packet type INITIAL)
12673        0xC3,
12674        // version that is different from the framer's version
12675        'Q', '0', '4', '3',
12676        // connection ID lengths
12677        0x05,
12678        // source connection ID
12679        0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12680        // packet number
12681        0x01,
12682        // padding frame
12683        0x00,
12684   };
12685   // clang-format on
12686 
12687   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
12688   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12689 
12690   EXPECT_THAT(framer_.error(), IsError(QUIC_PACKET_WRONG_VERSION));
12691   EXPECT_EQ("Client received unexpected version.", framer_.detailed_error());
12692 }
12693 
TEST_P(QuicFramerTest,PacketHeaderWithVariableLengthConnectionId)12694 TEST_P(QuicFramerTest, PacketHeaderWithVariableLengthConnectionId) {
12695   if (!framer_.version().AllowsVariableLengthConnectionIds()) {
12696     return;
12697   }
12698   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
12699   uint8_t connection_id_bytes[9] = {0xFE, 0xDC, 0xBA, 0x98, 0x76,
12700                                     0x54, 0x32, 0x10, 0x42};
12701   QuicConnectionId connection_id(reinterpret_cast<char*>(connection_id_bytes),
12702                                  sizeof(connection_id_bytes));
12703   QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
12704   QuicFramerPeer::SetExpectedServerConnectionIDLength(&framer_,
12705                                                       connection_id.length());
12706 
12707   // clang-format off
12708   PacketFragments packet = {
12709       // type (8 byte connection_id and 1 byte packet number)
12710       {"Unable to read first byte.",
12711        {0x40}},
12712       // connection_id
12713       {"Unable to read destination connection ID.",
12714        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
12715       // packet number
12716       {"Unable to read packet number.",
12717        {0x78}},
12718   };
12719 
12720   PacketFragments packet_with_padding = {
12721       // type (8 byte connection_id and 1 byte packet number)
12722       {"Unable to read first byte.",
12723        {0x40}},
12724       // connection_id
12725       {"Unable to read destination connection ID.",
12726        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
12727       // packet number
12728       {"",
12729        {0x78}},
12730       // padding
12731       {"", {0x00, 0x00, 0x00}},
12732   };
12733   // clang-format on
12734 
12735   PacketFragments& fragments =
12736       framer_.version().HasHeaderProtection() ? packet_with_padding : packet;
12737   std::unique_ptr<QuicEncryptedPacket> encrypted(
12738       AssemblePacketFromFragments(fragments));
12739   if (framer_.version().HasHeaderProtection()) {
12740     EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
12741     EXPECT_THAT(framer_.error(), IsQuicNoError());
12742   } else {
12743     EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
12744     EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
12745   }
12746   ASSERT_TRUE(visitor_.header_.get());
12747   EXPECT_EQ(connection_id, visitor_.header_->destination_connection_id);
12748   EXPECT_FALSE(visitor_.header_->reset_flag);
12749   EXPECT_FALSE(visitor_.header_->version_flag);
12750   EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
12751   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
12752 
12753   CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
12754 }
12755 
TEST_P(QuicFramerTest,MultiplePacketNumberSpaces)12756 TEST_P(QuicFramerTest, MultiplePacketNumberSpaces) {
12757   framer_.EnableMultiplePacketNumberSpacesSupport();
12758 
12759   // clang-format off
12760   unsigned char long_header_packet[] = {
12761        // public flags (long header with packet type ZERO_RTT_PROTECTED and
12762        // 4-byte packet number)
12763        0xD3,
12764        // version
12765        QUIC_VERSION_BYTES,
12766        // destination connection ID length
12767        0x50,
12768        // destination connection ID
12769        0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12770        // packet number
12771        0x12, 0x34, 0x56, 0x78,
12772        // padding frame
12773        0x00,
12774    };
12775   unsigned char long_header_packet_ietf[] = {
12776        // public flags (long header with packet type ZERO_RTT_PROTECTED and
12777        // 4-byte packet number)
12778        0xD3,
12779        // version
12780        QUIC_VERSION_BYTES,
12781        // destination connection ID length
12782        0x08,
12783        // destination connection ID
12784        0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12785        // source connection ID length
12786        0x00,
12787        // long header packet length
12788        0x05,
12789        // packet number
12790        0x12, 0x34, 0x56, 0x78,
12791        // padding frame
12792        0x00,
12793   };
12794   // clang-format on
12795 
12796   if (framer_.version().KnowsWhichDecrypterToUse()) {
12797     framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
12798                              std::make_unique<TestDecrypter>());
12799     framer_.RemoveDecrypter(ENCRYPTION_INITIAL);
12800   } else {
12801     framer_.SetDecrypter(ENCRYPTION_ZERO_RTT,
12802                          std::make_unique<TestDecrypter>());
12803   }
12804   if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12805     EXPECT_TRUE(framer_.ProcessPacket(
12806         QuicEncryptedPacket(AsChars(long_header_packet),
12807                             ABSL_ARRAYSIZE(long_header_packet), false)));
12808   } else {
12809     ReviseFirstByteByVersion(long_header_packet_ietf);
12810     EXPECT_TRUE(framer_.ProcessPacket(
12811         QuicEncryptedPacket(AsChars(long_header_packet_ietf),
12812                             ABSL_ARRAYSIZE(long_header_packet_ietf), false)));
12813   }
12814 
12815   EXPECT_THAT(framer_.error(), IsQuicNoError());
12816   EXPECT_FALSE(
12817       QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
12818           .IsInitialized());
12819   EXPECT_FALSE(
12820       QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
12821           .IsInitialized());
12822   EXPECT_EQ(kPacketNumber, QuicFramerPeer::GetLargestDecryptedPacketNumber(
12823                                &framer_, APPLICATION_DATA));
12824 
12825   // clang-format off
12826   unsigned char short_header_packet[] = {
12827      // type (short header, 1 byte packet number)
12828      0x40,
12829      // connection_id
12830      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12831      // packet number
12832      0x79,
12833      // padding frame
12834      0x00, 0x00, 0x00,
12835   };
12836   // clang-format on
12837 
12838   QuicEncryptedPacket short_header_encrypted(
12839       AsChars(short_header_packet), ABSL_ARRAYSIZE(short_header_packet), false);
12840   if (framer_.version().KnowsWhichDecrypterToUse()) {
12841     framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
12842                              std::make_unique<TestDecrypter>());
12843     framer_.RemoveDecrypter(ENCRYPTION_ZERO_RTT);
12844   } else {
12845     framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
12846                          std::make_unique<TestDecrypter>());
12847   }
12848   EXPECT_TRUE(framer_.ProcessPacket(short_header_encrypted));
12849 
12850   EXPECT_THAT(framer_.error(), IsQuicNoError());
12851   EXPECT_FALSE(
12852       QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
12853           .IsInitialized());
12854   EXPECT_FALSE(
12855       QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
12856           .IsInitialized());
12857   EXPECT_EQ(kPacketNumber + 1, QuicFramerPeer::GetLargestDecryptedPacketNumber(
12858                                    &framer_, APPLICATION_DATA));
12859 }
12860 
TEST_P(QuicFramerTest,IetfRetryPacketRejected)12861 TEST_P(QuicFramerTest, IetfRetryPacketRejected) {
12862   if (!framer_.version().KnowsWhichDecrypterToUse() ||
12863       framer_.version().SupportsRetry()) {
12864     return;
12865   }
12866 
12867   // clang-format off
12868   PacketFragments packet = {
12869     // public flags (IETF Retry packet, 0-length original destination CID)
12870     {"Unable to read first byte.",
12871      {0xf0}},
12872     // version tag
12873     {"Unable to read protocol version.",
12874      {QUIC_VERSION_BYTES}},
12875     // connection_id length
12876     {"RETRY not supported in this version.",
12877      {0x00}},
12878   };
12879   // clang-format on
12880 
12881   std::unique_ptr<QuicEncryptedPacket> encrypted(
12882       AssemblePacketFromFragments(packet));
12883 
12884   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
12885   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
12886   CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
12887 }
12888 
TEST_P(QuicFramerTest,RetryPacketRejectedWithMultiplePacketNumberSpaces)12889 TEST_P(QuicFramerTest, RetryPacketRejectedWithMultiplePacketNumberSpaces) {
12890   if (framer_.version().SupportsRetry()) {
12891     return;
12892   }
12893   framer_.EnableMultiplePacketNumberSpacesSupport();
12894 
12895   // clang-format off
12896   PacketFragments packet = {
12897     // public flags (IETF Retry packet, 0-length original destination CID)
12898     {"Unable to read first byte.",
12899      {0xf0}},
12900     // version tag
12901     {"Unable to read protocol version.",
12902      {QUIC_VERSION_BYTES}},
12903     // connection_id length
12904     {"RETRY not supported in this version.",
12905      {0x00}},
12906   };
12907   // clang-format on
12908 
12909   std::unique_ptr<QuicEncryptedPacket> encrypted(
12910       AssemblePacketFromFragments(packet));
12911 
12912   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
12913   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
12914   CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
12915 }
12916 
TEST_P(QuicFramerTest,WriteClientVersionNegotiationProbePacket)12917 TEST_P(QuicFramerTest, WriteClientVersionNegotiationProbePacket) {
12918   // clang-format off
12919   static const uint8_t expected_packet[1200] = {
12920     // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
12921     0xc0,
12922     // Version, part of the IETF space reserved for negotiation.
12923     0xca, 0xba, 0xda, 0xda,
12924     // Destination connection ID length 8.
12925     0x08,
12926     // 8-byte destination connection ID.
12927     0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
12928     // Source connection ID length 0.
12929     0x00,
12930     // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
12931     // not parse with any known version.
12932     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12933     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
12934     // zeroes to pad to 16 byte boundary.
12935     0x00,
12936     // A polite greeting in case a human sees this in tcpdump.
12937     0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
12938     0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
12939     0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
12940     0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
12941     0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
12942     0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
12943     0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
12944     0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
12945     0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
12946     0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
12947     0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
12948     0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
12949     0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
12950     0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
12951     0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
12952     0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
12953     0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
12954     0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
12955     0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
12956     0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
12957     0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
12958     0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
12959     0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
12960   };
12961   // clang-format on
12962   char packet[1200];
12963   char destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
12964                                             0x6c, 0x7a, 0x20, 0x21};
12965   EXPECT_TRUE(QuicFramer::WriteClientVersionNegotiationProbePacket(
12966       packet, sizeof(packet), destination_connection_id_bytes,
12967       sizeof(destination_connection_id_bytes)));
12968   quiche::test::CompareCharArraysWithHexError(
12969       "constructed packet", packet, sizeof(packet),
12970       reinterpret_cast<const char*>(expected_packet), sizeof(expected_packet));
12971   QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
12972                                 sizeof(packet), false);
12973   if (!framer_.version().HasLengthPrefixedConnectionIds()) {
12974     // We can only parse the connection ID with a parser expecting
12975     // length-prefixed connection IDs.
12976     EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12977     return;
12978   }
12979   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12980   ASSERT_TRUE(visitor_.header_.get());
12981   QuicConnectionId probe_payload_connection_id(
12982       reinterpret_cast<const char*>(destination_connection_id_bytes),
12983       sizeof(destination_connection_id_bytes));
12984   EXPECT_EQ(probe_payload_connection_id,
12985             visitor_.header_.get()->destination_connection_id);
12986 }
12987 
TEST_P(QuicFramerTest,DispatcherParseOldClientVersionNegotiationProbePacket)12988 TEST_P(QuicFramerTest, DispatcherParseOldClientVersionNegotiationProbePacket) {
12989   // clang-format off
12990   static const uint8_t packet[1200] = {
12991     // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
12992     0xc0,
12993     // Version, part of the IETF space reserved for negotiation.
12994     0xca, 0xba, 0xda, 0xba,
12995     // Destination connection ID length 8, source connection ID length 0.
12996     0x50,
12997     // 8-byte destination connection ID.
12998     0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
12999     // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13000     // not parse with any known version.
13001     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13002     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13003     // 2 bytes of zeroes to pad to 16 byte boundary.
13004     0x00, 0x00,
13005     // A polite greeting in case a human sees this in tcpdump.
13006     0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13007     0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13008     0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13009     0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13010     0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13011     0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13012     0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13013     0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13014     0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13015     0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13016     0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13017     0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13018     0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13019     0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13020     0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13021     0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13022     0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13023     0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13024     0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13025     0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13026     0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13027     0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13028     0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13029   };
13030   // clang-format on
13031   char expected_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13032                                                      0x6c, 0x7a, 0x20, 0x21};
13033   QuicConnectionId expected_destination_connection_id(
13034       reinterpret_cast<const char*>(expected_destination_connection_id_bytes),
13035       sizeof(expected_destination_connection_id_bytes));
13036 
13037   QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13038                                 sizeof(packet));
13039   PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
13040   QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
13041   bool version_present = false, has_length_prefix = true;
13042   QuicVersionLabel version_label = 33;
13043   ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
13044   QuicConnectionId destination_connection_id = TestConnectionId(1);
13045   QuicConnectionId source_connection_id = TestConnectionId(2);
13046   std::optional<absl::string_view> retry_token;
13047   std::string detailed_error = "foobar";
13048   QuicErrorCode header_parse_result = QuicFramer::ParsePublicHeaderDispatcher(
13049       encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
13050       &version_present, &has_length_prefix, &version_label, &parsed_version,
13051       &destination_connection_id, &source_connection_id, &retry_token,
13052       &detailed_error);
13053   EXPECT_THAT(header_parse_result, IsQuicNoError());
13054   EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
13055   EXPECT_TRUE(version_present);
13056   EXPECT_FALSE(has_length_prefix);
13057   EXPECT_EQ(0xcabadaba, version_label);
13058   EXPECT_EQ(expected_destination_connection_id, destination_connection_id);
13059   EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
13060   EXPECT_FALSE(retry_token.has_value());
13061   EXPECT_EQ("", detailed_error);
13062 }
13063 
TEST_P(QuicFramerTest,DispatcherParseClientVersionNegotiationProbePacket)13064 TEST_P(QuicFramerTest, DispatcherParseClientVersionNegotiationProbePacket) {
13065   // clang-format off
13066   static const uint8_t packet[1200] = {
13067     // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13068     0xc0,
13069     // Version, part of the IETF space reserved for negotiation.
13070     0xca, 0xba, 0xda, 0xba,
13071     // Destination connection ID length 8.
13072     0x08,
13073     // 8-byte destination connection ID.
13074     0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13075     // Source connection ID length 0.
13076     0x00,
13077     // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13078     // not parse with any known version.
13079     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13080     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13081     // 1 byte of zeroes to pad to 16 byte boundary.
13082     0x00,
13083     // A polite greeting in case a human sees this in tcpdump.
13084     0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13085     0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13086     0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13087     0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13088     0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13089     0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13090     0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13091     0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13092     0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13093     0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13094     0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13095     0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13096     0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13097     0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13098     0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13099     0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13100     0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13101     0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13102     0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13103     0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13104     0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13105     0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13106     0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13107   };
13108   // clang-format on
13109   char expected_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13110                                                      0x6c, 0x7a, 0x20, 0x21};
13111   QuicConnectionId expected_destination_connection_id(
13112       reinterpret_cast<const char*>(expected_destination_connection_id_bytes),
13113       sizeof(expected_destination_connection_id_bytes));
13114 
13115   QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13116                                 sizeof(packet));
13117   PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
13118   QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
13119   bool version_present = false, has_length_prefix = false;
13120   QuicVersionLabel version_label = 33;
13121   ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
13122   QuicConnectionId destination_connection_id = TestConnectionId(1);
13123   QuicConnectionId source_connection_id = TestConnectionId(2);
13124   std::optional<absl::string_view> retry_token;
13125   std::string detailed_error = "foobar";
13126   QuicErrorCode header_parse_result = QuicFramer::ParsePublicHeaderDispatcher(
13127       encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
13128       &version_present, &has_length_prefix, &version_label, &parsed_version,
13129       &destination_connection_id, &source_connection_id, &retry_token,
13130       &detailed_error);
13131   EXPECT_THAT(header_parse_result, IsQuicNoError());
13132   EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
13133   EXPECT_TRUE(version_present);
13134   EXPECT_TRUE(has_length_prefix);
13135   EXPECT_EQ(0xcabadaba, version_label);
13136   EXPECT_EQ(expected_destination_connection_id, destination_connection_id);
13137   EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
13138   EXPECT_EQ("", detailed_error);
13139 }
13140 
TEST_P(QuicFramerTest,ParseServerVersionNegotiationProbeResponse)13141 TEST_P(QuicFramerTest, ParseServerVersionNegotiationProbeResponse) {
13142   // clang-format off
13143   const uint8_t packet[] = {
13144     // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13145     0xc0,
13146     // Version of 0, indicating version negotiation.
13147     0x00, 0x00, 0x00, 0x00,
13148     // Destination connection ID length 0, source connection ID length 8.
13149     0x00, 0x08,
13150     // 8-byte source connection ID.
13151     0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13152     // A few supported versions.
13153     0xaa, 0xaa, 0xaa, 0xaa,
13154     QUIC_VERSION_BYTES,
13155   };
13156   // clang-format on
13157   char probe_payload_bytes[] = {0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21};
13158   char parsed_probe_payload_bytes[255] = {};
13159   uint8_t parsed_probe_payload_length = sizeof(parsed_probe_payload_bytes);
13160   std::string parse_detailed_error = "";
13161   EXPECT_TRUE(QuicFramer::ParseServerVersionNegotiationProbeResponse(
13162       reinterpret_cast<const char*>(packet), sizeof(packet),
13163       reinterpret_cast<char*>(parsed_probe_payload_bytes),
13164       &parsed_probe_payload_length, &parse_detailed_error));
13165   EXPECT_EQ("", parse_detailed_error);
13166   quiche::test::CompareCharArraysWithHexError(
13167       "parsed probe", parsed_probe_payload_bytes, parsed_probe_payload_length,
13168       probe_payload_bytes, sizeof(probe_payload_bytes));
13169 }
13170 
TEST_P(QuicFramerTest,ParseClientVersionNegotiationProbePacket)13171 TEST_P(QuicFramerTest, ParseClientVersionNegotiationProbePacket) {
13172   char packet[1200];
13173   char input_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13174                                                   0x6c, 0x7a, 0x20, 0x21};
13175   ASSERT_TRUE(QuicFramer::WriteClientVersionNegotiationProbePacket(
13176       packet, sizeof(packet), input_destination_connection_id_bytes,
13177       sizeof(input_destination_connection_id_bytes)));
13178   char parsed_destination_connection_id_bytes[255] = {0};
13179   uint8_t parsed_destination_connection_id_length =
13180       sizeof(parsed_destination_connection_id_bytes);
13181   ASSERT_TRUE(ParseClientVersionNegotiationProbePacket(
13182       packet, sizeof(packet), parsed_destination_connection_id_bytes,
13183       &parsed_destination_connection_id_length));
13184   quiche::test::CompareCharArraysWithHexError(
13185       "parsed destination connection ID",
13186       parsed_destination_connection_id_bytes,
13187       parsed_destination_connection_id_length,
13188       input_destination_connection_id_bytes,
13189       sizeof(input_destination_connection_id_bytes));
13190 }
13191 
TEST_P(QuicFramerTest,WriteServerVersionNegotiationProbeResponse)13192 TEST_P(QuicFramerTest, WriteServerVersionNegotiationProbeResponse) {
13193   char packet[1200];
13194   size_t packet_length = sizeof(packet);
13195   char input_source_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13196                                              0x6c, 0x7a, 0x20, 0x21};
13197   ASSERT_TRUE(WriteServerVersionNegotiationProbeResponse(
13198       packet, &packet_length, input_source_connection_id_bytes,
13199       sizeof(input_source_connection_id_bytes)));
13200   char parsed_source_connection_id_bytes[255] = {0};
13201   uint8_t parsed_source_connection_id_length =
13202       sizeof(parsed_source_connection_id_bytes);
13203   std::string detailed_error;
13204   ASSERT_TRUE(QuicFramer::ParseServerVersionNegotiationProbeResponse(
13205       packet, packet_length, parsed_source_connection_id_bytes,
13206       &parsed_source_connection_id_length, &detailed_error))
13207       << detailed_error;
13208   quiche::test::CompareCharArraysWithHexError(
13209       "parsed destination connection ID", parsed_source_connection_id_bytes,
13210       parsed_source_connection_id_length, input_source_connection_id_bytes,
13211       sizeof(input_source_connection_id_bytes));
13212 }
13213 
TEST_P(QuicFramerTest,ClientConnectionIdFromLongHeaderToClient)13214 TEST_P(QuicFramerTest, ClientConnectionIdFromLongHeaderToClient) {
13215   SetDecrypterLevel(ENCRYPTION_HANDSHAKE);
13216   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13217   // clang-format off
13218   unsigned char packet[] = {
13219     // public flags (long header with packet type HANDSHAKE and
13220     // 4-byte packet number)
13221     0xE3,
13222     // version
13223     QUIC_VERSION_BYTES,
13224     // connection ID lengths
13225     0x50,
13226     // destination connection ID
13227     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13228     // long header packet length
13229     0x05,
13230     // packet number
13231     0x12, 0x34, 0x56, 0x00,
13232     // padding frame
13233     0x00,
13234   };
13235   unsigned char packet49[] = {
13236     // public flags (long header with packet type HANDSHAKE and
13237     // 4-byte packet number)
13238     0xE3,
13239     // version
13240     QUIC_VERSION_BYTES,
13241     // destination connection ID length
13242     0x08,
13243     // destination connection ID
13244     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13245     // source connection ID length
13246     0x00,
13247     // long header packet length
13248     0x05,
13249     // packet number
13250     0x12, 0x34, 0x56, 0x00,
13251     // padding frame
13252     0x00,
13253   };
13254   // clang-format on
13255 
13256   unsigned char* p = packet;
13257   size_t p_length = ABSL_ARRAYSIZE(packet);
13258   if (framer_.version().HasLongHeaderLengths()) {
13259     ReviseFirstByteByVersion(packet49);
13260     p = packet49;
13261     p_length = ABSL_ARRAYSIZE(packet49);
13262   }
13263   const bool parse_success =
13264       framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false));
13265   if (!framer_.version().AllowsVariableLengthConnectionIds()) {
13266     EXPECT_FALSE(parse_success);
13267     EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
13268     EXPECT_EQ("Invalid ConnectionId length.", framer_.detailed_error());
13269     return;
13270   }
13271   EXPECT_TRUE(parse_success);
13272   EXPECT_THAT(framer_.error(), IsQuicNoError());
13273   EXPECT_EQ("", framer_.detailed_error());
13274   ASSERT_TRUE(visitor_.header_.get());
13275   EXPECT_EQ(FramerTestConnectionId(),
13276             visitor_.header_.get()->destination_connection_id);
13277 }
13278 
TEST_P(QuicFramerTest,ClientConnectionIdFromLongHeaderToServer)13279 TEST_P(QuicFramerTest, ClientConnectionIdFromLongHeaderToServer) {
13280   SetDecrypterLevel(ENCRYPTION_HANDSHAKE);
13281   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13282   // clang-format off
13283   unsigned char packet[] = {
13284     // public flags (long header with packet type HANDSHAKE and
13285     // 4-byte packet number)
13286     0xE3,
13287     // version
13288     QUIC_VERSION_BYTES,
13289     // connection ID lengths
13290     0x05,
13291     // source connection ID
13292     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13293     // long header packet length
13294     0x05,
13295     // packet number
13296     0x12, 0x34, 0x56, 0x00,
13297     // padding frame
13298     0x00,
13299   };
13300   unsigned char packet49[] = {
13301     // public flags (long header with packet type HANDSHAKE and
13302     // 4-byte packet number)
13303     0xE3,
13304     // version
13305     QUIC_VERSION_BYTES,
13306     // connection ID lengths
13307     0x00, 0x08,
13308     // source connection ID
13309     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13310     // long header packet length
13311     0x05,
13312     // packet number
13313     0x12, 0x34, 0x56, 0x00,
13314     // padding frame
13315     0x00,
13316   };
13317   // clang-format on
13318   unsigned char* p = packet;
13319   size_t p_length = ABSL_ARRAYSIZE(packet);
13320   if (framer_.version().HasLongHeaderLengths()) {
13321     ReviseFirstByteByVersion(packet49);
13322     p = packet49;
13323     p_length = ABSL_ARRAYSIZE(packet49);
13324   }
13325   const bool parse_success =
13326       framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false));
13327   if (!framer_.version().AllowsVariableLengthConnectionIds()) {
13328     EXPECT_FALSE(parse_success);
13329     EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
13330     EXPECT_EQ("Invalid ConnectionId length.", framer_.detailed_error());
13331     return;
13332   }
13333   if (!framer_.version().SupportsClientConnectionIds()) {
13334     EXPECT_FALSE(parse_success);
13335     EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
13336     EXPECT_EQ("Client connection ID not supported in this version.",
13337               framer_.detailed_error());
13338     return;
13339   }
13340   EXPECT_TRUE(parse_success);
13341   EXPECT_THAT(framer_.error(), IsQuicNoError());
13342   EXPECT_EQ("", framer_.detailed_error());
13343   ASSERT_TRUE(visitor_.header_.get());
13344   EXPECT_EQ(FramerTestConnectionId(),
13345             visitor_.header_.get()->source_connection_id);
13346 }
13347 
TEST_P(QuicFramerTest,ProcessAndValidateIetfConnectionIdLengthClient)13348 TEST_P(QuicFramerTest, ProcessAndValidateIetfConnectionIdLengthClient) {
13349   char connection_id_lengths = 0x05;
13350   QuicDataReader reader(&connection_id_lengths, 1);
13351 
13352   bool should_update_expected_server_connection_id_length = false;
13353   uint8_t expected_server_connection_id_length = 8;
13354   uint8_t destination_connection_id_length = 0;
13355   uint8_t source_connection_id_length = 8;
13356   std::string detailed_error = "";
13357 
13358   EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13359       &reader, framer_.version(), Perspective::IS_CLIENT,
13360       should_update_expected_server_connection_id_length,
13361       &expected_server_connection_id_length, &destination_connection_id_length,
13362       &source_connection_id_length, &detailed_error));
13363   EXPECT_EQ(8, expected_server_connection_id_length);
13364   EXPECT_EQ(0, destination_connection_id_length);
13365   EXPECT_EQ(8, source_connection_id_length);
13366   EXPECT_EQ("", detailed_error);
13367 
13368   QuicDataReader reader2(&connection_id_lengths, 1);
13369   should_update_expected_server_connection_id_length = true;
13370   expected_server_connection_id_length = 33;
13371   EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13372       &reader2, framer_.version(), Perspective::IS_CLIENT,
13373       should_update_expected_server_connection_id_length,
13374       &expected_server_connection_id_length, &destination_connection_id_length,
13375       &source_connection_id_length, &detailed_error));
13376   EXPECT_EQ(8, expected_server_connection_id_length);
13377   EXPECT_EQ(0, destination_connection_id_length);
13378   EXPECT_EQ(8, source_connection_id_length);
13379   EXPECT_EQ("", detailed_error);
13380 }
13381 
TEST_P(QuicFramerTest,ProcessAndValidateIetfConnectionIdLengthServer)13382 TEST_P(QuicFramerTest, ProcessAndValidateIetfConnectionIdLengthServer) {
13383   char connection_id_lengths = 0x50;
13384   QuicDataReader reader(&connection_id_lengths, 1);
13385 
13386   bool should_update_expected_server_connection_id_length = false;
13387   uint8_t expected_server_connection_id_length = 8;
13388   uint8_t destination_connection_id_length = 8;
13389   uint8_t source_connection_id_length = 0;
13390   std::string detailed_error = "";
13391 
13392   EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13393       &reader, framer_.version(), Perspective::IS_SERVER,
13394       should_update_expected_server_connection_id_length,
13395       &expected_server_connection_id_length, &destination_connection_id_length,
13396       &source_connection_id_length, &detailed_error));
13397   EXPECT_EQ(8, expected_server_connection_id_length);
13398   EXPECT_EQ(8, destination_connection_id_length);
13399   EXPECT_EQ(0, source_connection_id_length);
13400   EXPECT_EQ("", detailed_error);
13401 
13402   QuicDataReader reader2(&connection_id_lengths, 1);
13403   should_update_expected_server_connection_id_length = true;
13404   expected_server_connection_id_length = 33;
13405   EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13406       &reader2, framer_.version(), Perspective::IS_SERVER,
13407       should_update_expected_server_connection_id_length,
13408       &expected_server_connection_id_length, &destination_connection_id_length,
13409       &source_connection_id_length, &detailed_error));
13410   EXPECT_EQ(8, expected_server_connection_id_length);
13411   EXPECT_EQ(8, destination_connection_id_length);
13412   EXPECT_EQ(0, source_connection_id_length);
13413   EXPECT_EQ("", detailed_error);
13414 }
13415 
TEST_P(QuicFramerTest,TestExtendedErrorCodeParser)13416 TEST_P(QuicFramerTest, TestExtendedErrorCodeParser) {
13417   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
13418     // Extended error codes only in IETF QUIC
13419     return;
13420   }
13421   QuicConnectionCloseFrame frame;
13422 
13423   frame.error_details = "this has no error code info in it";
13424   MaybeExtractQuicErrorCode(&frame);
13425   EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13426   EXPECT_EQ("this has no error code info in it", frame.error_details);
13427 
13428   frame.error_details = "1234this does not have the colon in it";
13429   MaybeExtractQuicErrorCode(&frame);
13430   EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13431   EXPECT_EQ("1234this does not have the colon in it", frame.error_details);
13432 
13433   frame.error_details = "1a234:this has a colon, but a malformed error number";
13434   MaybeExtractQuicErrorCode(&frame);
13435   EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13436   EXPECT_EQ("1a234:this has a colon, but a malformed error number",
13437             frame.error_details);
13438 
13439   frame.error_details = "1234:this is good";
13440   MaybeExtractQuicErrorCode(&frame);
13441   EXPECT_EQ(1234u, frame.quic_error_code);
13442   EXPECT_EQ("this is good", frame.error_details);
13443 
13444   frame.error_details =
13445       "1234 :this is not good, space between last digit and colon";
13446   MaybeExtractQuicErrorCode(&frame);
13447   EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13448   EXPECT_EQ("1234 :this is not good, space between last digit and colon",
13449             frame.error_details);
13450 
13451   frame.error_details = "123456789";
13452   MaybeExtractQuicErrorCode(&frame);
13453   EXPECT_THAT(
13454       frame.quic_error_code,
13455       IsError(QUIC_IETF_GQUIC_ERROR_MISSING));  // Not good, all numbers, no :
13456   EXPECT_EQ("123456789", frame.error_details);
13457 
13458   frame.error_details = "1234:";
13459   MaybeExtractQuicErrorCode(&frame);
13460   EXPECT_EQ(1234u,
13461             frame.quic_error_code);  // corner case.
13462   EXPECT_EQ("", frame.error_details);
13463 
13464   frame.error_details = "1234:5678";
13465   MaybeExtractQuicErrorCode(&frame);
13466   EXPECT_EQ(1234u,
13467             frame.quic_error_code);  // another corner case.
13468   EXPECT_EQ("5678", frame.error_details);
13469 
13470   frame.error_details = "12345 6789:";
13471   MaybeExtractQuicErrorCode(&frame);
13472   EXPECT_THAT(frame.quic_error_code,
13473               IsError(QUIC_IETF_GQUIC_ERROR_MISSING));  // Not good
13474   EXPECT_EQ("12345 6789:", frame.error_details);
13475 
13476   frame.error_details = ":no numbers, is not good";
13477   MaybeExtractQuicErrorCode(&frame);
13478   EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13479   EXPECT_EQ(":no numbers, is not good", frame.error_details);
13480 
13481   frame.error_details = "qwer:also no numbers, is not good";
13482   MaybeExtractQuicErrorCode(&frame);
13483   EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13484   EXPECT_EQ("qwer:also no numbers, is not good", frame.error_details);
13485 
13486   frame.error_details = " 1234:this is not good, space before first digit";
13487   MaybeExtractQuicErrorCode(&frame);
13488   EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13489   EXPECT_EQ(" 1234:this is not good, space before first digit",
13490             frame.error_details);
13491 
13492   frame.error_details = "1234:";
13493   MaybeExtractQuicErrorCode(&frame);
13494   EXPECT_EQ(1234u,
13495             frame.quic_error_code);  // this is good
13496   EXPECT_EQ("", frame.error_details);
13497 
13498   // Value does not fit in uint32_t.
13499   frame.error_details = "12345678901:";
13500   MaybeExtractQuicErrorCode(&frame);
13501   EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13502   EXPECT_EQ("12345678901:", frame.error_details);
13503 }
13504 
13505 // Regression test for crbug/1029636.
TEST_P(QuicFramerTest,OverlyLargeAckDelay)13506 TEST_P(QuicFramerTest, OverlyLargeAckDelay) {
13507   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
13508     return;
13509   }
13510   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
13511   // clang-format off
13512   unsigned char packet_ietf[] = {
13513     // type (short header, 4 byte packet number)
13514     0x43,
13515     // connection_id
13516     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13517     // packet number
13518     0x12, 0x34, 0x56, 0x78,
13519 
13520     // frame type (IETF_ACK frame)
13521     0x02,
13522     // largest acked
13523     kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
13524     // ack delay time.
13525     kVarInt62EightBytes + 0x31, 0x00, 0x00, 0x00, 0xF3, 0xA0, 0x81, 0xE0,
13526     // Nr. of additional ack blocks
13527     kVarInt62OneByte + 0x00,
13528     // first ack block length.
13529     kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
13530   };
13531   // clang-format on
13532 
13533   framer_.ProcessPacket(QuicEncryptedPacket(
13534       AsChars(packet_ietf), ABSL_ARRAYSIZE(packet_ietf), false));
13535   ASSERT_EQ(1u, visitor_.ack_frames_.size());
13536   // Verify ack_delay_time is set correctly.
13537   EXPECT_EQ(QuicTime::Delta::Infinite(),
13538             visitor_.ack_frames_[0]->ack_delay_time);
13539 }
13540 
TEST_P(QuicFramerTest,KeyUpdate)13541 TEST_P(QuicFramerTest, KeyUpdate) {
13542   if (!framer_.version().UsesTls()) {
13543     // Key update is only used in QUIC+TLS.
13544     return;
13545   }
13546   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13547   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13548   // instead of TestDecrypter.
13549   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13550                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13551   framer_.SetKeyUpdateSupportForConnection(true);
13552 
13553   QuicPacketHeader header;
13554   header.destination_connection_id = FramerTestConnectionId();
13555   header.reset_flag = false;
13556   header.version_flag = false;
13557   header.packet_number = kPacketNumber;
13558 
13559   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13560 
13561   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13562   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13563   ASSERT_TRUE(data != nullptr);
13564   std::unique_ptr<QuicEncryptedPacket> encrypted(
13565       EncryptPacketWithTagAndPhase(*data, 0, false));
13566   ASSERT_TRUE(encrypted);
13567 
13568   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13569   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13570   // Processed valid packet with phase=0, key=1: no key update.
13571   EXPECT_EQ(0u, visitor_.key_update_count());
13572   EXPECT_EQ(0, visitor_.derive_next_key_count_);
13573   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13574 
13575   header.packet_number += 1;
13576   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13577   data = BuildDataPacket(header, frames);
13578   ASSERT_TRUE(data != nullptr);
13579   encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13580   ASSERT_TRUE(encrypted);
13581   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13582   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13583   // Processed valid packet with phase=1, key=2: key update should have
13584   // occurred.
13585   ASSERT_EQ(1u, visitor_.key_update_count());
13586   EXPECT_EQ(KeyUpdateReason::kRemote, visitor_.key_update_reasons_[0]);
13587   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13588   EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13589 
13590   header.packet_number += 1;
13591   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13592   data = BuildDataPacket(header, frames);
13593   ASSERT_TRUE(data != nullptr);
13594   encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13595   ASSERT_TRUE(encrypted);
13596   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13597   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13598   // Processed another valid packet with phase=1, key=2: no key update.
13599   EXPECT_EQ(1u, visitor_.key_update_count());
13600   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13601   EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13602 
13603   // Process another key update.
13604   header.packet_number += 1;
13605   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13606   data = BuildDataPacket(header, frames);
13607   ASSERT_TRUE(data != nullptr);
13608   encrypted = EncryptPacketWithTagAndPhase(*data, 2, false);
13609   ASSERT_TRUE(encrypted);
13610   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13611   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13612   ASSERT_EQ(2u, visitor_.key_update_count());
13613   EXPECT_EQ(KeyUpdateReason::kRemote, visitor_.key_update_reasons_[1]);
13614   EXPECT_EQ(2, visitor_.derive_next_key_count_);
13615   EXPECT_EQ(3, visitor_.decrypted_first_packet_in_key_phase_count_);
13616 }
13617 
TEST_P(QuicFramerTest,KeyUpdateOldPacketAfterUpdate)13618 TEST_P(QuicFramerTest, KeyUpdateOldPacketAfterUpdate) {
13619   if (!framer_.version().UsesTls()) {
13620     // Key update is only used in QUIC+TLS.
13621     return;
13622   }
13623   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13624   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13625   // instead of TestDecrypter.
13626   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13627                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13628   framer_.SetKeyUpdateSupportForConnection(true);
13629 
13630   QuicPacketHeader header;
13631   header.destination_connection_id = FramerTestConnectionId();
13632   header.reset_flag = false;
13633   header.version_flag = false;
13634   header.packet_number = kPacketNumber;
13635 
13636   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13637 
13638   // Process packet N with phase 0.
13639   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13640   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13641   ASSERT_TRUE(data != nullptr);
13642   std::unique_ptr<QuicEncryptedPacket> encrypted(
13643       EncryptPacketWithTagAndPhase(*data, 0, false));
13644   ASSERT_TRUE(encrypted);
13645   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13646   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13647   EXPECT_EQ(0u, visitor_.key_update_count());
13648   EXPECT_EQ(0, visitor_.derive_next_key_count_);
13649   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13650 
13651   // Process packet N+2 with phase 1.
13652   header.packet_number = kPacketNumber + 2;
13653   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13654   data = BuildDataPacket(header, frames);
13655   ASSERT_TRUE(data != nullptr);
13656   encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13657   ASSERT_TRUE(encrypted);
13658   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13659   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13660   EXPECT_EQ(1u, visitor_.key_update_count());
13661   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13662   EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13663 
13664   // Process packet N+1 with phase 0. (Receiving packet from previous phase
13665   // after packet from new phase was received.)
13666   header.packet_number = kPacketNumber + 1;
13667   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13668   data = BuildDataPacket(header, frames);
13669   ASSERT_TRUE(data != nullptr);
13670   encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
13671   ASSERT_TRUE(encrypted);
13672   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13673   // Packet should decrypt and key update count should not change.
13674   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13675   EXPECT_EQ(1u, visitor_.key_update_count());
13676   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13677   EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13678 }
13679 
TEST_P(QuicFramerTest,KeyUpdateOldPacketAfterDiscardPreviousOneRttKeys)13680 TEST_P(QuicFramerTest, KeyUpdateOldPacketAfterDiscardPreviousOneRttKeys) {
13681   if (!framer_.version().UsesTls()) {
13682     // Key update is only used in QUIC+TLS.
13683     return;
13684   }
13685   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13686   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13687   // instead of TestDecrypter.
13688   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13689                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13690   framer_.SetKeyUpdateSupportForConnection(true);
13691 
13692   QuicPacketHeader header;
13693   header.destination_connection_id = FramerTestConnectionId();
13694   header.reset_flag = false;
13695   header.version_flag = false;
13696   header.packet_number = kPacketNumber;
13697 
13698   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13699 
13700   // Process packet N with phase 0.
13701   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13702   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13703   ASSERT_TRUE(data != nullptr);
13704   std::unique_ptr<QuicEncryptedPacket> encrypted(
13705       EncryptPacketWithTagAndPhase(*data, 0, false));
13706   ASSERT_TRUE(encrypted);
13707   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13708   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13709   EXPECT_EQ(0u, visitor_.key_update_count());
13710   EXPECT_EQ(0, visitor_.derive_next_key_count_);
13711   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13712 
13713   // Process packet N+2 with phase 1.
13714   header.packet_number = kPacketNumber + 2;
13715   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13716   data = BuildDataPacket(header, frames);
13717   ASSERT_TRUE(data != nullptr);
13718   encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13719   ASSERT_TRUE(encrypted);
13720   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13721   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13722   EXPECT_EQ(1u, visitor_.key_update_count());
13723   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13724   EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13725 
13726   // Discard keys for previous key phase.
13727   framer_.DiscardPreviousOneRttKeys();
13728 
13729   // Process packet N+1 with phase 0. (Receiving packet from previous phase
13730   // after packet from new phase was received.)
13731   header.packet_number = kPacketNumber + 1;
13732   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13733   data = BuildDataPacket(header, frames);
13734   ASSERT_TRUE(data != nullptr);
13735   encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
13736   ASSERT_TRUE(encrypted);
13737   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13738   // Packet should not decrypt and key update count should not change.
13739   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13740   EXPECT_EQ(1u, visitor_.key_update_count());
13741   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13742   EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13743 }
13744 
TEST_P(QuicFramerTest,KeyUpdatePacketsOutOfOrder)13745 TEST_P(QuicFramerTest, KeyUpdatePacketsOutOfOrder) {
13746   if (!framer_.version().UsesTls()) {
13747     // Key update is only used in QUIC+TLS.
13748     return;
13749   }
13750   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13751   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13752   // instead of TestDecrypter.
13753   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13754                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13755   framer_.SetKeyUpdateSupportForConnection(true);
13756 
13757   QuicPacketHeader header;
13758   header.destination_connection_id = FramerTestConnectionId();
13759   header.reset_flag = false;
13760   header.version_flag = false;
13761   header.packet_number = kPacketNumber;
13762 
13763   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13764 
13765   // Process packet N with phase 0.
13766   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13767   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13768   ASSERT_TRUE(data != nullptr);
13769   std::unique_ptr<QuicEncryptedPacket> encrypted(
13770       EncryptPacketWithTagAndPhase(*data, 0, false));
13771   ASSERT_TRUE(encrypted);
13772   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13773   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13774   EXPECT_EQ(0u, visitor_.key_update_count());
13775   EXPECT_EQ(0, visitor_.derive_next_key_count_);
13776   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13777 
13778   // Process packet N+2 with phase 1.
13779   header.packet_number = kPacketNumber + 2;
13780   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13781   data = BuildDataPacket(header, frames);
13782   ASSERT_TRUE(data != nullptr);
13783   encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13784   ASSERT_TRUE(encrypted);
13785   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13786   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13787   EXPECT_EQ(1u, visitor_.key_update_count());
13788   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13789   EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13790 
13791   // Process packet N+1 with phase 1. (Receiving packet from new phase out of
13792   // order.)
13793   header.packet_number = kPacketNumber + 1;
13794   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13795   data = BuildDataPacket(header, frames);
13796   ASSERT_TRUE(data != nullptr);
13797   encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13798   ASSERT_TRUE(encrypted);
13799   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13800   // Packet should decrypt and key update count should not change.
13801   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13802   EXPECT_EQ(1u, visitor_.key_update_count());
13803   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13804   EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13805 }
13806 
TEST_P(QuicFramerTest,KeyUpdateWrongKey)13807 TEST_P(QuicFramerTest, KeyUpdateWrongKey) {
13808   if (!framer_.version().UsesTls()) {
13809     // Key update is only used in QUIC+TLS.
13810     return;
13811   }
13812   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13813   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13814   // instead of TestDecrypter.
13815   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13816                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13817   framer_.SetKeyUpdateSupportForConnection(true);
13818 
13819   QuicPacketHeader header;
13820   header.destination_connection_id = FramerTestConnectionId();
13821   header.reset_flag = false;
13822   header.version_flag = false;
13823   header.packet_number = kPacketNumber;
13824 
13825   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13826 
13827   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13828   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13829   ASSERT_TRUE(data != nullptr);
13830   std::unique_ptr<QuicEncryptedPacket> encrypted(
13831       EncryptPacketWithTagAndPhase(*data, 0, false));
13832   ASSERT_TRUE(encrypted);
13833 
13834   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13835   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13836   // Processed valid packet with phase=0, key=1: no key update.
13837   EXPECT_EQ(0u, visitor_.key_update_count());
13838   EXPECT_EQ(0, visitor_.derive_next_key_count_);
13839   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13840   EXPECT_EQ(0u, framer_.PotentialPeerKeyUpdateAttemptCount());
13841 
13842   header.packet_number += 1;
13843   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13844   data = BuildDataPacket(header, frames);
13845   ASSERT_TRUE(data != nullptr);
13846   encrypted = EncryptPacketWithTagAndPhase(*data, 2, true);
13847   ASSERT_TRUE(encrypted);
13848   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13849   // Packet with phase=1 but key=3, should not process and should not cause key
13850   // update, but next decrypter key should have been created to attempt to
13851   // decode it.
13852   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13853   EXPECT_EQ(0u, visitor_.key_update_count());
13854   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13855   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13856   EXPECT_EQ(1u, framer_.PotentialPeerKeyUpdateAttemptCount());
13857 
13858   header.packet_number += 1;
13859   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13860   data = BuildDataPacket(header, frames);
13861   ASSERT_TRUE(data != nullptr);
13862   encrypted = EncryptPacketWithTagAndPhase(*data, 0, true);
13863   ASSERT_TRUE(encrypted);
13864   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13865   // Packet with phase=1 but key=1, should not process and should not cause key
13866   // update.
13867   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13868   EXPECT_EQ(0u, visitor_.key_update_count());
13869   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13870   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13871   EXPECT_EQ(2u, framer_.PotentialPeerKeyUpdateAttemptCount());
13872 
13873   header.packet_number += 1;
13874   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13875   data = BuildDataPacket(header, frames);
13876   ASSERT_TRUE(data != nullptr);
13877   encrypted = EncryptPacketWithTagAndPhase(*data, 1, false);
13878   ASSERT_TRUE(encrypted);
13879   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13880   // Packet with phase=0 but key=2, should not process and should not cause key
13881   // update.
13882   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13883   EXPECT_EQ(0u, visitor_.key_update_count());
13884   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13885   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13886   EXPECT_EQ(2u, framer_.PotentialPeerKeyUpdateAttemptCount());
13887 
13888   header.packet_number += 1;
13889   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13890   data = BuildDataPacket(header, frames);
13891   ASSERT_TRUE(data != nullptr);
13892   encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
13893   ASSERT_TRUE(encrypted);
13894   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13895   // Packet with phase=0 and key=0, should process and reset
13896   // potential_peer_key_update_attempt_count_.
13897   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13898   EXPECT_EQ(0u, visitor_.key_update_count());
13899   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13900   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13901   EXPECT_EQ(0u, framer_.PotentialPeerKeyUpdateAttemptCount());
13902 }
13903 
TEST_P(QuicFramerTest,KeyUpdateReceivedWhenNotEnabled)13904 TEST_P(QuicFramerTest, KeyUpdateReceivedWhenNotEnabled) {
13905   if (!framer_.version().UsesTls()) {
13906     // Key update is only used in QUIC+TLS.
13907     return;
13908   }
13909   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13910   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13911   // instead of TestDecrypter.
13912   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13913                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13914 
13915   QuicPacketHeader header;
13916   header.destination_connection_id = FramerTestConnectionId();
13917   header.reset_flag = false;
13918   header.version_flag = false;
13919   header.packet_number = kPacketNumber;
13920 
13921   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13922 
13923   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13924   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13925   ASSERT_TRUE(data != nullptr);
13926   std::unique_ptr<QuicEncryptedPacket> encrypted(
13927       EncryptPacketWithTagAndPhase(*data, 1, true));
13928   ASSERT_TRUE(encrypted);
13929 
13930   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13931   // Received a packet with key phase updated even though framer hasn't had key
13932   // update enabled (SetNextOneRttCrypters never called). Should fail to
13933   // process.
13934   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13935   EXPECT_EQ(0u, visitor_.key_update_count());
13936   EXPECT_EQ(0, visitor_.derive_next_key_count_);
13937   EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
13938 }
13939 
TEST_P(QuicFramerTest,KeyUpdateLocallyInitiated)13940 TEST_P(QuicFramerTest, KeyUpdateLocallyInitiated) {
13941   if (!framer_.version().UsesTls()) {
13942     // Key update is only used in QUIC+TLS.
13943     return;
13944   }
13945   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13946   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13947   // instead of TestDecrypter.
13948   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13949                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13950   framer_.SetKeyUpdateSupportForConnection(true);
13951 
13952   EXPECT_TRUE(framer_.DoKeyUpdate(KeyUpdateReason::kLocalForTests));
13953   // Key update count should be updated, but haven't received packet from peer
13954   // with new key phase.
13955   ASSERT_EQ(1u, visitor_.key_update_count());
13956   EXPECT_EQ(KeyUpdateReason::kLocalForTests, visitor_.key_update_reasons_[0]);
13957   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13958   EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
13959 
13960   QuicPacketHeader header;
13961   header.destination_connection_id = FramerTestConnectionId();
13962   header.reset_flag = false;
13963   header.version_flag = false;
13964   header.packet_number = kPacketNumber;
13965 
13966   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13967 
13968   // Process packet N with phase 1.
13969   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13970   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13971   ASSERT_TRUE(data != nullptr);
13972   std::unique_ptr<QuicEncryptedPacket> encrypted(
13973       EncryptPacketWithTagAndPhase(*data, 1, true));
13974   ASSERT_TRUE(encrypted);
13975 
13976   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13977   // Packet should decrypt and key update count should not change and
13978   // OnDecryptedFirstPacketInKeyPhase should have been called.
13979   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13980   EXPECT_EQ(1u, visitor_.key_update_count());
13981   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13982   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13983 
13984   // Process packet N-1 with phase 0. (Receiving packet from previous phase
13985   // after packet from new phase was received.)
13986   header.packet_number = kPacketNumber - 1;
13987   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13988   data = BuildDataPacket(header, frames);
13989   ASSERT_TRUE(data != nullptr);
13990   encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
13991   ASSERT_TRUE(encrypted);
13992   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13993   // Packet should decrypt and key update count should not change.
13994   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13995   EXPECT_EQ(1u, visitor_.key_update_count());
13996   EXPECT_EQ(1, visitor_.derive_next_key_count_);
13997   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13998 
13999   // Process packet N+1 with phase 0 and key 1. This should not decrypt even
14000   // though it's using the previous key, since the packet number is higher than
14001   // a packet number received using the current key.
14002   header.packet_number = kPacketNumber + 1;
14003   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14004   data = BuildDataPacket(header, frames);
14005   ASSERT_TRUE(data != nullptr);
14006   encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
14007   ASSERT_TRUE(encrypted);
14008   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14009   // Packet should not decrypt and key update count should not change.
14010   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
14011   EXPECT_EQ(1u, visitor_.key_update_count());
14012   EXPECT_EQ(2, visitor_.derive_next_key_count_);
14013   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14014 }
14015 
TEST_P(QuicFramerTest,KeyUpdateLocallyInitiatedReceivedOldPacket)14016 TEST_P(QuicFramerTest, KeyUpdateLocallyInitiatedReceivedOldPacket) {
14017   if (!framer_.version().UsesTls()) {
14018     // Key update is only used in QUIC+TLS.
14019     return;
14020   }
14021   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14022   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14023   // instead of TestDecrypter.
14024   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14025                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14026   framer_.SetKeyUpdateSupportForConnection(true);
14027 
14028   EXPECT_TRUE(framer_.DoKeyUpdate(KeyUpdateReason::kLocalForTests));
14029   // Key update count should be updated, but haven't received packet
14030   // from peer with new key phase.
14031   EXPECT_EQ(1u, visitor_.key_update_count());
14032   EXPECT_EQ(1, visitor_.derive_next_key_count_);
14033   EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
14034 
14035   QuicPacketHeader header;
14036   header.destination_connection_id = FramerTestConnectionId();
14037   header.reset_flag = false;
14038   header.version_flag = false;
14039   header.packet_number = kPacketNumber;
14040 
14041   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
14042 
14043   // Process packet N with phase 0. (Receiving packet from previous phase
14044   // after locally initiated key update, but before any packet from new phase
14045   // was received.)
14046   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14047   std::unique_ptr<QuicPacket> data = BuildDataPacket(header, frames);
14048   ASSERT_TRUE(data != nullptr);
14049   std::unique_ptr<QuicEncryptedPacket> encrypted =
14050       EncryptPacketWithTagAndPhase(*data, 0, false);
14051   ASSERT_TRUE(encrypted);
14052   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14053   // Packet should decrypt and key update count should not change and
14054   // OnDecryptedFirstPacketInKeyPhase should not have been called since the
14055   // packet was from the previous key phase.
14056   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14057   EXPECT_EQ(1u, visitor_.key_update_count());
14058   EXPECT_EQ(1, visitor_.derive_next_key_count_);
14059   EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
14060 
14061   // Process packet N+1 with phase 1.
14062   header.packet_number = kPacketNumber + 1;
14063   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14064   data = BuildDataPacket(header, frames);
14065   ASSERT_TRUE(data != nullptr);
14066   encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
14067   ASSERT_TRUE(encrypted);
14068   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14069   // Packet should decrypt and key update count should not change, but
14070   // OnDecryptedFirstPacketInKeyPhase should have been called.
14071   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14072   EXPECT_EQ(1u, visitor_.key_update_count());
14073   EXPECT_EQ(1, visitor_.derive_next_key_count_);
14074   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14075 
14076   // Process packet N+2 with phase 0 and key 1. This should not decrypt even
14077   // though it's using the previous key, since the packet number is higher than
14078   // a packet number received using the current key.
14079   header.packet_number = kPacketNumber + 2;
14080   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14081   data = BuildDataPacket(header, frames);
14082   ASSERT_TRUE(data != nullptr);
14083   encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
14084   ASSERT_TRUE(encrypted);
14085   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14086   // Packet should not decrypt and key update count should not change.
14087   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
14088   EXPECT_EQ(1u, visitor_.key_update_count());
14089   EXPECT_EQ(2, visitor_.derive_next_key_count_);
14090   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14091 }
14092 
TEST_P(QuicFramerTest,KeyUpdateOnFirstReceivedPacket)14093 TEST_P(QuicFramerTest, KeyUpdateOnFirstReceivedPacket) {
14094   if (!framer_.version().UsesTls()) {
14095     // Key update is only used in QUIC+TLS.
14096     return;
14097   }
14098   ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14099   // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14100   // instead of TestDecrypter.
14101   framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14102                            std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14103   framer_.SetKeyUpdateSupportForConnection(true);
14104 
14105   QuicPacketHeader header;
14106   header.destination_connection_id = FramerTestConnectionId();
14107   header.reset_flag = false;
14108   header.version_flag = false;
14109   header.packet_number = QuicPacketNumber(123);
14110 
14111   QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
14112 
14113   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14114   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
14115   ASSERT_TRUE(data != nullptr);
14116   std::unique_ptr<QuicEncryptedPacket> encrypted(
14117       EncryptPacketWithTagAndPhase(*data, /*tag=*/1, /*phase=*/true));
14118   ASSERT_TRUE(encrypted);
14119 
14120   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14121   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14122   // Processed valid packet with phase=1, key=1: do key update.
14123   EXPECT_EQ(1u, visitor_.key_update_count());
14124   EXPECT_EQ(1, visitor_.derive_next_key_count_);
14125   EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14126 }
14127 
TEST_P(QuicFramerTest,ErrorWhenUnexpectedFrameTypeEncountered)14128 TEST_P(QuicFramerTest, ErrorWhenUnexpectedFrameTypeEncountered) {
14129   if (!VersionHasIetfQuicFrames(framer_.transport_version()) ||
14130       !QuicVersionHasLongHeaderLengths(framer_.transport_version()) ||
14131       !framer_.version().HasLongHeaderLengths()) {
14132     return;
14133   }
14134   SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
14135   // clang-format off
14136   unsigned char packet[] = {
14137     // public flags (long header with packet type ZERO_RTT_PROTECTED and
14138     // 4-byte packet number)
14139     0xD3,
14140     // version
14141     QUIC_VERSION_BYTES,
14142     // destination connection ID length
14143     0x08,
14144     // destination connection ID
14145     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
14146     // source connection ID length
14147     0x08,
14148     // source connection ID
14149     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
14150     // long header packet length
14151     0x05,
14152     // packet number
14153     0x12, 0x34, 0x56, 0x00,
14154     // unexpected ietf ack frame type in 0-RTT packet
14155     0x02,
14156   };
14157   // clang-format on
14158 
14159   ReviseFirstByteByVersion(packet);
14160   QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
14161 
14162   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
14163 
14164   EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
14165   EXPECT_EQ(
14166       "IETF frame type IETF_ACK is unexpected at encryption level "
14167       "ENCRYPTION_ZERO_RTT",
14168       framer_.detailed_error());
14169 }
14170 
TEST_P(QuicFramerTest,ShortHeaderWithNonDefaultConnectionIdLength)14171 TEST_P(QuicFramerTest, ShortHeaderWithNonDefaultConnectionIdLength) {
14172   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
14173   // clang-format off
14174   unsigned char packet[kMaxIncomingPacketSize + 1] = {
14175      // type (short header, 4 byte packet number)
14176     0x43,
14177     // connection_id
14178     0x28, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x48,
14179     // packet number
14180     0x12, 0x34, 0x56, 0x78,
14181 
14182     // frame type (padding frame)
14183     0x00,
14184     0x00, 0x00, 0x00, 0x00
14185   };
14186   MockConnectionIdGenerator generator;
14187     EXPECT_CALL(generator, ConnectionIdLength(0x28)).WillOnce(Return(9));
14188   unsigned char* p = packet;
14189   size_t p_size = ABSL_ARRAYSIZE(packet);
14190 
14191   const size_t header_size = GetPacketHeaderSize(
14192       framer_.transport_version(), kPacket8ByteConnectionId + 1,
14193       kPacket0ByteConnectionId, !kIncludeVersion,
14194       !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
14195       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
14196       quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0) + 1;
14197   // Add one because it's a 9 byte connection ID.
14198 
14199   memset(p + header_size, 0, kMaxIncomingPacketSize - header_size);
14200 
14201   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
14202   PacketHeaderFormat format;
14203   QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
14204   bool version_flag;
14205   QuicConnectionId destination_connection_id, source_connection_id;
14206   QuicVersionLabel version_label;
14207   std::string detailed_error;
14208   bool use_length_prefix;
14209   std::optional<absl::string_view> retry_token;
14210   ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
14211   EXPECT_EQ(QUIC_NO_ERROR,
14212       QuicFramer::ParsePublicHeaderDispatcherShortHeaderLengthUnknown(
14213           encrypted, &format, &long_packet_type, &version_flag,
14214           &use_length_prefix, &version_label, &parsed_version,
14215           &destination_connection_id, &source_connection_id, &retry_token,
14216           &detailed_error, generator));
14217   EXPECT_EQ(format, IETF_QUIC_SHORT_HEADER_PACKET);
14218   EXPECT_EQ(destination_connection_id.length(), 9);
14219   EXPECT_EQ(long_packet_type, INVALID_PACKET_TYPE);
14220   EXPECT_FALSE(version_flag);
14221   EXPECT_FALSE(use_length_prefix);
14222   EXPECT_EQ(version_label, 0);
14223   EXPECT_EQ(parsed_version, UnsupportedQuicVersion());
14224   EXPECT_EQ(source_connection_id.length(), 0);
14225   EXPECT_FALSE(retry_token.has_value());
14226   EXPECT_EQ(detailed_error, "");
14227 }
14228 
TEST_P(QuicFramerTest,ReportEcnCountsIfPresent)14229 TEST_P(QuicFramerTest, ReportEcnCountsIfPresent) {
14230   if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
14231     return;
14232   }
14233   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
14234 
14235   QuicPacketHeader header;
14236   header.destination_connection_id = FramerTestConnectionId();
14237   header.reset_flag = false;
14238   header.version_flag = false;
14239   header.packet_number = kPacketNumber;
14240 
14241   for (bool ecn_marks : { false, true }) {
14242     // Add some padding, because TestEncrypter doesn't add an authentication
14243     // tag. For a small packet, this will cause QuicFramer to fail to get a
14244     // header protection sample.
14245     QuicPaddingFrame padding_frame(kTagSize);
14246     // Create a packet with just an ack.
14247     QuicAckFrame ack_frame = InitAckFrame(5);
14248     if (ecn_marks) {
14249       ack_frame.ecn_counters = QuicEcnCounts(100, 10000, 1000000);
14250     } else {
14251       ack_frame.ecn_counters = std::nullopt;
14252     }
14253     QuicFrames frames = {QuicFrame(padding_frame), QuicFrame(&ack_frame)};
14254     // Build an ACK packet.
14255     QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14256     std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
14257     ASSERT_TRUE(raw_ack_packet != nullptr);
14258     char buffer[kMaxOutgoingPacketSize];
14259     size_t encrypted_length =
14260         framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
14261                                *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
14262     ASSERT_NE(0u, encrypted_length);
14263     // Now make sure we can turn our ack packet back into an ack frame.
14264     QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14265     MockFramerVisitor visitor;
14266     framer_.set_visitor(&visitor);
14267     EXPECT_CALL(visitor, OnPacket()).Times(1);
14268     EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
14269         .Times(1)
14270         .WillOnce(Return(true));
14271     EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
14272         .Times(1)
14273         .WillOnce(Return(true));
14274     EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1);
14275     EXPECT_CALL(visitor, OnDecryptedPacket(_, _)).Times(1);
14276     EXPECT_CALL(visitor, OnAckFrameStart(_, _)).Times(1).WillOnce(Return(true));
14277     EXPECT_CALL(visitor, OnAckRange(_, _)).Times(1).WillOnce(Return(true));
14278     EXPECT_CALL(visitor, OnAckFrameEnd(_, ack_frame.ecn_counters))
14279         .Times(1).WillOnce(Return(true));
14280     EXPECT_CALL(visitor, OnPacketComplete()).Times(1);
14281     ASSERT_TRUE(framer_.ProcessPacket(
14282                     QuicEncryptedPacket(buffer, encrypted_length, false)));
14283   }
14284 }
14285 
14286 }  // namespace
14287 }  // namespace test
14288 }  // namespace quic
14289