1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "quiche/quic/core/quic_framer.h"
6
7 #include <algorithm>
8 #include <cstdint>
9 #include <cstring>
10 #include <map>
11 #include <memory>
12 #include <string>
13 #include <utility>
14 #include <vector>
15
16 #include "absl/base/macros.h"
17 #include "absl/memory/memory.h"
18 #include "absl/strings/escaping.h"
19 #include "absl/strings/match.h"
20 #include "absl/strings/string_view.h"
21 #include "quiche/quic/core/crypto/null_decrypter.h"
22 #include "quiche/quic/core/crypto/null_encrypter.h"
23 #include "quiche/quic/core/crypto/quic_decrypter.h"
24 #include "quiche/quic/core/crypto/quic_encrypter.h"
25 #include "quiche/quic/core/frames/quic_reset_stream_at_frame.h"
26 #include "quiche/quic/core/quic_connection_id.h"
27 #include "quiche/quic/core/quic_error_codes.h"
28 #include "quiche/quic/core/quic_packets.h"
29 #include "quiche/quic/core/quic_types.h"
30 #include "quiche/quic/core/quic_utils.h"
31 #include "quiche/quic/core/quic_versions.h"
32 #include "quiche/quic/platform/api/quic_expect_bug.h"
33 #include "quiche/quic/platform/api/quic_flags.h"
34 #include "quiche/quic/platform/api/quic_ip_address.h"
35 #include "quiche/quic/platform/api/quic_ip_address_family.h"
36 #include "quiche/quic/platform/api/quic_logging.h"
37 #include "quiche/quic/platform/api/quic_test.h"
38 #include "quiche/quic/test_tools/quic_framer_peer.h"
39 #include "quiche/quic/test_tools/quic_test_utils.h"
40 #include "quiche/quic/test_tools/simple_data_producer.h"
41 #include "quiche/common/test_tools/quiche_test_utils.h"
42
43 using testing::_;
44 using testing::ContainerEq;
45 using testing::Return;
46
47 namespace quic {
48 namespace test {
49 namespace {
50
51 const uint64_t kEpoch = UINT64_C(1) << 32;
52 const uint64_t kMask = kEpoch - 1;
53 const uint8_t kPacket0ByteConnectionId = 0;
54 const uint8_t kPacket8ByteConnectionId = 8;
55 constexpr size_t kTagSize = 16;
56
57 const StatelessResetToken kTestStatelessResetToken{
58 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
59 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f};
60
61 // Use fields in which each byte is distinct to ensure that every byte is
62 // framed correctly. The values are otherwise arbitrary.
FramerTestConnectionId()63 QuicConnectionId FramerTestConnectionId() {
64 return TestConnectionId(UINT64_C(0xFEDCBA9876543210));
65 }
66
FramerTestConnectionIdPlusOne()67 QuicConnectionId FramerTestConnectionIdPlusOne() {
68 return TestConnectionId(UINT64_C(0xFEDCBA9876543211));
69 }
70
FramerTestConnectionIdNineBytes()71 QuicConnectionId FramerTestConnectionIdNineBytes() {
72 uint8_t connection_id_bytes[9] = {0xFE, 0xDC, 0xBA, 0x98, 0x76,
73 0x54, 0x32, 0x10, 0x42};
74 return QuicConnectionId(reinterpret_cast<char*>(connection_id_bytes),
75 sizeof(connection_id_bytes));
76 }
77
78 const QuicPacketNumber kPacketNumber = QuicPacketNumber(UINT64_C(0x12345678));
79 const QuicPacketNumber kSmallLargestObserved =
80 QuicPacketNumber(UINT16_C(0x1234));
81 const QuicPacketNumber kSmallMissingPacket = QuicPacketNumber(UINT16_C(0x1233));
82 const QuicPacketNumber kLeastUnacked = QuicPacketNumber(UINT64_C(0x012345670));
83 const QuicStreamId kStreamId = UINT64_C(0x01020304);
84 // Note that the high 4 bits of the stream offset must be less than 0x40
85 // in order to ensure that the value can be encoded using VarInt62 encoding.
86 const QuicStreamOffset kStreamOffset = UINT64_C(0x3A98FEDC32107654);
87 const QuicPublicResetNonceProof kNonceProof = UINT64_C(0xABCDEF0123456789);
88
89 // In testing that we can ack the full range of packets...
90 // This is the largest packet number that can be represented in IETF QUIC
91 // varint62 format.
92 const QuicPacketNumber kLargestIetfLargestObserved =
93 QuicPacketNumber(UINT64_C(0x3fffffffffffffff));
94 // Encodings for the two bits in a VarInt62 that
95 // describe the length of the VarInt61. For binary packet
96 // formats in this file, the convention is to code the
97 // first byte as
98 // kVarInt62FourBytes + 0x<value_in_that_byte>
99 const uint8_t kVarInt62OneByte = 0x00;
100 const uint8_t kVarInt62TwoBytes = 0x40;
101 const uint8_t kVarInt62FourBytes = 0x80;
102 const uint8_t kVarInt62EightBytes = 0xc0;
103
104 class TestEncrypter : public QuicEncrypter {
105 public:
~TestEncrypter()106 ~TestEncrypter() override {}
SetKey(absl::string_view)107 bool SetKey(absl::string_view /*key*/) override { return true; }
SetNoncePrefix(absl::string_view)108 bool SetNoncePrefix(absl::string_view /*nonce_prefix*/) override {
109 return true;
110 }
SetIV(absl::string_view)111 bool SetIV(absl::string_view /*iv*/) override { return true; }
SetHeaderProtectionKey(absl::string_view)112 bool SetHeaderProtectionKey(absl::string_view /*key*/) override {
113 return true;
114 }
EncryptPacket(uint64_t packet_number,absl::string_view associated_data,absl::string_view plaintext,char * output,size_t * output_length,size_t)115 bool EncryptPacket(uint64_t packet_number, absl::string_view associated_data,
116 absl::string_view plaintext, char* output,
117 size_t* output_length,
118 size_t /*max_output_length*/) override {
119 packet_number_ = QuicPacketNumber(packet_number);
120 associated_data_ = std::string(associated_data);
121 plaintext_ = std::string(plaintext);
122 memcpy(output, plaintext.data(), plaintext.length());
123 *output_length = plaintext.length();
124 return true;
125 }
GenerateHeaderProtectionMask(absl::string_view)126 std::string GenerateHeaderProtectionMask(
127 absl::string_view /*sample*/) override {
128 return std::string(5, 0);
129 }
GetKeySize() const130 size_t GetKeySize() const override { return 0; }
GetNoncePrefixSize() const131 size_t GetNoncePrefixSize() const override { return 0; }
GetIVSize() const132 size_t GetIVSize() const override { return 0; }
GetMaxPlaintextSize(size_t ciphertext_size) const133 size_t GetMaxPlaintextSize(size_t ciphertext_size) const override {
134 return ciphertext_size;
135 }
GetCiphertextSize(size_t plaintext_size) const136 size_t GetCiphertextSize(size_t plaintext_size) const override {
137 return plaintext_size;
138 }
GetConfidentialityLimit() const139 QuicPacketCount GetConfidentialityLimit() const override {
140 return std::numeric_limits<QuicPacketCount>::max();
141 }
GetKey() const142 absl::string_view GetKey() const override { return absl::string_view(); }
GetNoncePrefix() const143 absl::string_view GetNoncePrefix() const override {
144 return absl::string_view();
145 }
146
147 QuicPacketNumber packet_number_;
148 std::string associated_data_;
149 std::string plaintext_;
150 };
151
152 class TestDecrypter : public QuicDecrypter {
153 public:
~TestDecrypter()154 ~TestDecrypter() override {}
SetKey(absl::string_view)155 bool SetKey(absl::string_view /*key*/) override { return true; }
SetNoncePrefix(absl::string_view)156 bool SetNoncePrefix(absl::string_view /*nonce_prefix*/) override {
157 return true;
158 }
SetIV(absl::string_view)159 bool SetIV(absl::string_view /*iv*/) override { return true; }
SetHeaderProtectionKey(absl::string_view)160 bool SetHeaderProtectionKey(absl::string_view /*key*/) override {
161 return true;
162 }
SetPreliminaryKey(absl::string_view)163 bool SetPreliminaryKey(absl::string_view /*key*/) override {
164 QUIC_BUG(quic_bug_10486_1) << "should not be called";
165 return false;
166 }
SetDiversificationNonce(const DiversificationNonce &)167 bool SetDiversificationNonce(const DiversificationNonce& /*key*/) override {
168 return true;
169 }
DecryptPacket(uint64_t packet_number,absl::string_view associated_data,absl::string_view ciphertext,char * output,size_t * output_length,size_t)170 bool DecryptPacket(uint64_t packet_number, absl::string_view associated_data,
171 absl::string_view ciphertext, char* output,
172 size_t* output_length,
173 size_t /*max_output_length*/) override {
174 packet_number_ = QuicPacketNumber(packet_number);
175 associated_data_ = std::string(associated_data);
176 ciphertext_ = std::string(ciphertext);
177 memcpy(output, ciphertext.data(), ciphertext.length());
178 *output_length = ciphertext.length();
179 return true;
180 }
GenerateHeaderProtectionMask(QuicDataReader *)181 std::string GenerateHeaderProtectionMask(
182 QuicDataReader* /*sample_reader*/) override {
183 return std::string(5, 0);
184 }
GetKeySize() const185 size_t GetKeySize() const override { return 0; }
GetNoncePrefixSize() const186 size_t GetNoncePrefixSize() const override { return 0; }
GetIVSize() const187 size_t GetIVSize() const override { return 0; }
GetKey() const188 absl::string_view GetKey() const override { return absl::string_view(); }
GetNoncePrefix() const189 absl::string_view GetNoncePrefix() const override {
190 return absl::string_view();
191 }
192 // Use a distinct value starting with 0xFFFFFF, which is never used by TLS.
cipher_id() const193 uint32_t cipher_id() const override { return 0xFFFFFFF2; }
GetIntegrityLimit() const194 QuicPacketCount GetIntegrityLimit() const override {
195 return std::numeric_limits<QuicPacketCount>::max();
196 }
197 QuicPacketNumber packet_number_;
198 std::string associated_data_;
199 std::string ciphertext_;
200 };
201
EncryptPacketWithTagAndPhase(const QuicPacket & packet,uint8_t tag,bool phase)202 std::unique_ptr<QuicEncryptedPacket> EncryptPacketWithTagAndPhase(
203 const QuicPacket& packet, uint8_t tag, bool phase) {
204 std::string packet_data = std::string(packet.AsStringPiece());
205 if (phase) {
206 packet_data[0] |= FLAGS_KEY_PHASE_BIT;
207 } else {
208 packet_data[0] &= ~FLAGS_KEY_PHASE_BIT;
209 }
210
211 TaggingEncrypter crypter(tag);
212 const size_t packet_size = crypter.GetCiphertextSize(packet_data.size());
213 char* buffer = new char[packet_size];
214 size_t buf_len = 0;
215 if (!crypter.EncryptPacket(0, absl::string_view(), packet_data, buffer,
216 &buf_len, packet_size)) {
217 delete[] buffer;
218 return nullptr;
219 }
220
221 return std::make_unique<QuicEncryptedPacket>(buffer, buf_len,
222 /*owns_buffer=*/true);
223 }
224
225 class TestQuicVisitor : public QuicFramerVisitorInterface {
226 public:
TestQuicVisitor()227 TestQuicVisitor()
228 : error_count_(0),
229 version_mismatch_(0),
230 packet_count_(0),
231 frame_count_(0),
232 complete_packets_(0),
233 derive_next_key_count_(0),
234 decrypted_first_packet_in_key_phase_count_(0),
235 accept_packet_(true),
236 accept_public_header_(true) {}
237
~TestQuicVisitor()238 ~TestQuicVisitor() override {}
239
OnError(QuicFramer * f)240 void OnError(QuicFramer* f) override {
241 QUIC_DLOG(INFO) << "QuicFramer Error: " << QuicErrorCodeToString(f->error())
242 << " (" << f->error() << ")";
243 ++error_count_;
244 }
245
OnPacket()246 void OnPacket() override {}
247
OnVersionNegotiationPacket(const QuicVersionNegotiationPacket & packet)248 void OnVersionNegotiationPacket(
249 const QuicVersionNegotiationPacket& packet) override {
250 version_negotiation_packet_ =
251 std::make_unique<QuicVersionNegotiationPacket>((packet));
252 EXPECT_EQ(0u, framer_->current_received_frame_type());
253 }
254
OnRetryPacket(QuicConnectionId original_connection_id,QuicConnectionId new_connection_id,absl::string_view retry_token,absl::string_view retry_integrity_tag,absl::string_view retry_without_tag)255 void OnRetryPacket(QuicConnectionId original_connection_id,
256 QuicConnectionId new_connection_id,
257 absl::string_view retry_token,
258 absl::string_view retry_integrity_tag,
259 absl::string_view retry_without_tag) override {
260 on_retry_packet_called_ = true;
261 retry_original_connection_id_ =
262 std::make_unique<QuicConnectionId>(original_connection_id);
263 retry_new_connection_id_ =
264 std::make_unique<QuicConnectionId>(new_connection_id);
265 retry_token_ = std::make_unique<std::string>(std::string(retry_token));
266 retry_token_integrity_tag_ =
267 std::make_unique<std::string>(std::string(retry_integrity_tag));
268 retry_without_tag_ =
269 std::make_unique<std::string>(std::string(retry_without_tag));
270 EXPECT_EQ(0u, framer_->current_received_frame_type());
271 }
272
OnProtocolVersionMismatch(ParsedQuicVersion received_version)273 bool OnProtocolVersionMismatch(ParsedQuicVersion received_version) override {
274 QUIC_DLOG(INFO) << "QuicFramer Version Mismatch, version: "
275 << received_version;
276 ++version_mismatch_;
277 EXPECT_EQ(0u, framer_->current_received_frame_type());
278 return false;
279 }
280
OnUnauthenticatedPublicHeader(const QuicPacketHeader & header)281 bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override {
282 header_ = std::make_unique<QuicPacketHeader>((header));
283 EXPECT_EQ(0u, framer_->current_received_frame_type());
284 return accept_public_header_;
285 }
286
OnUnauthenticatedHeader(const QuicPacketHeader &)287 bool OnUnauthenticatedHeader(const QuicPacketHeader& /*header*/) override {
288 EXPECT_EQ(0u, framer_->current_received_frame_type());
289 return true;
290 }
291
OnDecryptedPacket(size_t,EncryptionLevel)292 void OnDecryptedPacket(size_t /*length*/,
293 EncryptionLevel /*level*/) override {
294 EXPECT_EQ(0u, framer_->current_received_frame_type());
295 }
296
OnPacketHeader(const QuicPacketHeader & header)297 bool OnPacketHeader(const QuicPacketHeader& header) override {
298 ++packet_count_;
299 header_ = std::make_unique<QuicPacketHeader>((header));
300 EXPECT_EQ(0u, framer_->current_received_frame_type());
301 return accept_packet_;
302 }
303
OnCoalescedPacket(const QuicEncryptedPacket & packet)304 void OnCoalescedPacket(const QuicEncryptedPacket& packet) override {
305 coalesced_packets_.push_back(packet.Clone());
306 }
307
OnUndecryptablePacket(const QuicEncryptedPacket & packet,EncryptionLevel decryption_level,bool has_decryption_key)308 void OnUndecryptablePacket(const QuicEncryptedPacket& packet,
309 EncryptionLevel decryption_level,
310 bool has_decryption_key) override {
311 undecryptable_packets_.push_back(packet.Clone());
312 undecryptable_decryption_levels_.push_back(decryption_level);
313 undecryptable_has_decryption_keys_.push_back(has_decryption_key);
314 }
315
OnStreamFrame(const QuicStreamFrame & frame)316 bool OnStreamFrame(const QuicStreamFrame& frame) override {
317 ++frame_count_;
318 // Save a copy of the data so it is valid after the packet is processed.
319 std::string* string_data =
320 new std::string(frame.data_buffer, frame.data_length);
321 stream_data_.push_back(absl::WrapUnique(string_data));
322 stream_frames_.push_back(std::make_unique<QuicStreamFrame>(
323 frame.stream_id, frame.fin, frame.offset, *string_data));
324 if (VersionHasIetfQuicFrames(transport_version_)) {
325 // Low order bits of type encode flags, ignore them for this test.
326 EXPECT_TRUE(IS_IETF_STREAM_FRAME(framer_->current_received_frame_type()));
327 } else {
328 EXPECT_EQ(0u, framer_->current_received_frame_type());
329 }
330 return true;
331 }
332
OnCryptoFrame(const QuicCryptoFrame & frame)333 bool OnCryptoFrame(const QuicCryptoFrame& frame) override {
334 ++frame_count_;
335 // Save a copy of the data so it is valid after the packet is processed.
336 std::string* string_data =
337 new std::string(frame.data_buffer, frame.data_length);
338 crypto_data_.push_back(absl::WrapUnique(string_data));
339 crypto_frames_.push_back(std::make_unique<QuicCryptoFrame>(
340 frame.level, frame.offset, *string_data));
341 if (VersionHasIetfQuicFrames(transport_version_)) {
342 EXPECT_EQ(IETF_CRYPTO, framer_->current_received_frame_type());
343 } else {
344 EXPECT_EQ(0u, framer_->current_received_frame_type());
345 }
346 return true;
347 }
348
OnAckFrameStart(QuicPacketNumber largest_acked,QuicTime::Delta ack_delay_time)349 bool OnAckFrameStart(QuicPacketNumber largest_acked,
350 QuicTime::Delta ack_delay_time) override {
351 ++frame_count_;
352 QuicAckFrame ack_frame;
353 ack_frame.largest_acked = largest_acked;
354 ack_frame.ack_delay_time = ack_delay_time;
355 ack_frames_.push_back(std::make_unique<QuicAckFrame>(ack_frame));
356 if (VersionHasIetfQuicFrames(transport_version_)) {
357 EXPECT_TRUE(IETF_ACK == framer_->current_received_frame_type() ||
358 IETF_ACK_ECN == framer_->current_received_frame_type() ||
359 IETF_ACK_RECEIVE_TIMESTAMPS ==
360 framer_->current_received_frame_type());
361 } else {
362 EXPECT_EQ(0u, framer_->current_received_frame_type());
363 }
364 return true;
365 }
366
OnAckRange(QuicPacketNumber start,QuicPacketNumber end)367 bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) override {
368 QUICHE_DCHECK(!ack_frames_.empty());
369 ack_frames_[ack_frames_.size() - 1]->packets.AddRange(start, end);
370 if (VersionHasIetfQuicFrames(transport_version_)) {
371 EXPECT_TRUE(IETF_ACK == framer_->current_received_frame_type() ||
372 IETF_ACK_ECN == framer_->current_received_frame_type() ||
373 IETF_ACK_RECEIVE_TIMESTAMPS ==
374 framer_->current_received_frame_type());
375 } else {
376 EXPECT_EQ(0u, framer_->current_received_frame_type());
377 }
378 return true;
379 }
380
OnAckTimestamp(QuicPacketNumber packet_number,QuicTime timestamp)381 bool OnAckTimestamp(QuicPacketNumber packet_number,
382 QuicTime timestamp) override {
383 ack_frames_[ack_frames_.size() - 1]->received_packet_times.push_back(
384 std::make_pair(packet_number, timestamp));
385 if (VersionHasIetfQuicFrames(transport_version_)) {
386 EXPECT_TRUE(IETF_ACK == framer_->current_received_frame_type() ||
387 IETF_ACK_ECN == framer_->current_received_frame_type() ||
388 IETF_ACK_RECEIVE_TIMESTAMPS ==
389 framer_->current_received_frame_type());
390 } else {
391 EXPECT_EQ(0u, framer_->current_received_frame_type());
392 }
393 return true;
394 }
395
OnAckFrameEnd(QuicPacketNumber,const std::optional<QuicEcnCounts> &)396 bool OnAckFrameEnd(
397 QuicPacketNumber /*start*/,
398 const std::optional<QuicEcnCounts>& /*ecn_counts*/) override {
399 return true;
400 }
401
OnStopWaitingFrame(const QuicStopWaitingFrame & frame)402 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override {
403 ++frame_count_;
404 stop_waiting_frames_.push_back(
405 std::make_unique<QuicStopWaitingFrame>(frame));
406 EXPECT_EQ(0u, framer_->current_received_frame_type());
407 return true;
408 }
409
OnPaddingFrame(const QuicPaddingFrame & frame)410 bool OnPaddingFrame(const QuicPaddingFrame& frame) override {
411 padding_frames_.push_back(std::make_unique<QuicPaddingFrame>(frame));
412 if (VersionHasIetfQuicFrames(transport_version_)) {
413 EXPECT_EQ(IETF_PADDING, framer_->current_received_frame_type());
414 } else {
415 EXPECT_EQ(0u, framer_->current_received_frame_type());
416 }
417 return true;
418 }
419
OnPingFrame(const QuicPingFrame & frame)420 bool OnPingFrame(const QuicPingFrame& frame) override {
421 ++frame_count_;
422 ping_frames_.push_back(std::make_unique<QuicPingFrame>(frame));
423 if (VersionHasIetfQuicFrames(transport_version_)) {
424 EXPECT_EQ(IETF_PING, framer_->current_received_frame_type());
425 } else {
426 EXPECT_EQ(0u, framer_->current_received_frame_type());
427 }
428 return true;
429 }
430
OnMessageFrame(const QuicMessageFrame & frame)431 bool OnMessageFrame(const QuicMessageFrame& frame) override {
432 ++frame_count_;
433 message_frames_.push_back(
434 std::make_unique<QuicMessageFrame>(frame.data, frame.message_length));
435 if (VersionHasIetfQuicFrames(transport_version_)) {
436 EXPECT_TRUE(IETF_EXTENSION_MESSAGE_NO_LENGTH_V99 ==
437 framer_->current_received_frame_type() ||
438 IETF_EXTENSION_MESSAGE_V99 ==
439 framer_->current_received_frame_type());
440 } else {
441 EXPECT_EQ(0u, framer_->current_received_frame_type());
442 }
443 return true;
444 }
445
OnHandshakeDoneFrame(const QuicHandshakeDoneFrame & frame)446 bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) override {
447 ++frame_count_;
448 handshake_done_frames_.push_back(
449 std::make_unique<QuicHandshakeDoneFrame>(frame));
450 QUICHE_DCHECK(VersionHasIetfQuicFrames(transport_version_));
451 EXPECT_EQ(IETF_HANDSHAKE_DONE, framer_->current_received_frame_type());
452 return true;
453 }
454
OnAckFrequencyFrame(const QuicAckFrequencyFrame & frame)455 bool OnAckFrequencyFrame(const QuicAckFrequencyFrame& frame) override {
456 ++frame_count_;
457 ack_frequency_frames_.emplace_back(
458 std::make_unique<QuicAckFrequencyFrame>(frame));
459 QUICHE_DCHECK(VersionHasIetfQuicFrames(transport_version_));
460 EXPECT_EQ(IETF_ACK_FREQUENCY, framer_->current_received_frame_type());
461 return true;
462 }
463
OnResetStreamAtFrame(const QuicResetStreamAtFrame & frame)464 bool OnResetStreamAtFrame(const QuicResetStreamAtFrame& frame) override {
465 ++frame_count_;
466 reset_stream_at_frames_.push_back(
467 std::make_unique<QuicResetStreamAtFrame>(frame));
468 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
469 EXPECT_EQ(IETF_RESET_STREAM_AT, framer_->current_received_frame_type());
470 return true;
471 }
472
OnPacketComplete()473 void OnPacketComplete() override { ++complete_packets_; }
474
OnRstStreamFrame(const QuicRstStreamFrame & frame)475 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override {
476 rst_stream_frame_ = frame;
477 if (VersionHasIetfQuicFrames(transport_version_)) {
478 EXPECT_EQ(IETF_RST_STREAM, framer_->current_received_frame_type());
479 } else {
480 EXPECT_EQ(0u, framer_->current_received_frame_type());
481 }
482 return true;
483 }
484
OnConnectionCloseFrame(const QuicConnectionCloseFrame & frame)485 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override {
486 connection_close_frame_ = frame;
487 if (VersionHasIetfQuicFrames(transport_version_)) {
488 EXPECT_NE(GOOGLE_QUIC_CONNECTION_CLOSE, frame.close_type);
489 if (frame.close_type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
490 EXPECT_EQ(IETF_CONNECTION_CLOSE,
491 framer_->current_received_frame_type());
492 } else {
493 EXPECT_EQ(IETF_APPLICATION_CLOSE,
494 framer_->current_received_frame_type());
495 }
496 } else {
497 EXPECT_EQ(0u, framer_->current_received_frame_type());
498 }
499 return true;
500 }
501
OnStopSendingFrame(const QuicStopSendingFrame & frame)502 bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override {
503 stop_sending_frame_ = frame;
504 EXPECT_EQ(IETF_STOP_SENDING, framer_->current_received_frame_type());
505 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
506 return true;
507 }
508
OnPathChallengeFrame(const QuicPathChallengeFrame & frame)509 bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override {
510 path_challenge_frame_ = frame;
511 EXPECT_EQ(IETF_PATH_CHALLENGE, framer_->current_received_frame_type());
512 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
513 return true;
514 }
515
OnPathResponseFrame(const QuicPathResponseFrame & frame)516 bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override {
517 path_response_frame_ = frame;
518 EXPECT_EQ(IETF_PATH_RESPONSE, framer_->current_received_frame_type());
519 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
520 return true;
521 }
522
OnGoAwayFrame(const QuicGoAwayFrame & frame)523 bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override {
524 goaway_frame_ = frame;
525 EXPECT_FALSE(VersionHasIetfQuicFrames(transport_version_));
526 EXPECT_EQ(0u, framer_->current_received_frame_type());
527 return true;
528 }
529
OnMaxStreamsFrame(const QuicMaxStreamsFrame & frame)530 bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& frame) override {
531 max_streams_frame_ = frame;
532 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
533 EXPECT_TRUE(IETF_MAX_STREAMS_UNIDIRECTIONAL ==
534 framer_->current_received_frame_type() ||
535 IETF_MAX_STREAMS_BIDIRECTIONAL ==
536 framer_->current_received_frame_type());
537 return true;
538 }
539
OnStreamsBlockedFrame(const QuicStreamsBlockedFrame & frame)540 bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame) override {
541 streams_blocked_frame_ = frame;
542 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
543 EXPECT_TRUE(IETF_STREAMS_BLOCKED_UNIDIRECTIONAL ==
544 framer_->current_received_frame_type() ||
545 IETF_STREAMS_BLOCKED_BIDIRECTIONAL ==
546 framer_->current_received_frame_type());
547 return true;
548 }
549
OnWindowUpdateFrame(const QuicWindowUpdateFrame & frame)550 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override {
551 window_update_frame_ = frame;
552 if (VersionHasIetfQuicFrames(transport_version_)) {
553 EXPECT_TRUE(IETF_MAX_DATA == framer_->current_received_frame_type() ||
554 IETF_MAX_STREAM_DATA ==
555 framer_->current_received_frame_type());
556 } else {
557 EXPECT_EQ(0u, framer_->current_received_frame_type());
558 }
559 return true;
560 }
561
OnBlockedFrame(const QuicBlockedFrame & frame)562 bool OnBlockedFrame(const QuicBlockedFrame& frame) override {
563 blocked_frame_ = frame;
564 if (VersionHasIetfQuicFrames(transport_version_)) {
565 EXPECT_TRUE(IETF_DATA_BLOCKED == framer_->current_received_frame_type() ||
566 IETF_STREAM_DATA_BLOCKED ==
567 framer_->current_received_frame_type());
568 } else {
569 EXPECT_EQ(0u, framer_->current_received_frame_type());
570 }
571 return true;
572 }
573
OnNewConnectionIdFrame(const QuicNewConnectionIdFrame & frame)574 bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override {
575 new_connection_id_ = frame;
576 EXPECT_EQ(IETF_NEW_CONNECTION_ID, framer_->current_received_frame_type());
577 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
578 return true;
579 }
580
OnRetireConnectionIdFrame(const QuicRetireConnectionIdFrame & frame)581 bool OnRetireConnectionIdFrame(
582 const QuicRetireConnectionIdFrame& frame) override {
583 EXPECT_EQ(IETF_RETIRE_CONNECTION_ID,
584 framer_->current_received_frame_type());
585 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
586 retire_connection_id_ = frame;
587 return true;
588 }
589
OnNewTokenFrame(const QuicNewTokenFrame & frame)590 bool OnNewTokenFrame(const QuicNewTokenFrame& frame) override {
591 new_token_ = frame;
592 EXPECT_EQ(IETF_NEW_TOKEN, framer_->current_received_frame_type());
593 EXPECT_TRUE(VersionHasIetfQuicFrames(transport_version_));
594 return true;
595 }
596
IsValidStatelessResetToken(const StatelessResetToken & token) const597 bool IsValidStatelessResetToken(
598 const StatelessResetToken& token) const override {
599 EXPECT_EQ(0u, framer_->current_received_frame_type());
600 return token == kTestStatelessResetToken;
601 }
602
OnAuthenticatedIetfStatelessResetPacket(const QuicIetfStatelessResetPacket & packet)603 void OnAuthenticatedIetfStatelessResetPacket(
604 const QuicIetfStatelessResetPacket& packet) override {
605 stateless_reset_packet_ =
606 std::make_unique<QuicIetfStatelessResetPacket>(packet);
607 EXPECT_EQ(0u, framer_->current_received_frame_type());
608 }
609
OnKeyUpdate(KeyUpdateReason reason)610 void OnKeyUpdate(KeyUpdateReason reason) override {
611 key_update_reasons_.push_back(reason);
612 }
613
OnDecryptedFirstPacketInKeyPhase()614 void OnDecryptedFirstPacketInKeyPhase() override {
615 decrypted_first_packet_in_key_phase_count_++;
616 }
617
AdvanceKeysAndCreateCurrentOneRttDecrypter()618 std::unique_ptr<QuicDecrypter> AdvanceKeysAndCreateCurrentOneRttDecrypter()
619 override {
620 derive_next_key_count_++;
621 return std::make_unique<StrictTaggingDecrypter>(derive_next_key_count_);
622 }
CreateCurrentOneRttEncrypter()623 std::unique_ptr<QuicEncrypter> CreateCurrentOneRttEncrypter() override {
624 return std::make_unique<TaggingEncrypter>(derive_next_key_count_);
625 }
626
set_framer(QuicFramer * framer)627 void set_framer(QuicFramer* framer) {
628 framer_ = framer;
629 transport_version_ = framer->transport_version();
630 }
631
key_update_count() const632 size_t key_update_count() const { return key_update_reasons_.size(); }
633
634 // Counters from the visitor_ callbacks.
635 int error_count_;
636 int version_mismatch_;
637 int packet_count_;
638 int frame_count_;
639 int complete_packets_;
640 std::vector<KeyUpdateReason> key_update_reasons_;
641 int derive_next_key_count_;
642 int decrypted_first_packet_in_key_phase_count_;
643 bool accept_packet_;
644 bool accept_public_header_;
645
646 std::unique_ptr<QuicPacketHeader> header_;
647 std::unique_ptr<QuicIetfStatelessResetPacket> stateless_reset_packet_;
648 std::unique_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_;
649 std::unique_ptr<QuicConnectionId> retry_original_connection_id_;
650 std::unique_ptr<QuicConnectionId> retry_new_connection_id_;
651 std::unique_ptr<std::string> retry_token_;
652 std::unique_ptr<std::string> retry_token_integrity_tag_;
653 std::unique_ptr<std::string> retry_without_tag_;
654 bool on_retry_packet_called_ = false;
655 std::vector<std::unique_ptr<QuicStreamFrame>> stream_frames_;
656 std::vector<std::unique_ptr<QuicCryptoFrame>> crypto_frames_;
657 std::vector<std::unique_ptr<QuicAckFrame>> ack_frames_;
658 std::vector<std::unique_ptr<QuicStopWaitingFrame>> stop_waiting_frames_;
659 std::vector<std::unique_ptr<QuicPaddingFrame>> padding_frames_;
660 std::vector<std::unique_ptr<QuicPingFrame>> ping_frames_;
661 std::vector<std::unique_ptr<QuicMessageFrame>> message_frames_;
662 std::vector<std::unique_ptr<QuicHandshakeDoneFrame>> handshake_done_frames_;
663 std::vector<std::unique_ptr<QuicAckFrequencyFrame>> ack_frequency_frames_;
664 std::vector<std::unique_ptr<QuicResetStreamAtFrame>> reset_stream_at_frames_;
665 std::vector<std::unique_ptr<QuicEncryptedPacket>> coalesced_packets_;
666 std::vector<std::unique_ptr<QuicEncryptedPacket>> undecryptable_packets_;
667 std::vector<EncryptionLevel> undecryptable_decryption_levels_;
668 std::vector<bool> undecryptable_has_decryption_keys_;
669 QuicRstStreamFrame rst_stream_frame_;
670 QuicConnectionCloseFrame connection_close_frame_;
671 QuicStopSendingFrame stop_sending_frame_;
672 QuicGoAwayFrame goaway_frame_;
673 QuicPathChallengeFrame path_challenge_frame_;
674 QuicPathResponseFrame path_response_frame_;
675 QuicWindowUpdateFrame window_update_frame_;
676 QuicBlockedFrame blocked_frame_;
677 QuicStreamsBlockedFrame streams_blocked_frame_;
678 QuicMaxStreamsFrame max_streams_frame_;
679 QuicNewConnectionIdFrame new_connection_id_;
680 QuicRetireConnectionIdFrame retire_connection_id_;
681 QuicNewTokenFrame new_token_;
682 std::vector<std::unique_ptr<std::string>> stream_data_;
683 std::vector<std::unique_ptr<std::string>> crypto_data_;
684 QuicTransportVersion transport_version_;
685 QuicFramer* framer_;
686 };
687
688 // Simple struct for defining a packet's content, and associated
689 // parse error.
690 struct PacketFragment {
691 std::string error_if_missing;
692 std::vector<unsigned char> fragment;
693 };
694
695 using PacketFragments = std::vector<struct PacketFragment>;
696
697 class QuicFramerTest : public QuicTestWithParam<ParsedQuicVersion> {
698 public:
QuicFramerTest()699 QuicFramerTest()
700 : encrypter_(new test::TestEncrypter()),
701 decrypter_(new test::TestDecrypter()),
702 version_(GetParam()),
703 start_(QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(0x10)),
704 framer_(AllSupportedVersions(), start_, Perspective::IS_SERVER,
705 kQuicDefaultConnectionIdLength) {
706 framer_.set_version(version_);
707 if (framer_.version().KnowsWhichDecrypterToUse()) {
708 framer_.InstallDecrypter(ENCRYPTION_INITIAL,
709 std::unique_ptr<QuicDecrypter>(decrypter_));
710 } else {
711 framer_.SetDecrypter(ENCRYPTION_INITIAL,
712 std::unique_ptr<QuicDecrypter>(decrypter_));
713 }
714 framer_.SetEncrypter(ENCRYPTION_INITIAL,
715 std::unique_ptr<QuicEncrypter>(encrypter_));
716
717 framer_.set_visitor(&visitor_);
718 visitor_.set_framer(&framer_);
719 }
720
SetDecrypterLevel(EncryptionLevel level)721 void SetDecrypterLevel(EncryptionLevel level) {
722 if (!framer_.version().KnowsWhichDecrypterToUse()) {
723 return;
724 }
725 decrypter_ = new TestDecrypter();
726 framer_.InstallDecrypter(level, std::unique_ptr<QuicDecrypter>(decrypter_));
727 }
728
729 // Helper function to get unsigned char representation of the handshake
730 // protocol byte at position |pos| of the current QUIC version number.
GetQuicVersionByte(int pos)731 unsigned char GetQuicVersionByte(int pos) {
732 return (CreateQuicVersionLabel(version_) >> 8 * (3 - pos)) & 0xff;
733 }
734
735 // Helper functions to take a v1 long header packet and make it v2. These are
736 // not needed for short header packets, but if sent, this function will exit
737 // cleanly. It needs to be called twice for coalesced packets (see references
738 // to length_of_first_coalesced_packet below for examples of how to do this).
ReviseFirstByteByVersion(unsigned char packet_ietf[])739 inline void ReviseFirstByteByVersion(unsigned char packet_ietf[]) {
740 if (version_.UsesV2PacketTypes() && (packet_ietf[0] >= 0x80)) {
741 packet_ietf[0] = (packet_ietf[0] + 0x10) | 0xc0;
742 }
743 }
ReviseFirstByteByVersion(PacketFragments & packet_ietf)744 inline void ReviseFirstByteByVersion(PacketFragments& packet_ietf) {
745 ReviseFirstByteByVersion(&packet_ietf[0].fragment[0]);
746 }
747
CheckEncryption(QuicPacketNumber packet_number,QuicPacket * packet)748 bool CheckEncryption(QuicPacketNumber packet_number, QuicPacket* packet) {
749 if (packet_number != encrypter_->packet_number_) {
750 QUIC_LOG(ERROR) << "Encrypted incorrect packet number. expected "
751 << packet_number
752 << " actual: " << encrypter_->packet_number_;
753 return false;
754 }
755 if (packet->AssociatedData(framer_.transport_version()) !=
756 encrypter_->associated_data_) {
757 QUIC_LOG(ERROR) << "Encrypted incorrect associated data. expected "
758 << packet->AssociatedData(framer_.transport_version())
759 << " actual: " << encrypter_->associated_data_;
760 return false;
761 }
762 if (packet->Plaintext(framer_.transport_version()) !=
763 encrypter_->plaintext_) {
764 QUIC_LOG(ERROR) << "Encrypted incorrect plaintext data. expected "
765 << packet->Plaintext(framer_.transport_version())
766 << " actual: " << encrypter_->plaintext_;
767 return false;
768 }
769 return true;
770 }
771
CheckDecryption(const QuicEncryptedPacket & encrypted,bool includes_version,bool includes_diversification_nonce,uint8_t destination_connection_id_length,uint8_t source_connection_id_length)772 bool CheckDecryption(const QuicEncryptedPacket& encrypted,
773 bool includes_version,
774 bool includes_diversification_nonce,
775 uint8_t destination_connection_id_length,
776 uint8_t source_connection_id_length) {
777 return CheckDecryption(
778 encrypted, includes_version, includes_diversification_nonce,
779 destination_connection_id_length, source_connection_id_length,
780 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
781 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
782 }
783
CheckDecryption(const QuicEncryptedPacket & encrypted,bool includes_version,bool includes_diversification_nonce,uint8_t destination_connection_id_length,uint8_t source_connection_id_length,quiche::QuicheVariableLengthIntegerLength retry_token_length_length,size_t retry_token_length,quiche::QuicheVariableLengthIntegerLength length_length)784 bool CheckDecryption(
785 const QuicEncryptedPacket& encrypted, bool includes_version,
786 bool includes_diversification_nonce,
787 uint8_t destination_connection_id_length,
788 uint8_t source_connection_id_length,
789 quiche::QuicheVariableLengthIntegerLength retry_token_length_length,
790 size_t retry_token_length,
791 quiche::QuicheVariableLengthIntegerLength length_length) {
792 if (visitor_.header_->packet_number != decrypter_->packet_number_) {
793 QUIC_LOG(ERROR) << "Decrypted incorrect packet number. expected "
794 << visitor_.header_->packet_number
795 << " actual: " << decrypter_->packet_number_;
796 return false;
797 }
798 absl::string_view associated_data =
799 QuicFramer::GetAssociatedDataFromEncryptedPacket(
800 framer_.transport_version(), encrypted,
801 destination_connection_id_length, source_connection_id_length,
802 includes_version, includes_diversification_nonce,
803 PACKET_4BYTE_PACKET_NUMBER, retry_token_length_length,
804 retry_token_length, length_length);
805 if (associated_data != decrypter_->associated_data_) {
806 QUIC_LOG(ERROR) << "Decrypted incorrect associated data. expected "
807 << absl::BytesToHexString(associated_data) << " actual: "
808 << absl::BytesToHexString(decrypter_->associated_data_);
809 return false;
810 }
811 absl::string_view ciphertext(
812 encrypted.AsStringPiece().substr(GetStartOfEncryptedData(
813 framer_.transport_version(), destination_connection_id_length,
814 source_connection_id_length, includes_version,
815 includes_diversification_nonce, PACKET_4BYTE_PACKET_NUMBER,
816 retry_token_length_length, retry_token_length, length_length)));
817 if (ciphertext != decrypter_->ciphertext_) {
818 QUIC_LOG(ERROR) << "Decrypted incorrect ciphertext data. expected "
819 << absl::BytesToHexString(ciphertext) << " actual: "
820 << absl::BytesToHexString(decrypter_->ciphertext_)
821 << " associated data: "
822 << absl::BytesToHexString(associated_data);
823 return false;
824 }
825 return true;
826 }
827
AsChars(unsigned char * data)828 char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); }
829
830 // Creates a new QuicEncryptedPacket by concatenating the various
831 // packet fragments in |fragments|.
AssemblePacketFromFragments(const PacketFragments & fragments)832 std::unique_ptr<QuicEncryptedPacket> AssemblePacketFromFragments(
833 const PacketFragments& fragments) {
834 char* buffer = new char[kMaxOutgoingPacketSize + 1];
835 size_t len = 0;
836 for (const auto& fragment : fragments) {
837 memcpy(buffer + len, fragment.fragment.data(), fragment.fragment.size());
838 len += fragment.fragment.size();
839 }
840 return std::make_unique<QuicEncryptedPacket>(buffer, len, true);
841 }
842
CheckFramingBoundaries(const PacketFragments & fragments,QuicErrorCode error_code)843 void CheckFramingBoundaries(const PacketFragments& fragments,
844 QuicErrorCode error_code) {
845 std::unique_ptr<QuicEncryptedPacket> packet(
846 AssemblePacketFromFragments(fragments));
847 // Check all the various prefixes of |packet| for the expected
848 // parse error and error code.
849 for (size_t i = 0; i < packet->length(); ++i) {
850 std::string expected_error;
851 size_t len = 0;
852 for (const auto& fragment : fragments) {
853 len += fragment.fragment.size();
854 if (i < len) {
855 expected_error = fragment.error_if_missing;
856 break;
857 }
858 }
859
860 if (expected_error.empty()) continue;
861
862 CheckProcessingFails(*packet, i, expected_error, error_code);
863 }
864 }
865
CheckProcessingFails(const QuicEncryptedPacket & packet,size_t len,std::string expected_error,QuicErrorCode error_code)866 void CheckProcessingFails(const QuicEncryptedPacket& packet, size_t len,
867 std::string expected_error,
868 QuicErrorCode error_code) {
869 QuicEncryptedPacket encrypted(packet.data(), len, false);
870 EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
871 EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len;
872 EXPECT_EQ(error_code, framer_.error()) << "len: " << len;
873 }
874
CheckProcessingFails(unsigned char * packet,size_t len,std::string expected_error,QuicErrorCode error_code)875 void CheckProcessingFails(unsigned char* packet, size_t len,
876 std::string expected_error,
877 QuicErrorCode error_code) {
878 QuicEncryptedPacket encrypted(AsChars(packet), len, false);
879 EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
880 EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len;
881 EXPECT_EQ(error_code, framer_.error()) << "len: " << len;
882 }
883
884 // Checks if the supplied string matches data in the supplied StreamFrame.
CheckStreamFrameData(std::string str,QuicStreamFrame * frame)885 void CheckStreamFrameData(std::string str, QuicStreamFrame* frame) {
886 EXPECT_EQ(str, std::string(frame->data_buffer, frame->data_length));
887 }
888
CheckCalculatePacketNumber(uint64_t expected_packet_number,QuicPacketNumber last_packet_number)889 void CheckCalculatePacketNumber(uint64_t expected_packet_number,
890 QuicPacketNumber last_packet_number) {
891 uint64_t wire_packet_number = expected_packet_number & kMask;
892 EXPECT_EQ(expected_packet_number,
893 QuicFramerPeer::CalculatePacketNumberFromWire(
894 &framer_, PACKET_4BYTE_PACKET_NUMBER, last_packet_number,
895 wire_packet_number))
896 << "last_packet_number: " << last_packet_number
897 << " wire_packet_number: " << wire_packet_number;
898 }
899
BuildDataPacket(const QuicPacketHeader & header,const QuicFrames & frames)900 std::unique_ptr<QuicPacket> BuildDataPacket(const QuicPacketHeader& header,
901 const QuicFrames& frames) {
902 return BuildUnsizedDataPacket(&framer_, header, frames);
903 }
904
BuildDataPacket(const QuicPacketHeader & header,const QuicFrames & frames,size_t packet_size)905 std::unique_ptr<QuicPacket> BuildDataPacket(const QuicPacketHeader& header,
906 const QuicFrames& frames,
907 size_t packet_size) {
908 return BuildUnsizedDataPacket(&framer_, header, frames, packet_size);
909 }
910
911 // N starts at 1.
GetNthStreamid(QuicTransportVersion transport_version,Perspective perspective,bool bidirectional,int n)912 QuicStreamId GetNthStreamid(QuicTransportVersion transport_version,
913 Perspective perspective, bool bidirectional,
914 int n) {
915 if (bidirectional) {
916 return QuicUtils::GetFirstBidirectionalStreamId(transport_version,
917 perspective) +
918 ((n - 1) * QuicUtils::StreamIdDelta(transport_version));
919 }
920 // Unidirectional
921 return QuicUtils::GetFirstUnidirectionalStreamId(transport_version,
922 perspective) +
923 ((n - 1) * QuicUtils::StreamIdDelta(transport_version));
924 }
925
CreationTimePlus(uint64_t offset_us)926 QuicTime CreationTimePlus(uint64_t offset_us) {
927 return framer_.creation_time() +
928 QuicTime::Delta::FromMicroseconds(offset_us);
929 }
930
931 test::TestEncrypter* encrypter_;
932 test::TestDecrypter* decrypter_;
933 ParsedQuicVersion version_;
934 QuicTime start_;
935 QuicFramer framer_;
936 test::TestQuicVisitor visitor_;
937 quiche::SimpleBufferAllocator allocator_;
938 };
939
940 // Multiple test cases of QuicFramerTest use byte arrays to define packets for
941 // testing, and these byte arrays contain the QUIC version. This macro explodes
942 // the 32-bit version into four bytes in network order. Since it uses methods of
943 // QuicFramerTest, it is only valid to use this in a QuicFramerTest.
944 #define QUIC_VERSION_BYTES \
945 GetQuicVersionByte(0), GetQuicVersionByte(1), GetQuicVersionByte(2), \
946 GetQuicVersionByte(3)
947
948 // Run all framer tests with all supported versions of QUIC.
949 INSTANTIATE_TEST_SUITE_P(QuicFramerTests, QuicFramerTest,
950 ::testing::ValuesIn(AllSupportedVersions()),
951 ::testing::PrintToStringParamName());
952
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearEpochStart)953 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochStart) {
954 // A few quick manual sanity checks.
955 CheckCalculatePacketNumber(UINT64_C(1), QuicPacketNumber());
956 CheckCalculatePacketNumber(kEpoch + 1, QuicPacketNumber(kMask));
957 CheckCalculatePacketNumber(kEpoch, QuicPacketNumber(kMask));
958 for (uint64_t j = 0; j < 10; j++) {
959 CheckCalculatePacketNumber(j, QuicPacketNumber());
960 CheckCalculatePacketNumber(kEpoch - 1 - j, QuicPacketNumber());
961 }
962
963 // Cases where the last number was close to the start of the range.
964 for (QuicPacketNumber last = QuicPacketNumber(1); last < QuicPacketNumber(10);
965 last++) {
966 // Small numbers should not wrap (even if they're out of order).
967 for (uint64_t j = 0; j < 10; j++) {
968 CheckCalculatePacketNumber(j, last);
969 }
970
971 // Large numbers should not wrap either (because we're near 0 already).
972 for (uint64_t j = 0; j < 10; j++) {
973 CheckCalculatePacketNumber(kEpoch - 1 - j, last);
974 }
975 }
976 }
977
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearEpochEnd)978 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochEnd) {
979 // Cases where the last number was close to the end of the range
980 for (uint64_t i = 0; i < 10; i++) {
981 QuicPacketNumber last = QuicPacketNumber(kEpoch - i);
982
983 // Small numbers should wrap.
984 for (uint64_t j = 0; j < 10; j++) {
985 CheckCalculatePacketNumber(kEpoch + j, last);
986 }
987
988 // Large numbers should not (even if they're out of order).
989 for (uint64_t j = 0; j < 10; j++) {
990 CheckCalculatePacketNumber(kEpoch - 1 - j, last);
991 }
992 }
993 }
994
995 // Next check where we're in a non-zero epoch to verify we handle
996 // reverse wrapping, too.
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearPrevEpoch)997 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearPrevEpoch) {
998 const uint64_t prev_epoch = 1 * kEpoch;
999 const uint64_t cur_epoch = 2 * kEpoch;
1000 // Cases where the last number was close to the start of the range
1001 for (uint64_t i = 0; i < 10; i++) {
1002 QuicPacketNumber last = QuicPacketNumber(cur_epoch + i);
1003 // Small number should not wrap (even if they're out of order).
1004 for (uint64_t j = 0; j < 10; j++) {
1005 CheckCalculatePacketNumber(cur_epoch + j, last);
1006 }
1007
1008 // But large numbers should reverse wrap.
1009 for (uint64_t j = 0; j < 10; j++) {
1010 uint64_t num = kEpoch - 1 - j;
1011 CheckCalculatePacketNumber(prev_epoch + num, last);
1012 }
1013 }
1014 }
1015
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearNextEpoch)1016 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextEpoch) {
1017 const uint64_t cur_epoch = 2 * kEpoch;
1018 const uint64_t next_epoch = 3 * kEpoch;
1019 // Cases where the last number was close to the end of the range
1020 for (uint64_t i = 0; i < 10; i++) {
1021 QuicPacketNumber last = QuicPacketNumber(next_epoch - 1 - i);
1022
1023 // Small numbers should wrap.
1024 for (uint64_t j = 0; j < 10; j++) {
1025 CheckCalculatePacketNumber(next_epoch + j, last);
1026 }
1027
1028 // but large numbers should not (even if they're out of order).
1029 for (uint64_t j = 0; j < 10; j++) {
1030 uint64_t num = kEpoch - 1 - j;
1031 CheckCalculatePacketNumber(cur_epoch + num, last);
1032 }
1033 }
1034 }
1035
TEST_P(QuicFramerTest,CalculatePacketNumberFromWireNearNextMax)1036 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextMax) {
1037 const uint64_t max_number = std::numeric_limits<uint64_t>::max();
1038 const uint64_t max_epoch = max_number & ~kMask;
1039
1040 // Cases where the last number was close to the end of the range
1041 for (uint64_t i = 0; i < 10; i++) {
1042 // Subtract 1, because the expected next packet number is 1 more than the
1043 // last packet number.
1044 QuicPacketNumber last = QuicPacketNumber(max_number - i - 1);
1045
1046 // Small numbers should not wrap, because they have nowhere to go.
1047 for (uint64_t j = 0; j < 10; j++) {
1048 CheckCalculatePacketNumber(max_epoch + j, last);
1049 }
1050
1051 // Large numbers should not wrap either.
1052 for (uint64_t j = 0; j < 10; j++) {
1053 uint64_t num = kEpoch - 1 - j;
1054 CheckCalculatePacketNumber(max_epoch + num, last);
1055 }
1056 }
1057 }
1058
TEST_P(QuicFramerTest,EmptyPacket)1059 TEST_P(QuicFramerTest, EmptyPacket) {
1060 char packet[] = {0x00};
1061 QuicEncryptedPacket encrypted(packet, 0, false);
1062 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
1063 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
1064 }
1065
TEST_P(QuicFramerTest,LargePacket)1066 TEST_P(QuicFramerTest, LargePacket) {
1067 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1068 // clang-format off
1069 unsigned char packet[kMaxIncomingPacketSize + 1] = {
1070 // type (short header 4 byte packet number)
1071 0x43,
1072 // connection_id
1073 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1074 // packet number
1075 0x78, 0x56, 0x34, 0x12,
1076 };
1077 // clang-format on
1078
1079 const size_t header_size = GetPacketHeaderSize(
1080 framer_.transport_version(), kPacket8ByteConnectionId,
1081 kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
1082 PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
1083 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
1084
1085 memset(packet + header_size, 0, kMaxIncomingPacketSize - header_size);
1086
1087 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
1088 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
1089
1090 ASSERT_TRUE(visitor_.header_.get());
1091 // Make sure we've parsed the packet header, so we can send an error.
1092 EXPECT_EQ(FramerTestConnectionId(),
1093 visitor_.header_->destination_connection_id);
1094 // Make sure the correct error is propagated.
1095 EXPECT_THAT(framer_.error(), IsError(QUIC_PACKET_TOO_LARGE));
1096 EXPECT_EQ("Packet too large.", framer_.detailed_error());
1097 }
1098
TEST_P(QuicFramerTest,LongPacketHeader)1099 TEST_P(QuicFramerTest, LongPacketHeader) {
1100 // clang-format off
1101 PacketFragments packet = {
1102 // type (long header with packet type ZERO_RTT)
1103 {"Unable to read first byte.",
1104 {0xD3}},
1105 // version tag
1106 {"Unable to read protocol version.",
1107 {QUIC_VERSION_BYTES}},
1108 // connection_id length
1109 {"Unable to read ConnectionId length.",
1110 {0x50}},
1111 // connection_id
1112 {"Unable to read destination connection ID.",
1113 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1114 // packet number
1115 {"Unable to read packet number.",
1116 {0x12, 0x34, 0x56, 0x78}},
1117 };
1118 // clang-format on
1119
1120 if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
1121 return;
1122 }
1123
1124 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
1125 std::unique_ptr<QuicEncryptedPacket> encrypted(
1126 AssemblePacketFromFragments(packet));
1127
1128 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1129 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1130 ASSERT_TRUE(visitor_.header_.get());
1131 EXPECT_EQ(FramerTestConnectionId(),
1132 visitor_.header_->destination_connection_id);
1133 EXPECT_FALSE(visitor_.header_->reset_flag);
1134 EXPECT_TRUE(visitor_.header_->version_flag);
1135 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1136
1137 CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
1138
1139 PacketHeaderFormat format;
1140 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1141 bool version_flag;
1142 QuicConnectionId destination_connection_id, source_connection_id;
1143 QuicVersionLabel version_label;
1144 std::string detailed_error;
1145 bool use_length_prefix;
1146 std::optional<absl::string_view> retry_token;
1147 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1148 const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1149 *encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1150 &version_flag, &use_length_prefix, &version_label, &parsed_version,
1151 &destination_connection_id, &source_connection_id, &retry_token,
1152 &detailed_error);
1153 EXPECT_THAT(error_code, IsQuicNoError());
1154 EXPECT_EQ("", detailed_error);
1155 EXPECT_FALSE(retry_token.has_value());
1156 EXPECT_FALSE(use_length_prefix);
1157 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1158 EXPECT_TRUE(version_flag);
1159 EXPECT_EQ(kQuicDefaultConnectionIdLength, destination_connection_id.length());
1160 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1161 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1162 }
1163
TEST_P(QuicFramerTest,LongPacketHeaderWithBothConnectionIds)1164 TEST_P(QuicFramerTest, LongPacketHeaderWithBothConnectionIds) {
1165 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
1166 // clang-format off
1167 unsigned char packet[] = {
1168 // public flags (long header with packet type ZERO_RTT_PROTECTED and
1169 // 4-byte packet number)
1170 0xD3,
1171 // version
1172 QUIC_VERSION_BYTES,
1173 // connection ID lengths
1174 0x55,
1175 // destination connection ID
1176 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1177 // source connection ID
1178 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
1179 // packet number
1180 0x12, 0x34, 0x56, 0x00,
1181 // padding frame
1182 0x00,
1183 };
1184 unsigned char packet49[] = {
1185 // public flags (long header with packet type ZERO_RTT_PROTECTED and
1186 // 4-byte packet number)
1187 0xD3,
1188 // version
1189 QUIC_VERSION_BYTES,
1190 // destination connection ID length
1191 0x08,
1192 // destination connection ID
1193 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1194 // source connection ID length
1195 0x08,
1196 // source connection ID
1197 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
1198 // long header packet length
1199 0x05,
1200 // packet number
1201 0x12, 0x34, 0x56, 0x00,
1202 // padding frame
1203 0x00,
1204 };
1205 // clang-format on
1206
1207 unsigned char* p = packet;
1208 size_t p_length = ABSL_ARRAYSIZE(packet);
1209 if (framer_.version().HasLongHeaderLengths()) {
1210 ReviseFirstByteByVersion(packet49);
1211 p = packet49;
1212 p_length = ABSL_ARRAYSIZE(packet49);
1213 }
1214
1215 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
1216 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1217 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1218 bool version_flag = false;
1219 QuicConnectionId destination_connection_id, source_connection_id;
1220 QuicVersionLabel version_label = 0;
1221 std::string detailed_error = "";
1222 bool use_length_prefix;
1223 std::optional<absl::string_view> retry_token;
1224 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1225 const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1226 encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1227 &version_flag, &use_length_prefix, &version_label, &parsed_version,
1228 &destination_connection_id, &source_connection_id, &retry_token,
1229 &detailed_error);
1230 EXPECT_THAT(error_code, IsQuicNoError());
1231 EXPECT_FALSE(retry_token.has_value());
1232 EXPECT_EQ(framer_.version().HasLengthPrefixedConnectionIds(),
1233 use_length_prefix);
1234 EXPECT_EQ("", detailed_error);
1235 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1236 EXPECT_TRUE(version_flag);
1237 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1238 EXPECT_EQ(FramerTestConnectionIdPlusOne(), source_connection_id);
1239 }
1240
TEST_P(QuicFramerTest,AllZeroPacketParsingFails)1241 TEST_P(QuicFramerTest, AllZeroPacketParsingFails) {
1242 unsigned char packet[1200] = {};
1243 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
1244 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1245 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1246 bool version_flag = false;
1247 QuicConnectionId destination_connection_id, source_connection_id;
1248 QuicVersionLabel version_label = 0;
1249 std::string detailed_error = "";
1250 bool use_length_prefix;
1251 std::optional<absl::string_view> retry_token;
1252 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1253 const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
1254 encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
1255 &version_flag, &use_length_prefix, &version_label, &parsed_version,
1256 &destination_connection_id, &source_connection_id, &retry_token,
1257 &detailed_error);
1258 EXPECT_EQ(error_code, QUIC_INVALID_PACKET_HEADER);
1259 EXPECT_EQ(detailed_error, "Invalid flags.");
1260 }
1261
TEST_P(QuicFramerTest,ParsePublicHeader)1262 TEST_P(QuicFramerTest, ParsePublicHeader) {
1263 // clang-format off
1264 unsigned char packet[] = {
1265 // public flags (long header with packet type HANDSHAKE and
1266 // 4-byte packet number)
1267 0xE3,
1268 // version
1269 QUIC_VERSION_BYTES,
1270 // connection ID lengths
1271 0x50,
1272 // destination connection ID
1273 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1274 // long header packet length
1275 0x05,
1276 // packet number
1277 0x12, 0x34, 0x56, 0x78,
1278 // padding frame
1279 0x00,
1280 };
1281 unsigned char packet49[] = {
1282 // public flags (long header with packet type HANDSHAKE and
1283 // 4-byte packet number)
1284 0xE3,
1285 // version
1286 QUIC_VERSION_BYTES,
1287 // destination connection ID length
1288 0x08,
1289 // destination connection ID
1290 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1291 // source connection ID length
1292 0x00,
1293 // long header packet length
1294 0x05,
1295 // packet number
1296 0x12, 0x34, 0x56, 0x78,
1297 // padding frame
1298 0x00,
1299 };
1300 // clang-format on
1301 unsigned char* p = packet;
1302 size_t p_length = ABSL_ARRAYSIZE(packet);
1303 if (framer_.version().HasLongHeaderLengths()) {
1304 ReviseFirstByteByVersion(packet49);
1305 p = packet49;
1306 p_length = ABSL_ARRAYSIZE(packet49);
1307 }
1308
1309 uint8_t first_byte = 0x33;
1310 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1311 bool version_present = false, has_length_prefix = false;
1312 QuicVersionLabel version_label = 0;
1313 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1314 QuicConnectionId destination_connection_id = EmptyQuicConnectionId(),
1315 source_connection_id = EmptyQuicConnectionId();
1316 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1317 quiche::QuicheVariableLengthIntegerLength retry_token_length_length =
1318 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_4;
1319 absl::string_view retry_token;
1320 std::string detailed_error = "foobar";
1321
1322 QuicDataReader reader(AsChars(p), p_length);
1323 const QuicErrorCode parse_error = QuicFramer::ParsePublicHeader(
1324 &reader, kQuicDefaultConnectionIdLength, /*ietf_format=*/true,
1325 &first_byte, &format, &version_present, &has_length_prefix,
1326 &version_label, &parsed_version, &destination_connection_id,
1327 &source_connection_id, &long_packet_type, &retry_token_length_length,
1328 &retry_token, &detailed_error);
1329 EXPECT_THAT(parse_error, IsQuicNoError());
1330 EXPECT_EQ("", detailed_error);
1331 EXPECT_EQ(p[0], first_byte);
1332 EXPECT_TRUE(version_present);
1333 EXPECT_EQ(framer_.version().HasLengthPrefixedConnectionIds(),
1334 has_length_prefix);
1335 EXPECT_EQ(CreateQuicVersionLabel(framer_.version()), version_label);
1336 EXPECT_EQ(framer_.version(), parsed_version);
1337 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1338 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1339 EXPECT_EQ(quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
1340 retry_token_length_length);
1341 EXPECT_EQ(absl::string_view(), retry_token);
1342 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1343 EXPECT_EQ(HANDSHAKE, long_packet_type);
1344 }
1345
TEST_P(QuicFramerTest,ParsePublicHeaderProxBadSourceConnectionIdLength)1346 TEST_P(QuicFramerTest, ParsePublicHeaderProxBadSourceConnectionIdLength) {
1347 if (!framer_.version().HasLengthPrefixedConnectionIds()) {
1348 return;
1349 }
1350 // clang-format off
1351 unsigned char packet[] = {
1352 // public flags (long header with packet type HANDSHAKE and
1353 // 4-byte packet number)
1354 0xE3,
1355 // version
1356 'P', 'R', 'O', 'X',
1357 // destination connection ID length
1358 0x08,
1359 // destination connection ID
1360 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1361 // source connection ID length (bogus)
1362 0xEE,
1363 // long header packet length
1364 0x05,
1365 // packet number
1366 0x12, 0x34, 0x56, 0x78,
1367 // padding frame
1368 0x00,
1369 };
1370 // clang-format on
1371 unsigned char* p = packet;
1372 size_t p_length = ABSL_ARRAYSIZE(packet);
1373
1374 uint8_t first_byte = 0x33;
1375 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
1376 bool version_present = false, has_length_prefix = false;
1377 QuicVersionLabel version_label = 0;
1378 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
1379 QuicConnectionId destination_connection_id = EmptyQuicConnectionId(),
1380 source_connection_id = EmptyQuicConnectionId();
1381 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
1382 quiche::QuicheVariableLengthIntegerLength retry_token_length_length =
1383 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_4;
1384 absl::string_view retry_token;
1385 std::string detailed_error = "foobar";
1386
1387 QuicDataReader reader(AsChars(p), p_length);
1388 const QuicErrorCode parse_error = QuicFramer::ParsePublicHeader(
1389 &reader, kQuicDefaultConnectionIdLength,
1390 /*ietf_format=*/true, &first_byte, &format, &version_present,
1391 &has_length_prefix, &version_label, &parsed_version,
1392 &destination_connection_id, &source_connection_id, &long_packet_type,
1393 &retry_token_length_length, &retry_token, &detailed_error);
1394 EXPECT_THAT(parse_error, IsQuicNoError());
1395 EXPECT_EQ("", detailed_error);
1396 EXPECT_EQ(p[0], first_byte);
1397 EXPECT_TRUE(version_present);
1398 EXPECT_TRUE(has_length_prefix);
1399 EXPECT_EQ(0x50524F58u, version_label); // "PROX"
1400 EXPECT_EQ(UnsupportedQuicVersion(), parsed_version);
1401 EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
1402 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
1403 EXPECT_EQ(quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
1404 retry_token_length_length);
1405 EXPECT_EQ(absl::string_view(), retry_token);
1406 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
1407 }
1408
TEST_P(QuicFramerTest,ClientConnectionIdFromShortHeaderToClient)1409 TEST_P(QuicFramerTest, ClientConnectionIdFromShortHeaderToClient) {
1410 if (!framer_.version().SupportsClientConnectionIds()) {
1411 return;
1412 }
1413 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1414 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
1415 TestConnectionId(0x33));
1416 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1417 framer_.SetExpectedClientConnectionIdLength(kQuicDefaultConnectionIdLength);
1418 // clang-format off
1419 unsigned char packet[] = {
1420 // type (short header, 4 byte packet number)
1421 0x43,
1422 // connection_id
1423 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1424 // packet number
1425 0x13, 0x37, 0x42, 0x33,
1426 // padding frame
1427 0x00,
1428 };
1429 // clang-format on
1430 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
1431 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1432 EXPECT_THAT(framer_.error(), IsQuicNoError());
1433 EXPECT_EQ("", framer_.detailed_error());
1434 ASSERT_TRUE(visitor_.header_.get());
1435 EXPECT_EQ(FramerTestConnectionId(),
1436 visitor_.header_->destination_connection_id);
1437 }
1438
1439 // In short header packets from client to server, the client connection ID
1440 // is omitted, but the framer adds it to the header struct using its
1441 // last serialized client connection ID. This test ensures that this
1442 // mechanism behaves as expected.
TEST_P(QuicFramerTest,ClientConnectionIdFromShortHeaderToServer)1443 TEST_P(QuicFramerTest, ClientConnectionIdFromShortHeaderToServer) {
1444 if (!framer_.version().SupportsClientConnectionIds()) {
1445 return;
1446 }
1447 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1448 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1449 // clang-format off
1450 unsigned char packet[] = {
1451 // type (short header, 4 byte packet number)
1452 0x43,
1453 // connection_id
1454 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1455 // packet number
1456 0x13, 0x37, 0x42, 0x33,
1457 // padding frame
1458 0x00,
1459 };
1460 // clang-format on
1461 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
1462 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1463 EXPECT_THAT(framer_.error(), IsQuicNoError());
1464 EXPECT_EQ("", framer_.detailed_error());
1465 ASSERT_TRUE(visitor_.header_.get());
1466 EXPECT_EQ(FramerTestConnectionId(),
1467 visitor_.header_->destination_connection_id);
1468 }
1469
TEST_P(QuicFramerTest,PacketHeaderWith0ByteConnectionId)1470 TEST_P(QuicFramerTest, PacketHeaderWith0ByteConnectionId) {
1471 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1472 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
1473 FramerTestConnectionId());
1474 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1475
1476 // clang-format off
1477 PacketFragments packet = {
1478 // type (short header, 4 byte packet number)
1479 {"Unable to read first byte.",
1480 {0x43}},
1481 // connection_id
1482 // packet number
1483 {"Unable to read packet number.",
1484 {0x12, 0x34, 0x56, 0x78}},
1485 };
1486
1487 PacketFragments packet_hp = {
1488 // type (short header, 4 byte packet number)
1489 {"Unable to read first byte.",
1490 {0x43}},
1491 // connection_id
1492 // packet number
1493 {"",
1494 {0x12, 0x34, 0x56, 0x78}},
1495 };
1496 // clang-format on
1497
1498 PacketFragments& fragments =
1499 framer_.version().HasHeaderProtection() ? packet_hp : packet;
1500 std::unique_ptr<QuicEncryptedPacket> encrypted(
1501 AssemblePacketFromFragments(fragments));
1502 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1503 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1504 ASSERT_TRUE(visitor_.header_.get());
1505 EXPECT_FALSE(visitor_.header_->reset_flag);
1506 EXPECT_FALSE(visitor_.header_->version_flag);
1507 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1508
1509 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1510 }
1511
TEST_P(QuicFramerTest,PacketHeaderWithVersionFlag)1512 TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) {
1513 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
1514 // clang-format off
1515 PacketFragments packet = {
1516 // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1517 // packet number)
1518 {"Unable to read first byte.",
1519 {0xD3}},
1520 // version tag
1521 {"Unable to read protocol version.",
1522 {QUIC_VERSION_BYTES}},
1523 // connection_id length
1524 {"Unable to read ConnectionId length.",
1525 {0x50}},
1526 // connection_id
1527 {"Unable to read destination connection ID.",
1528 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1529 // packet number
1530 {"Unable to read packet number.",
1531 {0x12, 0x34, 0x56, 0x78}},
1532 };
1533
1534 PacketFragments packet49 = {
1535 // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes
1536 // packet number)
1537 {"Unable to read first byte.",
1538 {0xD3}},
1539 // version tag
1540 {"Unable to read protocol version.",
1541 {QUIC_VERSION_BYTES}},
1542 // destination connection ID length
1543 {"Unable to read destination connection ID.",
1544 {0x08}},
1545 // destination connection ID
1546 {"Unable to read destination connection ID.",
1547 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1548 // source connection ID length
1549 {"Unable to read source connection ID.",
1550 {0x00}},
1551 // long header packet length
1552 {"Unable to read long header payload length.",
1553 {0x04}},
1554 // packet number
1555 {"Long header payload length longer than packet.",
1556 {0x12, 0x34, 0x56, 0x78}},
1557 };
1558 // clang-format on
1559
1560 ReviseFirstByteByVersion(packet49);
1561 PacketFragments& fragments =
1562 framer_.version().HasLongHeaderLengths() ? packet49 : packet;
1563 std::unique_ptr<QuicEncryptedPacket> encrypted(
1564 AssemblePacketFromFragments(fragments));
1565 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1566 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1567 ASSERT_TRUE(visitor_.header_.get());
1568 EXPECT_EQ(FramerTestConnectionId(),
1569 visitor_.header_->destination_connection_id);
1570 EXPECT_FALSE(visitor_.header_->reset_flag);
1571 EXPECT_TRUE(visitor_.header_->version_flag);
1572 EXPECT_EQ(GetParam(), visitor_.header_->version);
1573 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1574
1575 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1576 }
1577
TEST_P(QuicFramerTest,PacketHeaderWith4BytePacketNumber)1578 TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) {
1579 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1580 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1581
1582 // clang-format off
1583 PacketFragments packet = {
1584 // type (short header, 4 byte packet number)
1585 {"Unable to read first byte.",
1586 {0x43}},
1587 // connection_id
1588 {"Unable to read destination connection ID.",
1589 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1590 // packet number
1591 {"Unable to read packet number.",
1592 {0x12, 0x34, 0x56, 0x78}},
1593 };
1594
1595 PacketFragments packet_hp = {
1596 // type (short header, 4 byte packet number)
1597 {"Unable to read first byte.",
1598 {0x43}},
1599 // connection_id
1600 {"Unable to read destination connection ID.",
1601 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1602 // packet number
1603 {"",
1604 {0x12, 0x34, 0x56, 0x78}},
1605 };
1606 // clang-format on
1607
1608 PacketFragments& fragments =
1609 framer_.version().HasHeaderProtection() ? packet_hp : packet;
1610 std::unique_ptr<QuicEncryptedPacket> encrypted(
1611 AssemblePacketFromFragments(fragments));
1612 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1613 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1614 ASSERT_TRUE(visitor_.header_.get());
1615 EXPECT_EQ(FramerTestConnectionId(),
1616 visitor_.header_->destination_connection_id);
1617 EXPECT_FALSE(visitor_.header_->reset_flag);
1618 EXPECT_FALSE(visitor_.header_->version_flag);
1619 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1620
1621 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1622 }
1623
TEST_P(QuicFramerTest,PacketHeaderWith2BytePacketNumber)1624 TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) {
1625 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1626 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1627
1628 // clang-format off
1629 PacketFragments packet = {
1630 // type (short header, 2 byte packet number)
1631 {"Unable to read first byte.",
1632 {0x41}},
1633 // connection_id
1634 {"Unable to read destination connection ID.",
1635 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1636 // packet number
1637 {"Unable to read packet number.",
1638 {0x56, 0x78}},
1639 };
1640
1641 PacketFragments packet_hp = {
1642 // type (short header, 2 byte packet number)
1643 {"Unable to read first byte.",
1644 {0x41}},
1645 // connection_id
1646 {"Unable to read destination connection ID.",
1647 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1648 // packet number
1649 {"",
1650 {0x56, 0x78}},
1651 // padding
1652 {"", {0x00, 0x00}},
1653 };
1654 // clang-format on
1655
1656 PacketFragments& fragments =
1657 framer_.version().HasHeaderProtection() ? packet_hp : packet;
1658 std::unique_ptr<QuicEncryptedPacket> encrypted(
1659 AssemblePacketFromFragments(fragments));
1660 if (framer_.version().HasHeaderProtection()) {
1661 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
1662 EXPECT_THAT(framer_.error(), IsQuicNoError());
1663 } else {
1664 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1665 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1666 }
1667 ASSERT_TRUE(visitor_.header_.get());
1668 EXPECT_EQ(FramerTestConnectionId(),
1669 visitor_.header_->destination_connection_id);
1670 EXPECT_FALSE(visitor_.header_->reset_flag);
1671 EXPECT_FALSE(visitor_.header_->version_flag);
1672 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1673 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1674
1675 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1676 }
1677
TEST_P(QuicFramerTest,PacketHeaderWith1BytePacketNumber)1678 TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) {
1679 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1680 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
1681
1682 // clang-format off
1683 PacketFragments packet = {
1684 // type (8 byte connection_id and 1 byte packet number)
1685 {"Unable to read first byte.",
1686 {0x40}},
1687 // connection_id
1688 {"Unable to read destination connection ID.",
1689 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1690 // packet number
1691 {"Unable to read packet number.",
1692 {0x78}},
1693 };
1694
1695 PacketFragments packet_hp = {
1696 // type (8 byte connection_id and 1 byte packet number)
1697 {"Unable to read first byte.",
1698 {0x40}},
1699 // connection_id
1700 {"Unable to read destination connection ID.",
1701 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
1702 // packet number
1703 {"",
1704 {0x78}},
1705 // padding
1706 {"", {0x00, 0x00, 0x00}},
1707 };
1708
1709 // clang-format on
1710
1711 PacketFragments& fragments =
1712 framer_.version().HasHeaderProtection() ? packet_hp : packet;
1713 std::unique_ptr<QuicEncryptedPacket> encrypted(
1714 AssemblePacketFromFragments(fragments));
1715 if (framer_.version().HasHeaderProtection()) {
1716 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
1717 EXPECT_THAT(framer_.error(), IsQuicNoError());
1718 } else {
1719 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
1720 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
1721 }
1722 ASSERT_TRUE(visitor_.header_.get());
1723 EXPECT_EQ(FramerTestConnectionId(),
1724 visitor_.header_->destination_connection_id);
1725 EXPECT_FALSE(visitor_.header_->reset_flag);
1726 EXPECT_FALSE(visitor_.header_->version_flag);
1727 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1728 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1729
1730 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
1731 }
1732
TEST_P(QuicFramerTest,PacketNumberDecreasesThenIncreases)1733 TEST_P(QuicFramerTest, PacketNumberDecreasesThenIncreases) {
1734 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1735 // Test the case when a packet is received from the past and future packet
1736 // numbers are still calculated relative to the largest received packet.
1737 QuicPacketHeader header;
1738 header.destination_connection_id = FramerTestConnectionId();
1739 header.reset_flag = false;
1740 header.version_flag = false;
1741 header.packet_number = kPacketNumber - 2;
1742
1743 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
1744 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1745 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
1746 ASSERT_TRUE(data != nullptr);
1747
1748 QuicEncryptedPacket encrypted(data->data(), data->length(), false);
1749 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1750 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1751 ASSERT_TRUE(visitor_.header_.get());
1752 EXPECT_EQ(FramerTestConnectionId(),
1753 visitor_.header_->destination_connection_id);
1754 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1755 EXPECT_EQ(kPacketNumber - 2, visitor_.header_->packet_number);
1756
1757 // Receive a 1 byte packet number.
1758 header.packet_number = kPacketNumber;
1759 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1760 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1761 data = BuildDataPacket(header, frames);
1762 QuicEncryptedPacket encrypted1(data->data(), data->length(), false);
1763 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1764 EXPECT_TRUE(framer_.ProcessPacket(encrypted1));
1765 ASSERT_TRUE(visitor_.header_.get());
1766 EXPECT_EQ(FramerTestConnectionId(),
1767 visitor_.header_->destination_connection_id);
1768 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1769 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1770
1771 // Process a 2 byte packet number 256 packets ago.
1772 header.packet_number = kPacketNumber - 256;
1773 header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
1774 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1775 data = BuildDataPacket(header, frames);
1776 QuicEncryptedPacket encrypted2(data->data(), data->length(), false);
1777 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1778 EXPECT_TRUE(framer_.ProcessPacket(encrypted2));
1779 ASSERT_TRUE(visitor_.header_.get());
1780 EXPECT_EQ(FramerTestConnectionId(),
1781 visitor_.header_->destination_connection_id);
1782 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1783 EXPECT_EQ(kPacketNumber - 256, visitor_.header_->packet_number);
1784
1785 // Process another 1 byte packet number and ensure it works.
1786 header.packet_number = kPacketNumber - 1;
1787 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
1788 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1789 data = BuildDataPacket(header, frames);
1790 QuicEncryptedPacket encrypted3(data->data(), data->length(), false);
1791 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1792 EXPECT_TRUE(framer_.ProcessPacket(encrypted3));
1793 ASSERT_TRUE(visitor_.header_.get());
1794 EXPECT_EQ(FramerTestConnectionId(),
1795 visitor_.header_->destination_connection_id);
1796 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
1797 EXPECT_EQ(kPacketNumber - 1, visitor_.header_->packet_number);
1798 }
1799
TEST_P(QuicFramerTest,PacketWithDiversificationNonce)1800 TEST_P(QuicFramerTest, PacketWithDiversificationNonce) {
1801 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
1802 // clang-format off
1803 unsigned char packet[] = {
1804 // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1805 // number.
1806 0xD0,
1807 // version tag
1808 QUIC_VERSION_BYTES,
1809 // connection_id length
1810 0x05,
1811 // connection_id
1812 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1813 // packet number
1814 0x78,
1815 // nonce
1816 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1817 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1818 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1819 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1820
1821 // frame type (padding)
1822 0x00,
1823 0x00, 0x00, 0x00, 0x00
1824 };
1825
1826 unsigned char packet49[] = {
1827 // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet
1828 // number.
1829 0xD0,
1830 // version tag
1831 QUIC_VERSION_BYTES,
1832 // destination connection ID length
1833 0x00,
1834 // source connection ID length
1835 0x08,
1836 // source connection ID
1837 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1838 // long header packet length
1839 0x26,
1840 // packet number
1841 0x78,
1842 // nonce
1843 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1844 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1845 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1846 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1847
1848 // frame type (padding)
1849 0x00,
1850 0x00, 0x00, 0x00, 0x00
1851 };
1852 // clang-format on
1853
1854 if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
1855 return;
1856 }
1857
1858 unsigned char* p = packet;
1859 size_t p_size = ABSL_ARRAYSIZE(packet);
1860 if (framer_.version().HasLongHeaderLengths()) {
1861 p = packet49;
1862 p_size = ABSL_ARRAYSIZE(packet49);
1863 }
1864
1865 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1866 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1867 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1868 ASSERT_TRUE(visitor_.header_->nonce != nullptr);
1869 for (char i = 0; i < 32; ++i) {
1870 EXPECT_EQ(i, (*visitor_.header_->nonce)[static_cast<size_t>(i)]);
1871 }
1872 EXPECT_EQ(1u, visitor_.padding_frames_.size());
1873 EXPECT_EQ(5, visitor_.padding_frames_[0]->num_padding_bytes);
1874 }
1875
TEST_P(QuicFramerTest,LargePublicFlagWithMismatchedVersions)1876 TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) {
1877 // clang-format off
1878 unsigned char packet[] = {
1879 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
1880 0xD3,
1881 // version tag
1882 'Q', '0', '0', '0',
1883 // connection_id length
1884 0x50,
1885 // connection_id
1886 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1887 // packet number
1888 0x12, 0x34, 0x56, 0x78,
1889
1890 // frame type (padding frame)
1891 0x00,
1892 0x00, 0x00, 0x00, 0x00
1893 };
1894
1895 unsigned char packet49[] = {
1896 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
1897 0xD3,
1898 // version tag
1899 'Q', '0', '0', '0',
1900 // destination connection ID length
1901 0x08,
1902 // destination connection ID
1903 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1904 // source connection ID length
1905 0x00,
1906 // packet number
1907 0x12, 0x34, 0x56, 0x78,
1908
1909 // frame type (padding frame)
1910 0x00,
1911 0x00, 0x00, 0x00, 0x00
1912 };
1913 // clang-format on
1914
1915 unsigned char* p = packet;
1916 size_t p_size = ABSL_ARRAYSIZE(packet);
1917 if (framer_.version().HasLongHeaderLengths()) {
1918 p = packet49;
1919 p_size = ABSL_ARRAYSIZE(packet49);
1920 }
1921 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1922 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1923 EXPECT_THAT(framer_.error(), IsQuicNoError());
1924 ASSERT_TRUE(visitor_.header_.get());
1925 EXPECT_EQ(0, visitor_.frame_count_);
1926 EXPECT_EQ(1, visitor_.version_mismatch_);
1927 }
1928
TEST_P(QuicFramerTest,PaddingFrame)1929 TEST_P(QuicFramerTest, PaddingFrame) {
1930 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
1931 // clang-format off
1932 unsigned char packet[] = {
1933 // type (short header, 4 byte packet number)
1934 0x43,
1935 // connection_id
1936 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1937 // packet number
1938 0x12, 0x34, 0x56, 0x78,
1939
1940 // paddings
1941 0x00, 0x00,
1942 // frame type (stream frame with fin)
1943 0xFF,
1944 // stream id
1945 0x01, 0x02, 0x03, 0x04,
1946 // offset
1947 0x3A, 0x98, 0xFE, 0xDC,
1948 0x32, 0x10, 0x76, 0x54,
1949 // data length
1950 0x00, 0x0c,
1951 // data
1952 'h', 'e', 'l', 'l',
1953 'o', ' ', 'w', 'o',
1954 'r', 'l', 'd', '!',
1955 // paddings
1956 0x00, 0x00,
1957 };
1958
1959 unsigned char packet_ietf[] = {
1960 // type (short header, 4 byte packet number)
1961 0x43,
1962 // connection_id
1963 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
1964 // packet number
1965 0x12, 0x34, 0x56, 0x78,
1966
1967 // paddings
1968 0x00, 0x00,
1969 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
1970 0x08 | 0x01 | 0x02 | 0x04,
1971
1972 // stream id
1973 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
1974 // offset
1975 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
1976 0x32, 0x10, 0x76, 0x54,
1977 // data length
1978 kVarInt62OneByte + 0x0c,
1979 // data
1980 'h', 'e', 'l', 'l',
1981 'o', ' ', 'w', 'o',
1982 'r', 'l', 'd', '!',
1983 // paddings
1984 0x00, 0x00,
1985 };
1986 // clang-format on
1987
1988 unsigned char* p = packet;
1989 size_t p_size = ABSL_ARRAYSIZE(packet);
1990 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
1991 p = packet_ietf;
1992 p_size = ABSL_ARRAYSIZE(packet_ietf);
1993 }
1994
1995 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
1996 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1997 EXPECT_THAT(framer_.error(), IsQuicNoError());
1998 ASSERT_TRUE(visitor_.header_.get());
1999 EXPECT_TRUE(CheckDecryption(
2000 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2001 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2002
2003 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2004 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2005 EXPECT_EQ(2u, visitor_.padding_frames_.size());
2006 EXPECT_EQ(2, visitor_.padding_frames_[0]->num_padding_bytes);
2007 EXPECT_EQ(2, visitor_.padding_frames_[1]->num_padding_bytes);
2008 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2009 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2010 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2011 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2012 }
2013
TEST_P(QuicFramerTest,StreamFrame)2014 TEST_P(QuicFramerTest, StreamFrame) {
2015 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2016 // clang-format off
2017 PacketFragments packet = {
2018 // type (short header, 4 byte packet number)
2019 {"",
2020 {0x43}},
2021 // connection_id
2022 {"",
2023 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2024 // packet number
2025 {"",
2026 {0x12, 0x34, 0x56, 0x78}},
2027 // frame type (stream frame with fin)
2028 {"",
2029 {0xFF}},
2030 // stream id
2031 {"Unable to read stream_id.",
2032 {0x01, 0x02, 0x03, 0x04}},
2033 // offset
2034 {"Unable to read offset.",
2035 {0x3A, 0x98, 0xFE, 0xDC,
2036 0x32, 0x10, 0x76, 0x54}},
2037 {"Unable to read frame data.",
2038 {
2039 // data length
2040 0x00, 0x0c,
2041 // data
2042 'h', 'e', 'l', 'l',
2043 'o', ' ', 'w', 'o',
2044 'r', 'l', 'd', '!'}},
2045 };
2046
2047 PacketFragments packet_ietf = {
2048 // type (short header, 4 byte packet number)
2049 {"",
2050 {0x43}},
2051 // connection_id
2052 {"",
2053 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2054 // packet number
2055 {"",
2056 {0x12, 0x34, 0x56, 0x78}},
2057 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
2058 {"",
2059 { 0x08 | 0x01 | 0x02 | 0x04 }},
2060 // stream id
2061 {"Unable to read IETF_STREAM frame stream id/count.",
2062 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
2063 // offset
2064 {"Unable to read stream data offset.",
2065 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2066 0x32, 0x10, 0x76, 0x54}},
2067 // data length
2068 {"Unable to read stream data length.",
2069 {kVarInt62OneByte + 0x0c}},
2070 // data
2071 {"Unable to read frame data.",
2072 { 'h', 'e', 'l', 'l',
2073 'o', ' ', 'w', 'o',
2074 'r', 'l', 'd', '!'}},
2075 };
2076 // clang-format on
2077
2078 PacketFragments& fragments =
2079 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2080 : packet;
2081 std::unique_ptr<QuicEncryptedPacket> encrypted(
2082 AssemblePacketFromFragments(fragments));
2083 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2084
2085 EXPECT_THAT(framer_.error(), IsQuicNoError());
2086 ASSERT_TRUE(visitor_.header_.get());
2087 EXPECT_TRUE(CheckDecryption(
2088 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2089 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2090
2091 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2092 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2093 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2094 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2095 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2096 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2097
2098 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2099 }
2100
2101 // Test an empty (no data) stream frame.
TEST_P(QuicFramerTest,EmptyStreamFrame)2102 TEST_P(QuicFramerTest, EmptyStreamFrame) {
2103 // Only the IETF QUIC spec explicitly says that empty
2104 // stream frames are supported.
2105 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2106 return;
2107 }
2108 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2109 // clang-format off
2110 PacketFragments packet = {
2111 // type (short header, 4 byte packet number)
2112 {"",
2113 {0x43}},
2114 // connection_id
2115 {"",
2116 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2117 // packet number
2118 {"",
2119 {0x12, 0x34, 0x56, 0x78}},
2120 // frame type - IETF_STREAM with FIN, LEN, and OFFSET bits set.
2121 {"",
2122 { 0x08 | 0x01 | 0x02 | 0x04 }},
2123 // stream id
2124 {"Unable to read IETF_STREAM frame stream id/count.",
2125 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
2126 // offset
2127 {"Unable to read stream data offset.",
2128 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2129 0x32, 0x10, 0x76, 0x54}},
2130 // data length
2131 {"Unable to read stream data length.",
2132 {kVarInt62OneByte + 0x00}},
2133 };
2134 // clang-format on
2135
2136 std::unique_ptr<QuicEncryptedPacket> encrypted(
2137 AssemblePacketFromFragments(packet));
2138 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2139
2140 EXPECT_THAT(framer_.error(), IsQuicNoError());
2141 ASSERT_TRUE(visitor_.header_.get());
2142 EXPECT_TRUE(CheckDecryption(
2143 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2144 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2145
2146 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2147 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2148 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
2149 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2150 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2151 EXPECT_EQ(visitor_.stream_frames_[0].get()->data_length, 0u);
2152
2153 CheckFramingBoundaries(packet, QUIC_INVALID_STREAM_DATA);
2154 }
2155
TEST_P(QuicFramerTest,MissingDiversificationNonce)2156 TEST_P(QuicFramerTest, MissingDiversificationNonce) {
2157 if (framer_.version().handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
2158 // TLS does not use diversification nonces.
2159 return;
2160 }
2161 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
2162 decrypter_ = new test::TestDecrypter();
2163 if (framer_.version().KnowsWhichDecrypterToUse()) {
2164 framer_.InstallDecrypter(
2165 ENCRYPTION_INITIAL,
2166 std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
2167 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
2168 std::unique_ptr<QuicDecrypter>(decrypter_));
2169 } else {
2170 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
2171 Perspective::IS_CLIENT));
2172 framer_.SetAlternativeDecrypter(
2173 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
2174 }
2175
2176 // clang-format off
2177 unsigned char packet[] = {
2178 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2179 0xD3,
2180 // version tag
2181 QUIC_VERSION_BYTES,
2182 // connection_id length
2183 0x05,
2184 // connection_id
2185 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2186 // packet number
2187 0x12, 0x34, 0x56, 0x78,
2188 // padding frame
2189 0x00,
2190 };
2191
2192 unsigned char packet49[] = {
2193 // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number)
2194 0xD3,
2195 // version tag
2196 QUIC_VERSION_BYTES,
2197 // destination connection ID length
2198 0x00,
2199 // source connection ID length
2200 0x08,
2201 // source connection ID
2202 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2203 // IETF long header payload length
2204 0x05,
2205 // packet number
2206 0x12, 0x34, 0x56, 0x78,
2207 // padding frame
2208 0x00,
2209 };
2210 // clang-format on
2211
2212 unsigned char* p = packet;
2213 size_t p_length = ABSL_ARRAYSIZE(packet);
2214 if (framer_.version().HasLongHeaderLengths()) {
2215 p = packet49;
2216 p_length = ABSL_ARRAYSIZE(packet49);
2217 }
2218 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
2219 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
2220 if (framer_.version().HasHeaderProtection()) {
2221 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
2222 EXPECT_EQ("Unable to decrypt ENCRYPTION_ZERO_RTT header protection.",
2223 framer_.detailed_error());
2224 } else {
2225 // Cannot read diversification nonce.
2226 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
2227 EXPECT_EQ("Unable to read nonce.", framer_.detailed_error());
2228 }
2229 }
2230
TEST_P(QuicFramerTest,StreamFrame2ByteStreamId)2231 TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) {
2232 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2233 // clang-format off
2234 PacketFragments packet = {
2235 // type (short header, 4 byte packet number)
2236 {"",
2237 {0x43}},
2238 // connection_id
2239 {"",
2240 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2241 // packet number
2242 {"",
2243 {0x12, 0x34, 0x56, 0x78}},
2244 // frame type (stream frame with fin)
2245 {"",
2246 {0xFD}},
2247 // stream id
2248 {"Unable to read stream_id.",
2249 {0x03, 0x04}},
2250 // offset
2251 {"Unable to read offset.",
2252 {0x3A, 0x98, 0xFE, 0xDC,
2253 0x32, 0x10, 0x76, 0x54}},
2254 {"Unable to read frame data.",
2255 {
2256 // data length
2257 0x00, 0x0c,
2258 // data
2259 'h', 'e', 'l', 'l',
2260 'o', ' ', 'w', 'o',
2261 'r', 'l', 'd', '!'}},
2262 };
2263
2264 PacketFragments packet_ietf = {
2265 // type (short header, 4 byte packet number)
2266 {"",
2267 {0x43}},
2268 // connection_id
2269 {"",
2270 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2271 // packet number
2272 {"",
2273 {0x12, 0x34, 0x56, 0x78}},
2274 // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2275 {"",
2276 {0x08 | 0x01 | 0x02 | 0x04}},
2277 // stream id
2278 {"Unable to read IETF_STREAM frame stream id/count.",
2279 {kVarInt62TwoBytes + 0x03, 0x04}},
2280 // offset
2281 {"Unable to read stream data offset.",
2282 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2283 0x32, 0x10, 0x76, 0x54}},
2284 // data length
2285 {"Unable to read stream data length.",
2286 {kVarInt62OneByte + 0x0c}},
2287 // data
2288 {"Unable to read frame data.",
2289 { 'h', 'e', 'l', 'l',
2290 'o', ' ', 'w', 'o',
2291 'r', 'l', 'd', '!'}},
2292 };
2293 // clang-format on
2294
2295 PacketFragments& fragments =
2296 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2297 : packet;
2298 std::unique_ptr<QuicEncryptedPacket> encrypted(
2299 AssemblePacketFromFragments(fragments));
2300 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2301
2302 EXPECT_THAT(framer_.error(), IsQuicNoError());
2303 ASSERT_TRUE(visitor_.header_.get());
2304 EXPECT_TRUE(CheckDecryption(
2305 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2306 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2307
2308 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2309 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2310 // Stream ID should be the last 2 bytes of kStreamId.
2311 EXPECT_EQ(0x0000FFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2312 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2313 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2314 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2315
2316 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2317 }
2318
TEST_P(QuicFramerTest,StreamFrame1ByteStreamId)2319 TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) {
2320 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2321 // clang-format off
2322 PacketFragments packet = {
2323 // type (short header, 4 byte packet number)
2324 {"",
2325 {0x43}},
2326 // connection_id
2327 {"",
2328 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2329 // packet number
2330 {"",
2331 {0x12, 0x34, 0x56, 0x78}},
2332 // frame type (stream frame with fin)
2333 {"",
2334 {0xFC}},
2335 // stream id
2336 {"Unable to read stream_id.",
2337 {0x04}},
2338 // offset
2339 {"Unable to read offset.",
2340 {0x3A, 0x98, 0xFE, 0xDC,
2341 0x32, 0x10, 0x76, 0x54}},
2342 {"Unable to read frame data.",
2343 {
2344 // data length
2345 0x00, 0x0c,
2346 // data
2347 'h', 'e', 'l', 'l',
2348 'o', ' ', 'w', 'o',
2349 'r', 'l', 'd', '!'}},
2350 };
2351
2352 PacketFragments packet_ietf = {
2353 // type (short header, 4 byte packet number)
2354 {"",
2355 {0x43}},
2356 // connection_id
2357 {"",
2358 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2359 // packet number
2360 {"",
2361 {0x12, 0x34, 0x56, 0x78}},
2362 // frame type (IETF_STREAM frame with LEN, FIN, and OFFSET bits set)
2363 {"",
2364 {0x08 | 0x01 | 0x02 | 0x04}},
2365 // stream id
2366 {"Unable to read IETF_STREAM frame stream id/count.",
2367 {kVarInt62OneByte + 0x04}},
2368 // offset
2369 {"Unable to read stream data offset.",
2370 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2371 0x32, 0x10, 0x76, 0x54}},
2372 // data length
2373 {"Unable to read stream data length.",
2374 {kVarInt62OneByte + 0x0c}},
2375 // data
2376 {"Unable to read frame data.",
2377 { 'h', 'e', 'l', 'l',
2378 'o', ' ', 'w', 'o',
2379 'r', 'l', 'd', '!'}},
2380 };
2381 // clang-format on
2382
2383 PacketFragments& fragments =
2384 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2385 : packet;
2386 std::unique_ptr<QuicEncryptedPacket> encrypted(
2387 AssemblePacketFromFragments(fragments));
2388 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2389
2390 EXPECT_THAT(framer_.error(), IsQuicNoError());
2391 ASSERT_TRUE(visitor_.header_.get());
2392 EXPECT_TRUE(CheckDecryption(
2393 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2394 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2395
2396 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2397 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2398 // Stream ID should be the last 1 byte of kStreamId.
2399 EXPECT_EQ(0x000000FF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2400 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2401 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2402 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2403
2404 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
2405 }
2406
TEST_P(QuicFramerTest,StreamFrameWithVersion)2407 TEST_P(QuicFramerTest, StreamFrameWithVersion) {
2408 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
2409 // clang-format off
2410 PacketFragments packet = {
2411 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2412 // 4-byte packet number)
2413 {"",
2414 {0xD3}},
2415 // version tag
2416 {"",
2417 {QUIC_VERSION_BYTES}},
2418 // connection_id length
2419 {"",
2420 {0x50}},
2421 // connection_id
2422 {"",
2423 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2424 // packet number
2425 {"",
2426 {0x12, 0x34, 0x56, 0x78}},
2427 // frame type (stream frame with fin)
2428 {"",
2429 {0xFE}},
2430 // stream id
2431 {"Unable to read stream_id.",
2432 {0x02, 0x03, 0x04}},
2433 // offset
2434 {"Unable to read offset.",
2435 {0x3A, 0x98, 0xFE, 0xDC,
2436 0x32, 0x10, 0x76, 0x54}},
2437 {"Unable to read frame data.",
2438 {
2439 // data length
2440 0x00, 0x0c,
2441 // data
2442 'h', 'e', 'l', 'l',
2443 'o', ' ', 'w', 'o',
2444 'r', 'l', 'd', '!'}},
2445 };
2446
2447 PacketFragments packet49 = {
2448 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2449 // 4-byte packet number)
2450 {"",
2451 {0xD3}},
2452 // version tag
2453 {"",
2454 {QUIC_VERSION_BYTES}},
2455 // destination connection ID length
2456 {"",
2457 {0x08}},
2458 // destination connection ID
2459 {"",
2460 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2461 // source connection ID length
2462 {"",
2463 {0x00}},
2464 // long header packet length
2465 {"",
2466 {0x1E}},
2467 // packet number
2468 {"",
2469 {0x12, 0x34, 0x56, 0x78}},
2470 // frame type (stream frame with fin)
2471 {"",
2472 {0xFE}},
2473 // stream id
2474 {"Long header payload length longer than packet.",
2475 {0x02, 0x03, 0x04}},
2476 // offset
2477 {"Long header payload length longer than packet.",
2478 {0x3A, 0x98, 0xFE, 0xDC,
2479 0x32, 0x10, 0x76, 0x54}},
2480 {"Long header payload length longer than packet.",
2481 {
2482 // data length
2483 0x00, 0x0c,
2484 // data
2485 'h', 'e', 'l', 'l',
2486 'o', ' ', 'w', 'o',
2487 'r', 'l', 'd', '!'}},
2488 };
2489
2490 PacketFragments packet_ietf = {
2491 // public flags (long header with packet type ZERO_RTT_PROTECTED and
2492 // 4-byte packet number)
2493 {"",
2494 {0xD3}},
2495 // version tag
2496 {"",
2497 {QUIC_VERSION_BYTES}},
2498 // destination connection ID length
2499 {"",
2500 {0x08}},
2501 // destination connection ID
2502 {"",
2503 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2504 // source connection ID length
2505 {"",
2506 {0x00}},
2507 // long header packet length
2508 {"",
2509 {0x1E}},
2510 // packet number
2511 {"",
2512 {0x12, 0x34, 0x56, 0x78}},
2513 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
2514 {"",
2515 {0x08 | 0x01 | 0x02 | 0x04}},
2516 // stream id
2517 {"Long header payload length longer than packet.",
2518 {kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04}},
2519 // offset
2520 {"Long header payload length longer than packet.",
2521 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2522 0x32, 0x10, 0x76, 0x54}},
2523 // data length
2524 {"Long header payload length longer than packet.",
2525 {kVarInt62OneByte + 0x0c}},
2526 // data
2527 {"Long header payload length longer than packet.",
2528 { 'h', 'e', 'l', 'l',
2529 'o', ' ', 'w', 'o',
2530 'r', 'l', 'd', '!'}},
2531 };
2532 // clang-format on
2533
2534 quiche::QuicheVariableLengthIntegerLength retry_token_length_length =
2535 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
2536 size_t retry_token_length = 0;
2537 quiche::QuicheVariableLengthIntegerLength length_length =
2538 QuicVersionHasLongHeaderLengths(framer_.transport_version())
2539 ? quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1
2540 : quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
2541
2542 ReviseFirstByteByVersion(packet_ietf);
2543 PacketFragments& fragments =
2544 VersionHasIetfQuicFrames(framer_.transport_version())
2545 ? packet_ietf
2546 : (framer_.version().HasLongHeaderLengths() ? packet49 : packet);
2547 std::unique_ptr<QuicEncryptedPacket> encrypted(
2548 AssemblePacketFromFragments(fragments));
2549 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2550
2551 EXPECT_THAT(framer_.error(), IsQuicNoError());
2552 ASSERT_TRUE(visitor_.header_.get());
2553 EXPECT_TRUE(CheckDecryption(
2554 *encrypted, kIncludeVersion, !kIncludeDiversificationNonce,
2555 kPacket8ByteConnectionId, kPacket0ByteConnectionId,
2556 retry_token_length_length, retry_token_length, length_length));
2557
2558 ASSERT_EQ(1u, visitor_.stream_frames_.size());
2559 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2560 // Stream ID should be the last 3 bytes of kStreamId.
2561 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
2562 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
2563 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
2564 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
2565
2566 CheckFramingBoundaries(fragments, framer_.version().HasLongHeaderLengths()
2567 ? QUIC_INVALID_PACKET_HEADER
2568 : QUIC_INVALID_STREAM_DATA);
2569 }
2570
TEST_P(QuicFramerTest,RejectPacket)2571 TEST_P(QuicFramerTest, RejectPacket) {
2572 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2573 visitor_.accept_packet_ = false;
2574
2575 // clang-format off
2576 unsigned char packet[] = {
2577 // type (short header, 4 byte packet number)
2578 0x43,
2579 // connection_id
2580 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2581 // packet number
2582 0x12, 0x34, 0x56, 0x78,
2583
2584 // frame type (STREAM Frame with FIN, LEN, and OFFSET bits set)
2585 0x10 | 0x01 | 0x02 | 0x04,
2586 // stream id
2587 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
2588 // offset
2589 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
2590 0x32, 0x10, 0x76, 0x54,
2591 // data length
2592 kVarInt62OneByte + 0x0c,
2593 // data
2594 'h', 'e', 'l', 'l',
2595 'o', ' ', 'w', 'o',
2596 'r', 'l', 'd', '!',
2597 };
2598 // clang-format on
2599
2600 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
2601 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2602
2603 EXPECT_THAT(framer_.error(), IsQuicNoError());
2604 ASSERT_TRUE(visitor_.header_.get());
2605 EXPECT_TRUE(CheckDecryption(
2606 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2607 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2608
2609 ASSERT_EQ(0u, visitor_.stream_frames_.size());
2610 EXPECT_EQ(0u, visitor_.ack_frames_.size());
2611 }
2612
TEST_P(QuicFramerTest,RejectPublicHeader)2613 TEST_P(QuicFramerTest, RejectPublicHeader) {
2614 visitor_.accept_public_header_ = false;
2615
2616 // clang-format off
2617 unsigned char packet[] = {
2618 // type (short header, 1 byte packet number)
2619 0x40,
2620 // connection_id
2621 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
2622 // packet number
2623 0x01,
2624 };
2625 // clang-format on
2626
2627 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
2628 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2629
2630 EXPECT_THAT(framer_.error(), IsQuicNoError());
2631 ASSERT_TRUE(visitor_.header_.get());
2632 EXPECT_FALSE(visitor_.header_->packet_number.IsInitialized());
2633 }
2634
TEST_P(QuicFramerTest,AckFrameOneAckBlock)2635 TEST_P(QuicFramerTest, AckFrameOneAckBlock) {
2636 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2637 // clang-format off
2638 PacketFragments packet = {
2639 // type (short packet, 4 byte packet number)
2640 {"",
2641 {0x43}},
2642 // connection_id
2643 {"",
2644 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2645 // packet number
2646 {"",
2647 {0x12, 0x34, 0x56, 0x78}},
2648 // frame type (ack frame)
2649 // (one ack block, 2 byte largest observed, 2 byte block length)
2650 {"",
2651 {0x45}},
2652 // largest acked
2653 {"Unable to read largest acked.",
2654 {0x12, 0x34}},
2655 // Zero delta time.
2656 {"Unable to read ack delay time.",
2657 {0x00, 0x00}},
2658 // first ack block length.
2659 {"Unable to read first ack block length.",
2660 {0x12, 0x34}},
2661 // num timestamps.
2662 {"Unable to read num received packets.",
2663 {0x00}}
2664 };
2665
2666 PacketFragments packet_ietf = {
2667 // type (short packet, 4 byte packet number)
2668 {"",
2669 {0x43}},
2670 // connection_id
2671 {"",
2672 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2673 // packet number
2674 {"",
2675 {0x12, 0x34, 0x56, 0x78}},
2676 // frame type (IETF_ACK)
2677 // (one ack block, 2 byte largest observed, 2 byte block length)
2678 // IETF-Quic ignores the bit-fields in the ack type, all of
2679 // that information is encoded elsewhere in the frame.
2680 {"",
2681 {0x02}},
2682 // largest acked
2683 {"Unable to read largest acked.",
2684 {kVarInt62TwoBytes + 0x12, 0x34}},
2685 // Zero delta time.
2686 {"Unable to read ack delay time.",
2687 {kVarInt62OneByte + 0x00}},
2688 // Ack block count (0 -- no blocks after the first)
2689 {"Unable to read ack block count.",
2690 {kVarInt62OneByte + 0x00}},
2691 // first ack block length - 1.
2692 // IETF Quic defines the ack block's value as the "number of
2693 // packets that preceed the largest packet number in the block"
2694 // which for the 1st ack block is the largest acked field,
2695 // above. This means that if we are acking just packet 0x1234
2696 // then the 1st ack block will be 0.
2697 {"Unable to read first ack block length.",
2698 {kVarInt62TwoBytes + 0x12, 0x33}}
2699 };
2700 // clang-format on
2701
2702 PacketFragments& fragments =
2703 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2704 : packet;
2705 std::unique_ptr<QuicEncryptedPacket> encrypted(
2706 AssemblePacketFromFragments(fragments));
2707 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
2708
2709 EXPECT_THAT(framer_.error(), IsQuicNoError());
2710 ASSERT_TRUE(visitor_.header_.get());
2711 EXPECT_TRUE(CheckDecryption(
2712 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
2713 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
2714
2715 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2716 ASSERT_EQ(1u, visitor_.ack_frames_.size());
2717 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
2718 EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
2719 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
2720
2721 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
2722 }
2723
2724 // This test checks that the ack frame processor correctly identifies
2725 // and handles the case where the first ack block is larger than the
2726 // largest_acked packet.
TEST_P(QuicFramerTest,FirstAckFrameUnderflow)2727 TEST_P(QuicFramerTest, FirstAckFrameUnderflow) {
2728 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2729 // clang-format off
2730 PacketFragments packet = {
2731 // type (short header, 4 byte packet number)
2732 {"",
2733 {0x43}},
2734 // connection_id
2735 {"",
2736 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2737 // packet number
2738 {"",
2739 {0x12, 0x34, 0x56, 0x78}},
2740 // frame type (ack frame)
2741 // (one ack block, 2 byte largest observed, 2 byte block length)
2742 {"",
2743 {0x45}},
2744 // largest acked
2745 {"Unable to read largest acked.",
2746 {0x12, 0x34}},
2747 // Zero delta time.
2748 {"Unable to read ack delay time.",
2749 {0x00, 0x00}},
2750 // first ack block length.
2751 {"Unable to read first ack block length.",
2752 {0x88, 0x88}},
2753 // num timestamps.
2754 {"Underflow with first ack block length 34952 largest acked is 4660.",
2755 {0x00}}
2756 };
2757
2758 PacketFragments packet_ietf = {
2759 // type (short header, 4 byte packet number)
2760 {"",
2761 {0x43}},
2762 // connection_id
2763 {"",
2764 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2765 // packet number
2766 {"",
2767 {0x12, 0x34, 0x56, 0x78}},
2768 // frame type (IETF_ACK)
2769 {"",
2770 {0x02}},
2771 // largest acked
2772 {"Unable to read largest acked.",
2773 {kVarInt62TwoBytes + 0x12, 0x34}},
2774 // Zero delta time.
2775 {"Unable to read ack delay time.",
2776 {kVarInt62OneByte + 0x00}},
2777 // Ack block count (0 -- no blocks after the first)
2778 {"Unable to read ack block count.",
2779 {kVarInt62OneByte + 0x00}},
2780 // first ack block length.
2781 {"Unable to read first ack block length.",
2782 {kVarInt62TwoBytes + 0x28, 0x88}}
2783 };
2784 // clang-format on
2785
2786 PacketFragments& fragments =
2787 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
2788 : packet;
2789 std::unique_ptr<QuicEncryptedPacket> encrypted(
2790 AssemblePacketFromFragments(fragments));
2791 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
2792 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
2793 }
2794
2795 // This test checks that the ack frame processor correctly identifies
2796 // and handles the case where the third ack block's gap is larger than the
2797 // available space in the ack range.
TEST_P(QuicFramerTest,ThirdAckBlockUnderflowGap)2798 TEST_P(QuicFramerTest, ThirdAckBlockUnderflowGap) {
2799 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2800 // Test originally written for development of IETF QUIC. The test may
2801 // also apply to Google QUIC. If so, the test should be extended to
2802 // include Google QUIC (frame formats, etc). See b/141858819.
2803 return;
2804 }
2805 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2806 // clang-format off
2807 PacketFragments packet_ietf = {
2808 // type (short header, 4 byte packet number)
2809 {"",
2810 {0x43}},
2811 // connection_id
2812 {"",
2813 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2814 // packet number
2815 {"",
2816 {0x12, 0x34, 0x56, 0x78}},
2817 // frame type (IETF_ACK frame)
2818 {"",
2819 {0x02}},
2820 // largest acked
2821 {"Unable to read largest acked.",
2822 {kVarInt62OneByte + 63}},
2823 // Zero delta time.
2824 {"Unable to read ack delay time.",
2825 {kVarInt62OneByte + 0x00}},
2826 // Ack block count (2 -- 2 blocks after the first)
2827 {"Unable to read ack block count.",
2828 {kVarInt62OneByte + 0x02}},
2829 // first ack block length.
2830 {"Unable to read first ack block length.",
2831 {kVarInt62OneByte + 13}}, // Ack 14 packets, range 50..63 (inclusive)
2832
2833 {"Unable to read gap block value.",
2834 {kVarInt62OneByte + 9}}, // Gap 10 packets, 40..49 (inclusive)
2835 {"Unable to read ack block value.",
2836 {kVarInt62OneByte + 9}}, // Ack 10 packets, 30..39 (inclusive)
2837 {"Unable to read gap block value.",
2838 {kVarInt62OneByte + 29}}, // A gap of 30 packets (0..29 inclusive)
2839 // should be too big, leaving no room
2840 // for the ack.
2841 {"Underflow with gap block length 30 previous ack block start is 30.",
2842 {kVarInt62OneByte + 10}}, // Don't care
2843 };
2844 // clang-format on
2845
2846 std::unique_ptr<QuicEncryptedPacket> encrypted(
2847 AssemblePacketFromFragments(packet_ietf));
2848 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
2849 EXPECT_EQ(
2850 framer_.detailed_error(),
2851 "Underflow with gap block length 30 previous ack block start is 30.");
2852 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
2853 }
2854
2855 // This test checks that the ack frame processor correctly identifies
2856 // and handles the case where the third ack block's length is larger than the
2857 // available space in the ack range.
TEST_P(QuicFramerTest,ThirdAckBlockUnderflowAck)2858 TEST_P(QuicFramerTest, ThirdAckBlockUnderflowAck) {
2859 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2860 // Test originally written for development of IETF QUIC. The test may
2861 // also apply to Google QUIC. If so, the test should be extended to
2862 // include Google QUIC (frame formats, etc). See b/141858819.
2863 return;
2864 }
2865 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2866 // clang-format off
2867 PacketFragments packet_ietf = {
2868 // type (short header, 4 byte packet number)
2869 {"",
2870 {0x43}},
2871 // connection_id
2872 {"",
2873 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2874 // packet number
2875 {"",
2876 {0x12, 0x34, 0x56, 0x78}},
2877 // frame type (IETF_ACK frame)
2878 {"",
2879 {0x02}},
2880 // largest acked
2881 {"Unable to read largest acked.",
2882 {kVarInt62OneByte + 63}},
2883 // Zero delta time.
2884 {"Unable to read ack delay time.",
2885 {kVarInt62OneByte + 0x00}},
2886 // Ack block count (2 -- 2 blocks after the first)
2887 {"Unable to read ack block count.",
2888 {kVarInt62OneByte + 0x02}},
2889 // first ack block length.
2890 {"Unable to read first ack block length.",
2891 {kVarInt62OneByte + 13}}, // only 50 packet numbers "left"
2892
2893 {"Unable to read gap block value.",
2894 {kVarInt62OneByte + 10}}, // Only 40 packet numbers left
2895 {"Unable to read ack block value.",
2896 {kVarInt62OneByte + 10}}, // only 30 packet numbers left.
2897 {"Unable to read gap block value.",
2898 {kVarInt62OneByte + 1}}, // Gap is OK, 29 packet numbers left
2899 {"Unable to read ack block value.",
2900 {kVarInt62OneByte + 30}}, // Use up all 30, should be an error
2901 };
2902 // clang-format on
2903
2904 std::unique_ptr<QuicEncryptedPacket> encrypted(
2905 AssemblePacketFromFragments(packet_ietf));
2906 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
2907 EXPECT_EQ(framer_.detailed_error(),
2908 "Underflow with ack block length 31 latest ack block end is 25.");
2909 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
2910 }
2911
2912 // Tests a variety of ack block wrap scenarios. For example, if the
2913 // N-1th block causes packet 0 to be acked, then a gap would wrap
2914 // around to 0x3fffffff ffffffff... Make sure we detect this
2915 // condition.
TEST_P(QuicFramerTest,AckBlockUnderflowGapWrap)2916 TEST_P(QuicFramerTest, AckBlockUnderflowGapWrap) {
2917 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2918 // Test originally written for development of IETF QUIC. The test may
2919 // also apply to Google QUIC. If so, the test should be extended to
2920 // include Google QUIC (frame formats, etc). See b/141858819.
2921 return;
2922 }
2923 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2924 // clang-format off
2925 PacketFragments packet_ietf = {
2926 // type (short header, 4 byte packet number)
2927 {"",
2928 {0x43}},
2929 // connection_id
2930 {"",
2931 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2932 // packet number
2933 {"",
2934 {0x12, 0x34, 0x56, 0x78}},
2935 // frame type (IETF_ACK frame)
2936 {"",
2937 {0x02}},
2938 // largest acked
2939 {"Unable to read largest acked.",
2940 {kVarInt62OneByte + 10}},
2941 // Zero delta time.
2942 {"Unable to read ack delay time.",
2943 {kVarInt62OneByte + 0x00}},
2944 // Ack block count (1 -- 1 blocks after the first)
2945 {"Unable to read ack block count.",
2946 {kVarInt62OneByte + 1}},
2947 // first ack block length.
2948 {"Unable to read first ack block length.",
2949 {kVarInt62OneByte + 9}}, // Ack packets 1..10 (inclusive)
2950
2951 {"Unable to read gap block value.",
2952 {kVarInt62OneByte + 1}}, // Gap of 2 packets (-1...0), should wrap
2953 {"Underflow with gap block length 2 previous ack block start is 1.",
2954 {kVarInt62OneByte + 9}}, // irrelevant
2955 };
2956 // clang-format on
2957
2958 std::unique_ptr<QuicEncryptedPacket> encrypted(
2959 AssemblePacketFromFragments(packet_ietf));
2960 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
2961 EXPECT_EQ(framer_.detailed_error(),
2962 "Underflow with gap block length 2 previous ack block start is 1.");
2963 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
2964 }
2965
2966 // As AckBlockUnderflowGapWrap, but in this test, it's the ack
2967 // component of the ack-block that causes the wrap, not the gap.
TEST_P(QuicFramerTest,AckBlockUnderflowAckWrap)2968 TEST_P(QuicFramerTest, AckBlockUnderflowAckWrap) {
2969 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
2970 // Test originally written for development of IETF QUIC. The test may
2971 // also apply to Google QUIC. If so, the test should be extended to
2972 // include Google QUIC (frame formats, etc). See b/141858819.
2973 return;
2974 }
2975 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
2976 // clang-format off
2977 PacketFragments packet_ietf = {
2978 // type (short header, 4 byte packet number)
2979 {"",
2980 {0x43}},
2981 // connection_id
2982 {"",
2983 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
2984 // packet number
2985 {"",
2986 {0x12, 0x34, 0x56, 0x78}},
2987 // frame type (IETF_ACK frame)
2988 {"",
2989 {0x02}},
2990 // largest acked
2991 {"Unable to read largest acked.",
2992 {kVarInt62OneByte + 10}},
2993 // Zero delta time.
2994 {"Unable to read ack delay time.",
2995 {kVarInt62OneByte + 0x00}},
2996 // Ack block count (1 -- 1 blocks after the first)
2997 {"Unable to read ack block count.",
2998 {kVarInt62OneByte + 1}},
2999 // first ack block length.
3000 {"Unable to read first ack block length.",
3001 {kVarInt62OneByte + 6}}, // Ack packets 4..10 (inclusive)
3002
3003 {"Unable to read gap block value.",
3004 {kVarInt62OneByte + 1}}, // Gap of 2 packets (2..3)
3005 {"Unable to read ack block value.",
3006 {kVarInt62OneByte + 9}}, // Should wrap.
3007 };
3008 // clang-format on
3009
3010 std::unique_ptr<QuicEncryptedPacket> encrypted(
3011 AssemblePacketFromFragments(packet_ietf));
3012 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3013 EXPECT_EQ(framer_.detailed_error(),
3014 "Underflow with ack block length 10 latest ack block end is 1.");
3015 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
3016 }
3017
3018 // An ack block that acks the entire range, 1...0x3fffffffffffffff
TEST_P(QuicFramerTest,AckBlockAcksEverything)3019 TEST_P(QuicFramerTest, AckBlockAcksEverything) {
3020 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3021 // Test originally written for development of IETF QUIC. The test may
3022 // also apply to Google QUIC. If so, the test should be extended to
3023 // include Google QUIC (frame formats, etc). See b/141858819.
3024 return;
3025 }
3026 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3027 // clang-format off
3028 PacketFragments packet_ietf = {
3029 // type (short header, 4 byte packet number)
3030 {"",
3031 {0x43}},
3032 // connection_id
3033 {"",
3034 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3035 // packet number
3036 {"",
3037 {0x12, 0x34, 0x56, 0x78}},
3038 // frame type (IETF_ACK frame)
3039 {"",
3040 {0x02}},
3041 // largest acked
3042 {"Unable to read largest acked.",
3043 {kVarInt62EightBytes + 0x3f, 0xff, 0xff, 0xff,
3044 0xff, 0xff, 0xff, 0xff}},
3045 // Zero delta time.
3046 {"Unable to read ack delay time.",
3047 {kVarInt62OneByte + 0x00}},
3048 // Ack block count No additional blocks
3049 {"Unable to read ack block count.",
3050 {kVarInt62OneByte + 0}},
3051 // first ack block length.
3052 {"Unable to read first ack block length.",
3053 {kVarInt62EightBytes + 0x3f, 0xff, 0xff, 0xff,
3054 0xff, 0xff, 0xff, 0xfe}},
3055 };
3056 // clang-format on
3057
3058 std::unique_ptr<QuicEncryptedPacket> encrypted(
3059 AssemblePacketFromFragments(packet_ietf));
3060 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3061 EXPECT_EQ(1u, visitor_.ack_frames_.size());
3062 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3063 EXPECT_EQ(1u, frame.packets.NumIntervals());
3064 EXPECT_EQ(kLargestIetfLargestObserved, LargestAcked(frame));
3065 EXPECT_EQ(kLargestIetfLargestObserved.ToUint64(),
3066 frame.packets.NumPacketsSlow());
3067 }
3068
3069 // This test looks for a malformed ack where
3070 // - There is a largest-acked value (that is, the frame is acking
3071 // something,
3072 // - But the length of the first ack block is 0 saying that no frames
3073 // are being acked with the largest-acked value or there are no
3074 // additional ack blocks.
3075 //
TEST_P(QuicFramerTest,AckFrameFirstAckBlockLengthZero)3076 TEST_P(QuicFramerTest, AckFrameFirstAckBlockLengthZero) {
3077 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3078 // Not applicable to version 99 -- first ack block contains the
3079 // number of packets that preceed the largest_acked packet.
3080 // A value of 0 means no packets preceed --- that the block's
3081 // length is 1. Therefore the condition that this test checks can
3082 // not arise.
3083 return;
3084 }
3085 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3086
3087 // clang-format off
3088 PacketFragments packet = {
3089 // type (short header, 4 byte packet number)
3090 {"",
3091 { 0x43 }},
3092 // connection_id
3093 {"",
3094 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3095 // packet number
3096 {"",
3097 { 0x12, 0x34, 0x56, 0x78 }},
3098
3099 // frame type (ack frame)
3100 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3101 {"",
3102 { 0x65 }},
3103 // largest acked
3104 {"Unable to read largest acked.",
3105 { 0x12, 0x34 }},
3106 // Zero delta time.
3107 {"Unable to read ack delay time.",
3108 { 0x00, 0x00 }},
3109 // num ack blocks ranges.
3110 {"Unable to read num of ack blocks.",
3111 { 0x01 }},
3112 // first ack block length.
3113 {"Unable to read first ack block length.",
3114 { 0x00, 0x00 }},
3115 // gap to next block.
3116 { "First block length is zero.",
3117 { 0x01 }},
3118 // ack block length.
3119 { "First block length is zero.",
3120 { 0x0e, 0xaf }},
3121 // Number of timestamps.
3122 { "First block length is zero.",
3123 { 0x00 }},
3124 };
3125
3126 // clang-format on
3127 std::unique_ptr<QuicEncryptedPacket> encrypted(
3128 AssemblePacketFromFragments(packet));
3129
3130 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3131 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_ACK_DATA));
3132
3133 ASSERT_TRUE(visitor_.header_.get());
3134 EXPECT_TRUE(CheckDecryption(
3135 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3136 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3137
3138 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3139 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3140
3141 CheckFramingBoundaries(packet, QUIC_INVALID_ACK_DATA);
3142 }
3143
TEST_P(QuicFramerTest,AckFrameOneAckBlockMaxLength)3144 TEST_P(QuicFramerTest, AckFrameOneAckBlockMaxLength) {
3145 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3146 // clang-format off
3147 PacketFragments packet = {
3148 // type (short header, 4 byte packet number)
3149 {"",
3150 {0x43}},
3151 // connection_id
3152 {"",
3153 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3154 // packet number
3155 {"",
3156 {0x56, 0x78, 0x9A, 0xBC}},
3157 // frame type (ack frame)
3158 // (one ack block, 4 byte largest observed, 2 byte block length)
3159 {"",
3160 {0x49}},
3161 // largest acked
3162 {"Unable to read largest acked.",
3163 {0x12, 0x34, 0x56, 0x78}},
3164 // Zero delta time.
3165 {"Unable to read ack delay time.",
3166 {0x00, 0x00}},
3167 // first ack block length.
3168 {"Unable to read first ack block length.",
3169 {0x12, 0x34}},
3170 // num timestamps.
3171 {"Unable to read num received packets.",
3172 {0x00}}
3173 };
3174
3175 PacketFragments packet_ietf = {
3176 // type (short header, 4 byte packet number)
3177 {"",
3178 {0x43}},
3179 // connection_id
3180 {"",
3181 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3182 // packet number
3183 {"",
3184 {0x56, 0x78, 0x9A, 0xBC}},
3185 // frame type (IETF_ACK frame)
3186 {"",
3187 {0x02}},
3188 // largest acked
3189 {"Unable to read largest acked.",
3190 {kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78}},
3191 // Zero delta time.
3192 {"Unable to read ack delay time.",
3193 {kVarInt62OneByte + 0x00}},
3194 // Number of ack blocks after first
3195 {"Unable to read ack block count.",
3196 {kVarInt62OneByte + 0x00}},
3197 // first ack block length.
3198 {"Unable to read first ack block length.",
3199 {kVarInt62TwoBytes + 0x12, 0x33}}
3200 };
3201 // clang-format on
3202
3203 PacketFragments& fragments =
3204 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
3205 : packet;
3206 std::unique_ptr<QuicEncryptedPacket> encrypted(
3207 AssemblePacketFromFragments(fragments));
3208 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3209
3210 EXPECT_THAT(framer_.error(), IsQuicNoError());
3211 ASSERT_TRUE(visitor_.header_.get());
3212 EXPECT_TRUE(CheckDecryption(
3213 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3214 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3215
3216 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3217 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3218 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3219 EXPECT_EQ(kPacketNumber, LargestAcked(frame));
3220 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
3221
3222 CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
3223 }
3224
3225 // Tests ability to handle multiple ackblocks after the first ack
3226 // block. Non-version-99 tests include multiple timestamps as well.
TEST_P(QuicFramerTest,AckFrameTwoTimeStampsMultipleAckBlocks)3227 TEST_P(QuicFramerTest, AckFrameTwoTimeStampsMultipleAckBlocks) {
3228 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3229 // clang-format off
3230 PacketFragments packet = {
3231 // type (short header, 4 byte packet number)
3232 {"",
3233 { 0x43 }},
3234 // connection_id
3235 {"",
3236 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3237 // packet number
3238 {"",
3239 { 0x12, 0x34, 0x56, 0x78 }},
3240
3241 // frame type (ack frame)
3242 // (more than one ack block, 2 byte largest observed, 2 byte block length)
3243 {"",
3244 { 0x65 }},
3245 // largest acked
3246 {"Unable to read largest acked.",
3247 { 0x12, 0x34 }},
3248 // Zero delta time.
3249 {"Unable to read ack delay time.",
3250 { 0x00, 0x00 }},
3251 // num ack blocks ranges.
3252 {"Unable to read num of ack blocks.",
3253 { 0x04 }},
3254 // first ack block length.
3255 {"Unable to read first ack block length.",
3256 { 0x00, 0x01 }},
3257 // gap to next block.
3258 { "Unable to read gap to next ack block.",
3259 { 0x01 }},
3260 // ack block length.
3261 { "Unable to ack block length.",
3262 { 0x0e, 0xaf }},
3263 // gap to next block.
3264 { "Unable to read gap to next ack block.",
3265 { 0xff }},
3266 // ack block length.
3267 { "Unable to ack block length.",
3268 { 0x00, 0x00 }},
3269 // gap to next block.
3270 { "Unable to read gap to next ack block.",
3271 { 0x91 }},
3272 // ack block length.
3273 { "Unable to ack block length.",
3274 { 0x01, 0xea }},
3275 // gap to next block.
3276 { "Unable to read gap to next ack block.",
3277 { 0x05 }},
3278 // ack block length.
3279 { "Unable to ack block length.",
3280 { 0x00, 0x04 }},
3281 // Number of timestamps.
3282 { "Unable to read num received packets.",
3283 { 0x02 }},
3284 // Delta from largest observed.
3285 { "Unable to read sequence delta in received packets.",
3286 { 0x01 }},
3287 // Delta time.
3288 { "Unable to read time delta in received packets.",
3289 { 0x76, 0x54, 0x32, 0x10 }},
3290 // Delta from largest observed.
3291 { "Unable to read sequence delta in received packets.",
3292 { 0x02 }},
3293 // Delta time.
3294 { "Unable to read incremental time delta in received packets.",
3295 { 0x32, 0x10 }},
3296 };
3297
3298 PacketFragments packet_ietf = {
3299 // type (short header, 4 byte packet number)
3300 {"",
3301 { 0x43 }},
3302 // connection_id
3303 {"",
3304 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3305 // packet number
3306 {"",
3307 { 0x12, 0x34, 0x56, 0x78 }},
3308
3309 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3310 {"",
3311 { 0x22 }},
3312 // largest acked
3313 {"Unable to read largest acked.",
3314 { kVarInt62TwoBytes + 0x12, 0x34 }}, // = 4660
3315 // Zero delta time.
3316 {"Unable to read ack delay time.",
3317 { kVarInt62OneByte + 0x00 }},
3318 // number of additional ack blocks
3319 {"Unable to read ack block count.",
3320 { kVarInt62OneByte + 0x03 }},
3321 // first ack block length.
3322 {"Unable to read first ack block length.",
3323 { kVarInt62OneByte + 0x00 }}, // 1st block length = 1
3324
3325 // Additional ACK Block #1
3326 // gap to next block.
3327 { "Unable to read gap block value.",
3328 { kVarInt62OneByte + 0x00 }}, // gap of 1 packet
3329 // ack block length.
3330 { "Unable to read ack block value.",
3331 { kVarInt62TwoBytes + 0x0e, 0xae }}, // 3759
3332
3333 // pre-version-99 test includes an ack block of 0 length. this
3334 // can not happen in version 99. ergo the second block is not
3335 // present in the v99 test and the gap length of the next block
3336 // is the sum of the two gaps in the pre-version-99 tests.
3337 // Additional ACK Block #2
3338 // gap to next block.
3339 { "Unable to read gap block value.",
3340 { kVarInt62TwoBytes + 0x01, 0x8f }}, // Gap is 400 (0x190) pkts
3341 // ack block length.
3342 { "Unable to read ack block value.",
3343 { kVarInt62TwoBytes + 0x01, 0xe9 }}, // block is 389 (x1ea) pkts
3344
3345 // Additional ACK Block #3
3346 // gap to next block.
3347 { "Unable to read gap block value.",
3348 { kVarInt62OneByte + 0x04 }}, // Gap is 5 packets.
3349 // ack block length.
3350 { "Unable to read ack block value.",
3351 { kVarInt62OneByte + 0x03 }}, // block is 3 packets.
3352
3353 // Receive Timestamps.
3354 { "Unable to read receive timestamp range count.",
3355 { kVarInt62OneByte + 0x01 }},
3356 { "Unable to read receive timestamp gap.",
3357 { kVarInt62OneByte + 0x01 }},
3358 { "Unable to read receive timestamp count.",
3359 { kVarInt62OneByte + 0x02 }},
3360 { "Unable to read receive timestamp delta.",
3361 { kVarInt62FourBytes + 0x36, 0x54, 0x32, 0x10 }},
3362 { "Unable to read receive timestamp delta.",
3363 { kVarInt62TwoBytes + 0x32, 0x10 }},
3364 };
3365
3366 // clang-format on
3367 PacketFragments& fragments =
3368 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
3369 : packet;
3370
3371 std::unique_ptr<QuicEncryptedPacket> encrypted(
3372 AssemblePacketFromFragments(fragments));
3373
3374 framer_.set_process_timestamps(true);
3375 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3376
3377 EXPECT_THAT(framer_.error(), IsQuicNoError());
3378 ASSERT_TRUE(visitor_.header_.get());
3379 EXPECT_TRUE(CheckDecryption(
3380 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3381 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3382
3383 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3384 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3385 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3386 EXPECT_EQ(kSmallLargestObserved, LargestAcked(frame));
3387 ASSERT_EQ(4254u, frame.packets.NumPacketsSlow());
3388 EXPECT_EQ(4u, frame.packets.NumIntervals());
3389 EXPECT_EQ(2u, frame.received_packet_times.size());
3390 }
3391
TEST_P(QuicFramerTest,AckFrameMultipleReceiveTimestampRanges)3392 TEST_P(QuicFramerTest, AckFrameMultipleReceiveTimestampRanges) {
3393 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3394 return;
3395 }
3396 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3397 // clang-format off
3398 PacketFragments packet_ietf = {
3399 // type (short header, 4 byte packet number)
3400 {"",
3401 { 0x43 }},
3402 // connection_id
3403 {"",
3404 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3405 // packet number
3406 {"",
3407 { 0x12, 0x34, 0x56, 0x78 }},
3408
3409 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3410 {"",
3411 { 0x22 }},
3412 // largest acked
3413 {"Unable to read largest acked.",
3414 { kVarInt62TwoBytes + 0x12, 0x34 }}, // = 4660
3415 // Zero delta time.
3416 {"Unable to read ack delay time.",
3417 { kVarInt62OneByte + 0x00 }},
3418 // number of additional ack blocks
3419 {"Unable to read ack block count.",
3420 { kVarInt62OneByte + 0x00 }},
3421 // first ack block length.
3422 {"Unable to read first ack block length.",
3423 { kVarInt62OneByte + 0x00 }}, // 1st block length = 1
3424
3425 // Receive Timestamps.
3426 { "Unable to read receive timestamp range count.",
3427 { kVarInt62OneByte + 0x03 }},
3428
3429 // Timestamp range 1 (three packets).
3430 { "Unable to read receive timestamp gap.",
3431 { kVarInt62OneByte + 0x02 }},
3432 { "Unable to read receive timestamp count.",
3433 { kVarInt62OneByte + 0x03 }},
3434 { "Unable to read receive timestamp delta.",
3435 { kVarInt62FourBytes + 0x29, 0xff, 0xff, 0xff}},
3436 { "Unable to read receive timestamp delta.",
3437 { kVarInt62TwoBytes + 0x11, 0x11 }},
3438 { "Unable to read receive timestamp delta.",
3439 { kVarInt62OneByte + 0x01}},
3440
3441 // Timestamp range 2 (one packet).
3442 { "Unable to read receive timestamp gap.",
3443 { kVarInt62OneByte + 0x05 }},
3444 { "Unable to read receive timestamp count.",
3445 { kVarInt62OneByte + 0x01 }},
3446 { "Unable to read receive timestamp delta.",
3447 { kVarInt62TwoBytes + 0x10, 0x00 }},
3448
3449 // Timestamp range 3 (two packets).
3450 { "Unable to read receive timestamp gap.",
3451 { kVarInt62OneByte + 0x08 }},
3452 { "Unable to read receive timestamp count.",
3453 { kVarInt62OneByte + 0x02 }},
3454 { "Unable to read receive timestamp delta.",
3455 { kVarInt62OneByte + 0x10 }},
3456 { "Unable to read receive timestamp delta.",
3457 { kVarInt62TwoBytes + 0x01, 0x00 }},
3458 };
3459 // clang-format on
3460
3461 std::unique_ptr<QuicEncryptedPacket> encrypted(
3462 AssemblePacketFromFragments(packet_ietf));
3463
3464 framer_.set_process_timestamps(true);
3465 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3466 EXPECT_THAT(framer_.error(), IsQuicNoError());
3467 ASSERT_TRUE(visitor_.header_.get());
3468 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3469
3470 EXPECT_THAT(frame.received_packet_times,
3471 ContainerEq(PacketTimeVector{
3472 // Timestamp Range 1.
3473 {LargestAcked(frame) - 2, CreationTimePlus(0x29ffffff)},
3474 {LargestAcked(frame) - 3, CreationTimePlus(0x29ffeeee)},
3475 {LargestAcked(frame) - 4, CreationTimePlus(0x29ffeeed)},
3476 // Timestamp Range 2.
3477 {LargestAcked(frame) - 11, CreationTimePlus(0x29ffdeed)},
3478 // Timestamp Range 3.
3479 {LargestAcked(frame) - 21, CreationTimePlus(0x29ffdedd)},
3480 {LargestAcked(frame) - 22, CreationTimePlus(0x29ffdddd)},
3481 }));
3482 }
3483
TEST_P(QuicFramerTest,AckFrameReceiveTimestampWithExponent)3484 TEST_P(QuicFramerTest, AckFrameReceiveTimestampWithExponent) {
3485 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3486 return;
3487 }
3488 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3489 // clang-format off
3490 PacketFragments packet_ietf = {
3491 // type (short header, 4 byte packet number)
3492 {"",
3493 { 0x43 }},
3494 // connection_id
3495 {"",
3496 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3497 // packet number
3498 {"",
3499 { 0x12, 0x34, 0x56, 0x78 }},
3500
3501 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3502 {"",
3503 { 0x22 }},
3504 // largest acked
3505 {"Unable to read largest acked.",
3506 { kVarInt62TwoBytes + 0x12, 0x34 }}, // = 4660
3507 // Zero delta time.
3508 {"Unable to read ack delay time.",
3509 { kVarInt62OneByte + 0x00 }},
3510 // number of additional ack blocks
3511 {"Unable to read ack block count.",
3512 { kVarInt62OneByte + 0x00 }},
3513 // first ack block length.
3514 {"Unable to read first ack block length.",
3515 { kVarInt62OneByte + 0x00 }}, // 1st block length = 1
3516
3517 // Receive Timestamps.
3518 { "Unable to read receive timestamp range count.",
3519 { kVarInt62OneByte + 0x01 }},
3520 { "Unable to read receive timestamp gap.",
3521 { kVarInt62OneByte + 0x00 }},
3522 { "Unable to read receive timestamp count.",
3523 { kVarInt62OneByte + 0x03 }},
3524 { "Unable to read receive timestamp delta.",
3525 { kVarInt62TwoBytes + 0x29, 0xff}},
3526 { "Unable to read receive timestamp delta.",
3527 { kVarInt62TwoBytes + 0x11, 0x11 }},
3528 { "Unable to read receive timestamp delta.",
3529 { kVarInt62OneByte + 0x01}},
3530 };
3531 // clang-format on
3532
3533 std::unique_ptr<QuicEncryptedPacket> encrypted(
3534 AssemblePacketFromFragments(packet_ietf));
3535
3536 framer_.set_receive_timestamps_exponent(3);
3537 framer_.set_process_timestamps(true);
3538 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3539 EXPECT_THAT(framer_.error(), IsQuicNoError());
3540 ASSERT_TRUE(visitor_.header_.get());
3541 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
3542
3543 EXPECT_THAT(frame.received_packet_times,
3544 ContainerEq(PacketTimeVector{
3545 // Timestamp Range 1.
3546 {LargestAcked(frame), CreationTimePlus(0x29ff << 3)},
3547 {LargestAcked(frame) - 1, CreationTimePlus(0x18ee << 3)},
3548 {LargestAcked(frame) - 2, CreationTimePlus(0x18ed << 3)},
3549 }));
3550 }
3551
TEST_P(QuicFramerTest,AckFrameReceiveTimestampGapTooHigh)3552 TEST_P(QuicFramerTest, AckFrameReceiveTimestampGapTooHigh) {
3553 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3554 return;
3555 }
3556 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3557 // clang-format off
3558 PacketFragments packet_ietf = {
3559 // type (short header, 4 byte packet number)
3560 {"",
3561 { 0x43 }},
3562 // connection_id
3563 {"",
3564 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3565 // packet number
3566 {"",
3567 { 0x12, 0x34, 0x56, 0x78 }},
3568
3569 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3570 {"",
3571 { 0x22 }},
3572 // largest acked
3573 {"Unable to read largest acked.",
3574 { kVarInt62TwoBytes + 0x12, 0x34 }}, // = 4660
3575 // Zero delta time.
3576 {"Unable to read ack delay time.",
3577 { kVarInt62OneByte + 0x00 }},
3578 // number of additional ack blocks
3579 {"Unable to read ack block count.",
3580 { kVarInt62OneByte + 0x00 }},
3581 // first ack block length.
3582 {"Unable to read first ack block length.",
3583 { kVarInt62OneByte + 0x00 }}, // 1st block length = 1
3584
3585 // Receive Timestamps.
3586 { "Unable to read receive timestamp range count.",
3587 { kVarInt62OneByte + 0x01 }},
3588 { "Unable to read receive timestamp gap.",
3589 { kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x79 }},
3590 { "Unable to read receive timestamp count.",
3591 { kVarInt62OneByte + 0x01 }},
3592 { "Unable to read receive timestamp delta.",
3593 { kVarInt62TwoBytes + 0x29, 0xff}},
3594 };
3595 // clang-format on
3596
3597 std::unique_ptr<QuicEncryptedPacket> encrypted(
3598 AssemblePacketFromFragments(packet_ietf));
3599
3600 framer_.set_process_timestamps(true);
3601 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3602 EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3603 "Receive timestamp gap too high."));
3604 }
3605
TEST_P(QuicFramerTest,AckFrameReceiveTimestampCountTooHigh)3606 TEST_P(QuicFramerTest, AckFrameReceiveTimestampCountTooHigh) {
3607 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3608 return;
3609 }
3610 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3611 // clang-format off
3612 PacketFragments packet_ietf = {
3613 // type (short header, 4 byte packet number)
3614 {"",
3615 { 0x43 }},
3616 // connection_id
3617 {"",
3618 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3619 // packet number
3620 {"",
3621 { 0x12, 0x34, 0x56, 0x78 }},
3622
3623 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3624 {"",
3625 { 0x22 }},
3626 // largest acked
3627 {"Unable to read largest acked.",
3628 { kVarInt62TwoBytes + 0x12, 0x34 }}, // = 4660
3629 // Zero delta time.
3630 {"Unable to read ack delay time.",
3631 { kVarInt62OneByte + 0x00 }},
3632 // number of additional ack blocks
3633 {"Unable to read ack block count.",
3634 { kVarInt62OneByte + 0x00 }},
3635 // first ack block length.
3636 {"Unable to read first ack block length.",
3637 { kVarInt62OneByte + 0x00 }}, // 1st block length = 1
3638
3639 // Receive Timestamps.
3640 { "Unable to read receive timestamp range count.",
3641 { kVarInt62OneByte + 0x01 }},
3642 { "Unable to read receive timestamp gap.",
3643 { kVarInt62OneByte + 0x02 }},
3644 { "Unable to read receive timestamp count.",
3645 { kVarInt62OneByte + 0x02 }},
3646 { "Unable to read receive timestamp delta.",
3647 { kVarInt62OneByte + 0x0a}},
3648 { "Unable to read receive timestamp delta.",
3649 { kVarInt62OneByte + 0x0b}},
3650 };
3651 // clang-format on
3652
3653 std::unique_ptr<QuicEncryptedPacket> encrypted(
3654 AssemblePacketFromFragments(packet_ietf));
3655
3656 framer_.set_process_timestamps(true);
3657 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3658 EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3659 "Receive timestamp delta too high."));
3660 }
3661
TEST_P(QuicFramerTest,AckFrameReceiveTimestampDeltaTooHigh)3662 TEST_P(QuicFramerTest, AckFrameReceiveTimestampDeltaTooHigh) {
3663 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3664 return;
3665 }
3666 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3667 // clang-format off
3668 PacketFragments packet_ietf = {
3669 // type (short header, 4 byte packet number)
3670 {"",
3671 { 0x43 }},
3672 // connection_id
3673 {"",
3674 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
3675 // packet number
3676 {"",
3677 { 0x12, 0x34, 0x56, 0x78 }},
3678
3679 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
3680 {"",
3681 { 0x22 }},
3682 // largest acked
3683 {"Unable to read largest acked.",
3684 { kVarInt62TwoBytes + 0x12, 0x34 }}, // = 4660
3685 // Zero delta time.
3686 {"Unable to read ack delay time.",
3687 { kVarInt62OneByte + 0x00 }},
3688 // number of additional ack blocks
3689 {"Unable to read ack block count.",
3690 { kVarInt62OneByte + 0x00 }},
3691 // first ack block length.
3692 {"Unable to read first ack block length.",
3693 { kVarInt62OneByte + 0x00 }}, // 1st block length = 1
3694
3695 // Receive Timestamps.
3696 { "Unable to read receive timestamp range count.",
3697 { kVarInt62OneByte + 0x01 }},
3698 { "Unable to read receive timestamp gap.",
3699 { kVarInt62OneByte + 0x02 }},
3700 { "Unable to read receive timestamp count.",
3701 { kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77 }},
3702 { "Unable to read receive timestamp delta.",
3703 { kVarInt62TwoBytes + 0x29, 0xff}},
3704 };
3705 // clang-format on
3706
3707 std::unique_ptr<QuicEncryptedPacket> encrypted(
3708 AssemblePacketFromFragments(packet_ietf));
3709
3710 framer_.set_process_timestamps(true);
3711 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
3712 EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3713 "Receive timestamp count too high."));
3714 }
3715
TEST_P(QuicFramerTest,AckFrameTimeStampDeltaTooHigh)3716 TEST_P(QuicFramerTest, AckFrameTimeStampDeltaTooHigh) {
3717 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3718 // clang-format off
3719 unsigned char packet[] = {
3720 // type (short header, 4 byte packet number)
3721 0x43,
3722 // connection_id
3723 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3724 // packet number
3725 0x12, 0x34, 0x56, 0x78,
3726
3727 // frame type (ack frame)
3728 // (no ack blocks, 1 byte largest observed, 1 byte block length)
3729 0x40,
3730 // largest acked
3731 0x01,
3732 // Zero delta time.
3733 0x00, 0x00,
3734 // first ack block length.
3735 0x01,
3736 // num timestamps.
3737 0x01,
3738 // Delta from largest observed.
3739 0x01,
3740 // Delta time.
3741 0x10, 0x32, 0x54, 0x76,
3742 };
3743 // clang-format on
3744 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3745 // ACK Timestamp is not a feature of IETF QUIC.
3746 return;
3747 }
3748 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
3749 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
3750 EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3751 "delta_from_largest_observed too high"));
3752 }
3753
TEST_P(QuicFramerTest,AckFrameTimeStampSecondDeltaTooHigh)3754 TEST_P(QuicFramerTest, AckFrameTimeStampSecondDeltaTooHigh) {
3755 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3756 // clang-format off
3757 unsigned char packet[] = {
3758 // type (short header, 4 byte packet number)
3759 0x43,
3760 // connection_id
3761 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3762 // packet number
3763 0x12, 0x34, 0x56, 0x78,
3764
3765 // frame type (ack frame)
3766 // (no ack blocks, 1 byte largest observed, 1 byte block length)
3767 0x40,
3768 // largest acked
3769 0x03,
3770 // Zero delta time.
3771 0x00, 0x00,
3772 // first ack block length.
3773 0x03,
3774 // num timestamps.
3775 0x02,
3776 // Delta from largest observed.
3777 0x01,
3778 // Delta time.
3779 0x10, 0x32, 0x54, 0x76,
3780 // Delta from largest observed.
3781 0x03,
3782 // Delta time.
3783 0x10, 0x32,
3784 };
3785 // clang-format on
3786 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3787 // ACK Timestamp is not a feature of IETF QUIC.
3788 return;
3789 }
3790 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
3791 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
3792 EXPECT_TRUE(absl::StartsWith(framer_.detailed_error(),
3793 "delta_from_largest_observed too high"));
3794 }
3795
TEST_P(QuicFramerTest,NewStopWaitingFrame)3796 TEST_P(QuicFramerTest, NewStopWaitingFrame) {
3797 if (VersionHasIetfQuicFrames(version_.transport_version)) {
3798 // The Stop Waiting frame is not in IETF QUIC
3799 return;
3800 }
3801 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3802 // clang-format off
3803 PacketFragments packet = {
3804 // type (short header, 4 byte packet number)
3805 {"",
3806 {0x43}},
3807 // connection_id
3808 {"",
3809 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3810 // packet number
3811 {"",
3812 {0x12, 0x34, 0x56, 0x78}},
3813 // frame type (stop waiting frame)
3814 {"",
3815 {0x06}},
3816 // least packet number awaiting an ack, delta from packet number.
3817 {"Unable to read least unacked delta.",
3818 {0x00, 0x00, 0x00, 0x08}}
3819 };
3820 // clang-format on
3821
3822 std::unique_ptr<QuicEncryptedPacket> encrypted(
3823 AssemblePacketFromFragments(packet));
3824
3825 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3826 EXPECT_THAT(framer_.error(), IsQuicNoError());
3827 ASSERT_TRUE(visitor_.header_.get());
3828 EXPECT_TRUE(CheckDecryption(
3829 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3830 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3831
3832 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3833 ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size());
3834 const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0];
3835 EXPECT_EQ(kLeastUnacked, frame.least_unacked);
3836
3837 CheckFramingBoundaries(packet, QUIC_INVALID_STOP_WAITING_DATA);
3838 }
3839
TEST_P(QuicFramerTest,InvalidNewStopWaitingFrame)3840 TEST_P(QuicFramerTest, InvalidNewStopWaitingFrame) {
3841 // The Stop Waiting frame is not in IETF QUIC
3842 if (VersionHasIetfQuicFrames(version_.transport_version)) {
3843 return;
3844 }
3845 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3846 // clang-format off
3847 unsigned char packet[] = {
3848 // type (short header, 4 byte packet number)
3849 0x43,
3850 // connection_id
3851 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
3852 // packet number
3853 0x12, 0x34, 0x56, 0x78,
3854 // frame type (stop waiting frame)
3855 0x06,
3856 // least packet number awaiting an ack, delta from packet number.
3857 0x57, 0x78, 0x9A, 0xA8,
3858 };
3859 // clang-format on
3860
3861 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
3862 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
3863 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_STOP_WAITING_DATA));
3864 EXPECT_EQ("Invalid unacked delta.", framer_.detailed_error());
3865 }
3866
TEST_P(QuicFramerTest,RstStreamFrame)3867 TEST_P(QuicFramerTest, RstStreamFrame) {
3868 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3869 // clang-format off
3870 PacketFragments packet = {
3871 // type (short header, 4 byte packet number)
3872 {"",
3873 {0x43}},
3874 // connection_id
3875 {"",
3876 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3877 // packet number
3878 {"",
3879 {0x12, 0x34, 0x56, 0x78}},
3880 // frame type (rst stream frame)
3881 {"",
3882 {0x01}},
3883 // stream id
3884 {"Unable to read stream_id.",
3885 {0x01, 0x02, 0x03, 0x04}},
3886 // sent byte offset
3887 {"Unable to read rst stream sent byte offset.",
3888 {0x3A, 0x98, 0xFE, 0xDC,
3889 0x32, 0x10, 0x76, 0x54}},
3890 // error code QUIC_STREAM_CANCELLED
3891 {"Unable to read rst stream error code.",
3892 {0x00, 0x00, 0x00, 0x06}}
3893 };
3894
3895 PacketFragments packet_ietf = {
3896 // type (short header, 4 byte packet number)
3897 {"",
3898 {0x43}},
3899 // connection_id
3900 {"",
3901 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3902 // packet number
3903 {"",
3904 {0x12, 0x34, 0x56, 0x78}},
3905 // frame type (IETF_RST_STREAM frame)
3906 {"",
3907 {0x04}},
3908 // stream id
3909 {"Unable to read IETF_RST_STREAM frame stream id/count.",
3910 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
3911 // application error code H3_REQUEST_CANCELLED gets translated to
3912 // QuicRstStreamErrorCode::QUIC_STREAM_CANCELLED.
3913 {"Unable to read rst stream error code.",
3914 {kVarInt62TwoBytes + 0x01, 0x0c}},
3915 // Final Offset
3916 {"Unable to read rst stream sent byte offset.",
3917 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}}
3918 };
3919 // clang-format on
3920
3921 PacketFragments& fragments =
3922 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
3923 : packet;
3924 std::unique_ptr<QuicEncryptedPacket> encrypted(
3925 AssemblePacketFromFragments(fragments));
3926 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
3927
3928 EXPECT_THAT(framer_.error(), IsQuicNoError());
3929 ASSERT_TRUE(visitor_.header_.get());
3930 EXPECT_TRUE(CheckDecryption(
3931 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
3932 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
3933
3934 EXPECT_EQ(kStreamId, visitor_.rst_stream_frame_.stream_id);
3935 EXPECT_EQ(QUIC_STREAM_CANCELLED, visitor_.rst_stream_frame_.error_code);
3936 EXPECT_EQ(kStreamOffset, visitor_.rst_stream_frame_.byte_offset);
3937 CheckFramingBoundaries(fragments, QUIC_INVALID_RST_STREAM_DATA);
3938 }
3939
TEST_P(QuicFramerTest,ConnectionCloseFrame)3940 TEST_P(QuicFramerTest, ConnectionCloseFrame) {
3941 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
3942 // clang-format off
3943 PacketFragments packet = {
3944 // type (short header, 4 byte packet number)
3945 {"",
3946 {0x43}},
3947 // connection_id
3948 {"",
3949 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3950 // packet number
3951 {"",
3952 {0x12, 0x34, 0x56, 0x78}},
3953 // frame type (connection close frame)
3954 {"",
3955 {0x02}},
3956 // error code
3957 {"Unable to read connection close error code.",
3958 {0x00, 0x00, 0x00, 0x11}},
3959 {"Unable to read connection close error details.",
3960 {
3961 // error details length
3962 0x0, 0x0d,
3963 // error details
3964 'b', 'e', 'c', 'a',
3965 'u', 's', 'e', ' ',
3966 'I', ' ', 'c', 'a',
3967 'n'}
3968 }
3969 };
3970
3971 PacketFragments packet_ietf = {
3972 // type (short header, 4 byte packet number)
3973 {"",
3974 {0x43}},
3975 // connection_id
3976 {"",
3977 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
3978 // packet number
3979 {"",
3980 {0x12, 0x34, 0x56, 0x78}},
3981 // frame type (IETF Transport CONNECTION_CLOSE frame)
3982 {"",
3983 {0x1c}},
3984 // error code
3985 {"Unable to read connection close error code.",
3986 {kVarInt62TwoBytes + 0x00, 0x11}},
3987 {"Unable to read connection close frame type.",
3988 {kVarInt62TwoBytes + 0x12, 0x34 }},
3989 {"Unable to read connection close error details.",
3990 {
3991 // error details length
3992 kVarInt62OneByte + 0x11,
3993 // error details with QuicErrorCode serialized
3994 '1', '1', '5', ':',
3995 'b', 'e', 'c', 'a',
3996 'u', 's', 'e', ' ',
3997 'I', ' ', 'c', 'a',
3998 'n'}
3999 }
4000 };
4001 // clang-format on
4002
4003 PacketFragments& fragments =
4004 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
4005 : packet;
4006 std::unique_ptr<QuicEncryptedPacket> encrypted(
4007 AssemblePacketFromFragments(fragments));
4008 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4009
4010 EXPECT_THAT(framer_.error(), IsQuicNoError());
4011 ASSERT_TRUE(visitor_.header_.get());
4012 EXPECT_TRUE(CheckDecryption(
4013 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4014 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4015
4016 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4017 EXPECT_EQ(0x11u, static_cast<unsigned>(
4018 visitor_.connection_close_frame_.wire_error_code));
4019 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4020 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4021 EXPECT_EQ(0x1234u,
4022 visitor_.connection_close_frame_.transport_close_frame_type);
4023 EXPECT_EQ(115u, visitor_.connection_close_frame_.quic_error_code);
4024 } else {
4025 // For Google QUIC frame, |quic_error_code| and |wire_error_code| has the
4026 // same value.
4027 EXPECT_EQ(0x11u, static_cast<unsigned>(
4028 visitor_.connection_close_frame_.quic_error_code));
4029 }
4030
4031 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4032
4033 CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4034 }
4035
TEST_P(QuicFramerTest,ConnectionCloseFrameWithUnknownErrorCode)4036 TEST_P(QuicFramerTest, ConnectionCloseFrameWithUnknownErrorCode) {
4037 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4038 // clang-format off
4039 PacketFragments packet = {
4040 // type (short header, 4 byte packet number)
4041 {"",
4042 {0x43}},
4043 // connection_id
4044 {"",
4045 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4046 // packet number
4047 {"",
4048 {0x12, 0x34, 0x56, 0x78}},
4049 // frame type (connection close frame)
4050 {"",
4051 {0x02}},
4052 // error code larger than QUIC_LAST_ERROR
4053 {"Unable to read connection close error code.",
4054 {0x00, 0x00, 0xC0, 0xDE}},
4055 {"Unable to read connection close error details.",
4056 {
4057 // error details length
4058 0x0, 0x0d,
4059 // error details
4060 'b', 'e', 'c', 'a',
4061 'u', 's', 'e', ' ',
4062 'I', ' ', 'c', 'a',
4063 'n'}
4064 }
4065 };
4066
4067 PacketFragments packet_ietf = {
4068 // type (short header, 4 byte packet number)
4069 {"",
4070 {0x43}},
4071 // connection_id
4072 {"",
4073 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4074 // packet number
4075 {"",
4076 {0x12, 0x34, 0x56, 0x78}},
4077 // frame type (IETF Transport CONNECTION_CLOSE frame)
4078 {"",
4079 {0x1c}},
4080 // error code
4081 {"Unable to read connection close error code.",
4082 {kVarInt62FourBytes + 0x00, 0x00, 0xC0, 0xDE}},
4083 {"Unable to read connection close frame type.",
4084 {kVarInt62TwoBytes + 0x12, 0x34 }},
4085 {"Unable to read connection close error details.",
4086 {
4087 // error details length
4088 kVarInt62OneByte + 0x11,
4089 // error details with QuicErrorCode larger than QUIC_LAST_ERROR
4090 '8', '4', '9', ':',
4091 'b', 'e', 'c', 'a',
4092 'u', 's', 'e', ' ',
4093 'I', ' ', 'c', 'a',
4094 'n'}
4095 }
4096 };
4097 // clang-format on
4098
4099 PacketFragments& fragments =
4100 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
4101 : packet;
4102 std::unique_ptr<QuicEncryptedPacket> encrypted(
4103 AssemblePacketFromFragments(fragments));
4104 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4105
4106 EXPECT_THAT(framer_.error(), IsQuicNoError());
4107 ASSERT_TRUE(visitor_.header_.get());
4108 EXPECT_TRUE(CheckDecryption(
4109 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4110 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4111
4112 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4113 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4114 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4115 EXPECT_EQ(0x1234u,
4116 visitor_.connection_close_frame_.transport_close_frame_type);
4117 EXPECT_EQ(0xC0DEu, visitor_.connection_close_frame_.wire_error_code);
4118 EXPECT_EQ(849u, visitor_.connection_close_frame_.quic_error_code);
4119 } else {
4120 // For Google QUIC frame, |quic_error_code| and |wire_error_code| has the
4121 // same value.
4122 EXPECT_EQ(0xC0DEu, visitor_.connection_close_frame_.wire_error_code);
4123 EXPECT_EQ(0xC0DEu, visitor_.connection_close_frame_.quic_error_code);
4124 }
4125
4126 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4127
4128 CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4129 }
4130
4131 // As above, but checks that for Google-QUIC, if there happens
4132 // to be an ErrorCode string at the start of the details, it is
4133 // NOT extracted/parsed/folded/spindled/and/mutilated.
TEST_P(QuicFramerTest,ConnectionCloseFrameWithExtractedInfoIgnoreGCuic)4134 TEST_P(QuicFramerTest, ConnectionCloseFrameWithExtractedInfoIgnoreGCuic) {
4135 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4136
4137 // clang-format off
4138 PacketFragments packet = {
4139 // type (short header, 4 byte packet number)
4140 {"",
4141 {0x43}},
4142 // connection_id
4143 {"",
4144 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4145 // packet number
4146 {"",
4147 {0x12, 0x34, 0x56, 0x78}},
4148 // frame type (connection close frame)
4149 {"",
4150 {0x02}},
4151 // error code
4152 {"Unable to read connection close error code.",
4153 {0x00, 0x00, 0x00, 0x11}},
4154 {"Unable to read connection close error details.",
4155 {
4156 // error details length
4157 0x0, 0x13,
4158 // error details
4159 '1', '7', '7', '6',
4160 '7', ':', 'b', 'e',
4161 'c', 'a', 'u', 's',
4162 'e', ' ', 'I', ' ',
4163 'c', 'a', 'n'}
4164 }
4165 };
4166
4167 PacketFragments packet_ietf = {
4168 // type (short header, 4 byte packet number)
4169 {"",
4170 {0x43}},
4171 // connection_id
4172 {"",
4173 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4174 // packet number
4175 {"",
4176 {0x12, 0x34, 0x56, 0x78}},
4177 // frame type (IETF Transport CONNECTION_CLOSE frame)
4178 {"",
4179 {0x1c}},
4180 // error code
4181 {"Unable to read connection close error code.",
4182 {kVarInt62OneByte + 0x11}},
4183 {"Unable to read connection close frame type.",
4184 {kVarInt62TwoBytes + 0x12, 0x34 }},
4185 {"Unable to read connection close error details.",
4186 {
4187 // error details length
4188 kVarInt62OneByte + 0x13,
4189 // error details
4190 '1', '7', '7', '6',
4191 '7', ':', 'b', 'e',
4192 'c', 'a', 'u', 's',
4193 'e', ' ', 'I', ' ',
4194 'c', 'a', 'n'}
4195 }
4196 };
4197 // clang-format on
4198
4199 PacketFragments& fragments =
4200 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
4201 : packet;
4202 std::unique_ptr<QuicEncryptedPacket> encrypted(
4203 AssemblePacketFromFragments(fragments));
4204 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4205
4206 EXPECT_THAT(framer_.error(), IsQuicNoError());
4207 ASSERT_TRUE(visitor_.header_.get());
4208 EXPECT_TRUE(CheckDecryption(
4209 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4210 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4211
4212 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4213 EXPECT_EQ(0x11u, static_cast<unsigned>(
4214 visitor_.connection_close_frame_.wire_error_code));
4215
4216 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4217 EXPECT_EQ(0x1234u,
4218 visitor_.connection_close_frame_.transport_close_frame_type);
4219 EXPECT_EQ(17767u, visitor_.connection_close_frame_.quic_error_code);
4220 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4221 } else {
4222 EXPECT_EQ(0x11u, visitor_.connection_close_frame_.quic_error_code);
4223 // Error code is not prepended in GQUIC, so it is not removed and should
4224 // remain in the reason phrase.
4225 EXPECT_EQ("17767:because I can",
4226 visitor_.connection_close_frame_.error_details);
4227 }
4228
4229 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4230
4231 CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4232 }
4233
4234 // Test the CONNECTION_CLOSE/Application variant.
TEST_P(QuicFramerTest,ApplicationCloseFrame)4235 TEST_P(QuicFramerTest, ApplicationCloseFrame) {
4236 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4237 // This frame is only in IETF QUIC.
4238 return;
4239 }
4240 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4241
4242 // clang-format off
4243 PacketFragments packet_ietf = {
4244 // type (short header, 4 byte packet number)
4245 {"",
4246 {0x43}},
4247 // connection_id
4248 {"",
4249 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4250 // packet number
4251 {"",
4252 {0x12, 0x34, 0x56, 0x78}},
4253 // frame type (IETF_CONNECTION_CLOSE/Application frame)
4254 {"",
4255 {0x1d}},
4256 // error code
4257 {"Unable to read connection close error code.",
4258 {kVarInt62TwoBytes + 0x00, 0x11}},
4259 {"Unable to read connection close error details.",
4260 {
4261 // error details length
4262 kVarInt62OneByte + 0x0d,
4263 // error details
4264 'b', 'e', 'c', 'a',
4265 'u', 's', 'e', ' ',
4266 'I', ' ', 'c', 'a',
4267 'n'}
4268 }
4269 };
4270 // clang-format on
4271
4272 std::unique_ptr<QuicEncryptedPacket> encrypted(
4273 AssemblePacketFromFragments(packet_ietf));
4274 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4275
4276 EXPECT_THAT(framer_.error(), IsQuicNoError());
4277 ASSERT_TRUE(visitor_.header_.get());
4278 EXPECT_TRUE(CheckDecryption(
4279 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4280 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4281
4282 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4283
4284 EXPECT_EQ(IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
4285 visitor_.connection_close_frame_.close_type);
4286 EXPECT_EQ(122u, visitor_.connection_close_frame_.quic_error_code);
4287 EXPECT_EQ(0x11u, visitor_.connection_close_frame_.wire_error_code);
4288 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4289
4290 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4291
4292 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4293 }
4294
4295 // Check that we can extract an error code from an application close.
TEST_P(QuicFramerTest,ApplicationCloseFrameExtract)4296 TEST_P(QuicFramerTest, ApplicationCloseFrameExtract) {
4297 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4298 // This frame is only in IETF QUIC.
4299 return;
4300 }
4301 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4302
4303 // clang-format off
4304 PacketFragments packet_ietf = {
4305 // type (short header, 4 byte packet number)
4306 {"",
4307 {0x43}},
4308 // connection_id
4309 {"",
4310 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4311 // packet number
4312 {"",
4313 {0x12, 0x34, 0x56, 0x78}},
4314 // frame type (IETF_CONNECTION_CLOSE/Application frame)
4315 {"",
4316 {0x1d}},
4317 // error code
4318 {"Unable to read connection close error code.",
4319 {kVarInt62OneByte + 0x11}},
4320 {"Unable to read connection close error details.",
4321 {
4322 // error details length
4323 kVarInt62OneByte + 0x13,
4324 // error details
4325 '1', '7', '7', '6',
4326 '7', ':', 'b', 'e',
4327 'c', 'a', 'u', 's',
4328 'e', ' ', 'I', ' ',
4329 'c', 'a', 'n'}
4330 }
4331 };
4332 // clang-format on
4333
4334 std::unique_ptr<QuicEncryptedPacket> encrypted(
4335 AssemblePacketFromFragments(packet_ietf));
4336 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4337
4338 EXPECT_THAT(framer_.error(), IsQuicNoError());
4339 ASSERT_TRUE(visitor_.header_.get());
4340 EXPECT_TRUE(CheckDecryption(
4341 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4342 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4343
4344 EXPECT_EQ(0u, visitor_.stream_frames_.size());
4345
4346 EXPECT_EQ(IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
4347 visitor_.connection_close_frame_.close_type);
4348 EXPECT_EQ(17767u, visitor_.connection_close_frame_.quic_error_code);
4349 EXPECT_EQ(0x11u, visitor_.connection_close_frame_.wire_error_code);
4350 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
4351
4352 ASSERT_EQ(0u, visitor_.ack_frames_.size());
4353
4354 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_CONNECTION_CLOSE_DATA);
4355 }
4356
TEST_P(QuicFramerTest,GoAwayFrame)4357 TEST_P(QuicFramerTest, GoAwayFrame) {
4358 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4359 // This frame is not in IETF QUIC.
4360 return;
4361 }
4362 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4363 // clang-format off
4364 PacketFragments packet = {
4365 // type (short header, 4 byte packet number)
4366 {"",
4367 {0x43}},
4368 // connection_id
4369 {"",
4370 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4371 // packet number
4372 {"",
4373 {0x12, 0x34, 0x56, 0x78}},
4374 // frame type (go away frame)
4375 {"",
4376 {0x03}},
4377 // error code
4378 {"Unable to read go away error code.",
4379 {0x00, 0x00, 0x00, 0x09}},
4380 // stream id
4381 {"Unable to read last good stream id.",
4382 {0x01, 0x02, 0x03, 0x04}},
4383 // stream id
4384 {"Unable to read goaway reason.",
4385 {
4386 // error details length
4387 0x0, 0x0d,
4388 // error details
4389 'b', 'e', 'c', 'a',
4390 'u', 's', 'e', ' ',
4391 'I', ' ', 'c', 'a',
4392 'n'}
4393 }
4394 };
4395 // clang-format on
4396
4397 std::unique_ptr<QuicEncryptedPacket> encrypted(
4398 AssemblePacketFromFragments(packet));
4399 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4400
4401 EXPECT_THAT(framer_.error(), IsQuicNoError());
4402 ASSERT_TRUE(visitor_.header_.get());
4403 EXPECT_TRUE(CheckDecryption(
4404 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4405 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4406
4407 EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id);
4408 EXPECT_EQ(0x9u, visitor_.goaway_frame_.error_code);
4409 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase);
4410
4411 CheckFramingBoundaries(packet, QUIC_INVALID_GOAWAY_DATA);
4412 }
4413
TEST_P(QuicFramerTest,GoAwayFrameWithUnknownErrorCode)4414 TEST_P(QuicFramerTest, GoAwayFrameWithUnknownErrorCode) {
4415 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4416 // This frame is not in IETF QUIC.
4417 return;
4418 }
4419 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4420 // clang-format off
4421 PacketFragments packet = {
4422 // type (short header, 4 byte packet number)
4423 {"",
4424 {0x43}},
4425 // connection_id
4426 {"",
4427 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4428 // packet number
4429 {"",
4430 {0x12, 0x34, 0x56, 0x78}},
4431 // frame type (go away frame)
4432 {"",
4433 {0x03}},
4434 // error code larger than QUIC_LAST_ERROR
4435 {"Unable to read go away error code.",
4436 {0x00, 0x00, 0xC0, 0xDE}},
4437 // stream id
4438 {"Unable to read last good stream id.",
4439 {0x01, 0x02, 0x03, 0x04}},
4440 // stream id
4441 {"Unable to read goaway reason.",
4442 {
4443 // error details length
4444 0x0, 0x0d,
4445 // error details
4446 'b', 'e', 'c', 'a',
4447 'u', 's', 'e', ' ',
4448 'I', ' ', 'c', 'a',
4449 'n'}
4450 }
4451 };
4452 // clang-format on
4453
4454 std::unique_ptr<QuicEncryptedPacket> encrypted(
4455 AssemblePacketFromFragments(packet));
4456 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4457
4458 EXPECT_THAT(framer_.error(), IsQuicNoError());
4459 ASSERT_TRUE(visitor_.header_.get());
4460 EXPECT_TRUE(CheckDecryption(
4461 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4462 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4463
4464 EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id);
4465 EXPECT_EQ(0xC0DE, visitor_.goaway_frame_.error_code);
4466 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase);
4467
4468 CheckFramingBoundaries(packet, QUIC_INVALID_GOAWAY_DATA);
4469 }
4470
TEST_P(QuicFramerTest,WindowUpdateFrame)4471 TEST_P(QuicFramerTest, WindowUpdateFrame) {
4472 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4473 // This frame is not in IETF QUIC, see MaxDataFrame and MaxStreamDataFrame
4474 // for IETF QUIC equivalents.
4475 return;
4476 }
4477 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4478 // clang-format off
4479 PacketFragments packet = {
4480 // type (short header, 4 byte packet number)
4481 {"",
4482 {0x43}},
4483 // connection_id
4484 {"",
4485 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4486 // packet number
4487 {"",
4488 {0x12, 0x34, 0x56, 0x78}},
4489 // frame type (window update frame)
4490 {"",
4491 {0x04}},
4492 // stream id
4493 {"Unable to read stream_id.",
4494 {0x01, 0x02, 0x03, 0x04}},
4495 // byte offset
4496 {"Unable to read window byte_offset.",
4497 {0x3A, 0x98, 0xFE, 0xDC,
4498 0x32, 0x10, 0x76, 0x54}},
4499 };
4500
4501 // clang-format on
4502
4503 std::unique_ptr<QuicEncryptedPacket> encrypted(
4504 AssemblePacketFromFragments(packet));
4505 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4506
4507 EXPECT_THAT(framer_.error(), IsQuicNoError());
4508 ASSERT_TRUE(visitor_.header_.get());
4509 EXPECT_TRUE(CheckDecryption(
4510 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4511 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4512
4513 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
4514 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
4515
4516 CheckFramingBoundaries(packet, QUIC_INVALID_WINDOW_UPDATE_DATA);
4517 }
4518
TEST_P(QuicFramerTest,MaxDataFrame)4519 TEST_P(QuicFramerTest, MaxDataFrame) {
4520 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4521 // This frame is available only in IETF QUIC.
4522 return;
4523 }
4524 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4525 // clang-format off
4526 PacketFragments packet_ietf = {
4527 // type (short header, 4 byte packet number)
4528 {"",
4529 {0x43}},
4530 // connection_id
4531 {"",
4532 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4533 // packet number
4534 {"",
4535 {0x12, 0x34, 0x56, 0x78}},
4536 // frame type (IETF_MAX_DATA frame)
4537 {"",
4538 {0x10}},
4539 // byte offset
4540 {"Can not read MAX_DATA byte-offset",
4541 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
4542 0x32, 0x10, 0x76, 0x54}},
4543 };
4544 // clang-format on
4545
4546 std::unique_ptr<QuicEncryptedPacket> encrypted(
4547 AssemblePacketFromFragments(packet_ietf));
4548 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4549
4550 EXPECT_THAT(framer_.error(), IsQuicNoError());
4551 ASSERT_TRUE(visitor_.header_.get());
4552 EXPECT_TRUE(CheckDecryption(
4553 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4554 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4555
4556 EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
4557 visitor_.window_update_frame_.stream_id);
4558 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
4559
4560 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_MAX_DATA_FRAME_DATA);
4561 }
4562
TEST_P(QuicFramerTest,MaxStreamDataFrame)4563 TEST_P(QuicFramerTest, MaxStreamDataFrame) {
4564 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4565 // This frame available only in IETF QUIC.
4566 return;
4567 }
4568 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4569 // clang-format off
4570 PacketFragments packet_ietf = {
4571 // type (short header, 4 byte packet number)
4572 {"",
4573 {0x43}},
4574 // connection_id
4575 {"",
4576 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4577 // packet number
4578 {"",
4579 {0x12, 0x34, 0x56, 0x78}},
4580 // frame type (IETF_MAX_STREAM_DATA frame)
4581 {"",
4582 {0x11}},
4583 // stream id
4584 {"Unable to read IETF_MAX_STREAM_DATA frame stream id/count.",
4585 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4586 // byte offset
4587 {"Can not read MAX_STREAM_DATA byte-count",
4588 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
4589 0x32, 0x10, 0x76, 0x54}},
4590 };
4591 // clang-format on
4592
4593 std::unique_ptr<QuicEncryptedPacket> encrypted(
4594 AssemblePacketFromFragments(packet_ietf));
4595 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4596
4597 EXPECT_THAT(framer_.error(), IsQuicNoError());
4598 ASSERT_TRUE(visitor_.header_.get());
4599 EXPECT_TRUE(CheckDecryption(
4600 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4601 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4602
4603 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
4604 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
4605
4606 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA);
4607 }
4608
TEST_P(QuicFramerTest,BlockedFrame)4609 TEST_P(QuicFramerTest, BlockedFrame) {
4610 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4611 // clang-format off
4612 PacketFragments packet = {
4613 // type (short header, 4 byte packet number)
4614 {"",
4615 {0x43}},
4616 // connection_id
4617 {"",
4618 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4619 // packet number
4620 {"",
4621 {0x12, 0x34, 0x56, 0x78}},
4622 // frame type (blocked frame)
4623 {"",
4624 {0x05}},
4625 // stream id
4626 {"Unable to read stream_id.",
4627 {0x01, 0x02, 0x03, 0x04}},
4628 };
4629
4630 PacketFragments packet_ietf = {
4631 // type (short header, 4 byte packet number)
4632 {"",
4633 {0x43}},
4634 // connection_id
4635 {"",
4636 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4637 // packet number
4638 {"",
4639 {0x12, 0x34, 0x56, 0x78}},
4640 // frame type (IETF_STREAM_BLOCKED frame)
4641 {"",
4642 {0x15}},
4643 // stream id
4644 {"Unable to read IETF_STREAM_DATA_BLOCKED frame stream id/count.",
4645 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
4646 // Offset
4647 {"Can not read stream blocked offset.",
4648 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
4649 };
4650 // clang-format on
4651
4652 PacketFragments& fragments =
4653 VersionHasIetfQuicFrames(framer_.transport_version()) ? packet_ietf
4654 : packet;
4655 std::unique_ptr<QuicEncryptedPacket> encrypted(
4656 AssemblePacketFromFragments(fragments));
4657 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4658
4659 EXPECT_THAT(framer_.error(), IsQuicNoError());
4660 ASSERT_TRUE(visitor_.header_.get());
4661 EXPECT_TRUE(CheckDecryption(
4662 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4663 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4664
4665 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4666 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
4667 } else {
4668 EXPECT_EQ(0u, visitor_.blocked_frame_.offset);
4669 }
4670 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
4671
4672 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4673 CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_BLOCKED_DATA);
4674 } else {
4675 CheckFramingBoundaries(fragments, QUIC_INVALID_BLOCKED_DATA);
4676 }
4677 }
4678
TEST_P(QuicFramerTest,PingFrame)4679 TEST_P(QuicFramerTest, PingFrame) {
4680 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4681 // clang-format off
4682 unsigned char packet[] = {
4683 // type (short header, 4 byte packet number)
4684 0x43,
4685 // connection_id
4686 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4687 // packet number
4688 0x12, 0x34, 0x56, 0x78,
4689
4690 // frame type
4691 0x07,
4692 };
4693
4694 unsigned char packet_ietf[] = {
4695 // type (short header, 4 byte packet number)
4696 0x43,
4697 // connection_id
4698 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4699 // packet number
4700 0x12, 0x34, 0x56, 0x78,
4701
4702 // frame type (IETF_PING frame)
4703 0x01,
4704 };
4705 // clang-format on
4706
4707 QuicEncryptedPacket encrypted(
4708 AsChars(VersionHasIetfQuicFrames(framer_.transport_version())
4709 ? packet_ietf
4710 : packet),
4711 VersionHasIetfQuicFrames(framer_.transport_version())
4712 ? ABSL_ARRAYSIZE(packet_ietf)
4713 : ABSL_ARRAYSIZE(packet),
4714 false);
4715 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4716
4717 EXPECT_THAT(framer_.error(), IsQuicNoError());
4718 ASSERT_TRUE(visitor_.header_.get());
4719 EXPECT_TRUE(CheckDecryption(
4720 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4721 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4722
4723 EXPECT_EQ(1u, visitor_.ping_frames_.size());
4724
4725 // No need to check the PING frame boundaries because it has no payload.
4726 }
4727
TEST_P(QuicFramerTest,HandshakeDoneFrame)4728 TEST_P(QuicFramerTest, HandshakeDoneFrame) {
4729 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4730 // clang-format off
4731 unsigned char packet[] = {
4732 // type (short header, 4 byte packet number)
4733 0x43,
4734 // connection_id
4735 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4736 // packet number
4737 0x12, 0x34, 0x56, 0x78,
4738
4739 // frame type (Handshake done frame)
4740 0x1e,
4741 };
4742 // clang-format on
4743
4744 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4745 return;
4746 }
4747
4748 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
4749 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4750
4751 EXPECT_THAT(framer_.error(), IsQuicNoError());
4752 ASSERT_TRUE(visitor_.header_.get());
4753 EXPECT_TRUE(CheckDecryption(
4754 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4755 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4756
4757 EXPECT_EQ(1u, visitor_.handshake_done_frames_.size());
4758 }
4759
TEST_P(QuicFramerTest,ParseAckFrequencyFrame)4760 TEST_P(QuicFramerTest, ParseAckFrequencyFrame) {
4761 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4762 // clang-format off
4763 unsigned char packet[] = {
4764 // type (short header, 4 byte packet number)
4765 0x43,
4766 // connection_id
4767 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4768 // packet number
4769 0x12, 0x34, 0x56, 0x78,
4770
4771 // ack frequency frame type (which needs two bytes as it is > 0x3F)
4772 0x40, 0xAF,
4773 // sequence_number
4774 0x11,
4775 // packet_tolerance
4776 0x02,
4777 // max_ack_delay_us = 2'5000 us
4778 0x80, 0x00, 0x61, 0xA8,
4779 // ignore_order
4780 0x01
4781 };
4782 // clang-format on
4783
4784 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4785 return;
4786 }
4787
4788 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
4789 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4790
4791 EXPECT_THAT(framer_.error(), IsQuicNoError());
4792 ASSERT_TRUE(visitor_.header_.get());
4793 EXPECT_TRUE(CheckDecryption(
4794 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4795 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4796
4797 ASSERT_EQ(1u, visitor_.ack_frequency_frames_.size());
4798 const auto& frame = visitor_.ack_frequency_frames_.front();
4799 EXPECT_EQ(17u, frame->sequence_number);
4800 EXPECT_EQ(2u, frame->packet_tolerance);
4801 EXPECT_EQ(2'5000u, frame->max_ack_delay.ToMicroseconds());
4802 EXPECT_EQ(true, frame->ignore_order);
4803 }
4804
TEST_P(QuicFramerTest,ParseResetStreamAtFrame)4805 TEST_P(QuicFramerTest, ParseResetStreamAtFrame) {
4806 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4807 // clang-format off
4808 unsigned char packet[] = {
4809 // type (short header, 4 byte packet number)
4810 0x43,
4811 // connection_id
4812 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4813 // packet number
4814 0x12, 0x34, 0x56, 0x78,
4815
4816 // type = RESET_STREAM_AT
4817 0x24,
4818 // stream ID
4819 0x00,
4820 // application error code
4821 0x1e,
4822 // final size
4823 0x20,
4824 // reliable size
4825 0x10,
4826 };
4827 // clang-format on
4828
4829 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4830 return;
4831 }
4832 framer_.set_process_reset_stream_at(true);
4833
4834 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
4835 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4836
4837 EXPECT_THAT(framer_.error(), IsQuicNoError());
4838 ASSERT_TRUE(visitor_.header_.get());
4839 EXPECT_TRUE(CheckDecryption(
4840 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4841 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4842
4843 ASSERT_EQ(visitor_.reset_stream_at_frames_.size(), 1);
4844 const QuicResetStreamAtFrame& frame = *visitor_.reset_stream_at_frames_[0];
4845 EXPECT_EQ(frame.stream_id, 0x00);
4846 EXPECT_EQ(frame.error, 0x1e);
4847 EXPECT_EQ(frame.final_offset, 0x20);
4848 EXPECT_EQ(frame.reliable_offset, 0x10);
4849 }
4850
TEST_P(QuicFramerTest,ParseInvalidResetStreamAtFrame)4851 TEST_P(QuicFramerTest, ParseInvalidResetStreamAtFrame) {
4852 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4853 // clang-format off
4854 unsigned char packet[] = {
4855 // type (short header, 4 byte packet number)
4856 0x43,
4857 // connection_id
4858 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
4859 // packet number
4860 0x12, 0x34, 0x56, 0x78,
4861
4862 // type = RESET_STREAM_AT
4863 0x24,
4864 // stream ID
4865 0x00,
4866 // application error code
4867 0x1e,
4868 // final size
4869 0x20,
4870 // reliable size
4871 0x30,
4872 };
4873 // clang-format on
4874
4875 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
4876 return;
4877 }
4878 framer_.set_process_reset_stream_at(true);
4879
4880 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
4881 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
4882 EXPECT_EQ(framer_.error(), QUIC_INVALID_FRAME_DATA);
4883 EXPECT_EQ(visitor_.reset_stream_at_frames_.size(), 0);
4884 }
4885
TEST_P(QuicFramerTest,MessageFrame)4886 TEST_P(QuicFramerTest, MessageFrame) {
4887 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
4888 // clang-format off
4889 PacketFragments packet = {
4890 // type (short header, 4 byte packet number)
4891 {"",
4892 {0x43}},
4893 // connection_id
4894 {"",
4895 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4896 // packet number
4897 {"",
4898 {0x12, 0x34, 0x56, 0x78}},
4899 // message frame type.
4900 {"",
4901 { 0x21 }},
4902 // message length
4903 {"Unable to read message length",
4904 {0x07}},
4905 // message data
4906 {"Unable to read message data",
4907 {'m', 'e', 's', 's', 'a', 'g', 'e'}},
4908 // message frame no length.
4909 {"",
4910 { 0x20 }},
4911 // message data
4912 {{},
4913 {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
4914 };
4915 PacketFragments packet_ietf = {
4916 // type (short header, 4 byte packet number)
4917 {"",
4918 {0x43}},
4919 // connection_id
4920 {"",
4921 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
4922 // packet number
4923 {"",
4924 {0x12, 0x34, 0x56, 0x78}},
4925 // message frame type.
4926 {"",
4927 { 0x31 }},
4928 // message length
4929 {"Unable to read message length",
4930 {0x07}},
4931 // message data
4932 {"Unable to read message data",
4933 {'m', 'e', 's', 's', 'a', 'g', 'e'}},
4934 // message frame no length.
4935 {"",
4936 { 0x30 }},
4937 // message data
4938 {{},
4939 {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
4940 };
4941 // clang-format on
4942
4943 std::unique_ptr<QuicEncryptedPacket> encrypted;
4944 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4945 encrypted = AssemblePacketFromFragments(packet_ietf);
4946 } else {
4947 encrypted = AssemblePacketFromFragments(packet);
4948 }
4949 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
4950
4951 EXPECT_THAT(framer_.error(), IsQuicNoError());
4952 ASSERT_TRUE(visitor_.header_.get());
4953 EXPECT_TRUE(CheckDecryption(
4954 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
4955 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
4956
4957 ASSERT_EQ(2u, visitor_.message_frames_.size());
4958 EXPECT_EQ(7u, visitor_.message_frames_[0]->message_length);
4959 EXPECT_EQ(8u, visitor_.message_frames_[1]->message_length);
4960
4961 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
4962 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_MESSAGE_DATA);
4963 } else {
4964 CheckFramingBoundaries(packet, QUIC_INVALID_MESSAGE_DATA);
4965 }
4966 }
4967
TEST_P(QuicFramerTest,IetfStatelessResetPacket)4968 TEST_P(QuicFramerTest, IetfStatelessResetPacket) {
4969 // clang-format off
4970 unsigned char packet[] = {
4971 // type (short packet, 1 byte packet number)
4972 0x50,
4973 // Random bytes
4974 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4975 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4976 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4977 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
4978 // stateless reset token
4979 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
4980 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
4981 };
4982 // clang-format on
4983 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
4984 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
4985 TestConnectionId(0x33));
4986 decrypter_ = new test::TestDecrypter();
4987 if (framer_.version().KnowsWhichDecrypterToUse()) {
4988 framer_.InstallDecrypter(
4989 ENCRYPTION_INITIAL,
4990 std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
4991 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
4992 std::unique_ptr<QuicDecrypter>(decrypter_));
4993 } else {
4994 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
4995 Perspective::IS_CLIENT));
4996 framer_.SetAlternativeDecrypter(
4997 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
4998 }
4999 // This packet cannot be decrypted because diversification nonce is missing.
5000 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
5001 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5002 ASSERT_THAT(framer_.error(), IsQuicNoError());
5003 ASSERT_TRUE(visitor_.stateless_reset_packet_.get());
5004 EXPECT_EQ(kTestStatelessResetToken,
5005 visitor_.stateless_reset_packet_->stateless_reset_token);
5006 }
5007
TEST_P(QuicFramerTest,IetfStatelessResetPacketInvalidStatelessResetToken)5008 TEST_P(QuicFramerTest, IetfStatelessResetPacketInvalidStatelessResetToken) {
5009 // clang-format off
5010 unsigned char packet[] = {
5011 // type (short packet, 1 byte packet number)
5012 0x50,
5013 // Random bytes
5014 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5015 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5016 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5017 0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
5018 // stateless reset token
5019 0xB6, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
5020 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5021 };
5022 // clang-format on
5023 QuicFramerPeer::SetLastSerializedServerConnectionId(&framer_,
5024 TestConnectionId(0x33));
5025 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5026 decrypter_ = new test::TestDecrypter();
5027 if (framer_.version().KnowsWhichDecrypterToUse()) {
5028 framer_.InstallDecrypter(
5029 ENCRYPTION_INITIAL,
5030 std::make_unique<NullDecrypter>(Perspective::IS_CLIENT));
5031 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
5032 std::unique_ptr<QuicDecrypter>(decrypter_));
5033 } else {
5034 framer_.SetDecrypter(ENCRYPTION_INITIAL, std::make_unique<NullDecrypter>(
5035 Perspective::IS_CLIENT));
5036 framer_.SetAlternativeDecrypter(
5037 ENCRYPTION_ZERO_RTT, std::unique_ptr<QuicDecrypter>(decrypter_), false);
5038 }
5039 // This packet cannot be decrypted because diversification nonce is missing.
5040 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
5041 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5042 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
5043 ASSERT_FALSE(visitor_.stateless_reset_packet_);
5044 }
5045
TEST_P(QuicFramerTest,VersionNegotiationPacketClient)5046 TEST_P(QuicFramerTest, VersionNegotiationPacketClient) {
5047 // clang-format off
5048 PacketFragments packet = {
5049 // type (long header)
5050 {"",
5051 {0x8F}},
5052 // version tag
5053 {"",
5054 {0x00, 0x00, 0x00, 0x00}},
5055 {"",
5056 {0x05}},
5057 // connection_id
5058 {"",
5059 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5060 // Supported versions
5061 {"Unable to read supported version in negotiation.",
5062 {QUIC_VERSION_BYTES,
5063 'Q', '2', '.', '0'}},
5064 };
5065
5066 PacketFragments packet49 = {
5067 // type (long header)
5068 {"",
5069 {0x8F}},
5070 // version tag
5071 {"",
5072 {0x00, 0x00, 0x00, 0x00}},
5073 {"",
5074 {0x08}},
5075 // connection_id
5076 {"",
5077 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5078 {"",
5079 {0x00}},
5080 // Supported versions
5081 {"Unable to read supported version in negotiation.",
5082 {QUIC_VERSION_BYTES,
5083 'Q', '2', '.', '0'}},
5084 };
5085 // clang-format on
5086
5087 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5088
5089 PacketFragments& fragments =
5090 framer_.version().HasLongHeaderLengths() ? packet49 : packet;
5091 std::unique_ptr<QuicEncryptedPacket> encrypted(
5092 AssemblePacketFromFragments(fragments));
5093 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5094 ASSERT_THAT(framer_.error(), IsQuicNoError());
5095 ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
5096 EXPECT_EQ(1u, visitor_.version_negotiation_packet_->versions.size());
5097 EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]);
5098
5099 // Remove the last version from the packet so that every truncated
5100 // version of the packet is invalid, otherwise checking boundaries
5101 // is annoyingly complicated.
5102 for (size_t i = 0; i < 4; ++i) {
5103 fragments.back().fragment.pop_back();
5104 }
5105 CheckFramingBoundaries(fragments, QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
5106 }
5107
TEST_P(QuicFramerTest,VersionNegotiationPacketServer)5108 TEST_P(QuicFramerTest, VersionNegotiationPacketServer) {
5109 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
5110 // clang-format off
5111 unsigned char packet[] = {
5112 // public flags (long header with all ignored bits set)
5113 0xFF,
5114 // version
5115 0x00, 0x00, 0x00, 0x00,
5116 // connection ID lengths
5117 0x50,
5118 // destination connection ID
5119 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5120 // supported versions
5121 QUIC_VERSION_BYTES,
5122 'Q', '2', '.', '0',
5123 };
5124 unsigned char packet2[] = {
5125 // public flags (long header with all ignored bits set)
5126 0xFF,
5127 // version
5128 0x00, 0x00, 0x00, 0x00,
5129 // destination connection ID length
5130 0x08,
5131 // destination connection ID
5132 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5133 // source connection ID length
5134 0x00,
5135 // supported versions
5136 QUIC_VERSION_BYTES,
5137 'Q', '2', '.', '0',
5138 };
5139 // clang-format on
5140 unsigned char* p = packet;
5141 size_t p_length = ABSL_ARRAYSIZE(packet);
5142 if (framer_.version().HasLengthPrefixedConnectionIds()) {
5143 p = packet2;
5144 p_length = ABSL_ARRAYSIZE(packet2);
5145 }
5146
5147 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
5148 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5149 EXPECT_THAT(framer_.error(),
5150 IsError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET));
5151 EXPECT_EQ("Server received version negotiation packet.",
5152 framer_.detailed_error());
5153 EXPECT_FALSE(visitor_.version_negotiation_packet_.get());
5154 }
5155
TEST_P(QuicFramerTest,ParseIetfRetryPacket)5156 TEST_P(QuicFramerTest, ParseIetfRetryPacket) {
5157 if (!framer_.version().SupportsRetry()) {
5158 return;
5159 }
5160 // IETF RETRY is only sent from client to server.
5161 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5162 // clang-format off
5163 unsigned char packet[] = {
5164 // public flags (long header with packet type RETRY and ODCIL=8)
5165 0xF5,
5166 // version
5167 QUIC_VERSION_BYTES,
5168 // connection ID lengths
5169 0x05,
5170 // source connection ID
5171 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5172 // original destination connection ID
5173 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5174 // retry token
5175 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5176 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5177 };
5178 unsigned char packet49[] = {
5179 // public flags (long header with packet type RETRY)
5180 0xF0,
5181 // version
5182 QUIC_VERSION_BYTES,
5183 // destination connection ID length
5184 0x00,
5185 // source connection ID length
5186 0x08,
5187 // source connection ID
5188 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5189 // original destination connection ID length
5190 0x08,
5191 // original destination connection ID
5192 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5193 // retry token
5194 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5195 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5196 };
5197 unsigned char packet_with_tag[] = {
5198 // public flags (long header with packet type RETRY)
5199 0xF0,
5200 // version
5201 QUIC_VERSION_BYTES,
5202 // destination connection ID length
5203 0x00,
5204 // source connection ID length
5205 0x08,
5206 // source connection ID
5207 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
5208 // retry token
5209 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
5210 ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
5211 // retry token integrity tag
5212 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
5213 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
5214 };
5215 // clang-format on
5216
5217 unsigned char* p = packet;
5218 size_t p_length = ABSL_ARRAYSIZE(packet);
5219 if (framer_.version().UsesTls()) {
5220 ReviseFirstByteByVersion(packet_with_tag);
5221 p = packet_with_tag;
5222 p_length = ABSL_ARRAYSIZE(packet_with_tag);
5223 } else if (framer_.version().HasLongHeaderLengths()) {
5224 p = packet49;
5225 p_length = ABSL_ARRAYSIZE(packet49);
5226 }
5227 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
5228 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
5229
5230 EXPECT_THAT(framer_.error(), IsQuicNoError());
5231 ASSERT_TRUE(visitor_.header_.get());
5232
5233 ASSERT_TRUE(visitor_.on_retry_packet_called_);
5234 ASSERT_TRUE(visitor_.retry_new_connection_id_.get());
5235 ASSERT_TRUE(visitor_.retry_token_.get());
5236
5237 if (framer_.version().UsesTls()) {
5238 ASSERT_TRUE(visitor_.retry_token_integrity_tag_.get());
5239 static const unsigned char expected_integrity_tag[16] = {
5240 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
5241 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
5242 };
5243 quiche::test::CompareCharArraysWithHexError(
5244 "retry integrity tag", visitor_.retry_token_integrity_tag_->data(),
5245 visitor_.retry_token_integrity_tag_->length(),
5246 reinterpret_cast<const char*>(expected_integrity_tag),
5247 ABSL_ARRAYSIZE(expected_integrity_tag));
5248 ASSERT_TRUE(visitor_.retry_without_tag_.get());
5249 quiche::test::CompareCharArraysWithHexError(
5250 "retry without tag", visitor_.retry_without_tag_->data(),
5251 visitor_.retry_without_tag_->length(),
5252 reinterpret_cast<const char*>(packet_with_tag), 35);
5253 } else {
5254 ASSERT_TRUE(visitor_.retry_original_connection_id_.get());
5255 EXPECT_EQ(FramerTestConnectionId(),
5256 *visitor_.retry_original_connection_id_.get());
5257 }
5258
5259 EXPECT_EQ(FramerTestConnectionIdPlusOne(),
5260 *visitor_.retry_new_connection_id_.get());
5261 EXPECT_EQ("Hello this is RETRY!", *visitor_.retry_token_.get());
5262
5263 // IETF RETRY is only sent from client to server, the rest of this test
5264 // ensures that the server correctly drops them without acting on them.
5265 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
5266 // Reset our visitor state to default settings.
5267 visitor_.retry_original_connection_id_.reset();
5268 visitor_.retry_new_connection_id_.reset();
5269 visitor_.retry_token_.reset();
5270 visitor_.retry_token_integrity_tag_.reset();
5271 visitor_.retry_without_tag_.reset();
5272 visitor_.on_retry_packet_called_ = false;
5273
5274 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
5275
5276 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
5277 EXPECT_EQ("Client-initiated RETRY is invalid.", framer_.detailed_error());
5278
5279 EXPECT_FALSE(visitor_.on_retry_packet_called_);
5280 EXPECT_FALSE(visitor_.retry_new_connection_id_.get());
5281 EXPECT_FALSE(visitor_.retry_token_.get());
5282 EXPECT_FALSE(visitor_.retry_token_integrity_tag_.get());
5283 EXPECT_FALSE(visitor_.retry_without_tag_.get());
5284 }
5285
TEST_P(QuicFramerTest,BuildPaddingFramePacket)5286 TEST_P(QuicFramerTest, BuildPaddingFramePacket) {
5287 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5288 QuicPacketHeader header;
5289 header.destination_connection_id = FramerTestConnectionId();
5290 header.reset_flag = false;
5291 header.version_flag = false;
5292 header.packet_number = kPacketNumber;
5293
5294 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5295
5296 // clang-format off
5297 unsigned char packet[kMaxOutgoingPacketSize] = {
5298 // type (short header, 4 byte packet number)
5299 0x43,
5300 // connection_id
5301 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5302 // packet number
5303 0x12, 0x34, 0x56, 0x78,
5304
5305 // frame type (padding frame)
5306 0x00,
5307 0x00, 0x00, 0x00, 0x00
5308 };
5309
5310 unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
5311 // type (short header, 4 byte packet number)
5312 0x43,
5313 // connection_id
5314 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5315 // packet number
5316 0x12, 0x34, 0x56, 0x78,
5317
5318 // frame type (padding frame)
5319 0x00,
5320 0x00, 0x00, 0x00, 0x00
5321 };
5322 // clang-format on
5323
5324 unsigned char* p = packet;
5325 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5326 p = packet_ietf;
5327 }
5328
5329 uint64_t header_size = GetPacketHeaderSize(
5330 framer_.transport_version(), kPacket8ByteConnectionId,
5331 kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
5332 PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
5333 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
5334 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
5335
5336 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5337 ASSERT_TRUE(data != nullptr);
5338
5339 quiche::test::CompareCharArraysWithHexError(
5340 "constructed packet", data->data(), data->length(), AsChars(p),
5341 ABSL_ARRAYSIZE(packet));
5342 }
5343
TEST_P(QuicFramerTest,BuildStreamFramePacketWithNewPaddingFrame)5344 TEST_P(QuicFramerTest, BuildStreamFramePacketWithNewPaddingFrame) {
5345 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5346 QuicPacketHeader header;
5347 header.destination_connection_id = FramerTestConnectionId();
5348 header.reset_flag = false;
5349 header.version_flag = false;
5350 header.packet_number = kPacketNumber;
5351 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
5352 absl::string_view("hello world!"));
5353 QuicPaddingFrame padding_frame(2);
5354 QuicFrames frames = {QuicFrame(padding_frame), QuicFrame(stream_frame),
5355 QuicFrame(padding_frame)};
5356
5357 // clang-format off
5358 unsigned char packet[] = {
5359 // type (short header, 4 byte packet number)
5360 0x43,
5361 // connection_id
5362 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5363 // packet number
5364 0x12, 0x34, 0x56, 0x78,
5365
5366 // paddings
5367 0x00, 0x00,
5368 // frame type (stream frame with fin)
5369 0xFF,
5370 // stream id
5371 0x01, 0x02, 0x03, 0x04,
5372 // offset
5373 0x3A, 0x98, 0xFE, 0xDC,
5374 0x32, 0x10, 0x76, 0x54,
5375 // data length
5376 0x00, 0x0c,
5377 // data
5378 'h', 'e', 'l', 'l',
5379 'o', ' ', 'w', 'o',
5380 'r', 'l', 'd', '!',
5381 // paddings
5382 0x00, 0x00,
5383 };
5384
5385 unsigned char packet_ietf[] = {
5386 // type (short header, 4 byte packet number)
5387 0x43,
5388 // connection_id
5389 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5390 // packet number
5391 0x12, 0x34, 0x56, 0x78,
5392
5393 // paddings
5394 0x00, 0x00,
5395 // frame type (IETF_STREAM with FIN, LEN, and OFFSET bits set)
5396 0x08 | 0x01 | 0x02 | 0x04,
5397 // stream id
5398 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
5399 // offset
5400 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5401 0x32, 0x10, 0x76, 0x54,
5402 // data length
5403 kVarInt62OneByte + 0x0c,
5404 // data
5405 'h', 'e', 'l', 'l',
5406 'o', ' ', 'w', 'o',
5407 'r', 'l', 'd', '!',
5408 // paddings
5409 0x00, 0x00,
5410 };
5411 // clang-format on
5412
5413 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5414 ASSERT_TRUE(data != nullptr);
5415
5416 unsigned char* p = packet;
5417 size_t p_size = ABSL_ARRAYSIZE(packet);
5418 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5419 p = packet_ietf;
5420 p_size = ABSL_ARRAYSIZE(packet_ietf);
5421 }
5422 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
5423
5424 quiche::test::CompareCharArraysWithHexError(
5425 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
5426 }
5427
TEST_P(QuicFramerTest,Build4ByteSequenceNumberPaddingFramePacket)5428 TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) {
5429 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5430 QuicPacketHeader header;
5431 header.destination_connection_id = FramerTestConnectionId();
5432 header.reset_flag = false;
5433 header.version_flag = false;
5434 header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
5435 header.packet_number = kPacketNumber;
5436
5437 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5438
5439 // clang-format off
5440 unsigned char packet[kMaxOutgoingPacketSize] = {
5441 // type (short header, 4 byte packet number)
5442 0x43,
5443 // connection_id
5444 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5445 // packet number
5446 0x12, 0x34, 0x56, 0x78,
5447
5448 // frame type (padding frame)
5449 0x00,
5450 0x00, 0x00, 0x00, 0x00
5451 };
5452
5453 unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
5454 // type (short header, 4 byte packet number)
5455 0x43,
5456 // connection_id
5457 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5458 // packet number
5459 0x12, 0x34, 0x56, 0x78,
5460
5461 // frame type (padding frame)
5462 0x00,
5463 0x00, 0x00, 0x00, 0x00
5464 };
5465 // clang-format on
5466
5467 unsigned char* p = packet;
5468 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5469 p = packet_ietf;
5470 }
5471
5472 uint64_t header_size = GetPacketHeaderSize(
5473 framer_.transport_version(), kPacket8ByteConnectionId,
5474 kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
5475 PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
5476 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
5477 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
5478
5479 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5480 ASSERT_TRUE(data != nullptr);
5481
5482 quiche::test::CompareCharArraysWithHexError(
5483 "constructed packet", data->data(), data->length(), AsChars(p),
5484 ABSL_ARRAYSIZE(packet));
5485 }
5486
TEST_P(QuicFramerTest,Build2ByteSequenceNumberPaddingFramePacket)5487 TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) {
5488 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5489 QuicPacketHeader header;
5490 header.destination_connection_id = FramerTestConnectionId();
5491 header.reset_flag = false;
5492 header.version_flag = false;
5493 header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
5494 header.packet_number = kPacketNumber;
5495
5496 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5497
5498 // clang-format off
5499 unsigned char packet[kMaxOutgoingPacketSize] = {
5500 // type (short header, 2 byte packet number)
5501 0x41,
5502 // connection_id
5503 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5504 // packet number
5505 0x56, 0x78,
5506
5507 // frame type (padding frame)
5508 0x00,
5509 0x00, 0x00, 0x00, 0x00
5510 };
5511
5512 unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
5513 // type (short header, 2 byte packet number)
5514 0x41,
5515 // connection_id
5516 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5517 // packet number
5518 0x56, 0x78,
5519
5520 // frame type (padding frame)
5521 0x00,
5522 0x00, 0x00, 0x00, 0x00
5523 };
5524 // clang-format on
5525
5526 unsigned char* p = packet;
5527 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5528 p = packet_ietf;
5529 }
5530
5531 uint64_t header_size = GetPacketHeaderSize(
5532 framer_.transport_version(), kPacket8ByteConnectionId,
5533 kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
5534 PACKET_2BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
5535 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
5536 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
5537
5538 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5539 ASSERT_TRUE(data != nullptr);
5540
5541 quiche::test::CompareCharArraysWithHexError(
5542 "constructed packet", data->data(), data->length(), AsChars(p),
5543 ABSL_ARRAYSIZE(packet));
5544 }
5545
TEST_P(QuicFramerTest,Build1ByteSequenceNumberPaddingFramePacket)5546 TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) {
5547 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5548 QuicPacketHeader header;
5549 header.destination_connection_id = FramerTestConnectionId();
5550 header.reset_flag = false;
5551 header.version_flag = false;
5552 header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
5553 header.packet_number = kPacketNumber;
5554
5555 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
5556
5557 // clang-format off
5558 unsigned char packet[kMaxOutgoingPacketSize] = {
5559 // type (short header, 1 byte packet number)
5560 0x40,
5561 // connection_id
5562 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5563 // packet number
5564 0x78,
5565
5566 // frame type (padding frame)
5567 0x00,
5568 0x00, 0x00, 0x00, 0x00
5569 };
5570
5571 unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
5572 // type (short header, 1 byte packet number)
5573 0x40,
5574 // connection_id
5575 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5576 // packet number
5577 0x78,
5578
5579 // frame type (padding frame)
5580 0x00,
5581 0x00, 0x00, 0x00, 0x00
5582 };
5583 // clang-format on
5584
5585 unsigned char* p = packet;
5586 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5587 p = packet_ietf;
5588 }
5589
5590 uint64_t header_size = GetPacketHeaderSize(
5591 framer_.transport_version(), kPacket8ByteConnectionId,
5592 kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
5593 PACKET_1BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
5594 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
5595 memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
5596
5597 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5598 ASSERT_TRUE(data != nullptr);
5599
5600 quiche::test::CompareCharArraysWithHexError(
5601 "constructed packet", data->data(), data->length(), AsChars(p),
5602 ABSL_ARRAYSIZE(packet));
5603 }
5604
TEST_P(QuicFramerTest,BuildStreamFramePacket)5605 TEST_P(QuicFramerTest, BuildStreamFramePacket) {
5606 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5607 QuicPacketHeader header;
5608 header.destination_connection_id = FramerTestConnectionId();
5609 header.reset_flag = false;
5610 header.version_flag = false;
5611 header.packet_number = kPacketNumber;
5612 if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
5613 header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
5614 }
5615
5616 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
5617 absl::string_view("hello world!"));
5618
5619 QuicFrames frames = {QuicFrame(stream_frame)};
5620
5621 // clang-format off
5622 unsigned char packet[] = {
5623 // type (short header, 4 byte packet number)
5624 0x43,
5625 // connection_id
5626 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5627 // packet number
5628 0x12, 0x34, 0x56, 0x78,
5629
5630 // frame type (stream frame with fin and no length)
5631 0xDF,
5632 // stream id
5633 0x01, 0x02, 0x03, 0x04,
5634 // offset
5635 0x3A, 0x98, 0xFE, 0xDC,
5636 0x32, 0x10, 0x76, 0x54,
5637 // data
5638 'h', 'e', 'l', 'l',
5639 'o', ' ', 'w', 'o',
5640 'r', 'l', 'd', '!',
5641 };
5642
5643 unsigned char packet_ietf[] = {
5644 // type (short header, 4 byte packet number)
5645 0x43,
5646 // connection_id
5647 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5648 // packet number
5649 0x12, 0x34, 0x56, 0x78,
5650
5651 // frame type (IETF_STREAM frame with FIN and OFFSET, no length)
5652 0x08 | 0x01 | 0x04,
5653 // stream id
5654 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
5655 // offset
5656 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5657 0x32, 0x10, 0x76, 0x54,
5658 // data
5659 'h', 'e', 'l', 'l',
5660 'o', ' ', 'w', 'o',
5661 'r', 'l', 'd', '!',
5662 };
5663 // clang-format on
5664
5665 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5666 ASSERT_TRUE(data != nullptr);
5667
5668 unsigned char* p = packet;
5669 size_t p_size = ABSL_ARRAYSIZE(packet);
5670 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5671 p = packet_ietf;
5672 p_size = ABSL_ARRAYSIZE(packet_ietf);
5673 }
5674 quiche::test::CompareCharArraysWithHexError(
5675 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
5676 }
5677
TEST_P(QuicFramerTest,BuildStreamFramePacketWithVersionFlag)5678 TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) {
5679 QuicPacketHeader header;
5680 header.destination_connection_id = FramerTestConnectionId();
5681 header.reset_flag = false;
5682 header.version_flag = true;
5683 header.long_packet_type = ZERO_RTT_PROTECTED;
5684 header.packet_number = kPacketNumber;
5685 if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
5686 header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
5687 }
5688
5689 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
5690 absl::string_view("hello world!"));
5691 QuicFrames frames = {QuicFrame(stream_frame)};
5692
5693 // clang-format off
5694 unsigned char packet[] = {
5695 // type (long header with packet type ZERO_RTT_PROTECTED)
5696 0xD3,
5697 // version tag
5698 QUIC_VERSION_BYTES,
5699 // connection_id length
5700 0x50,
5701 // connection_id
5702 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5703 // packet number
5704 0x12, 0x34, 0x56, 0x78,
5705
5706 // frame type (stream frame with fin and no length)
5707 0xDF,
5708 // stream id
5709 0x01, 0x02, 0x03, 0x04,
5710 // offset
5711 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
5712 // data
5713 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
5714 };
5715
5716 unsigned char packet49[] = {
5717 // type (long header with packet type ZERO_RTT_PROTECTED)
5718 0xD3,
5719 // version tag
5720 QUIC_VERSION_BYTES,
5721 // destination connection ID length
5722 0x08,
5723 // destination connection ID
5724 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5725 // source connection ID length
5726 0x00,
5727 // length
5728 0x40, 0x1D,
5729 // packet number
5730 0x12, 0x34, 0x56, 0x78,
5731
5732 // frame type (stream frame with fin and no length)
5733 0xDF,
5734 // stream id
5735 0x01, 0x02, 0x03, 0x04,
5736 // offset
5737 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
5738 // data
5739 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
5740 };
5741
5742 unsigned char packet_ietf[] = {
5743 // type (long header with packet type ZERO_RTT_PROTECTED)
5744 0xD3,
5745 // version tag
5746 QUIC_VERSION_BYTES,
5747 // destination connection ID length
5748 0x08,
5749 // destination connection ID
5750 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5751 // source connection ID length
5752 0x00,
5753 // length
5754 0x40, 0x1D,
5755 // packet number
5756 0x12, 0x34, 0x56, 0x78,
5757
5758 // frame type (IETF_STREAM frame with fin and offset, no length)
5759 0x08 | 0x01 | 0x04,
5760 // stream id
5761 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
5762 // offset
5763 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
5764 // data
5765 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
5766 };
5767 // clang-format on
5768
5769 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5770 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5771 ASSERT_TRUE(data != nullptr);
5772
5773 unsigned char* p = packet;
5774 size_t p_size = ABSL_ARRAYSIZE(packet);
5775 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
5776 ReviseFirstByteByVersion(packet_ietf);
5777 p = packet_ietf;
5778 p_size = ABSL_ARRAYSIZE(packet_ietf);
5779 } else if (framer_.version().HasLongHeaderLengths()) {
5780 p = packet49;
5781 p_size = ABSL_ARRAYSIZE(packet49);
5782 }
5783 quiche::test::CompareCharArraysWithHexError(
5784 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
5785 }
5786
TEST_P(QuicFramerTest,BuildCryptoFramePacket)5787 TEST_P(QuicFramerTest, BuildCryptoFramePacket) {
5788 if (!QuicVersionUsesCryptoFrames(framer_.transport_version())) {
5789 return;
5790 }
5791 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
5792 QuicPacketHeader header;
5793 header.destination_connection_id = FramerTestConnectionId();
5794 header.reset_flag = false;
5795 header.version_flag = false;
5796 header.packet_number = kPacketNumber;
5797
5798 SimpleDataProducer data_producer;
5799 framer_.set_data_producer(&data_producer);
5800
5801 absl::string_view crypto_frame_contents("hello world!");
5802 QuicCryptoFrame crypto_frame(ENCRYPTION_INITIAL, kStreamOffset,
5803 crypto_frame_contents.length());
5804 data_producer.SaveCryptoData(ENCRYPTION_INITIAL, kStreamOffset,
5805 crypto_frame_contents);
5806
5807 QuicFrames frames = {QuicFrame(&crypto_frame)};
5808
5809 // clang-format off
5810 unsigned char packet48[] = {
5811 // type (short header, 4 byte packet number)
5812 0x43,
5813 // connection_id
5814 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5815 // packet number
5816 0x12, 0x34, 0x56, 0x78,
5817
5818 // frame type (QuicFrameType CRYPTO_FRAME)
5819 0x08,
5820 // offset
5821 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5822 0x32, 0x10, 0x76, 0x54,
5823 // length
5824 kVarInt62OneByte + 12,
5825 // data
5826 'h', 'e', 'l', 'l',
5827 'o', ' ', 'w', 'o',
5828 'r', 'l', 'd', '!',
5829 };
5830
5831 unsigned char packet_ietf[] = {
5832 // type (short header, 4 byte packet number)
5833 0x43,
5834 // connection_id
5835 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5836 // packet number
5837 0x12, 0x34, 0x56, 0x78,
5838
5839 // frame type (IETF_CRYPTO frame)
5840 0x06,
5841 // offset
5842 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5843 0x32, 0x10, 0x76, 0x54,
5844 // length
5845 kVarInt62OneByte + 12,
5846 // data
5847 'h', 'e', 'l', 'l',
5848 'o', ' ', 'w', 'o',
5849 'r', 'l', 'd', '!',
5850 };
5851 // clang-format on
5852
5853 unsigned char* packet = packet48;
5854 size_t packet_size = ABSL_ARRAYSIZE(packet48);
5855 if (framer_.version().HasIetfQuicFrames()) {
5856 packet = packet_ietf;
5857 packet_size = ABSL_ARRAYSIZE(packet_ietf);
5858 }
5859
5860 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
5861 ASSERT_TRUE(data != nullptr);
5862 quiche::test::CompareCharArraysWithHexError("constructed packet",
5863 data->data(), data->length(),
5864 AsChars(packet), packet_size);
5865 }
5866
TEST_P(QuicFramerTest,CryptoFrame)5867 TEST_P(QuicFramerTest, CryptoFrame) {
5868 if (!QuicVersionUsesCryptoFrames(framer_.transport_version())) {
5869 // CRYPTO frames aren't supported prior to v48.
5870 return;
5871 }
5872 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
5873
5874 // clang-format off
5875 PacketFragments packet48 = {
5876 // type (short header, 4 byte packet number)
5877 {"",
5878 {0x43}},
5879 // connection_id
5880 {"",
5881 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5882 // packet number
5883 {"",
5884 {0x12, 0x34, 0x56, 0x78}},
5885 // frame type (QuicFrameType CRYPTO_FRAME)
5886 {"",
5887 {0x08}},
5888 // offset
5889 {"",
5890 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5891 0x32, 0x10, 0x76, 0x54}},
5892 // data length
5893 {"Invalid data length.",
5894 {kVarInt62OneByte + 12}},
5895 // data
5896 {"Unable to read frame data.",
5897 {'h', 'e', 'l', 'l',
5898 'o', ' ', 'w', 'o',
5899 'r', 'l', 'd', '!'}},
5900 };
5901
5902 PacketFragments packet_ietf = {
5903 // type (short header, 4 byte packet number)
5904 {"",
5905 {0x43}},
5906 // connection_id
5907 {"",
5908 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
5909 // packet number
5910 {"",
5911 {0x12, 0x34, 0x56, 0x78}},
5912 // frame type (IETF_CRYPTO frame)
5913 {"",
5914 {0x06}},
5915 // offset
5916 {"",
5917 {kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
5918 0x32, 0x10, 0x76, 0x54}},
5919 // data length
5920 {"Invalid data length.",
5921 {kVarInt62OneByte + 12}},
5922 // data
5923 {"Unable to read frame data.",
5924 {'h', 'e', 'l', 'l',
5925 'o', ' ', 'w', 'o',
5926 'r', 'l', 'd', '!'}},
5927 };
5928 // clang-format on
5929
5930 PacketFragments& fragments =
5931 framer_.version().HasIetfQuicFrames() ? packet_ietf : packet48;
5932 std::unique_ptr<QuicEncryptedPacket> encrypted(
5933 AssemblePacketFromFragments(fragments));
5934 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
5935
5936 EXPECT_THAT(framer_.error(), IsQuicNoError());
5937 ASSERT_TRUE(visitor_.header_.get());
5938 EXPECT_TRUE(CheckDecryption(
5939 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
5940 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
5941 ASSERT_EQ(1u, visitor_.crypto_frames_.size());
5942 QuicCryptoFrame* frame = visitor_.crypto_frames_[0].get();
5943 EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, frame->level);
5944 EXPECT_EQ(kStreamOffset, frame->offset);
5945 EXPECT_EQ("hello world!",
5946 std::string(frame->data_buffer, frame->data_length));
5947
5948 CheckFramingBoundaries(fragments, QUIC_INVALID_FRAME_DATA);
5949 }
5950
TEST_P(QuicFramerTest,BuildOldVersionNegotiationPacket)5951 TEST_P(QuicFramerTest, BuildOldVersionNegotiationPacket) {
5952 SetQuicFlag(quic_disable_version_negotiation_grease_randomness, true);
5953 // clang-format off
5954 unsigned char packet[] = {
5955 // public flags (version, 8 byte connection_id)
5956 0x0D,
5957 // connection_id
5958 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5959 // supported versions
5960 0xDA, 0x5A, 0x3A, 0x3A,
5961 QUIC_VERSION_BYTES,
5962 };
5963 QuicConnectionId connection_id = FramerTestConnectionId();
5964 std::unique_ptr<QuicEncryptedPacket> data(
5965 QuicFramer::BuildVersionNegotiationPacket(
5966 connection_id, EmptyQuicConnectionId(), /*ietf_quic=*/false,
5967 /*use_length_prefix=*/false,
5968 SupportedVersions(GetParam())));
5969 quiche::test::CompareCharArraysWithHexError(
5970 "constructed packet", data->data(), data->length(), AsChars(packet),
5971 ABSL_ARRAYSIZE(packet));
5972 }
5973
TEST_P(QuicFramerTest,BuildVersionNegotiationPacket)5974 TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) {
5975 SetQuicFlag(quic_disable_version_negotiation_grease_randomness, true);
5976 // clang-format off
5977 unsigned char packet[] = {
5978 // type (long header)
5979 0xC0,
5980 // version tag
5981 0x00, 0x00, 0x00, 0x00,
5982 // connection_id length
5983 0x05,
5984 // connection_id
5985 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
5986 // supported versions
5987 0xDA, 0x5A, 0x3A, 0x3A,
5988 QUIC_VERSION_BYTES,
5989 };
5990 unsigned char packet49[] = {
5991 // type (long header)
5992 0xC0,
5993 // version tag
5994 0x00, 0x00, 0x00, 0x00,
5995 // destination connection ID length
5996 0x00,
5997 // source connection ID length
5998 0x08,
5999 // source connection ID
6000 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6001 // supported versions
6002 0xDA, 0x5A, 0x3A, 0x3A,
6003 QUIC_VERSION_BYTES,
6004 };
6005 // clang-format on
6006 unsigned char* p = packet;
6007 size_t p_size = ABSL_ARRAYSIZE(packet);
6008 if (framer_.version().HasLongHeaderLengths()) {
6009 p = packet49;
6010 p_size = ABSL_ARRAYSIZE(packet49);
6011 }
6012
6013 QuicConnectionId connection_id = FramerTestConnectionId();
6014 std::unique_ptr<QuicEncryptedPacket> data(
6015 QuicFramer::BuildVersionNegotiationPacket(
6016 connection_id, EmptyQuicConnectionId(), /*ietf_quic=*/true,
6017 framer_.version().HasLengthPrefixedConnectionIds(),
6018 SupportedVersions(GetParam())));
6019 quiche::test::CompareCharArraysWithHexError(
6020 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
6021 }
6022
TEST_P(QuicFramerTest,BuildVersionNegotiationPacketWithClientConnectionId)6023 TEST_P(QuicFramerTest, BuildVersionNegotiationPacketWithClientConnectionId) {
6024 if (!framer_.version().SupportsClientConnectionIds()) {
6025 return;
6026 }
6027
6028 SetQuicFlag(quic_disable_version_negotiation_grease_randomness, true);
6029
6030 // clang-format off
6031 unsigned char packet[] = {
6032 // type (long header)
6033 0xC0,
6034 // version tag
6035 0x00, 0x00, 0x00, 0x00,
6036 // client/destination connection ID
6037 0x08,
6038 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
6039 // server/source connection ID
6040 0x08,
6041 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6042 // supported versions
6043 0xDA, 0x5A, 0x3A, 0x3A,
6044 QUIC_VERSION_BYTES,
6045 };
6046 // clang-format on
6047
6048 QuicConnectionId server_connection_id = FramerTestConnectionId();
6049 QuicConnectionId client_connection_id = FramerTestConnectionIdPlusOne();
6050 std::unique_ptr<QuicEncryptedPacket> data(
6051 QuicFramer::BuildVersionNegotiationPacket(
6052 server_connection_id, client_connection_id, true, true,
6053 SupportedVersions(GetParam())));
6054 quiche::test::CompareCharArraysWithHexError(
6055 "constructed packet", data->data(), data->length(), AsChars(packet),
6056 ABSL_ARRAYSIZE(packet));
6057 }
6058
TEST_P(QuicFramerTest,BuildAckFramePacketOneAckBlock)6059 TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlock) {
6060 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6061 QuicPacketHeader header;
6062 header.destination_connection_id = FramerTestConnectionId();
6063 header.reset_flag = false;
6064 header.version_flag = false;
6065 header.packet_number = kPacketNumber;
6066
6067 // Use kSmallLargestObserved to make this test finished in a short time.
6068 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6069 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6070
6071 QuicFrames frames = {QuicFrame(&ack_frame)};
6072
6073 // clang-format off
6074 unsigned char packet[] = {
6075 // type (short header, 4 byte packet number)
6076 0x43,
6077 // connection_id
6078 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6079 // packet number
6080 0x12, 0x34, 0x56, 0x78,
6081
6082 // frame type (ack frame)
6083 // (no ack blocks, 2 byte largest observed, 2 byte block length)
6084 0x45,
6085 // largest acked
6086 0x12, 0x34,
6087 // Zero delta time.
6088 0x00, 0x00,
6089 // first ack block length.
6090 0x12, 0x34,
6091 // num timestamps.
6092 0x00,
6093 };
6094
6095 unsigned char packet_ietf[] = {
6096 // type (short header, 4 byte packet number)
6097 0x43,
6098 // connection_id
6099 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6100 // packet number
6101 0x12, 0x34, 0x56, 0x78,
6102
6103 // frame type (IETF_ACK frame)
6104 0x02,
6105 // largest acked
6106 kVarInt62TwoBytes + 0x12, 0x34,
6107 // Zero delta time.
6108 kVarInt62OneByte + 0x00,
6109 // Number of additional ack blocks.
6110 kVarInt62OneByte + 0x00,
6111 // first ack block length.
6112 kVarInt62TwoBytes + 0x12, 0x33,
6113 };
6114 // clang-format on
6115 unsigned char* p = packet;
6116 size_t p_size = ABSL_ARRAYSIZE(packet);
6117 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
6118 p = packet_ietf;
6119 p_size = ABSL_ARRAYSIZE(packet_ietf);
6120 }
6121
6122 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6123 ASSERT_TRUE(data != nullptr);
6124 quiche::test::CompareCharArraysWithHexError(
6125 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
6126 }
6127
TEST_P(QuicFramerTest,BuildAckReceiveTimestampsFrameMultipleRanges)6128 TEST_P(QuicFramerTest, BuildAckReceiveTimestampsFrameMultipleRanges) {
6129 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6130 return;
6131 }
6132
6133 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6134 QuicPacketHeader header;
6135 header.destination_connection_id = FramerTestConnectionId();
6136 header.reset_flag = false;
6137 header.version_flag = false;
6138 header.packet_number = kPacketNumber;
6139
6140 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6141 ack_frame.received_packet_times = PacketTimeVector{
6142 // Timestamp Range 3.
6143 {kSmallLargestObserved - 22, CreationTimePlus(0x29ffdddd)},
6144 {kSmallLargestObserved - 21, CreationTimePlus(0x29ffdedd)},
6145 // Timestamp Range 2.
6146 {kSmallLargestObserved - 11, CreationTimePlus(0x29ffdeed)},
6147 // Timestamp Range 1.
6148 {kSmallLargestObserved - 4, CreationTimePlus(0x29ffeeed)},
6149 {kSmallLargestObserved - 3, CreationTimePlus(0x29ffeeee)},
6150 {kSmallLargestObserved - 2, CreationTimePlus(0x29ffffff)},
6151 };
6152 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6153 QuicFrames frames = {QuicFrame(&ack_frame)};
6154
6155 unsigned char packet_ietf[] = {
6156 // type (short header, 4 byte packet number)
6157 0x43,
6158 // connection_id
6159 0xFE,
6160 0xDC,
6161 0xBA,
6162 0x98,
6163 0x76,
6164 0x54,
6165 0x32,
6166 0x10,
6167 // packet number
6168 0x12,
6169 0x34,
6170 0x56,
6171 0x78,
6172
6173 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
6174 0x22,
6175 // largest acked
6176 kVarInt62TwoBytes + 0x12,
6177 0x34, // = 4660
6178 // Zero delta time.
6179 kVarInt62OneByte + 0x00,
6180 // number of additional ack blocks
6181 kVarInt62OneByte + 0x00,
6182 // first ack block length.
6183 kVarInt62TwoBytes + 0x12,
6184 0x33,
6185
6186 // Receive Timestamps.
6187
6188 // Timestamp Range Count
6189 kVarInt62OneByte + 0x03,
6190
6191 // Timestamp range 1 (three packets).
6192 // Gap
6193 kVarInt62OneByte + 0x02,
6194 // Timestamp Range Count
6195 kVarInt62OneByte + 0x03,
6196 // Timestamp Delta
6197 kVarInt62FourBytes + 0x29,
6198 0xff,
6199 0xff,
6200 0xff,
6201 // Timestamp Delta
6202 kVarInt62TwoBytes + 0x11,
6203 0x11,
6204 // Timestamp Delta
6205 kVarInt62OneByte + 0x01,
6206
6207 // Timestamp range 2 (one packet).
6208 // Gap
6209 kVarInt62OneByte + 0x05,
6210 // Timestamp Range Count
6211 kVarInt62OneByte + 0x01,
6212 // Timestamp Delta
6213 kVarInt62TwoBytes + 0x10,
6214 0x00,
6215
6216 // Timestamp range 3 (two packets).
6217 // Gap
6218 kVarInt62OneByte + 0x08,
6219 // Timestamp Range Count
6220 kVarInt62OneByte + 0x02,
6221 // Timestamp Delta
6222 kVarInt62OneByte + 0x10,
6223 // Timestamp Delta
6224 kVarInt62TwoBytes + 0x01,
6225 0x00,
6226 };
6227 // clang-format on
6228
6229 framer_.set_process_timestamps(true);
6230 framer_.set_max_receive_timestamps_per_ack(8);
6231 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6232 ASSERT_TRUE(data != nullptr);
6233 quiche::test::CompareCharArraysWithHexError(
6234 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
6235 ABSL_ARRAYSIZE(packet_ietf));
6236 }
6237
TEST_P(QuicFramerTest,BuildAckReceiveTimestampsFrameExceedsMaxTimestamps)6238 TEST_P(QuicFramerTest, BuildAckReceiveTimestampsFrameExceedsMaxTimestamps) {
6239 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6240 return;
6241 }
6242
6243 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6244 QuicPacketHeader header;
6245 header.destination_connection_id = FramerTestConnectionId();
6246 header.reset_flag = false;
6247 header.version_flag = false;
6248 header.packet_number = kPacketNumber;
6249
6250 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6251 ack_frame.received_packet_times = PacketTimeVector{
6252 // Timestamp Range 3 (not included because max receive timestamps = 4).
6253 {kSmallLargestObserved - 20, CreationTimePlus(0x29ffdddd)},
6254 // Timestamp Range 2.
6255 {kSmallLargestObserved - 10, CreationTimePlus(0x29ffdedd)},
6256 {kSmallLargestObserved - 9, CreationTimePlus(0x29ffdeed)},
6257 // Timestamp Range 1.
6258 {kSmallLargestObserved - 2, CreationTimePlus(0x29ffeeed)},
6259 {kSmallLargestObserved - 1, CreationTimePlus(0x29ffeeee)},
6260 {kSmallLargestObserved, CreationTimePlus(0x29ffffff)},
6261 };
6262 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6263 QuicFrames frames = {QuicFrame(&ack_frame)};
6264
6265 unsigned char packet_ietf[] = {
6266 // type (short header, 4 byte packet number)
6267 0x43,
6268 // connection_id
6269 0xFE,
6270 0xDC,
6271 0xBA,
6272 0x98,
6273 0x76,
6274 0x54,
6275 0x32,
6276 0x10,
6277 // packet number
6278 0x12,
6279 0x34,
6280 0x56,
6281 0x78,
6282
6283 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
6284 0x22,
6285 // largest acked
6286 kVarInt62TwoBytes + 0x12,
6287 0x34, // = 4660
6288 // Zero delta time.
6289 kVarInt62OneByte + 0x00,
6290 // number of additional ack blocks
6291 kVarInt62OneByte + 0x00,
6292 // first ack block length.
6293 kVarInt62TwoBytes + 0x12,
6294 0x33,
6295
6296 // Receive Timestamps.
6297
6298 // Timestamp Range Count
6299 kVarInt62OneByte + 0x02,
6300
6301 // Timestamp range 1 (three packets).
6302 // Gap
6303 kVarInt62OneByte + 0x00,
6304 // Timestamp Range Count
6305 kVarInt62OneByte + 0x03,
6306 // Timestamp Delta
6307 kVarInt62FourBytes + 0x29,
6308 0xff,
6309 0xff,
6310 0xff,
6311 // Timestamp Delta
6312 kVarInt62TwoBytes + 0x11,
6313 0x11,
6314 // Timestamp Delta
6315 kVarInt62OneByte + 0x01,
6316
6317 // Timestamp range 2 (one packet).
6318 // Gap
6319 kVarInt62OneByte + 0x05,
6320 // Timestamp Range Count
6321 kVarInt62OneByte + 0x01,
6322 // Timestamp Delta
6323 kVarInt62TwoBytes + 0x10,
6324 0x00,
6325 };
6326 // clang-format on
6327
6328 framer_.set_process_timestamps(true);
6329 framer_.set_max_receive_timestamps_per_ack(4);
6330 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6331 ASSERT_TRUE(data != nullptr);
6332 quiche::test::CompareCharArraysWithHexError(
6333 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
6334 ABSL_ARRAYSIZE(packet_ietf));
6335 }
6336
TEST_P(QuicFramerTest,BuildAckReceiveTimestampsFrameWithExponentEncoding)6337 TEST_P(QuicFramerTest, BuildAckReceiveTimestampsFrameWithExponentEncoding) {
6338 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6339 return;
6340 }
6341
6342 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6343 QuicPacketHeader header;
6344 header.destination_connection_id = FramerTestConnectionId();
6345 header.reset_flag = false;
6346 header.version_flag = false;
6347 header.packet_number = kPacketNumber;
6348
6349 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6350 ack_frame.received_packet_times = PacketTimeVector{
6351 // Timestamp Range 2.
6352 {kSmallLargestObserved - 12, CreationTimePlus((0x06c00 << 3) + 0x03)},
6353 {kSmallLargestObserved - 11, CreationTimePlus((0x28e00 << 3) + 0x00)},
6354 // Timestamp Range 1.
6355 {kSmallLargestObserved - 5, CreationTimePlus((0x29f00 << 3) + 0x00)},
6356 {kSmallLargestObserved - 4, CreationTimePlus((0x29f00 << 3) + 0x01)},
6357 {kSmallLargestObserved - 3, CreationTimePlus((0x29f00 << 3) + 0x02)},
6358 {kSmallLargestObserved - 2, CreationTimePlus((0x29f00 << 3) + 0x03)},
6359 };
6360 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6361
6362 QuicFrames frames = {QuicFrame(&ack_frame)};
6363
6364 unsigned char packet_ietf[] = {
6365 // type (short header, 4 byte packet number)
6366 0x43,
6367 // connection_id
6368 0xFE,
6369 0xDC,
6370 0xBA,
6371 0x98,
6372 0x76,
6373 0x54,
6374 0x32,
6375 0x10,
6376 // packet number
6377 0x12,
6378 0x34,
6379 0x56,
6380 0x78,
6381
6382 // frame type (IETF_ACK_RECEIVE_TIMESTAMPS frame)
6383 0x22,
6384 // largest acked
6385 kVarInt62TwoBytes + 0x12,
6386 0x34, // = 4660
6387 // Zero delta time.
6388 kVarInt62OneByte + 0x00,
6389 // number of additional ack blocks
6390 kVarInt62OneByte + 0x00,
6391 // first ack block length.
6392 kVarInt62TwoBytes + 0x12,
6393 0x33,
6394
6395 // Receive Timestamps.
6396
6397 // Timestamp Range Count
6398 kVarInt62OneByte + 0x02,
6399
6400 // Timestamp range 1 (three packets).
6401 // Gap
6402 kVarInt62OneByte + 0x02,
6403 // Timestamp Range Count
6404 kVarInt62OneByte + 0x04,
6405 // Timestamp Delta
6406 kVarInt62FourBytes + 0x00,
6407 0x02,
6408 0x9f,
6409 0x01, // round up
6410 // Timestamp Delta
6411 kVarInt62OneByte + 0x00,
6412 // Timestamp Delta
6413 kVarInt62OneByte + 0x00,
6414 // Timestamp Delta
6415 kVarInt62OneByte + 0x01,
6416
6417 // Timestamp range 2 (one packet).
6418 // Gap
6419 kVarInt62OneByte + 0x04,
6420 // Timestamp Range Count
6421 kVarInt62OneByte + 0x02,
6422 // Timestamp Delta
6423 kVarInt62TwoBytes + 0x11,
6424 0x00,
6425 // Timestamp Delta
6426 kVarInt62FourBytes + 0x00,
6427 0x02,
6428 0x21,
6429 0xff,
6430 };
6431 // clang-format on
6432
6433 framer_.set_process_timestamps(true);
6434 framer_.set_max_receive_timestamps_per_ack(8);
6435 framer_.set_receive_timestamps_exponent(3);
6436 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6437 ASSERT_TRUE(data != nullptr);
6438 quiche::test::CompareCharArraysWithHexError(
6439 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
6440 ABSL_ARRAYSIZE(packet_ietf));
6441 }
6442
TEST_P(QuicFramerTest,BuildAndProcessAckReceiveTimestampsWithMultipleRanges)6443 TEST_P(QuicFramerTest, BuildAndProcessAckReceiveTimestampsWithMultipleRanges) {
6444 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6445 return;
6446 }
6447 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6448 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6449 framer_.SetKeyUpdateSupportForConnection(true);
6450 framer_.set_process_timestamps(true);
6451 framer_.set_max_receive_timestamps_per_ack(8);
6452
6453 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6454 QuicPacketHeader header;
6455 header.destination_connection_id = FramerTestConnectionId();
6456 header.reset_flag = false;
6457 header.version_flag = false;
6458 header.packet_number = kPacketNumber;
6459
6460 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6461 ack_frame.received_packet_times = PacketTimeVector{
6462 {kSmallLargestObserved - 1201, CreationTimePlus(0x8bcaef234)},
6463 {kSmallLargestObserved - 1200, CreationTimePlus(0x8bcdef123)},
6464 {kSmallLargestObserved - 1000, CreationTimePlus(0xaacdef123)},
6465 {kSmallLargestObserved - 4, CreationTimePlus(0xabcdea125)},
6466 {kSmallLargestObserved - 2, CreationTimePlus(0xabcdee124)},
6467 {kSmallLargestObserved - 1, CreationTimePlus(0xabcdef123)},
6468 {kSmallLargestObserved, CreationTimePlus(0xabcdef123)},
6469 };
6470 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6471 QuicFrames frames = {QuicFrame(&ack_frame)};
6472
6473 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6474 ASSERT_TRUE(data != nullptr);
6475 std::unique_ptr<QuicEncryptedPacket> encrypted(
6476 EncryptPacketWithTagAndPhase(*data, 0, false));
6477 ASSERT_TRUE(encrypted);
6478 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6479 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6480 EXPECT_THAT(framer_.error(), IsQuicNoError());
6481
6482 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6483 EXPECT_THAT(frame.received_packet_times,
6484 ContainerEq(PacketTimeVector{
6485 {kSmallLargestObserved, CreationTimePlus(0xabcdef123)},
6486 {kSmallLargestObserved - 1, CreationTimePlus(0xabcdef123)},
6487 {kSmallLargestObserved - 2, CreationTimePlus(0xabcdee124)},
6488 {kSmallLargestObserved - 4, CreationTimePlus(0xabcdea125)},
6489 {kSmallLargestObserved - 1000, CreationTimePlus(0xaacdef123)},
6490 {kSmallLargestObserved - 1200, CreationTimePlus(0x8bcdef123)},
6491 {kSmallLargestObserved - 1201, CreationTimePlus(0x8bcaef234)},
6492 }));
6493 }
6494
TEST_P(QuicFramerTest,BuildAndProcessAckReceiveTimestampsExceedsMaxTimestamps)6495 TEST_P(QuicFramerTest,
6496 BuildAndProcessAckReceiveTimestampsExceedsMaxTimestamps) {
6497 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6498 return;
6499 }
6500 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6501 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6502 framer_.SetKeyUpdateSupportForConnection(true);
6503 framer_.set_process_timestamps(true);
6504 framer_.set_max_receive_timestamps_per_ack(2);
6505
6506 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6507 QuicPacketHeader header;
6508 header.destination_connection_id = FramerTestConnectionId();
6509 header.reset_flag = false;
6510 header.version_flag = false;
6511 header.packet_number = kPacketNumber;
6512
6513 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6514 ack_frame.received_packet_times = PacketTimeVector{
6515 {kSmallLargestObserved - 1201, CreationTimePlus(0x8bcaef234)},
6516 {kSmallLargestObserved - 1200, CreationTimePlus(0x8bcdef123)},
6517 {kSmallLargestObserved - 1000, CreationTimePlus(0xaacdef123)},
6518 {kSmallLargestObserved - 5, CreationTimePlus(0xabcdea125)},
6519 {kSmallLargestObserved - 3, CreationTimePlus(0xabcded124)},
6520 {kSmallLargestObserved - 2, CreationTimePlus(0xabcdee124)},
6521 {kSmallLargestObserved - 1, CreationTimePlus(0xabcdef123)},
6522 };
6523 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6524 QuicFrames frames = {QuicFrame(&ack_frame)};
6525
6526 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6527 ASSERT_TRUE(data != nullptr);
6528 std::unique_ptr<QuicEncryptedPacket> encrypted(
6529 EncryptPacketWithTagAndPhase(*data, 0, false));
6530 ASSERT_TRUE(encrypted);
6531 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6532 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6533 EXPECT_THAT(framer_.error(), IsQuicNoError());
6534
6535 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6536 EXPECT_THAT(frame.received_packet_times,
6537 ContainerEq(PacketTimeVector{
6538 {kSmallLargestObserved - 1, CreationTimePlus(0xabcdef123)},
6539 {kSmallLargestObserved - 2, CreationTimePlus(0xabcdee124)},
6540 }));
6541 }
6542
TEST_P(QuicFramerTest,BuildAndProcessAckReceiveTimestampsWithExponentNoTruncation)6543 TEST_P(QuicFramerTest,
6544 BuildAndProcessAckReceiveTimestampsWithExponentNoTruncation) {
6545 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6546 return;
6547 }
6548 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6549 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6550 framer_.SetKeyUpdateSupportForConnection(true);
6551 framer_.set_process_timestamps(true);
6552 framer_.set_max_receive_timestamps_per_ack(8);
6553 framer_.set_receive_timestamps_exponent(3);
6554
6555 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6556 QuicPacketHeader header;
6557 header.destination_connection_id = FramerTestConnectionId();
6558 header.reset_flag = false;
6559 header.version_flag = false;
6560 header.packet_number = kPacketNumber;
6561
6562 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6563 ack_frame.received_packet_times = PacketTimeVector{
6564 {kSmallLargestObserved - 8, CreationTimePlus(0x1add << 3)},
6565 {kSmallLargestObserved - 7, CreationTimePlus(0x29ed << 3)},
6566 {kSmallLargestObserved - 3, CreationTimePlus(0x29fe << 3)},
6567 {kSmallLargestObserved - 2, CreationTimePlus(0x29ff << 3)},
6568 };
6569 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6570 QuicFrames frames = {QuicFrame(&ack_frame)};
6571
6572 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6573 ASSERT_TRUE(data != nullptr);
6574 std::unique_ptr<QuicEncryptedPacket> encrypted(
6575 EncryptPacketWithTagAndPhase(*data, 0, false));
6576 ASSERT_TRUE(encrypted);
6577 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6578 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6579 EXPECT_THAT(framer_.error(), IsQuicNoError());
6580
6581 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6582 EXPECT_THAT(frame.received_packet_times,
6583 ContainerEq(PacketTimeVector{
6584 {kSmallLargestObserved - 2, CreationTimePlus(0x29ff << 3)},
6585 {kSmallLargestObserved - 3, CreationTimePlus(0x29fe << 3)},
6586 {kSmallLargestObserved - 7, CreationTimePlus(0x29ed << 3)},
6587 {kSmallLargestObserved - 8, CreationTimePlus(0x1add << 3)},
6588 }));
6589 }
6590
TEST_P(QuicFramerTest,BuildAndProcessAckReceiveTimestampsWithExponentTruncation)6591 TEST_P(QuicFramerTest,
6592 BuildAndProcessAckReceiveTimestampsWithExponentTruncation) {
6593 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6594 return;
6595 }
6596 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6597 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6598 framer_.SetKeyUpdateSupportForConnection(true);
6599 framer_.set_process_timestamps(true);
6600 framer_.set_max_receive_timestamps_per_ack(8);
6601 framer_.set_receive_timestamps_exponent(3);
6602
6603 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6604 QuicPacketHeader header;
6605 header.destination_connection_id = FramerTestConnectionId();
6606 header.reset_flag = false;
6607 header.version_flag = false;
6608 header.packet_number = kPacketNumber;
6609
6610 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6611 ack_frame.received_packet_times = PacketTimeVector{
6612 {kSmallLargestObserved - 10, CreationTimePlus((0x1001 << 3) + 1)},
6613 {kSmallLargestObserved - 9, CreationTimePlus((0x2995 << 3) - 1)},
6614 {kSmallLargestObserved - 8, CreationTimePlus((0x2995 << 3) + 0)},
6615 {kSmallLargestObserved - 7, CreationTimePlus((0x2995 << 3) + 1)},
6616 {kSmallLargestObserved - 6, CreationTimePlus((0x2995 << 3) + 2)},
6617 {kSmallLargestObserved - 3, CreationTimePlus((0x2995 << 3) + 3)},
6618 {kSmallLargestObserved - 2, CreationTimePlus((0x2995 << 3) + 4)},
6619 };
6620 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6621 QuicFrames frames = {QuicFrame(&ack_frame)};
6622
6623 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6624 ASSERT_TRUE(data != nullptr);
6625 std::unique_ptr<QuicEncryptedPacket> encrypted(
6626 EncryptPacketWithTagAndPhase(*data, 0, false));
6627 ASSERT_TRUE(encrypted);
6628 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6629 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6630 EXPECT_THAT(framer_.error(), IsQuicNoError());
6631
6632 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6633 EXPECT_THAT(frame.received_packet_times,
6634 ContainerEq(PacketTimeVector{
6635 {kSmallLargestObserved - 2, CreationTimePlus(0x2996 << 3)},
6636 {kSmallLargestObserved - 3, CreationTimePlus(0x2996 << 3)},
6637 {kSmallLargestObserved - 6, CreationTimePlus(0x2996 << 3)},
6638 {kSmallLargestObserved - 7, CreationTimePlus(0x2996 << 3)},
6639 {kSmallLargestObserved - 8, CreationTimePlus(0x2995 << 3)},
6640 {kSmallLargestObserved - 9, CreationTimePlus(0x2995 << 3)},
6641 {kSmallLargestObserved - 10, CreationTimePlus(0x1002 << 3)},
6642 }));
6643 }
6644
TEST_P(QuicFramerTest,AckReceiveTimestamps)6645 TEST_P(QuicFramerTest, AckReceiveTimestamps) {
6646 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6647 return;
6648 }
6649 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6650 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6651 framer_.SetKeyUpdateSupportForConnection(true);
6652 framer_.set_process_timestamps(true);
6653 framer_.set_max_receive_timestamps_per_ack(8);
6654 framer_.set_receive_timestamps_exponent(3);
6655
6656 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6657 QuicPacketHeader header;
6658 header.destination_connection_id = FramerTestConnectionId();
6659 header.reset_flag = false;
6660 header.version_flag = false;
6661 header.packet_number = kPacketNumber;
6662
6663 // Use kSmallLargestObserved to make this test finished in a short time.
6664 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6665 ack_frame.received_packet_times = PacketTimeVector{
6666 {kSmallLargestObserved - 5, CreationTimePlus((0x29ff << 3))},
6667 {kSmallLargestObserved - 4, CreationTimePlus((0x29ff << 3))},
6668 {kSmallLargestObserved - 3, CreationTimePlus((0x29ff << 3))},
6669 {kSmallLargestObserved - 2, CreationTimePlus((0x29ff << 3))},
6670 };
6671 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6672 QuicFrames frames = {QuicFrame(&ack_frame)};
6673
6674 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6675 ASSERT_TRUE(data != nullptr);
6676 std::unique_ptr<QuicEncryptedPacket> encrypted(
6677 EncryptPacketWithTagAndPhase(*data, 0, false));
6678 ASSERT_TRUE(encrypted);
6679 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6680 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6681 EXPECT_THAT(framer_.error(), IsQuicNoError());
6682
6683 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6684 EXPECT_THAT(frame.received_packet_times,
6685 ContainerEq(PacketTimeVector{
6686 {kSmallLargestObserved - 2, CreationTimePlus(0x29ff << 3)},
6687 {kSmallLargestObserved - 3, CreationTimePlus(0x29ff << 3)},
6688 {kSmallLargestObserved - 4, CreationTimePlus(0x29ff << 3)},
6689 {kSmallLargestObserved - 5, CreationTimePlus(0x29ff << 3)},
6690 }));
6691 }
6692
TEST_P(QuicFramerTest,AckReceiveTimestampsPacketOutOfOrder)6693 TEST_P(QuicFramerTest, AckReceiveTimestampsPacketOutOfOrder) {
6694 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6695 return;
6696 }
6697 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6698 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6699 framer_.SetKeyUpdateSupportForConnection(true);
6700 framer_.set_process_timestamps(true);
6701 framer_.set_max_receive_timestamps_per_ack(8);
6702 framer_.set_receive_timestamps_exponent(3);
6703
6704 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6705 QuicPacketHeader header;
6706 header.destination_connection_id = FramerTestConnectionId();
6707 header.reset_flag = false;
6708 header.version_flag = false;
6709 header.packet_number = kPacketNumber;
6710
6711 // Use kSmallLargestObserved to make this test finished in a short time.
6712 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6713
6714 // The packet numbers below are out of order, this is impossible because we
6715 // don't record out of order packets in received_packet_times. The test is
6716 // intended to ensure this error is raised when it happens.
6717 ack_frame.received_packet_times = PacketTimeVector{
6718 {kSmallLargestObserved - 5, CreationTimePlus((0x29ff << 3))},
6719 {kSmallLargestObserved - 2, CreationTimePlus((0x29ff << 3))},
6720 {kSmallLargestObserved - 4, CreationTimePlus((0x29ff << 3))},
6721 {kSmallLargestObserved - 3, CreationTimePlus((0x29ff << 3))},
6722 };
6723 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6724 QuicFrames frames = {QuicFrame(&ack_frame)};
6725
6726 EXPECT_QUIC_BUG(BuildDataPacket(header, frames),
6727 "Packet number and/or receive time not in order.");
6728 }
6729
6730 // If there's insufficient room for IETF ack receive timestamps, don't write any
6731 // timestamp ranges.
TEST_P(QuicFramerTest,IetfAckReceiveTimestampsTruncate)6732 TEST_P(QuicFramerTest, IetfAckReceiveTimestampsTruncate) {
6733 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6734 return;
6735 }
6736 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
6737 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
6738 framer_.SetKeyUpdateSupportForConnection(true);
6739 framer_.set_process_timestamps(true);
6740 framer_.set_max_receive_timestamps_per_ack(8192);
6741 framer_.set_receive_timestamps_exponent(3);
6742
6743 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6744 QuicPacketHeader header;
6745 header.destination_connection_id = FramerTestConnectionId();
6746 header.reset_flag = false;
6747 header.version_flag = false;
6748 header.packet_number = kPacketNumber;
6749
6750 // Use kSmallLargestObserved to make this test finished in a short time.
6751 QuicAckFrame ack_frame = InitAckFrame(kSmallLargestObserved);
6752 for (QuicPacketNumber i(1); i <= kSmallLargestObserved; i += 2) {
6753 ack_frame.received_packet_times.push_back(
6754 {i, CreationTimePlus((0x29ff << 3))});
6755 }
6756
6757 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6758 QuicFrames frames = {QuicFrame(&ack_frame)};
6759
6760 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6761 ASSERT_TRUE(data != nullptr);
6762 std::unique_ptr<QuicEncryptedPacket> encrypted(
6763 EncryptPacketWithTagAndPhase(*data, 0, false));
6764 ASSERT_TRUE(encrypted);
6765 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6766 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
6767 EXPECT_THAT(framer_.error(), IsQuicNoError());
6768
6769 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
6770 EXPECT_TRUE(frame.received_packet_times.empty());
6771 }
6772
6773 // If there are too many ack ranges, they will be truncated to make room for a
6774 // timestamp range count of 0.
TEST_P(QuicFramerTest,IetfAckReceiveTimestampsAckRangeTruncation)6775 TEST_P(QuicFramerTest, IetfAckReceiveTimestampsAckRangeTruncation) {
6776 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
6777 return;
6778 }
6779 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
6780 framer_.set_process_timestamps(true);
6781 framer_.set_max_receive_timestamps_per_ack(8);
6782 framer_.set_receive_timestamps_exponent(3);
6783
6784 QuicPacketHeader header;
6785 header.destination_connection_id = FramerTestConnectionId();
6786 header.reset_flag = false;
6787 header.version_flag = false;
6788 header.packet_number = kPacketNumber;
6789
6790 QuicAckFrame ack_frame;
6791 // Create a packet with just the ack.
6792 ack_frame = MakeAckFrameWithGaps(/*gap_size=*/0xffffffff,
6793 /*max_num_gaps=*/200,
6794 /*largest_acked=*/kMaxIetfVarInt);
6795 ack_frame.received_packet_times = PacketTimeVector{
6796 {QuicPacketNumber(kMaxIetfVarInt) - 2, CreationTimePlus((0x29ff << 3))},
6797 };
6798 QuicFrames frames = {QuicFrame(&ack_frame)};
6799 // Build an ACK packet.
6800 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6801 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
6802 ASSERT_TRUE(raw_ack_packet != nullptr);
6803 char buffer[kMaxOutgoingPacketSize];
6804 size_t encrypted_length =
6805 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
6806 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
6807 ASSERT_NE(0u, encrypted_length);
6808 // Now make sure we can turn our ack packet back into an ack frame.
6809 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
6810 ASSERT_TRUE(framer_.ProcessPacket(
6811 QuicEncryptedPacket(buffer, encrypted_length, false)));
6812 ASSERT_EQ(1u, visitor_.ack_frames_.size());
6813 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
6814 EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
6815 LargestAcked(processed_ack_frame));
6816 // Verify ACK ranges in the frame gets truncated.
6817 ASSERT_LT(processed_ack_frame.packets.NumPacketsSlow(),
6818 ack_frame.packets.NumIntervals());
6819 EXPECT_EQ(158u, processed_ack_frame.packets.NumPacketsSlow());
6820 EXPECT_LT(processed_ack_frame.packets.NumIntervals(),
6821 ack_frame.packets.NumIntervals());
6822 EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
6823 processed_ack_frame.packets.Max());
6824 // But the receive timestamps are not truncated because they are small.
6825 EXPECT_FALSE(processed_ack_frame.received_packet_times.empty());
6826 }
6827
TEST_P(QuicFramerTest,BuildAckFramePacketOneAckBlockMaxLength)6828 TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlockMaxLength) {
6829 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6830 QuicPacketHeader header;
6831 header.destination_connection_id = FramerTestConnectionId();
6832 header.reset_flag = false;
6833 header.version_flag = false;
6834 header.packet_number = kPacketNumber;
6835
6836 QuicAckFrame ack_frame = InitAckFrame(kPacketNumber);
6837 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6838
6839 QuicFrames frames = {QuicFrame(&ack_frame)};
6840
6841 // clang-format off
6842 unsigned char packet[] = {
6843 // type (short header, 4 byte packet number)
6844 0x43,
6845 // connection_id
6846 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6847 // packet number
6848 0x12, 0x34, 0x56, 0x78,
6849
6850 // frame type (ack frame)
6851 // (no ack blocks, 4 byte largest observed, 4 byte block length)
6852 0x4A,
6853 // largest acked
6854 0x12, 0x34, 0x56, 0x78,
6855 // Zero delta time.
6856 0x00, 0x00,
6857 // first ack block length.
6858 0x12, 0x34, 0x56, 0x78,
6859 // num timestamps.
6860 0x00,
6861 };
6862
6863
6864 unsigned char packet_ietf[] = {
6865 // type (short header, 4 byte packet number)
6866 0x43,
6867 // connection_id
6868 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6869 // packet number
6870 0x12, 0x34, 0x56, 0x78,
6871
6872 // frame type (IETF_ACK frame)
6873 0x02,
6874 // largest acked
6875 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
6876 // Zero delta time.
6877 kVarInt62OneByte + 0x00,
6878 // Nr. of additional ack blocks
6879 kVarInt62OneByte + 0x00,
6880 // first ack block length.
6881 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
6882 };
6883 // clang-format on
6884 unsigned char* p = packet;
6885 size_t p_size = ABSL_ARRAYSIZE(packet);
6886 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
6887 p = packet_ietf;
6888 p_size = ABSL_ARRAYSIZE(packet_ietf);
6889 }
6890
6891 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6892 ASSERT_TRUE(data != nullptr);
6893 quiche::test::CompareCharArraysWithHexError(
6894 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
6895 }
6896
TEST_P(QuicFramerTest,BuildAckFramePacketMultipleAckBlocks)6897 TEST_P(QuicFramerTest, BuildAckFramePacketMultipleAckBlocks) {
6898 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
6899 QuicPacketHeader header;
6900 header.destination_connection_id = FramerTestConnectionId();
6901 header.reset_flag = false;
6902 header.version_flag = false;
6903 header.packet_number = kPacketNumber;
6904
6905 // Use kSmallLargestObserved to make this test finished in a short time.
6906 QuicAckFrame ack_frame =
6907 InitAckFrame({{QuicPacketNumber(1), QuicPacketNumber(5)},
6908 {QuicPacketNumber(10), QuicPacketNumber(500)},
6909 {QuicPacketNumber(900), kSmallMissingPacket},
6910 {kSmallMissingPacket + 1, kSmallLargestObserved + 1}});
6911 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
6912
6913 QuicFrames frames = {QuicFrame(&ack_frame)};
6914
6915 // clang-format off
6916 unsigned char packet[] = {
6917 // type (short header, 4 byte packet number)
6918 0x43,
6919 // connection_id
6920 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6921 // packet number
6922 0x12, 0x34, 0x56, 0x78,
6923
6924 // frame type (ack frame)
6925 // (has ack blocks, 2 byte largest observed, 2 byte block length)
6926 0x65,
6927 // largest acked
6928 0x12, 0x34,
6929 // Zero delta time.
6930 0x00, 0x00,
6931 // num ack blocks ranges.
6932 0x04,
6933 // first ack block length.
6934 0x00, 0x01,
6935 // gap to next block.
6936 0x01,
6937 // ack block length.
6938 0x0e, 0xaf,
6939 // gap to next block.
6940 0xff,
6941 // ack block length.
6942 0x00, 0x00,
6943 // gap to next block.
6944 0x91,
6945 // ack block length.
6946 0x01, 0xea,
6947 // gap to next block.
6948 0x05,
6949 // ack block length.
6950 0x00, 0x04,
6951 // num timestamps.
6952 0x00,
6953 };
6954
6955 unsigned char packet_ietf[] = {
6956 // type (short header, 4 byte packet number)
6957 0x43,
6958 // connection_id
6959 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
6960 // packet number
6961 0x12, 0x34, 0x56, 0x78,
6962
6963 // frame type (IETF_ACK frame)
6964 0x02,
6965 // largest acked
6966 kVarInt62TwoBytes + 0x12, 0x34,
6967 // Zero delta time.
6968 kVarInt62OneByte + 0x00,
6969 // num additional ack blocks.
6970 kVarInt62OneByte + 0x03,
6971 // first ack block length.
6972 kVarInt62OneByte + 0x00,
6973
6974 // gap to next block.
6975 kVarInt62OneByte + 0x00,
6976 // ack block length.
6977 kVarInt62TwoBytes + 0x0e, 0xae,
6978
6979 // gap to next block.
6980 kVarInt62TwoBytes + 0x01, 0x8f,
6981 // ack block length.
6982 kVarInt62TwoBytes + 0x01, 0xe9,
6983
6984 // gap to next block.
6985 kVarInt62OneByte + 0x04,
6986 // ack block length.
6987 kVarInt62OneByte + 0x03,
6988 };
6989 // clang-format on
6990 unsigned char* p = packet;
6991 size_t p_size = ABSL_ARRAYSIZE(packet);
6992 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
6993 p = packet_ietf;
6994 p_size = ABSL_ARRAYSIZE(packet_ietf);
6995 }
6996
6997 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
6998 ASSERT_TRUE(data != nullptr);
6999
7000 quiche::test::CompareCharArraysWithHexError(
7001 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7002 }
7003
TEST_P(QuicFramerTest,BuildAckFramePacketMaxAckBlocks)7004 TEST_P(QuicFramerTest, BuildAckFramePacketMaxAckBlocks) {
7005 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7006 QuicPacketHeader header;
7007 header.destination_connection_id = FramerTestConnectionId();
7008 header.reset_flag = false;
7009 header.version_flag = false;
7010 header.packet_number = kPacketNumber;
7011
7012 // Use kSmallLargestObservedto make this test finished in a short time.
7013 QuicAckFrame ack_frame;
7014 ack_frame.largest_acked = kSmallLargestObserved;
7015 ack_frame.ack_delay_time = QuicTime::Delta::Zero();
7016 // 300 ack blocks.
7017 for (size_t i = 2; i < 2 * 300; i += 2) {
7018 ack_frame.packets.Add(QuicPacketNumber(i));
7019 }
7020 ack_frame.packets.AddRange(QuicPacketNumber(600), kSmallLargestObserved + 1);
7021
7022 QuicFrames frames = {QuicFrame(&ack_frame)};
7023
7024 // clang-format off
7025 unsigned char packet[] = {
7026 // type (short header, 4 byte packet number)
7027 0x43,
7028 // connection_id
7029 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7030 // packet number
7031 0x12, 0x34, 0x56, 0x78,
7032 // frame type (ack frame)
7033 // (has ack blocks, 2 byte largest observed, 2 byte block length)
7034 0x65,
7035 // largest acked
7036 0x12, 0x34,
7037 // Zero delta time.
7038 0x00, 0x00,
7039 // num ack blocks ranges.
7040 0xff,
7041 // first ack block length.
7042 0x0f, 0xdd,
7043 // 255 = 4 * 63 + 3
7044 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7045 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7046 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7047 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7048 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7049 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7050 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7051 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7052 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7053 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7054
7055 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7056 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7057 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7058 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7059 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7060 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7061 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7062 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7063 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7064 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7065
7066 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7067 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7068 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7069 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7070 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7071 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7072 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7073 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7074 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7075 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7076
7077 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7078 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7079 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7080 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7081 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7082 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7083 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7084 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7085 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7086 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7087
7088 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7089 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7090 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7091 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7092 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7093 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7094 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7095 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7096 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7097 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7098
7099 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7100 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7101 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7102 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7103 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7104 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7105 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7106 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7107 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7108 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7109
7110 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7111 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7112 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7113 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
7114 // num timestamps.
7115 0x00,
7116 };
7117
7118 unsigned char packet_ietf[] = {
7119 // type (short header, 4 byte packet number)
7120 0x43,
7121 // connection_id
7122 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7123 // packet number
7124 0x12, 0x34, 0x56, 0x78,
7125 // frame type (IETF_ACK frame)
7126 0x02,
7127 // largest acked
7128 kVarInt62TwoBytes + 0x12, 0x34,
7129 // Zero delta time.
7130 kVarInt62OneByte + 0x00,
7131 // num ack blocks ranges.
7132 kVarInt62TwoBytes + 0x01, 0x2b,
7133 // first ack block length.
7134 kVarInt62TwoBytes + 0x0f, 0xdc,
7135 // 255 added blocks of gap_size == 1, ack_size == 1
7136 #define V99AddedBLOCK kVarInt62OneByte + 0x00, kVarInt62OneByte + 0x00
7137 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7138 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7139 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7140 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7141 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7142 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7143 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7144 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7145 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7146 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7147 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7148 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7149 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7150 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7151 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7152 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7153 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7154 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7155 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7156 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7157
7158 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7159 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7160 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7161 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7162 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7163 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7164 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7165 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7166 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7167 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7168 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7169 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7170 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7171 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7172 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7173 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7174 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7175 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7176 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7177 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7178
7179 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7180 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7181 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7182 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7183 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7184 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7185 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7186 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7187 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7188 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7189 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7190 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7191 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7192 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7193 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7194 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7195 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7196 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7197 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7198 V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK, V99AddedBLOCK,
7199
7200 #undef V99AddedBLOCK
7201 };
7202 // clang-format on
7203 unsigned char* p = packet;
7204 size_t p_size = ABSL_ARRAYSIZE(packet);
7205 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7206 p = packet_ietf;
7207 p_size = ABSL_ARRAYSIZE(packet_ietf);
7208 }
7209
7210 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7211 ASSERT_TRUE(data != nullptr);
7212
7213 quiche::test::CompareCharArraysWithHexError(
7214 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7215 }
7216
TEST_P(QuicFramerTest,BuildRstFramePacketQuic)7217 TEST_P(QuicFramerTest, BuildRstFramePacketQuic) {
7218 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7219 QuicPacketHeader header;
7220 header.destination_connection_id = FramerTestConnectionId();
7221 header.reset_flag = false;
7222 header.version_flag = false;
7223 header.packet_number = kPacketNumber;
7224
7225 QuicRstStreamFrame rst_frame;
7226 rst_frame.stream_id = kStreamId;
7227 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7228 rst_frame.ietf_error_code = 0x01;
7229 } else {
7230 rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708);
7231 }
7232 rst_frame.byte_offset = 0x0807060504030201;
7233
7234 // clang-format off
7235 unsigned char packet[] = {
7236 // type (short packet, 4 byte packet number)
7237 0x43,
7238 // connection_id
7239 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7240 // packet number
7241 0x12, 0x34, 0x56, 0x78,
7242
7243 // frame type (rst stream frame)
7244 0x01,
7245 // stream id
7246 0x01, 0x02, 0x03, 0x04,
7247 // sent byte offset
7248 0x08, 0x07, 0x06, 0x05,
7249 0x04, 0x03, 0x02, 0x01,
7250 // error code
7251 0x05, 0x06, 0x07, 0x08,
7252 };
7253
7254 unsigned char packet_ietf[] = {
7255 // type (short packet, 4 byte packet number)
7256 0x43,
7257 // connection_id
7258 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7259 // packet number
7260 0x12, 0x34, 0x56, 0x78,
7261
7262 // frame type (IETF_RST_STREAM frame)
7263 0x04,
7264 // stream id
7265 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
7266 // error code
7267 kVarInt62OneByte + 0x01,
7268 // sent byte offset
7269 kVarInt62EightBytes + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01
7270 };
7271 // clang-format on
7272
7273 QuicFrames frames = {QuicFrame(&rst_frame)};
7274
7275 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7276 ASSERT_TRUE(data != nullptr);
7277
7278 unsigned char* p = packet;
7279 size_t p_size = ABSL_ARRAYSIZE(packet);
7280 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7281 p = packet_ietf;
7282 p_size = ABSL_ARRAYSIZE(packet_ietf);
7283 }
7284 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
7285
7286 quiche::test::CompareCharArraysWithHexError(
7287 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7288 }
7289
TEST_P(QuicFramerTest,BuildCloseFramePacket)7290 TEST_P(QuicFramerTest, BuildCloseFramePacket) {
7291 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7292 QuicPacketHeader header;
7293 header.destination_connection_id = FramerTestConnectionId();
7294 header.reset_flag = false;
7295 header.version_flag = false;
7296 header.packet_number = kPacketNumber;
7297
7298 QuicConnectionCloseFrame close_frame(framer_.transport_version(),
7299 QUIC_INTERNAL_ERROR, NO_IETF_QUIC_ERROR,
7300 "because I can", 0x05);
7301 QuicFrames frames = {QuicFrame(&close_frame)};
7302
7303 // clang-format off
7304 unsigned char packet[] = {
7305 // type (short header, 4 byte packet number)
7306 0x43,
7307 // connection_id
7308 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7309 // packet number
7310 0x12, 0x34, 0x56, 0x78,
7311
7312 // frame type (connection close frame)
7313 0x02,
7314 // error code
7315 0x00, 0x00, 0x00, 0x01,
7316 // error details length
7317 0x00, 0x0d,
7318 // error details
7319 'b', 'e', 'c', 'a',
7320 'u', 's', 'e', ' ',
7321 'I', ' ', 'c', 'a',
7322 'n',
7323 };
7324
7325 unsigned char packet_ietf[] = {
7326 // type (short header, 4 byte packet number)
7327 0x43,
7328 // connection_id
7329 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7330 // packet number
7331 0x12, 0x34, 0x56, 0x78,
7332
7333 // frame type (IETF_CONNECTION_CLOSE frame)
7334 0x1c,
7335 // error code
7336 kVarInt62OneByte + 0x01,
7337 // Frame type within the CONNECTION_CLOSE frame
7338 kVarInt62OneByte + 0x05,
7339 // error details length
7340 kVarInt62OneByte + 0x0f,
7341 // error details
7342 '1', ':', 'b', 'e',
7343 'c', 'a', 'u', 's',
7344 'e', ' ', 'I', ' ',
7345 'c', 'a', 'n',
7346 };
7347 // clang-format on
7348
7349 unsigned char* p = packet;
7350 size_t p_size = ABSL_ARRAYSIZE(packet);
7351 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7352 p = packet_ietf;
7353 p_size = ABSL_ARRAYSIZE(packet_ietf);
7354 }
7355
7356 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7357 ASSERT_TRUE(data != nullptr);
7358
7359 quiche::test::CompareCharArraysWithHexError(
7360 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7361 }
7362
TEST_P(QuicFramerTest,BuildCloseFramePacketExtendedInfo)7363 TEST_P(QuicFramerTest, BuildCloseFramePacketExtendedInfo) {
7364 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7365 QuicPacketHeader header;
7366 header.destination_connection_id = FramerTestConnectionId();
7367 header.reset_flag = false;
7368 header.version_flag = false;
7369 header.packet_number = kPacketNumber;
7370
7371 QuicConnectionCloseFrame close_frame(
7372 framer_.transport_version(),
7373 static_cast<QuicErrorCode>(
7374 VersionHasIetfQuicFrames(framer_.transport_version()) ? 0x01
7375 : 0x05060708),
7376 NO_IETF_QUIC_ERROR, "because I can", 0x05);
7377 // Set this so that it is "there" for both Google QUIC and IETF QUIC
7378 // framing. It better not show up for Google QUIC!
7379 close_frame.quic_error_code = static_cast<QuicErrorCode>(0x4567);
7380
7381 QuicFrames frames = {QuicFrame(&close_frame)};
7382
7383 // clang-format off
7384 unsigned char packet[] = {
7385 // type (short header, 4 byte packet number)
7386 0x43,
7387 // connection_id
7388 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7389 // packet number
7390 0x12, 0x34, 0x56, 0x78,
7391
7392 // frame type (connection close frame)
7393 0x02,
7394 // error code
7395 0x05, 0x06, 0x07, 0x08,
7396 // error details length
7397 0x00, 0x0d,
7398 // error details
7399 'b', 'e', 'c', 'a',
7400 'u', 's', 'e', ' ',
7401 'I', ' ', 'c', 'a',
7402 'n',
7403 };
7404
7405 unsigned char packet_ietf[] = {
7406 // type (short header, 4 byte packet number)
7407 0x43,
7408 // connection_id
7409 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7410 // packet number
7411 0x12, 0x34, 0x56, 0x78,
7412
7413 // frame type (IETF_CONNECTION_CLOSE frame)
7414 0x1c,
7415 // IETF error code INTERNAL_ERROR = 0x01 corresponding to
7416 // QuicErrorCode::QUIC_INTERNAL_ERROR = 0x01.
7417 kVarInt62OneByte + 0x01,
7418 // Frame type within the CONNECTION_CLOSE frame
7419 kVarInt62OneByte + 0x05,
7420 // error details length
7421 kVarInt62OneByte + 0x13,
7422 // error details
7423 '1', '7', '7', '6',
7424 '7', ':', 'b', 'e',
7425 'c', 'a', 'u', 's',
7426 'e', ' ', 'I', ' ',
7427 'c', 'a', 'n'
7428 };
7429 // clang-format on
7430
7431 unsigned char* p = packet;
7432 size_t p_size = ABSL_ARRAYSIZE(packet);
7433 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7434 p = packet_ietf;
7435 p_size = ABSL_ARRAYSIZE(packet_ietf);
7436 }
7437
7438 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7439 ASSERT_TRUE(data != nullptr);
7440
7441 quiche::test::CompareCharArraysWithHexError(
7442 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7443 }
7444
TEST_P(QuicFramerTest,BuildTruncatedCloseFramePacket)7445 TEST_P(QuicFramerTest, BuildTruncatedCloseFramePacket) {
7446 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7447 QuicPacketHeader header;
7448 header.destination_connection_id = FramerTestConnectionId();
7449 header.reset_flag = false;
7450 header.version_flag = false;
7451 header.packet_number = kPacketNumber;
7452
7453 QuicConnectionCloseFrame close_frame(framer_.transport_version(),
7454 QUIC_INTERNAL_ERROR, NO_IETF_QUIC_ERROR,
7455 std::string(2048, 'A'), 0x05);
7456 QuicFrames frames = {QuicFrame(&close_frame)};
7457
7458 // clang-format off
7459 unsigned char packet[] = {
7460 // type (short header, 4 byte packet number)
7461 0x43,
7462 // connection_id
7463 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7464 // packet number
7465 0x12, 0x34, 0x56, 0x78,
7466
7467 // frame type (connection close frame)
7468 0x02,
7469 // error code
7470 0x00, 0x00, 0x00, 0x01,
7471 // error details length
7472 0x01, 0x00,
7473 // error details (truncated to 256 bytes)
7474 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7475 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7476 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7477 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7478 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7479 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7480 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7481 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7482 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7483 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7484 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7485 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7486 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7487 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7488 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7489 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7490 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7491 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7492 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7493 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7494 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7495 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7496 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7497 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7498 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7499 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7500 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7501 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7502 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7503 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7504 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7505 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7506 };
7507
7508 unsigned char packet_ietf[] = {
7509 // type (short header, 4 byte packet number)
7510 0x43,
7511 // connection_id
7512 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7513 // packet number
7514 0x12, 0x34, 0x56, 0x78,
7515
7516 // frame type (IETF_CONNECTION_CLOSE frame)
7517 0x1c,
7518 // error code
7519 kVarInt62OneByte + 0x01,
7520 // Frame type within the CONNECTION_CLOSE frame
7521 kVarInt62OneByte + 0x05,
7522 // error details length
7523 kVarInt62TwoBytes + 0x01, 0x00,
7524 // error details (truncated to 256 bytes)
7525 '1', ':', 'A', 'A', 'A', 'A', 'A', 'A',
7526 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7527 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7528 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7529 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7530 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7531 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7532 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7533 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7534 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7535 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7536 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7537 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7538 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7539 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7540 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7541 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7542 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7543 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7544 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7545 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7546 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7547 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7548 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7549 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7550 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7551 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7552 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7553 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7554 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7555 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7556 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7557 };
7558 // clang-format on
7559
7560 unsigned char* p = packet;
7561 size_t p_size = ABSL_ARRAYSIZE(packet);
7562 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7563 p = packet_ietf;
7564 p_size = ABSL_ARRAYSIZE(packet_ietf);
7565 }
7566
7567 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7568 ASSERT_TRUE(data != nullptr);
7569
7570 quiche::test::CompareCharArraysWithHexError(
7571 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7572 }
7573
TEST_P(QuicFramerTest,BuildApplicationCloseFramePacket)7574 TEST_P(QuicFramerTest, BuildApplicationCloseFramePacket) {
7575 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
7576 // This frame is only for IETF QUIC.
7577 return;
7578 }
7579 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7580 QuicPacketHeader header;
7581 header.destination_connection_id = FramerTestConnectionId();
7582 header.reset_flag = false;
7583 header.version_flag = false;
7584 header.packet_number = kPacketNumber;
7585
7586 QuicConnectionCloseFrame app_close_frame;
7587 app_close_frame.wire_error_code = 0x11;
7588 app_close_frame.error_details = "because I can";
7589 app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
7590
7591 QuicFrames frames = {QuicFrame(&app_close_frame)};
7592
7593 // clang-format off
7594
7595 unsigned char packet_ietf[] = {
7596 // type (short header, 4 byte packet number)
7597 0x43,
7598 // connection_id
7599 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7600 // packet number
7601 0x12, 0x34, 0x56, 0x78,
7602
7603 // frame type (IETF_APPLICATION_CLOSE frame)
7604 0x1d,
7605 // error code
7606 kVarInt62OneByte + 0x11,
7607 // error details length
7608 kVarInt62OneByte + 0x0f,
7609 // error details, note that it includes an extended error code.
7610 '0', ':', 'b', 'e',
7611 'c', 'a', 'u', 's',
7612 'e', ' ', 'I', ' ',
7613 'c', 'a', 'n',
7614 };
7615 // clang-format on
7616
7617 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7618 ASSERT_TRUE(data != nullptr);
7619
7620 quiche::test::CompareCharArraysWithHexError(
7621 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
7622 ABSL_ARRAYSIZE(packet_ietf));
7623 }
7624
TEST_P(QuicFramerTest,BuildTruncatedApplicationCloseFramePacket)7625 TEST_P(QuicFramerTest, BuildTruncatedApplicationCloseFramePacket) {
7626 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
7627 // This frame is only for IETF QUIC.
7628 return;
7629 }
7630 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7631 QuicPacketHeader header;
7632 header.destination_connection_id = FramerTestConnectionId();
7633 header.reset_flag = false;
7634 header.version_flag = false;
7635 header.packet_number = kPacketNumber;
7636
7637 QuicConnectionCloseFrame app_close_frame;
7638 app_close_frame.wire_error_code = 0x11;
7639 app_close_frame.error_details = std::string(2048, 'A');
7640 app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
7641 // Setting to missing ensures that if it is missing, the extended
7642 // code is not added to the text message.
7643 app_close_frame.quic_error_code = QUIC_IETF_GQUIC_ERROR_MISSING;
7644
7645 QuicFrames frames = {QuicFrame(&app_close_frame)};
7646
7647 // clang-format off
7648 unsigned char packet_ietf[] = {
7649 // type (short header, 4 byte packet number)
7650 0x43,
7651 // connection_id
7652 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7653 // packet number
7654 0x12, 0x34, 0x56, 0x78,
7655
7656 // frame type (IETF_APPLICATION_CLOSE frame)
7657 0x1d,
7658 // error code
7659 kVarInt62OneByte + 0x11,
7660 // error details length
7661 kVarInt62TwoBytes + 0x01, 0x00,
7662 // error details (truncated to 256 bytes)
7663 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7664 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7665 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7666 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7667 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7668 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7669 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7670 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7671 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7672 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7673 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7674 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7675 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7676 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7677 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7678 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7679 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7680 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7681 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7682 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7683 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7684 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7685 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7686 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7687 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7688 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7689 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7690 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7691 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7692 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7693 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7694 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7695 };
7696 // clang-format on
7697
7698 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7699 ASSERT_TRUE(data != nullptr);
7700
7701 quiche::test::CompareCharArraysWithHexError(
7702 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
7703 ABSL_ARRAYSIZE(packet_ietf));
7704 }
7705
TEST_P(QuicFramerTest,BuildGoAwayPacket)7706 TEST_P(QuicFramerTest, BuildGoAwayPacket) {
7707 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7708 // This frame is only for Google QUIC.
7709 return;
7710 }
7711 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7712 QuicPacketHeader header;
7713 header.destination_connection_id = FramerTestConnectionId();
7714 header.reset_flag = false;
7715 header.version_flag = false;
7716 header.packet_number = kPacketNumber;
7717
7718 QuicGoAwayFrame goaway_frame;
7719 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
7720 goaway_frame.last_good_stream_id = kStreamId;
7721 goaway_frame.reason_phrase = "because I can";
7722
7723 QuicFrames frames = {QuicFrame(&goaway_frame)};
7724
7725 // clang-format off
7726 unsigned char packet[] = {
7727 // type (short header, 4 byte packet number)
7728 0x43,
7729 // connection_id
7730 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7731 // packet number
7732 0x12, 0x34, 0x56, 0x78,
7733
7734 // frame type (go away frame)
7735 0x03,
7736 // error code
7737 0x05, 0x06, 0x07, 0x08,
7738 // stream id
7739 0x01, 0x02, 0x03, 0x04,
7740 // error details length
7741 0x00, 0x0d,
7742 // error details
7743 'b', 'e', 'c', 'a',
7744 'u', 's', 'e', ' ',
7745 'I', ' ', 'c', 'a',
7746 'n',
7747 };
7748
7749 // clang-format on
7750 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7751 ASSERT_TRUE(data != nullptr);
7752
7753 quiche::test::CompareCharArraysWithHexError(
7754 "constructed packet", data->data(), data->length(), AsChars(packet),
7755 ABSL_ARRAYSIZE(packet));
7756 }
7757
TEST_P(QuicFramerTest,BuildTruncatedGoAwayPacket)7758 TEST_P(QuicFramerTest, BuildTruncatedGoAwayPacket) {
7759 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7760 // This frame is only for Google QUIC.
7761 return;
7762 }
7763 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7764 QuicPacketHeader header;
7765 header.destination_connection_id = FramerTestConnectionId();
7766 header.reset_flag = false;
7767 header.version_flag = false;
7768 header.packet_number = kPacketNumber;
7769
7770 QuicGoAwayFrame goaway_frame;
7771 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
7772 goaway_frame.last_good_stream_id = kStreamId;
7773 goaway_frame.reason_phrase = std::string(2048, 'A');
7774
7775 QuicFrames frames = {QuicFrame(&goaway_frame)};
7776
7777 // clang-format off
7778 unsigned char packet[] = {
7779 // type (short header, 4 byte packet number)
7780 0x43,
7781 // connection_id
7782 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7783 // packet number
7784 0x12, 0x34, 0x56, 0x78,
7785
7786 // frame type (go away frame)
7787 0x03,
7788 // error code
7789 0x05, 0x06, 0x07, 0x08,
7790 // stream id
7791 0x01, 0x02, 0x03, 0x04,
7792 // error details length
7793 0x01, 0x00,
7794 // error details (truncated to 256 bytes)
7795 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7796 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7797 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7798 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7799 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7800 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7801 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7802 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7803 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7804 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7805 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7806 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7807 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7808 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7809 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7810 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7811 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7812 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7813 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7814 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7815 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7816 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7817 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7818 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7819 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7820 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7821 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7822 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7823 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7824 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7825 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7826 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
7827 };
7828 // clang-format on
7829
7830 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7831 ASSERT_TRUE(data != nullptr);
7832
7833 quiche::test::CompareCharArraysWithHexError(
7834 "constructed packet", data->data(), data->length(), AsChars(packet),
7835 ABSL_ARRAYSIZE(packet));
7836 }
7837
TEST_P(QuicFramerTest,BuildWindowUpdatePacket)7838 TEST_P(QuicFramerTest, BuildWindowUpdatePacket) {
7839 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7840 QuicPacketHeader header;
7841 header.destination_connection_id = FramerTestConnectionId();
7842 header.reset_flag = false;
7843 header.version_flag = false;
7844 header.packet_number = kPacketNumber;
7845
7846 QuicWindowUpdateFrame window_update_frame;
7847 window_update_frame.stream_id = kStreamId;
7848 window_update_frame.max_data = 0x1122334455667788;
7849
7850 QuicFrames frames = {QuicFrame(window_update_frame)};
7851
7852 // clang-format off
7853 unsigned char packet[] = {
7854 // type (short header, 4 byte packet number)
7855 0x43,
7856 // connection_id
7857 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7858 // packet number
7859 0x12, 0x34, 0x56, 0x78,
7860
7861 // frame type (window update frame)
7862 0x04,
7863 // stream id
7864 0x01, 0x02, 0x03, 0x04,
7865 // byte offset
7866 0x11, 0x22, 0x33, 0x44,
7867 0x55, 0x66, 0x77, 0x88,
7868 };
7869
7870 unsigned char packet_ietf[] = {
7871 // type (short header, 4 byte packet number)
7872 0x43,
7873 // connection_id
7874 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7875 // packet number
7876 0x12, 0x34, 0x56, 0x78,
7877
7878 // frame type (IETF_MAX_STREAM_DATA frame)
7879 0x11,
7880 // stream id
7881 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
7882 // byte offset
7883 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
7884 0x55, 0x66, 0x77, 0x88,
7885 };
7886 // clang-format on
7887
7888 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7889 ASSERT_TRUE(data != nullptr);
7890
7891 unsigned char* p = packet;
7892 size_t p_size = ABSL_ARRAYSIZE(packet);
7893 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
7894 p = packet_ietf;
7895 p_size = ABSL_ARRAYSIZE(packet_ietf);
7896 }
7897
7898 quiche::test::CompareCharArraysWithHexError(
7899 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
7900 }
7901
TEST_P(QuicFramerTest,BuildMaxStreamDataPacket)7902 TEST_P(QuicFramerTest, BuildMaxStreamDataPacket) {
7903 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
7904 // This frame is only for IETF QUIC.
7905 return;
7906 }
7907 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7908 QuicPacketHeader header;
7909 header.destination_connection_id = FramerTestConnectionId();
7910 header.reset_flag = false;
7911 header.version_flag = false;
7912 header.packet_number = kPacketNumber;
7913
7914 QuicWindowUpdateFrame window_update_frame;
7915 window_update_frame.stream_id = kStreamId;
7916 window_update_frame.max_data = 0x1122334455667788;
7917
7918 QuicFrames frames = {QuicFrame(window_update_frame)};
7919
7920 // clang-format off
7921 unsigned char packet_ietf[] = {
7922 // type (short header, 4 byte packet number)
7923 0x43,
7924 // connection_id
7925 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7926 // packet number
7927 0x12, 0x34, 0x56, 0x78,
7928
7929 // frame type (IETF_MAX_STREAM_DATA frame)
7930 0x11,
7931 // stream id
7932 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
7933 // byte offset
7934 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
7935 0x55, 0x66, 0x77, 0x88,
7936 };
7937 // clang-format on
7938
7939 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7940 ASSERT_TRUE(data != nullptr);
7941
7942 quiche::test::CompareCharArraysWithHexError(
7943 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
7944 ABSL_ARRAYSIZE(packet_ietf));
7945 }
7946
TEST_P(QuicFramerTest,BuildMaxDataPacket)7947 TEST_P(QuicFramerTest, BuildMaxDataPacket) {
7948 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
7949 // This frame is only for IETF QUIC.
7950 return;
7951 }
7952 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7953 QuicPacketHeader header;
7954 header.destination_connection_id = FramerTestConnectionId();
7955 header.reset_flag = false;
7956 header.version_flag = false;
7957 header.packet_number = kPacketNumber;
7958
7959 QuicWindowUpdateFrame window_update_frame;
7960 window_update_frame.stream_id =
7961 QuicUtils::GetInvalidStreamId(framer_.transport_version());
7962 window_update_frame.max_data = 0x1122334455667788;
7963
7964 QuicFrames frames = {QuicFrame(window_update_frame)};
7965
7966 // clang-format off
7967 unsigned char packet_ietf[] = {
7968 // type (short header, 4 byte packet number)
7969 0x43,
7970 // connection_id
7971 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
7972 // packet number
7973 0x12, 0x34, 0x56, 0x78,
7974
7975 // frame type (IETF_MAX_DATA frame)
7976 0x10,
7977 // byte offset
7978 kVarInt62EightBytes + 0x11, 0x22, 0x33, 0x44,
7979 0x55, 0x66, 0x77, 0x88,
7980 };
7981 // clang-format on
7982
7983 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
7984 ASSERT_TRUE(data != nullptr);
7985
7986 quiche::test::CompareCharArraysWithHexError(
7987 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
7988 ABSL_ARRAYSIZE(packet_ietf));
7989 }
7990
TEST_P(QuicFramerTest,BuildBlockedPacket)7991 TEST_P(QuicFramerTest, BuildBlockedPacket) {
7992 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
7993 QuicPacketHeader header;
7994 header.destination_connection_id = FramerTestConnectionId();
7995 header.reset_flag = false;
7996 header.version_flag = false;
7997 header.packet_number = kPacketNumber;
7998
7999 QuicBlockedFrame blocked_frame;
8000 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8001 // For IETF QUIC, the stream ID must be <invalid> for the frame
8002 // to be a BLOCKED frame. if it's valid, it will be a
8003 // STREAM_BLOCKED frame.
8004 blocked_frame.stream_id =
8005 QuicUtils::GetInvalidStreamId(framer_.transport_version());
8006 } else {
8007 blocked_frame.stream_id = kStreamId;
8008 }
8009 blocked_frame.offset = kStreamOffset;
8010
8011 QuicFrames frames = {QuicFrame(blocked_frame)};
8012
8013 // clang-format off
8014 unsigned char packet[] = {
8015 // type (short packet, 4 byte packet number)
8016 0x43,
8017 // connection_id
8018 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8019 // packet number
8020 0x12, 0x34, 0x56, 0x78,
8021
8022 // frame type (blocked frame)
8023 0x05,
8024 // stream id
8025 0x01, 0x02, 0x03, 0x04,
8026 };
8027
8028 unsigned char packet_ietf[] = {
8029 // type (short packet, 4 byte packet number)
8030 0x43,
8031 // connection_id
8032 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8033 // packet number
8034 0x12, 0x34, 0x56, 0x78,
8035
8036 // frame type (IETF_DATA_BLOCKED frame)
8037 0x14,
8038 // Offset
8039 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
8040 };
8041 // clang-format on
8042
8043 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8044 ASSERT_TRUE(data != nullptr);
8045
8046 unsigned char* p = packet;
8047 size_t p_size = ABSL_ARRAYSIZE(packet);
8048 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8049 p = packet_ietf;
8050 p_size = ABSL_ARRAYSIZE(packet_ietf);
8051 }
8052
8053 quiche::test::CompareCharArraysWithHexError(
8054 "constructed packet", data->data(), data->length(), AsChars(p), p_size);
8055 }
8056
TEST_P(QuicFramerTest,BuildPingPacket)8057 TEST_P(QuicFramerTest, BuildPingPacket) {
8058 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8059 QuicPacketHeader header;
8060 header.destination_connection_id = FramerTestConnectionId();
8061 header.reset_flag = false;
8062 header.version_flag = false;
8063 header.packet_number = kPacketNumber;
8064
8065 QuicFrames frames = {QuicFrame(QuicPingFrame())};
8066
8067 // clang-format off
8068 unsigned char packet[] = {
8069 // type (short header, 4 byte packet number)
8070 0x43,
8071 // connection_id
8072 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8073 // packet number
8074 0x12, 0x34, 0x56, 0x78,
8075
8076 // frame type
8077 0x07,
8078 };
8079
8080 unsigned char packet_ietf[] = {
8081 // type (short header, 4 byte packet number)
8082 0x43,
8083 // connection_id
8084 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8085 // packet number
8086 0x12, 0x34, 0x56, 0x78,
8087
8088 // frame type (IETF_PING frame)
8089 0x01,
8090 };
8091 // clang-format on
8092
8093 unsigned char* p = packet;
8094 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8095 p = packet_ietf;
8096 }
8097
8098 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8099 ASSERT_TRUE(data != nullptr);
8100
8101 quiche::test::CompareCharArraysWithHexError(
8102 "constructed packet", data->data(), data->length(), AsChars(p),
8103 ABSL_ARRAYSIZE(packet));
8104 }
8105
TEST_P(QuicFramerTest,BuildHandshakeDonePacket)8106 TEST_P(QuicFramerTest, BuildHandshakeDonePacket) {
8107 QuicPacketHeader header;
8108 header.destination_connection_id = FramerTestConnectionId();
8109 header.reset_flag = false;
8110 header.version_flag = false;
8111 header.packet_number = kPacketNumber;
8112
8113 QuicFrames frames = {QuicFrame(QuicHandshakeDoneFrame())};
8114
8115 // clang-format off
8116 unsigned char packet[] = {
8117 // type (short header, 4 byte packet number)
8118 0x43,
8119 // connection_id
8120 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8121 // packet number
8122 0x12, 0x34, 0x56, 0x78,
8123
8124 // frame type (Handshake done frame)
8125 0x1e,
8126 };
8127 // clang-format on
8128 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8129 return;
8130 }
8131
8132 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8133 ASSERT_TRUE(data != nullptr);
8134
8135 quiche::test::CompareCharArraysWithHexError(
8136 "constructed packet", data->data(), data->length(), AsChars(packet),
8137 ABSL_ARRAYSIZE(packet));
8138 }
8139
TEST_P(QuicFramerTest,BuildAckFrequencyPacket)8140 TEST_P(QuicFramerTest, BuildAckFrequencyPacket) {
8141 QuicPacketHeader header;
8142 header.destination_connection_id = FramerTestConnectionId();
8143 header.reset_flag = false;
8144 header.version_flag = false;
8145 header.packet_number = kPacketNumber;
8146
8147 QuicAckFrequencyFrame ack_frequency_frame;
8148 ack_frequency_frame.sequence_number = 3;
8149 ack_frequency_frame.packet_tolerance = 5;
8150 ack_frequency_frame.max_ack_delay = QuicTime::Delta::FromMicroseconds(0x3fff);
8151 ack_frequency_frame.ignore_order = false;
8152 QuicFrames frames = {QuicFrame(&ack_frequency_frame)};
8153
8154 // clang-format off
8155 unsigned char packet[] = {
8156 // type (short header, 4 byte packet number)
8157 0x43,
8158 // connection_id
8159 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8160 // packet number
8161 0x12, 0x34, 0x56, 0x78,
8162
8163 // frame type (Ack Frequency frame)
8164 0x40, 0xaf,
8165 // sequence number
8166 0x03,
8167 // packet tolerance
8168 0x05,
8169 // max_ack_delay_us
8170 0x7f, 0xff,
8171 // ignore_oder
8172 0x00
8173 };
8174 // clang-format on
8175 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8176 return;
8177 }
8178
8179 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8180 ASSERT_TRUE(data != nullptr);
8181
8182 quiche::test::CompareCharArraysWithHexError(
8183 "constructed packet", data->data(), data->length(), AsChars(packet),
8184 ABSL_ARRAYSIZE(packet));
8185 }
8186
TEST_P(QuicFramerTest,BuildResetStreamAtPacket)8187 TEST_P(QuicFramerTest, BuildResetStreamAtPacket) {
8188 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8189 return;
8190 }
8191
8192 QuicPacketHeader header;
8193 header.destination_connection_id = FramerTestConnectionId();
8194 header.reset_flag = false;
8195 header.version_flag = false;
8196 header.packet_number = kPacketNumber;
8197
8198 QuicResetStreamAtFrame frame;
8199 frame.stream_id = 0x00;
8200 frame.error = 0x1e;
8201 frame.final_offset = 0x20;
8202 frame.reliable_offset = 0x10;
8203 QuicFrames frames = {QuicFrame(&frame)};
8204
8205 framer_.set_process_reset_stream_at(true);
8206 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8207 ASSERT_TRUE(data != nullptr);
8208
8209 // clang-format off
8210 unsigned char packet[] = {
8211 // type (short header, 4 byte packet number)
8212 0x43,
8213 // connection_id
8214 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8215 // packet number
8216 0x12, 0x34, 0x56, 0x78,
8217
8218 // type = RESET_STREAM_AT
8219 0x24,
8220 // stream ID
8221 0x00,
8222 // application error code
8223 0x1e,
8224 // final size
8225 0x20,
8226 // reliable size
8227 0x10,
8228 };
8229 // clang-format on
8230
8231 quiche::test::CompareCharArraysWithHexError(
8232 "constructed packet", data->data(), data->length(), AsChars(packet),
8233 ABSL_ARRAYSIZE(packet));
8234 }
8235
TEST_P(QuicFramerTest,BuildMessagePacket)8236 TEST_P(QuicFramerTest, BuildMessagePacket) {
8237 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8238 QuicPacketHeader header;
8239 header.destination_connection_id = FramerTestConnectionId();
8240 header.reset_flag = false;
8241 header.version_flag = false;
8242 header.packet_number = kPacketNumber;
8243
8244 QuicMessageFrame frame(1, MemSliceFromString("message"));
8245 QuicMessageFrame frame2(2, MemSliceFromString("message2"));
8246 QuicFrames frames = {QuicFrame(&frame), QuicFrame(&frame2)};
8247
8248 // clang-format off
8249 unsigned char packet[] = {
8250 // type (short header, 4 byte packet number)
8251 0x43,
8252 // connection_id
8253 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8254 // packet number
8255 0x12, 0x34, 0x56, 0x78,
8256
8257 // frame type (message frame)
8258 0x21,
8259 // Length
8260 0x07,
8261 // Message Data
8262 'm', 'e', 's', 's', 'a', 'g', 'e',
8263 // frame type (message frame no length)
8264 0x20,
8265 // Message Data
8266 'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8267 };
8268
8269 unsigned char packet_ietf[] = {
8270 // type (short header, 4 byte packet number)
8271 0x43,
8272 // connection_id
8273 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8274 // packet number
8275 0x12, 0x34, 0x56, 0x78,
8276
8277 // frame type (IETF_MESSAGE frame)
8278 0x31,
8279 // Length
8280 0x07,
8281 // Message Data
8282 'm', 'e', 's', 's', 'a', 'g', 'e',
8283 // frame type (message frame no length)
8284 0x30,
8285 // Message Data
8286 'm', 'e', 's', 's', 'a', 'g', 'e', '2'
8287 };
8288 // clang-format on
8289
8290 unsigned char* p = packet;
8291 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8292 p = packet_ietf;
8293 }
8294
8295 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8296 ASSERT_TRUE(data != nullptr);
8297
8298 quiche::test::CompareCharArraysWithHexError(
8299 "constructed packet", data->data(), data->length(), AsChars(p),
8300 ABSL_ARRAYSIZE(packet));
8301 }
8302
8303 // Test that the MTU discovery packet is serialized correctly as a PING packet.
TEST_P(QuicFramerTest,BuildMtuDiscoveryPacket)8304 TEST_P(QuicFramerTest, BuildMtuDiscoveryPacket) {
8305 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8306 QuicPacketHeader header;
8307 header.destination_connection_id = FramerTestConnectionId();
8308 header.reset_flag = false;
8309 header.version_flag = false;
8310 header.packet_number = kPacketNumber;
8311
8312 QuicFrames frames = {QuicFrame(QuicMtuDiscoveryFrame())};
8313
8314 // clang-format off
8315 unsigned char packet[] = {
8316 // type (short header, 4 byte packet number)
8317 0x43,
8318 // connection_id
8319 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8320 // packet number
8321 0x12, 0x34, 0x56, 0x78,
8322
8323 // frame type
8324 0x07,
8325 };
8326
8327 unsigned char packet_ietf[] = {
8328 // type (short header, 4 byte packet number)
8329 0x43,
8330 // connection_id
8331 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8332 // packet number
8333 0x12, 0x34, 0x56, 0x78,
8334
8335 // frame type (IETF_PING frame)
8336 0x01,
8337 };
8338 // clang-format on
8339
8340 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
8341 ASSERT_TRUE(data != nullptr);
8342
8343 unsigned char* p = packet;
8344 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8345 p = packet_ietf;
8346 }
8347
8348 quiche::test::CompareCharArraysWithHexError(
8349 "constructed packet", data->data(), data->length(), AsChars(p),
8350 ABSL_ARRAYSIZE(packet));
8351 }
8352
TEST_P(QuicFramerTest,BuildPublicResetPacket)8353 TEST_P(QuicFramerTest, BuildPublicResetPacket) {
8354 QuicPublicResetPacket reset_packet;
8355 reset_packet.connection_id = FramerTestConnectionId();
8356 reset_packet.nonce_proof = kNonceProof;
8357
8358 // clang-format off
8359 unsigned char packet[] = {
8360 // public flags (public reset, 8 byte ConnectionId)
8361 0x0E,
8362 // connection_id
8363 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8364 // message tag (kPRST)
8365 'P', 'R', 'S', 'T',
8366 // num_entries (1) + padding
8367 0x01, 0x00, 0x00, 0x00,
8368 // tag kRNON
8369 'R', 'N', 'O', 'N',
8370 // end offset 8
8371 0x08, 0x00, 0x00, 0x00,
8372 // nonce proof
8373 0x89, 0x67, 0x45, 0x23,
8374 0x01, 0xEF, 0xCD, 0xAB,
8375 };
8376 // clang-format on
8377
8378 std::unique_ptr<QuicEncryptedPacket> data(
8379 framer_.BuildPublicResetPacket(reset_packet));
8380 ASSERT_TRUE(data != nullptr);
8381 quiche::test::CompareCharArraysWithHexError(
8382 "constructed packet", data->data(), data->length(), AsChars(packet),
8383 ABSL_ARRAYSIZE(packet));
8384 }
8385
TEST_P(QuicFramerTest,BuildPublicResetPacketWithClientAddress)8386 TEST_P(QuicFramerTest, BuildPublicResetPacketWithClientAddress) {
8387 QuicPublicResetPacket reset_packet;
8388 reset_packet.connection_id = FramerTestConnectionId();
8389 reset_packet.nonce_proof = kNonceProof;
8390 reset_packet.client_address =
8391 QuicSocketAddress(QuicIpAddress::Loopback4(), 0x1234);
8392
8393 // clang-format off
8394 unsigned char packet[] = {
8395 // public flags (public reset, 8 byte ConnectionId)
8396 0x0E,
8397 // connection_id
8398 0xFE, 0xDC, 0xBA, 0x98,
8399 0x76, 0x54, 0x32, 0x10,
8400 // message tag (kPRST)
8401 'P', 'R', 'S', 'T',
8402 // num_entries (2) + padding
8403 0x02, 0x00, 0x00, 0x00,
8404 // tag kRNON
8405 'R', 'N', 'O', 'N',
8406 // end offset 8
8407 0x08, 0x00, 0x00, 0x00,
8408 // tag kCADR
8409 'C', 'A', 'D', 'R',
8410 // end offset 16
8411 0x10, 0x00, 0x00, 0x00,
8412 // nonce proof
8413 0x89, 0x67, 0x45, 0x23,
8414 0x01, 0xEF, 0xCD, 0xAB,
8415 // client address
8416 0x02, 0x00,
8417 0x7F, 0x00, 0x00, 0x01,
8418 0x34, 0x12,
8419 };
8420 // clang-format on
8421
8422 std::unique_ptr<QuicEncryptedPacket> data(
8423 framer_.BuildPublicResetPacket(reset_packet));
8424 ASSERT_TRUE(data != nullptr);
8425
8426 quiche::test::CompareCharArraysWithHexError(
8427 "constructed packet", data->data(), data->length(), AsChars(packet),
8428 ABSL_ARRAYSIZE(packet));
8429 }
8430
TEST_P(QuicFramerTest,BuildPublicResetPacketWithEndpointId)8431 TEST_P(QuicFramerTest, BuildPublicResetPacketWithEndpointId) {
8432 QuicPublicResetPacket reset_packet;
8433 reset_packet.connection_id = FramerTestConnectionId();
8434 reset_packet.nonce_proof = kNonceProof;
8435 reset_packet.endpoint_id = "FakeServerId";
8436
8437 // The tag value map in CryptoHandshakeMessage is a std::map, so the two tags
8438 // in the packet, kRNON and kEPID, have unspecified ordering w.r.t each other.
8439 // clang-format off
8440 unsigned char packet_variant1[] = {
8441 // public flags (public reset, 8 byte ConnectionId)
8442 0x0E,
8443 // connection_id
8444 0xFE, 0xDC, 0xBA, 0x98,
8445 0x76, 0x54, 0x32, 0x10,
8446 // message tag (kPRST)
8447 'P', 'R', 'S', 'T',
8448 // num_entries (2) + padding
8449 0x02, 0x00, 0x00, 0x00,
8450 // tag kRNON
8451 'R', 'N', 'O', 'N',
8452 // end offset 8
8453 0x08, 0x00, 0x00, 0x00,
8454 // tag kEPID
8455 'E', 'P', 'I', 'D',
8456 // end offset 20
8457 0x14, 0x00, 0x00, 0x00,
8458 // nonce proof
8459 0x89, 0x67, 0x45, 0x23,
8460 0x01, 0xEF, 0xCD, 0xAB,
8461 // Endpoint ID
8462 'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
8463 };
8464 unsigned char packet_variant2[] = {
8465 // public flags (public reset, 8 byte ConnectionId)
8466 0x0E,
8467 // connection_id
8468 0xFE, 0xDC, 0xBA, 0x98,
8469 0x76, 0x54, 0x32, 0x10,
8470 // message tag (kPRST)
8471 'P', 'R', 'S', 'T',
8472 // num_entries (2) + padding
8473 0x02, 0x00, 0x00, 0x00,
8474 // tag kEPID
8475 'E', 'P', 'I', 'D',
8476 // end offset 12
8477 0x0C, 0x00, 0x00, 0x00,
8478 // tag kRNON
8479 'R', 'N', 'O', 'N',
8480 // end offset 20
8481 0x14, 0x00, 0x00, 0x00,
8482 // Endpoint ID
8483 'F', 'a', 'k', 'e', 'S', 'e', 'r', 'v', 'e', 'r', 'I', 'd',
8484 // nonce proof
8485 0x89, 0x67, 0x45, 0x23,
8486 0x01, 0xEF, 0xCD, 0xAB,
8487 };
8488 // clang-format on
8489
8490 std::unique_ptr<QuicEncryptedPacket> data(
8491 framer_.BuildPublicResetPacket(reset_packet));
8492 ASSERT_TRUE(data != nullptr);
8493
8494 // Variant 1 ends with char 'd'. Variant 1 ends with char 0xAB.
8495 if ('d' == data->data()[data->length() - 1]) {
8496 quiche::test::CompareCharArraysWithHexError(
8497 "constructed packet", data->data(), data->length(),
8498 AsChars(packet_variant1), ABSL_ARRAYSIZE(packet_variant1));
8499 } else {
8500 quiche::test::CompareCharArraysWithHexError(
8501 "constructed packet", data->data(), data->length(),
8502 AsChars(packet_variant2), ABSL_ARRAYSIZE(packet_variant2));
8503 }
8504 }
8505
TEST_P(QuicFramerTest,BuildIetfStatelessResetPacket)8506 TEST_P(QuicFramerTest, BuildIetfStatelessResetPacket) {
8507 // clang-format off
8508 unsigned char packet[] = {
8509 // 1st byte 01XX XXXX
8510 0x40,
8511 // At least 4 bytes of random bytes.
8512 0x00, 0x00, 0x00, 0x00,
8513 // stateless reset token
8514 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
8515 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
8516 };
8517 // clang-format on
8518
8519 // Build the minimal stateless reset packet.
8520 std::unique_ptr<QuicEncryptedPacket> data(
8521 framer_.BuildIetfStatelessResetPacket(
8522 FramerTestConnectionId(),
8523 QuicFramer::GetMinStatelessResetPacketLength() + 1,
8524 kTestStatelessResetToken));
8525 ASSERT_TRUE(data);
8526 EXPECT_EQ(QuicFramer::GetMinStatelessResetPacketLength(), data->length());
8527 // Verify the first 2 bits are 01.
8528 EXPECT_FALSE(data->data()[0] & FLAGS_LONG_HEADER);
8529 EXPECT_TRUE(data->data()[0] & FLAGS_FIXED_BIT);
8530 // Verify stateless reset token.
8531 quiche::test::CompareCharArraysWithHexError(
8532 "constructed packet",
8533 data->data() + data->length() - kStatelessResetTokenLength,
8534 kStatelessResetTokenLength,
8535 AsChars(packet) + ABSL_ARRAYSIZE(packet) - kStatelessResetTokenLength,
8536 kStatelessResetTokenLength);
8537
8538 // Packets with length <= minimal stateless reset does not trigger stateless
8539 // reset.
8540 std::unique_ptr<QuicEncryptedPacket> data2(
8541 framer_.BuildIetfStatelessResetPacket(
8542 FramerTestConnectionId(),
8543 QuicFramer::GetMinStatelessResetPacketLength(),
8544 kTestStatelessResetToken));
8545 ASSERT_FALSE(data2);
8546
8547 // Do not send stateless reset >= minimal stateless reset + 1 + max
8548 // connection ID length.
8549 std::unique_ptr<QuicEncryptedPacket> data3(
8550 framer_.BuildIetfStatelessResetPacket(FramerTestConnectionId(), 1000,
8551 kTestStatelessResetToken));
8552 ASSERT_TRUE(data3);
8553 EXPECT_EQ(QuicFramer::GetMinStatelessResetPacketLength() + 1 +
8554 kQuicMaxConnectionIdWithLengthPrefixLength,
8555 data3->length());
8556 }
8557
TEST_P(QuicFramerTest,BuildIetfStatelessResetPacketCallerProvidedRandomBytes)8558 TEST_P(QuicFramerTest, BuildIetfStatelessResetPacketCallerProvidedRandomBytes) {
8559 // clang-format off
8560 unsigned char packet[] = {
8561 // 1st byte 01XX XXXX
8562 0x7c,
8563 // Random bytes
8564 0x7c, 0x7c, 0x7c, 0x7c,
8565 // stateless reset token
8566 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
8567 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
8568 };
8569 // clang-format on
8570
8571 // Build the minimal stateless reset packet with caller-provided random bytes.
8572 MockRandom random;
8573 auto generate_random_bytes = [](void* data, size_t len) {
8574 std::string bytes(len, 0x7c);
8575 memcpy(data, bytes.data(), bytes.size());
8576 };
8577 EXPECT_CALL(random, InsecureRandBytes(_, _))
8578 .WillOnce(testing::Invoke(generate_random_bytes));
8579 std::unique_ptr<QuicEncryptedPacket> data(
8580 framer_.BuildIetfStatelessResetPacket(
8581 FramerTestConnectionId(),
8582 QuicFramer::GetMinStatelessResetPacketLength() + 1,
8583 kTestStatelessResetToken, &random));
8584 ASSERT_TRUE(data);
8585 EXPECT_EQ(QuicFramer::GetMinStatelessResetPacketLength(), data->length());
8586 // Verify the first 2 bits are 01.
8587 EXPECT_FALSE(data->data()[0] & FLAGS_LONG_HEADER);
8588 EXPECT_TRUE(data->data()[0] & FLAGS_FIXED_BIT);
8589 // Verify the entire packet.
8590 quiche::test::CompareCharArraysWithHexError(
8591 "constructed packet", data->data(), data->length(), AsChars(packet),
8592 ABSL_ARRAYSIZE(packet));
8593 }
8594
TEST_P(QuicFramerTest,EncryptPacket)8595 TEST_P(QuicFramerTest, EncryptPacket) {
8596 QuicPacketNumber packet_number = kPacketNumber;
8597 // clang-format off
8598 unsigned char packet[] = {
8599 // type (short header, 4 byte packet number)
8600 0x43,
8601 // connection_id
8602 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8603 // packet number
8604 0x12, 0x34, 0x56, 0x78,
8605
8606 // redundancy
8607 'a', 'b', 'c', 'd',
8608 'e', 'f', 'g', 'h',
8609 'i', 'j', 'k', 'l',
8610 'm', 'n', 'o', 'p',
8611 };
8612
8613 unsigned char packet50[] = {
8614 // type (short header, 4 byte packet number)
8615 0x43,
8616 // connection_id
8617 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8618 // packet number
8619 0x12, 0x34, 0x56, 0x78,
8620
8621 // redundancy
8622 'a', 'b', 'c', 'd',
8623 'e', 'f', 'g', 'h',
8624 'i', 'j', 'k', 'l',
8625 'm', 'n', 'o', 'p',
8626 'q', 'r', 's', 't',
8627 };
8628 // clang-format on
8629
8630 unsigned char* p = packet;
8631 size_t p_size = ABSL_ARRAYSIZE(packet);
8632 if (framer_.version().HasHeaderProtection()) {
8633 p = packet50;
8634 p_size = ABSL_ARRAYSIZE(packet50);
8635 }
8636
8637 std::unique_ptr<QuicPacket> raw(new QuicPacket(
8638 AsChars(p), p_size, false, kPacket8ByteConnectionId,
8639 kPacket0ByteConnectionId, !kIncludeVersion, !kIncludeDiversificationNonce,
8640 PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
8641 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0));
8642 char buffer[kMaxOutgoingPacketSize];
8643 size_t encrypted_length = framer_.EncryptPayload(
8644 ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
8645
8646 ASSERT_NE(0u, encrypted_length);
8647 EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
8648 }
8649
8650 // Regression test for b/158014497.
TEST_P(QuicFramerTest,EncryptEmptyPacket)8651 TEST_P(QuicFramerTest, EncryptEmptyPacket) {
8652 auto packet = std::make_unique<QuicPacket>(
8653 new char[100], 0, true, kPacket8ByteConnectionId,
8654 kPacket0ByteConnectionId,
8655 /*includes_version=*/true,
8656 /*includes_diversification_nonce=*/true, PACKET_1BYTE_PACKET_NUMBER,
8657 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
8658 /*retry_token_length=*/0, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
8659 char buffer[kMaxOutgoingPacketSize];
8660 size_t encrypted_length = 1;
8661 EXPECT_QUIC_BUG(
8662 {
8663 encrypted_length =
8664 framer_.EncryptPayload(ENCRYPTION_INITIAL, kPacketNumber, *packet,
8665 buffer, kMaxOutgoingPacketSize);
8666 EXPECT_EQ(0u, encrypted_length);
8667 },
8668 "packet is shorter than associated data length");
8669 }
8670
TEST_P(QuicFramerTest,EncryptPacketWithVersionFlag)8671 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) {
8672 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8673 QuicPacketNumber packet_number = kPacketNumber;
8674 // clang-format off
8675 unsigned char packet[] = {
8676 // type (long header with packet type ZERO_RTT_PROTECTED)
8677 0xD3,
8678 // version tag
8679 'Q', '.', '1', '0',
8680 // connection_id length
8681 0x50,
8682 // connection_id
8683 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8684 // packet number
8685 0x12, 0x34, 0x56, 0x78,
8686
8687 // redundancy
8688 'a', 'b', 'c', 'd',
8689 'e', 'f', 'g', 'h',
8690 'i', 'j', 'k', 'l',
8691 'm', 'n', 'o', 'p',
8692 };
8693
8694 unsigned char packet50[] = {
8695 // type (long header with packet type ZERO_RTT_PROTECTED)
8696 0xD3,
8697 // version tag
8698 'Q', '.', '1', '0',
8699 // destination connection ID length
8700 0x08,
8701 // destination connection ID
8702 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8703 // source connection ID length
8704 0x00,
8705 // packet number
8706 0x12, 0x34, 0x56, 0x78,
8707
8708 // redundancy
8709 'a', 'b', 'c', 'd',
8710 'e', 'f', 'g', 'h',
8711 'i', 'j', 'k', 'l',
8712 'm', 'n', 'o', 'p',
8713 'q', 'r', 's', 't',
8714 };
8715 // clang-format on
8716
8717 unsigned char* p = packet;
8718 size_t p_size = ABSL_ARRAYSIZE(packet);
8719 // TODO(ianswett): see todo in previous test.
8720 if (framer_.version().HasHeaderProtection()) {
8721 p = packet50;
8722 p_size = ABSL_ARRAYSIZE(packet50);
8723 }
8724
8725 std::unique_ptr<QuicPacket> raw(new QuicPacket(
8726 AsChars(p), p_size, false, kPacket8ByteConnectionId,
8727 kPacket0ByteConnectionId, kIncludeVersion, !kIncludeDiversificationNonce,
8728 PACKET_4BYTE_PACKET_NUMBER, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
8729 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0));
8730 char buffer[kMaxOutgoingPacketSize];
8731 size_t encrypted_length = framer_.EncryptPayload(
8732 ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
8733
8734 ASSERT_NE(0u, encrypted_length);
8735 EXPECT_TRUE(CheckEncryption(packet_number, raw.get()));
8736 }
8737
TEST_P(QuicFramerTest,AckTruncationLargePacket)8738 TEST_P(QuicFramerTest, AckTruncationLargePacket) {
8739 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8740 // This test is not applicable to this version; the range count is
8741 // effectively unlimited
8742 return;
8743 }
8744 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8745
8746 QuicPacketHeader header;
8747 header.destination_connection_id = FramerTestConnectionId();
8748 header.reset_flag = false;
8749 header.version_flag = false;
8750 header.packet_number = kPacketNumber;
8751
8752 QuicAckFrame ack_frame;
8753 // Create a packet with just the ack.
8754 ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
8755 QuicFrames frames = {QuicFrame(&ack_frame)};
8756
8757 // Build an ack packet with truncation due to limit in number of nack ranges.
8758 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8759 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
8760 ASSERT_TRUE(raw_ack_packet != nullptr);
8761 char buffer[kMaxOutgoingPacketSize];
8762 size_t encrypted_length =
8763 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
8764 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
8765 ASSERT_NE(0u, encrypted_length);
8766 // Now make sure we can turn our ack packet back into an ack frame.
8767 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
8768 ASSERT_TRUE(framer_.ProcessPacket(
8769 QuicEncryptedPacket(buffer, encrypted_length, false)));
8770 ASSERT_EQ(1u, visitor_.ack_frames_.size());
8771 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
8772 EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
8773 ASSERT_EQ(256u, processed_ack_frame.packets.NumPacketsSlow());
8774 EXPECT_EQ(QuicPacketNumber(90u), processed_ack_frame.packets.Min());
8775 EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
8776 }
8777
8778 // Regression test for b/150386368.
TEST_P(QuicFramerTest,IetfAckFrameTruncation)8779 TEST_P(QuicFramerTest, IetfAckFrameTruncation) {
8780 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
8781 return;
8782 }
8783 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8784
8785 QuicPacketHeader header;
8786 header.destination_connection_id = FramerTestConnectionId();
8787 header.reset_flag = false;
8788 header.version_flag = false;
8789 header.packet_number = kPacketNumber;
8790
8791 QuicAckFrame ack_frame;
8792 // Create a packet with just the ack.
8793 ack_frame = MakeAckFrameWithGaps(/*gap_size=*/0xffffffff,
8794 /*max_num_gaps=*/200,
8795 /*largest_acked=*/kMaxIetfVarInt);
8796 ack_frame.ecn_counters = QuicEcnCounts(100, 10000, 1000000);
8797 QuicFrames frames = {QuicFrame(&ack_frame)};
8798 // Build an ACK packet.
8799 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8800 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
8801 ASSERT_TRUE(raw_ack_packet != nullptr);
8802 char buffer[kMaxOutgoingPacketSize];
8803 size_t encrypted_length =
8804 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
8805 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
8806 ASSERT_NE(0u, encrypted_length);
8807 // Now make sure we can turn our ack packet back into an ack frame.
8808 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
8809 ASSERT_TRUE(framer_.ProcessPacket(
8810 QuicEncryptedPacket(buffer, encrypted_length, false)));
8811 ASSERT_EQ(1u, visitor_.ack_frames_.size());
8812 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
8813 EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
8814 LargestAcked(processed_ack_frame));
8815 // Verify ACK frame gets truncated.
8816 ASSERT_LT(processed_ack_frame.packets.NumPacketsSlow(),
8817 ack_frame.packets.NumIntervals());
8818 EXPECT_EQ(157u, processed_ack_frame.packets.NumPacketsSlow());
8819 EXPECT_LT(processed_ack_frame.packets.NumIntervals(),
8820 ack_frame.packets.NumIntervals());
8821 EXPECT_EQ(QuicPacketNumber(kMaxIetfVarInt),
8822 processed_ack_frame.packets.Max());
8823 }
8824
TEST_P(QuicFramerTest,AckTruncationSmallPacket)8825 TEST_P(QuicFramerTest, AckTruncationSmallPacket) {
8826 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8827 // This test is not applicable to this version; the range count is
8828 // effectively unlimited
8829 return;
8830 }
8831 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8832
8833 QuicPacketHeader header;
8834 header.destination_connection_id = FramerTestConnectionId();
8835 header.reset_flag = false;
8836 header.version_flag = false;
8837 header.packet_number = kPacketNumber;
8838
8839 // Create a packet with just the ack.
8840 QuicAckFrame ack_frame;
8841 ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
8842 QuicFrames frames = {QuicFrame(&ack_frame)};
8843
8844 // Build an ack packet with truncation due to limit in number of nack ranges.
8845 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8846 std::unique_ptr<QuicPacket> raw_ack_packet(
8847 BuildDataPacket(header, frames, 500));
8848 ASSERT_TRUE(raw_ack_packet != nullptr);
8849 char buffer[kMaxOutgoingPacketSize];
8850 size_t encrypted_length =
8851 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
8852 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
8853 ASSERT_NE(0u, encrypted_length);
8854 // Now make sure we can turn our ack packet back into an ack frame.
8855 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
8856 ASSERT_TRUE(framer_.ProcessPacket(
8857 QuicEncryptedPacket(buffer, encrypted_length, false)));
8858 ASSERT_EQ(1u, visitor_.ack_frames_.size());
8859 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
8860 EXPECT_EQ(QuicPacketNumber(600u), LargestAcked(processed_ack_frame));
8861 ASSERT_EQ(240u, processed_ack_frame.packets.NumPacketsSlow());
8862 EXPECT_EQ(QuicPacketNumber(122u), processed_ack_frame.packets.Min());
8863 EXPECT_EQ(QuicPacketNumber(600u), processed_ack_frame.packets.Max());
8864 }
8865
TEST_P(QuicFramerTest,CleanTruncation)8866 TEST_P(QuicFramerTest, CleanTruncation) {
8867 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
8868 // This test is not applicable to this version; the range count is
8869 // effectively unlimited
8870 return;
8871 }
8872 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8873
8874 QuicPacketHeader header;
8875 header.destination_connection_id = FramerTestConnectionId();
8876 header.reset_flag = false;
8877 header.version_flag = false;
8878 header.packet_number = kPacketNumber;
8879
8880 QuicAckFrame ack_frame = InitAckFrame(201);
8881
8882 // Create a packet with just the ack.
8883 QuicFrames frames = {QuicFrame(&ack_frame)};
8884 if (framer_.version().HasHeaderProtection()) {
8885 frames.push_back(QuicFrame(QuicPaddingFrame(12)));
8886 }
8887 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8888 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
8889 ASSERT_TRUE(raw_ack_packet != nullptr);
8890
8891 char buffer[kMaxOutgoingPacketSize];
8892 size_t encrypted_length =
8893 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
8894 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
8895 ASSERT_NE(0u, encrypted_length);
8896
8897 // Now make sure we can turn our ack packet back into an ack frame.
8898 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
8899 ASSERT_TRUE(framer_.ProcessPacket(
8900 QuicEncryptedPacket(buffer, encrypted_length, false)));
8901
8902 // Test for clean truncation of the ack by comparing the length of the
8903 // original packets to the re-serialized packets.
8904 frames.clear();
8905 frames.push_back(QuicFrame(visitor_.ack_frames_[0].get()));
8906 if (framer_.version().HasHeaderProtection()) {
8907 frames.push_back(QuicFrame(*visitor_.padding_frames_[0].get()));
8908 }
8909
8910 size_t original_raw_length = raw_ack_packet->length();
8911 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
8912 raw_ack_packet = BuildDataPacket(header, frames);
8913 ASSERT_TRUE(raw_ack_packet != nullptr);
8914 EXPECT_EQ(original_raw_length, raw_ack_packet->length());
8915 ASSERT_TRUE(raw_ack_packet != nullptr);
8916 }
8917
TEST_P(QuicFramerTest,StopPacketProcessing)8918 TEST_P(QuicFramerTest, StopPacketProcessing) {
8919 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
8920 // clang-format off
8921 unsigned char packet[] = {
8922 // type (short header, 4 byte packet number)
8923 0x43,
8924 // connection_id
8925 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8926 // packet number
8927 0x12, 0x34, 0x56, 0x78,
8928
8929 // frame type (stream frame with fin)
8930 0xFF,
8931 // stream id
8932 0x01, 0x02, 0x03, 0x04,
8933 // offset
8934 0x3A, 0x98, 0xFE, 0xDC,
8935 0x32, 0x10, 0x76, 0x54,
8936 // data length
8937 0x00, 0x0c,
8938 // data
8939 'h', 'e', 'l', 'l',
8940 'o', ' ', 'w', 'o',
8941 'r', 'l', 'd', '!',
8942
8943 // frame type (ack frame)
8944 0x40,
8945 // least packet number awaiting an ack
8946 0x12, 0x34, 0x56, 0x78,
8947 0x9A, 0xA0,
8948 // largest observed packet number
8949 0x12, 0x34, 0x56, 0x78,
8950 0x9A, 0xBF,
8951 // num missing packets
8952 0x01,
8953 // missing packet
8954 0x12, 0x34, 0x56, 0x78,
8955 0x9A, 0xBE,
8956 };
8957
8958 unsigned char packet_ietf[] = {
8959 // type (short header, 4 byte packet number)
8960 0x43,
8961 // connection_id
8962 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
8963 // packet number
8964 0x12, 0x34, 0x56, 0x78,
8965
8966 // frame type (IETF_STREAM frame with fin, length, and offset bits set)
8967 0x08 | 0x01 | 0x02 | 0x04,
8968 // stream id
8969 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
8970 // offset
8971 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
8972 0x32, 0x10, 0x76, 0x54,
8973 // data length
8974 kVarInt62TwoBytes + 0x00, 0x0c,
8975 // data
8976 'h', 'e', 'l', 'l',
8977 'o', ' ', 'w', 'o',
8978 'r', 'l', 'd', '!',
8979
8980 // frame type (ack frame)
8981 0x0d,
8982 // largest observed packet number
8983 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
8984 // Delta time
8985 kVarInt62OneByte + 0x00,
8986 // Ack Block count
8987 kVarInt62OneByte + 0x01,
8988 // First block size (one packet)
8989 kVarInt62OneByte + 0x00,
8990
8991 // Next gap size & ack. Missing all preceding packets
8992 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
8993 kVarInt62OneByte + 0x00,
8994 };
8995 // clang-format on
8996
8997 MockFramerVisitor visitor;
8998 framer_.set_visitor(&visitor);
8999 EXPECT_CALL(visitor, OnPacket());
9000 EXPECT_CALL(visitor, OnPacketHeader(_));
9001 EXPECT_CALL(visitor, OnStreamFrame(_)).WillOnce(Return(false));
9002 EXPECT_CALL(visitor, OnPacketComplete());
9003 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true));
9004 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_)).WillOnce(Return(true));
9005 EXPECT_CALL(visitor, OnDecryptedPacket(_, _));
9006
9007 unsigned char* p = packet;
9008 size_t p_size = ABSL_ARRAYSIZE(packet);
9009 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
9010 p = packet_ietf;
9011 p_size = ABSL_ARRAYSIZE(packet_ietf);
9012 }
9013 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
9014 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9015 EXPECT_THAT(framer_.error(), IsQuicNoError());
9016 }
9017
9018 static char kTestString[] = "At least 20 characters.";
9019 static QuicStreamId kTestQuicStreamId = 1;
9020
9021 MATCHER_P(ExpectedStreamFrame, version, "") {
9022 return (arg.stream_id == kTestQuicStreamId ||
9023 QuicUtils::IsCryptoStreamId(version.transport_version,
9024 arg.stream_id)) &&
9025 !arg.fin && arg.offset == 0 &&
9026 std::string(arg.data_buffer, arg.data_length) == kTestString;
9027 // FIN is hard-coded false in ConstructEncryptedPacket.
9028 // Offset 0 is hard-coded in ConstructEncryptedPacket.
9029 }
9030
9031 // Verify that the packet returned by ConstructEncryptedPacket() can be properly
9032 // parsed by the framer.
TEST_P(QuicFramerTest,ConstructEncryptedPacket)9033 TEST_P(QuicFramerTest, ConstructEncryptedPacket) {
9034 // Since we are using ConstructEncryptedPacket, we have to set the framer's
9035 // crypto to be Null.
9036 if (framer_.version().KnowsWhichDecrypterToUse()) {
9037 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
9038 std::make_unique<StrictTaggingDecrypter>(
9039 (uint8_t)ENCRYPTION_FORWARD_SECURE));
9040 } else {
9041 framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
9042 std::make_unique<StrictTaggingDecrypter>(
9043 (uint8_t)ENCRYPTION_FORWARD_SECURE));
9044 }
9045 ParsedQuicVersionVector versions;
9046 versions.push_back(framer_.version());
9047 std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket(
9048 TestConnectionId(), EmptyQuicConnectionId(), false, false,
9049 kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
9050 CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, &versions));
9051
9052 MockFramerVisitor visitor;
9053 framer_.set_visitor(&visitor);
9054 EXPECT_CALL(visitor, OnPacket()).Times(1);
9055 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
9056 .Times(1)
9057 .WillOnce(Return(true));
9058 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
9059 .Times(1)
9060 .WillOnce(Return(true));
9061 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1).WillOnce(Return(true));
9062 EXPECT_CALL(visitor, OnDecryptedPacket(_, _)).Times(1);
9063 EXPECT_CALL(visitor, OnError(_)).Times(0);
9064 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
9065 if (!QuicVersionUsesCryptoFrames(framer_.version().transport_version)) {
9066 EXPECT_CALL(visitor, OnStreamFrame(ExpectedStreamFrame(framer_.version())))
9067 .Times(1);
9068 } else {
9069 EXPECT_CALL(visitor, OnCryptoFrame(_)).Times(1);
9070 }
9071 EXPECT_CALL(visitor, OnPacketComplete()).Times(1);
9072
9073 EXPECT_TRUE(framer_.ProcessPacket(*packet));
9074 EXPECT_THAT(framer_.error(), IsQuicNoError());
9075 }
9076
9077 // Verify that the packet returned by ConstructMisFramedEncryptedPacket()
9078 // does cause the framer to return an error.
TEST_P(QuicFramerTest,ConstructMisFramedEncryptedPacket)9079 TEST_P(QuicFramerTest, ConstructMisFramedEncryptedPacket) {
9080 // Since we are using ConstructEncryptedPacket, we have to set the framer's
9081 // crypto to be Null.
9082 if (framer_.version().KnowsWhichDecrypterToUse()) {
9083 framer_.InstallDecrypter(
9084 ENCRYPTION_FORWARD_SECURE,
9085 std::make_unique<StrictTaggingDecrypter>(ENCRYPTION_FORWARD_SECURE));
9086 }
9087 std::unique_ptr<QuicEncryptedPacket> packet(ConstructMisFramedEncryptedPacket(
9088 TestConnectionId(), EmptyQuicConnectionId(), false, false,
9089 kTestQuicStreamId, kTestString, CONNECTION_ID_PRESENT,
9090 CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, framer_.version(),
9091 Perspective::IS_CLIENT));
9092
9093 MockFramerVisitor visitor;
9094 framer_.set_visitor(&visitor);
9095 EXPECT_CALL(visitor, OnPacket()).Times(1);
9096 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
9097 .Times(1)
9098 .WillOnce(Return(true));
9099 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
9100 .Times(1)
9101 .WillOnce(Return(true));
9102 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1);
9103 EXPECT_CALL(visitor, OnDecryptedPacket(_, _)).Times(1);
9104 EXPECT_CALL(visitor, OnError(_)).Times(1);
9105 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0);
9106 EXPECT_CALL(visitor, OnPacketComplete()).Times(0);
9107
9108 EXPECT_FALSE(framer_.ProcessPacket(*packet));
9109 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
9110 }
9111
TEST_P(QuicFramerTest,IetfBlockedFrame)9112 TEST_P(QuicFramerTest, IetfBlockedFrame) {
9113 // This frame is only for IETF QUIC.
9114 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9115 return;
9116 }
9117 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9118
9119 // clang-format off
9120 PacketFragments packet_ietf = {
9121 // type (short header, 4 byte packet number)
9122 {"",
9123 {0x43}},
9124 // connection_id
9125 {"",
9126 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9127 // packet number
9128 {"",
9129 {0x12, 0x34, 0x9A, 0xBC}},
9130 // frame type (IETF_DATA_BLOCKED)
9131 {"",
9132 {0x14}},
9133 // blocked offset
9134 {"Can not read blocked offset.",
9135 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
9136 };
9137 // clang-format on
9138
9139 std::unique_ptr<QuicEncryptedPacket> encrypted(
9140 AssemblePacketFromFragments(packet_ietf));
9141 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9142
9143 EXPECT_THAT(framer_.error(), IsQuicNoError());
9144 ASSERT_TRUE(visitor_.header_.get());
9145 EXPECT_TRUE(CheckDecryption(
9146 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9147 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9148
9149 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
9150
9151 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_BLOCKED_DATA);
9152 }
9153
TEST_P(QuicFramerTest,BuildIetfBlockedPacket)9154 TEST_P(QuicFramerTest, BuildIetfBlockedPacket) {
9155 // This frame is only for IETF QUIC.
9156 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9157 return;
9158 }
9159
9160 QuicPacketHeader header;
9161 header.destination_connection_id = FramerTestConnectionId();
9162 header.reset_flag = false;
9163 header.version_flag = false;
9164 header.packet_number = kPacketNumber;
9165
9166 QuicBlockedFrame frame;
9167 frame.stream_id = QuicUtils::GetInvalidStreamId(framer_.transport_version());
9168 frame.offset = kStreamOffset;
9169 QuicFrames frames = {QuicFrame(frame)};
9170
9171 // clang-format off
9172 unsigned char packet_ietf[] = {
9173 // type (short header, 4 byte packet number)
9174 0x43,
9175 // connection_id
9176 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9177 // packet number
9178 0x12, 0x34, 0x56, 0x78,
9179
9180 // frame type (IETF_DATA_BLOCKED)
9181 0x14,
9182 // Offset
9183 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
9184 };
9185 // clang-format on
9186
9187 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9188 ASSERT_TRUE(data != nullptr);
9189
9190 quiche::test::CompareCharArraysWithHexError(
9191 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9192 ABSL_ARRAYSIZE(packet_ietf));
9193 }
9194
TEST_P(QuicFramerTest,IetfStreamBlockedFrame)9195 TEST_P(QuicFramerTest, IetfStreamBlockedFrame) {
9196 // This frame is only for IETF QUIC.
9197 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9198 return;
9199 }
9200 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9201
9202 // clang-format off
9203 PacketFragments packet_ietf = {
9204 // type (short header, 4 byte packet number)
9205 {"",
9206 {0x43}},
9207 // connection_id
9208 {"",
9209 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9210 // packet number
9211 {"",
9212 {0x12, 0x34, 0x9A, 0xBC}},
9213 // frame type (IETF_STREAM_DATA_BLOCKED)
9214 {"",
9215 {0x15}},
9216 // blocked offset
9217 {"Unable to read IETF_STREAM_DATA_BLOCKED frame stream id/count.",
9218 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
9219 {"Can not read stream blocked offset.",
9220 {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}},
9221 };
9222 // clang-format on
9223
9224 std::unique_ptr<QuicEncryptedPacket> encrypted(
9225 AssemblePacketFromFragments(packet_ietf));
9226 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9227
9228 EXPECT_THAT(framer_.error(), IsQuicNoError());
9229 ASSERT_TRUE(visitor_.header_.get());
9230 EXPECT_TRUE(CheckDecryption(
9231 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9232 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9233
9234 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
9235 EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
9236
9237 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_STREAM_BLOCKED_DATA);
9238 }
9239
TEST_P(QuicFramerTest,BuildIetfStreamBlockedPacket)9240 TEST_P(QuicFramerTest, BuildIetfStreamBlockedPacket) {
9241 // This frame is only for IETF QUIC.
9242 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9243 return;
9244 }
9245
9246 QuicPacketHeader header;
9247 header.destination_connection_id = FramerTestConnectionId();
9248 header.reset_flag = false;
9249 header.version_flag = false;
9250 header.packet_number = kPacketNumber;
9251
9252 QuicBlockedFrame frame;
9253 frame.stream_id = kStreamId;
9254 frame.offset = kStreamOffset;
9255 QuicFrames frames = {QuicFrame(frame)};
9256
9257 // clang-format off
9258 unsigned char packet_ietf[] = {
9259 // type (short header, 4 byte packet number)
9260 0x43,
9261 // connection_id
9262 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9263 // packet number
9264 0x12, 0x34, 0x56, 0x78,
9265
9266 // frame type (IETF_STREAM_DATA_BLOCKED)
9267 0x15,
9268 // Stream ID
9269 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
9270 // Offset
9271 kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54
9272 };
9273 // clang-format on
9274
9275 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9276 ASSERT_TRUE(data != nullptr);
9277
9278 quiche::test::CompareCharArraysWithHexError(
9279 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9280 ABSL_ARRAYSIZE(packet_ietf));
9281 }
9282
TEST_P(QuicFramerTest,BiDiMaxStreamsFrame)9283 TEST_P(QuicFramerTest, BiDiMaxStreamsFrame) {
9284 // This frame is only for IETF QUIC.
9285 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9286 return;
9287 }
9288 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9289
9290 // clang-format off
9291 PacketFragments packet_ietf = {
9292 // type (short header, 4 byte packet number)
9293 {"",
9294 {0x43}},
9295 // connection_id
9296 {"",
9297 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9298 // packet number
9299 {"",
9300 {0x12, 0x34, 0x9A, 0xBC}},
9301 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9302 {"",
9303 {0x12}},
9304 // max. streams
9305 {"Unable to read IETF_MAX_STREAMS_BIDIRECTIONAL frame stream id/count.",
9306 {kVarInt62OneByte + 0x03}},
9307 };
9308 // clang-format on
9309
9310 std::unique_ptr<QuicEncryptedPacket> encrypted(
9311 AssemblePacketFromFragments(packet_ietf));
9312 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9313
9314 EXPECT_THAT(framer_.error(), IsQuicNoError());
9315 ASSERT_TRUE(visitor_.header_.get());
9316 EXPECT_TRUE(CheckDecryption(
9317 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9318 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9319
9320 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9321 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
9322 CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9323 }
9324
TEST_P(QuicFramerTest,UniDiMaxStreamsFrame)9325 TEST_P(QuicFramerTest, UniDiMaxStreamsFrame) {
9326 // This frame is only for IETF QUIC.
9327 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9328 return;
9329 }
9330 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9331
9332 // clang-format off
9333 PacketFragments packet_ietf = {
9334 // type (short header, 4 byte packet number)
9335 {"",
9336 {0x43}},
9337 // Test runs in client mode, no connection id
9338 // packet number
9339 {"",
9340 {0x12, 0x34, 0x9A, 0xBC}},
9341 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9342 {"",
9343 {0x13}},
9344 // max. streams
9345 {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
9346 {kVarInt62OneByte + 0x03}},
9347 };
9348 // clang-format on
9349
9350 std::unique_ptr<QuicEncryptedPacket> encrypted(
9351 AssemblePacketFromFragments(packet_ietf));
9352 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9353 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9354
9355 EXPECT_THAT(framer_.error(), IsQuicNoError());
9356 ASSERT_TRUE(visitor_.header_.get());
9357 EXPECT_TRUE(CheckDecryption(
9358 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9359 kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9360
9361 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9362 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9363 CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9364 }
9365
TEST_P(QuicFramerTest,ServerUniDiMaxStreamsFrame)9366 TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrame) {
9367 // This frame is only for IETF QUIC.
9368 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9369 return;
9370 }
9371 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9372
9373 // clang-format off
9374 PacketFragments packet_ietf = {
9375 // type (short header, 4 byte packet number)
9376 {"",
9377 {0x43}},
9378 // connection_id
9379 {"",
9380 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9381 // packet number
9382 {"",
9383 {0x12, 0x34, 0x9A, 0xBC}},
9384 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9385 {"",
9386 {0x13}},
9387 // max. streams
9388 {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
9389 {kVarInt62OneByte + 0x03}},
9390 };
9391 // clang-format on
9392
9393 std::unique_ptr<QuicEncryptedPacket> encrypted(
9394 AssemblePacketFromFragments(packet_ietf));
9395 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9396
9397 EXPECT_THAT(framer_.error(), IsQuicNoError());
9398 ASSERT_TRUE(visitor_.header_.get());
9399 EXPECT_TRUE(CheckDecryption(
9400 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9401 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9402
9403 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9404 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9405 CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9406 }
9407
TEST_P(QuicFramerTest,ClientUniDiMaxStreamsFrame)9408 TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrame) {
9409 // This frame is only for IETF QUIC.
9410 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9411 return;
9412 }
9413 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9414
9415 // clang-format off
9416 PacketFragments packet_ietf = {
9417 // type (short header, 4 byte packet number)
9418 {"",
9419 {0x43}},
9420 // Test runs in client mode, no connection id
9421 // packet number
9422 {"",
9423 {0x12, 0x34, 0x9A, 0xBC}},
9424 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9425 {"",
9426 {0x13}},
9427 // max. streams
9428 {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
9429 {kVarInt62OneByte + 0x03}},
9430 };
9431 // clang-format on
9432
9433 std::unique_ptr<QuicEncryptedPacket> encrypted(
9434 AssemblePacketFromFragments(packet_ietf));
9435 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9436 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9437
9438 EXPECT_THAT(framer_.error(), IsQuicNoError());
9439 ASSERT_TRUE(visitor_.header_.get());
9440 EXPECT_TRUE(CheckDecryption(
9441 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9442 kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9443
9444 EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
9445 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9446 CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9447 }
9448
9449 // The following four tests ensure that the framer can deserialize a stream
9450 // count that is large enough to cause the resulting stream ID to exceed the
9451 // current implementation limit(32 bits). The intent is that when this happens,
9452 // the stream limit is pegged to the maximum supported value. There are four
9453 // tests, for the four combinations of uni- and bi-directional, server- and
9454 // client- initiated.
TEST_P(QuicFramerTest,BiDiMaxStreamsFrameTooBig)9455 TEST_P(QuicFramerTest, BiDiMaxStreamsFrameTooBig) {
9456 // This frame is only for IETF QUIC.
9457 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9458 return;
9459 }
9460 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9461
9462 // clang-format off
9463 unsigned char packet_ietf[] = {
9464 // type (short header, 4 byte packet number)
9465 0x43,
9466 // connection_id
9467 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9468 // packet number
9469 0x12, 0x34, 0x9A, 0xBC,
9470 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9471 0x12,
9472
9473 // max. streams. Max stream ID allowed is 0xffffffff
9474 // This encodes a count of 0x40000000, leading to stream
9475 // IDs in the range 0x1 00000000 to 0x1 00000003.
9476 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9477 };
9478 // clang-format on
9479
9480 QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9481 ABSL_ARRAYSIZE(packet_ietf), false);
9482 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9483 EXPECT_THAT(framer_.error(), IsQuicNoError());
9484 ASSERT_TRUE(visitor_.header_.get());
9485 EXPECT_TRUE(CheckDecryption(
9486 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9487 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9488
9489 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
9490 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
9491 }
9492
TEST_P(QuicFramerTest,ClientBiDiMaxStreamsFrameTooBig)9493 TEST_P(QuicFramerTest, ClientBiDiMaxStreamsFrameTooBig) {
9494 // This frame is only for IETF QUIC.
9495 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9496 return;
9497 }
9498 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9499
9500 // clang-format off
9501 unsigned char packet_ietf[] = {
9502 // type (short header, 4 byte packet number)
9503 0x43,
9504 // Test runs in client mode, no connection id
9505 // packet number
9506 0x12, 0x34, 0x9A, 0xBC,
9507 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9508 0x12,
9509
9510 // max. streams. Max stream ID allowed is 0xffffffff
9511 // This encodes a count of 0x40000000, leading to stream
9512 // IDs in the range 0x1 00000000 to 0x1 00000003.
9513 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9514 };
9515 // clang-format on
9516
9517 QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9518 ABSL_ARRAYSIZE(packet_ietf), false);
9519 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9520 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9521
9522 EXPECT_THAT(framer_.error(), IsQuicNoError());
9523 ASSERT_TRUE(visitor_.header_.get());
9524 EXPECT_TRUE(CheckDecryption(
9525 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9526 kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9527
9528 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
9529 EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
9530 }
9531
TEST_P(QuicFramerTest,ServerUniDiMaxStreamsFrameTooBig)9532 TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrameTooBig) {
9533 // This frame is only for IETF QUIC.
9534 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9535 return;
9536 }
9537 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9538
9539 // clang-format off
9540 unsigned char packet_ietf[] = {
9541 // type (short header, 4 byte packet number)
9542 0x43,
9543 // connection_id
9544 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9545 // packet number
9546 0x12, 0x34, 0x9A, 0xBC,
9547 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL)
9548 0x13,
9549
9550 // max. streams. Max stream ID allowed is 0xffffffff
9551 // This encodes a count of 0x40000000, leading to stream
9552 // IDs in the range 0x1 00000000 to 0x1 00000003.
9553 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9554 };
9555 // clang-format on
9556
9557 QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9558 ABSL_ARRAYSIZE(packet_ietf), false);
9559 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9560
9561 EXPECT_THAT(framer_.error(), IsQuicNoError());
9562 ASSERT_TRUE(visitor_.header_.get());
9563 EXPECT_TRUE(CheckDecryption(
9564 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9565 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9566
9567 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
9568 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9569 }
9570
TEST_P(QuicFramerTest,ClientUniDiMaxStreamsFrameTooBig)9571 TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrameTooBig) {
9572 // This frame is only for IETF QUIC.
9573 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9574 return;
9575 }
9576 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9577
9578 // clang-format off
9579 unsigned char packet_ietf[] = {
9580 // type (short header, 4 byte packet number)
9581 0x43,
9582 // Test runs in client mode, no connection id
9583 // packet number
9584 0x12, 0x34, 0x9A, 0xBC,
9585 // frame type (IETF_MAX_STREAMS_UNDIRECTIONAL)
9586 0x13,
9587
9588 // max. streams. Max stream ID allowed is 0xffffffff
9589 // This encodes a count of 0x40000000, leading to stream
9590 // IDs in the range 0x1 00000000 to 0x1 00000003.
9591 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00
9592 };
9593 // clang-format on
9594
9595 QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9596 ABSL_ARRAYSIZE(packet_ietf), false);
9597 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9598 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9599
9600 EXPECT_THAT(framer_.error(), IsQuicNoError());
9601 ASSERT_TRUE(visitor_.header_.get());
9602 EXPECT_TRUE(CheckDecryption(
9603 encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9604 kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9605
9606 EXPECT_EQ(0x40000000u, visitor_.max_streams_frame_.stream_count);
9607 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9608 }
9609
9610 // Specifically test that count==0 is accepted.
TEST_P(QuicFramerTest,MaxStreamsFrameZeroCount)9611 TEST_P(QuicFramerTest, MaxStreamsFrameZeroCount) {
9612 // This frame is only for IETF QUIC.
9613 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9614 return;
9615 }
9616 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9617
9618 // clang-format off
9619 unsigned char packet_ietf[] = {
9620 // type (short header, 4 byte packet number)
9621 0x43,
9622 // connection_id
9623 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9624 // packet number
9625 0x12, 0x34, 0x9A, 0xBC,
9626 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL)
9627 0x12,
9628 // max. streams == 0.
9629 kVarInt62OneByte + 0x00
9630 };
9631 // clang-format on
9632
9633 QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9634 ABSL_ARRAYSIZE(packet_ietf), false);
9635 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
9636 }
9637
TEST_P(QuicFramerTest,ServerBiDiStreamsBlockedFrame)9638 TEST_P(QuicFramerTest, ServerBiDiStreamsBlockedFrame) {
9639 // This frame is only for IETF QUIC.
9640 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9641 return;
9642 }
9643 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9644
9645 // clang-format off
9646 PacketFragments packet_ietf = {
9647 // type (short header, 4 byte packet number)
9648 {"",
9649 {0x43}},
9650 // connection_id
9651 {"",
9652 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9653 // packet number
9654 {"",
9655 {0x12, 0x34, 0x9A, 0xBC}},
9656 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
9657 {"",
9658 {0x13}},
9659 // stream count
9660 {"Unable to read IETF_MAX_STREAMS_UNIDIRECTIONAL frame stream id/count.",
9661 {kVarInt62OneByte + 0x00}},
9662 };
9663 // clang-format on
9664
9665 std::unique_ptr<QuicEncryptedPacket> encrypted(
9666 AssemblePacketFromFragments(packet_ietf));
9667 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9668
9669 EXPECT_THAT(framer_.error(), IsQuicNoError());
9670 ASSERT_TRUE(visitor_.header_.get());
9671 EXPECT_TRUE(CheckDecryption(
9672 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9673 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9674
9675 EXPECT_EQ(0u, visitor_.max_streams_frame_.stream_count);
9676 EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
9677
9678 CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
9679 }
9680
TEST_P(QuicFramerTest,BiDiStreamsBlockedFrame)9681 TEST_P(QuicFramerTest, BiDiStreamsBlockedFrame) {
9682 // This frame is only for IETF QUIC.
9683 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9684 return;
9685 }
9686 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9687
9688 // clang-format off
9689 PacketFragments packet_ietf = {
9690 // type (short header, 4 byte packet number)
9691 {"",
9692 {0x43}},
9693 // connection_id
9694 {"",
9695 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9696 // packet number
9697 {"",
9698 {0x12, 0x34, 0x9A, 0xBC}},
9699 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
9700 {"",
9701 {0x16}},
9702 // stream id
9703 {"Unable to read IETF_STREAMS_BLOCKED_BIDIRECTIONAL "
9704 "frame stream id/count.",
9705 {kVarInt62OneByte + 0x03}},
9706 };
9707 // clang-format on
9708
9709 std::unique_ptr<QuicEncryptedPacket> encrypted(
9710 AssemblePacketFromFragments(packet_ietf));
9711 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9712
9713 EXPECT_THAT(framer_.error(), IsQuicNoError());
9714 ASSERT_TRUE(visitor_.header_.get());
9715 EXPECT_TRUE(CheckDecryption(
9716 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9717 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9718
9719 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
9720 EXPECT_FALSE(visitor_.streams_blocked_frame_.unidirectional);
9721
9722 CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
9723 }
9724
TEST_P(QuicFramerTest,UniDiStreamsBlockedFrame)9725 TEST_P(QuicFramerTest, UniDiStreamsBlockedFrame) {
9726 // This frame is only for IETF QUIC.
9727 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9728 return;
9729 }
9730 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9731
9732 // clang-format off
9733 PacketFragments packet_ietf = {
9734 // type (short header, 4 byte packet number)
9735 {"",
9736 {0x43}},
9737 // connection_id
9738 {"",
9739 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9740 // packet number
9741 {"",
9742 {0x12, 0x34, 0x9A, 0xBC}},
9743 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
9744 {"",
9745 {0x17}},
9746 // stream id
9747 {"Unable to read IETF_STREAMS_BLOCKED_UNIDIRECTIONAL "
9748 "frame stream id/count.",
9749 {kVarInt62OneByte + 0x03}},
9750 };
9751 // clang-format on
9752
9753 std::unique_ptr<QuicEncryptedPacket> encrypted(
9754 AssemblePacketFromFragments(packet_ietf));
9755 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9756
9757 EXPECT_THAT(framer_.error(), IsQuicNoError());
9758 ASSERT_TRUE(visitor_.header_.get());
9759 EXPECT_TRUE(CheckDecryption(
9760 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9761 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9762
9763 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
9764 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
9765 CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
9766 }
9767
TEST_P(QuicFramerTest,ClientUniDiStreamsBlockedFrame)9768 TEST_P(QuicFramerTest, ClientUniDiStreamsBlockedFrame) {
9769 // This frame is only for IETF QUIC.
9770 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9771 return;
9772 }
9773 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9774
9775 // clang-format off
9776 PacketFragments packet_ietf = {
9777 // type (short header, 4 byte packet number)
9778 {"",
9779 {0x43}},
9780 // Test runs in client mode, no connection id
9781 // packet number
9782 {"",
9783 {0x12, 0x34, 0x9A, 0xBC}},
9784 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
9785 {"",
9786 {0x17}},
9787 // stream id
9788 {"Unable to read IETF_STREAMS_BLOCKED_UNIDIRECTIONAL "
9789 "frame stream id/count.",
9790 {kVarInt62OneByte + 0x03}},
9791 };
9792 // clang-format on
9793
9794 std::unique_ptr<QuicEncryptedPacket> encrypted(
9795 AssemblePacketFromFragments(packet_ietf));
9796 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9797 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9798
9799 EXPECT_THAT(framer_.error(), IsQuicNoError());
9800 ASSERT_TRUE(visitor_.header_.get());
9801 EXPECT_TRUE(CheckDecryption(
9802 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9803 kPacket0ByteConnectionId, kPacket0ByteConnectionId));
9804
9805 EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
9806 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
9807 CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
9808 }
9809
9810 // Check that when we get a STREAMS_BLOCKED frame that specifies too large
9811 // a stream count, we reject with an appropriate error. There is no need to
9812 // check for different combinations of Uni/Bi directional and client/server
9813 // initiated; the logic does not take these into account.
TEST_P(QuicFramerTest,StreamsBlockedFrameTooBig)9814 TEST_P(QuicFramerTest, StreamsBlockedFrameTooBig) {
9815 // This frame is only for IETF QUIC.
9816 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9817 return;
9818 }
9819 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9820
9821 // clang-format off
9822 unsigned char packet_ietf[] = {
9823 // type (short header, 4 byte packet number)
9824 0x43,
9825 // Test runs in client mode, no connection id
9826 // packet number
9827 0x12, 0x34, 0x9A, 0xBC,
9828 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL)
9829 0x16,
9830
9831 // max. streams. Max stream ID allowed is 0xffffffff
9832 // This encodes a count of 0x40000000, leading to stream
9833 // IDs in the range 0x1 00000000 to 0x1 00000003.
9834 kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01
9835 };
9836 // clang-format on
9837
9838 QuicEncryptedPacket encrypted(AsChars(packet_ietf),
9839 ABSL_ARRAYSIZE(packet_ietf), false);
9840 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
9841 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
9842
9843 EXPECT_THAT(framer_.error(), IsError(QUIC_STREAMS_BLOCKED_DATA));
9844 EXPECT_EQ(framer_.detailed_error(),
9845 "STREAMS_BLOCKED stream count exceeds implementation limit.");
9846 }
9847
9848 // Specifically test that count==0 is accepted.
TEST_P(QuicFramerTest,StreamsBlockedFrameZeroCount)9849 TEST_P(QuicFramerTest, StreamsBlockedFrameZeroCount) {
9850 // This frame is only for IETF QUIC.
9851 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9852 return;
9853 }
9854
9855 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
9856
9857 // clang-format off
9858 PacketFragments packet_ietf = {
9859 // type (short header, 4 byte packet number)
9860 {"",
9861 {0x43}},
9862 // connection_id
9863 {"",
9864 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
9865 // packet number
9866 {"",
9867 {0x12, 0x34, 0x9A, 0xBC}},
9868 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
9869 {"",
9870 {0x17}},
9871 // stream id
9872 {"Unable to read IETF_STREAMS_BLOCKED_UNIDIRECTIONAL "
9873 "frame stream id/count.",
9874 {kVarInt62OneByte + 0x00}},
9875 };
9876 // clang-format on
9877
9878 std::unique_ptr<QuicEncryptedPacket> encrypted(
9879 AssemblePacketFromFragments(packet_ietf));
9880 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
9881
9882 EXPECT_THAT(framer_.error(), IsQuicNoError());
9883 ASSERT_TRUE(visitor_.header_.get());
9884 EXPECT_TRUE(CheckDecryption(
9885 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
9886 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
9887
9888 EXPECT_EQ(0u, visitor_.streams_blocked_frame_.stream_count);
9889 EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
9890
9891 CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
9892 }
9893
TEST_P(QuicFramerTest,BuildBiDiStreamsBlockedPacket)9894 TEST_P(QuicFramerTest, BuildBiDiStreamsBlockedPacket) {
9895 // This frame is only for IETF QUIC.
9896 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9897 return;
9898 }
9899
9900 QuicPacketHeader header;
9901 header.destination_connection_id = FramerTestConnectionId();
9902 header.reset_flag = false;
9903 header.version_flag = false;
9904 header.packet_number = kPacketNumber;
9905
9906 QuicStreamsBlockedFrame frame;
9907 frame.stream_count = 3;
9908 frame.unidirectional = false;
9909
9910 QuicFrames frames = {QuicFrame(frame)};
9911
9912 // clang-format off
9913 unsigned char packet_ietf[] = {
9914 // type (short header, 4 byte packet number)
9915 0x43,
9916 // connection_id
9917 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9918 // packet number
9919 0x12, 0x34, 0x56, 0x78,
9920
9921 // frame type (IETF_STREAMS_BLOCKED_BIDIRECTIONAL frame)
9922 0x16,
9923 // Stream count
9924 kVarInt62OneByte + 0x03
9925 };
9926 // clang-format on
9927
9928 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9929 ASSERT_TRUE(data != nullptr);
9930
9931 quiche::test::CompareCharArraysWithHexError(
9932 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9933 ABSL_ARRAYSIZE(packet_ietf));
9934 }
9935
TEST_P(QuicFramerTest,BuildUniStreamsBlockedPacket)9936 TEST_P(QuicFramerTest, BuildUniStreamsBlockedPacket) {
9937 // This frame is only for IETF QUIC.
9938 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9939 return;
9940 }
9941
9942 QuicPacketHeader header;
9943 header.destination_connection_id = FramerTestConnectionId();
9944 header.reset_flag = false;
9945 header.version_flag = false;
9946 header.packet_number = kPacketNumber;
9947
9948 QuicStreamsBlockedFrame frame;
9949 frame.stream_count = 3;
9950 frame.unidirectional = true;
9951
9952 QuicFrames frames = {QuicFrame(frame)};
9953
9954 // clang-format off
9955 unsigned char packet_ietf[] = {
9956 // type (short header, 4 byte packet number)
9957 0x43,
9958 // connection_id
9959 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
9960 // packet number
9961 0x12, 0x34, 0x56, 0x78,
9962
9963 // frame type (IETF_STREAMS_BLOCKED_UNIDIRECTIONAL frame)
9964 0x17,
9965 // Stream count
9966 kVarInt62OneByte + 0x03
9967 };
9968 // clang-format on
9969
9970 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
9971 ASSERT_TRUE(data != nullptr);
9972
9973 quiche::test::CompareCharArraysWithHexError(
9974 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
9975 ABSL_ARRAYSIZE(packet_ietf));
9976 }
9977
TEST_P(QuicFramerTest,BuildBiDiMaxStreamsPacket)9978 TEST_P(QuicFramerTest, BuildBiDiMaxStreamsPacket) {
9979 // This frame is only for IETF QUIC.
9980 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
9981 return;
9982 }
9983
9984 QuicPacketHeader header;
9985 header.destination_connection_id = FramerTestConnectionId();
9986 header.reset_flag = false;
9987 header.version_flag = false;
9988 header.packet_number = kPacketNumber;
9989
9990 QuicMaxStreamsFrame frame;
9991 frame.stream_count = 3;
9992 frame.unidirectional = false;
9993
9994 QuicFrames frames = {QuicFrame(frame)};
9995
9996 // clang-format off
9997 unsigned char packet_ietf[] = {
9998 // type (short header, 4 byte packet number)
9999 0x43,
10000 // connection_id
10001 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10002 // packet number
10003 0x12, 0x34, 0x56, 0x78,
10004
10005 // frame type (IETF_MAX_STREAMS_BIDIRECTIONAL frame)
10006 0x12,
10007 // Stream count
10008 kVarInt62OneByte + 0x03
10009 };
10010 // clang-format on
10011
10012 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10013 ASSERT_TRUE(data != nullptr);
10014
10015 quiche::test::CompareCharArraysWithHexError(
10016 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10017 ABSL_ARRAYSIZE(packet_ietf));
10018 }
10019
TEST_P(QuicFramerTest,BuildUniDiMaxStreamsPacket)10020 TEST_P(QuicFramerTest, BuildUniDiMaxStreamsPacket) {
10021 // This frame is only for IETF QUIC.
10022 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10023 return;
10024 }
10025
10026 // This test runs in client mode.
10027 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10028
10029 QuicPacketHeader header;
10030 header.destination_connection_id = FramerTestConnectionId();
10031 header.reset_flag = false;
10032 header.version_flag = false;
10033 header.packet_number = kPacketNumber;
10034
10035 QuicMaxStreamsFrame frame;
10036 frame.stream_count = 3;
10037 frame.unidirectional = true;
10038
10039 QuicFrames frames = {QuicFrame(frame)};
10040
10041 // clang-format off
10042 unsigned char packet_ietf[] = {
10043 // type (short header, 4 byte packet number)
10044 0x43,
10045 // connection_id
10046 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10047 // packet number
10048 0x12, 0x34, 0x56, 0x78,
10049
10050 // frame type (IETF_MAX_STREAMS_UNIDIRECTIONAL frame)
10051 0x13,
10052 // Stream count
10053 kVarInt62OneByte + 0x03
10054 };
10055 // clang-format on
10056
10057 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10058 ASSERT_TRUE(data != nullptr);
10059
10060 quiche::test::CompareCharArraysWithHexError(
10061 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10062 ABSL_ARRAYSIZE(packet_ietf));
10063 }
10064
TEST_P(QuicFramerTest,NewConnectionIdFrame)10065 TEST_P(QuicFramerTest, NewConnectionIdFrame) {
10066 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10067 // This frame is only for IETF QUIC.
10068 return;
10069 }
10070 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10071 // clang-format off
10072 PacketFragments packet_ietf = {
10073 // type (short header, 4 byte packet number)
10074 {"",
10075 {0x43}},
10076 // connection_id
10077 {"",
10078 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10079 // packet number
10080 {"",
10081 {0x12, 0x34, 0x56, 0x78}},
10082 // frame type (IETF_NEW_CONNECTION_ID frame)
10083 {"",
10084 {0x18}},
10085 // error code
10086 {"Unable to read new connection ID frame sequence number.",
10087 {kVarInt62OneByte + 0x11}},
10088 {"Unable to read new connection ID frame retire_prior_to.",
10089 {kVarInt62OneByte + 0x09}},
10090 {"Unable to read new connection ID frame connection id.",
10091 {0x08}}, // connection ID length
10092 {"Unable to read new connection ID frame connection id.",
10093 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11}},
10094 {"Can not read new connection ID frame reset token.",
10095 {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
10096 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}}
10097 };
10098 // clang-format on
10099
10100 std::unique_ptr<QuicEncryptedPacket> encrypted(
10101 AssemblePacketFromFragments(packet_ietf));
10102 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10103
10104 EXPECT_THAT(framer_.error(), IsQuicNoError());
10105 ASSERT_TRUE(visitor_.header_.get());
10106 EXPECT_TRUE(CheckDecryption(
10107 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10108 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10109
10110 EXPECT_EQ(0u, visitor_.stream_frames_.size());
10111
10112 EXPECT_EQ(FramerTestConnectionIdPlusOne(),
10113 visitor_.new_connection_id_.connection_id);
10114 EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
10115 EXPECT_EQ(0x09u, visitor_.new_connection_id_.retire_prior_to);
10116 EXPECT_EQ(kTestStatelessResetToken,
10117 visitor_.new_connection_id_.stateless_reset_token);
10118
10119 ASSERT_EQ(0u, visitor_.ack_frames_.size());
10120
10121 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
10122 }
10123
TEST_P(QuicFramerTest,NewConnectionIdFrameVariableLength)10124 TEST_P(QuicFramerTest, NewConnectionIdFrameVariableLength) {
10125 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10126 // This frame is only for IETF QUIC.
10127 return;
10128 }
10129 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10130 // clang-format off
10131 PacketFragments packet_ietf = {
10132 // type (short header, 4 byte packet number)
10133 {"",
10134 {0x43}},
10135 // connection_id
10136 {"",
10137 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10138 // packet number
10139 {"",
10140 {0x12, 0x34, 0x56, 0x78}},
10141 // frame type (IETF_NEW_CONNECTION_ID frame)
10142 {"",
10143 {0x18}},
10144 // error code
10145 {"Unable to read new connection ID frame sequence number.",
10146 {kVarInt62OneByte + 0x11}},
10147 {"Unable to read new connection ID frame retire_prior_to.",
10148 {kVarInt62OneByte + 0x0a}},
10149 {"Unable to read new connection ID frame connection id.",
10150 {0x09}}, // connection ID length
10151 {"Unable to read new connection ID frame connection id.",
10152 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
10153 {"Can not read new connection ID frame reset token.",
10154 {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
10155 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}}
10156 };
10157 // clang-format on
10158
10159 std::unique_ptr<QuicEncryptedPacket> encrypted(
10160 AssemblePacketFromFragments(packet_ietf));
10161 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10162
10163 EXPECT_THAT(framer_.error(), IsQuicNoError());
10164 ASSERT_TRUE(visitor_.header_.get());
10165 EXPECT_TRUE(CheckDecryption(
10166 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10167 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10168
10169 EXPECT_EQ(0u, visitor_.stream_frames_.size());
10170
10171 EXPECT_EQ(FramerTestConnectionIdNineBytes(),
10172 visitor_.new_connection_id_.connection_id);
10173 EXPECT_EQ(0x11u, visitor_.new_connection_id_.sequence_number);
10174 EXPECT_EQ(0x0au, visitor_.new_connection_id_.retire_prior_to);
10175 EXPECT_EQ(kTestStatelessResetToken,
10176 visitor_.new_connection_id_.stateless_reset_token);
10177
10178 ASSERT_EQ(0u, visitor_.ack_frames_.size());
10179
10180 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
10181 }
10182
10183 // Verifies that parsing a NEW_CONNECTION_ID frame with a length above the
10184 // specified maximum fails.
TEST_P(QuicFramerTest,InvalidLongNewConnectionIdFrame)10185 TEST_P(QuicFramerTest, InvalidLongNewConnectionIdFrame) {
10186 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10187 // The NEW_CONNECTION_ID frame is only for IETF QUIC.
10188 return;
10189 }
10190 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10191 // clang-format off
10192 PacketFragments packet_ietf = {
10193 // type (short header, 4 byte packet number)
10194 {"",
10195 {0x43}},
10196 // connection_id
10197 {"",
10198 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10199 // packet number
10200 {"",
10201 {0x12, 0x34, 0x56, 0x78}},
10202 // frame type (IETF_NEW_CONNECTION_ID frame)
10203 {"",
10204 {0x18}},
10205 // error code
10206 {"Unable to read new connection ID frame sequence number.",
10207 {kVarInt62OneByte + 0x11}},
10208 {"Unable to read new connection ID frame retire_prior_to.",
10209 {kVarInt62OneByte + 0x0b}},
10210 {"Unable to read new connection ID frame connection id.",
10211 {0x40}}, // connection ID length
10212 {"Unable to read new connection ID frame connection id.",
10213 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10214 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10215 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10216 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10217 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10218 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E,
10219 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10220 0xF0, 0xD2, 0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E}},
10221 {"Can not read new connection ID frame reset token.",
10222 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10223 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10224 };
10225 // clang-format on
10226
10227 std::unique_ptr<QuicEncryptedPacket> encrypted(
10228 AssemblePacketFromFragments(packet_ietf));
10229 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10230 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_NEW_CONNECTION_ID_DATA));
10231 EXPECT_EQ("Invalid new connection ID length for version.",
10232 framer_.detailed_error());
10233 }
10234
10235 // Verifies that parsing a NEW_CONNECTION_ID frame with an invalid
10236 // retire-prior-to fails.
TEST_P(QuicFramerTest,InvalidRetirePriorToNewConnectionIdFrame)10237 TEST_P(QuicFramerTest, InvalidRetirePriorToNewConnectionIdFrame) {
10238 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10239 // This frame is only for IETF QUIC only.
10240 return;
10241 }
10242 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10243 // clang-format off
10244 PacketFragments packet_ietf = {
10245 // type (short header, 4 byte packet number)
10246 {"",
10247 {0x43}},
10248 // connection_id
10249 {"",
10250 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10251 // packet number
10252 {"",
10253 {0x12, 0x34, 0x56, 0x78}},
10254 // frame type (IETF_NEW_CONNECTION_ID frame)
10255 {"",
10256 {0x18}},
10257 // sequence number
10258 {"Unable to read new connection ID frame sequence number.",
10259 {kVarInt62OneByte + 0x11}},
10260 {"Unable to read new connection ID frame retire_prior_to.",
10261 {kVarInt62OneByte + 0x1b}},
10262 {"Unable to read new connection ID frame connection id length.",
10263 {0x08}}, // connection ID length
10264 {"Unable to read new connection ID frame connection id.",
10265 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11}},
10266 {"Can not read new connection ID frame reset token.",
10267 {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
10268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
10269 };
10270 // clang-format on
10271
10272 std::unique_ptr<QuicEncryptedPacket> encrypted(
10273 AssemblePacketFromFragments(packet_ietf));
10274 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10275 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_NEW_CONNECTION_ID_DATA));
10276 EXPECT_EQ("Retire_prior_to > sequence_number.", framer_.detailed_error());
10277 }
10278
TEST_P(QuicFramerTest,BuildNewConnectionIdFramePacket)10279 TEST_P(QuicFramerTest, BuildNewConnectionIdFramePacket) {
10280 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10281 // This frame is only for IETF QUIC only.
10282 return;
10283 }
10284 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10285 QuicPacketHeader header;
10286 header.destination_connection_id = FramerTestConnectionId();
10287 header.reset_flag = false;
10288 header.version_flag = false;
10289 header.packet_number = kPacketNumber;
10290
10291 QuicNewConnectionIdFrame frame;
10292 frame.sequence_number = 0x11;
10293 frame.retire_prior_to = 0x0c;
10294 // Use this value to force a 4-byte encoded variable length connection ID
10295 // in the frame.
10296 frame.connection_id = FramerTestConnectionIdPlusOne();
10297 frame.stateless_reset_token = kTestStatelessResetToken;
10298
10299 QuicFrames frames = {QuicFrame(&frame)};
10300
10301 // clang-format off
10302 unsigned char packet_ietf[] = {
10303 // type (short header, 4 byte packet number)
10304 0x43,
10305 // connection_id
10306 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10307 // packet number
10308 0x12, 0x34, 0x56, 0x78,
10309
10310 // frame type (IETF_NEW_CONNECTION_ID frame)
10311 0x18,
10312 // sequence number
10313 kVarInt62OneByte + 0x11,
10314 // retire_prior_to
10315 kVarInt62OneByte + 0x0c,
10316 // new connection id length
10317 0x08,
10318 // new connection id
10319 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
10320 // stateless reset token
10321 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
10322 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
10323 };
10324 // clang-format on
10325
10326 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10327 ASSERT_TRUE(data != nullptr);
10328
10329 quiche::test::CompareCharArraysWithHexError(
10330 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10331 ABSL_ARRAYSIZE(packet_ietf));
10332 }
10333
TEST_P(QuicFramerTest,NewTokenFrame)10334 TEST_P(QuicFramerTest, NewTokenFrame) {
10335 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10336 // This frame is only for IETF QUIC only.
10337 return;
10338 }
10339 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10340 // clang-format off
10341 PacketFragments packet = {
10342 // type (short header, 4 byte packet number)
10343 {"",
10344 {0x43}},
10345 // connection_id
10346 {"",
10347 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10348 // packet number
10349 {"",
10350 {0x12, 0x34, 0x56, 0x78}},
10351 // frame type (IETF_NEW_TOKEN frame)
10352 {"",
10353 {0x07}},
10354 // Length
10355 {"Unable to read new token length.",
10356 {kVarInt62OneByte + 0x08}},
10357 {"Unable to read new token data.",
10358 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}}
10359 };
10360 // clang-format on
10361 uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
10362 0x04, 0x05, 0x06, 0x07};
10363
10364 std::unique_ptr<QuicEncryptedPacket> encrypted(
10365 AssemblePacketFromFragments(packet));
10366 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10367
10368 EXPECT_THAT(framer_.error(), IsQuicNoError());
10369 ASSERT_TRUE(visitor_.header_.get());
10370 EXPECT_TRUE(CheckDecryption(
10371 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10372 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10373
10374 EXPECT_EQ(0u, visitor_.stream_frames_.size());
10375
10376 EXPECT_EQ(sizeof(expected_token_value), visitor_.new_token_.token.length());
10377 EXPECT_EQ(0, memcmp(expected_token_value, visitor_.new_token_.token.data(),
10378 sizeof(expected_token_value)));
10379
10380 CheckFramingBoundaries(packet, QUIC_INVALID_NEW_TOKEN);
10381 }
10382
TEST_P(QuicFramerTest,BuildNewTokenFramePacket)10383 TEST_P(QuicFramerTest, BuildNewTokenFramePacket) {
10384 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10385 // This frame is only for IETF QUIC only.
10386 return;
10387 }
10388 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
10389 QuicPacketHeader header;
10390 header.destination_connection_id = FramerTestConnectionId();
10391 header.reset_flag = false;
10392 header.version_flag = false;
10393 header.packet_number = kPacketNumber;
10394
10395 uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
10396 0x04, 0x05, 0x06, 0x07};
10397
10398 QuicNewTokenFrame frame(0,
10399 absl::string_view((const char*)(expected_token_value),
10400 sizeof(expected_token_value)));
10401
10402 QuicFrames frames = {QuicFrame(&frame)};
10403
10404 // clang-format off
10405 unsigned char packet[] = {
10406 // type (short header, 4 byte packet number)
10407 0x43,
10408 // connection_id
10409 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10410 // packet number
10411 0x12, 0x34, 0x56, 0x78,
10412
10413 // frame type (IETF_NEW_TOKEN frame)
10414 0x07,
10415 // Length and token
10416 kVarInt62OneByte + 0x08,
10417 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
10418 };
10419 // clang-format on
10420
10421 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10422 ASSERT_TRUE(data != nullptr);
10423
10424 quiche::test::CompareCharArraysWithHexError(
10425 "constructed packet", data->data(), data->length(), AsChars(packet),
10426 ABSL_ARRAYSIZE(packet));
10427 }
10428
TEST_P(QuicFramerTest,IetfStopSendingFrame)10429 TEST_P(QuicFramerTest, IetfStopSendingFrame) {
10430 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10431 // Stop sending frame is IETF QUIC only.
10432 return;
10433 }
10434 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10435
10436 // clang-format off
10437 PacketFragments packet_ietf = {
10438 // type (short header, 4 byte packet number)
10439 {"",
10440 {0x43}},
10441 // connection_id
10442 {"",
10443 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10444 // packet number
10445 {"",
10446 {0x12, 0x34, 0x9A, 0xBC}},
10447 // frame type (IETF_STOP_SENDING frame)
10448 {"",
10449 {0x05}},
10450 // stream id
10451 {"Unable to read IETF_STOP_SENDING frame stream id/count.",
10452 {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}},
10453 {"Unable to read stop sending application error code.",
10454 {kVarInt62FourBytes + 0x00, 0x00, 0x76, 0x54}},
10455 };
10456 // clang-format on
10457
10458 std::unique_ptr<QuicEncryptedPacket> encrypted(
10459 AssemblePacketFromFragments(packet_ietf));
10460 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10461
10462 EXPECT_THAT(framer_.error(), IsQuicNoError());
10463 ASSERT_TRUE(visitor_.header_.get());
10464 EXPECT_TRUE(CheckDecryption(
10465 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10466 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10467
10468 EXPECT_EQ(kStreamId, visitor_.stop_sending_frame_.stream_id);
10469 EXPECT_EQ(QUIC_STREAM_UNKNOWN_APPLICATION_ERROR_CODE,
10470 visitor_.stop_sending_frame_.error_code);
10471 EXPECT_EQ(static_cast<uint64_t>(0x7654),
10472 visitor_.stop_sending_frame_.ietf_error_code);
10473
10474 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_STOP_SENDING_FRAME_DATA);
10475 }
10476
TEST_P(QuicFramerTest,BuildIetfStopSendingPacket)10477 TEST_P(QuicFramerTest, BuildIetfStopSendingPacket) {
10478 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10479 // Stop sending frame is IETF QUIC only.
10480 return;
10481 }
10482
10483 QuicPacketHeader header;
10484 header.destination_connection_id = FramerTestConnectionId();
10485 header.reset_flag = false;
10486 header.version_flag = false;
10487 header.packet_number = kPacketNumber;
10488
10489 QuicStopSendingFrame frame;
10490 frame.stream_id = kStreamId;
10491 frame.error_code = QUIC_STREAM_ENCODER_STREAM_ERROR;
10492 frame.ietf_error_code =
10493 static_cast<uint64_t>(QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR);
10494 QuicFrames frames = {QuicFrame(frame)};
10495
10496 // clang-format off
10497 unsigned char packet_ietf[] = {
10498 // type (short header, 4 byte packet number)
10499 0x43,
10500 // connection_id
10501 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10502 // packet number
10503 0x12, 0x34, 0x56, 0x78,
10504
10505 // frame type (IETF_STOP_SENDING frame)
10506 0x05,
10507 // Stream ID
10508 kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04,
10509 // Application error code
10510 kVarInt62TwoBytes + 0x02, 0x01,
10511 };
10512 // clang-format on
10513
10514 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10515 ASSERT_TRUE(data != nullptr);
10516
10517 quiche::test::CompareCharArraysWithHexError(
10518 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10519 ABSL_ARRAYSIZE(packet_ietf));
10520 }
10521
TEST_P(QuicFramerTest,IetfPathChallengeFrame)10522 TEST_P(QuicFramerTest, IetfPathChallengeFrame) {
10523 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10524 // Path Challenge frame is IETF QUIC only.
10525 return;
10526 }
10527 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10528
10529 // clang-format off
10530 PacketFragments packet_ietf = {
10531 // type (short header, 4 byte packet number)
10532 {"",
10533 {0x43}},
10534 // connection_id
10535 {"",
10536 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10537 // packet number
10538 {"",
10539 {0x12, 0x34, 0x9A, 0xBC}},
10540 // frame type (IETF_PATH_CHALLENGE)
10541 {"",
10542 {0x1a}},
10543 // data
10544 {"Can not read path challenge data.",
10545 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
10546 };
10547 // clang-format on
10548
10549 std::unique_ptr<QuicEncryptedPacket> encrypted(
10550 AssemblePacketFromFragments(packet_ietf));
10551 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10552
10553 EXPECT_THAT(framer_.error(), IsQuicNoError());
10554 ASSERT_TRUE(visitor_.header_.get());
10555 EXPECT_TRUE(CheckDecryption(
10556 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10557 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10558
10559 EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
10560 visitor_.path_challenge_frame_.data_buffer);
10561
10562 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_PATH_CHALLENGE_DATA);
10563 }
10564
TEST_P(QuicFramerTest,BuildIetfPathChallengePacket)10565 TEST_P(QuicFramerTest, BuildIetfPathChallengePacket) {
10566 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10567 // Path Challenge frame is IETF QUIC only.
10568 return;
10569 }
10570
10571 QuicPacketHeader header;
10572 header.destination_connection_id = FramerTestConnectionId();
10573 header.reset_flag = false;
10574 header.version_flag = false;
10575 header.packet_number = kPacketNumber;
10576
10577 QuicPathChallengeFrame frame;
10578 frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
10579 QuicFrames frames = {QuicFrame(frame)};
10580
10581 // clang-format off
10582 unsigned char packet_ietf[] = {
10583 // type (short header, 4 byte packet number)
10584 0x43,
10585 // connection_id
10586 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10587 // packet number
10588 0x12, 0x34, 0x56, 0x78,
10589
10590 // frame type (IETF_PATH_CHALLENGE)
10591 0x1a,
10592 // Data
10593 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
10594 };
10595 // clang-format on
10596
10597 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10598 ASSERT_TRUE(data != nullptr);
10599
10600 quiche::test::CompareCharArraysWithHexError(
10601 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10602 ABSL_ARRAYSIZE(packet_ietf));
10603 }
10604
TEST_P(QuicFramerTest,IetfPathResponseFrame)10605 TEST_P(QuicFramerTest, IetfPathResponseFrame) {
10606 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10607 // Path response frame is IETF QUIC only.
10608 return;
10609 }
10610 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10611
10612 // clang-format off
10613 PacketFragments packet_ietf = {
10614 // type (short header, 4 byte packet number)
10615 {"",
10616 {0x43}},
10617 // connection_id
10618 {"",
10619 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10620 // packet number
10621 {"",
10622 {0x12, 0x34, 0x9A, 0xBC}},
10623 // frame type (IETF_PATH_RESPONSE)
10624 {"",
10625 {0x1b}},
10626 // data
10627 {"Can not read path response data.",
10628 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}},
10629 };
10630 // clang-format on
10631
10632 std::unique_ptr<QuicEncryptedPacket> encrypted(
10633 AssemblePacketFromFragments(packet_ietf));
10634 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
10635
10636 EXPECT_THAT(framer_.error(), IsQuicNoError());
10637 ASSERT_TRUE(visitor_.header_.get());
10638 EXPECT_TRUE(CheckDecryption(
10639 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
10640 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
10641
10642 EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
10643 visitor_.path_response_frame_.data_buffer);
10644
10645 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_PATH_RESPONSE_DATA);
10646 }
10647
TEST_P(QuicFramerTest,BuildIetfPathResponsePacket)10648 TEST_P(QuicFramerTest, BuildIetfPathResponsePacket) {
10649 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10650 // Path response frame is IETF QUIC only
10651 return;
10652 }
10653
10654 QuicPacketHeader header;
10655 header.destination_connection_id = FramerTestConnectionId();
10656 header.reset_flag = false;
10657 header.version_flag = false;
10658 header.packet_number = kPacketNumber;
10659
10660 QuicPathResponseFrame frame;
10661 frame.data_buffer = QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}});
10662 QuicFrames frames = {QuicFrame(frame)};
10663
10664 // clang-format off
10665 unsigned char packet_ietf[] = {
10666 // type (short header, 4 byte packet number)
10667 0x43,
10668 // connection_id
10669 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
10670 // packet number
10671 0x12, 0x34, 0x56, 0x78,
10672
10673 // frame type (IETF_PATH_RESPONSE)
10674 0x1b,
10675 // Data
10676 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
10677 };
10678 // clang-format on
10679
10680 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
10681 ASSERT_TRUE(data != nullptr);
10682
10683 quiche::test::CompareCharArraysWithHexError(
10684 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
10685 ABSL_ARRAYSIZE(packet_ietf));
10686 }
10687
TEST_P(QuicFramerTest,GetRetransmittableControlFrameSize)10688 TEST_P(QuicFramerTest, GetRetransmittableControlFrameSize) {
10689 QuicRstStreamFrame rst_stream(1, 3, QUIC_STREAM_CANCELLED, 1024);
10690 EXPECT_EQ(QuicFramer::GetRstStreamFrameSize(framer_.transport_version(),
10691 rst_stream),
10692 QuicFramer::GetRetransmittableControlFrameSize(
10693 framer_.transport_version(), QuicFrame(&rst_stream)));
10694
10695 std::string error_detail(2048, 'e');
10696 QuicConnectionCloseFrame connection_close(framer_.transport_version(),
10697 QUIC_NETWORK_IDLE_TIMEOUT,
10698 NO_IETF_QUIC_ERROR, error_detail,
10699 /*transport_close_frame_type=*/0);
10700
10701 EXPECT_EQ(QuicFramer::GetConnectionCloseFrameSize(framer_.transport_version(),
10702 connection_close),
10703 QuicFramer::GetRetransmittableControlFrameSize(
10704 framer_.transport_version(), QuicFrame(&connection_close)));
10705
10706 QuicGoAwayFrame goaway(2, QUIC_PEER_GOING_AWAY, 3, error_detail);
10707 EXPECT_EQ(QuicFramer::GetMinGoAwayFrameSize() + 256,
10708 QuicFramer::GetRetransmittableControlFrameSize(
10709 framer_.transport_version(), QuicFrame(&goaway)));
10710
10711 QuicWindowUpdateFrame window_update(3, 3, 1024);
10712 EXPECT_EQ(QuicFramer::GetWindowUpdateFrameSize(framer_.transport_version(),
10713 window_update),
10714 QuicFramer::GetRetransmittableControlFrameSize(
10715 framer_.transport_version(), QuicFrame(window_update)));
10716
10717 QuicBlockedFrame blocked(4, 3, 1024);
10718 EXPECT_EQ(
10719 QuicFramer::GetBlockedFrameSize(framer_.transport_version(), blocked),
10720 QuicFramer::GetRetransmittableControlFrameSize(
10721 framer_.transport_version(), QuicFrame(blocked)));
10722
10723 // Following frames are IETF QUIC frames only.
10724 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10725 return;
10726 }
10727
10728 QuicNewConnectionIdFrame new_connection_id(5, TestConnectionId(), 1,
10729 kTestStatelessResetToken, 1);
10730 EXPECT_EQ(QuicFramer::GetNewConnectionIdFrameSize(new_connection_id),
10731 QuicFramer::GetRetransmittableControlFrameSize(
10732 framer_.transport_version(), QuicFrame(&new_connection_id)));
10733
10734 QuicMaxStreamsFrame max_streams(6, 3, /*unidirectional=*/false);
10735 EXPECT_EQ(QuicFramer::GetMaxStreamsFrameSize(framer_.transport_version(),
10736 max_streams),
10737 QuicFramer::GetRetransmittableControlFrameSize(
10738 framer_.transport_version(), QuicFrame(max_streams)));
10739
10740 QuicStreamsBlockedFrame streams_blocked(7, 3, /*unidirectional=*/false);
10741 EXPECT_EQ(QuicFramer::GetStreamsBlockedFrameSize(framer_.transport_version(),
10742 streams_blocked),
10743 QuicFramer::GetRetransmittableControlFrameSize(
10744 framer_.transport_version(), QuicFrame(streams_blocked)));
10745
10746 QuicPathFrameBuffer buffer = {
10747 {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
10748 QuicPathResponseFrame path_response_frame(8, buffer);
10749 EXPECT_EQ(QuicFramer::GetPathResponseFrameSize(path_response_frame),
10750 QuicFramer::GetRetransmittableControlFrameSize(
10751 framer_.transport_version(), QuicFrame(path_response_frame)));
10752
10753 QuicPathChallengeFrame path_challenge_frame(9, buffer);
10754 EXPECT_EQ(QuicFramer::GetPathChallengeFrameSize(path_challenge_frame),
10755 QuicFramer::GetRetransmittableControlFrameSize(
10756 framer_.transport_version(), QuicFrame(path_challenge_frame)));
10757
10758 QuicStopSendingFrame stop_sending_frame(10, 3, QUIC_STREAM_CANCELLED);
10759 EXPECT_EQ(QuicFramer::GetStopSendingFrameSize(stop_sending_frame),
10760 QuicFramer::GetRetransmittableControlFrameSize(
10761 framer_.transport_version(), QuicFrame(stop_sending_frame)));
10762 }
10763
10764 // A set of tests to ensure that bad frame-type encodings
10765 // are properly detected and handled.
10766 // First, four tests to see that unknown frame types generate
10767 // a QUIC_INVALID_FRAME_DATA error with detailed information
10768 // "Illegal frame type." This regardless of the encoding of the type
10769 // (1/2/4/8 bytes).
10770 // This only for version 99.
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorUnknown1Byte)10771 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown1Byte) {
10772 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10773 // Only IETF QUIC encodes frame types such that this test is relevant.
10774 return;
10775 }
10776 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10777 // clang-format off
10778 PacketFragments packet = {
10779 // type (short header, 4 byte packet number)
10780 {"",
10781 {0x43}},
10782 // connection_id
10783 {"",
10784 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10785 // packet number
10786 {"",
10787 {0x12, 0x34, 0x9A, 0xBC}},
10788 // frame type (unknown value, single-byte encoding)
10789 {"",
10790 {0x38}}
10791 };
10792 // clang-format on
10793
10794 std::unique_ptr<QuicEncryptedPacket> encrypted(
10795 AssemblePacketFromFragments(packet));
10796
10797 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10798
10799 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
10800 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
10801 }
10802
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorUnknown2Bytes)10803 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown2Bytes) {
10804 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10805 // Only IETF QUIC encodes frame types such that this test is relevant.
10806 return;
10807 }
10808 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10809
10810 // clang-format off
10811 PacketFragments packet = {
10812 // type (short header, 4 byte packet number)
10813 {"",
10814 {0x43}},
10815 // connection_id
10816 {"",
10817 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10818 // packet number
10819 {"",
10820 {0x12, 0x34, 0x9A, 0xBC}},
10821 // frame type (unknown value, two-byte encoding)
10822 {"",
10823 {kVarInt62TwoBytes + 0x01, 0x38}}
10824 };
10825 // clang-format on
10826
10827 std::unique_ptr<QuicEncryptedPacket> encrypted(
10828 AssemblePacketFromFragments(packet));
10829
10830 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10831
10832 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
10833 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
10834 }
10835
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorUnknown4Bytes)10836 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown4Bytes) {
10837 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10838 // Only IETF QUIC encodes frame types such that this test is relevant.
10839 return;
10840 }
10841 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10842
10843 // clang-format off
10844 PacketFragments packet = {
10845 // type (short header, 4 byte packet number)
10846 {"",
10847 {0x43}},
10848 // connection_id
10849 {"",
10850 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10851 // packet number
10852 {"",
10853 {0x12, 0x34, 0x9A, 0xBC}},
10854 // frame type (unknown value, four-byte encoding)
10855 {"",
10856 {kVarInt62FourBytes + 0x01, 0x00, 0x00, 0x38}}
10857 };
10858 // clang-format on
10859
10860 std::unique_ptr<QuicEncryptedPacket> encrypted(
10861 AssemblePacketFromFragments(packet));
10862
10863 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10864
10865 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
10866 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
10867 }
10868
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorUnknown8Bytes)10869 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorUnknown8Bytes) {
10870 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10871 // Only IETF QUIC encodes frame types such that this test is relevant.
10872 return;
10873 }
10874 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10875 // clang-format off
10876 PacketFragments packet = {
10877 // type (short header, 4 byte packet number)
10878 {"",
10879 {0x43}},
10880 // connection_id
10881 {"",
10882 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10883 // packet number
10884 {"",
10885 {0x12, 0x34, 0x9A, 0xBC}},
10886 // frame type (unknown value, eight-byte encoding)
10887 {"",
10888 {kVarInt62EightBytes + 0x01, 0x00, 0x00, 0x01, 0x02, 0x34, 0x56, 0x38}}
10889 };
10890 // clang-format on
10891
10892 std::unique_ptr<QuicEncryptedPacket> encrypted(
10893 AssemblePacketFromFragments(packet));
10894
10895 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10896
10897 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_FRAME_DATA));
10898 EXPECT_EQ("Illegal frame type.", framer_.detailed_error());
10899 }
10900
10901 // Three tests to check that known frame types that are not minimally
10902 // encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
10903 // information "Frame type not minimally encoded."
10904 // Look at the frame-type encoded in 2, 4, and 8 bytes.
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorKnown2Bytes)10905 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2Bytes) {
10906 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10907 // Only IETF QUIC encodes frame types such that this test is relevant.
10908 return;
10909 }
10910 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10911
10912 // clang-format off
10913 PacketFragments packet = {
10914 // type (short header, 4 byte packet number)
10915 {"",
10916 {0x43}},
10917 // connection_id
10918 {"",
10919 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10920 // packet number
10921 {"",
10922 {0x12, 0x34, 0x9A, 0xBC}},
10923 // frame type (Blocked, two-byte encoding)
10924 {"",
10925 {kVarInt62TwoBytes + 0x00, 0x08}}
10926 };
10927 // clang-format on
10928
10929 std::unique_ptr<QuicEncryptedPacket> encrypted(
10930 AssemblePacketFromFragments(packet));
10931
10932 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10933
10934 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
10935 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
10936 }
10937
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorKnown4Bytes)10938 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown4Bytes) {
10939 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10940 // Only IETF QUIC encodes frame types such that this test is relevant.
10941 return;
10942 }
10943 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10944
10945 // clang-format off
10946 PacketFragments packet = {
10947 // type (short header, 4 byte packet number)
10948 {"",
10949 {0x43}},
10950 // connection_id
10951 {"",
10952 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10953 // packet number
10954 {"",
10955 {0x12, 0x34, 0x9A, 0xBC}},
10956 // frame type (Blocked, four-byte encoding)
10957 {"",
10958 {kVarInt62FourBytes + 0x00, 0x00, 0x00, 0x08}}
10959 };
10960 // clang-format on
10961
10962 std::unique_ptr<QuicEncryptedPacket> encrypted(
10963 AssemblePacketFromFragments(packet));
10964
10965 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10966
10967 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
10968 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
10969 }
10970
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorKnown8Bytes)10971 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown8Bytes) {
10972 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
10973 // Only IETF QUIC encodes frame types such that this test is relevant.
10974 return;
10975 }
10976 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
10977 // clang-format off
10978 PacketFragments packet = {
10979 // type (short header, 4 byte packet number)
10980 {"",
10981 {0x43}},
10982 // connection_id
10983 {"",
10984 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
10985 // packet number
10986 {"",
10987 {0x12, 0x34, 0x9A, 0xBC}},
10988 // frame type (Blocked, eight-byte encoding)
10989 {"",
10990 {kVarInt62EightBytes + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08}}
10991 };
10992 // clang-format on
10993
10994 std::unique_ptr<QuicEncryptedPacket> encrypted(
10995 AssemblePacketFromFragments(packet));
10996
10997 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
10998
10999 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
11000 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11001 }
11002
11003 // Tests to check that all known IETF frame types that are not minimally
11004 // encoded generate IETF_QUIC_PROTOCOL_VIOLATION errors with detailed
11005 // information "Frame type not minimally encoded."
11006 // Just look at 2-byte encoding.
TEST_P(QuicFramerTest,IetfFrameTypeEncodingErrorKnown2BytesAllTypes)11007 TEST_P(QuicFramerTest, IetfFrameTypeEncodingErrorKnown2BytesAllTypes) {
11008 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
11009 // Only IETF QUIC encodes frame types such that this test is relevant.
11010 return;
11011 }
11012 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11013
11014 // clang-format off
11015 PacketFragments packets[] = {
11016 {
11017 // type (short header, 4 byte packet number)
11018 {"",
11019 {0x43}},
11020 // connection_id
11021 {"",
11022 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11023 // packet number
11024 {"",
11025 {0x12, 0x34, 0x9A, 0xBC}},
11026 // frame type (two-byte encoding)
11027 {"",
11028 {kVarInt62TwoBytes + 0x00, 0x00}}
11029 },
11030 {
11031 // type (short header, 4 byte packet number)
11032 {"",
11033 {0x43}},
11034 // connection_id
11035 {"",
11036 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11037 // packet number
11038 {"",
11039 {0x12, 0x34, 0x9A, 0xBC}},
11040 // frame type (two-byte encoding)
11041 {"",
11042 {kVarInt62TwoBytes + 0x00, 0x01}}
11043 },
11044 {
11045 // type (short header, 4 byte packet number)
11046 {"",
11047 {0x43}},
11048 // connection_id
11049 {"",
11050 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11051 // packet number
11052 {"",
11053 {0x12, 0x34, 0x9A, 0xBC}},
11054 // frame type (two-byte encoding)
11055 {"",
11056 {kVarInt62TwoBytes + 0x00, 0x02}}
11057 },
11058 {
11059 // type (short header, 4 byte packet number)
11060 {"",
11061 {0x43}},
11062 // connection_id
11063 {"",
11064 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11065 // packet number
11066 {"",
11067 {0x12, 0x34, 0x9A, 0xBC}},
11068 // frame type (two-byte encoding)
11069 {"",
11070 {kVarInt62TwoBytes + 0x00, 0x03}}
11071 },
11072 {
11073 // type (short header, 4 byte packet number)
11074 {"",
11075 {0x43}},
11076 // connection_id
11077 {"",
11078 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11079 // packet number
11080 {"",
11081 {0x12, 0x34, 0x9A, 0xBC}},
11082 // frame type (two-byte encoding)
11083 {"",
11084 {kVarInt62TwoBytes + 0x00, 0x04}}
11085 },
11086 {
11087 // type (short header, 4 byte packet number)
11088 {"",
11089 {0x43}},
11090 // connection_id
11091 {"",
11092 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11093 // packet number
11094 {"",
11095 {0x12, 0x34, 0x9A, 0xBC}},
11096 // frame type (two-byte encoding)
11097 {"",
11098 {kVarInt62TwoBytes + 0x00, 0x05}}
11099 },
11100 {
11101 // type (short header, 4 byte packet number)
11102 {"",
11103 {0x43}},
11104 // connection_id
11105 {"",
11106 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11107 // packet number
11108 {"",
11109 {0x12, 0x34, 0x9A, 0xBC}},
11110 // frame type (two-byte encoding)
11111 {"",
11112 {kVarInt62TwoBytes + 0x00, 0x06}}
11113 },
11114 {
11115 // type (short header, 4 byte packet number)
11116 {"",
11117 {0x43}},
11118 // connection_id
11119 {"",
11120 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11121 // packet number
11122 {"",
11123 {0x12, 0x34, 0x9A, 0xBC}},
11124 // frame type (two-byte encoding)
11125 {"",
11126 {kVarInt62TwoBytes + 0x00, 0x07}}
11127 },
11128 {
11129 // type (short header, 4 byte packet number)
11130 {"",
11131 {0x43}},
11132 // connection_id
11133 {"",
11134 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11135 // packet number
11136 {"",
11137 {0x12, 0x34, 0x9A, 0xBC}},
11138 // frame type (two-byte encoding)
11139 {"",
11140 {kVarInt62TwoBytes + 0x00, 0x08}}
11141 },
11142 {
11143 // type (short header, 4 byte packet number)
11144 {"",
11145 {0x43}},
11146 // connection_id
11147 {"",
11148 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11149 // packet number
11150 {"",
11151 {0x12, 0x34, 0x9A, 0xBC}},
11152 // frame type (two-byte encoding)
11153 {"",
11154 {kVarInt62TwoBytes + 0x00, 0x09}}
11155 },
11156 {
11157 // type (short header, 4 byte packet number)
11158 {"",
11159 {0x43}},
11160 // connection_id
11161 {"",
11162 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11163 // packet number
11164 {"",
11165 {0x12, 0x34, 0x9A, 0xBC}},
11166 // frame type (two-byte encoding)
11167 {"",
11168 {kVarInt62TwoBytes + 0x00, 0x0a}}
11169 },
11170 {
11171 // type (short header, 4 byte packet number)
11172 {"",
11173 {0x43}},
11174 // connection_id
11175 {"",
11176 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11177 // packet number
11178 {"",
11179 {0x12, 0x34, 0x9A, 0xBC}},
11180 // frame type (two-byte encoding)
11181 {"",
11182 {kVarInt62TwoBytes + 0x00, 0x0b}}
11183 },
11184 {
11185 // type (short header, 4 byte packet number)
11186 {"",
11187 {0x43}},
11188 // connection_id
11189 {"",
11190 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11191 // packet number
11192 {"",
11193 {0x12, 0x34, 0x9A, 0xBC}},
11194 // frame type (two-byte encoding)
11195 {"",
11196 {kVarInt62TwoBytes + 0x00, 0x0c}}
11197 },
11198 {
11199 // type (short header, 4 byte packet number)
11200 {"",
11201 {0x43}},
11202 // connection_id
11203 {"",
11204 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11205 // packet number
11206 {"",
11207 {0x12, 0x34, 0x9A, 0xBC}},
11208 // frame type (two-byte encoding)
11209 {"",
11210 {kVarInt62TwoBytes + 0x00, 0x0d}}
11211 },
11212 {
11213 // type (short header, 4 byte packet number)
11214 {"",
11215 {0x43}},
11216 // connection_id
11217 {"",
11218 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11219 // packet number
11220 {"",
11221 {0x12, 0x34, 0x9A, 0xBC}},
11222 // frame type (two-byte encoding)
11223 {"",
11224 {kVarInt62TwoBytes + 0x00, 0x0e}}
11225 },
11226 {
11227 // type (short header, 4 byte packet number)
11228 {"",
11229 {0x43}},
11230 // connection_id
11231 {"",
11232 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11233 // packet number
11234 {"",
11235 {0x12, 0x34, 0x9A, 0xBC}},
11236 // frame type (two-byte encoding)
11237 {"",
11238 {kVarInt62TwoBytes + 0x00, 0x0f}}
11239 },
11240 {
11241 // type (short header, 4 byte packet number)
11242 {"",
11243 {0x43}},
11244 // connection_id
11245 {"",
11246 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11247 // packet number
11248 {"",
11249 {0x12, 0x34, 0x9A, 0xBC}},
11250 // frame type (two-byte encoding)
11251 {"",
11252 {kVarInt62TwoBytes + 0x00, 0x10}}
11253 },
11254 {
11255 // type (short header, 4 byte packet number)
11256 {"",
11257 {0x43}},
11258 // connection_id
11259 {"",
11260 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11261 // packet number
11262 {"",
11263 {0x12, 0x34, 0x9A, 0xBC}},
11264 // frame type (two-byte encoding)
11265 {"",
11266 {kVarInt62TwoBytes + 0x00, 0x11}}
11267 },
11268 {
11269 // type (short header, 4 byte packet number)
11270 {"",
11271 {0x43}},
11272 // connection_id
11273 {"",
11274 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11275 // packet number
11276 {"",
11277 {0x12, 0x34, 0x9A, 0xBC}},
11278 // frame type (two-byte encoding)
11279 {"",
11280 {kVarInt62TwoBytes + 0x00, 0x12}}
11281 },
11282 {
11283 // type (short header, 4 byte packet number)
11284 {"",
11285 {0x43}},
11286 // connection_id
11287 {"",
11288 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11289 // packet number
11290 {"",
11291 {0x12, 0x34, 0x9A, 0xBC}},
11292 // frame type (two-byte encoding)
11293 {"",
11294 {kVarInt62TwoBytes + 0x00, 0x13}}
11295 },
11296 {
11297 // type (short header, 4 byte packet number)
11298 {"",
11299 {0x43}},
11300 // connection_id
11301 {"",
11302 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11303 // packet number
11304 {"",
11305 {0x12, 0x34, 0x9A, 0xBC}},
11306 // frame type (two-byte encoding)
11307 {"",
11308 {kVarInt62TwoBytes + 0x00, 0x14}}
11309 },
11310 {
11311 // type (short header, 4 byte packet number)
11312 {"",
11313 {0x43}},
11314 // connection_id
11315 {"",
11316 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11317 // packet number
11318 {"",
11319 {0x12, 0x34, 0x9A, 0xBC}},
11320 // frame type (two-byte encoding)
11321 {"",
11322 {kVarInt62TwoBytes + 0x00, 0x15}}
11323 },
11324 {
11325 // type (short header, 4 byte packet number)
11326 {"",
11327 {0x43}},
11328 // connection_id
11329 {"",
11330 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11331 // packet number
11332 {"",
11333 {0x12, 0x34, 0x9A, 0xBC}},
11334 // frame type (two-byte encoding)
11335 {"",
11336 {kVarInt62TwoBytes + 0x00, 0x16}}
11337 },
11338 {
11339 // type (short header, 4 byte packet number)
11340 {"",
11341 {0x43}},
11342 // connection_id
11343 {"",
11344 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11345 // packet number
11346 {"",
11347 {0x12, 0x34, 0x9A, 0xBC}},
11348 // frame type (two-byte encoding)
11349 {"",
11350 {kVarInt62TwoBytes + 0x00, 0x17}}
11351 },
11352 {
11353 // type (short header, 4 byte packet number)
11354 {"",
11355 {0x43}},
11356 // connection_id
11357 {"",
11358 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11359 // packet number
11360 {"",
11361 {0x12, 0x34, 0x9A, 0xBC}},
11362 // frame type (two-byte encoding)
11363 {"",
11364 {kVarInt62TwoBytes + 0x00, 0x18}}
11365 },
11366 {
11367 // type (short header, 4 byte packet number)
11368 {"",
11369 {0x43}},
11370 // connection_id
11371 {"",
11372 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11373 // packet number
11374 {"",
11375 {0x12, 0x34, 0x9A, 0xBC}},
11376 // frame type (two-byte encoding)
11377 {"",
11378 {kVarInt62TwoBytes + 0x00, 0x20}}
11379 },
11380 {
11381 // type (short header, 4 byte packet number)
11382 {"",
11383 {0x43}},
11384 // connection_id
11385 {"",
11386 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11387 // packet number
11388 {"",
11389 {0x12, 0x34, 0x9A, 0xBC}},
11390 // frame type (two-byte encoding)
11391 {"",
11392 {kVarInt62TwoBytes + 0x00, 0x21}}
11393 },
11394 };
11395 // clang-format on
11396
11397 for (PacketFragments& packet : packets) {
11398 std::unique_ptr<QuicEncryptedPacket> encrypted(
11399 AssemblePacketFromFragments(packet));
11400
11401 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
11402
11403 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
11404 EXPECT_EQ("Frame type not minimally encoded.", framer_.detailed_error());
11405 }
11406 }
11407
TEST_P(QuicFramerTest,RetireConnectionIdFrame)11408 TEST_P(QuicFramerTest, RetireConnectionIdFrame) {
11409 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
11410 // This frame is only for version 99.
11411 return;
11412 }
11413 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11414 // clang-format off
11415 PacketFragments packet_ietf = {
11416 // type (short header, 4 byte packet number)
11417 {"",
11418 {0x43}},
11419 // connection_id
11420 {"",
11421 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
11422 // packet number
11423 {"",
11424 {0x12, 0x34, 0x56, 0x78}},
11425 // frame type (IETF_RETIRE_CONNECTION_ID frame)
11426 {"",
11427 {0x19}},
11428 // Sequence number
11429 {"Unable to read retire connection ID frame sequence number.",
11430 {kVarInt62TwoBytes + 0x11, 0x22}}
11431 };
11432 // clang-format on
11433
11434 std::unique_ptr<QuicEncryptedPacket> encrypted(
11435 AssemblePacketFromFragments(packet_ietf));
11436 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
11437
11438 EXPECT_THAT(framer_.error(), IsQuicNoError());
11439 ASSERT_TRUE(visitor_.header_.get());
11440 EXPECT_TRUE(CheckDecryption(
11441 *encrypted, !kIncludeVersion, !kIncludeDiversificationNonce,
11442 kPacket8ByteConnectionId, kPacket0ByteConnectionId));
11443
11444 EXPECT_EQ(0u, visitor_.stream_frames_.size());
11445
11446 EXPECT_EQ(0x1122u, visitor_.retire_connection_id_.sequence_number);
11447
11448 ASSERT_EQ(0u, visitor_.ack_frames_.size());
11449
11450 CheckFramingBoundaries(packet_ietf, QUIC_INVALID_RETIRE_CONNECTION_ID_DATA);
11451 }
11452
TEST_P(QuicFramerTest,BuildRetireConnectionIdFramePacket)11453 TEST_P(QuicFramerTest, BuildRetireConnectionIdFramePacket) {
11454 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
11455 // This frame is only for version 99.
11456 return;
11457 }
11458 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
11459 QuicPacketHeader header;
11460 header.destination_connection_id = FramerTestConnectionId();
11461 header.reset_flag = false;
11462 header.version_flag = false;
11463 header.packet_number = kPacketNumber;
11464
11465 QuicRetireConnectionIdFrame frame;
11466 frame.sequence_number = 0x1122;
11467
11468 QuicFrames frames = {QuicFrame(&frame)};
11469
11470 // clang-format off
11471 unsigned char packet_ietf[] = {
11472 // type (short header, 4 byte packet number)
11473 0x43,
11474 // connection_id
11475 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11476 // packet number
11477 0x12, 0x34, 0x56, 0x78,
11478
11479 // frame type (IETF_RETIRE_CONNECTION_ID frame)
11480 0x19,
11481 // sequence number
11482 kVarInt62TwoBytes + 0x11, 0x22
11483 };
11484 // clang-format on
11485
11486 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
11487 ASSERT_TRUE(data != nullptr);
11488
11489 quiche::test::CompareCharArraysWithHexError(
11490 "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
11491 ABSL_ARRAYSIZE(packet_ietf));
11492 }
11493
TEST_P(QuicFramerTest,AckFrameWithInvalidLargestObserved)11494 TEST_P(QuicFramerTest, AckFrameWithInvalidLargestObserved) {
11495 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11496 // clang-format off
11497 unsigned char packet[] = {
11498 // type (short header, 4 byte packet number)
11499 0x43,
11500 // connection_id
11501 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11502 // packet number
11503 0x12, 0x34, 0x56, 0x78,
11504
11505 // frame type (ack frame)
11506 0x45,
11507 // largest observed
11508 0x00, 0x00,
11509 // Zero delta time.
11510 0x00, 0x00,
11511 // first ack block length.
11512 0x00, 0x00,
11513 // num timestamps.
11514 0x00
11515 };
11516
11517 unsigned char packet_ietf[] = {
11518 // type (short header, 4 byte packet number)
11519 0x43,
11520 // connection_id
11521 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11522 // packet number
11523 0x12, 0x34, 0x56, 0x78,
11524
11525 // frame type (IETF_ACK frame)
11526 0x02,
11527 // Largest acked
11528 kVarInt62OneByte + 0x00,
11529 // Zero delta time.
11530 kVarInt62OneByte + 0x00,
11531 // Ack block count 0
11532 kVarInt62OneByte + 0x00,
11533 // First ack block length
11534 kVarInt62OneByte + 0x00,
11535 };
11536 // clang-format on
11537
11538 unsigned char* p = packet;
11539 size_t p_size = ABSL_ARRAYSIZE(packet);
11540 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
11541 p = packet_ietf;
11542 p_size = ABSL_ARRAYSIZE(packet_ietf);
11543 }
11544
11545 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
11546 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
11547 EXPECT_EQ(framer_.detailed_error(), "Largest acked is 0.");
11548 }
11549
TEST_P(QuicFramerTest,FirstAckBlockJustUnderFlow)11550 TEST_P(QuicFramerTest, FirstAckBlockJustUnderFlow) {
11551 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11552 // clang-format off
11553 unsigned char packet[] = {
11554 // type (short header, 4 byte packet number)
11555 0x43,
11556 // connection_id
11557 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11558 // packet number
11559 0x12, 0x34, 0x56, 0x78,
11560
11561 // frame type (ack frame)
11562 0x45,
11563 // largest observed
11564 0x00, 0x02,
11565 // Zero delta time.
11566 0x00, 0x00,
11567 // first ack block length.
11568 0x00, 0x03,
11569 // num timestamps.
11570 0x00
11571 };
11572
11573 unsigned char packet_ietf[] = {
11574 // type (short header, 4 byte packet number)
11575 0x43,
11576 // connection_id
11577 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11578 // packet number
11579 0x12, 0x34, 0x56, 0x78,
11580
11581 // frame type (IETF_ACK frame)
11582 0x02,
11583 // Largest acked
11584 kVarInt62OneByte + 0x02,
11585 // Zero delta time.
11586 kVarInt62OneByte + 0x00,
11587 // Ack block count 0
11588 kVarInt62OneByte + 0x00,
11589 // First ack block length
11590 kVarInt62OneByte + 0x02,
11591 };
11592 // clang-format on
11593
11594 unsigned char* p = packet;
11595 size_t p_size = ABSL_ARRAYSIZE(packet);
11596 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
11597 p = packet_ietf;
11598 p_size = ABSL_ARRAYSIZE(packet_ietf);
11599 }
11600
11601 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
11602 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
11603 EXPECT_EQ(framer_.detailed_error(),
11604 "Underflow with first ack block length 3 largest acked is 2.");
11605 }
11606
TEST_P(QuicFramerTest,ThirdAckBlockJustUnderflow)11607 TEST_P(QuicFramerTest, ThirdAckBlockJustUnderflow) {
11608 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
11609 // clang-format off
11610 unsigned char packet[] = {
11611 // type (short header, 4 byte packet number)
11612 0x43,
11613 // connection_id
11614 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11615 // packet number
11616 0x12, 0x34, 0x56, 0x78,
11617
11618 // frame type (ack frame)
11619 0x60,
11620 // largest observed
11621 0x0A,
11622 // Zero delta time.
11623 0x00, 0x00,
11624 // Num of ack blocks
11625 0x02,
11626 // first ack block length.
11627 0x02,
11628 // gap to next block
11629 0x01,
11630 // ack block length
11631 0x01,
11632 // gap to next block
11633 0x01,
11634 // ack block length
11635 0x06,
11636 // num timestamps.
11637 0x00
11638 };
11639
11640 unsigned char packet_ietf[] = {
11641 // type (short header, 4 byte packet number)
11642 0x43,
11643 // connection_id
11644 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11645 // packet number
11646 0x12, 0x34, 0x56, 0x78,
11647
11648 // frame type (IETF_ACK frame)
11649 0x02,
11650 // Largest acked
11651 kVarInt62OneByte + 0x0A,
11652 // Zero delta time.
11653 kVarInt62OneByte + 0x00,
11654 // Ack block count 2
11655 kVarInt62OneByte + 0x02,
11656 // First ack block length
11657 kVarInt62OneByte + 0x01,
11658 // gap to next block length
11659 kVarInt62OneByte + 0x00,
11660 // ack block length
11661 kVarInt62OneByte + 0x00,
11662 // gap to next block length
11663 kVarInt62OneByte + 0x00,
11664 // ack block length
11665 kVarInt62OneByte + 0x05,
11666 };
11667 // clang-format on
11668
11669 unsigned char* p = packet;
11670 size_t p_size = ABSL_ARRAYSIZE(packet);
11671 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
11672 p = packet_ietf;
11673 p_size = ABSL_ARRAYSIZE(packet_ietf);
11674 }
11675
11676 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
11677 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
11678 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
11679 EXPECT_EQ(framer_.detailed_error(),
11680 "Underflow with ack block length 6 latest ack block end is 5.");
11681 } else {
11682 EXPECT_EQ(framer_.detailed_error(),
11683 "Underflow with ack block length 6, end of block is 6.");
11684 }
11685 }
11686
TEST_P(QuicFramerTest,CoalescedPacket)11687 TEST_P(QuicFramerTest, CoalescedPacket) {
11688 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
11689 return;
11690 }
11691 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
11692 // clang-format off
11693 unsigned char packet[] = {
11694 // first coalesced packet
11695 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11696 // 4-byte packet number)
11697 0xD3,
11698 // version
11699 QUIC_VERSION_BYTES,
11700 // destination connection ID length
11701 0x08,
11702 // destination connection ID
11703 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11704 // source connection ID length
11705 0x00,
11706 // long header packet length
11707 0x1E,
11708 // packet number
11709 0x12, 0x34, 0x56, 0x78,
11710 // frame type (stream frame with fin)
11711 0xFE,
11712 // stream id
11713 0x02, 0x03, 0x04,
11714 // offset
11715 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11716 // data length
11717 0x00, 0x0c,
11718 // data
11719 'h', 'e', 'l', 'l',
11720 'o', ' ', 'w', 'o',
11721 'r', 'l', 'd', '!',
11722 // second coalesced packet
11723 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11724 // 4-byte packet number)
11725 0xD3,
11726 // version
11727 QUIC_VERSION_BYTES,
11728 // destination connection ID length
11729 0x08,
11730 // destination connection ID
11731 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11732 // source connection ID length
11733 0x00,
11734 // long header packet length
11735 0x1E,
11736 // packet number
11737 0x12, 0x34, 0x56, 0x79,
11738 // frame type (stream frame with fin)
11739 0xFE,
11740 // stream id
11741 0x02, 0x03, 0x04,
11742 // offset
11743 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11744 // data length
11745 0x00, 0x0c,
11746 // data
11747 'H', 'E', 'L', 'L',
11748 'O', '_', 'W', 'O',
11749 'R', 'L', 'D', '?',
11750 };
11751 unsigned char packet_ietf[] = {
11752 // first coalesced packet
11753 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11754 // 4-byte packet number)
11755 0xD3,
11756 // version
11757 QUIC_VERSION_BYTES,
11758 // destination connection ID length
11759 0x08,
11760 // destination connection ID
11761 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11762 // source connection ID length
11763 0x00,
11764 // long header packet length
11765 0x1E,
11766 // packet number
11767 0x12, 0x34, 0x56, 0x78,
11768 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
11769 0x08 | 0x01 | 0x02 | 0x04,
11770 // stream id
11771 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
11772 // offset
11773 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
11774 0x32, 0x10, 0x76, 0x54,
11775 // data length
11776 kVarInt62OneByte + 0x0c,
11777 // data
11778 'h', 'e', 'l', 'l',
11779 'o', ' ', 'w', 'o',
11780 'r', 'l', 'd', '!',
11781 // second coalesced packet
11782 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11783 // 4-byte packet number)
11784 0xD3,
11785 // version
11786 QUIC_VERSION_BYTES,
11787 // destination connection ID length
11788 0x08,
11789 // destination connection ID
11790 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11791 // source connection ID length
11792 0x00,
11793 // long header packet length
11794 0x1E,
11795 // packet number
11796 0x12, 0x34, 0x56, 0x79,
11797 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
11798 0x08 | 0x01 | 0x02 | 0x04,
11799 // stream id
11800 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
11801 // offset
11802 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
11803 0x32, 0x10, 0x76, 0x54,
11804 // data length
11805 kVarInt62OneByte + 0x0c,
11806 // data
11807 'H', 'E', 'L', 'L',
11808 'O', '_', 'W', 'O',
11809 'R', 'L', 'D', '?',
11810 };
11811 // clang-format on
11812 const size_t first_packet_ietf_size = 46;
11813 // If the first packet changes, the attempt to fix the first byte of the
11814 // second packet will fail.
11815 EXPECT_EQ(packet_ietf[first_packet_ietf_size], 0xD3);
11816
11817 unsigned char* p = packet;
11818 size_t p_length = ABSL_ARRAYSIZE(packet);
11819 if (framer_.version().HasIetfQuicFrames()) {
11820 ReviseFirstByteByVersion(packet_ietf);
11821 ReviseFirstByteByVersion(&packet_ietf[first_packet_ietf_size]);
11822 p = packet_ietf;
11823 p_length = ABSL_ARRAYSIZE(packet_ietf);
11824 }
11825
11826 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
11827 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
11828
11829 EXPECT_THAT(framer_.error(), IsQuicNoError());
11830 ASSERT_TRUE(visitor_.header_.get());
11831
11832 ASSERT_EQ(1u, visitor_.stream_frames_.size());
11833 EXPECT_EQ(0u, visitor_.ack_frames_.size());
11834
11835 // Stream ID should be the last 3 bytes of kStreamId.
11836 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
11837 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
11838 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
11839 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
11840
11841 ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
11842 EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
11843
11844 EXPECT_THAT(framer_.error(), IsQuicNoError());
11845 ASSERT_TRUE(visitor_.header_.get());
11846
11847 ASSERT_EQ(2u, visitor_.stream_frames_.size());
11848 EXPECT_EQ(0u, visitor_.ack_frames_.size());
11849
11850 // Stream ID should be the last 3 bytes of kStreamId.
11851 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[1]->stream_id);
11852 EXPECT_TRUE(visitor_.stream_frames_[1]->fin);
11853 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[1]->offset);
11854 CheckStreamFrameData("HELLO_WORLD?", visitor_.stream_frames_[1].get());
11855 }
11856
TEST_P(QuicFramerTest,CoalescedPacketWithUdpPadding)11857 TEST_P(QuicFramerTest, CoalescedPacketWithUdpPadding) {
11858 if (!framer_.version().HasLongHeaderLengths()) {
11859 return;
11860 }
11861 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
11862 // clang-format off
11863 unsigned char packet[] = {
11864 // first coalesced packet
11865 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11866 // 4-byte packet number)
11867 0xD3,
11868 // version
11869 QUIC_VERSION_BYTES,
11870 // destination connection ID length
11871 0x08,
11872 // destination connection ID
11873 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11874 // source connection ID length
11875 0x00,
11876 // long header packet length
11877 0x1E,
11878 // packet number
11879 0x12, 0x34, 0x56, 0x78,
11880 // frame type (stream frame with fin)
11881 0xFE,
11882 // stream id
11883 0x02, 0x03, 0x04,
11884 // offset
11885 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11886 // data length
11887 0x00, 0x0c,
11888 // data
11889 'h', 'e', 'l', 'l',
11890 'o', ' ', 'w', 'o',
11891 'r', 'l', 'd', '!',
11892 // padding
11893 0x00, 0x00, 0x00, 0x00,
11894 0x00, 0x00, 0x00, 0x00,
11895 0x00, 0x00, 0x00, 0x00,
11896 0x00, 0x00, 0x00, 0x00,
11897 0x00, 0x00, 0x00, 0x00,
11898 };
11899 unsigned char packet_ietf[] = {
11900 // first coalesced packet
11901 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11902 // 4-byte packet number)
11903 0xD3,
11904 // version
11905 QUIC_VERSION_BYTES,
11906 // destination connection ID length
11907 0x08,
11908 // destination connection ID
11909 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11910 // source connection ID length
11911 0x00,
11912 // long header packet length
11913 0x1E,
11914 // packet number
11915 0x12, 0x34, 0x56, 0x78,
11916 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
11917 0x08 | 0x01 | 0x02 | 0x04,
11918 // stream id
11919 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
11920 // offset
11921 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
11922 0x32, 0x10, 0x76, 0x54,
11923 // data length
11924 kVarInt62OneByte + 0x0c,
11925 // data
11926 'h', 'e', 'l', 'l',
11927 'o', ' ', 'w', 'o',
11928 'r', 'l', 'd', '!',
11929 // padding
11930 0x00, 0x00, 0x00, 0x00,
11931 0x00, 0x00, 0x00, 0x00,
11932 0x00, 0x00, 0x00, 0x00,
11933 0x00, 0x00, 0x00, 0x00,
11934 0x00, 0x00, 0x00, 0x00,
11935 };
11936 // clang-format on
11937
11938 unsigned char* p = packet;
11939 size_t p_length = ABSL_ARRAYSIZE(packet);
11940 if (framer_.version().HasIetfQuicFrames()) {
11941 ReviseFirstByteByVersion(packet_ietf);
11942 p = packet_ietf;
11943 p_length = ABSL_ARRAYSIZE(packet_ietf);
11944 }
11945
11946 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
11947 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
11948
11949 EXPECT_THAT(framer_.error(), IsQuicNoError());
11950 ASSERT_TRUE(visitor_.header_.get());
11951
11952 ASSERT_EQ(1u, visitor_.stream_frames_.size());
11953 EXPECT_EQ(0u, visitor_.ack_frames_.size());
11954
11955 // Stream ID should be the last 3 bytes of kStreamId.
11956 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
11957 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
11958 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
11959 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
11960
11961 EXPECT_EQ(visitor_.coalesced_packets_.size(), 0u);
11962 }
11963
TEST_P(QuicFramerTest,CoalescedPacketWithDifferentVersion)11964 TEST_P(QuicFramerTest, CoalescedPacketWithDifferentVersion) {
11965 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
11966 return;
11967 }
11968 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
11969 // clang-format off
11970 unsigned char packet[] = {
11971 // first coalesced packet
11972 // public flags (long header with packet type ZERO_RTT_PROTECTED and
11973 // 4-byte packet number)
11974 0xD3,
11975 // version
11976 QUIC_VERSION_BYTES,
11977 // destination connection ID length
11978 0x08,
11979 // destination connection ID
11980 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
11981 // source connection ID length
11982 0x00,
11983 // long header packet length
11984 0x1E,
11985 // packet number
11986 0x12, 0x34, 0x56, 0x78,
11987 // frame type (stream frame with fin)
11988 0xFE,
11989 // stream id
11990 0x02, 0x03, 0x04,
11991 // offset
11992 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
11993 // data length
11994 0x00, 0x0c,
11995 // data
11996 'h', 'e', 'l', 'l',
11997 'o', ' ', 'w', 'o',
11998 'r', 'l', 'd', '!',
11999 // second coalesced packet
12000 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12001 // 4-byte packet number)
12002 0xD3,
12003 // garbage version
12004 'G', 'A', 'B', 'G',
12005 // destination connection ID length
12006 0x08,
12007 // destination connection ID
12008 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12009 // source connection ID length
12010 0x00,
12011 // long header packet length
12012 0x1E,
12013 // packet number
12014 0x12, 0x34, 0x56, 0x79,
12015 // frame type (stream frame with fin)
12016 0xFE,
12017 // stream id
12018 0x02, 0x03, 0x04,
12019 // offset
12020 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12021 // data length
12022 0x00, 0x0c,
12023 // data
12024 'H', 'E', 'L', 'L',
12025 'O', '_', 'W', 'O',
12026 'R', 'L', 'D', '?',
12027 };
12028 unsigned char packet_ietf[] = {
12029 // first coalesced packet
12030 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12031 // 4-byte packet number)
12032 0xD3,
12033 // version
12034 QUIC_VERSION_BYTES,
12035 // destination connection ID length
12036 0x08,
12037 // destination connection ID
12038 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12039 // source connection ID length
12040 0x00,
12041 // long header packet length
12042 0x1E,
12043 // packet number
12044 0x12, 0x34, 0x56, 0x78,
12045 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12046 0x08 | 0x01 | 0x02 | 0x04,
12047 // stream id
12048 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12049 // offset
12050 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12051 0x32, 0x10, 0x76, 0x54,
12052 // data length
12053 kVarInt62OneByte + 0x0c,
12054 // data
12055 'h', 'e', 'l', 'l',
12056 'o', ' ', 'w', 'o',
12057 'r', 'l', 'd', '!',
12058 // second coalesced packet
12059 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12060 // 4-byte packet number)
12061 0xD3,
12062 // garbage version
12063 'G', 'A', 'B', 'G',
12064 // destination connection ID length
12065 0x08,
12066 // destination connection ID
12067 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12068 // source connection ID length
12069 0x00,
12070 // long header packet length
12071 0x1E,
12072 // packet number
12073 0x12, 0x34, 0x56, 0x79,
12074 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12075 0x08 | 0x01 | 0x02 | 0x04,
12076 // stream id
12077 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12078 // offset
12079 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12080 0x32, 0x10, 0x76, 0x54,
12081 // data length
12082 kVarInt62OneByte + 0x0c,
12083 // data
12084 'H', 'E', 'L', 'L',
12085 'O', '_', 'W', 'O',
12086 'R', 'L', 'D', '?',
12087 };
12088 // clang-format on
12089 const size_t first_packet_ietf_size = 46;
12090 // If the first packet changes, the attempt to fix the first byte of the
12091 // second packet will fail.
12092 EXPECT_EQ(packet_ietf[first_packet_ietf_size], 0xD3);
12093
12094 unsigned char* p = packet;
12095 size_t p_length = ABSL_ARRAYSIZE(packet);
12096 if (framer_.version().HasIetfQuicFrames()) {
12097 ReviseFirstByteByVersion(packet_ietf);
12098 ReviseFirstByteByVersion(&packet_ietf[first_packet_ietf_size]);
12099 p = packet_ietf;
12100 p_length = ABSL_ARRAYSIZE(packet_ietf);
12101 }
12102
12103 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12104 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12105
12106 EXPECT_THAT(framer_.error(), IsQuicNoError());
12107 ASSERT_TRUE(visitor_.header_.get());
12108
12109 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12110 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12111
12112 // Stream ID should be the last 3 bytes of kStreamId.
12113 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12114 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12115 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12116 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12117
12118 ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
12119 EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
12120
12121 EXPECT_THAT(framer_.error(), IsQuicNoError());
12122 ASSERT_TRUE(visitor_.header_.get());
12123
12124 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12125 // Verify version mismatch gets reported.
12126 EXPECT_EQ(1, visitor_.version_mismatch_);
12127 }
12128
TEST_P(QuicFramerTest,UndecryptablePacketWithoutDecrypter)12129 TEST_P(QuicFramerTest, UndecryptablePacketWithoutDecrypter) {
12130 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12131
12132 if (!framer_.version().KnowsWhichDecrypterToUse()) {
12133 // We create a bad client decrypter by using initial encryption with a
12134 // bogus connection ID; it should fail to decrypt everything.
12135 QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
12136 CrypterPair bogus_crypters;
12137 CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12138 framer_.version(),
12139 bogus_connection_id, &bogus_crypters);
12140 // This removes all other decrypters.
12141 framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
12142 std::move(bogus_crypters.decrypter));
12143 }
12144
12145 // clang-format off
12146 unsigned char packet[] = {
12147 // public flags (long header with packet type HANDSHAKE and
12148 // 4-byte packet number)
12149 0xE3,
12150 // version
12151 QUIC_VERSION_BYTES,
12152 // connection ID lengths
12153 0x05,
12154 // source connection ID
12155 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12156 // long header packet length
12157 0x05,
12158 // packet number
12159 0x12, 0x34, 0x56, 0x00,
12160 // padding frames
12161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12165 };
12166 unsigned char packet49[] = {
12167 // public flags (long header with packet type HANDSHAKE and
12168 // 4-byte packet number)
12169 0xE3,
12170 // version
12171 QUIC_VERSION_BYTES,
12172 // destination connection ID length
12173 0x00,
12174 // source connection ID length
12175 0x08,
12176 // source connection ID
12177 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12178 // long header packet length
12179 0x24,
12180 // packet number
12181 0x12, 0x34, 0x56, 0x00,
12182 // padding frames
12183 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12184 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12186 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12187 };
12188 // clang-format on
12189 unsigned char* p = packet;
12190 size_t p_length = ABSL_ARRAYSIZE(packet);
12191 if (framer_.version().HasLongHeaderLengths()) {
12192 ReviseFirstByteByVersion(packet49);
12193 p = packet49;
12194 p_length = ABSL_ARRAYSIZE(packet49);
12195 }
12196 // First attempt decryption without the handshake crypter.
12197 EXPECT_FALSE(
12198 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false)));
12199 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
12200 ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12201 ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12202 ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12203 quiche::test::CompareCharArraysWithHexError(
12204 "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
12205 visitor_.undecryptable_packets_[0]->length(), AsChars(p), p_length);
12206 if (framer_.version().KnowsWhichDecrypterToUse()) {
12207 EXPECT_EQ(ENCRYPTION_HANDSHAKE,
12208 visitor_.undecryptable_decryption_levels_[0]);
12209 }
12210 EXPECT_FALSE(visitor_.undecryptable_has_decryption_keys_[0]);
12211 }
12212
TEST_P(QuicFramerTest,UndecryptablePacketWithDecrypter)12213 TEST_P(QuicFramerTest, UndecryptablePacketWithDecrypter) {
12214 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12215
12216 // We create a bad client decrypter by using initial encryption with a
12217 // bogus connection ID; it should fail to decrypt everything.
12218 QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
12219 CrypterPair bad_handshake_crypters;
12220 CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12221 framer_.version(), bogus_connection_id,
12222 &bad_handshake_crypters);
12223 if (framer_.version().KnowsWhichDecrypterToUse()) {
12224 framer_.InstallDecrypter(ENCRYPTION_HANDSHAKE,
12225 std::move(bad_handshake_crypters.decrypter));
12226 } else {
12227 framer_.SetDecrypter(ENCRYPTION_HANDSHAKE,
12228 std::move(bad_handshake_crypters.decrypter));
12229 }
12230
12231 // clang-format off
12232 unsigned char packet[] = {
12233 // public flags (long header with packet type HANDSHAKE and
12234 // 4-byte packet number)
12235 0xE3,
12236 // version
12237 QUIC_VERSION_BYTES,
12238 // connection ID lengths
12239 0x05,
12240 // source connection ID
12241 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12242 // long header packet length
12243 0x05,
12244 // packet number
12245 0x12, 0x34, 0x56, 0x00,
12246 // padding frames
12247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12251 };
12252 unsigned char packet49[] = {
12253 // public flags (long header with packet type HANDSHAKE and
12254 // 4-byte packet number)
12255 0xE3,
12256 // version
12257 QUIC_VERSION_BYTES,
12258 // destination connection ID length
12259 0x00,
12260 // source connection ID length
12261 0x08,
12262 // source connection ID
12263 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12264 // long header packet length
12265 0x24,
12266 // packet number
12267 0x12, 0x34, 0x56, 0x00,
12268 // padding frames
12269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12271 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12272 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12273 };
12274 // clang-format on
12275 unsigned char* p = packet;
12276 size_t p_length = ABSL_ARRAYSIZE(packet);
12277 if (framer_.version().HasLongHeaderLengths()) {
12278 ReviseFirstByteByVersion(packet49);
12279 p = packet49;
12280 p_length = ABSL_ARRAYSIZE(packet49);
12281 }
12282
12283 EXPECT_FALSE(
12284 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false)));
12285 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
12286 ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12287 ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12288 ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12289 quiche::test::CompareCharArraysWithHexError(
12290 "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
12291 visitor_.undecryptable_packets_[0]->length(), AsChars(p), p_length);
12292 if (framer_.version().KnowsWhichDecrypterToUse()) {
12293 EXPECT_EQ(ENCRYPTION_HANDSHAKE,
12294 visitor_.undecryptable_decryption_levels_[0]);
12295 }
12296 EXPECT_EQ(framer_.version().KnowsWhichDecrypterToUse(),
12297 visitor_.undecryptable_has_decryption_keys_[0]);
12298 }
12299
TEST_P(QuicFramerTest,UndecryptableCoalescedPacket)12300 TEST_P(QuicFramerTest, UndecryptableCoalescedPacket) {
12301 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12302 return;
12303 }
12304 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
12305 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
12306 // We create a bad client decrypter by using initial encryption with a
12307 // bogus connection ID; it should fail to decrypt everything.
12308 QuicConnectionId bogus_connection_id = TestConnectionId(0xbad);
12309 CrypterPair bad_handshake_crypters;
12310 CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12311 framer_.version(), bogus_connection_id,
12312 &bad_handshake_crypters);
12313 framer_.InstallDecrypter(ENCRYPTION_HANDSHAKE,
12314 std::move(bad_handshake_crypters.decrypter));
12315 // clang-format off
12316 unsigned char packet[] = {
12317 // first coalesced packet
12318 // public flags (long header with packet type HANDSHAKE and
12319 // 4-byte packet number)
12320 0xE3,
12321 // version
12322 QUIC_VERSION_BYTES,
12323 // destination connection ID length
12324 0x08,
12325 // destination connection ID
12326 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12327 // source connection ID length
12328 0x00,
12329 // long header packet length
12330 0x1E,
12331 // packet number
12332 0x12, 0x34, 0x56, 0x78,
12333 // frame type (stream frame with fin)
12334 0xFE,
12335 // stream id
12336 0x02, 0x03, 0x04,
12337 // offset
12338 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12339 // data length
12340 0x00, 0x0c,
12341 // data
12342 'h', 'e', 'l', 'l',
12343 'o', ' ', 'w', 'o',
12344 'r', 'l', 'd', '!',
12345 // second coalesced packet
12346 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12347 // 4-byte packet number)
12348 0xD3,
12349 // version
12350 QUIC_VERSION_BYTES,
12351 // destination connection ID length
12352 0x08,
12353 // destination connection ID
12354 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12355 // source connection ID length
12356 0x00,
12357 // long header packet length
12358 0x1E,
12359 // packet number
12360 0x12, 0x34, 0x56, 0x79,
12361 // frame type (stream frame with fin)
12362 0xFE,
12363 // stream id
12364 0x02, 0x03, 0x04,
12365 // offset
12366 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12367 // data length
12368 0x00, 0x0c,
12369 // data
12370 'H', 'E', 'L', 'L',
12371 'O', '_', 'W', 'O',
12372 'R', 'L', 'D', '?',
12373 };
12374 unsigned char packet_ietf[] = {
12375 // first coalesced packet
12376 // public flags (long header with packet type HANDSHAKE and
12377 // 4-byte packet number)
12378 0xE3,
12379 // version
12380 QUIC_VERSION_BYTES,
12381 // destination connection ID length
12382 0x08,
12383 // destination connection ID
12384 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12385 // source connection ID length
12386 0x00,
12387 // long header packet length
12388 0x1E,
12389 // packet number
12390 0x12, 0x34, 0x56, 0x78,
12391 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12392 0x08 | 0x01 | 0x02 | 0x04,
12393 // stream id
12394 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12395 // offset
12396 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12397 0x32, 0x10, 0x76, 0x54,
12398 // data length
12399 kVarInt62OneByte + 0x0c,
12400 // data
12401 'h', 'e', 'l', 'l',
12402 'o', ' ', 'w', 'o',
12403 'r', 'l', 'd', '!',
12404 // second coalesced packet
12405 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12406 // 4-byte packet number)
12407 0xD3,
12408 // version
12409 QUIC_VERSION_BYTES,
12410 // destination connection ID length
12411 0x08,
12412 // destination connection ID
12413 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12414 // source connection ID length
12415 0x00,
12416 // long header packet length
12417 0x1E,
12418 // packet number
12419 0x12, 0x34, 0x56, 0x79,
12420 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12421 0x08 | 0x01 | 0x02 | 0x04,
12422 // stream id
12423 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12424 // offset
12425 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12426 0x32, 0x10, 0x76, 0x54,
12427 // data length
12428 kVarInt62OneByte + 0x0c,
12429 // data
12430 'H', 'E', 'L', 'L',
12431 'O', '_', 'W', 'O',
12432 'R', 'L', 'D', '?',
12433 };
12434 // clang-format on
12435 const size_t length_of_first_coalesced_packet = 46;
12436 // If the first packet changes, the attempt to fix the first byte of the
12437 // second packet will fail.
12438 EXPECT_EQ(packet_ietf[length_of_first_coalesced_packet], 0xD3);
12439
12440 unsigned char* p = packet;
12441 size_t p_length = ABSL_ARRAYSIZE(packet);
12442 if (framer_.version().HasIetfQuicFrames()) {
12443 ReviseFirstByteByVersion(packet_ietf);
12444 ReviseFirstByteByVersion(&packet_ietf[length_of_first_coalesced_packet]);
12445 p = packet_ietf;
12446 p_length = ABSL_ARRAYSIZE(packet_ietf);
12447 }
12448
12449 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12450
12451 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12452
12453 EXPECT_THAT(framer_.error(), IsError(QUIC_DECRYPTION_FAILURE));
12454
12455 ASSERT_EQ(1u, visitor_.undecryptable_packets_.size());
12456 ASSERT_EQ(1u, visitor_.undecryptable_decryption_levels_.size());
12457 ASSERT_EQ(1u, visitor_.undecryptable_has_decryption_keys_.size());
12458 // Make sure we only receive the first undecryptable packet and not the
12459 // full packet including the second coalesced packet.
12460 quiche::test::CompareCharArraysWithHexError(
12461 "undecryptable packet", visitor_.undecryptable_packets_[0]->data(),
12462 visitor_.undecryptable_packets_[0]->length(), AsChars(p),
12463 length_of_first_coalesced_packet);
12464 EXPECT_EQ(ENCRYPTION_HANDSHAKE, visitor_.undecryptable_decryption_levels_[0]);
12465 EXPECT_TRUE(visitor_.undecryptable_has_decryption_keys_[0]);
12466
12467 // Make sure the second coalesced packet is parsed correctly.
12468 ASSERT_EQ(visitor_.coalesced_packets_.size(), 1u);
12469 EXPECT_TRUE(framer_.ProcessPacket(*visitor_.coalesced_packets_[0].get()));
12470
12471 ASSERT_TRUE(visitor_.header_.get());
12472
12473 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12474 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12475
12476 // Stream ID should be the last 3 bytes of kStreamId.
12477 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12478 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12479 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12480 CheckStreamFrameData("HELLO_WORLD?", visitor_.stream_frames_[0].get());
12481 }
12482
TEST_P(QuicFramerTest,MismatchedCoalescedPacket)12483 TEST_P(QuicFramerTest, MismatchedCoalescedPacket) {
12484 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12485 return;
12486 }
12487 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
12488 // clang-format off
12489 unsigned char packet[] = {
12490 // first coalesced packet
12491 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12492 // 4-byte packet number)
12493 0xD3,
12494 // version
12495 QUIC_VERSION_BYTES,
12496 // destination connection ID length
12497 0x08,
12498 // destination connection ID
12499 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12500 // source connection ID length
12501 0x00,
12502 // long header packet length
12503 0x1E,
12504 // packet number
12505 0x12, 0x34, 0x56, 0x78,
12506 // frame type (stream frame with fin)
12507 0xFE,
12508 // stream id
12509 0x02, 0x03, 0x04,
12510 // offset
12511 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12512 // data length
12513 0x00, 0x0c,
12514 // data
12515 'h', 'e', 'l', 'l',
12516 'o', ' ', 'w', 'o',
12517 'r', 'l', 'd', '!',
12518 // second coalesced packet
12519 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12520 // 4-byte packet number)
12521 0xD3,
12522 // version
12523 QUIC_VERSION_BYTES,
12524 // destination connection ID length
12525 0x08,
12526 // destination connection ID
12527 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
12528 // source connection ID length
12529 0x00,
12530 // long header packet length
12531 0x1E,
12532 // packet number
12533 0x12, 0x34, 0x56, 0x79,
12534 // frame type (stream frame with fin)
12535 0xFE,
12536 // stream id
12537 0x02, 0x03, 0x04,
12538 // offset
12539 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12540 // data length
12541 0x00, 0x0c,
12542 // data
12543 'H', 'E', 'L', 'L',
12544 'O', '_', 'W', 'O',
12545 'R', 'L', 'D', '?',
12546 };
12547 unsigned char packet_ietf[] = {
12548 // first coalesced packet
12549 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12550 // 4-byte packet number)
12551 0xD3,
12552 // version
12553 QUIC_VERSION_BYTES,
12554 // destination connection ID length
12555 0x08,
12556 // destination connection ID
12557 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12558 // source connection ID length
12559 0x00,
12560 // long header packet length
12561 0x1E,
12562 // packet number
12563 0x12, 0x34, 0x56, 0x78,
12564 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12565 0x08 | 0x01 | 0x02 | 0x04,
12566 // stream id
12567 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12568 // offset
12569 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12570 0x32, 0x10, 0x76, 0x54,
12571 // data length
12572 kVarInt62OneByte + 0x0c,
12573 // data
12574 'h', 'e', 'l', 'l',
12575 'o', ' ', 'w', 'o',
12576 'r', 'l', 'd', '!',
12577 // second coalesced packet
12578 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12579 // 4-byte packet number)
12580 0xD3,
12581 // version
12582 QUIC_VERSION_BYTES,
12583 // destination connection ID length
12584 0x08,
12585 // destination connection ID
12586 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
12587 // source connection ID length
12588 0x00,
12589 // long header packet length
12590 0x1E,
12591 // packet number
12592 0x12, 0x34, 0x56, 0x79,
12593 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12594 0x08 | 0x01 | 0x02 | 0x04,
12595 // stream id
12596 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12597 // offset
12598 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12599 0x32, 0x10, 0x76, 0x54,
12600 // data length
12601 kVarInt62OneByte + 0x0c,
12602 // data
12603 'H', 'E', 'L', 'L',
12604 'O', '_', 'W', 'O',
12605 'R', 'L', 'D', '?',
12606 };
12607 // clang-format on
12608 const size_t length_of_first_coalesced_packet = 46;
12609 // If the first packet changes, the attempt to fix the first byte of the
12610 // second packet will fail.
12611 EXPECT_EQ(packet_ietf[length_of_first_coalesced_packet], 0xD3);
12612
12613 unsigned char* p = packet;
12614 size_t p_length = ABSL_ARRAYSIZE(packet);
12615 if (framer_.version().HasIetfQuicFrames()) {
12616 ReviseFirstByteByVersion(packet_ietf);
12617 ReviseFirstByteByVersion(&packet_ietf[length_of_first_coalesced_packet]);
12618 p = packet_ietf;
12619 p_length = ABSL_ARRAYSIZE(packet_ietf);
12620 }
12621
12622 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12623
12624 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12625
12626 EXPECT_THAT(framer_.error(), IsQuicNoError());
12627 ASSERT_TRUE(visitor_.header_.get());
12628
12629 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12630 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12631
12632 // Stream ID should be the last 3 bytes of kStreamId.
12633 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12634 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12635 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12636 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12637
12638 ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
12639 }
12640
TEST_P(QuicFramerTest,InvalidCoalescedPacket)12641 TEST_P(QuicFramerTest, InvalidCoalescedPacket) {
12642 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12643 return;
12644 }
12645 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
12646 // clang-format off
12647 unsigned char packet[] = {
12648 // first coalesced packet
12649 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12650 // 4-byte packet number)
12651 0xD3,
12652 // version
12653 QUIC_VERSION_BYTES,
12654 // destination connection ID length
12655 0x08,
12656 // destination connection ID
12657 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12658 // source connection ID length
12659 0x00,
12660 // long header packet length
12661 0x1E,
12662 // packet number
12663 0x12, 0x34, 0x56, 0x78,
12664 // frame type (stream frame with fin)
12665 0xFE,
12666 // stream id
12667 0x02, 0x03, 0x04,
12668 // offset
12669 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
12670 // data length
12671 0x00, 0x0c,
12672 // data
12673 'h', 'e', 'l', 'l',
12674 'o', ' ', 'w', 'o',
12675 'r', 'l', 'd', '!',
12676 // second coalesced packet
12677 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12678 // 4-byte packet number)
12679 0xD3,
12680 // version would be here but we cut off the invalid coalesced header.
12681 };
12682 unsigned char packet_ietf[] = {
12683 // first coalesced packet
12684 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12685 // 4-byte packet number)
12686 0xD3,
12687 // version
12688 QUIC_VERSION_BYTES,
12689 // destination connection ID length
12690 0x08,
12691 // destination connection ID
12692 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12693 // source connection ID length
12694 0x00,
12695 // long header packet length
12696 0x1E,
12697 // packet number
12698 0x12, 0x34, 0x56, 0x78,
12699 // frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set)
12700 0x08 | 0x01 | 0x02 | 0x04,
12701 // stream id
12702 kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04,
12703 // offset
12704 kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC,
12705 0x32, 0x10, 0x76, 0x54,
12706 // data length
12707 kVarInt62OneByte + 0x0c,
12708 // data
12709 'h', 'e', 'l', 'l',
12710 'o', ' ', 'w', 'o',
12711 'r', 'l', 'd', '!',
12712 // second coalesced packet
12713 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12714 // 4-byte packet number)
12715 0xD3,
12716 // version would be here but we cut off the invalid coalesced header.
12717 };
12718 // clang-format on
12719 const size_t length_of_first_coalesced_packet = 46;
12720 // If the first packet changes, the attempt to fix the first byte of the
12721 // second packet will fail.
12722 EXPECT_EQ(packet_ietf[length_of_first_coalesced_packet], 0xD3);
12723
12724 unsigned char* p = packet;
12725 size_t p_length = ABSL_ARRAYSIZE(packet);
12726 if (framer_.version().HasIetfQuicFrames()) {
12727 ReviseFirstByteByVersion(packet_ietf);
12728 ReviseFirstByteByVersion(&packet_ietf[length_of_first_coalesced_packet]);
12729 p = packet_ietf;
12730 p_length = ABSL_ARRAYSIZE(packet_ietf);
12731 }
12732
12733 QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
12734
12735 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12736
12737 EXPECT_THAT(framer_.error(), IsQuicNoError());
12738 ASSERT_TRUE(visitor_.header_.get());
12739
12740 ASSERT_EQ(1u, visitor_.stream_frames_.size());
12741 EXPECT_EQ(0u, visitor_.ack_frames_.size());
12742
12743 // Stream ID should be the last 3 bytes of kStreamId.
12744 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
12745 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
12746 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
12747 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
12748
12749 ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
12750 }
12751
12752 // Some IETF implementations send an initial followed by zeroes instead of
12753 // padding inside the initial. We need to make sure that we still process
12754 // the initial correctly and ignore the zeroes.
TEST_P(QuicFramerTest,CoalescedPacketWithZeroesRoundTrip)12755 TEST_P(QuicFramerTest, CoalescedPacketWithZeroesRoundTrip) {
12756 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version()) ||
12757 !framer_.version().UsesInitialObfuscators()) {
12758 return;
12759 }
12760 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
12761 QuicConnectionId connection_id = FramerTestConnectionId();
12762 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12763
12764 CrypterPair client_crypters;
12765 CryptoUtils::CreateInitialObfuscators(Perspective::IS_CLIENT,
12766 framer_.version(), connection_id,
12767 &client_crypters);
12768 framer_.SetEncrypter(ENCRYPTION_INITIAL,
12769 std::move(client_crypters.encrypter));
12770
12771 QuicPacketHeader header;
12772 header.destination_connection_id = connection_id;
12773 header.version_flag = true;
12774 header.packet_number = kPacketNumber;
12775 header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
12776 header.long_packet_type = INITIAL;
12777 header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
12778 header.retry_token_length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1;
12779 QuicFrames frames = {QuicFrame(QuicPingFrame()),
12780 QuicFrame(QuicPaddingFrame(3))};
12781
12782 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
12783 ASSERT_NE(nullptr, data);
12784
12785 // Add zeroes after the valid initial packet.
12786 unsigned char packet[kMaxOutgoingPacketSize] = {};
12787 size_t encrypted_length =
12788 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number, *data,
12789 AsChars(packet), ABSL_ARRAYSIZE(packet));
12790 ASSERT_NE(0u, encrypted_length);
12791
12792 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
12793 CrypterPair server_crypters;
12794 CryptoUtils::CreateInitialObfuscators(Perspective::IS_SERVER,
12795 framer_.version(), connection_id,
12796 &server_crypters);
12797 framer_.InstallDecrypter(ENCRYPTION_INITIAL,
12798 std::move(server_crypters.decrypter));
12799
12800 // Make sure the first long header initial packet parses correctly.
12801 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
12802
12803 // Make sure we discard the subsequent zeroes.
12804 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
12805 EXPECT_TRUE(visitor_.coalesced_packets_.empty());
12806 }
12807
TEST_P(QuicFramerTest,ClientReceivesWrongVersion)12808 TEST_P(QuicFramerTest, ClientReceivesWrongVersion) {
12809 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
12810
12811 // clang-format off
12812 unsigned char packet[] = {
12813 // public flags (long header with packet type INITIAL)
12814 0xC3,
12815 // version that is different from the framer's version
12816 'Q', '0', '4', '3',
12817 // connection ID lengths
12818 0x05,
12819 // source connection ID
12820 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12821 // packet number
12822 0x01,
12823 // padding frame
12824 0x00,
12825 };
12826 // clang-format on
12827
12828 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
12829 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
12830
12831 EXPECT_THAT(framer_.error(), IsError(QUIC_PACKET_WRONG_VERSION));
12832 EXPECT_EQ("Client received unexpected version.", framer_.detailed_error());
12833 }
12834
TEST_P(QuicFramerTest,PacketHeaderWithVariableLengthConnectionId)12835 TEST_P(QuicFramerTest, PacketHeaderWithVariableLengthConnectionId) {
12836 if (!framer_.version().AllowsVariableLengthConnectionIds()) {
12837 return;
12838 }
12839 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
12840 uint8_t connection_id_bytes[9] = {0xFE, 0xDC, 0xBA, 0x98, 0x76,
12841 0x54, 0x32, 0x10, 0x42};
12842 QuicConnectionId connection_id(reinterpret_cast<char*>(connection_id_bytes),
12843 sizeof(connection_id_bytes));
12844 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
12845 QuicFramerPeer::SetExpectedServerConnectionIDLength(&framer_,
12846 connection_id.length());
12847
12848 // clang-format off
12849 PacketFragments packet = {
12850 // type (8 byte connection_id and 1 byte packet number)
12851 {"Unable to read first byte.",
12852 {0x40}},
12853 // connection_id
12854 {"Unable to read destination connection ID.",
12855 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
12856 // packet number
12857 {"Unable to read packet number.",
12858 {0x78}},
12859 };
12860
12861 PacketFragments packet_with_padding = {
12862 // type (8 byte connection_id and 1 byte packet number)
12863 {"Unable to read first byte.",
12864 {0x40}},
12865 // connection_id
12866 {"Unable to read destination connection ID.",
12867 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
12868 // packet number
12869 {"",
12870 {0x78}},
12871 // padding
12872 {"", {0x00, 0x00, 0x00}},
12873 };
12874 // clang-format on
12875
12876 PacketFragments& fragments =
12877 framer_.version().HasHeaderProtection() ? packet_with_padding : packet;
12878 std::unique_ptr<QuicEncryptedPacket> encrypted(
12879 AssemblePacketFromFragments(fragments));
12880 if (framer_.version().HasHeaderProtection()) {
12881 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
12882 EXPECT_THAT(framer_.error(), IsQuicNoError());
12883 } else {
12884 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
12885 EXPECT_THAT(framer_.error(), IsError(QUIC_MISSING_PAYLOAD));
12886 }
12887 ASSERT_TRUE(visitor_.header_.get());
12888 EXPECT_EQ(connection_id, visitor_.header_->destination_connection_id);
12889 EXPECT_FALSE(visitor_.header_->reset_flag);
12890 EXPECT_FALSE(visitor_.header_->version_flag);
12891 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, visitor_.header_->packet_number_length);
12892 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
12893
12894 CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
12895 }
12896
TEST_P(QuicFramerTest,MultiplePacketNumberSpaces)12897 TEST_P(QuicFramerTest, MultiplePacketNumberSpaces) {
12898 framer_.EnableMultiplePacketNumberSpacesSupport();
12899
12900 // clang-format off
12901 unsigned char long_header_packet[] = {
12902 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12903 // 4-byte packet number)
12904 0xD3,
12905 // version
12906 QUIC_VERSION_BYTES,
12907 // destination connection ID length
12908 0x50,
12909 // destination connection ID
12910 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12911 // packet number
12912 0x12, 0x34, 0x56, 0x78,
12913 // padding frame
12914 0x00,
12915 };
12916 unsigned char long_header_packet_ietf[] = {
12917 // public flags (long header with packet type ZERO_RTT_PROTECTED and
12918 // 4-byte packet number)
12919 0xD3,
12920 // version
12921 QUIC_VERSION_BYTES,
12922 // destination connection ID length
12923 0x08,
12924 // destination connection ID
12925 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12926 // source connection ID length
12927 0x00,
12928 // long header packet length
12929 0x05,
12930 // packet number
12931 0x12, 0x34, 0x56, 0x78,
12932 // padding frame
12933 0x00,
12934 };
12935 // clang-format on
12936
12937 if (framer_.version().KnowsWhichDecrypterToUse()) {
12938 framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
12939 std::make_unique<TestDecrypter>());
12940 framer_.RemoveDecrypter(ENCRYPTION_INITIAL);
12941 } else {
12942 framer_.SetDecrypter(ENCRYPTION_ZERO_RTT,
12943 std::make_unique<TestDecrypter>());
12944 }
12945 if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
12946 EXPECT_TRUE(framer_.ProcessPacket(
12947 QuicEncryptedPacket(AsChars(long_header_packet),
12948 ABSL_ARRAYSIZE(long_header_packet), false)));
12949 } else {
12950 ReviseFirstByteByVersion(long_header_packet_ietf);
12951 EXPECT_TRUE(framer_.ProcessPacket(
12952 QuicEncryptedPacket(AsChars(long_header_packet_ietf),
12953 ABSL_ARRAYSIZE(long_header_packet_ietf), false)));
12954 }
12955
12956 EXPECT_THAT(framer_.error(), IsQuicNoError());
12957 EXPECT_FALSE(
12958 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
12959 .IsInitialized());
12960 EXPECT_FALSE(
12961 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
12962 .IsInitialized());
12963 EXPECT_EQ(kPacketNumber, QuicFramerPeer::GetLargestDecryptedPacketNumber(
12964 &framer_, APPLICATION_DATA));
12965
12966 // clang-format off
12967 unsigned char short_header_packet[] = {
12968 // type (short header, 1 byte packet number)
12969 0x40,
12970 // connection_id
12971 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
12972 // packet number
12973 0x79,
12974 // padding frame
12975 0x00, 0x00, 0x00,
12976 };
12977 // clang-format on
12978
12979 QuicEncryptedPacket short_header_encrypted(
12980 AsChars(short_header_packet), ABSL_ARRAYSIZE(short_header_packet), false);
12981 if (framer_.version().KnowsWhichDecrypterToUse()) {
12982 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
12983 std::make_unique<TestDecrypter>());
12984 framer_.RemoveDecrypter(ENCRYPTION_ZERO_RTT);
12985 } else {
12986 framer_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
12987 std::make_unique<TestDecrypter>());
12988 }
12989 EXPECT_TRUE(framer_.ProcessPacket(short_header_encrypted));
12990
12991 EXPECT_THAT(framer_.error(), IsQuicNoError());
12992 EXPECT_FALSE(
12993 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, INITIAL_DATA)
12994 .IsInitialized());
12995 EXPECT_FALSE(
12996 QuicFramerPeer::GetLargestDecryptedPacketNumber(&framer_, HANDSHAKE_DATA)
12997 .IsInitialized());
12998 EXPECT_EQ(kPacketNumber + 1, QuicFramerPeer::GetLargestDecryptedPacketNumber(
12999 &framer_, APPLICATION_DATA));
13000 }
13001
TEST_P(QuicFramerTest,IetfRetryPacketRejected)13002 TEST_P(QuicFramerTest, IetfRetryPacketRejected) {
13003 if (!framer_.version().KnowsWhichDecrypterToUse() ||
13004 framer_.version().SupportsRetry()) {
13005 return;
13006 }
13007
13008 // clang-format off
13009 PacketFragments packet = {
13010 // public flags (IETF Retry packet, 0-length original destination CID)
13011 {"Unable to read first byte.",
13012 {0xf0}},
13013 // version tag
13014 {"Unable to read protocol version.",
13015 {QUIC_VERSION_BYTES}},
13016 // connection_id length
13017 {"RETRY not supported in this version.",
13018 {0x00}},
13019 };
13020 // clang-format on
13021
13022 std::unique_ptr<QuicEncryptedPacket> encrypted(
13023 AssemblePacketFromFragments(packet));
13024
13025 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13026 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
13027 CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
13028 }
13029
TEST_P(QuicFramerTest,RetryPacketRejectedWithMultiplePacketNumberSpaces)13030 TEST_P(QuicFramerTest, RetryPacketRejectedWithMultiplePacketNumberSpaces) {
13031 if (framer_.version().SupportsRetry()) {
13032 return;
13033 }
13034 framer_.EnableMultiplePacketNumberSpacesSupport();
13035
13036 // clang-format off
13037 PacketFragments packet = {
13038 // public flags (IETF Retry packet, 0-length original destination CID)
13039 {"Unable to read first byte.",
13040 {0xf0}},
13041 // version tag
13042 {"Unable to read protocol version.",
13043 {QUIC_VERSION_BYTES}},
13044 // connection_id length
13045 {"RETRY not supported in this version.",
13046 {0x00}},
13047 };
13048 // clang-format on
13049
13050 std::unique_ptr<QuicEncryptedPacket> encrypted(
13051 AssemblePacketFromFragments(packet));
13052
13053 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13054 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
13055 CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
13056 }
13057
TEST_P(QuicFramerTest,WriteClientVersionNegotiationProbePacket)13058 TEST_P(QuicFramerTest, WriteClientVersionNegotiationProbePacket) {
13059 // clang-format off
13060 static const uint8_t expected_packet[1200] = {
13061 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13062 0xc0,
13063 // Version, part of the IETF space reserved for negotiation.
13064 0xca, 0xba, 0xda, 0xda,
13065 // Destination connection ID length 8.
13066 0x08,
13067 // 8-byte destination connection ID.
13068 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13069 // Source connection ID length 0.
13070 0x00,
13071 // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13072 // not parse with any known version.
13073 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13074 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13075 // zeroes to pad to 16 byte boundary.
13076 0x00,
13077 // A polite greeting in case a human sees this in tcpdump.
13078 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13079 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13080 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13081 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13082 0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13083 0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13084 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13085 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13086 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13087 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13088 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13089 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13090 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13091 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13092 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13093 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13094 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13095 0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13096 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13097 0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13098 0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13099 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13100 0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13101 };
13102 // clang-format on
13103 char packet[1200];
13104 char destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13105 0x6c, 0x7a, 0x20, 0x21};
13106 EXPECT_TRUE(QuicFramer::WriteClientVersionNegotiationProbePacket(
13107 packet, sizeof(packet), destination_connection_id_bytes,
13108 sizeof(destination_connection_id_bytes)));
13109 quiche::test::CompareCharArraysWithHexError(
13110 "constructed packet", packet, sizeof(packet),
13111 reinterpret_cast<const char*>(expected_packet), sizeof(expected_packet));
13112 QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13113 sizeof(packet), false);
13114 if (!framer_.version().HasLengthPrefixedConnectionIds()) {
13115 // We can only parse the connection ID with a parser expecting
13116 // length-prefixed connection IDs.
13117 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
13118 return;
13119 }
13120 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
13121 ASSERT_TRUE(visitor_.header_.get());
13122 QuicConnectionId probe_payload_connection_id(
13123 reinterpret_cast<const char*>(destination_connection_id_bytes),
13124 sizeof(destination_connection_id_bytes));
13125 EXPECT_EQ(probe_payload_connection_id,
13126 visitor_.header_.get()->destination_connection_id);
13127 }
13128
TEST_P(QuicFramerTest,DispatcherParseOldClientVersionNegotiationProbePacket)13129 TEST_P(QuicFramerTest, DispatcherParseOldClientVersionNegotiationProbePacket) {
13130 // clang-format off
13131 static const uint8_t packet[1200] = {
13132 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13133 0xc0,
13134 // Version, part of the IETF space reserved for negotiation.
13135 0xca, 0xba, 0xda, 0xba,
13136 // Destination connection ID length 8, source connection ID length 0.
13137 0x50,
13138 // 8-byte destination connection ID.
13139 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13140 // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13141 // not parse with any known version.
13142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13143 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13144 // 2 bytes of zeroes to pad to 16 byte boundary.
13145 0x00, 0x00,
13146 // A polite greeting in case a human sees this in tcpdump.
13147 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13148 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13149 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13150 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13151 0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13152 0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13153 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13154 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13155 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13156 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13157 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13158 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13159 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13160 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13161 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13162 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13163 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13164 0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13165 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13166 0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13167 0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13168 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13169 0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13170 };
13171 // clang-format on
13172 char expected_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13173 0x6c, 0x7a, 0x20, 0x21};
13174 QuicConnectionId expected_destination_connection_id(
13175 reinterpret_cast<const char*>(expected_destination_connection_id_bytes),
13176 sizeof(expected_destination_connection_id_bytes));
13177
13178 QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13179 sizeof(packet));
13180 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
13181 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
13182 bool version_present = false, has_length_prefix = true;
13183 QuicVersionLabel version_label = 33;
13184 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
13185 QuicConnectionId destination_connection_id = TestConnectionId(1);
13186 QuicConnectionId source_connection_id = TestConnectionId(2);
13187 std::optional<absl::string_view> retry_token;
13188 std::string detailed_error = "foobar";
13189 QuicErrorCode header_parse_result = QuicFramer::ParsePublicHeaderDispatcher(
13190 encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
13191 &version_present, &has_length_prefix, &version_label, &parsed_version,
13192 &destination_connection_id, &source_connection_id, &retry_token,
13193 &detailed_error);
13194 EXPECT_THAT(header_parse_result, IsQuicNoError());
13195 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
13196 EXPECT_TRUE(version_present);
13197 EXPECT_FALSE(has_length_prefix);
13198 EXPECT_EQ(0xcabadaba, version_label);
13199 EXPECT_EQ(expected_destination_connection_id, destination_connection_id);
13200 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
13201 EXPECT_FALSE(retry_token.has_value());
13202 EXPECT_EQ("", detailed_error);
13203 }
13204
TEST_P(QuicFramerTest,DispatcherParseClientVersionNegotiationProbePacket)13205 TEST_P(QuicFramerTest, DispatcherParseClientVersionNegotiationProbePacket) {
13206 // clang-format off
13207 static const uint8_t packet[1200] = {
13208 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13209 0xc0,
13210 // Version, part of the IETF space reserved for negotiation.
13211 0xca, 0xba, 0xda, 0xba,
13212 // Destination connection ID length 8.
13213 0x08,
13214 // 8-byte destination connection ID.
13215 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13216 // Source connection ID length 0.
13217 0x00,
13218 // 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
13219 // not parse with any known version.
13220 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13221 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
13222 // 1 byte of zeroes to pad to 16 byte boundary.
13223 0x00,
13224 // A polite greeting in case a human sees this in tcpdump.
13225 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x63,
13226 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
13227 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
13228 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67,
13229 0x65, 0x72, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20,
13230 0x51, 0x55, 0x49, 0x43, 0x20, 0x76, 0x65, 0x72,
13231 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x67,
13232 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
13233 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65,
13234 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
13235 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20,
13236 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
13237 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
13238 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b,
13239 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
13240 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68,
13241 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
13242 0x6f, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20,
13243 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e,
13244 0x20, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x20, 0x79,
13245 0x6f, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68,
13246 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x69,
13247 0x63, 0x65, 0x20, 0x64, 0x61, 0x79, 0x2e, 0x00,
13248 };
13249 // clang-format on
13250 char expected_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13251 0x6c, 0x7a, 0x20, 0x21};
13252 QuicConnectionId expected_destination_connection_id(
13253 reinterpret_cast<const char*>(expected_destination_connection_id_bytes),
13254 sizeof(expected_destination_connection_id_bytes));
13255
13256 QuicEncryptedPacket encrypted(reinterpret_cast<const char*>(packet),
13257 sizeof(packet));
13258 PacketHeaderFormat format = GOOGLE_QUIC_PACKET;
13259 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
13260 bool version_present = false, has_length_prefix = false;
13261 QuicVersionLabel version_label = 33;
13262 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
13263 QuicConnectionId destination_connection_id = TestConnectionId(1);
13264 QuicConnectionId source_connection_id = TestConnectionId(2);
13265 std::optional<absl::string_view> retry_token;
13266 std::string detailed_error = "foobar";
13267 QuicErrorCode header_parse_result = QuicFramer::ParsePublicHeaderDispatcher(
13268 encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type,
13269 &version_present, &has_length_prefix, &version_label, &parsed_version,
13270 &destination_connection_id, &source_connection_id, &retry_token,
13271 &detailed_error);
13272 EXPECT_THAT(header_parse_result, IsQuicNoError());
13273 EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
13274 EXPECT_TRUE(version_present);
13275 EXPECT_TRUE(has_length_prefix);
13276 EXPECT_EQ(0xcabadaba, version_label);
13277 EXPECT_EQ(expected_destination_connection_id, destination_connection_id);
13278 EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
13279 EXPECT_EQ("", detailed_error);
13280 }
13281
TEST_P(QuicFramerTest,ParseServerVersionNegotiationProbeResponse)13282 TEST_P(QuicFramerTest, ParseServerVersionNegotiationProbeResponse) {
13283 // clang-format off
13284 const uint8_t packet[] = {
13285 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
13286 0xc0,
13287 // Version of 0, indicating version negotiation.
13288 0x00, 0x00, 0x00, 0x00,
13289 // Destination connection ID length 0, source connection ID length 8.
13290 0x00, 0x08,
13291 // 8-byte source connection ID.
13292 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21,
13293 // A few supported versions.
13294 0xaa, 0xaa, 0xaa, 0xaa,
13295 QUIC_VERSION_BYTES,
13296 };
13297 // clang-format on
13298 char probe_payload_bytes[] = {0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21};
13299 char parsed_probe_payload_bytes[255] = {};
13300 uint8_t parsed_probe_payload_length = sizeof(parsed_probe_payload_bytes);
13301 std::string parse_detailed_error = "";
13302 EXPECT_TRUE(QuicFramer::ParseServerVersionNegotiationProbeResponse(
13303 reinterpret_cast<const char*>(packet), sizeof(packet),
13304 reinterpret_cast<char*>(parsed_probe_payload_bytes),
13305 &parsed_probe_payload_length, &parse_detailed_error));
13306 EXPECT_EQ("", parse_detailed_error);
13307 quiche::test::CompareCharArraysWithHexError(
13308 "parsed probe", parsed_probe_payload_bytes, parsed_probe_payload_length,
13309 probe_payload_bytes, sizeof(probe_payload_bytes));
13310 }
13311
TEST_P(QuicFramerTest,ParseClientVersionNegotiationProbePacket)13312 TEST_P(QuicFramerTest, ParseClientVersionNegotiationProbePacket) {
13313 char packet[1200];
13314 char input_destination_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13315 0x6c, 0x7a, 0x20, 0x21};
13316 ASSERT_TRUE(QuicFramer::WriteClientVersionNegotiationProbePacket(
13317 packet, sizeof(packet), input_destination_connection_id_bytes,
13318 sizeof(input_destination_connection_id_bytes)));
13319 char parsed_destination_connection_id_bytes[255] = {0};
13320 uint8_t parsed_destination_connection_id_length =
13321 sizeof(parsed_destination_connection_id_bytes);
13322 ASSERT_TRUE(ParseClientVersionNegotiationProbePacket(
13323 packet, sizeof(packet), parsed_destination_connection_id_bytes,
13324 &parsed_destination_connection_id_length));
13325 quiche::test::CompareCharArraysWithHexError(
13326 "parsed destination connection ID",
13327 parsed_destination_connection_id_bytes,
13328 parsed_destination_connection_id_length,
13329 input_destination_connection_id_bytes,
13330 sizeof(input_destination_connection_id_bytes));
13331 }
13332
TEST_P(QuicFramerTest,WriteServerVersionNegotiationProbeResponse)13333 TEST_P(QuicFramerTest, WriteServerVersionNegotiationProbeResponse) {
13334 char packet[1200];
13335 size_t packet_length = sizeof(packet);
13336 char input_source_connection_id_bytes[] = {0x56, 0x4e, 0x20, 0x70,
13337 0x6c, 0x7a, 0x20, 0x21};
13338 ASSERT_TRUE(WriteServerVersionNegotiationProbeResponse(
13339 packet, &packet_length, input_source_connection_id_bytes,
13340 sizeof(input_source_connection_id_bytes)));
13341 char parsed_source_connection_id_bytes[255] = {0};
13342 uint8_t parsed_source_connection_id_length =
13343 sizeof(parsed_source_connection_id_bytes);
13344 std::string detailed_error;
13345 ASSERT_TRUE(QuicFramer::ParseServerVersionNegotiationProbeResponse(
13346 packet, packet_length, parsed_source_connection_id_bytes,
13347 &parsed_source_connection_id_length, &detailed_error))
13348 << detailed_error;
13349 quiche::test::CompareCharArraysWithHexError(
13350 "parsed destination connection ID", parsed_source_connection_id_bytes,
13351 parsed_source_connection_id_length, input_source_connection_id_bytes,
13352 sizeof(input_source_connection_id_bytes));
13353 }
13354
TEST_P(QuicFramerTest,ClientConnectionIdFromLongHeaderToClient)13355 TEST_P(QuicFramerTest, ClientConnectionIdFromLongHeaderToClient) {
13356 SetDecrypterLevel(ENCRYPTION_HANDSHAKE);
13357 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13358 // clang-format off
13359 unsigned char packet[] = {
13360 // public flags (long header with packet type HANDSHAKE and
13361 // 4-byte packet number)
13362 0xE3,
13363 // version
13364 QUIC_VERSION_BYTES,
13365 // connection ID lengths
13366 0x50,
13367 // destination connection ID
13368 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13369 // long header packet length
13370 0x05,
13371 // packet number
13372 0x12, 0x34, 0x56, 0x00,
13373 // padding frame
13374 0x00,
13375 };
13376 unsigned char packet49[] = {
13377 // public flags (long header with packet type HANDSHAKE and
13378 // 4-byte packet number)
13379 0xE3,
13380 // version
13381 QUIC_VERSION_BYTES,
13382 // destination connection ID length
13383 0x08,
13384 // destination connection ID
13385 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13386 // source connection ID length
13387 0x00,
13388 // long header packet length
13389 0x05,
13390 // packet number
13391 0x12, 0x34, 0x56, 0x00,
13392 // padding frame
13393 0x00,
13394 };
13395 // clang-format on
13396
13397 unsigned char* p = packet;
13398 size_t p_length = ABSL_ARRAYSIZE(packet);
13399 if (framer_.version().HasLongHeaderLengths()) {
13400 ReviseFirstByteByVersion(packet49);
13401 p = packet49;
13402 p_length = ABSL_ARRAYSIZE(packet49);
13403 }
13404 const bool parse_success =
13405 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false));
13406 if (!framer_.version().AllowsVariableLengthConnectionIds()) {
13407 EXPECT_FALSE(parse_success);
13408 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
13409 EXPECT_EQ("Invalid ConnectionId length.", framer_.detailed_error());
13410 return;
13411 }
13412 EXPECT_TRUE(parse_success);
13413 EXPECT_THAT(framer_.error(), IsQuicNoError());
13414 EXPECT_EQ("", framer_.detailed_error());
13415 ASSERT_TRUE(visitor_.header_.get());
13416 EXPECT_EQ(FramerTestConnectionId(),
13417 visitor_.header_.get()->destination_connection_id);
13418 }
13419
TEST_P(QuicFramerTest,ClientConnectionIdFromLongHeaderToServer)13420 TEST_P(QuicFramerTest, ClientConnectionIdFromLongHeaderToServer) {
13421 SetDecrypterLevel(ENCRYPTION_HANDSHAKE);
13422 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13423 // clang-format off
13424 unsigned char packet[] = {
13425 // public flags (long header with packet type HANDSHAKE and
13426 // 4-byte packet number)
13427 0xE3,
13428 // version
13429 QUIC_VERSION_BYTES,
13430 // connection ID lengths
13431 0x05,
13432 // source connection ID
13433 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13434 // long header packet length
13435 0x05,
13436 // packet number
13437 0x12, 0x34, 0x56, 0x00,
13438 // padding frame
13439 0x00,
13440 };
13441 unsigned char packet49[] = {
13442 // public flags (long header with packet type HANDSHAKE and
13443 // 4-byte packet number)
13444 0xE3,
13445 // version
13446 QUIC_VERSION_BYTES,
13447 // connection ID lengths
13448 0x00, 0x08,
13449 // source connection ID
13450 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13451 // long header packet length
13452 0x05,
13453 // packet number
13454 0x12, 0x34, 0x56, 0x00,
13455 // padding frame
13456 0x00,
13457 };
13458 // clang-format on
13459 unsigned char* p = packet;
13460 size_t p_length = ABSL_ARRAYSIZE(packet);
13461 if (framer_.version().HasLongHeaderLengths()) {
13462 ReviseFirstByteByVersion(packet49);
13463 p = packet49;
13464 p_length = ABSL_ARRAYSIZE(packet49);
13465 }
13466 const bool parse_success =
13467 framer_.ProcessPacket(QuicEncryptedPacket(AsChars(p), p_length, false));
13468 if (!framer_.version().AllowsVariableLengthConnectionIds()) {
13469 EXPECT_FALSE(parse_success);
13470 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
13471 EXPECT_EQ("Invalid ConnectionId length.", framer_.detailed_error());
13472 return;
13473 }
13474 if (!framer_.version().SupportsClientConnectionIds()) {
13475 EXPECT_FALSE(parse_success);
13476 EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
13477 EXPECT_EQ("Client connection ID not supported in this version.",
13478 framer_.detailed_error());
13479 return;
13480 }
13481 EXPECT_TRUE(parse_success);
13482 EXPECT_THAT(framer_.error(), IsQuicNoError());
13483 EXPECT_EQ("", framer_.detailed_error());
13484 ASSERT_TRUE(visitor_.header_.get());
13485 EXPECT_EQ(FramerTestConnectionId(),
13486 visitor_.header_.get()->source_connection_id);
13487 }
13488
TEST_P(QuicFramerTest,ProcessAndValidateIetfConnectionIdLengthClient)13489 TEST_P(QuicFramerTest, ProcessAndValidateIetfConnectionIdLengthClient) {
13490 char connection_id_lengths = 0x05;
13491 QuicDataReader reader(&connection_id_lengths, 1);
13492
13493 bool should_update_expected_server_connection_id_length = false;
13494 uint8_t expected_server_connection_id_length = 8;
13495 uint8_t destination_connection_id_length = 0;
13496 uint8_t source_connection_id_length = 8;
13497 std::string detailed_error = "";
13498
13499 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13500 &reader, framer_.version(), Perspective::IS_CLIENT,
13501 should_update_expected_server_connection_id_length,
13502 &expected_server_connection_id_length, &destination_connection_id_length,
13503 &source_connection_id_length, &detailed_error));
13504 EXPECT_EQ(8, expected_server_connection_id_length);
13505 EXPECT_EQ(0, destination_connection_id_length);
13506 EXPECT_EQ(8, source_connection_id_length);
13507 EXPECT_EQ("", detailed_error);
13508
13509 QuicDataReader reader2(&connection_id_lengths, 1);
13510 should_update_expected_server_connection_id_length = true;
13511 expected_server_connection_id_length = 33;
13512 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13513 &reader2, framer_.version(), Perspective::IS_CLIENT,
13514 should_update_expected_server_connection_id_length,
13515 &expected_server_connection_id_length, &destination_connection_id_length,
13516 &source_connection_id_length, &detailed_error));
13517 EXPECT_EQ(8, expected_server_connection_id_length);
13518 EXPECT_EQ(0, destination_connection_id_length);
13519 EXPECT_EQ(8, source_connection_id_length);
13520 EXPECT_EQ("", detailed_error);
13521 }
13522
TEST_P(QuicFramerTest,ProcessAndValidateIetfConnectionIdLengthServer)13523 TEST_P(QuicFramerTest, ProcessAndValidateIetfConnectionIdLengthServer) {
13524 char connection_id_lengths = 0x50;
13525 QuicDataReader reader(&connection_id_lengths, 1);
13526
13527 bool should_update_expected_server_connection_id_length = false;
13528 uint8_t expected_server_connection_id_length = 8;
13529 uint8_t destination_connection_id_length = 8;
13530 uint8_t source_connection_id_length = 0;
13531 std::string detailed_error = "";
13532
13533 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13534 &reader, framer_.version(), Perspective::IS_SERVER,
13535 should_update_expected_server_connection_id_length,
13536 &expected_server_connection_id_length, &destination_connection_id_length,
13537 &source_connection_id_length, &detailed_error));
13538 EXPECT_EQ(8, expected_server_connection_id_length);
13539 EXPECT_EQ(8, destination_connection_id_length);
13540 EXPECT_EQ(0, source_connection_id_length);
13541 EXPECT_EQ("", detailed_error);
13542
13543 QuicDataReader reader2(&connection_id_lengths, 1);
13544 should_update_expected_server_connection_id_length = true;
13545 expected_server_connection_id_length = 33;
13546 EXPECT_TRUE(QuicFramerPeer::ProcessAndValidateIetfConnectionIdLength(
13547 &reader2, framer_.version(), Perspective::IS_SERVER,
13548 should_update_expected_server_connection_id_length,
13549 &expected_server_connection_id_length, &destination_connection_id_length,
13550 &source_connection_id_length, &detailed_error));
13551 EXPECT_EQ(8, expected_server_connection_id_length);
13552 EXPECT_EQ(8, destination_connection_id_length);
13553 EXPECT_EQ(0, source_connection_id_length);
13554 EXPECT_EQ("", detailed_error);
13555 }
13556
TEST_P(QuicFramerTest,TestExtendedErrorCodeParser)13557 TEST_P(QuicFramerTest, TestExtendedErrorCodeParser) {
13558 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
13559 // Extended error codes only in IETF QUIC
13560 return;
13561 }
13562 QuicConnectionCloseFrame frame;
13563
13564 frame.error_details = "this has no error code info in it";
13565 MaybeExtractQuicErrorCode(&frame);
13566 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13567 EXPECT_EQ("this has no error code info in it", frame.error_details);
13568
13569 frame.error_details = "1234this does not have the colon in it";
13570 MaybeExtractQuicErrorCode(&frame);
13571 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13572 EXPECT_EQ("1234this does not have the colon in it", frame.error_details);
13573
13574 frame.error_details = "1a234:this has a colon, but a malformed error number";
13575 MaybeExtractQuicErrorCode(&frame);
13576 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13577 EXPECT_EQ("1a234:this has a colon, but a malformed error number",
13578 frame.error_details);
13579
13580 frame.error_details = "1234:this is good";
13581 MaybeExtractQuicErrorCode(&frame);
13582 EXPECT_EQ(1234u, frame.quic_error_code);
13583 EXPECT_EQ("this is good", frame.error_details);
13584
13585 frame.error_details =
13586 "1234 :this is not good, space between last digit and colon";
13587 MaybeExtractQuicErrorCode(&frame);
13588 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13589 EXPECT_EQ("1234 :this is not good, space between last digit and colon",
13590 frame.error_details);
13591
13592 frame.error_details = "123456789";
13593 MaybeExtractQuicErrorCode(&frame);
13594 EXPECT_THAT(
13595 frame.quic_error_code,
13596 IsError(QUIC_IETF_GQUIC_ERROR_MISSING)); // Not good, all numbers, no :
13597 EXPECT_EQ("123456789", frame.error_details);
13598
13599 frame.error_details = "1234:";
13600 MaybeExtractQuicErrorCode(&frame);
13601 EXPECT_EQ(1234u,
13602 frame.quic_error_code); // corner case.
13603 EXPECT_EQ("", frame.error_details);
13604
13605 frame.error_details = "1234:5678";
13606 MaybeExtractQuicErrorCode(&frame);
13607 EXPECT_EQ(1234u,
13608 frame.quic_error_code); // another corner case.
13609 EXPECT_EQ("5678", frame.error_details);
13610
13611 frame.error_details = "12345 6789:";
13612 MaybeExtractQuicErrorCode(&frame);
13613 EXPECT_THAT(frame.quic_error_code,
13614 IsError(QUIC_IETF_GQUIC_ERROR_MISSING)); // Not good
13615 EXPECT_EQ("12345 6789:", frame.error_details);
13616
13617 frame.error_details = ":no numbers, is not good";
13618 MaybeExtractQuicErrorCode(&frame);
13619 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13620 EXPECT_EQ(":no numbers, is not good", frame.error_details);
13621
13622 frame.error_details = "qwer:also no numbers, is not good";
13623 MaybeExtractQuicErrorCode(&frame);
13624 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13625 EXPECT_EQ("qwer:also no numbers, is not good", frame.error_details);
13626
13627 frame.error_details = " 1234:this is not good, space before first digit";
13628 MaybeExtractQuicErrorCode(&frame);
13629 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13630 EXPECT_EQ(" 1234:this is not good, space before first digit",
13631 frame.error_details);
13632
13633 frame.error_details = "1234:";
13634 MaybeExtractQuicErrorCode(&frame);
13635 EXPECT_EQ(1234u,
13636 frame.quic_error_code); // this is good
13637 EXPECT_EQ("", frame.error_details);
13638
13639 // Value does not fit in uint32_t.
13640 frame.error_details = "12345678901:";
13641 MaybeExtractQuicErrorCode(&frame);
13642 EXPECT_THAT(frame.quic_error_code, IsError(QUIC_IETF_GQUIC_ERROR_MISSING));
13643 EXPECT_EQ("12345678901:", frame.error_details);
13644 }
13645
13646 // Regression test for crbug/1029636.
TEST_P(QuicFramerTest,OverlyLargeAckDelay)13647 TEST_P(QuicFramerTest, OverlyLargeAckDelay) {
13648 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
13649 return;
13650 }
13651 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
13652 // clang-format off
13653 unsigned char packet_ietf[] = {
13654 // type (short header, 4 byte packet number)
13655 0x43,
13656 // connection_id
13657 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
13658 // packet number
13659 0x12, 0x34, 0x56, 0x78,
13660
13661 // frame type (IETF_ACK frame)
13662 0x02,
13663 // largest acked
13664 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78,
13665 // ack delay time.
13666 kVarInt62EightBytes + 0x31, 0x00, 0x00, 0x00, 0xF3, 0xA0, 0x81, 0xE0,
13667 // Nr. of additional ack blocks
13668 kVarInt62OneByte + 0x00,
13669 // first ack block length.
13670 kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77,
13671 };
13672 // clang-format on
13673
13674 framer_.ProcessPacket(QuicEncryptedPacket(
13675 AsChars(packet_ietf), ABSL_ARRAYSIZE(packet_ietf), false));
13676 ASSERT_EQ(1u, visitor_.ack_frames_.size());
13677 // Verify ack_delay_time is set correctly.
13678 EXPECT_EQ(QuicTime::Delta::Infinite(),
13679 visitor_.ack_frames_[0]->ack_delay_time);
13680 }
13681
TEST_P(QuicFramerTest,KeyUpdate)13682 TEST_P(QuicFramerTest, KeyUpdate) {
13683 if (!framer_.version().UsesTls()) {
13684 // Key update is only used in QUIC+TLS.
13685 return;
13686 }
13687 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13688 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13689 // instead of TestDecrypter.
13690 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13691 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13692 framer_.SetKeyUpdateSupportForConnection(true);
13693
13694 QuicPacketHeader header;
13695 header.destination_connection_id = FramerTestConnectionId();
13696 header.reset_flag = false;
13697 header.version_flag = false;
13698 header.packet_number = kPacketNumber;
13699
13700 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13701
13702 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13703 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13704 ASSERT_TRUE(data != nullptr);
13705 std::unique_ptr<QuicEncryptedPacket> encrypted(
13706 EncryptPacketWithTagAndPhase(*data, 0, false));
13707 ASSERT_TRUE(encrypted);
13708
13709 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13710 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13711 // Processed valid packet with phase=0, key=1: no key update.
13712 EXPECT_EQ(0u, visitor_.key_update_count());
13713 EXPECT_EQ(0, visitor_.derive_next_key_count_);
13714 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13715
13716 header.packet_number += 1;
13717 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13718 data = BuildDataPacket(header, frames);
13719 ASSERT_TRUE(data != nullptr);
13720 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13721 ASSERT_TRUE(encrypted);
13722 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13723 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13724 // Processed valid packet with phase=1, key=2: key update should have
13725 // occurred.
13726 ASSERT_EQ(1u, visitor_.key_update_count());
13727 EXPECT_EQ(KeyUpdateReason::kRemote, visitor_.key_update_reasons_[0]);
13728 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13729 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13730
13731 header.packet_number += 1;
13732 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13733 data = BuildDataPacket(header, frames);
13734 ASSERT_TRUE(data != nullptr);
13735 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13736 ASSERT_TRUE(encrypted);
13737 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13738 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13739 // Processed another valid packet with phase=1, key=2: no key update.
13740 EXPECT_EQ(1u, visitor_.key_update_count());
13741 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13742 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13743
13744 // Process another key update.
13745 header.packet_number += 1;
13746 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13747 data = BuildDataPacket(header, frames);
13748 ASSERT_TRUE(data != nullptr);
13749 encrypted = EncryptPacketWithTagAndPhase(*data, 2, false);
13750 ASSERT_TRUE(encrypted);
13751 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13752 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13753 ASSERT_EQ(2u, visitor_.key_update_count());
13754 EXPECT_EQ(KeyUpdateReason::kRemote, visitor_.key_update_reasons_[1]);
13755 EXPECT_EQ(2, visitor_.derive_next_key_count_);
13756 EXPECT_EQ(3, visitor_.decrypted_first_packet_in_key_phase_count_);
13757 }
13758
TEST_P(QuicFramerTest,KeyUpdateOldPacketAfterUpdate)13759 TEST_P(QuicFramerTest, KeyUpdateOldPacketAfterUpdate) {
13760 if (!framer_.version().UsesTls()) {
13761 // Key update is only used in QUIC+TLS.
13762 return;
13763 }
13764 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13765 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13766 // instead of TestDecrypter.
13767 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13768 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13769 framer_.SetKeyUpdateSupportForConnection(true);
13770
13771 QuicPacketHeader header;
13772 header.destination_connection_id = FramerTestConnectionId();
13773 header.reset_flag = false;
13774 header.version_flag = false;
13775 header.packet_number = kPacketNumber;
13776
13777 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13778
13779 // Process packet N with phase 0.
13780 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13781 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13782 ASSERT_TRUE(data != nullptr);
13783 std::unique_ptr<QuicEncryptedPacket> encrypted(
13784 EncryptPacketWithTagAndPhase(*data, 0, false));
13785 ASSERT_TRUE(encrypted);
13786 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13787 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13788 EXPECT_EQ(0u, visitor_.key_update_count());
13789 EXPECT_EQ(0, visitor_.derive_next_key_count_);
13790 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13791
13792 // Process packet N+2 with phase 1.
13793 header.packet_number = kPacketNumber + 2;
13794 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13795 data = BuildDataPacket(header, frames);
13796 ASSERT_TRUE(data != nullptr);
13797 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13798 ASSERT_TRUE(encrypted);
13799 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13800 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13801 EXPECT_EQ(1u, visitor_.key_update_count());
13802 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13803 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13804
13805 // Process packet N+1 with phase 0. (Receiving packet from previous phase
13806 // after packet from new phase was received.)
13807 header.packet_number = kPacketNumber + 1;
13808 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13809 data = BuildDataPacket(header, frames);
13810 ASSERT_TRUE(data != nullptr);
13811 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
13812 ASSERT_TRUE(encrypted);
13813 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13814 // Packet should decrypt and key update count should not change.
13815 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13816 EXPECT_EQ(1u, visitor_.key_update_count());
13817 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13818 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13819 }
13820
TEST_P(QuicFramerTest,KeyUpdateOldPacketAfterDiscardPreviousOneRttKeys)13821 TEST_P(QuicFramerTest, KeyUpdateOldPacketAfterDiscardPreviousOneRttKeys) {
13822 if (!framer_.version().UsesTls()) {
13823 // Key update is only used in QUIC+TLS.
13824 return;
13825 }
13826 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13827 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13828 // instead of TestDecrypter.
13829 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13830 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13831 framer_.SetKeyUpdateSupportForConnection(true);
13832
13833 QuicPacketHeader header;
13834 header.destination_connection_id = FramerTestConnectionId();
13835 header.reset_flag = false;
13836 header.version_flag = false;
13837 header.packet_number = kPacketNumber;
13838
13839 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13840
13841 // Process packet N with phase 0.
13842 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13843 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13844 ASSERT_TRUE(data != nullptr);
13845 std::unique_ptr<QuicEncryptedPacket> encrypted(
13846 EncryptPacketWithTagAndPhase(*data, 0, false));
13847 ASSERT_TRUE(encrypted);
13848 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13849 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13850 EXPECT_EQ(0u, visitor_.key_update_count());
13851 EXPECT_EQ(0, visitor_.derive_next_key_count_);
13852 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13853
13854 // Process packet N+2 with phase 1.
13855 header.packet_number = kPacketNumber + 2;
13856 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13857 data = BuildDataPacket(header, frames);
13858 ASSERT_TRUE(data != nullptr);
13859 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13860 ASSERT_TRUE(encrypted);
13861 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13862 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13863 EXPECT_EQ(1u, visitor_.key_update_count());
13864 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13865 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13866
13867 // Discard keys for previous key phase.
13868 framer_.DiscardPreviousOneRttKeys();
13869
13870 // Process packet N+1 with phase 0. (Receiving packet from previous phase
13871 // after packet from new phase was received.)
13872 header.packet_number = kPacketNumber + 1;
13873 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13874 data = BuildDataPacket(header, frames);
13875 ASSERT_TRUE(data != nullptr);
13876 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
13877 ASSERT_TRUE(encrypted);
13878 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13879 // Packet should not decrypt and key update count should not change.
13880 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13881 EXPECT_EQ(1u, visitor_.key_update_count());
13882 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13883 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13884 }
13885
TEST_P(QuicFramerTest,KeyUpdatePacketsOutOfOrder)13886 TEST_P(QuicFramerTest, KeyUpdatePacketsOutOfOrder) {
13887 if (!framer_.version().UsesTls()) {
13888 // Key update is only used in QUIC+TLS.
13889 return;
13890 }
13891 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13892 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13893 // instead of TestDecrypter.
13894 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13895 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13896 framer_.SetKeyUpdateSupportForConnection(true);
13897
13898 QuicPacketHeader header;
13899 header.destination_connection_id = FramerTestConnectionId();
13900 header.reset_flag = false;
13901 header.version_flag = false;
13902 header.packet_number = kPacketNumber;
13903
13904 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13905
13906 // Process packet N with phase 0.
13907 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13908 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13909 ASSERT_TRUE(data != nullptr);
13910 std::unique_ptr<QuicEncryptedPacket> encrypted(
13911 EncryptPacketWithTagAndPhase(*data, 0, false));
13912 ASSERT_TRUE(encrypted);
13913 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13914 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13915 EXPECT_EQ(0u, visitor_.key_update_count());
13916 EXPECT_EQ(0, visitor_.derive_next_key_count_);
13917 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13918
13919 // Process packet N+2 with phase 1.
13920 header.packet_number = kPacketNumber + 2;
13921 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13922 data = BuildDataPacket(header, frames);
13923 ASSERT_TRUE(data != nullptr);
13924 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13925 ASSERT_TRUE(encrypted);
13926 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13927 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13928 EXPECT_EQ(1u, visitor_.key_update_count());
13929 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13930 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13931
13932 // Process packet N+1 with phase 1. (Receiving packet from new phase out of
13933 // order.)
13934 header.packet_number = kPacketNumber + 1;
13935 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13936 data = BuildDataPacket(header, frames);
13937 ASSERT_TRUE(data != nullptr);
13938 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
13939 ASSERT_TRUE(encrypted);
13940 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13941 // Packet should decrypt and key update count should not change.
13942 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13943 EXPECT_EQ(1u, visitor_.key_update_count());
13944 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13945 EXPECT_EQ(2, visitor_.decrypted_first_packet_in_key_phase_count_);
13946 }
13947
TEST_P(QuicFramerTest,KeyUpdateWrongKey)13948 TEST_P(QuicFramerTest, KeyUpdateWrongKey) {
13949 if (!framer_.version().UsesTls()) {
13950 // Key update is only used in QUIC+TLS.
13951 return;
13952 }
13953 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
13954 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
13955 // instead of TestDecrypter.
13956 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
13957 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
13958 framer_.SetKeyUpdateSupportForConnection(true);
13959
13960 QuicPacketHeader header;
13961 header.destination_connection_id = FramerTestConnectionId();
13962 header.reset_flag = false;
13963 header.version_flag = false;
13964 header.packet_number = kPacketNumber;
13965
13966 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
13967
13968 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13969 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
13970 ASSERT_TRUE(data != nullptr);
13971 std::unique_ptr<QuicEncryptedPacket> encrypted(
13972 EncryptPacketWithTagAndPhase(*data, 0, false));
13973 ASSERT_TRUE(encrypted);
13974
13975 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13976 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
13977 // Processed valid packet with phase=0, key=1: no key update.
13978 EXPECT_EQ(0u, visitor_.key_update_count());
13979 EXPECT_EQ(0, visitor_.derive_next_key_count_);
13980 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13981 EXPECT_EQ(0u, framer_.PotentialPeerKeyUpdateAttemptCount());
13982
13983 header.packet_number += 1;
13984 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
13985 data = BuildDataPacket(header, frames);
13986 ASSERT_TRUE(data != nullptr);
13987 encrypted = EncryptPacketWithTagAndPhase(*data, 2, true);
13988 ASSERT_TRUE(encrypted);
13989 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
13990 // Packet with phase=1 but key=3, should not process and should not cause key
13991 // update, but next decrypter key should have been created to attempt to
13992 // decode it.
13993 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
13994 EXPECT_EQ(0u, visitor_.key_update_count());
13995 EXPECT_EQ(1, visitor_.derive_next_key_count_);
13996 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
13997 EXPECT_EQ(1u, framer_.PotentialPeerKeyUpdateAttemptCount());
13998
13999 header.packet_number += 1;
14000 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14001 data = BuildDataPacket(header, frames);
14002 ASSERT_TRUE(data != nullptr);
14003 encrypted = EncryptPacketWithTagAndPhase(*data, 0, true);
14004 ASSERT_TRUE(encrypted);
14005 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14006 // Packet with phase=1 but key=1, should not process and should not cause key
14007 // update.
14008 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
14009 EXPECT_EQ(0u, visitor_.key_update_count());
14010 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14011 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14012 EXPECT_EQ(2u, framer_.PotentialPeerKeyUpdateAttemptCount());
14013
14014 header.packet_number += 1;
14015 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14016 data = BuildDataPacket(header, frames);
14017 ASSERT_TRUE(data != nullptr);
14018 encrypted = EncryptPacketWithTagAndPhase(*data, 1, false);
14019 ASSERT_TRUE(encrypted);
14020 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14021 // Packet with phase=0 but key=2, should not process and should not cause key
14022 // update.
14023 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
14024 EXPECT_EQ(0u, visitor_.key_update_count());
14025 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14026 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14027 EXPECT_EQ(2u, framer_.PotentialPeerKeyUpdateAttemptCount());
14028
14029 header.packet_number += 1;
14030 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14031 data = BuildDataPacket(header, frames);
14032 ASSERT_TRUE(data != nullptr);
14033 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
14034 ASSERT_TRUE(encrypted);
14035 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14036 // Packet with phase=0 and key=0, should process and reset
14037 // potential_peer_key_update_attempt_count_.
14038 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14039 EXPECT_EQ(0u, visitor_.key_update_count());
14040 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14041 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14042 EXPECT_EQ(0u, framer_.PotentialPeerKeyUpdateAttemptCount());
14043 }
14044
TEST_P(QuicFramerTest,KeyUpdateReceivedWhenNotEnabled)14045 TEST_P(QuicFramerTest, KeyUpdateReceivedWhenNotEnabled) {
14046 if (!framer_.version().UsesTls()) {
14047 // Key update is only used in QUIC+TLS.
14048 return;
14049 }
14050 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14051 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14052 // instead of TestDecrypter.
14053 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14054 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14055
14056 QuicPacketHeader header;
14057 header.destination_connection_id = FramerTestConnectionId();
14058 header.reset_flag = false;
14059 header.version_flag = false;
14060 header.packet_number = kPacketNumber;
14061
14062 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
14063
14064 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14065 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
14066 ASSERT_TRUE(data != nullptr);
14067 std::unique_ptr<QuicEncryptedPacket> encrypted(
14068 EncryptPacketWithTagAndPhase(*data, 1, true));
14069 ASSERT_TRUE(encrypted);
14070
14071 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14072 // Received a packet with key phase updated even though framer hasn't had key
14073 // update enabled (SetNextOneRttCrypters never called). Should fail to
14074 // process.
14075 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
14076 EXPECT_EQ(0u, visitor_.key_update_count());
14077 EXPECT_EQ(0, visitor_.derive_next_key_count_);
14078 EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
14079 }
14080
TEST_P(QuicFramerTest,KeyUpdateLocallyInitiated)14081 TEST_P(QuicFramerTest, KeyUpdateLocallyInitiated) {
14082 if (!framer_.version().UsesTls()) {
14083 // Key update is only used in QUIC+TLS.
14084 return;
14085 }
14086 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14087 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14088 // instead of TestDecrypter.
14089 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14090 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14091 framer_.SetKeyUpdateSupportForConnection(true);
14092
14093 EXPECT_TRUE(framer_.DoKeyUpdate(KeyUpdateReason::kLocalForTests));
14094 // Key update count should be updated, but haven't received packet from peer
14095 // with new key phase.
14096 ASSERT_EQ(1u, visitor_.key_update_count());
14097 EXPECT_EQ(KeyUpdateReason::kLocalForTests, visitor_.key_update_reasons_[0]);
14098 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14099 EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
14100
14101 QuicPacketHeader header;
14102 header.destination_connection_id = FramerTestConnectionId();
14103 header.reset_flag = false;
14104 header.version_flag = false;
14105 header.packet_number = kPacketNumber;
14106
14107 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
14108
14109 // Process packet N with phase 1.
14110 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14111 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
14112 ASSERT_TRUE(data != nullptr);
14113 std::unique_ptr<QuicEncryptedPacket> encrypted(
14114 EncryptPacketWithTagAndPhase(*data, 1, true));
14115 ASSERT_TRUE(encrypted);
14116
14117 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14118 // Packet should decrypt and key update count should not change and
14119 // OnDecryptedFirstPacketInKeyPhase should have been called.
14120 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14121 EXPECT_EQ(1u, visitor_.key_update_count());
14122 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14123 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14124
14125 // Process packet N-1 with phase 0. (Receiving packet from previous phase
14126 // after packet from new phase was received.)
14127 header.packet_number = kPacketNumber - 1;
14128 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14129 data = BuildDataPacket(header, frames);
14130 ASSERT_TRUE(data != nullptr);
14131 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
14132 ASSERT_TRUE(encrypted);
14133 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14134 // Packet should decrypt and key update count should not change.
14135 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14136 EXPECT_EQ(1u, visitor_.key_update_count());
14137 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14138 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14139
14140 // Process packet N+1 with phase 0 and key 1. This should not decrypt even
14141 // though it's using the previous key, since the packet number is higher than
14142 // a packet number received using the current key.
14143 header.packet_number = kPacketNumber + 1;
14144 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14145 data = BuildDataPacket(header, frames);
14146 ASSERT_TRUE(data != nullptr);
14147 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
14148 ASSERT_TRUE(encrypted);
14149 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14150 // Packet should not decrypt and key update count should not change.
14151 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
14152 EXPECT_EQ(1u, visitor_.key_update_count());
14153 EXPECT_EQ(2, visitor_.derive_next_key_count_);
14154 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14155 }
14156
TEST_P(QuicFramerTest,KeyUpdateLocallyInitiatedReceivedOldPacket)14157 TEST_P(QuicFramerTest, KeyUpdateLocallyInitiatedReceivedOldPacket) {
14158 if (!framer_.version().UsesTls()) {
14159 // Key update is only used in QUIC+TLS.
14160 return;
14161 }
14162 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14163 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14164 // instead of TestDecrypter.
14165 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14166 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14167 framer_.SetKeyUpdateSupportForConnection(true);
14168
14169 EXPECT_TRUE(framer_.DoKeyUpdate(KeyUpdateReason::kLocalForTests));
14170 // Key update count should be updated, but haven't received packet
14171 // from peer with new key phase.
14172 EXPECT_EQ(1u, visitor_.key_update_count());
14173 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14174 EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
14175
14176 QuicPacketHeader header;
14177 header.destination_connection_id = FramerTestConnectionId();
14178 header.reset_flag = false;
14179 header.version_flag = false;
14180 header.packet_number = kPacketNumber;
14181
14182 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
14183
14184 // Process packet N with phase 0. (Receiving packet from previous phase
14185 // after locally initiated key update, but before any packet from new phase
14186 // was received.)
14187 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14188 std::unique_ptr<QuicPacket> data = BuildDataPacket(header, frames);
14189 ASSERT_TRUE(data != nullptr);
14190 std::unique_ptr<QuicEncryptedPacket> encrypted =
14191 EncryptPacketWithTagAndPhase(*data, 0, false);
14192 ASSERT_TRUE(encrypted);
14193 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14194 // Packet should decrypt and key update count should not change and
14195 // OnDecryptedFirstPacketInKeyPhase should not have been called since the
14196 // packet was from the previous key phase.
14197 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14198 EXPECT_EQ(1u, visitor_.key_update_count());
14199 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14200 EXPECT_EQ(0, visitor_.decrypted_first_packet_in_key_phase_count_);
14201
14202 // Process packet N+1 with phase 1.
14203 header.packet_number = kPacketNumber + 1;
14204 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14205 data = BuildDataPacket(header, frames);
14206 ASSERT_TRUE(data != nullptr);
14207 encrypted = EncryptPacketWithTagAndPhase(*data, 1, true);
14208 ASSERT_TRUE(encrypted);
14209 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14210 // Packet should decrypt and key update count should not change, but
14211 // OnDecryptedFirstPacketInKeyPhase should have been called.
14212 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14213 EXPECT_EQ(1u, visitor_.key_update_count());
14214 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14215 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14216
14217 // Process packet N+2 with phase 0 and key 1. This should not decrypt even
14218 // though it's using the previous key, since the packet number is higher than
14219 // a packet number received using the current key.
14220 header.packet_number = kPacketNumber + 2;
14221 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14222 data = BuildDataPacket(header, frames);
14223 ASSERT_TRUE(data != nullptr);
14224 encrypted = EncryptPacketWithTagAndPhase(*data, 0, false);
14225 ASSERT_TRUE(encrypted);
14226 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14227 // Packet should not decrypt and key update count should not change.
14228 EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
14229 EXPECT_EQ(1u, visitor_.key_update_count());
14230 EXPECT_EQ(2, visitor_.derive_next_key_count_);
14231 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14232 }
14233
TEST_P(QuicFramerTest,KeyUpdateOnFirstReceivedPacket)14234 TEST_P(QuicFramerTest, KeyUpdateOnFirstReceivedPacket) {
14235 if (!framer_.version().UsesTls()) {
14236 // Key update is only used in QUIC+TLS.
14237 return;
14238 }
14239 ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
14240 // Doesn't use SetDecrypterLevel since we want to use StrictTaggingDecrypter
14241 // instead of TestDecrypter.
14242 framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
14243 std::make_unique<StrictTaggingDecrypter>(/*key=*/0));
14244 framer_.SetKeyUpdateSupportForConnection(true);
14245
14246 QuicPacketHeader header;
14247 header.destination_connection_id = FramerTestConnectionId();
14248 header.reset_flag = false;
14249 header.version_flag = false;
14250 header.packet_number = QuicPacketNumber(123);
14251
14252 QuicFrames frames = {QuicFrame(QuicPaddingFrame())};
14253
14254 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14255 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
14256 ASSERT_TRUE(data != nullptr);
14257 std::unique_ptr<QuicEncryptedPacket> encrypted(
14258 EncryptPacketWithTagAndPhase(*data, /*tag=*/1, /*phase=*/true));
14259 ASSERT_TRUE(encrypted);
14260
14261 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14262 EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
14263 // Processed valid packet with phase=1, key=1: do key update.
14264 EXPECT_EQ(1u, visitor_.key_update_count());
14265 EXPECT_EQ(1, visitor_.derive_next_key_count_);
14266 EXPECT_EQ(1, visitor_.decrypted_first_packet_in_key_phase_count_);
14267 }
14268
TEST_P(QuicFramerTest,ErrorWhenUnexpectedFrameTypeEncountered)14269 TEST_P(QuicFramerTest, ErrorWhenUnexpectedFrameTypeEncountered) {
14270 if (!VersionHasIetfQuicFrames(framer_.transport_version()) ||
14271 !QuicVersionHasLongHeaderLengths(framer_.transport_version()) ||
14272 !framer_.version().HasLongHeaderLengths()) {
14273 return;
14274 }
14275 SetDecrypterLevel(ENCRYPTION_ZERO_RTT);
14276 // clang-format off
14277 unsigned char packet[] = {
14278 // public flags (long header with packet type ZERO_RTT_PROTECTED and
14279 // 4-byte packet number)
14280 0xD3,
14281 // version
14282 QUIC_VERSION_BYTES,
14283 // destination connection ID length
14284 0x08,
14285 // destination connection ID
14286 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
14287 // source connection ID length
14288 0x08,
14289 // source connection ID
14290 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
14291 // long header packet length
14292 0x05,
14293 // packet number
14294 0x12, 0x34, 0x56, 0x00,
14295 // unexpected ietf ack frame type in 0-RTT packet
14296 0x02,
14297 };
14298 // clang-format on
14299
14300 ReviseFirstByteByVersion(packet);
14301 QuicEncryptedPacket encrypted(AsChars(packet), ABSL_ARRAYSIZE(packet), false);
14302
14303 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
14304
14305 EXPECT_THAT(framer_.error(), IsError(IETF_QUIC_PROTOCOL_VIOLATION));
14306 EXPECT_EQ(
14307 "IETF frame type IETF_ACK is unexpected at encryption level "
14308 "ENCRYPTION_ZERO_RTT",
14309 framer_.detailed_error());
14310 }
14311
TEST_P(QuicFramerTest,ShortHeaderWithNonDefaultConnectionIdLength)14312 TEST_P(QuicFramerTest, ShortHeaderWithNonDefaultConnectionIdLength) {
14313 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
14314 // clang-format off
14315 unsigned char packet[kMaxIncomingPacketSize + 1] = {
14316 // type (short header, 4 byte packet number)
14317 0x43,
14318 // connection_id
14319 0x28, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x48,
14320 // packet number
14321 0x12, 0x34, 0x56, 0x78,
14322
14323 // frame type (padding frame)
14324 0x00,
14325 0x00, 0x00, 0x00, 0x00
14326 };
14327 MockConnectionIdGenerator generator;
14328 EXPECT_CALL(generator, ConnectionIdLength(0x28)).WillOnce(Return(9));
14329 unsigned char* p = packet;
14330 size_t p_size = ABSL_ARRAYSIZE(packet);
14331
14332 const size_t header_size = GetPacketHeaderSize(
14333 framer_.transport_version(), kPacket8ByteConnectionId + 1,
14334 kPacket0ByteConnectionId, !kIncludeVersion,
14335 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
14336 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
14337 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0) + 1;
14338 // Add one because it's a 9 byte connection ID.
14339
14340 memset(p + header_size, 0, kMaxIncomingPacketSize - header_size);
14341
14342 QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
14343 PacketHeaderFormat format;
14344 QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
14345 bool version_flag;
14346 QuicConnectionId destination_connection_id, source_connection_id;
14347 QuicVersionLabel version_label;
14348 std::string detailed_error;
14349 bool use_length_prefix;
14350 std::optional<absl::string_view> retry_token;
14351 ParsedQuicVersion parsed_version = UnsupportedQuicVersion();
14352 EXPECT_EQ(QUIC_NO_ERROR,
14353 QuicFramer::ParsePublicHeaderDispatcherShortHeaderLengthUnknown(
14354 encrypted, &format, &long_packet_type, &version_flag,
14355 &use_length_prefix, &version_label, &parsed_version,
14356 &destination_connection_id, &source_connection_id, &retry_token,
14357 &detailed_error, generator));
14358 EXPECT_EQ(format, IETF_QUIC_SHORT_HEADER_PACKET);
14359 EXPECT_EQ(destination_connection_id.length(), 9);
14360 EXPECT_EQ(long_packet_type, INVALID_PACKET_TYPE);
14361 EXPECT_FALSE(version_flag);
14362 EXPECT_FALSE(use_length_prefix);
14363 EXPECT_EQ(version_label, 0);
14364 EXPECT_EQ(parsed_version, UnsupportedQuicVersion());
14365 EXPECT_EQ(source_connection_id.length(), 0);
14366 EXPECT_FALSE(retry_token.has_value());
14367 EXPECT_EQ(detailed_error, "");
14368 }
14369
TEST_P(QuicFramerTest,ReportEcnCountsIfPresent)14370 TEST_P(QuicFramerTest, ReportEcnCountsIfPresent) {
14371 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
14372 return;
14373 }
14374 SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
14375
14376 QuicPacketHeader header;
14377 header.destination_connection_id = FramerTestConnectionId();
14378 header.reset_flag = false;
14379 header.version_flag = false;
14380 header.packet_number = kPacketNumber;
14381
14382 for (bool ecn_marks : { false, true }) {
14383 // Add some padding, because TestEncrypter doesn't add an authentication
14384 // tag. For a small packet, this will cause QuicFramer to fail to get a
14385 // header protection sample.
14386 QuicPaddingFrame padding_frame(kTagSize);
14387 // Create a packet with just an ack.
14388 QuicAckFrame ack_frame = InitAckFrame(5);
14389 if (ecn_marks) {
14390 ack_frame.ecn_counters = QuicEcnCounts(100, 10000, 1000000);
14391 } else {
14392 ack_frame.ecn_counters = std::nullopt;
14393 }
14394 QuicFrames frames = {QuicFrame(padding_frame), QuicFrame(&ack_frame)};
14395 // Build an ACK packet.
14396 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
14397 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
14398 ASSERT_TRUE(raw_ack_packet != nullptr);
14399 char buffer[kMaxOutgoingPacketSize];
14400 size_t encrypted_length =
14401 framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number,
14402 *raw_ack_packet, buffer, kMaxOutgoingPacketSize);
14403 ASSERT_NE(0u, encrypted_length);
14404 // Now make sure we can turn our ack packet back into an ack frame.
14405 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
14406 MockFramerVisitor visitor;
14407 framer_.set_visitor(&visitor);
14408 EXPECT_CALL(visitor, OnPacket()).Times(1);
14409 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_))
14410 .Times(1)
14411 .WillOnce(Return(true));
14412 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_))
14413 .Times(1)
14414 .WillOnce(Return(true));
14415 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1);
14416 EXPECT_CALL(visitor, OnDecryptedPacket(_, _)).Times(1);
14417 EXPECT_CALL(visitor, OnAckFrameStart(_, _)).Times(1).WillOnce(Return(true));
14418 EXPECT_CALL(visitor, OnAckRange(_, _)).Times(1).WillOnce(Return(true));
14419 EXPECT_CALL(visitor, OnAckFrameEnd(_, ack_frame.ecn_counters))
14420 .Times(1).WillOnce(Return(true));
14421 EXPECT_CALL(visitor, OnPacketComplete()).Times(1);
14422 ASSERT_TRUE(framer_.ProcessPacket(
14423 QuicEncryptedPacket(buffer, encrypted_length, false)));
14424 }
14425 }
14426
14427 } // namespace
14428 } // namespace test
14429 } // namespace quic
14430